From 23f7d0e0cf31ea6a7cde81bf23ef07091bd4f3a7 Mon Sep 17 00:00:00 2001
From: dengjunjie <dengjunjie@hnkhzn.com>
Date: 星期一, 03 十一月 2025 14:22:35 +0800
Subject: [PATCH] 添加人工触发调拨单

---
 新建文件夹/WMS/src/extension/stock/Dt_Inventory_Batch.js                   |    4 
 新建文件夹/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/extend/Allocat.cs |  135 ++++++++++++++++++---------
 新建文件夹/WMS/src/views/stock/Dt_Inventory_Batch.vue                      |    2 
 新建文件夹/WIDESEA_WMSServer/ClassLibrary2/Inventory_BatchServices.cs.cs   |  133 ++++++++++++++++++++++++++
 4 files changed, 223 insertions(+), 51 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 7f8f0d0..0db452a 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"
@@ -1,9 +1,15 @@
-锘縰sing System;
+锘縰sing SqlSugar.Extensions;
+using System;
 using System.Collections.Generic;
+using System.Drawing.Drawing2D;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using WIDESEA_Common;
+using WIDESEA_Common.OrderEnum;
+using WIDESEA_Common.StockEnum;
+using WIDESEA_Common.TaskEnum;
+using WIDESEA_Common.WareHouseEnum;
 using WIDESEA_Core;
 using WIDESEA_Core.BaseRepository;
 using WIDESEA_Core.BaseServices;
@@ -16,15 +22,136 @@
     public class Inventory_BatchServices : ServiceBase<Dt_Inventory_Batch, IRepository<Dt_Inventory_Batch>>, IInventory_BatchServices
     {
         private IMessageInfoService _messageInfoService;
-        public Inventory_BatchServices(IRepository<Dt_Inventory_Batch> BaseDal, IMessageInfoService messageInfoService) : base(BaseDal)
+        private IMaterielInfoService _materielInfoService;
+        private IInventoryInfoService _inventoryInfoService;
+        private ISupplyTaskService _supplyTaskService;
+        public Inventory_BatchServices(IRepository<Dt_Inventory_Batch> BaseDal, IMessageInfoService messageInfoService, IMaterielInfoService materielInfoService, IInventoryInfoService inventoryInfoService, ISupplyTaskService supplyTaskService) : base(BaseDal)
         {
             _messageInfoService = messageInfoService;
+            _materielInfoService = materielInfoService;
+            _inventoryInfoService = inventoryInfoService;
+            _supplyTaskService = supplyTaskService;
         }
 
         public IRepository<Dt_Inventory_Batch> Repository => BaseDal;
         public override WebResponseContent UpdateData(SaveModel saveModel)
         {
-            return base.UpdateData(saveModel);
+            try
+            {
+                string WareCode = WarehouseEnum.澶т欢搴�.ObjToInt().ToString("000");
+                var qty = saveModel.MainData["stockQuantity"].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;
+                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 > 1) Db.InsertNav(deliveryOrder).Include(x => x.Details).ExecuteCommand();
+                if (cabinOrder.Details.Count > 1) 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);
+            }
         }
         public WebResponseContent GetExpiredAndlow()
         {
diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/extend/Allocat.cs" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/extend/Allocat.cs"
index caa7125..5b88b7e 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/extend/Allocat.cs"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/extend/Allocat.cs"
@@ -42,9 +42,17 @@
                     dt_InventoryInfos = dt_InventoryInfos.OrderBy(x => x.ValidityPeriod).ToList();
                 else
                     dt_InventoryInfos = dt_InventoryInfos.OrderBy(x => x.InDate).ToList();
-                decimal Qty = 0;
+                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 Qty = 0;
                     if (materielInfo.Business_qty >= materielInfo.MinQty) break;
                     //item.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
                     while (item.StockQuantity > item.OutboundQuantity && materielInfo.Business_qty < materielInfo.MinQty)
@@ -54,49 +62,31 @@
                         item.OutboundQuantity += materielInfo.BoxQty;
                     }
                     item.AvailableQuantity = item.StockQuantity - item.OutboundQuantity;
