From 25cb7cd50d12f48e93d6cde47420ca3458e9c47a Mon Sep 17 00:00:00 2001
From: helongyang <647556386@qq.com>
Date: 星期四, 12 六月 2025 21:39:43 +0800
Subject: [PATCH] 1

---
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs | 1026 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 1,016 insertions(+), 10 deletions(-)

diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs"
index d0811af..c700679 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs"
@@ -1,21 +1,30 @@
 锘縰sing AutoMapper;
+using Castle.Core.Resource;
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
+using System.Threading;
 using System.Threading.Tasks;
 using WIDESEA_Common.OrderEnum;
+using WIDESEA_Common.StockEnum;
 using WIDESEA_Common.WareHouseEnum;
 using WIDESEA_Core;
 using WIDESEA_Core.BaseRepository;
 using WIDESEA_Core.BaseServices;
+using WIDESEA_Core.CodeConfigEnum;
+using WIDESEA_Core.Enums;
 using WIDESEA_Core.Helper;
 using WIDESEA_DTO.ERP;
+using WIDESEA_DTO.Outbound;
+using WIDESEA_External.ERPService;
+using WIDESEA_External.Model;
 using WIDESEA_IBasicRepository;
 using WIDESEA_IBasicService;
 using WIDESEA_IOutboundRepository;
 using WIDESEA_IOutboundService;
 using WIDESEA_IRecordService;
+using WIDESEA_IStockRepository;
 using WIDESEA_IStockService;
 using WIDESEA_Model.Models;
 
@@ -26,34 +35,42 @@
         private readonly IUnitOfWorkManage _unitOfWorkManage;
         private readonly IBasicRepository _basicRepository;
         private readonly IMapper _mapper;
+        private readonly IStockRepository _stockRepository;
+        private readonly IOutboundRepository _outboundRepository;
+        private readonly IOutboundOrderService _outboundOrderService;
+        private readonly IInvokeERPService _invokeERPService; 
 
         public IProOutOrderRepository Repository => BaseDal;
 
-        public ProOutOrderService(IProOutOrderRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IBasicRepository basicRepository, IMapper mapper) : base(BaseDal)
+        public ProOutOrderService(IProOutOrderRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IBasicRepository basicRepository, IMapper mapper, IStockRepository stockRepository, IOutboundRepository outboundRepository, IOutboundOrderService outboundOrderService,IInvokeERPService invokeERPService) : base(BaseDal)
         {
             _unitOfWorkManage = unitOfWorkManage;
             _basicRepository = basicRepository;
             _mapper = mapper;
+            _stockRepository = stockRepository;
+            _outboundRepository = outboundRepository;
+            _outboundOrderService = outboundOrderService;
+            _invokeERPService = invokeERPService;
         }
         /// <summary>
-        /// 鎺ユ敹ERP鎴愬搧鍑哄簱鍗�
+        /// 鎺ユ敹ERP鎴愬搧鍑哄簱鍗曚俊鎭�(璁㈠崟鍑哄簱/瀵勫敭鍑哄簱)
         /// </summary>
         /// <returns></returns>
-        public WebResponseContent ProductDeliveryOrder(ErpProOutOrderDTO outOrderDTO)
+        public async Task<WebResponseContent> ProductDeliveryOrder(ErpProOutOrderDTO outOrderDTO)
         {
             try
             {
                 return outOrderDTO.Way switch
                 {
-                    1 => AddDeliveryOrder(outOrderDTO),
-                    2 => UpdateDeliveryOrder(outOrderDTO),
-                    3 => DeleteDeliveryOrder(outOrderDTO),
-                    _ => WebResponseContent.Instance.Error($"鎿嶄綔绫诲瀷涓嶅瓨鍦�,Way:{outOrderDTO.Way}"),
+                    1 => await Task.FromResult(AddDeliveryOrder(outOrderDTO)),
+                    2 => await Task.FromResult(UpdateDeliveryOrder(outOrderDTO)),
+                    3 => await Task.FromResult(DeleteDeliveryOrder(outOrderDTO)),
+                    _ => await Task.FromResult(WebResponseContent.Instance.Error($"鎿嶄綔绫诲瀷涓嶅瓨鍦�,Way:{outOrderDTO.Way}")),
                 };
             }
             catch (Exception ex)
             {
-                return WebResponseContent.Instance.Error(ex.Message);
+                return await Task.FromResult(WebResponseContent.Instance.Error(ex.Message));
             }
         }
         /// <summary>
@@ -70,6 +87,7 @@
                     return content.Error($"鍑哄簱鍗曞彿{outOrderDTO.OrderNo}宸插瓨鍦�!");
                 }
                 Dt_Warehouse warehouse=null;
+                List<Dt_CustomerInfo> customerInfos = _basicRepository.CustomerInfoRepository.QueryData();
                 if (outOrderDTO.OType==1 && string.IsNullOrEmpty(outOrderDTO.WaType))
                 {
                     warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseCode==WarehouseEnum.HA71.ToString());
@@ -79,9 +97,41 @@
                     warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString());
                 }
                 List<Dt_ProOutOrderDetail> proOutOrderDetails = new List<Dt_ProOutOrderDetail>();
