wangxinhui
2025-06-23 ffb5bb3a68ae74ed3a1765baf946336cead3bb0d
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs
@@ -53,7 +53,7 @@
            _invokeERPService = invokeERPService;
        }
        /// <summary>
        /// æŽ¥æ”¶ERP成品出库单
        /// æŽ¥æ”¶ERP成品出库单信息(订单出库/寄售出库)
        /// </summary>
        /// <returns></returns>
        public async Task<WebResponseContent> ProductDeliveryOrder(ErpProOutOrderDTO outOrderDTO)
@@ -131,6 +131,7 @@
                            keyValuePairs.Add(item.SaleOrder, responseContent.Data[0].Endcustomer);
                        }
                    }
                    proOutOrderDetail.QtyPcs += proOutOrderDetail.SpareQty;
                    proOutOrderDetails.Add(proOutOrderDetail);
                }
                Dt_ProOutOrder  proOutOrder= new Dt_ProOutOrder()
@@ -199,6 +200,69 @@
                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出库(绑定了出库单库存)
@@ -654,7 +718,7 @@
        /// <summary>
        /// æŸ¥è¯¢ERP订单扣除库存数量
        /// </summary>
        public async Task<WebResponseContent> OutProErpSync(string outProOrderNo)
        public WebResponseContent OutProErpSync(string outProOrderNo)
        {
            WebResponseContent content = new WebResponseContent();
            try
@@ -663,52 +727,54 @@
                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}"));
                    return content.Error($"未找到成品出库订单{outProOrderNo}");
                }
                if (proOutOrder.ProOrderStatus>=OutOrderStatusEnum.出库完成.ObjToInt())
                {
                    return await Task.FromResult(content.Error($"出库订单已完成或关闭"));
                    return 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}"));
                    return content.Error($"ERP出库订单查询接口调用失败,错误信息:{erpOutProSyncResponse.Msg}");
                }
                List<OutProStock> outProStocks = erpOutProSyncResponse.Data;
                if (outProStocks.Count<=0 || outProStocks==null)
                {
                    return await Task.FromResult(content.Error($"成品出库订单{outProOrderNo}ERP当前未有出库库存信息"));
                    return content.Error($"成品出库订单{outProOrderNo}ERP当前未有出库库存信息");
                }
                // éªŒè¯æ‰€æœ‰å‡ºåº“单号是否一致
                OutProStock? outExist = outProStocks.FirstOrDefault(x => x.ShippingNumber != outProOrderNo);
                if (outExist != null)
                {
                    return content.Error($"ERP返回了出库订单{outExist.ShippingNumber}库存信息");
                }
                //获取平库库区
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString());
                if (warehouse==null)
                {
                    return await Task.FromResult(content.Error("未找到库区信息"));
                    return content.Error("未找到库区信息");
                }
                var productCodes = outProStocks.Select(x => x.Partnum).Distinct().ToList();
                //获取所有平库库存
                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_ProStockInfoDetail> proStockInfoDetails = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo, Dt_ProStockInfoDetail>((master, detail) => master.Id == detail.ProStockId)
                .Where((master, detail) => master.WarehouseId == warehouse.WarehouseId && productCodes.Contains(detail.ProductCode))
                .Select((master, detail) => detail)
                .ToList();
                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}产品型号库存不存在"));
                        return content.Error($"{item.Partnum}产品型号库存不存在");
                    }
                    foreach (var itemOut in outStocks)
                    {
@@ -716,13 +782,9 @@
                        {
                            break;
                        }
                        Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.SaleOrder == item.SoNumber && x.PCode == item.Partnum) ?? throw new Exception($"出库单{proOutOrder.ProOutOrderNo}未找到销售订单{item.SoNumber}明细,请检查");
                        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;
@@ -730,7 +792,7 @@
                            proStockInfoDetails.Remove(itemOut);
                            if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs)
                            {
                                return await Task.FromResult(content.Error($"出库单{proOutOrder.ProOutOrderNo}销售订单{item.SoNumber}数量溢出{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}"));
                                return content.Error($"出库单{proOutOrder.ProOutOrderNo}销售订单{item.SoNumber}数量溢出{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}");
                            }
                            if (proOutOrderDetail.ProOrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
                            {
@@ -743,11 +805,7 @@
                        }
                        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;
@@ -756,7 +814,7 @@
                            itemOut.StockPcsQty -= item.Quantity;
                            if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs)
                            {
                                return await Task.FromResult(content.Error($"出库单{proOutOrder.ProOutOrderNo}销售订单{item.SoNumber}数量溢出{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}"));
                                return content.Error($"出库单{proOutOrder.ProOutOrderNo}销售订单{item.SoNumber}数量溢出{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}");
                            }
                            if (proOutOrderDetail.ProOrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
                            {
@@ -776,7 +834,7 @@
                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}"));
                    return content.Error($"{proOutOrderDetail?.SaleOrder}销售订单数量需出{proOutOrderDetail?.QtyPcs},可出{proOutOrderDetail?.OverQtyPcs}");
                }
                //更新数据
                _unitOfWorkManage.BeginTran();
@@ -784,16 +842,16 @@
                {
                    _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(delStockInfoDetails, OperateTypeEnum.自动删除);
                }
                await _stockRepository.ProStockInfoDetailRepository.UpdateDataAsync(proStockInfoDetails);
                await BaseDal.UpdateDataAsync(proOutOrder);
                await _outboundRepository.ProOutOrderDetailRepository.UpdateDataAsync(proOutOrder.Details);
                _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfoDetails);
                BaseDal.UpdateData(proOutOrder);
                _outboundRepository.ProOutOrderDetailRepository.UpdateData(proOutOrder.Details);
                _unitOfWorkManage.CommitTran();
                return await Task.FromResult(content.OK());
                return content.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return await Task.FromResult(content.Error(ex.Message));
                return content.Error(ex.Message);
            }
        }
        /// <summary>