-                }
-                #region 澶т欢搴撹ˉ绔嬪簱鍚庣珛搴撲笟鍔″簱瀛樻暟杩樻槸灏忎簬绔嬪簱鏈�灏忓簱瀛樻暟锛屾坊鍔犳彁绀轰俊鎭�
-                //娣诲姞鎶ヨ淇℃伅
-                if (materielInfo.Business_qty < materielInfo.MinQty)
-                {
-                    _messageInfoService.AddMessageInfo(MessageGroupByEnum.InventoryLowAlarm, $"鐗╂枡鍚嶇О:{materielInfo.MaterielName}", $"銆愮墿鏂欑紪鐮亄materielInfo.MaterielCode}宸茬敓鎴愯皟鎷ㄥ嚭鍏ュ簱鍗曪紝璇疯繘琛屽嚭鍏ュ簱娴佺▼銆傚ぇ浠跺簱搴撳瓨杩囦綆锛佽鍙婃椂琛ュ厖搴撳瓨锛併��");
-                }
-                else
-                {
-                    _messageInfoService.AddMessageInfo(MessageGroupByEnum.InventoryLowAlarm, $"鐗╂枡鍚嶇О:{materielInfo.MaterielName}", $"銆愮墿鏂欑紪鐮亄materielInfo.MaterielCode}宸茬敓鎴愯皟鎷ㄥ嚭鍏ュ簱鍗曪紝璇疯繘琛屽嚭鍏ュ簱娴佺▼銆�");
-                }
-                #endregion
-                #region 娣诲姞璋冩嫧鍑哄簱鍗�
-                Dt_DeliveryOrder deliveryOrder = new Dt_DeliveryOrder()
-                {
-                    Out_no = DateTime.Now.ToString("yyMMddHHmmss"),
-                    Out_type = OutOrderTypeEnum.Allocate.ObjToInt().ToString(),
-                    OutStatus = "鏂板缓",
-                    Details = new List<Dt_DeliveryOrderDetail>()
-                };
-                dt_InventoryInfos = dt_InventoryInfos.Where(X => X.StockStatus == StockStatusEmun.鍑哄簱閿佸畾.ObjToInt()).ToList();
-                foreach (var item in dt_InventoryInfos.GroupBy(x => x.BatchNo)) //杩欓噷鎸夋壒娆″垎缁勪簡
-                {
-                    Dt_DeliveryOrderDetail deliveryOrderDetail = new Dt_DeliveryOrderDetail()
+                    #region 娣诲姞璋冩嫧鍑哄簱鍗�
+                    Dt_DeliveryOrderDetail? deliveryOrderDetail = deliveryOrder.Details.FirstOrDefault(x => x.Batch_num == item.BatchNo);
+                    if (deliveryOrderDetail == null)
                     {
-                        Batch_num = item.Key,
-                        Order_Outqty = 0,
-                        Order_qty = item.Select(x => x.OutboundQuantity).Sum(),
-                        CreateDate = DateTime.Now,
-                        Creater = App.User.UserName ?? "System",
-                        Goods_no = item.First().MaterielCode,
-                        OotDetailStatus = "鏂板缓",
-                        Status = 2,
-                        Reservoirarea = item.First().WarehouseCode
-                    };
-                    deliveryOrder.Warehouse_no = item.First().WarehouseCode;
-                    deliveryOrder.Details.Add(deliveryOrderDetail);
-                }
-                #endregion
-
-                #region 娣诲姞璋冩嫧鍑哄簱浠诲姟
-                foreach (var item in dt_InventoryInfos)
-                {
+                        deliveryOrderDetail = new Dt_DeliveryOrderDetail()
+                        {
+                            Batch_num = item.BatchNo,
+                            Order_Outqty = 0,
+                            Order_qty = Qty,
+                            CreateDate = DateTime.Now,
+                            Creater = App.User.UserName ?? "System",
+                            Goods_no = item.MaterielCode,
+                            OotDetailStatus = "鏂板缓",
+                            Status = 2,
+                            Reservoirarea = WareCode
+                        };
+                        deliveryOrder.Details.Add(deliveryOrderDetail);
+                    }
+                    else
+                    {
+                        deliveryOrderDetail.Order_qty += Qty;
+                    }
+                    deliveryOrder.Details.Add(deliveryOrderDetail); 
+                    #endregion
+                    #region 娣诲姞璋冩嫧鍑哄簱浠诲姟
                     Dt_SupplyTask supplyTask = new Dt_SupplyTask()
                     {
                         WarehouseCode = item.WarehouseCode,
@@ -110,12 +100,67 @@
                         Creater = App.User.UserName ?? "System",
                         LocationCode = item.LocationCode,
                         OrderNo = deliveryOrder.Out_no,
-                        StockQuantity = item.OutboundQuantity,
+                        StockQuantity = Qty,
                         SupplyQuantity = 0,
                         Remark = "璋冩嫧鍑哄簱"
                     };
