From 8cdcf8cb6fecf101bd7dd1db2e44f0cf5ddc0fd4 Mon Sep 17 00:00:00 2001
From: yanjinhui <3306209981@qq.com>
Date: 星期一, 15 十二月 2025 10:11:41 +0800
Subject: [PATCH] 添加移位功能,以及修改pad

---
 新建文件夹/WIDESEA_WMSServer/WIDESEA_Model/Models/SquareCabin/Dt_CabinOrder.cs                  |    1 
 新建文件夹/WIDESEA_WMSServer/WIDESEA_Common/TaskEnum/TaskStatusEnum.cs                          |    7 
 新建文件夹/WIDESEA_WMSServer/WIDESEA_WMSServer/OutOrderJob.cs                                   |   12 
 新建文件夹/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/LKBusiness/DeliveryOrderServicesLK.cs  |    2 
 新建文件夹/WIDESEA_WMSServer/WIDESEA_Model/Models/WMSInfo/Dt_SupplyTask.cs                      |    4 
 新建文件夹/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/DeliveryOrderServices.cs               |    7 
 新建文件夹/WMS/src/extension/stock/Dt_Inventory_Batch.js                                        |   20 +
 新建文件夹/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/WMSInfo/Inventory_BatchController.cs |   10 
 新建文件夹/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/StockStatusEmun.cs                        |    3 
 新建文件夹/WIDESEA_WMSServer/WIDESEA_Common/TaskEnum/TaskTypeEnum.cs                            |   14 +
 新建文件夹/WIDESEA_WMSServer/WIDESEA_Model/Models/WMSInfo/Dt_TraceabilityCode.cs                |    4 
 新建文件夹/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/Business.cs                            |    3 
 新建文件夹/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/CabinOrderServices.cs                  |   31 +
 新建文件夹/WIDESEA_WMSServer/ClassLibrary2/Inventory_BatchServices.cs.cs                        |  639 +++++++++++++++++++++++++++++++++++++--------
 新建文件夹/WMS/config/buttons.js                                                                |    9 
 新建文件夹/PDA/pages/stash/raworderboxing.vue                                                   |   56 ---
 新建文件夹/WIDESEA_WMSServer/ClassLibrary1/IInventory_BatchServices.cs                          |    2 
 新建文件夹/WIDESEA_WMSServer/WIDESEA_WMSServer/AlarmJob.cs                                      |    2 
 18 files changed, 647 insertions(+), 179 deletions(-)

diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/PDA/pages/stash/raworderboxing.vue" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/PDA/pages/stash/raworderboxing.vue"
index 7b118bd..1d9989a 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/PDA/pages/stash/raworderboxing.vue"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/PDA/pages/stash/raworderboxing.vue"
@@ -16,66 +16,28 @@
             <uni-forms-item :label="order_qty"> </uni-forms-item>
             <uni-forms-item :label="order_Inqty"> </uni-forms-item>
             <uni-forms-item label="寰呮壂鐗╂枡缂栫爜:">
-              <uni-easyinput
-                type="text"
-                placeholder="璇锋壂鎻忕墿鏂欑紪鐮�"
-                ref="materialInput"
-                :focus="step === 1"
-                v-model="materialCode"
-                @confirm="materialCodeInput"
-                @blur="materialCodeInput"
-              />
+              <uni-easyinput type="text" placeholder="璇锋壂鎻忕墿鏂欑紪鐮�" ref="materialInput" 
+			  :focus="step === 1" v-model="materialCode" @confirm="materialCodeInput" @blur="materialCodeInput"/>
             </uni-forms-item>
             <uni-forms-item label="搴撲綅缂栧彿:">
-              <uni-easyinput
-                type="text"
-                placeholder="璇锋壂鎻忓簱浣嶇紪鍙�"
-                ref="midInput"
-                :focus="step === 2"
-                v-model="barcode"
-                @confirm="barcodeInput"
-              />
+              <uni-easyinput type="text" placeholder="璇锋壂鎻忓簱浣嶇紪鍙�" ref="midInput" :focus="step === 2" v-model="barcode"  @confirm="barcodeInput"/>
             </uni-forms-item>
             <uni-forms-item label="鍏ュ簱鏁伴噺:">
-              <uni-easyinput
-                type="text"
-                placeholder="璇疯緭鍏ュ叆搴撴暟閲�"
-                ref="midInput"
-                :focus="step === 3"
-                v-model="materSn"
-                @confirm="snInput"
-              />
+              <uni-easyinput type="text" placeholder="璇疯緭鍏ュ叆搴撴暟閲�" ref="midInput" 
+			  :focus="step === 3" v-model="materSn" @confirm="snInput"/>
             </uni-forms-item>
-
             <uni-forms-item :label="Testlabel" v-if="Test">
-              <uni-easyinput
-                type="text"
-                :placeholder="Testplaceholder"
-                ref="midInput"
-                v-model="Initiallife"
-              />
+              <uni-easyinput type="text" :placeholder="Testplaceholder" ref="midInput" v-model="Initiallife"/>
             </uni-forms-item>
             <!-- <uni-forms-item>
 							<checkbox checked="check">鏄惁婊$洏</checkbox>
 						</uni-forms-item> -->
             <uni-forms-item>
-              <view
-                style="
-                  display: flex;
-                  justify-content: space-around;
-                  margin-top: 2%;
-                "
-              >
+              <view style="display: flex;justify-content: space-around; margin-top: 2%;">
                 <!-- <button @click="reset" type="default" size="default"
 									style="width: 160rpx;border: 1rpx solid #007aff;color: #007aff;">閲嶇疆</button> -->
-                <button
-                  @click="submit"
-                  type="primary"
-                  size="default"
-                  style="width: 250rpx"
-                >
-                  纭鍏ュ簱
-                </button>
+                <button @click="submit" type="primary" size="default" style="width: 250rpx">
+                  纭鍏ュ簱</button>
               </view>
             </uni-forms-item>
           </uni-forms>
diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/ClassLibrary1/IInventory_BatchServices.cs" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/ClassLibrary1/IInventory_BatchServices.cs"
index edde60c..fa368c6 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/ClassLibrary1/IInventory_BatchServices.cs"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/ClassLibrary1/IInventory_BatchServices.cs"
@@ -15,5 +15,7 @@
         IRepository<Dt_Inventory_Batch> Repository { get; }
 
         WebResponseContent GetExpiredAndlow();
+
+        WebResponseContent TransferInventory(int[] Keys);
     }
 }
diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/ClassLibrary2/Inventory_BatchServices.cs.cs" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/ClassLibrary2/Inventory_BatchServices.cs.cs"
index 49659cd..cff42c9 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/ClassLibrary2/Inventory_BatchServices.cs.cs"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/ClassLibrary2/Inventory_BatchServices.cs.cs"
@@ -37,7 +37,7 @@
 
 
         /// <summary>
-        /// 璋冩嫧鍗�
+        /// 璋冩嫧鍗� 淇敼浜嗗簱瀛樹俊鎭紝浠ュ強涓氬姟鏁伴噺
         /// </summary>
         /// <param name="saveModel"></param>
         /// <returns></returns>
@@ -46,26 +46,37 @@
         //    try
         //    {
         //        string WareCode = WarehouseEnum.澶т欢搴�.ObjToInt().ToString("000");
-        //        var qty = saveModel.MainData["availableQuantity"].ObjToInt();
-        //        var id = saveModel.MainData["id"].ObjToInt();
+        //        var qty = saveModel.MainData["availableQuantity"].ObjToInt();//鐢ㄦ埛杈撳叆鐨勬暟閲�
+        //        var id = saveModel.MainData["id"].ObjToInt();//搴撳瓨鎵规鐨刬d
         //        var materielCode = saveModel.MainData["materielCode"].ToString();
         //        var batchNo = saveModel.MainData["batchNo"].ToString();
-        //        //var Inventory_Batch = BaseDal.QueryFirst(x => x.Id == id);
-        //        //if (qty > Inventory_Batch.AvailableQuantity) throw new Exception("璋冩嫧鏁伴噺涓嶅彲澶т簬鍙敤鏁伴噺");
+
         //        var materielInfo = _materielInfoService.Repository.QueryFirst(x => x.MaterielCode == materielCode);
         //        if (materielInfo == null) return WebResponseContent.Instance.Error($"璇风淮鎶よ嵂鍝佺紪鍙枫�恵materielCode}銆戠殑淇℃伅");
         //        if (!Enum.IsDefined(typeof(MaterielSourceTypeEnum), materielInfo.MaterielSourceType))
         //            return WebResponseContent.Instance.Error($"璇疯缃嵂鍝佺紪鍙枫�恵materielCode}銆戠殑灞炴�у垎绫�");
         //        if (materielInfo.MaterielSourceType == MaterielSourceTypeEnum.PurchasePart)
         //            return WebResponseContent.Instance.Error($"鑽搧缂栧彿銆恵materielCode}銆戠殑灞炴�у垎绫讳负澶т欢,涓嶅彲璋冩嫧");
