wangxinhui
2025-04-29 95e39ae7aecd6e1016c71cf5ae70a680d8f569bb
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs
@@ -4,6 +4,7 @@
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;
@@ -15,6 +16,7 @@
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;
@@ -54,21 +56,21 @@
        /// æŽ¥æ”¶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>
@@ -95,6 +97,7 @@
                    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)
                {
                    //判断客户是否存在
@@ -103,7 +106,32 @@
                    {
                        return content.Error($"客户{item.Customer}不存在!");
                    }
                    proOutOrderDetails.Add(_mapper.Map<Dt_ProOutOrderDetail>(item));
                    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()
                {
@@ -233,21 +261,24 @@
                    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.SaleOrder).Contains(x.SaleOrder) && proStockInfoDetails.Select(x=>x.ProductCode).Contains(x.PCode) && proStockInfoDetails.Select(x => x.ProductVersion).Contains(x.PVer)).ToList();
                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.SaleOrder == item.SaleOrder && x.PVer == item.ProductVersion && x.PCode == item.ProductCode).FirstOrDefault();
                    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}");
@@ -255,11 +286,12 @@
                    if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs)
                    {
                        proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
                        newProDetails.Add(proOutOrderDetail);
                    }
                    
                }
                
                int AddOverCount = proOutOrderDetails.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
                int AddOverCount = newProDetails.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
                if (proOutOrder.Details.Count == (AddOverCount + OldOverCount))
                {
                    proOutOrder.ProOrderStatus = OutOrderStatusEnum.出库完成.ObjToInt();
@@ -278,10 +310,10 @@
                        {
                            PartNum = item.ProductCode,
                            Rev = item.ProductVersion,
                            SoNumber = item.SaleOrder,
                            SoNumber = item.OutDetailSaleNo,
                            BatchNumber = item.BagNo,
                            QtyPcs = item.StockPcsQty,
                            QtySet = item.SETQty
                            QtyPcs = item.OutboundQuantity,
                            QtySet = item.OutSETQty
                        };
                        stockOutItems.Add(outItemsItem);
                    }
@@ -296,8 +328,8 @@
                    {
                        Way = 1,
                        StockOutCode = _outboundOrderService.CreateCodeByRule(nameof(RuleCodeEnum.ProOutCOdeRule)),
                        ConfirmedUserNo = "admin",
                        AssignUserNo = "admin",
                        ConfirmedUserNo = App.User.UserName,
                        AssignUserNo = App.User.UserName,
                        WarehouseCode = warehouse.WarehouseCode,
                        ShipDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                        DeliverplanCode = proOutOrder.ProOutOrderNo,
@@ -306,11 +338,11 @@
                    };
                    _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(proStockInfos, OperateTypeEnum.自动完成);
                    _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(proStockInfoDetails, OperateTypeEnum.自动完成);
                    WebResponseContent contentSaveInfos = SaveOutProPKInfos(proStockInfos);
                    if (!contentSaveInfos.Status)
                    {
                        throw new Exception(contentSaveInfos.Message);
                    };
                    //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)
@@ -406,161 +438,163 @@
        /// æˆå“å‡ºå¾…发货区(平库)+同步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);
                }
        //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;
                    if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs)
                    {
                        return content.Error($"出库订单明细行{proOutOrderDetail.RowId},溢出{proOutOrderDetail.QtyPcs - proOutOrderDetail.OverQtyPcs}");
                    }
                    if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs)
                    {
                        proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
                    }
        //        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.StockPcsQty,
                            QtySet = item.SETQty
                        };
                        stockOutItems.Add(outItemsItem);
                    }
                }
                _unitOfWorkManage.BeginTran();
                Dt_Warehouse warehouse = warehouses.Where(x => x.WarehouseId == proOutOrder.WarehouseId).FirstOrDefault();
                //处理库存数据和上传ERP
                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;
        }
        //        }
        //        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();
        //        //处理库存数据和上传ERP
        //        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>
@@ -577,11 +611,11 @@
                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);
                    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);
                    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);
@@ -607,11 +641,9 @@
                {
                    return content.Error($"未找到出库单{proOutOrder.ProOutOrderNo}");
                }
                //获取当前已绑定的外包码(出库状态)
                List<string> outBags = _stockRepository.ProStockInfoRepository.QueryData(x => x.StockStatus == StockStatusEmun.平库待发货.ObjToInt() && x.ShipmentOrder== proOutOrder.ProOutOrderNo).Select(x=>x.PalletCode).ToList();
                //获取明细
                List<Dt_ProOutOrderDetail> proOutOrderDetails = _outboundRepository.ProOutOrderDetailRepository.QueryData(x=>x.ProOrderId==keyId).OrderBy(x=>x.ProOrderDetailStatus).ThenBy(x=>x.Id).ToList();
                content.OK("成功", new { outBags, proOutOrderDetails });
                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)
            {
@@ -619,5 +651,433 @@
            }
            return content;
        }
        /// <summary>
        /// æŸ¥è¯¢ERP订单扣除库存数量
        /// </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>
        /// å‡ºåº“单扫码同步ERP
        /// </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)
                    {
                        //如果扣减为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();
                //处理库存数据和上传ERP
                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));
            }
        }
    }
}