wangxinhui
4 天以前 9ec715d2deb18a269dd49c48da91a36632d08c81
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs
@@ -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()
@@ -717,7 +718,7 @@
        /// <summary>
        /// æŸ¥è¯¢ERP订单扣除库存数量
        /// </summary>
        public async Task<WebResponseContent> OutProErpSync(string outProOrderNo)
        public WebResponseContent OutProErpSync(string outProOrderNo)
        {
            WebResponseContent content = new WebResponseContent();
            try
@@ -726,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)
                    {
@@ -779,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;
@@ -793,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())
                            {
@@ -806,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;
@@ -819,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())
                            {
@@ -839,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();
@@ -847,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>