+
         //        List<Dt_InventoryInfo> dt_InventoryInfos = _inventoryInfoService.Repository.QueryData(x => x.MaterielCode == materielInfo.MaterielCode && x.BatchNo == batchNo && x.StockStatus == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt() && x.AvailableQuantity > 0 && x.WarehouseCode == WareCode).OrderBy(x => x.InDate).ToList();
         //        if (dt_InventoryInfos.Count < 1) return WebResponseContent.Instance.Error($"鐗╂枡缂栧彿銆恵materielInfo.MaterielCode}銆戝ぇ浠跺簱鏃犲簱瀛橈紒璇峰強鏃惰ˉ鍏呭簱瀛橈紒");
+
         //        var StockQty = dt_InventoryInfos.Sum(x => x.AvailableQuantity);
         //        if (StockQty < qty) return WebResponseContent.Instance.Error($"璋冩嫧鏁伴噺涓嶅彲澶т簬澶т欢搴撳彲鐢ㄦ暟閲�,澶т欢搴撳彲鐢ㄦ暟閲忎负銆恵StockQty}銆�");
-        //        var zx = (qty / materielInfo.BoxQty).ObjToInt();
-        //        var ys = qty % materielInfo.BoxQty;
-        //        if (ys > 0) zx++;
-        //        decimal Qty = 0;
+
+        //        // 妫�鏌ュぇ浠跺簱涓槸鍚﹀瓨鍦ㄦ暎浠�
+        //        decimal totalLooseQty = 0;
+        //        foreach (var inventory in dt_InventoryInfos)
+        //        {
+        //            var looseQty = inventory.AvailableQuantity % materielInfo.BoxQty;
+        //            if (looseQty > 0)
+        //            {
+        //                totalLooseQty += looseQty;
+        //            }
+        //        }
+
+        //        decimal Qty = 0; // 瀹為檯璋冩嫧鎬绘暟閲�
+        //        decimal businessQtyToAdd = 0; // 闇�瑕佹坊鍔犲埌涓氬姟鏁伴噺鐨勬暟閲�
         //        List<Dt_SupplyTask> supplyTasks = new List<Dt_SupplyTask>();
         //        Dt_DeliveryOrder deliveryOrder = new Dt_DeliveryOrder()
         //        {
@@ -75,40 +86,153 @@
         //            OutStatus = "鏂板缓",
         //            Details = new List<Dt_DeliveryOrderDetail>()
         //        };
-        //        foreach (var item in dt_InventoryInfos)
+
+        //        // 鎯呭喌1锛氬ぇ浠跺簱鏈夋暎浠讹紝涓旂敤鎴疯緭鍏ユ暟閲忓皬浜庣瓑浜庢暎浠舵�绘暟锛屼竴娆℃�ц皟鎷ㄦ墍鏈夋暎浠�
+        //        if (totalLooseQty > 0 && qty <= totalLooseQty)
         //        {
-        //            decimal taskQty = 0;
-        //            if (zx < 1) break;
-        //            while (item.AvailableQuantity > 0 && zx > 0)
+        //            decimal remainingLooseQty = totalLooseQty;
+
+        //            foreach (var item in dt_InventoryInfos)
         //            {
-        //                zx--;
-        //                Qty += materielInfo.BoxQty;
-        //                taskQty += materielInfo.BoxQty;
-        //                materielInfo.Business_qty += materielInfo.BoxQty;
-        //                item.OutboundQuantity += materielInfo.BoxQty;
-        //                item.AvailableQuantity -= materielInfo.BoxQty;
+        //                if (remainingLooseQty <= 0) break;
+
+        //                var looseQty = item.AvailableQuantity % materielInfo.BoxQty;
+        //                if (looseQty > 0)
+        //                {
+        //                    // 涓�娆℃�ц皟鎷ㄨ搴撳瓨璁板綍涓殑鎵�鏈夋暎浠�
+        //                    item.OutboundQuantity += looseQty;
+        //                    item.AvailableQuantity -= looseQty;
+        //                    Qty += looseQty;
+        //                    businessQtyToAdd += looseQty;
+        //                    remainingLooseQty -= looseQty;
+
+        //                    // 娣诲姞渚涘簲浠诲姟
+        //                    Dt_SupplyTask supplyTask = new Dt_SupplyTask()
+        //                    {
+        //                        WarehouseCode = item.WarehouseCode,
+        //                        BatchNo = item.BatchNo,
+        //                        MaterielName = item.MaterielName,
+        //                        MaterielCode = item.MaterielCode,
+        //                        MaterielSpec = item.MaterielSpec,
+        //                        TaskStatus = SupplyStatusEnum.NewOut.ObjToInt(),
+        //                        TaskType = TaskTypeEnum.AllocatOut.ObjToInt(),
+        //                        CreateDate = DateTime.Now,
+        //                        Creater = App.User.UserName ?? "System",
+        //                        LocationCode = item.LocationCode,
+        //                        OrderNo = deliveryOrder.Out_no,
+        //                        Modifier = item.ValidityPeriod,//鏁堟湡
+        //                        StockQuantity = looseQty,
+        //                        SupplyQuantity = 0,
+        //                        Remark = "鏁d欢璋冩嫧鍑哄簱锛堜竴娆℃�ф竻鐞嗭級"
+        //                    };
+        //                    supplyTasks.Add(supplyTask);
+        //                }
         //            }
-        //            #region 娣诲姞璋冩嫧鍑哄簱浠诲姟
-        //            Dt_SupplyTask supplyTask = new Dt_SupplyTask()
-        //            {
-        //                WarehouseCode = item.WarehouseCode,
-        //                BatchNo = item.BatchNo,
-        //                MaterielName = item.MaterielName,
-        //                MaterielCode = item.MaterielCode,
-        //                MaterielSpec = item.MaterielSpec,
-        //                TaskStatus = SupplyStatusEnum.NewOut.ObjToInt(),
-        //                TaskType = TaskTypeEnum.AllocatOut.ObjToInt(),
-        //                CreateDate = DateTime.Now,
-        //                Creater = App.User.UserName ?? "System",
-        //                LocationCode = item.LocationCode,
-        //                OrderNo = deliveryOrder.Out_no,
-        //                StockQuantity = taskQty,
-        //                SupplyQuantity = 0,
-        //                Remark = "璋冩嫧鍑哄簱"
-        //            };
-        //            supplyTasks.Add(supplyTask);
-        //            #endregion
         //        }