-                    supplyTasks.Add(supplyTask);
+                    supplyTasks.Add(supplyTask); 
+                    #endregion
                 }
+                #region 澶т欢搴撹ˉ绔嬪簱鍚庣珛搴撲笟鍔″簱瀛樻暟杩樻槸灏忎簬绔嬪簱鏈�灏忓簱瀛樻暟锛屾坊鍔犳彁绀轰俊鎭�
+                //娣诲姞鎶ヨ淇℃伅
+                if (materielInfo.Business_qty < materielInfo.MinQty)
+                {
+                    _messageInfoService.AddMessageInfo(MessageGroupByEnum.InventoryLowAlarm, $"鐗╂枡鍚嶇О:{materielInfo.MaterielName}", $"銆愮墿鏂欑紪鐮亄materielInfo.MaterielCode}宸茬敓鎴愯皟鎷ㄥ嚭鍏ュ簱鍗曪紝璇疯繘琛屽嚭鍏ュ簱娴佺▼銆傚ぇ浠跺簱搴撳瓨杩囦綆锛佽鍙婃椂琛ュ厖搴撳瓨锛併��");
+                }
+                else
+                {
+                    _messageInfoService.AddMessageInfo(MessageGroupByEnum.InventoryLowAlarm, $"鐗╂枡鍚嶇О:{materielInfo.MaterielName}", $"銆愮墿鏂欑紪鐮亄materielInfo.MaterielCode}宸茬敓鎴愯皟鎷ㄥ嚭鍏ュ簱鍗曪紝璇疯繘琛屽嚭鍏ュ簱娴佺▼銆�");
+                }
+                #endregion
+                #region 娣诲姞璋冩嫧鍑哄簱鍗�
+                //dt_InventoryInfos = dt_InventoryInfos.Where(X => X.StockStatus == StockStatusEmun.鍑哄簱閿佸畾.ObjToInt()).ToList();
+                //foreach (var item in dt_InventoryInfos.GroupBy(x => x.BatchNo)) //杩欓噷鎸夋壒娆″垎缁勪簡
+                //{
+                //    Dt_DeliveryOrderDetail deliveryOrderDetail = new Dt_DeliveryOrderDetail()
+                //    {
+                //        Batch_num = item.Key,
+                //        Order_Outqty = 0,
+                //        Order_qty = item.Select(x => x.OutboundQuantity).Sum(),
+                //        CreateDate = DateTime.Now,
+                //        Creater = App.User.UserName ?? "System",
+                //        Goods_no = item.First().MaterielCode,
+                //        OotDetailStatus = "鏂板缓",
+                //        Status = 2,
+                //        Reservoirarea = item.First().WarehouseCode
+                //    };
+                //    deliveryOrder.Warehouse_no = item.First().WarehouseCode;
+                //    deliveryOrder.Details.Add(deliveryOrderDetail);
+                //}
+                #endregion
+
+                #region 娣诲姞璋冩嫧鍑哄簱浠诲姟
+                //foreach (var item in dt_InventoryInfos)
+                //{
+                //    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 = item.OutboundQuantity,
+                //        SupplyQuantity = 0,
+                //        Remark = "璋冩嫧鍑哄簱"
+                //    };
+                //    supplyTasks.Add(supplyTask);
+                //}
                 #endregion
 
                 #region 娣诲姞璋冩嫧鍏ュ簱鍗�
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 317cbac..c9b708b 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"
@@ -101,10 +101,10 @@
       //(3)this.editFormFields.瀛楁='xxx';
       //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
       //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
-      this.editFormFields.stockQuantity = 1;
+      // this.editFormFields.availableQuantity = 1;
       this.editFormOptions.forEach((editForm) => {
         editForm.forEach((x) => {
-          if (x.field == "stockQuantity") {
+          if (x.field == "availableQuantity") {
             
           } else {
             x.readonly = true
diff --git "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WMS/src/views/stock/Dt_Inventory_Batch.vue" "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WMS/src/views/stock/Dt_Inventory_Batch.vue"
index ed656f8..3671b21 100644
--- "a/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WMS/src/views/stock/Dt_Inventory_Batch.vue"
+++ "b/\346\226\260\345\273\272\346\226\207\344\273\266\345\244\271/WMS/src/views/stock/Dt_Inventory_Batch.vue"
@@ -69,7 +69,7 @@
         {
           title: "璋冩嫧鏁伴噺",
           required: true,
-          field: "stockQuantity",
+          field: "availableQuantity",
           type: "number",
         },
       ],

--
Gitblit v1.9.3