+                Dictionary<string,string> keyValuePairs =new Dictionary<string, string>();
                 foreach (var item in outOrderDTO.OrderDetails)
                 {
-                    proOutOrderDetails.Add(_mapper.Map<Dt_ProOutOrderDetail>(item));
+                    //鍒ゆ柇瀹㈡埛鏄惁瀛樺湪
+                    Dt_CustomerInfo? customerInfo = customerInfos.Where(x=>x.Code== item.Customer).FirstOrDefault();
+                    if (customerInfo==null) 
+                    {
+                        return content.Error($"瀹㈡埛{item.Customer}涓嶅瓨鍦�!");
+                    }
+                    Dt_ProOutOrderDetail proOutOrderDetail = _mapper.Map<Dt_ProOutOrderDetail>(item);
+                    if (!string.IsNullOrEmpty(item.SaleOrder))
+                    {
+                        if (keyValuePairs!=null && keyValuePairs.ContainsKey(item.SaleOrder))
+                        {
+                            proOutOrderDetail.EndCustomer = keyValuePairs[item.SaleOrder];
+                        }
+                        else
+                        {
+                            string request = _invokeERPService.InvokeProSaleCustomer(item.SaleOrder);
+                            ErpSaleCustomResponseContent responseContent=request.DeserializeObject<ErpSaleCustomResponseContent>();
+                            if (responseContent.Code!=200)
+                            {
+                                return content.Error($"璁㈠崟{item.SaleOrder}缁堢瀹㈡埛鑾峰彇澶辫触!");
+                            }
+                            //鍒ゆ柇缁堢瀹㈡埛鏄惁瀛樺湪
+                            Dt_CustomerInfo? customerInfoEnd = customerInfos.Where(x => x.Code == responseContent.Data[0].Endcustomer).FirstOrDefault();
+                            if (customerInfoEnd == null)
+                            {
+                                return content.Error($"缁堢瀹㈡埛{responseContent.Data[0].Endcustomer}涓嶅瓨鍦�!");
+                            }
+                            proOutOrderDetail.EndCustomer = responseContent.Data[0].Endcustomer;
+                            keyValuePairs.Add(item.SaleOrder, responseContent.Data[0].Endcustomer);
+                        }
+                    }
+                    proOutOrderDetails.Add(proOutOrderDetail);
                 }
                 Dt_ProOutOrder  proOutOrder= new Dt_ProOutOrder()
                 {
@@ -111,7 +161,7 @@
             WebResponseContent content = new WebResponseContent();
             try
             {
-
+                
             }
             catch (Exception ex)
             {
@@ -128,6 +178,317 @@
             WebResponseContent content = new WebResponseContent();
             try
             {
+                Dt_ProOutOrder proOutOrder = _outboundRepository.ProOutOrderRepository.Db.Queryable<Dt_ProOutOrder>().Where(x => x.ProOutOrderNo == outOrderDTO.OrderNo).Includes(x => x.Details).First();
+                if (proOutOrder==null)
+                {
+                    return content.Error($"鏈壘鍒板嚭搴撳崟{outOrderDTO.OrderNo}");
+                }
+                if (proOutOrder.ProOrderStatus==OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt() || proOutOrder.ProOrderStatus == OutOrderStatusEnum.鍑哄簱涓�.ObjToInt())
+                {
+                    return content.Error("鍑哄簱鍗曟墽琛屼腑");
+                }
+                _unitOfWorkManage.BeginTran();
+                _outboundRepository.ProOutOrderRepository.DeleteData(proOutOrder);
+                _outboundRepository.ProOutOrderDetailRepository.DeleteData(proOutOrder.Details);
+                _unitOfWorkManage.CommitTran();
+                content.OK("鎴愬姛");
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                content.Error(ex.Message);
+            }
+            return content;
+        }
+        /// <summary>
+        /// 閿�鍞寚娲�
+        /// </summary>
+        /// <returns></returns>
+        public async Task<WebResponseContent> ProductSpecifyVer(ErpProductSpecifyVerDTO erpProductSpecifyVerDTO)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseCode==erpProductSpecifyVerDTO.WaType);
+                if (warehouse == null)
+                    return await Task.FromResult(content.Error($"鏈壘鍒皗erpProductSpecifyVerDTO.WaType}浠撳簱淇℃伅"));
+                //鏌ヨ鍙寚娲惧簱瀛�
+                List<Dt_ProStockInfo> proStockInfos = Db.Queryable<Dt_ProStockInfo>().Where(x => x.ProStockAttribute == ProStockAttributeEnum.鎴愬搧.ObjToInt())
+                .Includes(x => x.proStockInfoDetails)
+                .Where(x => x.proStockInfoDetails
+                .Any(v =>
+                     v.SaleOrder == erpProductSpecifyVerDTO.OrderNo
+                    && v.ProductCode == erpProductSpecifyVerDTO.PCode
+                    && v.ProductVersion == erpProductSpecifyVerDTO.PVer
+                    && v.LotNumber == erpProductSpecifyVerDTO.PLot
+                    && v.DateCode == erpProductSpecifyVerDTO.DateCode
+                    && (v.SpecifyVer==null||v.SpecifyVer=="")
+                ))
+                .ToList();
+                List<Dt_ProStockInfoDetail> proStockInfoDetails = new List<Dt_ProStockInfoDetail>();
+                List<Dt_ProStockInfoDetail> specifyVerDetails = new List<Dt_ProStockInfoDetail>();
+                if (proStockInfos==null)
+                    return await Task.FromResult(content.Error("鍙寚娲惧簱瀛樹笉瀛樺湪"));
+                proStockInfos = proStockInfos.OrderBy(x => x.proStockInfoDetails.FirstOrDefault()?.DateCode).ThenBy(x => x.CreateDate).ThenBy(x => x.proStockInfoDetails.Sum(x => x.StockPcsQty)).ToList();
+                foreach (var item in proStockInfos)
+                {
+                    proStockInfoDetails.AddRange(item.proStockInfoDetails);
+                }
+                if (proStockInfoDetails.Sum(x=>x.StockPcsQty)< erpProductSpecifyVerDTO.QtyPcs)
+                    return await Task.FromResult(content.Error($"鍙寚娲惧簱瀛樻暟閲忎笉瓒�,鍙敤:{proStockInfoDetails.Sum(x => x.StockPcsQty)}"));
+                float overQty = 0;
+                foreach (var item in proStockInfoDetails)
+                {
+                    specifyVerDetails.Add(item);
+                    overQty += item.StockPcsQty;
+                    //宸叉弧瓒宠幏鍙栨暟閲忎笉鍐嶆洿鏀�
+                    if (overQty>= erpProductSpecifyVerDTO.QtyPcs)
+                    {
+                        break;
+                    }
+                }
+                specifyVerDetails.ForEach(x =>
+                {
+                    x.SpecifyVer = erpProductSpecifyVerDTO.Ver;
+                });
+                _unitOfWorkManage.BeginTran();
+                _stockRepository.ProStockInfoDetailRepository.UpdateData(specifyVerDetails);
+                _unitOfWorkManage.CommitTran();
+                content.OK("鎸囨淳鎴愬姛");
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                content.Error(ex.Message);
+            }
+            return await Task.FromResult(content);
+        }
+        /// <summary>
+        /// 鎴愬搧鍑哄緟鍙戣揣鍖�(骞冲簱)+鍚屾ERP鍑哄簱(缁戝畾浜嗗嚭搴撳崟搴撳瓨)
+        /// </summary>
+        /// <returns></returns>
+        public WebResponseContent OutProductPK(SaveModel saveModel, string ProOutNo)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                List<string> OutPKCodes = saveModel.DelKeys.Select(x => x.ToString()).ToList();
+                if (OutPKCodes.IsNullOrEmpty())
+                {
+                    return content.Error("涓嶈兘涓虹┖");
+                }
+                Dt_ProOutOrder proOutOrder = _outboundRepository.ProOutOrderRepository.Db.Queryable<Dt_ProOutOrder>().Where(x => x.ProOutOrderNo == ProOutNo).Includes(x => x.Details).First();
+                if (proOutOrder == null)
+                {
+                    return content.Error($"鍑哄簱鍗晎ProOutNo}涓嶅瓨鍦�");
+                }
+                if (proOutOrder.ProOrderStatus==OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt())
+                {
+                    return content.Error($"鍑哄簱鍗晎ProOutNo}宸插畬鎴�");
+                }
+                string? userName = App.User.UserName;//GSWMS
+                //鑾峰彇鎵�鏈夊绠辩殑鏁版嵁
+                List<Dt_ProStockInfo> AllproStockInfos = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>()
+                    .Where(x => OutPKCodes.Contains(x.PalletCode) && x.ShipmentOrder == proOutOrder.ProOutOrderNo && x.StockStatus == StockStatusEmun.骞冲簱鍏ュ簱瀹屾垚.ObjToInt())
+                    .Includes(x => x.proStockInfoDetails).ToList();
+                if (AllproStockInfos.Count<=0)
+                {
+                    return content.Error($"鍑哄簱鍗晎ProOutNo}宸叉棤缁戝畾搴撳瓨");
+                }
+                List<Dt_ProStockInfo> proStockInfos = new List<Dt_ProStockInfo>();
+                List<Dt_ProStockInfoDetail> proStockInfoDetails = new List<Dt_ProStockInfoDetail>();
+                List<Dt_Warehouse> warehouses = _basicRepository.WarehouseRepository.QueryData(x => x.WarehouseType == WarehouseTypEnum.鎴愬搧.ToString());
+                foreach (var item in OutPKCodes)
+                {
+                    //鑾峰彇搴撳瓨
+                    Dt_ProStockInfo? proStockInfo = AllproStockInfos.Where(x => x.PalletCode == item).FirstOrDefault();
+                    if (proStockInfo == null)
+                    {
+                        return content.Error($"鏈壘鍒皗item}搴撳瓨");
+                    }
+                    Dt_Warehouse? dt_Warehouse = warehouses.Where(x=>x.WarehouseId== proStockInfo.WarehouseId).FirstOrDefault();
+                    if (dt_Warehouse==null)
+                    {
+                        return content.Error($"澶栫鍙穥item},涓嶅睘浜庢垚鍝佷粨");
+                    }
+                    if (proStockInfo.ShipmentOrder!= proOutOrder.ProOutOrderNo)
+                    {
+                        return content.Error($"澶栫鍙穥item},涓嶅睘浜庡嚭搴撹鍗晎proOutOrder.ProOutOrderNo}");
+                    }
+                    proStockInfos.Add(proStockInfo);
+                    proStockInfoDetails.AddRange(proStockInfo.proStockInfoDetails);
+                }
+                
+                if (proOutOrder.Details.Sum(x=>x.LockQtyPcs-x.OverQtyPcs)< proStockInfoDetails.Sum(x=>x.StockPcsQty))
+                {
+                    return content.Error($"鍑哄簱鏁伴噺{proStockInfoDetails.Sum(x => x.StockPcsQty)}>鎵�鍓╄鍗曟暟閲弡proOutOrder.Details.Sum(x => x.LockQtyPcs - x.OverQtyPcs)}");
+                }
+                List<StockOutItemsItem> stockOutItems = new List<StockOutItemsItem>();
+                List<Dt_ProOutOrderDetail> proOutOrderDetails = proOutOrder.Details.Where(x=> proStockInfoDetails.Select(x=>x.ProductCode).Contains(x.PCode) && proStockInfoDetails.Select(x => x.ProductVersion).Contains(x.PVer)).ToList();
+                if (proOutOrderDetails==null || proOutOrderDetails.Count<=0)
+                {
+                    return content.Error("瀵瑰簲鍑哄簱璁㈠崟鏄庣粏涓虹┖");
+                }
+                int OldOverCount = proOutOrder.Details.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
+                List<Dt_ProOutOrderDetail> newProDetails=new List<Dt_ProOutOrderDetail>();
+                foreach (var item in proStockInfoDetails)
+                {
+                    //鑾峰彇瀵瑰簲鏄庣粏澶勭悊鍑哄簱鏁版嵁
+                    Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrderDetails.Where(x => x.Id==item.OutDetailId && x.PVer == item.ProductVersion && x.PCode == item.ProductCode).FirstOrDefault();
+                    if (proOutOrderDetail==null)
+                    {
+                        return content.Error("鏈壘鍒板搴斿嚭搴撹鍗曟槑缁�");
+                    }
+                    proOutOrderDetail.OverQtyPcs += item.StockPcsQty;
+                    item.OutboundQuantity = item.StockPcsQty;
+                    item.OutSETQty = item.SETQty;
+                    if (proOutOrderDetail.OverQtyPcs> proOutOrderDetail.QtyPcs)
+                    {
+                        return content.Error($"鍑哄簱璁㈠崟鏄庣粏琛寋proOutOrderDetail.RowId},婧㈠嚭{proOutOrderDetail.QtyPcs - proOutOrderDetail.OverQtyPcs}");
+                    }
+                    if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs)
+                    {
+                        proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
+                        newProDetails.Add(proOutOrderDetail);
+                    }
+                    
+                }
+                
+                int AddOverCount = newProDetails.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
+                if (proOutOrder.Details.Count == (AddOverCount + OldOverCount))
+                {
+                    proOutOrder.ProOrderStatus = OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt();
+                    //鑾峰彇鎵�鏈夊凡鎵爜寰呭彂璐х殑搴撳瓨
+                    List<Dt_ProStockInfo> AllOutStocks = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>()
+                    .Where(x => x.ShipmentOrder== ProOutNo && x.StockStatus == StockStatusEmun.骞冲簱寰呭彂璐�.ObjToInt())
+                    .Includes(x => x.proStockInfoDetails).ToList();
+                    AllOutStocks.ForEach(x =>
+                    {
+                        proStockInfoDetails.AddRange(x.proStockInfoDetails);
+                    });
+                    proStockInfos.AddRange(AllOutStocks);
+                    foreach (var item in proStockInfoDetails)
+                    {
+                        StockOutItemsItem outItemsItem = new StockOutItemsItem()
+                        {
+                            PartNum = item.ProductCode,
+                            Rev = item.ProductVersion,
+                            SoNumber = item.OutDetailSaleNo,
+                            BatchNumber = item.BagNo,
+                            QtyPcs = item.OutboundQuantity,
+                            QtySet = item.OutSETQty
+                        };
+                        stockOutItems.Add(outItemsItem);
+                    }
+                }
+                _unitOfWorkManage.BeginTran();
+                Dt_Warehouse warehouse = warehouses.Where(x => x.WarehouseId == proOutOrder.WarehouseId).FirstOrDefault();
+                //澶勭悊搴撳瓨鏁版嵁鍜屼笂浼燛RP
+                if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt())
+                {
+                    //鎴愬搧搴撳瓨璁板綍鍙樺姩寰呭姞鍏�
+                    ERPProOutOrderModel proOutOrderModel = new ERPProOutOrderModel()
+                    {
+                        Way = 1,
+                        StockOutCode = _outboundOrderService.CreateCodeByRule(nameof(RuleCodeEnum.ProOutCOdeRule)),
+                        ConfirmedUserNo = App.User.UserName,
+                        AssignUserNo = App.User.UserName,
+                        WarehouseCode = warehouse.WarehouseCode,
+                        ShipDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
+                        DeliverplanCode = proOutOrder.ProOutOrderNo,
+                        Remark = proOutOrder.Remark,
+                        StockOutItems = stockOutItems
+                    };
+                    _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(proStockInfos, OperateTypeEnum.鑷姩瀹屾垚);
+                    _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(proStockInfoDetails, OperateTypeEnum.鑷姩瀹屾垚);
+                    //WebResponseContent contentSaveInfos = SaveOutProPKInfos(proStockInfos);
+                    //if (!contentSaveInfos.Status)
+                    //{
+                    //    throw new Exception(contentSaveInfos.Message);
+                    //};
+                    string response = _invokeERPService.InvokeProOutApi(proOutOrderModel);
+                    ErpRequestContent erpRequestContent = response.DeserializeObject<ErpRequestContent>();
+                    if (erpRequestContent.res != 1)
+                    {
+                        throw new Exception("鍚屾ERP澶辫触,閿欒淇℃伅:" + erpRequestContent.Data);
+                    }
+                }
+                else
+                {
+                    proStockInfos.ForEach(x =>
+                    {
+                        x.StockStatus = StockStatusEmun.骞冲簱寰呭彂璐�.ObjToInt();
+                    });
+                    proStockInfoDetails.ForEach(x =>
+                    {
+                        x.ProOutDetailStatus = StockStatusEmun.骞冲簱寰呭彂璐�.ObjToInt();
+                    });
+                    _stockRepository.ProStockInfoRepository.UpdateData(proStockInfos);
+                    _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfoDetails);
+                }
+                _outboundRepository.ProOutOrderDetailRepository.UpdateData(proOutOrderDetails);
+                BaseDal.UpdateData(proOutOrder);
+                _unitOfWorkManage.CommitTran();
+                content.OK();
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                content.Error(ex.Message);
+            }
+            return content;
+        }
+        /// <summary>
+        /// 鑾峰彇鍑哄簱鎵�鏈夌殑澶栧唴鍖呮槑缁�
+        /// </summary>
+        /// <param name="proStockInfos"></param>
+        /// <returns></returns>
+        public WebResponseContent SaveOutProPKInfos(List<Dt_ProStockInfo> proStockInfos)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                List<Dt_OutProPKStockInfo> outProPKStockInfos = new List<Dt_OutProPKStockInfo>();
+                foreach (var fromItem in proStockInfos)
+                {
+                    foreach (var lordItem in fromItem.proStockInfoDetails)
+                    {
+                        Dt_OutProPKStockInfo outProPKStockInfo = new Dt_OutProPKStockInfo()
+                        {
+                            PCode = lordItem.ProductCode,
+                            PVer=lordItem.ProductVersion,
+                            PLot=lordItem.ProductVersion,
+                            DateCode=lordItem.DateCode,
+                            StockId=fromItem.Id,
+                            OriginalQuantity=lordItem.StockPcsQty,
+                            AssignQuantity=lordItem.StockPcsQty,
+                            PalletCode=fromItem.PalletCode,
+                            Unit="PCS"
+                        };
+                        outProPKStockInfos.Add(outProPKStockInfo);
+                    }
+                }
+                Db.InsertNav(outProPKStockInfos).Include(x=>x).ExecuteCommand();
+                content.OK();
+            }
+            catch (Exception ex)
+            {
+                content.Error(ex.Message);
+            }
+            return content;
+        }
+        //鏍规嵁鍐呭寘鍑哄簱
+        public WebResponseContent BagProductPK(SaveModel saveModel)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                var outOrder = saveModel.MainData["proOutNo"].ToString();
+                var outBags = saveModel.DelKeys.Select(x => x.ToString()).ToList();
+                if (outBags.Count<=0)
+                {
+                    return content.Error("鍐呭寘淇℃伅鑾峰彇澶辫触");
+                }
 
             }
             catch (Exception ex)