+        //        // 鎯呭喌2锛氬ぇ浠跺簱鏈夋暎浠讹紝浣嗙敤鎴疯緭鍏ユ暟閲忓ぇ浜庢暎浠舵�绘暟锛屾垨鑰呭ぇ浠跺簱娌℃湁鏁d欢锛屾寜鍘熸潵鏁寸閫昏緫
+        //        else
+        //        {
+        //            // 濡傛灉澶т欢搴撴湁鏁d欢浣嗙敤鎴疯璋冩嫧鏇村锛屽厛娓呯悊鏁d欢
+        //            decimal allocatedLooseQty = 0;
+        //            if (totalLooseQty > 0)
+        //            {
+        //                foreach (var item in dt_InventoryInfos)
+        //                {
+        //                    var looseQty = item.AvailableQuantity % materielInfo.BoxQty;
+        //                    if (looseQty > 0)
+        //                    {
+        //                        // 涓�娆℃�ц皟鎷ㄨ搴撳瓨璁板綍涓殑鎵�鏈夋暎浠�
+        //                        item.OutboundQuantity += looseQty;
+        //                        item.AvailableQuantity -= looseQty;
+        //                        allocatedLooseQty += looseQty;
+        //                        Qty += looseQty;
+        //                        businessQtyToAdd += looseQty;
+
+        //                        // 娣诲姞渚涘簲浠诲姟
+        //                        Dt_SupplyTask supplyTask = new Dt_SupplyTask()
+        //                        {
+        //                            WarehouseCode = item.WarehouseCode,
+        //                            BatchNo = item.BatchNo,
+        //                            MaterielName = item.MaterielName,
+        //                            MaterielCode = item.MaterielCode,
+        //                            MaterielSpec = item.MaterielSpec,
+        //                            TaskStatus = SupplyStatusEnum.NewOut.ObjToInt(),
+        //                            TaskType = TaskTypeEnum.AllocatOut.ObjToInt(),
+        //                            CreateDate = DateTime.Now,
+        //                            Creater = App.User.UserName ?? "System",
+        //                            LocationCode = item.LocationCode,
+        //                            OrderNo = deliveryOrder.Out_no,
+        //                            StockQuantity = looseQty,
+        //                            Modifier = item.ValidityPeriod,//鏁堟湡
+        //                            SupplyQuantity = 0,
+        //                            Remark = "鏁d欢璋冩嫧鍑哄簱锛堜竴娆℃�ф竻鐞嗭級"
+        //                        };
+        //                        supplyTasks.Add(supplyTask);
+        //                    }
+        //                }
+        //            }
+
+        //            // 璁$畻杩橀渶瑕佽皟鎷ㄧ殑鏁寸鏁伴噺
+        //            var remainingQty = qty - allocatedLooseQty;
+        //            if (remainingQty > 0)
+        //            {
+        //                var zx = (int)Math.Ceiling((decimal)remainingQty / materielInfo.BoxQty); // 闇�瑕佺殑鏁寸鏁�
+
+        //                foreach (var item in dt_InventoryInfos)
+        //                {
+        //                    decimal taskQty = 0;
+        //                    if (zx < 1) break;
+
+        //                    // 璁$畻褰撳墠搴撳瓨鍙彁渚涚殑瀹屾暣绠辨暟
+        //                    var availableFullBoxes = item.AvailableQuantity / materielInfo.BoxQty;
+        //                    var boxesToTransfer = Math.Min(availableFullBoxes, zx);
+
+        //                    if (boxesToTransfer > 0)
+        //                    {
+        //                        var transferQty = boxesToTransfer * materielInfo.BoxQty;
+        //                        taskQty += transferQty;
+        //                        Qty += transferQty;
+        //                        businessQtyToAdd += transferQty;
+        //                        zx -= (int)boxesToTransfer;
+
+        //                        item.OutboundQuantity += transferQty;
+        //                        item.AvailableQuantity -= transferQty;
+
+        //                        // 娣诲姞渚涘簲浠诲姟
+        //                        Dt_SupplyTask supplyTask = new Dt_SupplyTask()
+        //                        {
+        //                            WarehouseCode = item.WarehouseCode,
+        //                            BatchNo = item.BatchNo,
+        //                            MaterielName = item.MaterielName,
+        //                            MaterielCode = item.MaterielCode,
+        //                            MaterielSpec = item.MaterielSpec,
+        //                            TaskStatus = SupplyStatusEnum.NewOut.ObjToInt(),
+        //                            TaskType = TaskTypeEnum.AllocatOut.ObjToInt(),
+        //                            CreateDate = DateTime.Now,
+        //                            Creater = App.User.UserName ?? "System",
+        //                            LocationCode = item.LocationCode,
+        //                            OrderNo = deliveryOrder.Out_no,
+        //                            Modifier = item.ValidityPeriod,//鏁堟湡
+        //                            StockQuantity = taskQty,
+        //                            SupplyQuantity = 0,
+        //                            Remark = "鏁寸璋冩嫧鍑哄簱"
+        //                        };
+        //                        supplyTasks.Add(supplyTask);
+        //                    }
+        //                }
+
+        //                // 妫�鏌ユ暣绠辨暟閲忔槸鍚﹁冻澶�
+        //                if (zx > 0)
+        //                {
+        //                    return WebResponseContent.Instance.Error($"鏁寸搴撳瓨涓嶈冻锛屾棤娉曞畬鎴愯皟鎷ㄣ�傝繕闇�瑕亄zx}绠�");
+        //                }
+        //            }
+        //        }
+
+        //        // 鏇存柊涓氬姟鏁伴噺锛氫笟鍔℃暟閲� = 鍘熸潵鐨勪笟鍔℃暟閲� + 瀹為檯璋冩嫧鎬绘暟閲�
+        //        materielInfo.Business_qty += businessQtyToAdd;
+
+        //        // 娣诲姞鍑哄簱鍗曟槑缁�
         //        Dt_DeliveryOrderDetail deliveryOrderDetail = new Dt_DeliveryOrderDetail()
         //        {
         //            Batch_num = batchNo,
@@ -122,7 +246,8 @@
         //            Reservoirarea = WareCode
         //        };
         //        deliveryOrder.Details.Add(deliveryOrderDetail);
-        //        #region 娣诲姞璋冩嫧鍏ュ簱鍗�
+
+        //        // 娣诲姞璋冩嫧鍏ュ簱鍗�
         //        Dt_CabinOrder cabinOrder = new Dt_CabinOrder()
         //        {
         //            Order_no = deliveryOrder.Out_no,
@@ -144,7 +269,7 @@
         //            };
         //            cabinOrder.Details.Add(orderDetail);
         //        }
-        //        #endregion
+
         //        Db.Ado.BeginTran();
         //        _materielInfoService.UpdateData(materielInfo);
         //        _inventoryInfoService.Repository.UpdateData(dt_InventoryInfos);
@@ -152,7 +277,8 @@
         //        if (deliveryOrder.Details.Count > 0) Db.InsertNav(deliveryOrder).Include(x => x.Details).ExecuteCommand();
         //        if (cabinOrder.Details.Count > 0) Db.InsertNav(cabinOrder).Include(x => x.Details).ExecuteCommand();
         //        Db.Ado.CommitTran();
-        //        return WebResponseContent.Instance.OK("璋冩嫧鍑哄叆搴撳崟鐢熸垚鎴愬姛,璇锋搷浣滆皟鎷ㄥ崟");
+
+        //        return WebResponseContent.Instance.OK($"璋冩嫧鍑哄叆搴撳崟鐢熸垚鎴愬姛锛佸疄闄呰皟鎷ㄦ暟閲忥細{(int)Qty}");
         //    }
         //    catch (Exception ex)
         //    {
@@ -160,7 +286,6 @@
         //        return WebResponseContent.Instance.Error(ex.Message);
         //    }
         //}
-
 
 
         /// <summary>
@@ -173,8 +298,8 @@
             try
             {
                 string WareCode = WarehouseEnum.澶т欢搴�.ObjToInt().ToString("000");
-                var qty = saveModel.MainData["availableQuantity"].ObjToInt();//鐢ㄦ埛杈撳叆鐨勬暟閲�
-                var id = saveModel.MainData["id"].ObjToInt();//搴撳瓨鎵规鐨刬d
+                var qty = saveModel.MainData["availableQuantity"].ObjToInt(); // 鐢ㄦ埛杈撳叆鐨勬暟閲�
+                var id = saveModel.MainData["id"].ObjToInt(); // 搴撳瓨鎵规鐨刬d
                 var materielCode = saveModel.MainData["materielCode"].ToString();
                 var batchNo = saveModel.MainData["batchNo"].ToString();
 
@@ -214,7 +339,7 @@
                     Details = new List<Dt_DeliveryOrderDetail>()
                 };
 
-                // 鎯呭喌1锛氬ぇ浠跺簱鏈夋暎浠讹紝涓旂敤鎴疯緭鍏ユ暟閲忓皬浜庣瓑浜庢暎浠舵�绘暟锛屼竴娆℃�ц皟鎷ㄦ墍鏈夋暎浠�
+                // 鎯呭喌1锛氬ぇ浠跺簱鏈夋暎浠讹紝涓旂敤鎴疯緭鍏ユ暟閲忓皬浜庣瓑浜庢暎浠舵�绘暟锛屽彧璋冩嫧鎵�鏈夋暎浠�
                 if (totalLooseQty > 0 && qty <= totalLooseQty)
                 {
                     decimal remainingLooseQty = totalLooseQty;
@@ -247,7 +372,7 @@
                                 Creater = App.User.UserName ?? "System",
                                 LocationCode = item.LocationCode,
                                 OrderNo = deliveryOrder.Out_no,
-                                Modifier= item.ValidityPeriod,//鏁堟湡
+                                Modifier = item.ValidityPeriod, // 鏁堟湡
                                 StockQuantity = looseQty,
                                 SupplyQuantity = 0,
                                 Remark = "鏁d欢璋冩嫧鍑哄簱锛堜竴娆℃�ф竻鐞嗭級"
@@ -256,102 +381,102 @@
                         }
                     }
                 }
