From 2b49f7643d15b74889d190f216630559006ed93a Mon Sep 17 00:00:00 2001
From: yanjinhui <3306209981@qq.com>
Date: 星期一, 01 十二月 2025 09:48:43 +0800
Subject: [PATCH] pad和后端的优化

---
 新建文件夹/WIDESEA_WMSServer/ClassLibrary2/Inventory_BatchServices.cs.cs |  345 ++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 304 insertions(+), 41 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 c7757c3..7d10b1e 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"
@@ -34,31 +34,176 @@
         }
 
         public IRepository<Dt_Inventory_Batch> Repository => BaseDal;
+
+
+        /// <summary>
+        /// 璋冩嫧鍗�
+        /// </summary>
+        /// <param name="saveModel"></param>
+        /// <returns></returns>
+        //public override WebResponseContent UpdateData(SaveModel saveModel)
+        //{
+        //    try
+        //    {
+        //        string WareCode = WarehouseEnum.澶т欢搴�.ObjToInt().ToString("000");
+        //        var qty = saveModel.MainData["availableQuantity"].ObjToInt();
+        //        var id = saveModel.MainData["id"].ObjToInt();
+        //        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;
+        //        List<Dt_SupplyTask> supplyTasks = new List<Dt_SupplyTask>();
+        //        Dt_DeliveryOrder deliveryOrder = new Dt_DeliveryOrder()
+        //        {
+        //            Out_no = DateTime.Now.ToString("yyMMddHHmmss"),
+        //            Warehouse_no = WareCode,
+        //            Out_type = OutOrderTypeEnum.Allocate.ObjToInt().ToString(),
+        //            OutStatus = "鏂板缓",
+        //            Details = new List<Dt_DeliveryOrderDetail>()
+        //        };
+        //        foreach (var item in dt_InventoryInfos)
+        //        {
+        //            decimal taskQty = 0;
+        //            if (zx < 1) break;
+        //            while (item.AvailableQuantity > 0 && zx > 0)
+        //            {
+        //                zx--;
+        //                Qty += materielInfo.BoxQty;
+        //                taskQty += materielInfo.BoxQty;
+        //                materielInfo.Business_qty += materielInfo.BoxQty;
+        //                item.OutboundQuantity += materielInfo.BoxQty;
+        //                item.AvailableQuantity -= materielInfo.BoxQty;
+        //            }
+        //            #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
+        //        }
+        //        Dt_DeliveryOrderDetail deliveryOrderDetail = new Dt_DeliveryOrderDetail()
+        //        {
+        //            Batch_num = batchNo,
+        //            Order_Outqty = 0,
+        //            Order_qty = Qty,
+        //            CreateDate = DateTime.Now,
+        //            Creater = App.User.UserName ?? "System",
+        //            Goods_no = materielCode,
+        //            OotDetailStatus = "鏂板缓",
+        //            Status = 2,
+        //            Reservoirarea = WareCode
+        //        };
+        //        deliveryOrder.Details.Add(deliveryOrderDetail);
+        //        #region 娣诲姞璋冩嫧鍏ュ簱鍗�
+        //        Dt_CabinOrder cabinOrder = new Dt_CabinOrder()
+        //        {
+        //            Order_no = deliveryOrder.Out_no,
+        //            Order_type = InOrderTypeEnum.Allocat.ObjToInt().ToString(),
+        //            Warehouse_no = "001",
+        //            OdrderStatus = "鏂板缓",
+        //            Details = new List<Dt_CabinOrderDetail>()
+        //        };
+        //        foreach (var item in deliveryOrder.Details)
+        //        {
+        //            Dt_CabinOrderDetail orderDetail = new Dt_CabinOrderDetail()
+        //            {
+        //                Reservoirarea = cabinOrder.Warehouse_no,
+        //                Goods_no = item.Goods_no,
+        //                Order_qty = item.Order_qty,
+        //                Batch_num = item.Batch_num,
+        //                OrderDetailStatus = "鏂板缓",
+        //                Status = 0
+        //            };
+        //            cabinOrder.Details.Add(orderDetail);
+        //        }
+        //        #endregion
+        //        Db.Ado.BeginTran();
+        //        _materielInfoService.UpdateData(materielInfo);
+        //        _inventoryInfoService.Repository.UpdateData(dt_InventoryInfos);
+        //        _supplyTaskService.AddData(supplyTasks);
+        //        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("璋冩嫧鍑哄叆搴撳崟鐢熸垚鎴愬姛,璇锋搷浣滆皟鎷ㄥ崟");
+        //    }
+        //    catch (Exception ex)
+        //    {
+        //        Db.Ado.RollbackTran();
+        //        return WebResponseContent.Instance.Error(ex.Message);
+        //    }
+        //}
+
+
+
+        /// <summary>
+        /// 璋冩嫧鍗�
+        /// </summary>
+        /// <param name="saveModel"></param>
+        /// <returns></returns>
         public override WebResponseContent UpdateData(SaveModel saveModel)
         {
             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()
                 {
@@ -68,40 +213,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,
@@ -115,7 +373,8 @@
                     Reservoirarea = WareCode
                 };
                 deliveryOrder.Details.Add(deliveryOrderDetail);
-                #region 娣诲姞璋冩嫧鍏ュ簱鍗�
+
+                // 娣诲姞璋冩嫧鍏ュ簱鍗�
                 Dt_CabinOrder cabinOrder = new Dt_CabinOrder()
                 {
                     Order_no = deliveryOrder.Out_no,
@@ -137,7 +396,7 @@
                     };
                     cabinOrder.Details.Add(orderDetail);
                 }
-                #endregion
+
                 Db.Ado.BeginTran();
                 _materielInfoService.UpdateData(materielInfo);
                 _inventoryInfoService.Repository.UpdateData(dt_InventoryInfos);
@@ -145,7 +404,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)
             {
@@ -153,6 +413,9 @@
                 return WebResponseContent.Instance.Error(ex.Message);
             }
         }
+
+
+
         public WebResponseContent GetExpiredAndlow()
         {
             WebResponseContent content = new WebResponseContent();

--
Gitblit v1.9.3