@@ -136,5 +497,650 @@
             }
             return content;
         }
+        /// <summary>
+        /// 鎴愬搧鍑哄緟鍙戣揣鍖�(骞冲簱)+鍚屾ERP鍑哄簱(鏈粦瀹氬嚭搴撳崟搴撳瓨)
+        /// </summary>
+        /// <returns></returns>
+        //public WebResponseContent OutProductNoPK(string[] OutPKCodes, string ProOutNo)
+        //{
+        //    WebResponseContent content = new WebResponseContent();
+        //    try
+        //    {
+        //        if (OutPKCodes.IsNullOrEmpty())
+        //        {
+        //            return content.Error("涓嶈兘涓虹┖");
+        //        }
+        //        Dt_ProOutOrder proOutOrder = _outboundRepository.ProOutOrderRepository.Db.Queryable<Dt_ProOutOrder>().Where(x => x.ProOutOrderNo == ProOutNo).Includes(x => x.Details).First();
+        //        if (proOutOrder == null)
+        //        {
+        //            return content.Error($"鍑哄簱鍗晎ProOutNo}涓嶅瓨鍦�");
+        //        }
+        //        if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt())
+        //        {
+        //            return content.Error($"鍑哄簱鍗晎ProOutNo}宸插畬鎴�");
+        //        }
+        //        string? userName = App.User.UserName;//GSWMS
+        //        //鑾峰彇鎵�鏈夊绠辩殑鏁版嵁
+        //        List<Dt_ProStockInfo> AllproStockInfos = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>()
+        //            .Where(x => OutPKCodes.Contains(x.PalletCode) && x.StockStatus == StockStatusEmun.骞冲簱鍏ュ簱瀹屾垚.ObjToInt())
+        //            .Includes(x => x.proStockInfoDetails).ToList();
+        //        List<Dt_ProStockInfo> proStockInfos = new List<Dt_ProStockInfo>();
+        //        List<Dt_ProStockInfoDetail> proStockInfoDetails = new List<Dt_ProStockInfoDetail>();
+        //        List<Dt_Warehouse> warehouses = _basicRepository.WarehouseRepository.QueryData(x => x.WarehouseType == WarehouseTypEnum.鎴愬搧.ToString());
+        //        foreach (var item in OutPKCodes)
+        //        {
+        //            //鑾峰彇搴撳瓨
+        //            Dt_ProStockInfo? proStockInfo = AllproStockInfos.Where(x => x.PalletCode == item).FirstOrDefault();
+        //            if (proStockInfo == null)
+        //            {
+        //                return content.Error($"鏈壘鍒皗item}搴撳瓨");
+        //            }
+        //            if (proStockInfo.ShipmentOrder!=null)
+        //            {
+        //                return content.Error($"澶栫鍙穥item}涓哄嚭搴撳崟{proStockInfo.ShipmentOrder}鎸囧畾搴撳瓨!");
+        //            }
+        //            Dt_Warehouse? dt_Warehouse = warehouses.Where(x => x.WarehouseId == proStockInfo.WarehouseId).FirstOrDefault();
+        //            if (dt_Warehouse == null)
+        //            {
+        //                return content.Error($"澶栫鍙穥item},涓嶅睘浜庢垚鍝佷粨");
+        //            }
+        //            proStockInfos.Add(proStockInfo);
+        //            proStockInfoDetails.AddRange(proStockInfo.proStockInfoDetails);
+        //        }
+
+        //        if (proOutOrder.Details.Sum(x => x.QtyPcs - x.OverQtyPcs) < proStockInfoDetails.Sum(x => x.StockPcsQty))
+        //        {
+        //            return content.Error($"鍑哄簱鏁伴噺{proStockInfoDetails.Sum(x => x.StockPcsQty)}>鎵�鍓╄鍗曟暟閲弡proOutOrder.Details.Sum(x => x.QtyPcs - x.OverQtyPcs)}");
+        //        }
+        //        List<StockOutItemsItem> stockOutItems = new List<StockOutItemsItem>();
+        //        List<Dt_ProOutOrderDetail> proOutOrderDetails = proOutOrder.Details.Where(x => proStockInfoDetails.Select(x => x.SaleOrder).Contains(x.SaleOrder) && proStockInfoDetails.Select(x => x.ProductCode).Contains(x.PCode) && proStockInfoDetails.Select(x => x.ProductVersion).Contains(x.PVer)).ToList();
+        //        if (proOutOrderDetails == null || proOutOrderDetails.Count <= 0)
+        //        {
+        //            return content.Error("瀵瑰簲鍑哄簱璁㈠崟鏄庣粏涓虹┖");
+        //        }
+        //        int OldOverCount = proOutOrder.Details.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
+        //        foreach (var item in proStockInfoDetails)
+        //        {
+        //            //鑾峰彇瀵瑰簲鏄庣粏澶勭悊鍑哄簱鏁版嵁
+        //            Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrderDetails.Where(x => x.SaleOrder == item.SaleOrder && x.PVer == item.ProductVersion && x.PCode == item.ProductCode).FirstOrDefault();
+        //            if (proOutOrderDetail == null)
+        //            {
+        //                return content.Error("鏈壘鍒板搴斿嚭搴撹鍗曟槑缁�");
+        //            }
+        //            proOutOrderDetail.OverQtyPcs += item.StockPcsQty;
+        //            item.OutboundQuantity = item.StockPcsQty;
+        //            item.OutSETQty = item.SETQty;
+        //            if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs)
+        //            {
+        //                return content.Error($"鍑哄簱璁㈠崟鏄庣粏琛寋proOutOrderDetail.RowId},婧㈠嚭{proOutOrderDetail.QtyPcs - proOutOrderDetail.OverQtyPcs}");
+        //            }
+        //            if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs)
+        //            {
+        //                proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
+        //            }
+
+        //        }
+        //        proStockInfos.ForEach(x =>
+        //        {
+        //            x.StockStatus = StockStatusEmun.骞冲簱寰呭彂璐�.ObjToInt();
+        //        });
+        //        proStockInfoDetails.ForEach(x =>
+        //        {
+        //            x.ProOutDetailStatus = StockStatusEmun.骞冲簱寰呭彂璐�.ObjToInt();
+        //        });
+        //        int AddOverCount = proOutOrderDetails.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
+        //        if (proOutOrder.Details.Count == (AddOverCount + OldOverCount))
+        //        {
+        //            proOutOrder.ProOrderStatus = OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt();
+        //            //鑾峰彇鎵�鏈夊凡鎵爜寰呭彂璐х殑搴撳瓨
+        //            List<Dt_ProStockInfo> AllOutStocks = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>()
+        //            .Where(x => x.ShipmentOrder == ProOutNo && x.StockStatus == StockStatusEmun.骞冲簱寰呭彂璐�.ObjToInt())
+        //            .Includes(x => x.proStockInfoDetails).ToList();
+        //            AllOutStocks.ForEach(x =>
+        //            {
+        //                proStockInfoDetails.AddRange(x.proStockInfoDetails);
+        //            });
+        //            proStockInfos.AddRange(AllOutStocks);
+        //            foreach (var item in proStockInfoDetails)
+        //            {
+        //                StockOutItemsItem outItemsItem = new StockOutItemsItem()
+        //                {
+        //                    PartNum = item.ProductCode,
+        //                    Rev = item.ProductVersion,
+        //                    SoNumber = item.SaleOrder,
+        //                    BatchNumber = item.BagNo,
+        //                    QtyPcs = item.OutboundQuantity,
+        //                    QtySet = item.OutSETQty
+        //                };
+        //                stockOutItems.Add(outItemsItem);
+        //            }
+        //        }
+        //        Dt_Warehouse warehouse = warehouses.Where(x => x.WarehouseId == proOutOrder.WarehouseId).FirstOrDefault();
+        //        _unitOfWorkManage.BeginTran();
+        //        //澶勭悊搴撳瓨鏁版嵁鍜屼笂浼燛RP
+        //        if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt())
+        //        {
+        //            //鎴愬搧搴撳瓨璁板綍鍙樺姩寰呭姞鍏�
+        //            ERPProOutOrderModel proOutOrderModel = new ERPProOutOrderModel()
+        //            {
+        //                Way = 1,
+        //                StockOutCode = _outboundOrderService.CreateCodeByRule(nameof(RuleCodeEnum.ProOutCOdeRule)),
+        //                ConfirmedUserNo = App.User.UserName,
+        //                AssignUserNo = App.User.UserName,
+        //                WarehouseCode = warehouse.WarehouseCode,
+        //                ShipDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
+        //                DeliverplanCode = proOutOrder.ProOutOrderNo,
+        //                Remark = proOutOrder.Remark,
+        //                StockOutItems = stockOutItems
+        //            };
+        //            _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(proStockInfos, OperateTypeEnum.鑷姩瀹屾垚);
+        //            _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(proStockInfoDetails, OperateTypeEnum.鑷姩瀹屾垚);
+        //            string response = _invokeERPService.InvokeProOutApi(proOutOrderModel);
+        //            ErpRequestContent erpRequestContent = response.DeserializeObject<ErpRequestContent>();
+        //            if (erpRequestContent.res != 1)
+        //            {
+        //                throw new Exception("鍚屾ERP澶辫触,閿欒淇℃伅:" + erpRequestContent.Data);
+        //            }
+        //        }
+        //        else
+        //        {
+        //            _stockRepository.ProStockInfoRepository.UpdateData(proStockInfos);
+        //            _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfoDetails);
+        //        }
+        //        _outboundRepository.ProOutOrderDetailRepository.UpdateData(proOutOrderDetails);
+        //        BaseDal.UpdateData(proOutOrder);
+        //        _unitOfWorkManage.CommitTran();
+        //        content.OK();
+        //    }
+        //    catch (Exception ex)
+        //    {
+        //        content.Error(ex.Message);
+        //    }
+        //    return content;
+        //}
+        /// <summary>
+        /// PDA鑾峰彇鍑哄簱鍗曟嵁
+        /// </summary>
+        /// <param name="saveModel"></param>
+        /// <returns></returns>
+        public WebResponseContent GetProOutOrders(SaveModel saveModel)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                int pageNo = saveModel.MainData["pageNo"].ObjToInt();
+                int warehouseId = saveModel.MainData["warehouseId"].ObjToInt();
+                string orderNo = saveModel.MainData["orderNo"].ToString();
+                List<Dt_ProOutOrder> proOutOrders = new List<Dt_ProOutOrder>();
+                if (string.IsNullOrEmpty(orderNo))
+                {
+                    proOutOrders = Db.Queryable<Dt_ProOutOrder>().Where(x => x.ProOrderStatus <= OutOrderStatusEnum.鍑哄簱涓�.ObjToInt() && x.WarehouseId == warehouseId).Includes(x=>x.Details).OrderByDescending(x => x.Id).ToPageList(pageNo, 5);
+                }
+                else
+                {
+                    proOutOrders = Db.Queryable<Dt_ProOutOrder>().Where(x => (x.ProOutOrderNo.Contains(orderNo) || x.ProOutOrderNo.Contains(orderNo)) && x.ProOrderStatus <= OutOrderStatusEnum.鍑哄簱涓�.ObjToInt() && x.WarehouseId == warehouseId).OrderByDescending(x => x.Id).Includes(x => x.Details).ToPageList(pageNo, 5);
+                }
+
+                content.OK(data: proOutOrders);
+            }
+            catch (Exception)
+            {
+
+                throw;
+            }
+            return content;
+        }
+        /// <summary>
+        /// 鑾峰彇鎵爜鑾峰彇璁㈠崟鏄庣粏淇℃伅
+        /// </summary>
+        public WebResponseContent GetOrderDetails(int keyId)
+        {
+            WebResponseContent content=new WebResponseContent();
+            try
+            {
+                //鑾峰彇鍑哄簱鍗曞彿
+                Dt_ProOutOrder proOutOrder = BaseDal.QueryFirst(x => x.Id == keyId);
+                if (proOutOrder == null)
+                {
+                    return content.Error($"鏈壘鍒板嚭搴撳崟{proOutOrder.ProOutOrderNo}");
+                }
+                //鑾峰彇鏄庣粏
+                List<Dt_ProOutOrderDetail> proOutOrderDetails = _outboundRepository.ProOutOrderDetailRepository.QueryData(x => x.ProOrderId == keyId).OrderBy(x => x.ProOrderDetailStatus).ThenBy(x => x.Id).ToList();
+                content.OK("鎴愬姛", new { proOutOrderDetails });
+            }
+            catch (Exception ex)
+            {
+                content.Error(ex.Message);
+            }
+            return content;
+        }
+        /// <summary>
+        /// 鏌ヨERP璁㈠崟鎵i櫎搴撳瓨鏁伴噺
+        /// </summary>
+        public async Task<WebResponseContent> OutProErpSync(string outProOrderNo)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                //鏍规嵁鍑哄簱鍗曞彿鑾峰彇璇ュ嚭搴撹鍗曠殑ERP鍑哄簱搴撳瓨淇℃伅
+                Dt_ProOutOrder proOutOrder = BaseDal.Db.Queryable<Dt_ProOutOrder>().Where(x=>x.ProOutOrderNo== outProOrderNo).Includes(x => x.Details).First();
+                if (proOutOrder==null)
+                {
+                    return await Task.FromResult(content.Error($"鏈壘鍒版垚鍝佸嚭搴撹鍗晎outProOrderNo}"));
+                }
+                if (proOutOrder.ProOrderStatus>=OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt())
+                {
+                    return await Task.FromResult(content.Error($"鍑哄簱璁㈠崟宸插畬鎴愭垨鍏抽棴"));
+                }
+                //璋冪敤erp鍑哄簱璁㈠崟搴撳瓨鏌ヨ鎺ュ彛
+                string response = _invokeERPService.InvokeOutProErpSync(outProOrderNo);
+                ErpOutProSyncResponseContent erpOutProSyncResponse= response.DeserializeObject<ErpOutProSyncResponseContent>();
+                if (erpOutProSyncResponse.Code!=200)
+                {
+                    return await Task.FromResult(content.Error($"ERP鍑哄簱璁㈠崟鏌ヨ鎺ュ彛璋冪敤澶辫触,閿欒淇℃伅:{erpOutProSyncResponse.Msg}"));
+                }
+                List<OutProStock> outProStocks = erpOutProSyncResponse.Data;
+                if (outProStocks.Count<=0 || outProStocks==null)
+                {
+                    return await Task.FromResult(content.Error($"鎴愬搧鍑哄簱璁㈠崟{outProOrderNo}ERP褰撳墠鏈湁鍑哄簱搴撳瓨淇℃伅"));
+                }
+                //鑾峰彇骞冲簱搴撳尯
+                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString());
+                if (warehouse==null)
+                {
+                    return await Task.FromResult(content.Error("鏈壘鍒板簱鍖轰俊鎭�"));
+                }
+                //鑾峰彇鎵�鏈夊钩搴撳簱瀛�
+                List<Dt_ProStockInfo> proStockInfos = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId).Includes(x => x.proStockInfoDetails).ToList();
+                List<Dt_ProStockInfoDetail> proStockInfoDetails= new List<Dt_ProStockInfoDetail>();
+                foreach (var item in proStockInfos)
+                {
+                    proStockInfoDetails.AddRange(item.proStockInfoDetails);
+                }
+                proStockInfoDetails = proStockInfoDetails.OrderBy(x => x.DateCode).ThenBy(x => x.CreateDate).ToList() ;
+                List<Dt_ProStockInfo> delProStockInfos = new List<Dt_ProStockInfo>();
+                List<Dt_ProStockInfoDetail> delStockInfoDetails = new List<Dt_ProStockInfoDetail>();
+                foreach (var item in outProStocks)
+                {
+                    //鏌ヨ搴撳瓨璁板綍
+                    if (item.ShippingNumber != outProOrderNo)
+                    {
+                        return await Task.FromResult(content.Error($"ERP杩斿洖浜嗗嚭搴撹鍗晎item.ShippingNumber}搴撳瓨淇℃伅"));
+                    }
+                    //鑾峰彇搴撳瓨
+                    List<Dt_ProStockInfoDetail> outStocks = proStockInfoDetails.Where(x=>x.ProductCode==item.Partnum).ToList();
+                    if (outStocks.Count==0 || outStocks==null)
+                    {
+                        return await Task.FromResult(content.Error($"{item.Partnum}浜у搧鍨嬪彿搴撳瓨涓嶅瓨鍦�"));
+                    }
+                    foreach (var itemOut in outStocks)
+                    {
+                        if (item.Quantity==0)
+                        {
+                            break;
+                        }
+                        if (item.Quantity >= itemOut.StockPcsQty)
+                        {
+                            Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.SaleOrder == item.SoNumber && x.PCode == item.Partnum);
+                            if (proOutOrderDetail == null)
+                            {
+                                return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}鏈壘鍒伴攢鍞鍗晎item.SoNumber}鏄庣粏,璇锋鏌�"));
+                            }
+                            //鏇存柊鍑哄簱鏄庣粏鍗曟暟閲�
+                            proOutOrderDetail.OverQtyPcs += itemOut.StockPcsQty;
+                            item.Quantity -= (int)itemOut.StockPcsQty;
+                            delStockInfoDetails.Add(itemOut);
+                            proStockInfoDetails.Remove(itemOut);
+                            if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs)
+                            {
+                                return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}閿�鍞鍗晎item.SoNumber}鏁伴噺婧㈠嚭{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}"));
+                            }
+                            if (proOutOrderDetail.ProOrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
+                            {
+                                proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
+                            }
+                            if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs)
+                            {
+                                proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
+                            }
+                        }
+                        else if (item.Quantity < itemOut.StockPcsQty)
+                        {
+                            Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.SaleOrder == item.SoNumber && x.PCode == item.Partnum);
+                            if (proOutOrderDetail == null)
+                            {
+                                return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}鏈壘鍒伴攢鍞鍗晎item.SoNumber}鏄庣粏,璇锋鏌�"));
+                            }
+                            //鏇存柊鍑哄簱鏄庣粏鍗曟暟閲�
+                            proOutOrderDetail.OverQtyPcs += item.Quantity;
+                            item.Quantity -= item.Quantity;
+                            float Range = itemOut.StockPcsQty / itemOut.SETQty;
+                            itemOut.SETQty = item.Quantity / Range;
+                            itemOut.StockPcsQty -= item.Quantity;
+                            if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs)
+                            {
+                                return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}閿�鍞鍗晎item.SoNumber}鏁伴噺婧㈠嚭{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}"));
+                            }
+                            if (proOutOrderDetail.ProOrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
+                            {
+                                proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
+                            }
+                            if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs)
+                            {
+                                proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
+                            }
+                        }
+                    }
+                }
+                if (proOutOrder.Details.Count == proOutOrder.Details.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count())
+                {
+                    proOutOrder.ProOrderStatus = OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt();
+                }
+                else
+                {
+                    Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.ProOrderDetailStatus <= OrderDetailStatusEnum.Over.ObjToInt());
+                    return await Task.FromResult(content.Error($"{proOutOrderDetail?.SaleOrder}閿�鍞鍗曟暟閲忛渶鍑簕proOutOrderDetail?.QtyPcs},鍙嚭{proOutOrderDetail?.OverQtyPcs}"));
+                }
+                //鏇存柊鏁版嵁
+                _unitOfWorkManage.BeginTran();
+                if (delStockInfoDetails.Count > 0)
+                {
+                    _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(delStockInfoDetails, OperateTypeEnum.鑷姩鍒犻櫎);
+                }
+                await _stockRepository.ProStockInfoDetailRepository.UpdateDataAsync(proStockInfoDetails);
+                await BaseDal.UpdateDataAsync(proOutOrder);
+                await _outboundRepository.ProOutOrderDetailRepository.UpdateDataAsync(proOutOrder.Details);
+                _unitOfWorkManage.CommitTran();
+                return await Task.FromResult(content.OK());
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                return await Task.FromResult(content.Error(ex.Message));
+            }
+        }
+        /// <summary>
+        /// 鍑哄簱鍗曟壂鐮佸悓姝RP
+        /// </summary>
+        /// <returns></returns>
+        public async Task<WebResponseContent> OutProScanCodeSync(SaveModel saveModel)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                string? ProOutNo = saveModel.MainData["outProOrderNo"].ToString();
+                var Codes = saveModel.DelKeys.Select(x=>x.ToString().Trim()).ToList();
+                if (Codes.Count<=0)
+                {
+                    return await Task.FromResult(content.Error("鎵弿鍐呭涓嶈兘涓虹┖"));
+                }
+                Dt_ProOutOrder proOutOrder = _outboundRepository.ProOutOrderRepository.Db.Queryable<Dt_ProOutOrder>().Where(x => x.ProOutOrderNo == ProOutNo).Includes(x => x.Details).First();
+                if (proOutOrder == null)
+                {
+                    return await Task.FromResult(content.Error($"鍑哄簱鍗晎ProOutNo}涓嶅瓨鍦�"));
+                }
+                if (proOutOrder.ProOrderStatus >= OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt())
+                {
+                    return await Task.FromResult(content.Error($"鍑哄簱鍗晎ProOutNo}宸插畬鎴愭垨鍏抽棴"));
+                }
+                string? userName = App.User.UserName;//GSWMS
+                List<OutProInfoDTO> outProInfos= new List<OutProInfoDTO>();
+                foreach (var item in Codes)
+                {
+                    string[] proInfoInputs = item.Split(',');
+                    if (proInfoInputs.Length!=5)
+                    {
+                        return await Task.FromResult(content.Error($"澶栧寘{item}鎵弿涓嶅叏"));
+                    }
+                    OutProInfoDTO outProInfo=new OutProInfoDTO()
+                    {
+                        ProductCode= proInfoInputs[1],
+                        OutQtys = proInfoInputs[4].ObjToInt()
+                    };
+                    outProInfos.Add(outProInfo);
+                }
+                //鑾峰彇骞冲簱搴撳尯
+                Dt_Warehouse warehouse = await _basicRepository.WarehouseRepository.QueryFirstAsync(x => x.WarehouseCode == WarehouseEnum.HA101.ToString());
+                if (warehouse == null)
+                {
+                    return await Task.FromResult(content.Error("鏈壘鍒板簱鍖轰俊鎭�"));
+                }
+                //鑾峰彇鎵�鏈夊钩搴撶殑鏁版嵁
+                List<Dt_ProStockInfo> AllproStockInfos = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>()
+                    .Where(x => x.WarehouseId == warehouse.WarehouseId)
+                    .Includes(x => x.proStockInfoDetails).ToList();
+                List<Dt_ProStockInfo> proStockInfos = new List<Dt_ProStockInfo>();
+                List<Dt_ProStockInfoDetail> proStockInfoDetails = new List<Dt_ProStockInfoDetail>();
+                foreach (var item in AllproStockInfos)
+                {
+                    proStockInfoDetails.AddRange(item.proStockInfoDetails);
+                }
+                proStockInfoDetails = proStockInfoDetails.OrderBy(x => x.DateCode).ThenBy(x => x.CreateDate).ThenBy(x=>x.StockPcsQty).ToList();
+                List<Dt_Warehouse> warehouses = await _basicRepository.WarehouseRepository.QueryDataAsync(x => x.WarehouseType == WarehouseTypEnum.鎴愬搧.ToString());
+                //灏嗗叾鍒嗙粍
+                outProInfos = outProInfos.GroupBy(x => x.ProductCode).Select(x=>new OutProInfoDTO()
+                {
+                    ProductCode=x.Key,
+                    OutQtys=x.Sum(x=>x.OutQtys)
+                }).ToList();
+                List<Dt_ProStockInfoDetail> UpStockInfoDetails = new List<Dt_ProStockInfoDetail>();
+                foreach (var item in outProInfos)
+                {
+                    //鑾峰彇搴撳瓨
+                    List<Dt_ProStockInfoDetail> outStocks = proStockInfoDetails.Where(x => x.ProductCode == item.ProductCode && x.OutProNo == null).ToList();
+                    if (outStocks.Count <= 0 || outProInfos==null)
+                    {
+                        return await Task.FromResult(content.Error($"鏈壘鍒颁骇鍝亄item.ProductCode}搴撳瓨"));
+                    }
+                    foreach (var outStock in outStocks)
+                    {
+                        //濡傛灉鎵e噺涓�0璺冲嚭閫昏緫
+                        if (item.OutQtys == 0)
+                        {
+                            break;
+                        }
+                        //鍒ゆ柇鍑哄簱鏁伴噺鏄惁澶т簬鎴栫瓑浜庡簱瀛樻暟閲�
+                        if (item.OutQtys >= outStock.StockPcsQty)
+                        {
+                            Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.PCode == item.ProductCode && x.ProOrderDetailStatus < OrderDetailStatusEnum.Over.ObjToInt());
+                            //鍒ゆ柇鏄惁瀛樺湪鍚屼竴鍨嬪彿涓ゆ潯鏄庣粏
+                            if (proOutOrderDetail == null)
+                            {
+                                return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}鏈壘鍒颁骇鍝亄item.ProductCode}鏄庣粏,璇锋鏌�"));
+                            }
+                            List<Dt_ProOutOrderDetail>? outOrderDetails = proOutOrder.Details.Where(x => x.PCode == item.ProductCode && x.ProOrderDetailStatus < OrderDetailStatusEnum.Over.ObjToInt() && x.Id != proOutOrderDetail.Id).ToList();
+                            float BeyondQtys = proOutOrderDetail.QtyPcs - proOutOrderDetail.OverQtyPcs;
+                            //鏇存柊鍑哄簱鏄庣粏鍗曟暟閲�
+                            proOutOrderDetail.OverQtyPcs += outStock.StockPcsQty;
+                            
+                            //鏄惁瓒呭嚭
+                            if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs)
+                            {
+                                if (outOrderDetails.Count>=1)
+                                {
+                                    proOutOrderDetail.OverQtyPcs -= outStock.StockPcsQty;
+                                    proOutOrderDetail.OverQtyPcs += BeyondQtys;
+                                    outStock.OutboundQuantity = BeyondQtys;
+                                    outStock.OutDetailSaleNo = proOutOrderDetail.SaleOrder;
+                                    outStock.OutProNo = proOutOrder.ProOutOrderNo;
+                                    float Range = outStock.StockPcsQty / outStock.SETQty;
+                                    if (outStock.OutboundQuantity== outStock.StockPcsQty)
+                                    {
+                                        outStock.OutSETQty = outStock.SETQty;
+                                        outStock.AssignDel = 1;
+                                    }
+                                    else
+                                    {
+                                        outStock.OutSETQty = outStock.OutboundQuantity / Range;
+                                    }
+                                    item.OutQtys -= (int)BeyondQtys;
+                                    UpStockInfoDetails.Add(outStock);
+                                    proStockInfoDetails.Remove(outStock);
+                                }
+                                else
+                                {
+                                    return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}琛屽彿{proOutOrderDetail.RowId}浜у搧鍨嬪彿{item.ProductCode}鏁伴噺婧㈠嚭{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}"));
+                                }
+                            }
+                            else
+                            {
+                                outStock.OutboundQuantity = outStock.StockPcsQty;
+                                outStock.OutDetailSaleNo = proOutOrderDetail.SaleOrder;
+                                outStock.OutProNo = proOutOrder.ProOutOrderNo;
+                                outStock.OutSETQty = outStock.SETQty;
+                                outStock.AssignDel = 1;
+                                item.OutQtys -= (int)outStock.StockPcsQty;
+                                UpStockInfoDetails.Add(outStock);
+                                proStockInfoDetails.Remove(outStock);
+                            }
+                            if (proOutOrderDetail.ProOrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
+                            {
+                                proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
+                            }
+                            if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs)
+                            {
+                                proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
+                            }
+                        }
+                        else if (item.OutQtys < outStock.StockPcsQty) //鍓╀綑鏁伴噺灏忎簬
+                        {
+                            Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.PCode == item.ProductCode && x.ProOrderDetailStatus < OrderDetailStatusEnum.Over.ObjToInt());
+                            if (proOutOrderDetail == null)
+                            {
+                                return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}鏈壘鍒颁骇鍝亄item.ProductCode}鏄庣粏,璇锋鏌�"));
+                            }
+                            List<Dt_ProOutOrderDetail>? outOrderDetails = proOutOrder.Details.Where(x => x.PCode == item.ProductCode && x.ProOrderDetailStatus < OrderDetailStatusEnum.Over.ObjToInt() && x.Id != proOutOrderDetail.Id).ToList();
+                            //鏇存柊鍑哄簱鏄庣粏鍗曟暟閲�
+                            float BeyondQtys = proOutOrderDetail.QtyPcs - proOutOrderDetail.OverQtyPcs;
+                            proOutOrderDetail.OverQtyPcs += item.OutQtys;
+                            
+                            //鏄惁瓒呭嚭
+                            if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs)
+                            {
+                                if (outOrderDetails.Count >= 1)
+                                {
+                                    proOutOrderDetail.OverQtyPcs -= outStock.StockPcsQty;
+                                    proOutOrderDetail.OverQtyPcs += BeyondQtys;
+                                    outStock.OutDetailSaleNo = proOutOrderDetail.SaleOrder;
+                                    outStock.OutProNo = proOutOrder.ProOutOrderNo;
+                                    outStock.OutboundQuantity = BeyondQtys;
+                                    float Range = outStock.StockPcsQty / outStock.SETQty;
+                                    outStock.OutSETQty = outStock.OutboundQuantity / Range;
+                                    item.OutQtys -= (int)BeyondQtys;
+                                    UpStockInfoDetails.Add(outStock);
+                                    proStockInfoDetails.Remove(outStock);
+                                }
+                                else
+                                {
+                                    return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}琛屽彿{proOutOrderDetail.RowId}浜у搧鍨嬪彿{item.ProductCode}鏁伴噺婧㈠嚭{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}"));
+                                }
+                            }
+                            else
+                            {
+                                outStock.OutDetailSaleNo = proOutOrderDetail.SaleOrder;
+                                outStock.OutProNo = proOutOrder.ProOutOrderNo;
+                                outStock.OutboundQuantity = item.OutQtys;
+                                float Range = outStock.StockPcsQty / outStock.SETQty;
+                                outStock.OutSETQty = outStock.OutboundQuantity / Range;
+                                item.OutQtys -= item.OutQtys;
+                                UpStockInfoDetails.Add(outStock);
+                                proStockInfoDetails.Remove(outStock);
+                            }
+                            if (proOutOrderDetail.ProOrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
+                            {
+                                proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
+                            }
+                            if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs)
+                            {
+                                proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
+                            }
+                        }
+                    }
+                }
+                if (proOutOrder.Details.Count == proOutOrder.Details.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count())
+                {
+                    proOutOrder.ProOrderStatus = OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt();
+                }
+                else
+                {
+                    Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.ProOrderDetailStatus < OrderDetailStatusEnum.Over.ObjToInt());
+                    return await Task.FromResult(content.Error($"{proOutOrderDetail?.SaleOrder}閿�鍞鍗曟暟閲忛渶鍑簕proOutOrderDetail?.QtyPcs},鍙嚭{proOutOrderDetail?.OverQtyPcs}"));
+                }
+                List<StockOutItemsItem> stockOutItems = new List<StockOutItemsItem>();
+                if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt())
+                {
+                    //鑾峰彇鎵�鏈夊凡鎵爜寰呭彂璐х殑搴撳瓨
+                    List<Dt_ProStockInfoDetail> assOutStocks = _stockRepository.ProStockInfoDetailRepository.Db.Queryable<Dt_ProStockInfoDetail>()
+                    .Where(x => x.OutProNo == ProOutNo).ToList();
+                    UpStockInfoDetails.AddRange(assOutStocks);
+                    foreach (var item in UpStockInfoDetails)
+                    {
+                        StockOutItemsItem outItemsItem = new StockOutItemsItem()
+                        {
+                            PartNum = item.ProductCode,
+                            Rev = item.ProductVersion,
+                            SoNumber = item.OutDetailSaleNo,
+                            BatchNumber = item.ProductCode,
+                            QtyPcs = item.OutboundQuantity,
+                            QtySet = item.OutSETQty
+                        };
+                        stockOutItems.Add(outItemsItem);
+                    }
+                }
+                Dt_Warehouse warehouseOut = warehouses.Where(x => x.WarehouseId == proOutOrder.WarehouseId).FirstOrDefault();
+                _unitOfWorkManage.BeginTran();
+                //澶勭悊搴撳瓨鏁版嵁鍜屼笂浼燛RP
+                if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt())
+                {
+                    //鎴愬搧搴撳瓨璁板綍鍙樺姩寰呭姞鍏�
+                    ERPProOutOrderModel proOutOrderModel = new ERPProOutOrderModel()
+                    {
+                        Way = 1,
+                        StockOutCode = _outboundOrderService.CreateCodeByRule(nameof(RuleCodeEnum.ProOutCOdeRule)),
+                        ConfirmedUserNo = App.User.UserName,
+                        AssignUserNo = App.User.UserName,
+                        WarehouseCode = warehouseOut.WarehouseCode,
+                        ShipDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
+                        DeliverplanCode = proOutOrder.ProOutOrderNo,
+                        Remark = proOutOrder.Remark,
+                        StockOutItems = stockOutItems
+                    };
+                    //鑾峰彇鍒犻櫎搴撳瓨
+                    List<Dt_ProStockInfoDetail> delDetails = UpStockInfoDetails.Where(x=>x.AssignDel==1).ToList();
+                    List<Dt_ProStockInfoDetail> UpDetails = UpStockInfoDetails.Where(x => x.AssignDel != 1).ToList();
+                    //鏇存柊鏁版嵁
+                    UpDetails.ForEach(x =>
+                    {
+                        x.StockPcsQty -= x.OutboundQuantity;
+                        x.SETQty -= x.OutSETQty;
+                        x.OutDetailId = 0;
+                        x.OutDetailSaleNo = null;
+                        x.OutProNo = null;
+                    });
+                    _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(delDetails, OperateTypeEnum.鑷姩瀹屾垚);
+                    await _stockRepository.ProStockInfoDetailRepository.UpdateDataAsync(UpDetails);
+                    //鍚屾ERP
+                    string response = _invokeERPService.InvokeProOutApi(proOutOrderModel);
+                    ErpRequestContent erpRequestContent = response.DeserializeObject<ErpRequestContent>();
+                    if (erpRequestContent.res != 1)
+                    {
+                        throw new Exception("鍚屾ERP澶辫触,閿欒淇℃伅:" + erpRequestContent.Data);
+                    }
+                }
+                else
+                {
+                    await _stockRepository.ProStockInfoDetailRepository.UpdateDataAsync(UpStockInfoDetails);
+                }
+                await _outboundRepository.ProOutOrderDetailRepository.UpdateDataAsync(proOutOrder.Details);
+                await BaseDal.UpdateDataAsync(proOutOrder);
+                _unitOfWorkManage.CommitTran();
+                return await Task.FromResult(content.OK());
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                return await Task.FromResult(content.Error(ex.Message));
+            }
+        }
     }
 }

--
Gitblit v1.9.3