-                // 鎯呭喌2锛氬ぇ浠跺簱鏈夋暎浠讹紝浣嗙敤鎴疯緭鍏ユ暟閲忓ぇ浜庢暎浠舵�绘暟锛屾垨鑰呭ぇ浠跺簱娌℃湁鏁d欢锛屾寜鍘熸潵鏁寸閫昏緫
+                // 鎯呭喌2锛氬ぇ浠跺簱鏈夋暎浠讹紝浣嗙敤鎴疯緭鍏ユ暟閲忓ぇ浜庢暎浠舵�绘暟锛屾垨鑰呭ぇ浠跺簱娌℃湁鏁d欢
                 else
                 {
-                    // 濡傛灉澶т欢搴撴湁鏁d欢浣嗙敤鎴疯璋冩嫧鏇村锛屽厛娓呯悊鏁d欢
-                    decimal allocatedLooseQty = 0;
+                    // 璁$畻琛ュ厖鐨勬暣绠辨暟閲�
+                    decimal remainingAfterLoose = qty - totalLooseQty;
+                    decimal additionalBoxesNeeded = 0;
+
+                    if (remainingAfterLoose > 0)
+                    {
+                        // 鍚戜笂鍙栨暣璁$畻闇�瑕佺殑棰濆鏁寸鏁�
+                        additionalBoxesNeeded = Math.Ceiling(remainingAfterLoose / materielInfo.BoxQty); //鍚戜笂鍙栨暣锛�
+                    }
+
+                    // 鎬昏皟鎷ㄩ噺 = 鎵�鏈夋暎浠� + 琛ュ厖鐨勬暣绠�
+                    Qty = totalLooseQty + (additionalBoxesNeeded * materielInfo.BoxQty);
+
+                    // 寮�濮嬪疄闄呰皟鎷�
+                    decimal remainingQty = Qty;
+
+                    // 鍏堣皟鎷ㄦ墍鏈夋暎浠�
                     if (totalLooseQty > 0)
                     {
                         foreach (var item in dt_InventoryInfos)
                         {
+                            if (remainingQty <= 0) break;
+
                             var looseQty = item.AvailableQuantity % materielInfo.BoxQty;
                             if (looseQty > 0)
                             {
-                                // 涓�娆℃�ц皟鎷ㄨ搴撳瓨璁板綍涓殑鎵�鏈夋暎浠�
-                                item.OutboundQuantity += looseQty;
-                                item.AvailableQuantity -= looseQty;
-                                allocatedLooseQty += looseQty;
-                                Qty += looseQty;
-                                businessQtyToAdd += looseQty;
-
-                                // 娣诲姞渚涘簲浠诲姟
-                                Dt_SupplyTask supplyTask = new Dt_SupplyTask()
-                                {
-                                    WarehouseCode = item.WarehouseCode,
-                                    BatchNo = item.BatchNo,
-                                    MaterielName = item.MaterielName,
-                                    MaterielCode = item.MaterielCode,
-                                    MaterielSpec = item.MaterielSpec,
-                                    TaskStatus = SupplyStatusEnum.NewOut.ObjToInt(),
-                                    TaskType = TaskTypeEnum.AllocatOut.ObjToInt(),
-                                    CreateDate = DateTime.Now,
-                                    Creater = App.User.UserName ?? "System",
-                                    LocationCode = item.LocationCode,
-                                    OrderNo = deliveryOrder.Out_no,
-                                    StockQuantity = looseQty,
-                                    Modifier = item.ValidityPeriod,//鏁堟湡
-                                    SupplyQuantity = 0,
-                                    Remark = "鏁d欢璋冩嫧鍑哄簱锛堜竴娆℃�ф竻鐞嗭級"
-                                };
-                                supplyTasks.Add(supplyTask);
+                                // 璋冩嫧璇ュ簱瀛樿褰曚腑鐨勬墍鏈夋暎浠�
+                                decimal transferLooseQty = Math.Min(looseQty, remainingQty);
+                                item.OutboundQuantity += transferLooseQty;
+                                item.AvailableQuantity -= transferLooseQty;
+                                businessQtyToAdd += transferLooseQty;
+                                remainingQty -= transferLooseQty;
                             }
                         }
                     }
 
-                    // 璁$畻杩橀渶瑕佽皟鎷ㄧ殑鏁寸鏁伴噺
-                    var remainingQty = qty - allocatedLooseQty;
+                    // 濡傛灉杩樻湁鍓╀綑闇�瑕佽皟鎷ㄧ殑鏁伴噺锛堣ˉ鍏呯殑鏁寸锛夛紝浠庢暣绠变腑璋冩嫧
                     if (remainingQty > 0)
                     {
-                        var zx = (int)Math.Ceiling((decimal)remainingQty / materielInfo.BoxQty); // 闇�瑕佺殑鏁寸鏁�
-
                         foreach (var item in dt_InventoryInfos)
                         {
-                            decimal taskQty = 0;
-                            if (zx < 1) break;
+                            if (remainingQty <= 0) break;
 
-                            // 璁$畻褰撳墠搴撳瓨鍙彁渚涚殑瀹屾暣绠辨暟
-                            var availableFullBoxes = item.AvailableQuantity / materielInfo.BoxQty;
-                            var boxesToTransfer = Math.Min(availableFullBoxes, zx);
-
-                            if (boxesToTransfer > 0)
+                            // 璁$畻褰撳墠搴撳瓨鐨勫畬鏁寸鏁伴噺锛堝凡鎵i櫎鏁d欢锛�
+                            decimal availableFullBoxes = item.AvailableQuantity / materielInfo.BoxQty;
+                            if (availableFullBoxes > 0)
                             {
-                                var transferQty = boxesToTransfer * materielInfo.BoxQty;
-                                taskQty += transferQty;
-                                Qty += transferQty;
-                                businessQtyToAdd += transferQty;
-                                zx -= (int)boxesToTransfer;
+                                // 璁$畻闇�瑕佷粠璇ュ簱瀛樿皟鎷ㄧ殑绠辨暟
+                                decimal boxesToTransfer = Math.Min(availableFullBoxes, remainingQty / materielInfo.BoxQty);
+                                decimal transferQty = boxesToTransfer * materielInfo.BoxQty;
 
                                 item.OutboundQuantity += transferQty;
                                 item.AvailableQuantity -= transferQty;
-
-                                // 娣诲姞渚涘簲浠诲姟
-                                Dt_SupplyTask supplyTask = new Dt_SupplyTask()
-                                {
-                                    WarehouseCode = item.WarehouseCode,
-                                    BatchNo = item.BatchNo,
-                                    MaterielName = item.MaterielName,
-                                    MaterielCode = item.MaterielCode,
-                                    MaterielSpec = item.MaterielSpec,
-                                    TaskStatus = SupplyStatusEnum.NewOut.ObjToInt(),
-                                    TaskType = TaskTypeEnum.AllocatOut.ObjToInt(),
-                                    CreateDate = DateTime.Now,
-                                    Creater = App.User.UserName ?? "System",
-                                    LocationCode = item.LocationCode,
-                                    OrderNo = deliveryOrder.Out_no,
-                                    Modifier = item.ValidityPeriod,//鏁堟湡
-                                    StockQuantity = taskQty,
-                                    SupplyQuantity = 0,
-                                    Remark = "鏁寸璋冩嫧鍑哄簱"
-                                };
-                                supplyTasks.Add(supplyTask);
+                                businessQtyToAdd += transferQty;
+                                remainingQty -= transferQty;
                             }
                         }
+                    }
 
-                        // 妫�鏌ユ暣绠辨暟閲忔槸鍚﹁冻澶�
-                        if (zx > 0)
+                    // 妫�鏌ユ槸鍚﹁皟鎷ㄥ畬鎴�
+                    if (remainingQty > 0)
+                    {
+                        return WebResponseContent.Instance.Error($"搴撳瓨涓嶈冻锛屾棤娉曞畬鎴愯皟鎷ㄣ�傝繕闇�瑕亄remainingQty}涓�");
+                    }
+
+                    // 鍒涘缓涓�涓�讳换鍔★紝鑰屼笉鏄涓换鍔�
+                    if (Qty > 0)
+                    {
+                        // 浣跨敤绗竴涓簱瀛樿褰曠殑淇℃伅鍒涘缓浠诲姟
+                        var firstInventory = dt_InventoryInfos.FirstOrDefault(x => x.OutboundQuantity > 0);
+                        if (firstInventory != null)
                         {
-                            return WebResponseContent.Instance.Error($"鏁寸搴撳瓨涓嶈冻锛屾棤娉曞畬鎴愯皟鎷ㄣ�傝繕闇�瑕亄zx}绠�");
+                            Dt_SupplyTask supplyTask = new Dt_SupplyTask()
+                            {
+                                WarehouseCode = firstInventory.WarehouseCode,
+                                BatchNo = firstInventory.BatchNo,
+                                MaterielName = firstInventory.MaterielName,
+                                MaterielCode = firstInventory.MaterielCode,
+                                MaterielSpec = firstInventory.MaterielSpec,
+                                TaskStatus = SupplyStatusEnum.NewOut.ObjToInt(),
+                                TaskType = TaskTypeEnum.AllocatOut.ObjToInt(),
+                                CreateDate = DateTime.Now,
+                                Creater = App.User.UserName ?? "System",
+                                LocationCode = firstInventory.LocationCode,
+                                OrderNo = deliveryOrder.Out_no,
+                                Modifier = firstInventory.ValidityPeriod, // 鏁堟湡
+                                StockQuantity = Qty, // 鎬昏皟鎷ㄦ暟閲�
+                                SupplyQuantity = 0,
+                                Remark = additionalBoxesNeeded > 0 ?
+                                    $"璋冩嫧鍑哄簱 {Qty}涓紙鏁d欢{totalLooseQty}涓� + 鏁寸{additionalBoxesNeeded}绠憋紝鐢ㄦ埛闇�姹倇qty}涓級" :
+                                    $"璋冩嫧鍑哄簱 {Qty}涓紙鏁d欢锛岀敤鎴烽渶姹倇qty}涓級"
+                            };
+                            supplyTasks.Add(supplyTask);
                         }
                     }
                 }
