wangxinhui
2025-03-31 a6e0ea9ce13e791f3edae4edffeb3be3ccb760be
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs
@@ -159,7 +159,7 @@
            return content;
        }
        /// <summary>
        /// æˆå“å‡ºå¾…发货区(平库)+同步ERP出库
        /// æˆå“å‡ºå¾…发货区(平库)+同步ERP出库(绑定了出库单库存)
        /// </summary>
        /// <returns></returns>
        public WebResponseContent OutProductPK(string[] OutPKCodes,string ProOutNo)
@@ -183,8 +183,12 @@
                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())
                    .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());
@@ -219,6 +223,7 @@
                {
                    return content.Error("对应出库订单明细为空");
                }
                int OldOverCount = proOutOrder.Details.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
                foreach (var item in proStockInfoDetails)
                {
                    //获取对应明细处理出库数据
@@ -236,54 +241,80 @@
                    {
                        proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
                    }
                    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);
                }
                int OldOverCount = proOutOrder.Details.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
                int AddOverCount = proOutOrderDetails.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
                if (proOutOrder.Details.Count== (OldOverCount + AddOverCount))
                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
                _unitOfWorkManage.BeginTran();
                _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(proStockInfos, OperateTypeEnum.自动完成);
                _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(proStockInfoDetails, OperateTypeEnum.自动完成);
                _outboundRepository.ProOutOrderDetailRepository.UpdateData(proOutOrderDetails);
                BaseDal.UpdateData(proOutOrder);
                //成品库存记录变动待加入
                ERPProOutOrderModel proOutOrderModel = new ERPProOutOrderModel()
                if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.出库完成.ObjToInt())
                {
                    Way = 1,
                    StockOutCode = _outboundOrderService.CreateCodeByRule(nameof(RuleCodeEnum.ProOutCOdeRule)),
                    ConfirmedUserNo=userName,
                    AssignUserNo=userName,
                    WarehouseCode=warehouse.WarehouseCode,
                    ShipDate=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    DeliverplanCode=proOutOrder.ProOutOrderNo,
                    Remark=proOutOrder.Remark,
                    StockOutItems= stockOutItems
                };
                string response = _invokeERPService.InvokeProOutApi(proOutOrderModel);
                ErpRequestContent erpRequestContent= response.DeserializeObject<ErpRequestContent>();
                if (erpRequestContent.res==1)
                {
                    _unitOfWorkManage.CommitTran();
                    content.OK();
                    //成品库存记录变动待加入
                    ERPProOutOrderModel proOutOrderModel = new ERPProOutOrderModel()
                    {
                        Way = 1,
                        StockOutCode = _outboundOrderService.CreateCodeByRule(nameof(RuleCodeEnum.ProOutCOdeRule)),
                        ConfirmedUserNo = "admin",
                        AssignUserNo = "admin",
                        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
                {
                    throw new Exception(erpRequestContent.Data);
                    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)
            {
@@ -292,5 +323,164 @@
            }
            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;
                    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 = "admin",
                        AssignUserNo = "admin",
                        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;
        }
    }
}