From c7f255af77f13a52e6f01c8ec81482dc9ae07f68 Mon Sep 17 00:00:00 2001
From: yanjinhui <3306209981@qq.com>
Date: 星期五, 24 十月 2025 22:06:00 +0800
Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/ZhiHuiQiCe/FangCangZhiNeng

---
 新建文件夹/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/DeliveryOrderServices.cs |  568 +++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 373 insertions(+), 195 deletions(-)

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 47dcbca..9f4cf27 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"
@@ -13,6 +13,7 @@
 using WIDESEA_Common;
 using WIDESEA_Common.LocationEnum;
 using WIDESEA_Common.OrderEnum;
+using WIDESEA_Common.StockEnum;
 using WIDESEA_Common.TaskEnum;
 using WIDESEA_Common.WareHouseEnum;
 using WIDESEA_Core;
@@ -33,7 +34,7 @@
 {
     public partial class DeliveryOrderServices : ServiceBase<Dt_DeliveryOrder, IRepository<Dt_DeliveryOrder>>, IDeliveryOrderServices
     {
-        static string SearchDate = "";
+        
         private readonly IBasicService _basicService;
         private readonly IUnitOfWorkManage _unitOfWorkManage;
         private readonly IInventory_BatchServices _inventory_BatchServices;
@@ -41,8 +42,9 @@
         private readonly IDeliveryOrderDetailServices _deliveryOrderDetailServices;
         private readonly ISupplyTaskService _supplyTaskService;
         private readonly ICabinOrderServices _cabinOrderServices;
+        private readonly ITacticsService _tacticsService;
         public IRepository<Dt_DeliveryOrder> Repository => BaseDal;
-        public DeliveryOrderServices(IRepository<Dt_DeliveryOrder> BaseDal, IBasicService basicService, IUnitOfWorkManage unitOfWorkManage, IInventory_BatchServices inventory_BatchServices, IInventoryInfoService inventoryInfoService, IDeliveryOrderDetailServices deliveryOrderDetailServices, ISupplyTaskService supplyTaskService, ICabinOrderServices cabinOrderServices) : base(BaseDal)
+        public DeliveryOrderServices(IRepository<Dt_DeliveryOrder> BaseDal, IBasicService basicService, IUnitOfWorkManage unitOfWorkManage, IInventory_BatchServices inventory_BatchServices, IInventoryInfoService inventoryInfoService, IDeliveryOrderDetailServices deliveryOrderDetailServices, ISupplyTaskService supplyTaskService, ICabinOrderServices cabinOrderServices, ITacticsService tacticsService) : base(BaseDal)
         {
             _basicService = basicService;
             _unitOfWorkManage = unitOfWorkManage;
@@ -51,7 +53,11 @@
             _inventory_BatchServices = inventory_BatchServices;
             _inventoryInfoService = inventoryInfoService;
             _cabinOrderServices = cabinOrderServices;
+            _tacticsService = tacticsService;
         }
+
+
+        static string SearchDate = "2025-09-10 00:00:00";
         public WebResponseContent GetUpstreamOutOrder()
         {
             var responseContent = new WebResponseContent();
@@ -114,203 +120,52 @@
                         {
                             // 鍒涘缓鍑哄簱閫�璐у崟 - 杩欓噷闇�瑕佹牴鎹笟鍔¢�昏緫瀹炵幇
                             // 鏆傛椂璺宠繃鎴栧疄鐜伴��璐ч�昏緫
-                            continue;
+                            //continue;
+                            #region 杞崲鎴愬叆搴撳崟
+                            UpstreamOrderInfo order = new UpstreamOrderInfo()
+                            {
+                                order_no = outorder.order_no,
+                                order_type = outorder.order_type,
+                                warehouse_no = outorder.warehouse_no,
+                                details = new List<UpstreamOrderDetail>()
+                            };
+                            foreach (var item in outorder.details)
+                            {
+                                UpstreamOrderDetail detail = new UpstreamOrderDetail()
+                                {
+                                    batch_num = item.batch_num,
+                                    goods_no = item.goods_no,
+                                    order_qty = item.order_qty,
+                                    exp_date = item.exp_date,
+                                };
+                                order.details.Add(detail);
+                            }
+                            responseContent = _cabinOrderServices.CreateInboundOrder(order);
+                            List<Dt_CabinOrder>? dt_CabinOrders = responseContent.Data as List<Dt_CabinOrder>;
+                            if (dt_CabinOrders != null && dt_CabinOrders.Count > 0)
+                                BaseDal.Db.InsertNav(dt_CabinOrders).Include(x => x.Details).ExecuteCommand();
+                            #endregion
                         }
                         else if (outorder.order_type == "1") // 姝e父鍑哄簱鍗�
                         {
                             CreateOutboundOrder(outorder);//鍒涘缓鍑哄簱鍗曘�佸鐞嗗簱瀛樸�佹坊鍔犲嚭搴撲换鍔�
-                            // 鎺掗櫎鐗规畩鑽搧,鐗规畩鑽搧鐩存帴鎻掑叆
-                            if (outorder.warehouse_no != "001" && (outorder.warehouse_no == "010" || outorder.warehouse_no == "003" || outorder.warehouse_no == "017"))
-                            {
-                                var entityOrder = new Dt_DeliveryOrder
-                                {
-                                    Out_no = outorder.order_no,
-                                    Out_type = outorder.order_type,
-                                    Client_no = outorder.client_no,
-                                    Client_name = outorder.client_name,
-                                    Account_time = outorder.account_time,
-                                    Warehouse_no = outorder.warehouse_no,
-                                    OutStatus = "鏂板缓",
-                                    Details = outorder.details.Select(d => new Dt_DeliveryOrderDetail
-                                    {
-                                        Goods_no = d.goods_no,
-                                        Order_qty = Math.Abs(d.order_qty), // 鍑哄簱鏁伴噺杞负姝f暟
-                                        Batch_num = d.batch_num,
-                                        Exp_date = d.exp_date,
-                                        OotDetailStatus = "鏂板缓",
-                                        Status = 2, // pad骞冲簱锛屾棤闇�鍚屾
-                                    }).ToList()
-                                };
-                                _DeliveryOrders.Add(entityOrder);
-                            }
-                            else  // 甯歌鑽搧001鎴跨粰绔嬪簱,瑕佹槸鏈夋暣绠卞氨缁欏钩搴�
-                            {
-                                var entityOrder = new Dt_DeliveryOrder
-                                {
-                                    Out_no = outorder.order_no,
-                                    Out_type = outorder.order_type,
-                                    Client_no = outorder.client_no,
-                                    Client_name = outorder.client_name,
-                                    Account_time = outorder.account_time,
-                                    Warehouse_no = outorder.warehouse_no,
-                                    OutStatus = "鏂板缓",
-                                    Details = new List<Dt_DeliveryOrderDetail>()
-                                };
-
-                                // 閬嶅巻鍑哄簱鏄庣粏
-                                foreach (var item in outorder.details)
-                                {
-                                    // 灏嗕笂娓稿嚭搴撴暟閲忚浆涓烘鏁�
-                                    decimal orderQty = Math.Abs((decimal)item.order_qty);
-
-                                    #region 鏍规嵁鐗╂枡缂栫爜鏌ヨ鐗╂枡淇℃伅
-                                    var medication = BaseDal.Db.Queryable<Dt_MaterielInfo>()
-                                        .Where(m => m.MaterielCode == item.goods_no)
-                                        .First();
-
-                                    // 濡傛灉鐗╂枡淇℃伅涓嶅瓨鍦紝璺宠繃鏁翠釜鍑哄簱鍗�
-                                    if (medication == null)
-                                    {
-                                        skipOrder = true;
-                                        Console.WriteLine($"璺冲嚭澶勫簱鍗� {outorder.order_no}锛屽師鍥狅細鏈壘鍒板晢鍝� [{item.goods_no}] 鐨勭墿鏂欎俊鎭��");
-                                        break;
-                                    }
-
-                                    // 鑻ョ墿鏂欎笉瀛樺湪鎴� MaterielSourceType 涓虹┖锛屽垯璺宠繃鏁翠釜鍑哄簱鍗�
-                                    if (medication == null || !Enum.IsDefined(typeof(MaterielSourceTypeEnum), medication.MaterielSourceType))
-                                    {
-                                        skipOrder = true;
-                                        break;
-                                    }
-                                    #endregion
-
-                                    /// 鏍规嵁鐗╂枡淇℃伅澶у皬浠跺睘鎬у尯鍒嗘槸鍚︿粠绔嬪簱鍑哄簱 // 澶т欢浠庡钩搴撳嚭搴�
-                                    if (medication.MaterielSourceType == MaterielSourceTypeEnum.PurchasePart) // 濡傛灉鐗╂枡鏄ぇ浠�
-                                    {
-                                        var orderDetail = new Dt_DeliveryOrderDetail()
-                                        {
-                                            Reservoirarea = outorder.warehouse_no,
-                                            Goods_no = item.goods_no,
-                                            Order_qty = orderQty,
-                                            Batch_num = item.batch_num,
-                                            Exp_date = item.exp_date,
-                                            OotDetailStatus = "鏂板缓",
-                                            Status = 2 // 骞冲簱锛屾棤闇�鍚屾
-                                        };
-                                        entityOrder.Details.Add(orderDetail);
-                                    }
-                                    else
-                                    {
-                                        Dt_DeliveryOrderDetail orderDetail = null;
-
-                                        // 璁$畻鏁寸鍜屾暎浠舵暟閲�
-                                        var ys = orderQty % medication.BoxQty; // 涓嶈兘鏁撮櫎绠辫鐨勬暎浠舵暟 
-                                        var xs = (int)(orderQty / medication.BoxQty); // 鏁寸鏁伴噺锛堜繚鐣欐暣鏁帮級
-
-                                        #region 浠庣珛搴撳嚭搴撴暎浠�
-
-                                        #region 鍒ゆ柇鏄惁鏈夋暎浠�
-                                        if (ys > 0 && medication.Business_qty >= ys)
-                                        {
-                                            orderDetail = new Dt_DeliveryOrderDetail()
-                                            {
-                                                Reservoirarea = outorder.warehouse_no,
-                                                Goods_no = item.goods_no,
-                                                Order_qty = ys,
-                                                Batch_num = item.batch_num,
-                                                Exp_date = item.exp_date,
-                                                OotDetailStatus = "鏂板缓",
-                                                Status = 0 // 绔嬪簱锛岄渶瑕佸悓姝ョ粰WCS
-                                            };
-                                            medication.Business_qty -= ys;
-                                        }
-                                        #endregion
-
-                                        #region 鍒ゆ柇绔嬪簱搴撳瓨鏄惁瓒冲鍑烘暣绠�
-                                        while (medication.Business_qty >= medication.BoxQty && xs > 0)
-                                        {
-                                            xs--;
-                                            if (orderDetail == null)
-                                            {
-                                                orderDetail = new Dt_DeliveryOrderDetail()
-                                                {
-                                                    Reservoirarea = outorder.warehouse_no,
-                                                    Goods_no = item.goods_no,
-                                                    Order_qty = medication.BoxQty,
-                                                    Batch_num = item.batch_num,
-                                                    Exp_date = item.exp_date,
-                                                    OotDetailStatus = "鏂板缓",
-                                                    Status = 0 // 绔嬪簱
-                                                };
-                                                medication.Business_qty -= medication.BoxQty;
-                                            }
-                                            else
-                                            {
-                                                orderDetail.Order_qty += medication.BoxQty;
-                                                medication.Business_qty -= medication.BoxQty;
-                                            }
-                                        }
-
-                                        if (orderDetail != null)
-                                            entityOrder.Details.Add(orderDetail);
-                                        #endregion
-
-                                        #endregion
-
-                                        #region 鍓╀綑鏁翠欢浠庡钩搴撳嚭搴�
-                                        if (xs > 0)
-                                        {
-                                            orderDetail = new Dt_DeliveryOrderDetail()
-                                            {
-                                                Reservoirarea = outorder.warehouse_no,
-                                                Goods_no = item.goods_no,
-                                                Order_qty = medication.BoxQty * xs,
-                                                Batch_num = item.batch_num,
-                                                Exp_date = item.exp_date,
-                                                OotDetailStatus = "鏂板缓",
-                                                Status = 2 // 骞冲簱
-                                            };
-                                            entityOrder.Details.Add(orderDetail);
-                                        }
-                                        #endregion
-                                    }
-
-                                    // 鏇存柊鐗╂枡淇℃伅
-                                    _basicService.MaterielInfoService.Repository.UpdateData(medication);
-
-                                }
-
-                                // 濡傛灉璺宠繃璇ュ崟锛屽垯鐩存帴continue锛屼笉淇濆瓨
-                                if (skipOrder)
-                                {
-                                    Console.WriteLine($"璺冲嚭澶勫簱鍗� {outorder.order_no}锛屽洜涓哄瓨鍦ㄦ湭瀹氫箟鐗╂枡灞炴�х殑鍟嗗搧銆�");
-                                    continue;
-                                }
-
-                                // 纭繚鍑哄簱鍗曟湁鏄庣粏鎵嶆坊鍔�
-                                if (entityOrder.Details.Any())
-                                {
-                                    _DeliveryOrders.Add(entityOrder);
-                                    orderNos.Add(outorder.order_no);
-                                }
-                            }
                         }
                     }
 
                     // 鎵归噺鎻掑叆鍑哄簱鍗曞拰鏄庣粏
-                    if (_DeliveryOrders.Any())
-                    {
-                        BaseDal.Db.InsertNav(_DeliveryOrders).Include(x => x.Details).ExecuteCommand();
-                    }
+                    //if (_DeliveryOrders.Any())
+                    //{
+                    //    BaseDal.Db.InsertNav(_DeliveryOrders).Include(x => x.Details).ExecuteCommand();
+                    //}
                     //涓嬪彂鍑哄簱鍗曚换鍔$粰wcs
 
 
                     Db.Ado.CommitTran();
-                    var tex = CreateSupplyTask(order_no);
-                    if (!tex)
-                    {
-                        return responseContent.Error("鍒涘缓渚涘簲浠诲姟澶辫触");
-                    }
+                    //var tex = CreateSupplyTask(order_no);
+                    //if (!tex)
+                    //{
+                    //    return responseContent.Error("鍒涘缓渚涘簲浠诲姟澶辫触");
+                    //}
                     return responseContent.OK($"鍚屾鍑哄簱鍗曟垚鍔燂紝鍏眥_DeliveryOrders.Count}鏉�");
                 }
                 catch (Exception ex)
@@ -336,6 +191,7 @@
             WebResponseContent webResponseContent = new WebResponseContent();
             try
             {
+                Dt_Tactics tactics = _tacticsService.Repository.QueryFirst(x => x.TacticeName == "鍑哄簱绛栫暐");
                 if (outorder.warehouse_no == WarehouseEnum.楹荤簿搴�.ObjToInt().ToString("000") || outorder.warehouse_no == WarehouseEnum.鍐峰喕搴�.ObjToInt().ToString("000"))
                 {
                     #region 娣诲姞鍑哄簱鍗�
@@ -350,6 +206,7 @@
                         OutStatus = "鏂板缓",
                         Details = outorder.details.Select(d => new Dt_DeliveryOrderDetail
                         {
+                            Reservoirarea = outorder.warehouse_no,
                             Goods_no = d.goods_no,
                             Order_qty = Math.Abs(d.order_qty), // 鍑哄簱鏁伴噺杞负姝f暟
                             Batch_num = d.batch_num,
@@ -360,18 +217,334 @@
                     };
                     BaseDal.Db.InsertNav(entityOrder).Include(x => x.Details).ExecuteCommand();
                     #endregion
-
-                    #region 澶勭悊搴撳瓨
-
-                    #endregion
-
-                    #region 娣诲姞鍑哄簱浠诲姟
-
+                    #region 澶勭悊搴撳瓨銆佸簱瀛樻壒娆°�佹坊鍔犲嚭搴撲换鍔�
+                    foreach (var item in entityOrder.Details)
+                    {
+                        Dt_Inventory_Batch inventory_Batch = _inventory_BatchServices.Repository.QueryFirst(x => x.MaterielCode == item.Goods_no && x.BatchNo == item.Batch_num);
+                        if (inventory_Batch == null) throw new Exception($"鏈壘鍒板嚭搴撳崟鍙枫�恵entityOrder.Out_no}銆戜腑鐗╂枡缂栧彿銆恵item.Goods_no}銆戠墿鏂欐壒娆°�恵item.Batch_num}銆戠殑搴撳瓨鎵规淇℃伅");
+                        if (inventory_Batch.AvailableQuantity < item.Order_qty) throw new Exception($"鍑哄簱鍗曞彿銆恵entityOrder.Out_no}銆戜腑鐗╂枡缂栧彿銆恵item.Goods_no}銆戠墿鏂欐壒娆°�恵item.Batch_num}銆戠殑搴撳瓨鎵规淇℃伅鍙敤鏁伴噺涓嶈冻");
+                        inventory_Batch.AvailableQuantity -= item.Order_qty;
+                        inventory_Batch.OutboundQuantity += item.Order_qty;
+                        List<Dt_InventoryInfo> dt_InventoryInfos = _inventoryInfoService.Repository.QueryData(x => x.MaterielCode == item.Goods_no && x.BatchNo == item.Batch_num && x.StockStatus == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt() && x.StockQuantity > x.OutboundQuantity && x.WarehouseCode == item.Reservoirarea);
+                        #region 鎸夊嚭搴撶瓥鐣ユ煡鎵惧簱瀛�
+                        if (tactics.SelectTactice == TacticsEnum.ComeOutonFirstTime.ObjToInt())
+                            dt_InventoryInfos = dt_InventoryInfos.OrderBy(x => x.ValidityPeriod).ToList();
+                        else
+                            dt_InventoryInfos = dt_InventoryInfos.OrderBy(x => x.InDate).ToList();
+                        #endregion
+                        var Order_qty = item.Order_qty;//鍑哄簱鍗曟暟閲�
+                        foreach (var InventoryInfo in dt_InventoryInfos)
+                        {
+                            if (Order_qty <= 0) break;
+                            if (InventoryInfo.AvailableQuantity < Order_qty)
+                            {
+                                InventoryInfo.AvailableQuantity = 0;
+                                Order_qty -= InventoryInfo.AvailableQuantity;
+                                InventoryInfo.OutboundQuantity += InventoryInfo.AvailableQuantity;
+                                InventoryInfo.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
+                            }
+                            else
+                            {
+                                InventoryInfo.AvailableQuantity -= Order_qty;
+                                Order_qty = 0;
+                                InventoryInfo.OutboundQuantity += Order_qty;
+                                InventoryInfo.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
+                            }
+                        }
+                        dt_InventoryInfos = dt_InventoryInfos.Where(X => X.StockStatus == StockStatusEmun.鍑哄簱閿佸畾.ObjToInt()).ToList();
+                        List<Dt_SupplyTask> supplyTasks = new List<Dt_SupplyTask>();
+                        foreach (var inventoryInfo in dt_InventoryInfos)
+                        {
+                            Dt_SupplyTask supplyTask = new Dt_SupplyTask()
+                            {
+                                WarehouseCode = inventoryInfo.WarehouseCode,
+                                BatchNo = inventoryInfo.BatchNo,
+                                MaterielName = inventoryInfo.MaterielName,
+                                MaterielCode = inventoryInfo.MaterielCode,
+                                MaterielSpec = inventoryInfo.MaterielSpec,
+                                TaskStatus = SupplyStatusEnum.NewOut.ObjToInt(),
+                                TaskType = TaskTypeEnum.OutPick.ObjToInt(),
+                                CreateDate = DateTime.Now,
+                                Creater = App.User.UserName ?? "System",
+                                LocationCode = inventoryInfo.LocationCode,
+                                OrderNo = entityOrder.Out_no,
+                                StockQuantity = inventoryInfo.OutboundQuantity,
+                                SupplyQuantity = 0,
+                                Remark = "鍑哄簱"
+                            };
+                            supplyTasks.Add(supplyTask);
+                        }
+                        _inventory_BatchServices.Repository.UpdateData(inventory_Batch);
+                        _inventoryInfoService.Repository.UpdateData(dt_InventoryInfos);
+                        _supplyTaskService.AddData(supplyTasks);
+                    }
                     #endregion
                 }
                 else
                 {
+                    #region 鍒涘缓澶т欢搴撱�佺珛搴撳嚭搴撳ご琛�
+                    var entityOrder = new Dt_DeliveryOrder
+                    {
+                        Out_no = outorder.order_no,
+                        Out_type = outorder.order_type,
+                        OutStatus = "鏂板缓",
+                        Client_name = outorder.client_name,
+                        Account_time = outorder.account_time,
+                        Client_no = outorder.client_no,
+                        Warehouse_no = WarehouseEnum.澶т欢搴�.ObjToInt().ToString("000"),
+                        Details = new List<Dt_DeliveryOrderDetail>()
+                    };
+                    var entityOrderLK = new Dt_DeliveryOrder
+                    {
+                        Out_no = outorder.order_no,
+                        Out_type = outorder.order_type,
+                        OutStatus = "鏂板缓",
+                        Client_name = outorder.client_name,
+                        Account_time = outorder.account_time,
+                        Client_no = outorder.client_no,
+                        Warehouse_no = WarehouseEnum.绔嬪簱.ObjToInt().ToString("000"),
+                        Details = new List<Dt_DeliveryOrderDetail>()
+                    };
+                    #endregion
+                    #region 鏌ユ壘搴撳瓨
+                    foreach (var detail in outorder.details)
+                    {
+                        #region 鏌ヨ搴撳瓨鎵规鍜屽簱瀛�
+                        Dt_Inventory_Batch inventory_Batch = _inventory_BatchServices.Repository.QueryFirst(x => x.MaterielCode == detail.goods_no && x.BatchNo == detail.batch_num);
+                        if (inventory_Batch == null) throw new Exception($"鏈壘鍒板嚭搴撳崟鍙枫�恵outorder.order_no}銆戜腑鐗╂枡缂栧彿銆恵detail.goods_no}銆戠墿鏂欐壒娆°�恵detail.batch_num}銆戠殑搴撳瓨鎵规淇℃伅");
+                        if (inventory_Batch.AvailableQuantity < detail.order_qty) throw new Exception($"鍑哄簱鍗曞彿銆恵outorder.order_no}銆戜腑鐗╂枡缂栧彿銆恵detail.goods_no}銆戠墿鏂欐壒娆°�恵detail.batch_num}銆戠殑搴撳瓨鎵规淇℃伅鍙敤鏁伴噺涓嶈冻");
+                        inventory_Batch.AvailableQuantity -= detail.order_qty;
+                        inventory_Batch.OutboundQuantity += detail.order_qty;
+                        List<Dt_InventoryInfo> dt_InventoryInfos = _inventoryInfoService.Repository.QueryData(x => x.MaterielCode == inventory_Batch.MaterielCode && x.BatchNo == inventory_Batch.BatchNo && x.StockStatus == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt() && x.StockQuantity > x.OutboundQuantity && (x.WarehouseCode == WarehouseEnum.澶т欢搴�.ObjToInt().ToString("000") || x.WarehouseCode == WarehouseEnum.绔嬪簱.ObjToInt().ToString("000")));
+                        #endregion
+                        #region 鎸夊嚭搴撶瓥鐣ユ煡鎵惧簱瀛�
+                        if (tactics.SelectTactice == TacticsEnum.ComeOutonFirstTime.ObjToInt())
+                            dt_InventoryInfos = dt_InventoryInfos.OrderBy(x => x.ValidityPeriod).ToList();
+                        else
+                            dt_InventoryInfos = dt_InventoryInfos.OrderBy(x => x.InDate).ToList();
+                        #endregion
+                        var Order_qty = Math.Abs(detail.order_qty);//鍑哄簱鍗曟暟閲�
+                        #region 鏍规嵁鐗╂枡缂栫爜鏌ヨ鐗╂枡淇℃伅
+                        Dt_MaterielInfo materielInfo = _basicService.MaterielInfoService.Repository.QueryFirst(x => x.MaterielCode == detail.goods_no);
+                        if (materielInfo == null) throw new Exception($"鏈壘鍒拌嵂鍝佺紪鐮併�恵detail.goods_no}銆戠殑淇℃伅");
+                        if (!Enum.IsDefined(typeof(MaterielSourceTypeEnum), materielInfo.MaterielSourceType))
+                            throw new Exception($"璇疯缃嵂鍝佺紪鍙枫�恵detail.goods_no}銆戠殑灞炴�у垎绫�");
+                        if (materielInfo.BoxQty < 1) throw new Exception($"璇疯缃嵂鍝佺紪鍙枫�恵detail.goods_no}銆戠殑绠辫鏁伴噺");
+                        #endregion
+                        #region 澶т欢
+                        if (materielInfo.MaterielSourceType == MaterielSourceTypeEnum.PurchasePart)//濡傛灉鐗╂枡鏄ぇ浠�
+                        {
+                            #region 娣诲姞鍑哄簱璇︽儏
+                            Dt_DeliveryOrderDetail orderDetail = new Dt_DeliveryOrderDetail()
+                            {
+                                Reservoirarea = entityOrder.Warehouse_no,
+                                Goods_no = detail.goods_no,
+                                Order_qty = detail.order_qty,
+                                Batch_num = detail.batch_num,
+                                Exp_date = detail.exp_date,
+                                OotDetailStatus = "鏂板缓",
+                                Order_Outqty = 0,
+                                Status = 2
+                            };
+                            entityOrder.Details.Add(orderDetail);
+                            #endregion
 
+                            #region 璁$畻搴撳瓨
+                            foreach (var InventoryInfo in dt_InventoryInfos)
+                            {
+                                if (Order_qty <= 0) break;
+                                if (InventoryInfo.AvailableQuantity < Order_qty)
+                                {
+                                    InventoryInfo.AvailableQuantity = 0;
+                                    Order_qty -= InventoryInfo.AvailableQuantity;
+                                    InventoryInfo.OutboundQuantity += InventoryInfo.AvailableQuantity;
+                                    InventoryInfo.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
+                                }
+                                else
+                                {
+                                    InventoryInfo.AvailableQuantity -= Order_qty;
+                                    Order_qty = 0;
+                                    InventoryInfo.OutboundQuantity += Order_qty;
+                                    InventoryInfo.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
+                                }
+                            }
+                            #endregion
+
+                            #region 鐢熸垚鍑哄簱浠诲姟
+                            dt_InventoryInfos = dt_InventoryInfos.Where(X => X.StockStatus == StockStatusEmun.鍑哄簱閿佸畾.ObjToInt()).ToList();
+                            List<Dt_SupplyTask> supplyTasks = new List<Dt_SupplyTask>();
+                            foreach (var inventoryInfo in dt_InventoryInfos)
+                            {
+                                Dt_SupplyTask supplyTask = new Dt_SupplyTask()
+                                {
+                                    WarehouseCode = inventoryInfo.WarehouseCode,
+                                    BatchNo = inventoryInfo.BatchNo,
+                                    MaterielName = inventoryInfo.MaterielName,
+                                    MaterielCode = inventoryInfo.MaterielCode,
+                                    MaterielSpec = inventoryInfo.MaterielSpec,
+                                    TaskStatus = SupplyStatusEnum.NewOut.ObjToInt(),
+                                    TaskType = TaskTypeEnum.OutPick.ObjToInt(),
+                                    CreateDate = DateTime.Now,
+                                    Creater = App.User.UserName ?? "System",
+                                    LocationCode = inventoryInfo.LocationCode,
+                                    OrderNo = entityOrder.Out_no,
+                                    StockQuantity = inventoryInfo.OutboundQuantity,
+                                    SupplyQuantity = 0,
+                                    Remark = "鍑哄簱"
+                                };
+                                supplyTasks.Add(supplyTask);
+                            }
+                            #endregion
+                            _inventory_BatchServices.Repository.UpdateData(inventory_Batch);
+                            _inventoryInfoService.Repository.UpdateData(dt_InventoryInfos);
+                            _supplyTaskService.AddData(supplyTasks);
+                        }
+                        #endregion
+                        else
+                        {
+                            Dt_DeliveryOrderDetail orderDetail = null;
+                            Dt_DeliveryOrderDetail orderDetailLK = null;
+                            var ys = Order_qty % materielInfo.BoxQty; //涓嶈兘鏁撮櫎绠辫鐨勬暎浠舵暟 
+                            var xs = (int)(Order_qty / materielInfo.BoxQty);//淇濈暀鏁存暟
+                            #region 鏁d欢浼樺厛鍒嗛厤绔嬪簱
+                            if (ys > 0)
+                            {
+                                orderDetailLK = new Dt_DeliveryOrderDetail()
+                                {
+                                    Reservoirarea = entityOrderLK.Warehouse_no,
+                                    Goods_no = detail.goods_no,
+                                    Order_qty = ys,
+                                    Batch_num = detail.batch_num,
+                                    Exp_date = detail.exp_date,
+                                    OotDetailStatus = "鏂板缓",
+                                    Order_Outqty = 0,
+                                    Status = 0
+                                };
+                            }
+                            #endregion
+
+                            #region 鏁翠欢浼樺厛鍒嗛厤澶т欢搴�
+                            foreach (var item in dt_InventoryInfos.Where(x => x.WarehouseCode == WarehouseEnum.澶т欢搴�.ObjToInt().ToString("000")))
+                            {
+                                if (xs <= 0) break;
+                                item.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
+                                while (item.AvailableQuantity > 0 && xs > 0)
+                                {
+                                    xs--;
+                                    if (orderDetail == null)
+                                    {
+                                        orderDetail = new Dt_DeliveryOrderDetail()
+                                        {
+                                            Reservoirarea = entityOrder.Warehouse_no,
+                                            Goods_no = detail.goods_no,
+                                            Order_qty = materielInfo.BoxQty,
+                                            Batch_num = detail.batch_num,
+                                            Exp_date = detail.exp_date,
+                                            OotDetailStatus = "鏂板缓",
+                                            Order_Outqty = 0,
+                                            Status = 0
+                                        };
+                                        item.AvailableQuantity -= materielInfo.BoxQty;
+                                        item.OutboundQuantity += materielInfo.BoxQty;
+                                    }
+                                    else
+                                    {
+                                        orderDetail.Order_qty += materielInfo.BoxQty;
+                                        item.AvailableQuantity -= materielInfo.BoxQty;
+                                        item.OutboundQuantity += materielInfo.BoxQty;
+                                    }
+                                }
+                            }
+                            #endregion
+
+                            #region 鍒嗛厤瀹屽ぇ浠跺簱濡傛灉杩樻湁绠辨暟锛屽啀閫夋嫨鍒嗛厤绔嬪簱
+                            if (orderDetailLK == null)
+                            {
+                                orderDetailLK = new Dt_DeliveryOrderDetail()
+                                {
+                                    Reservoirarea = entityOrderLK.Warehouse_no,
+                                    Goods_no = detail.goods_no,
+                                    Order_qty = xs * materielInfo.BoxQty,
+                                    Batch_num = detail.batch_num,
+                                    Exp_date = detail.exp_date,
+                                    OotDetailStatus = "鏂板缓",
+                                    Order_Outqty = 0,
+                                    Status = 0
+                                };
+                            }
+                            else
+                            {
+                                orderDetailLK.Order_qty += xs * materielInfo.BoxQty;
+                            }
+                            #endregion
+                            List<Dt_SupplyTask> supplyTasks = new List<Dt_SupplyTask>();
+                            if (orderDetailLK != null)
+                            {
+                                #region 娣诲姞鍑哄簱浠诲姟銆佷慨鏀瑰簱瀛樹俊鎭�
+                                Dt_InventoryInfo inventoryInfo = dt_InventoryInfos.Where(x => x.WarehouseCode == WarehouseEnum.绔嬪簱.ObjToInt().ToString("000")).First();
+                                inventoryInfo.AvailableQuantity -= orderDetailLK.Order_qty;
+                                inventoryInfo.OutboundQuantity += orderDetailLK.Order_qty;
+                                inventoryInfo.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
+                                _inventoryInfoService.Repository.UpdateData(inventoryInfo);
+                                Dt_SupplyTask supplyTask = new Dt_SupplyTask()
+                                {
+                                    WarehouseCode = inventoryInfo.WarehouseCode,
+                                    BatchNo = inventoryInfo.BatchNo,
+                                    MaterielName = inventoryInfo.MaterielName,
+                                    MaterielCode = inventoryInfo.MaterielCode,
+                                    MaterielSpec = inventoryInfo.MaterielSpec,
+                                    TaskStatus = SupplyStatusEnum.NewOut.ObjToInt(),
+                                    TaskType = TaskTypeEnum.OutPick.ObjToInt(),
+                                    CreateDate = DateTime.Now,
+                                    Creater = App.User.UserName ?? "System",
+                                    LocationCode = inventoryInfo.LocationCode,
+                                    OrderNo = entityOrder.Out_no,
+                                    StockQuantity = inventoryInfo.OutboundQuantity,
+                                    SupplyQuantity = 0,
+                                    Remark = "鍑哄簱"
+                                };
+                                supplyTasks.Add(supplyTask);
+                                #endregion
+                                entityOrderLK.Details.Add(orderDetailLK);
+                            }
+                            if (orderDetail != null)
+                            {
+                                #region 娣诲姞鍑哄簱浠诲姟銆佷慨鏀瑰簱瀛樹俊鎭�
+                                dt_InventoryInfos = dt_InventoryInfos.Where(X => X.StockStatus == StockStatusEmun.鍑哄簱閿佸畾.ObjToInt()).ToList();
+                                foreach (var inventoryInfo in dt_InventoryInfos)
+                                {
+                                    Dt_SupplyTask supplyTask = new Dt_SupplyTask()
+                                    {
+                                        WarehouseCode = inventoryInfo.WarehouseCode,
+                                        BatchNo = inventoryInfo.BatchNo,
+                                        MaterielName = inventoryInfo.MaterielName,
+                                        MaterielCode = inventoryInfo.MaterielCode,
+                                        MaterielSpec = inventoryInfo.MaterielSpec,
+                                        TaskStatus = SupplyStatusEnum.NewOut.ObjToInt(),
+                                        TaskType = TaskTypeEnum.OutPick.ObjToInt(),
+                                        CreateDate = DateTime.Now,
+                                        Creater = App.User.UserName ?? "System",
+                                        LocationCode = inventoryInfo.LocationCode,
+                                        OrderNo = entityOrder.Out_no,
+                                        StockQuantity = inventoryInfo.OutboundQuantity,
+                                        SupplyQuantity = 0,
+                                        Remark = "鍑哄簱"
+                                    };
+                                    supplyTasks.Add(supplyTask);
+                                }
+                                #endregion
+                                entityOrder.Details.Add(orderDetail);
+                            }
+                            _inventory_BatchServices.Repository.UpdateData(inventory_Batch);
+                            _inventoryInfoService.Repository.UpdateData(dt_InventoryInfos);
+                            _supplyTaskService.AddData(supplyTasks);
+                        }
+                    }
+                    if (entityOrder.Details.Count > 0)
+                        BaseDal.Db.InsertNav(entityOrder).Include(x => x.Details).ExecuteCommand();
+                    if (entityOrderLK.Details.Count > 0)
+                        BaseDal.Db.InsertNav(entityOrderLK).Include(x => x.Details).ExecuteCommand();
+                    #endregion
                 }
             }
             catch (Exception ex)
@@ -899,7 +1072,12 @@
                 }
                 #endregion
                 if (supplyTask.WarehouseCode == WarehouseEnum.绔嬪簱.ObjToInt().ToString("000"))
-                    CreateAllocatInOut(materielInfo);//鍒涘缓璋冩嫧浠诲姟
+                {
+                    materielInfo.Business_qty -= supplyTask.StockQuantity;
+                    _basicService.MaterielInfoService.Repository.UpdateData(materielInfo);
+                    if (materielInfo.Business_qty < materielInfo.MinQty)
+                        CreateAllocatInOut(materielInfo);//鍒涘缓璋冩嫧浠诲姟
+                }
                 _unitOfWorkManage.CommitTran();
                 #endregion
                 content.OK();

--
Gitblit v1.9.3