@@ -417,6 +542,282 @@
 
 
         /// <summary>
+        /// 绉诲簱/灏嗕竴涓簱鍖虹殑搴撲綅绉诲埌鍙︿竴涓簱浣�
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        public WebResponseContent TransferInventory(int[] keys)
+        {
+            try
+            {
+                List<Dt_DeliveryOrder> deliveryOrders = new List<Dt_DeliveryOrder>();
+                Dt_CabinOrder cabinOrder = null; // 鍙湁涓�涓叆搴撳崟
+                List<Dt_SupplyTask> supplyTasks = new List<Dt_SupplyTask>();
+                List<Dt_InventoryInfo> _InventoryInfos = new List<Dt_InventoryInfo>();
+                List<Dt_MaterielInfo> materielInfos = new List<Dt_MaterielInfo>();
+                List<Dt_Inventory_Batch> batchUpdates=new List<Dt_Inventory_Batch>();
+
+                // 鍏堟牴鎹甶d鎵惧埌鍒拌繖涓墿鏂欎互鍙婃壒娆�
+                var inventory_Batches = BaseDal.QueryData(x => keys.Contains(x.Id)).ToList();
+
+                // 鏀堕泦鎵�鏈夋秹鍙婄殑搴撲綅
+                var allWarehouses = new List<string>();
+                foreach (var item in inventory_Batches)
+                {
+                    var inventoryInfos = _inventoryInfoService.Repository.QueryData(x =>
+                        x.MaterielCode == item.MaterielCode && x.BatchNo == item.BatchNo).ToList();
+
+                    if (inventoryInfos.Count > 0)
+                    {
+                        allWarehouses.AddRange(inventoryInfos.Select(x => x.WarehouseCode));
+                    }
+                }
+
+                var distinctWarehouses = allWarehouses.Distinct().ToList();
+
+                // 纭畾绉讳綅绫诲瀷鍜岀洰鏍囧簱浣�
+                bool has001 = distinctWarehouses.Contains("001");
+                bool has002 = distinctWarehouses.Contains("002");
+                bool has003 = distinctWarehouses.Contains("003");
+                bool has010 = distinctWarehouses.Contains("010");
+
+                string targetWarehouseCode;
+                bool isSameWarehouseShift = false;
+
+                #region 瑙勫垯
+                // 瑙勫垯1锛氬鏋滃悓鏃跺瓨鍦�001鍜�002锛屽叏閮ㄧЩ鍒�002
+                if (has001 && has002)
+                {
+                    targetWarehouseCode = "002";
+                }
+                // 瑙勫垯2锛氬鏋滃彧鏈�001锛岀Щ鍒�002
+                else if (has001 && !has002)
+                {
+                    targetWarehouseCode = "002";
+                }
+                // 瑙勫垯3锛氬鏋滃彧鏈�002锛屽湪002鍐呯Щ浣�
+                else if (has002 && !has001)
+                {
+                    targetWarehouseCode = "002";
+                    isSameWarehouseShift = true;
+                }
+                // 瑙勫垯4锛氬鏋滃彧鏈�003锛屽湪003鍐呯Щ浣�
+                else if (has003 && distinctWarehouses.Count == 1)
+                {
+                    targetWarehouseCode = "003";
+                    isSameWarehouseShift = true;
+                }
+                // 瑙勫垯5锛氬鏋滃彧鏈�010锛屽湪010鍐呯Щ浣�
+                else if (has010 && distinctWarehouses.Count == 1)
+                {
+                    targetWarehouseCode = "010";
+                    isSameWarehouseShift = true;
+                }
+                else
+                {
+                    throw new Exception("鏃犳晥鐨勫簱瀛樼粍鍚堟垨璺ㄥ簱鎴跨Щ浣嶄笉鍏佽");
+                }
+                #endregion
+
+
+                // 鍏堝垽鏂繖涓槸鍚︽湁寰呭嚭搴撴暟閲忥紝浠ュ強鐩樼偣宸紓鏁�
+                foreach (var item in inventory_Batches)
+                {
+                    #region 鍒ゆ柇鏄惁鍒涘缓
+                    var supplyTask1 = _supplyTaskService.Repository.QueryData(x => x.MaterielCode == item.MaterielCode && x.BatchNo == item.BatchNo && x.TaskType == TaskTypeEnum.TransferOut.ObjToInt()).ToList();
+                    if (supplyTask1.Count>0) throw new Exception($"鐗╂枡缂栧彿銆恵item.MaterielCode}銆戞壒娆″彿銆恵item.BatchNo}銆戝凡瀛樺湪绉诲簱浠诲姟锛岃鍏堝畬鎴愬綋鍓嶇Щ搴撲换鍔�");
+
+                    // 鏌ユ壘浠诲姟涓槸鍚﹀瓨鍦ㄥ緟鐩樼偣浠诲姟
+                    supplyTask1 = _supplyTaskService.Repository.QueryData(x => x.MaterielCode == item.MaterielCode && x.BatchNo == item.BatchNo && x.TaskStatus == SupplyStatusEnum.NewCheck.ObjToInt()).ToList();
+                    if (supplyTask1.Count > 0) throw new Exception($"鐗╂枡缂栧彿銆恵item.MaterielCode}銆戞壒娆″彿銆恵item.BatchNo}銆戝凡瀛樺湪鐩樼偣浠诲姟锛岃鍏堝畬鎴愬綋鍓嶇洏鐐逛换鍔�");
+
+                    // 鏌ユ壘浠诲姟涓槸鍚﹀瓨鍦ㄥ嚭搴撲换鍔�
+                    supplyTask1 = _supplyTaskService.Repository.QueryData(x => x.MaterielCode == item.MaterielCode && x.BatchNo == item.BatchNo && x.TaskStatus == SupplyStatusEnum.NewOut.ObjToInt()).ToList();
+                    if (supplyTask1.Count > 0) throw new Exception($"鐗╂枡缂栧彿銆恵item.MaterielCode}銆戞壒娆″彿銆恵item.BatchNo}銆戝凡瀛樺湪鍑哄簱浠诲姟锛岃鍏堝畬鎴愬綋鍓嶅嚭搴撲换鍔�");
+                    #endregion
+
+                    // 鏌ユ壘搴撳瓨淇℃伅
+                    var inventoryInfos = _inventoryInfoService.Repository.QueryData(x => x.MaterielCode == item.MaterielCode && x.BatchNo == item.BatchNo).ToList();
+                    if (inventoryInfos.Count > 0)
+                    {
+                        // 璁$畻璇ョ墿鏂欐壒娆$殑鎬诲簱瀛樻暟閲忥紙鎵�鏈夊簱浣嶏級
+                        decimal totalStockQuantity = inventoryInfos.Sum(x => x.StockQuantity);
+
+                        // 鐩存帴鏇存柊鎵规瀵硅薄鐨勫瓧娈�
+                        item.OutboundQuantity += totalStockQuantity;
+                        item.AvailableQuantity -= totalStockQuantity;
+
+                        // 娣诲姞鍒版洿鏂板垪琛紙濡傛灉杩樻病娣诲姞杩囷級
+                        if (!batchUpdates.Any(x => x.Id == item.Id))
+                        {
+                            batchUpdates.Add(item);
+                        }
+
+                       
+
+                        // 鍒涘缓鍏ュ簱鍗曪紙鍙湁涓�涓級
+                        if (cabinOrder == null)
+                        {
+                            cabinOrder = new Dt_CabinOrder()
+                            {
+                                Order_no = $"RK{targetWarehouseCode}{DateTime.Now.ToString("yyMMddHHmmss")}",
+                                Order_type = "40", // 绉讳綅鍏ュ簱
+                                OdrderStatus = "鏂板缓",
+                                Warehouse_no = targetWarehouseCode,
+                                Details = new List<Dt_CabinOrderDetail>()
+                            };
+                        }
+
+                        // 娣诲姞鍏ュ簱鏄庣粏锛堟�绘暟閲忥級
+                        Dt_CabinOrderDetail cabinOrderDetail = new Dt_CabinOrderDetail()
+                        {
+                            Batch_num = item.BatchNo,
+                            Order_Inqty = 0,
+                            Order_qty = totalStockQuantity, // 鎵�鏈夊簱浣嶇殑鎬绘暟閲�
+                            CreateDate = DateTime.Now,
+                            Creater = App.User.UserName,
+                            Goods_no = item.MaterielCode,
+                            OrderDetailStatus = "鏂板缓",
+                            Status = targetWarehouseCode == "001" ? 0 : 2,
+                            Reservoirarea = targetWarehouseCode,
+                        };
+
+                        // 妫�鏌ユ槸鍚﹀凡鏈夌浉鍚岀墿鏂欐壒娆$殑鍏ュ簱鏄庣粏
+                        var existingDetail = cabinOrder.Details.FirstOrDefault(x =>
+                            x.Goods_no == item.MaterielCode && x.Batch_num == item.BatchNo);
+
+                        if (existingDetail != null)
+                        {
+                            // 濡傛灉宸插瓨鍦紝鍚堝苟鏁伴噺
+                            existingDetail.Order_qty += totalStockQuantity;
+                        }
+                        else
+                        {
+                            // 娣诲姞鍏ュ簱
+                            cabinOrder.Details.Add(cabinOrderDetail);
+                        }
+
+                        // 鏍规嵁搴撴埧鍙锋潵杩涜鍒嗙粍锛屼负姣忎釜婧愬簱浣嶅垱寤哄嚭搴撳崟
+                        foreach (var items in inventoryInfos.GroupBy(x => x.WarehouseCode))
+                        {
+                            string sourceWarehouseCode = items.Key;
+
+                            //// 濡傛灉鏄悓搴撴埧绉讳綅涓旀簮搴撲綅灏辨槸鐩爣搴撲綅锛岃烦杩囷紙涓嶇Щ鍒拌嚜韬級
+                            //if (isSameWarehouseShift && sourceWarehouseCode == targetWarehouseCode)
+                            //    continue;
+
+                            // 鏌ユ壘鍒拌搴撴埧鍙风殑鍑哄簱鍗�
+                            var deliveryOrder = deliveryOrders.Where(x => x.Warehouse_no == sourceWarehouseCode).FirstOrDefault();
+                            bool isNull = false;
+                            if (deliveryOrder == null)
+                            {
+                                isNull = true;
+                                deliveryOrder = new Dt_DeliveryOrder()
+                                {
+                                    Out_no = $"YK{sourceWarehouseCode}{DateTime.Now.ToString("yyMMddHHmmss")}{new Random().Next(1000, 9999)}",
+                                    Out_type = "30", // 绉讳綅鍑哄簱
+                                    OutStatus = "鏂板缓",
+                                    Warehouse_no = sourceWarehouseCode,
+                                    Details = new List<Dt_DeliveryOrderDetail>()
+                                };
+                            }
+
+                            var Status = sourceWarehouseCode == "001" ? 0 : 2; // 鍒ゆ柇鏄惁涓虹珛搴撳尯鍩�
+                            Dt_DeliveryOrderDetail deliveryOrderDetail = new Dt_DeliveryOrderDetail()
+                            {
+                                Batch_num = item.BatchNo,
+                                Order_Outqty = 0,
+                                Order_qty = items.Select(x => x.StockQuantity).Sum(), // 璇ュ簱浣嶇殑鏁伴噺
+                                CreateDate = DateTime.Now,
+                                Creater = App.User.UserName,
+                                Goods_no = item.MaterielCode,
+                                OotDetailStatus = "鏂板缓",
+                                Status = Status,
+                                Reservoirarea = sourceWarehouseCode,
+                            };
+
+                            deliveryOrder.Details.Add(deliveryOrderDetail);
+                            if (isNull) deliveryOrders.Add(deliveryOrder);
+
+                            #region 鍒涘缓绉诲簱鍑哄簱浠诲姟
+                            foreach (var inventory in items)
+                            {
+                                // 淇濆瓨鍘熸潵鐨勫簱瀛樻暟閲�
+                                decimal originalStockQuantity = inventory.StockQuantity;
+
+                                // 鏇存柊搴撳瓨淇℃伅锛氬鍔犲緟鍑哄簱鏁伴噺锛屽噺灏戝彲鐢ㄥ簱瀛�
+                                inventory.OutboundQuantity += originalStockQuantity;
+                                inventory.AvailableQuantity -= originalStockQuantity;
+
+                                Dt_SupplyTask supplyTask = new Dt_SupplyTask()
+                                {
+                                    WarehouseCode = inventory.WarehouseCode,
+                                    TaskStatus = SupplyStatusEnum.NewOut.ObjToInt(),
+                                    BatchNo = inventory.BatchNo,
+                                    MaterielName = inventory.MaterielName,
+                                    MaterielCode = inventory.MaterielCode,
+                                    MaterielSpec = inventory.MaterielSpec,
+                                    TaskType = TaskTypeEnum.TransferOut.ObjToInt(),
+                                    CreateDate = DateTime.Now,
+                                    Creater = App.User.UserName,
+                                    LocationCode = inventory.LocationCode,
+                                    OrderNo = deliveryOrder.Out_no,
+                                    StockQuantity = inventory.StockQuantity,
+                                    Modifier = inventory.ValidityPeriod, // 鏁堟湡
+                                    SupplyQuantity = 0,
+                                    Remark = isSameWarehouseShift ?
+                                        $"鍦▄sourceWarehouseCode}搴撴埧鍐呯Щ浣�" :
+                                        $"浠巤sourceWarehouseCode}绉诲簱鍒皗targetWarehouseCode}",
+                                };
+                                supplyTasks.Add(supplyTask);
+                                _InventoryInfos.Add(inventory);
+                            }
+                            #endregion
+                        }
+                    }
+                }
+
+                // 妫�鏌ユ槸鍚︽湁闇�瑕佺Щ浣嶇殑搴撳瓨
+                if (cabinOrder == null || cabinOrder.Details.Count == 0)
+                    throw new Exception("娌℃湁闇�瑕佺Щ浣嶇殑搴撳瓨");
+
+                _InventoryInfos.ForEach(x =>
+                {
+                    x.StockStatus = StockStatusEmun.绉讳綅涓�.ObjToInt();
+                });
+
+                Db.Ado.BeginTran();
+                _materielInfoService.UpdateData(materielInfos);
+                _inventoryInfoService.UpdateData(_InventoryInfos);
+                _supplyTaskService.AddData(supplyTasks);
+                BaseDal.UpdateData(batchUpdates);
+
+                // 鎵归噺鎻掑叆鍑哄簱鍗曪紙姣忎釜婧愬簱浣嶄竴涓級
+                foreach (var deliveryOrder in deliveryOrders)
+                {
+                    if (deliveryOrder.Details.Count > 0)
+                        Db.InsertNav(deliveryOrder).Include(x => x.Details).ExecuteCommand();
+                }
+
+                // 鎻掑叆鍏ュ簱鍗曪紙鍙湁涓�涓級
+                if (cabinOrder != null && cabinOrder.Details.Count > 0)
+                    Db.InsertNav(cabinOrder).Include(x => x.Details).ExecuteCommand();
+
+                Db.Ado.CommitTran();
+
+                string message = isSameWarehouseShift ?
+                    "搴撳唴璐т綅璋冩暣鍗曠敓鎴愭垚鍔燂紒" :
+                    "绉诲簱鍑哄叆搴撳崟鐢熸垚鎴愬姛锛�";
+
+                return WebResponseContent.Instance.OK(message);
+            }
+            catch (Exception ex)
+            {
+                Db.Ado.RollbackTran();
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
+        /// <summary>
         /// 搴撳瓨杩囨湡棰勮
         /// </summary>
         /// <returns></returns>
@@ -430,7 +831,7 @@
                 DateTime dateTime180 = DateTime.Now.AddDays(180).Date;
 
 
-                List<Dt_Inventory_Batch> inventory_Batches = BaseDal.QueryData(x => x.ValidityPeriod < dateTime || x.ValidityPeriod<dateTime60 || x.ValidityPeriod < dateTime180).ToList();
+                List<Dt_Inventory_Batch> inventory_Batches = BaseDal.QueryData(x => x.ValidityPeriod < dateTime || x.ValidityPeriod < dateTime60 || x.ValidityPeriod < dateTime180).ToList();
                 foreach (var item in inventory_Batches)
                 {
                     var day = (item.ValidityPeriod - DateTime.Now).Days;
@@ -445,5 +846,7 @@
             }
             return content;
         }
+
+
     }
 }
diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/StockStatusEmun.cs" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/StockStatusEmun.cs"
index 7340c60..3bd8746 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/StockStatusEmun.cs"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/StockStatusEmun.cs"
@@ -61,5 +61,8 @@
 
         [Description("鍏ュ簱鎾ら攢")]
         鍏ュ簱鎾ら攢 = 199,
+
+        [Description("绉讳綅涓�")]
+        绉讳綅涓�=300
     }
 }
diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Common/TaskEnum/TaskStatusEnum.cs" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Common/TaskEnum/TaskStatusEnum.cs"
index 8d347e5..802fda8 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Common/TaskEnum/TaskStatusEnum.cs"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Common/TaskEnum/TaskStatusEnum.cs"
@@ -39,6 +39,13 @@
         /// </summary>
         [Description("鐩樼偣瀹屾垚")]
         CheckFinish,
+
+        [Description("绉讳綅涓�")]
+        TransferIng,
+
+        [Description("绉讳綅瀹屾垚")]
+        TransferOk,
+
     }
     /// <summary>
     /// 浠诲姟鐘舵��
diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Common/TaskEnum/TaskTypeEnum.cs" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Common/TaskEnum/TaskTypeEnum.cs"
index 3308db4..dec10cf 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Common/TaskEnum/TaskTypeEnum.cs"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Common/TaskEnum/TaskTypeEnum.cs"
@@ -54,6 +54,20 @@
         /// </summary>
         [Description("璋冩嫧鍑哄簱")]
         AllocatOut,
