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/ClassLibrary2/Inventory_BatchServices.cs.cs |  639 +++++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 521 insertions(+), 118 deletions(-)

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;
         }
+
+
     }
 }

--
Gitblit v1.9.3