+
+        /// <summary>
+        /// 绉讳綅鍏ュ簱
+        /// </summary>
+        [Description("绉讳綅鍏ュ簱")]
+        TransferIn,
+
+        /// <summary>
+        /// 绉讳綅鍑哄簱
+        /// </summary>
+        [Description("绉讳綅鍑哄簱")]
+        TransferOut,
+
+
     }
 
     public enum TaskTypeGroup
diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Model/Models/SquareCabin/Dt_CabinOrder.cs" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Model/Models/SquareCabin/Dt_CabinOrder.cs"
index a15a90f..a8b4e84 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Model/Models/SquareCabin/Dt_CabinOrder.cs"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Model/Models/SquareCabin/Dt_CabinOrder.cs"
@@ -22,6 +22,7 @@
 
         /// <summary>
         /// 涓婃父鍏ュ簱鍗曠被鍨嬩负锛�1姝e父鍏ュ簱,2鍑哄簱閫�璐�,5鐩樼泩鍏ュ簱
+        /// 鑷繁瀹氫箟鐨勭被鍨嬫湁锛�215璋冩嫧鍏ュ簱锛�40绉诲簱鍏ヤ綅
         /// </summary>
         [SugarColumn(IsNullable = true, Length = 3, ColumnDescription = "鍏ュ簱绫诲瀷锛�1姝e父鍏ュ簱,2鍑哄簱閫�璐�,5鐩樼泩鍏ュ簱")]
         public string Order_type { get; set; }
diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Model/Models/WMSInfo/Dt_SupplyTask.cs" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Model/Models/WMSInfo/Dt_SupplyTask.cs"
index d730808..6d0e46a 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Model/Models/WMSInfo/Dt_SupplyTask.cs"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Model/Models/WMSInfo/Dt_SupplyTask.cs"
@@ -109,9 +109,9 @@
         /// <summary>
         /// 搴撳瓨鏁�,浠诲姟鏁伴噺
         /// </summary>
-        [ImporterHeader(Name = "搴撳瓨鏁�")]
+        [ImporterHeader(Name = "浠诲姟鏁�")]
         [ExporterHeader(DisplayName = "浠诲姟鏁�")]
-        [SugarColumn(IsNullable = false, ColumnDescription = "搴撳瓨鏁�")]
+        [SugarColumn(IsNullable = false, ColumnDescription = "浠诲姟鏁�")]
         public decimal StockQuantity { get; set; }
 
         /// <summary>
diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Model/Models/WMSInfo/Dt_TraceabilityCode.cs" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Model/Models/WMSInfo/Dt_TraceabilityCode.cs"
index 1304482..1c44fbe 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Model/Models/WMSInfo/Dt_TraceabilityCode.cs"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_Model/Models/WMSInfo/Dt_TraceabilityCode.cs"
@@ -61,14 +61,14 @@
         /// <summary>
         /// 涓拷婧爜
         /// </summary>
-        [SugarColumn(IsNullable = false, ColumnDescription = "澶ц拷婧爜")]
+        [SugarColumn(IsNullable = false, ColumnDescription = "涓拷婧爜")]
         public int MediumTraceabilityCode { get; set; }
 
 
         /// <summary>
         /// 灏忚拷婧爜
         /// </summary>
-        [SugarColumn(IsNullable = false, ColumnDescription = "澶ц拷婧爜")]
+        [SugarColumn(IsNullable = false, ColumnDescription = "灏忚拷婧爜")]
         public int SmallTraceabilityCode { get; set; }
 
 
diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/Business.cs" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/Business.cs"
index c0dc49f..b810bdc 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/Business.cs"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/Business.cs"
@@ -362,6 +362,9 @@
                             case "6"://鐩樹簭鍑哄簱
                                 ediDto.outOrderType = "30";//鐩樹簭鍑哄簱鍗�
                                 break;
+                            case "30": //绉讳綅鍑哄簱
+                                ediDto.outOrderType = "10";//涓�鑸嚭搴撳崟
+                                break;
                         }
                         var result = HttpHelper.Post(url, ediDto.ToJsonString());
                         var resp = JsonConvert.DeserializeObject<TowcsResponse<object>>(result);
diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/CabinOrderServices.cs" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/CabinOrderServices.cs"
index 2c182d4..16e7406 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/CabinOrderServices.cs"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/CabinOrderServices.cs"
@@ -200,8 +200,8 @@
                 cabinOrderDetail.Order_Inqty += Inqty;
                 if (cabinOrderDetail.Order_Inqty > cabinOrderDetail.Order_qty)
                     return WebResponseContent.Instance.Error($"鍏ュ簱鏁伴噺涓嶅彲瓒呭嚭鍗曟嵁鏁伴噺");
-                //澶т欢搴撴暣绠辨牎楠�
-                if (warehouseCode == WarehouseEnum.澶т欢搴�.ObjToInt().ToString("000")&& (materielInfo.MaterielSourceType==MaterielSourceTypeEnum.SelfMadePart))
+                //澶т欢搴撴暣绠辨牎楠�(鎺掗櫎绉诲簱鍏ュ簱)
+                if (warehouseCode == WarehouseEnum.澶т欢搴�.ObjToInt().ToString("000")&& (materielInfo.MaterielSourceType==MaterielSourceTypeEnum.SelfMadePart) &&cabinOrder.Order_type != "40") // 40鏄Щ浣嶅叆搴撶被鍨�)
                 { 
                     var BoxRule = materielInfo.BoxQty;
                     if (BoxRule > 0 && Inqty % BoxRule != 0)
@@ -311,6 +311,23 @@
                 //};
                 //_supplyTaskService.AddData(supplyTask); 
                 #endregion
+
+                #region 鏂板鍔犱换鍔$被鍨嬧��40鈥濈Щ搴撳嚭搴�
+                int taskType;
+
+                switch (cabinOrder.Order_type)
+                {
+                    case "1":
+                        taskType = TaskTypeEnum.In.ObjToInt();
+                        break;
+                    case "40":
+                        taskType = TaskTypeEnum.TransferIn.ObjToInt();
+                        break;
+                    default:
+                        taskType = TaskTypeEnum.OutReturn.ObjToInt();  // 鍏朵粬鎯呭喌閮芥槸鍑哄簱閫�璐�
+                        break;
+                }
+                #endregion
                 Dt_SupplyTask_Hty supplyTask_Hty = new Dt_SupplyTask_Hty()
                 {
                     WarehouseCode = cabinOrderDetail.Reservoirarea,
@@ -322,7 +339,9 @@
                     MaterielName = inventoryInfo.MaterielName,
                     MaterielCode = inventoryInfo.MaterielCode,
                     MaterielSpec = inventoryInfo.MaterielSpec,
-                    TaskType = cabinOrder.Order_type == "1" ? TaskTypeEnum.In.ObjToInt() : TaskTypeEnum.OutReturn.ObjToInt(),
+                    //TaskType = cabinOrder.Order_type == "1" ? TaskTypeEnum.In.ObjToInt() : TaskTypeEnum.OutReturn.ObjToInt(),
+                    //浠诲姟绫诲瀷
+                    TaskType = taskType,
                     CreateDate = DateTime.Now,
                     Creater = App.User.UserName,
                     LocationCode = location.LocationCode,
@@ -331,6 +350,7 @@
                     SupplyQuantity = 0,
                     Remark = "鍏ュ簱"
                 };
+          
                 _supplyTaskHtyService.AddData(supplyTask_Hty);
                 #endregion
 
@@ -380,7 +400,8 @@
 
         #region 鍒涘缓鍏ュ簱鍗�
         /// <summary>
-        /// 鍒涘缓鍏ュ簱鍗�,杩斿洖涓�涓叆搴撳崟闆嗗悎鍒癲ata
+        /// 鍒涘缓鍏ュ簱鍗�,杩斿洖涓�涓叆搴撳崟闆嗗悎鍒癲ata  
+        /// 鍦ㄥ垱寤哄叆搴撳崟鐨勬椂鍊欏氨宸茬粡娣诲姞浜嗕笟鍔℃暟閲忥紝鍚庣画涓氬姟鏁伴噺鐨勫鍔犲湪鍏ュ簱瀹屾垚鐨勬椂鍊欒繘琛岋紙鐩樼泩鍏ュ簱锛�
         /// </summary>
         public WebResponseContent CreateInboundOrder(UpstreamOrderInfo order)
         {
@@ -503,7 +524,7 @@
                                     OrderDetailStatus = "鏂板缓",
                                     Status = 0
                                 };
-                                materielInfo.Business_qty += ys;
+                                materielInfo.Business_qty += ys;//杩欓噷娣诲姞浜嗕笟鍔℃暟閲�
                             }
                             #endregion
 
diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/DeliveryOrderServices.cs" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/DeliveryOrderServices.cs"
index 41040f9..badab7a 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/DeliveryOrderServices.cs"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/DeliveryOrderServices.cs"
@@ -1474,7 +1474,7 @@
                 }
                 #endregion
 
-                #region 搴撳瓨鎵规 濡傛灉浠诲姟绫诲瀷鏄皟鎷ㄥ嚭搴撲换鍔★紙8锛夊氨涓嶄慨鏀规壒娆″簱瀛�
+                #region 搴撳瓨鎵规 濡傛灉浠诲姟绫诲瀷鏄皟鎷ㄥ嚭搴撲换鍔★紙8锛変笉淇敼鎵规搴撳瓨
                 Dt_Inventory_Batch inventory_Batch = _inventory_BatchServices.Repository.QueryFirst(x => x.BatchNo == inventoryInfo.BatchNo && x.MaterielCode ==inventoryInfo.MaterielCode);
                 if (supplyTask.TaskType != TaskTypeEnum.AllocatOut.ObjToInt())
                 {
@@ -1540,6 +1540,11 @@
         }
 
      
+        /// <summary>
+        /// 杩欎釜鍜屼笂闈竴鏍蜂絾鏄笉鐢ㄤ簡
+        /// </summary>
+        /// <param name="supplyTask"></param>
+        /// <returns></returns>
         public WebResponseContent OutTaskFinish(Dt_SupplyTask supplyTask)
         {
             WebResponseContent content = new WebResponseContent();
diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/LKBusiness/DeliveryOrderServicesLK.cs" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/LKBusiness/DeliveryOrderServicesLK.cs"
index 1dda607..d518436 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/LKBusiness/DeliveryOrderServicesLK.cs"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/LKBusiness/DeliveryOrderServicesLK.cs"
@@ -146,7 +146,7 @@
                             _messageInfoService.AddMessageInfo(MessageGroupByEnum.OutOrderAlarm, "鍑哄簱鍗�", $"璁㈠崟鍙枫�恵request.orderNo}銆戠墿鏂欑紪鍙枫�恵detail.productCode}銆戠殑鍑哄簱鏁伴噺涓庡嚭搴撲换鍔℃暟閲忎笉鐩哥瓑");
                             throw new Exception($"璁㈠崟鍙枫�恵request.orderNo}銆戠墿鏂欑紪鍙枫�恵detail.productCode}銆戠殑鍑哄簱鏁伴噺涓庡嚭搴撲换鍔℃暟閲忎笉鐩哥瓑");
                         }
-                        //澶勭悊鍑哄簱鍗曘�佸簱瀛樹俊鎭�佸嚭搴撲换鍔°�佽皟鎷ㄤ换鍔�
+                        //澶勭悊鍑哄簱鍗曘�佸簱瀛樹俊鎭�佸嚭搴撲换鍔°�佽皟鎷ㄤ换鍔� /杩欓噷淇敼浜嗙珛搴撶殑涓氬姟鏁伴噺
                         content = OutTaskFinish(supplyTask, deliveryOrder);
                         if (!content.Status) throw new Exception(content.Message);
                     }
diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_WMSServer/AlarmJob.cs" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_WMSServer/AlarmJob.cs"
index 7cda1b1..795cef5 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_WMSServer/AlarmJob.cs"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_WMSServer/AlarmJob.cs"
@@ -19,7 +19,7 @@
             _inventoryInfoService = inventoryInfoService;
         }
         //姣忛殧1绉掓墽琛屼竴娆�
-        [Invoke(Begin = "2025-11-01", Interval = 1000 * 5, IsEnabled = false, SkipWhileExecuting = true)]
+        [Invoke(Begin = "2025-11-01", Interval = 1000 * 5, IsEnabled = true, SkipWhileExecuting = true)]
         public void Run()
         {
             //鍐峰簱
diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/WMSInfo/Inventory_BatchController.cs" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/WMSInfo/Inventory_BatchController.cs"
index d441f1f..53e1a79 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/WMSInfo/Inventory_BatchController.cs"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/WMSInfo/Inventory_BatchController.cs"
@@ -1,5 +1,7 @@
-锘縰sing Microsoft.AspNetCore.Http;
+锘縰sing Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
+using WIDESEA_Core;
 using WIDESEA_Core.BaseController;
 using WIDESEA_IWMsInfoServices;
 using WIDESEA_Model.Models;
@@ -13,5 +15,11 @@
         public Inventory_BatchController(IInventory_BatchServices service) : base(service)
         {
         }
+
+        [HttpPost,Route("TransferInventory"),AllowAnonymous]
+        public WebResponseContent TransferInventory([FromBody]int[] keys)
+        {
+            return Service.TransferInventory(keys);
+        }
     }
 }
diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_WMSServer/OutOrderJob.cs" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_WMSServer/OutOrderJob.cs"
index 2797947..b699e00 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_WMSServer/OutOrderJob.cs"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_WMSServer/OutOrderJob.cs"
@@ -14,9 +14,12 @@
         }
 
         //姣忛殧1绉掓墽琛屼竴娆�
-        [Invoke(Begin = "2025-11-01", Interval = 1000 * 5, IsEnabled = false, SkipWhileExecuting = true)]
+        [Invoke(Begin = "2025-11-01", Interval = 1000 * 18, IsEnabled = true, SkipWhileExecuting = true)]
         public void Run()
         {
+            try
+            {
+
             // 鐗╂枡淇℃伅鑾峰彇 - 鐙珛浣滅敤鍩�
             using (var scope1 = _serviceScopeFactory.CreateScope())
             {
@@ -104,6 +107,13 @@
             }
             Console.WriteLine($"浠ラ噴鏀� EdiOut 鐨勬暟鎹簱杩炴帴锛歿DateTime.Now}");
             Console.WriteLine($"WCS浠诲姟鎵ц缁撴潫锛歿DateTime.Now}");
+
+            }
+            catch (Exception ex)
+            {
+
+                Console.WriteLine($"閿欒锛歿ex.Message}");
+            }
         }
     }
 }
diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WMS/config/buttons.js" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WMS/config/buttons.js"
index 9cf6514..f6b0ae9 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WMS/config/buttons.js"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WMS/config/buttons.js"
@@ -206,6 +206,15 @@
     type: 'success',
     onClick: function (){
     }
+},
+{
+    name: "绉讳綅",
+    icon: '',
+    class: '',
+    value: 'YW',
+    type: 'success',
+    onClick: function (){
+    }
 }
 ]
 
diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WMS/src/extension/stock/Dt_Inventory_Batch.js" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WMS/src/extension/stock/Dt_Inventory_Batch.js"
index a43545b..11b7e4b 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WMS/src/extension/stock/Dt_Inventory_Batch.js"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WMS/src/extension/stock/Dt_Inventory_Batch.js"
@@ -63,6 +63,25 @@
             });
         }
       }
+      let YW = this.buttons.find(x => x.value == 'YW');  //鍦˙uttons.js涓畾涔夌殑鎸夐挳
+      if (YW) {
+        YW.onClick = function () {
+          let rows = this.$refs.table.getSelected();
+          if (rows.length == 0) return this.$error("璇烽�夋嫨鏁版嵁!");
+          // if (rows.length > 1) return this.$error("璇烽�夋嫨涓�鏉℃暟鎹�!");
+          const allIds = rows.map(item => item.id);
+          this.http
+            .post("api/Inventory_Batch/TransferInventory", allIds)
+            .then((x) => {
+              if (x.status) {
+                this.$Message.success('绉讳綅鍗曞垱寤烘垚鍔�');
+                this.refresh();
+              } else {
+                return this.$error(x.message);
+              }
+            });
+        }
+      }
     },
     onInited() {
       //妗嗘灦鍒濆鍖栭厤缃悗
@@ -81,6 +100,7 @@
         }
       })
     },
+
     searchBefore(param) {
       //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
       //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ

--
Gitblit v1.9.3