helongyang
昨天 cb25acc46bf41863e068b6f968f1592b7a14d1c9
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs
@@ -1,5 +1,6 @@
using AutoMapper;
using Castle.Core.Resource;
using Org.BouncyCastle.Asn1.Cmp;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -79,71 +80,112 @@
        /// <returns></returns>
        public WebResponseContent AddDeliveryOrder(ErpProOutOrderDTO outOrderDTO)
        {
            WebResponseContent content=new WebResponseContent();
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (BaseDal.QueryFirst(x => x.ProOutOrderNo == outOrderDTO.OrderNo) != null)
                if (BaseDal.QueryFirst(x => x.ProOutOrderNo == outOrderDTO.OrderNo) != null)
                {
                    return content.Error($"出库单号{outOrderDTO.OrderNo}已存在!");
                }
                Dt_Warehouse warehouse=null;
                Dt_Warehouse warehouse = null;
                List<Dt_CustomerInfo> customerInfos = _basicRepository.CustomerInfoRepository.QueryData();
                if (outOrderDTO.OType==1 && string.IsNullOrEmpty(outOrderDTO.WaType))
                if (outOrderDTO.OType == 1 && string.IsNullOrEmpty(outOrderDTO.WaType))
                {
                    warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseCode==WarehouseEnum.HA71.ToString());
                    warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA71.ToString());
                }
                else if (outOrderDTO.OType==2)
                else if (outOrderDTO.OType == 2)
                {
                    warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString());
                    warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA71.ToString());
                }
                List<Dt_ProOutOrderDetail> proOutOrderDetails = new List<Dt_ProOutOrderDetail>();
                Dictionary<string,string> keyValuePairs =new Dictionary<string, string>();
                Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
                // å¤„理原始明细并存储到临时列表
                var tempDetails = new List<Dt_ProOutOrderDetail>();
                foreach (var item in outOrderDTO.OrderDetails)
                {
                    //判断客户是否存在
                    Dt_CustomerInfo? customerInfo = customerInfos.Where(x=>x.Code== item.Customer).FirstOrDefault();
                    if (customerInfo==null)
                    // åˆ¤æ–­å®¢æˆ·æ˜¯å¦å­˜åœ¨
                    Dt_CustomerInfo? customerInfo = customerInfos.FirstOrDefault(x => x.Code == item.Customer);
                    if (customerInfo == null)
                    {
                        return content.Error($"客户{item.Customer}不存在!");
                    }
                    Dt_ProOutOrderDetail proOutOrderDetail = _mapper.Map<Dt_ProOutOrderDetail>(item);
                    if (!string.IsNullOrEmpty(item.SaleOrder))
                    {
                        if (keyValuePairs!=null && keyValuePairs.ContainsKey(item.SaleOrder))
                        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)
                            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();
                            // åˆ¤æ–­ç»ˆç«¯å®¢æˆ·æ˜¯å¦å­˜åœ¨
                            Dt_CustomerInfo? customerInfoEnd = customerInfos.FirstOrDefault(x => x.Code == responseContent.Data[0].Endcustomer);
                            if (customerInfoEnd == null)
                            {
                                return content.Error($"终端客户{responseContent.Data[0].Endcustomer}不存在!");
                            }
                            proOutOrderDetail.EndCustomer = responseContent.Data[0].Endcustomer;
                            keyValuePairs.Add(item.SaleOrder, responseContent.Data[0].Endcustomer);
                        }
                    }
                    // å…ˆç´¯åŠ å½“å‰æ˜Žç»†çš„æ•°é‡ï¼ˆåŒ…å«å¤‡å“ï¼‰
                    proOutOrderDetail.QtyPcs += proOutOrderDetail.SpareQty;
                    proOutOrderDetails.Add(proOutOrderDetail);
                    tempDetails.Add(proOutOrderDetail);
                }
                Dt_ProOutOrder  proOutOrder= new Dt_ProOutOrder()
                // æŒ‰æ¡ä»¶åˆ†ç»„并合并明细
                var groupedDetails = tempDetails.GroupBy(detail => new
                {
                    ProOutOrderNo= outOrderDTO.OrderNo,
                    WarehouseId= warehouse.WarehouseId,
                    ProOrderType= outOrderDTO.OType,
                    ProOrderStatus=OutOrderStatusEnum.未开始.ObjToInt(),
                    PlantShipDate= outOrderDTO.PlantShipDate.ObjToDate(),
                    Remark= outOrderDTO.Note,
                    Details= proOutOrderDetails
                    detail.PCode,
                    detail.PVer,
                    detail.PLot,
                    detail.DateCode,
                })
                .Select(group =>
                {
                    // å–分组中第一个明细作为基础
                    var firstDetail = group.First();
                    return new Dt_ProOutOrderDetail
                    {
                        // å¤åˆ¶åŸºç¡€ä¿¡æ¯
                        PCode = firstDetail.PCode,
                        PVer = firstDetail.PVer,
                        PLot = firstDetail.PLot,
                        DateCode = firstDetail.DateCode,
                        EndCustomer = firstDetail.EndCustomer,
                        QtyPcs = group.Sum(d => d.QtyPcs),
                        // ç´¯åŠ å¤‡å“æ•°
                        SpareQty = group.Sum(d => d.SpareQty)
                    };
                });
                proOutOrderDetails.AddRange(groupedDetails);
                Dt_ProOutOrder proOutOrder = new Dt_ProOutOrder()
                {
                    ProOutOrderNo = outOrderDTO.OrderNo,
                    WarehouseId = warehouse.WarehouseId,
                    ProOrderType = outOrderDTO.OType,
                    ProOrderStatus = OutOrderStatusEnum.未开始.ObjToInt(),
                    PlantShipDate = outOrderDTO.PlantShipDate.ObjToDate(),
                    Remark = outOrderDTO.Note,
                    Details = proOutOrderDetails
                };
                Db.InsertNav(proOutOrder).Include(x => x.Details).ExecuteCommand();
                content.OK("成功");
            }
@@ -764,19 +806,14 @@
                .Select((master, detail) => detail)
                .ToList();
                proStockInfoDetails = proStockInfoDetails.OrderBy(x => x.DateCode).ThenBy(x => x.CreateDate).ToList();
                List<int> stockIds = proStockInfoDetails.Select(x => x.ProStockId).Distinct().ToList();
                //获取所有平库主表
                List<Dt_ProStockInfo> proStockInfos = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => stockIds.Contains(x.Id)).Includes(x => x.proStockInfoDetails).ToList();
                List<Dt_ProStockInfo> delProStockInfos = new List<Dt_ProStockInfo>();
                List<Dt_ProStockInfoDetail> delStockInfoDetails = new List<Dt_ProStockInfoDetail>();
                foreach (var item in outProStocks)
                {
                    //获取库存
                    List<Dt_ProStockInfoDetail> outStocks = proStockInfoDetails.Where(x=>x.ProductCode==item.Partnum).ToList();
                    if (outStocks.Count==0 || outStocks==null)
                    {
                        return content.Error($"{item.Partnum}产品型号库存不存在");
                    }
                    foreach (var itemOut in outStocks)
                    foreach (var itemOut in proStockInfoDetails.Where(x => x.ProductCode == item.Partnum).ToList())
                    {
                        if (item.Quantity==0)
                        {
@@ -808,10 +845,20 @@
                            
                            //更新出库明细单数量
                            proOutOrderDetail.OverQtyPcs += item.Quantity;
                            item.Quantity -= item.Quantity;
                            float Range = itemOut.StockPcsQty / itemOut.SETQty;
                            itemOut.SETQty = item.Quantity / Range;
                            int Range = (int)itemOut.StockPcsQty / (int)itemOut.SETQty;
                            if (Range == 0)
                            {
                                return content.Error($"{itemOut.BagNo}单元数量转换失败,请检查,Range:{Range}");
                            }
                            int outSet =item.Quantity / Range;
                            if (outSet == 0)
                            {
                                return content.Error($"{itemOut.BagNo}单元数量转换失败,请检查,outSet:{outSet}");
                            }
                            itemOut.SETQty -= outSet;
                            itemOut.StockPcsQty -= item.Quantity;
                            item.Quantity = 0;
                            if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs)
                            {
                                return content.Error($"出库单{proOutOrder.ProOutOrderNo}销售订单{item.SoNumber}数量溢出{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}");
@@ -826,6 +873,10 @@
                            }
                        }
                    }
                    if (item.Quantity>0)
                    {
                        return content.Error($"未找到{item.SoNumber}可扣减库存");
                    }
                }
                if (proOutOrder.Details.Count == proOutOrder.Details.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count())
                {
@@ -836,12 +887,22 @@
                    Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.ProOrderDetailStatus <= OrderDetailStatusEnum.Over.ObjToInt());
                    return content.Error($"{proOutOrderDetail?.SaleOrder}销售订单数量需出{proOutOrderDetail?.QtyPcs},可出{proOutOrderDetail?.OverQtyPcs}");
                }
                //获取删除的库存主表
                List<int> delStockIds = delStockInfoDetails.Select(x => x.ProStockId).Distinct().ToList();
                List<int> delStockDetailIds = delStockInfoDetails.Select(x => x.Id).ToList();
                foreach (var item in delStockIds)
                {
                    Dt_ProStockInfo proStockInfo = proStockInfos.FirstOrDefault(x => x.Id == item);
                    Dt_ProStockInfoDetail? proStockInfoDetail = proStockInfo.proStockInfoDetails.FirstOrDefault(x => !delStockDetailIds.Contains(x.Id));
                    if (proStockInfoDetail == null)
                    {
                        delProStockInfos.Add(proStockInfo);
                    }
                }
                //更新数据
                _unitOfWorkManage.BeginTran();
                if (delStockInfoDetails.Count > 0)
                {
                    _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(delStockInfoDetails, OperateTypeEnum.自动删除);
                }
                _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(delStockInfoDetails, OperateTypeEnum.自动删除);
                _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(delProStockInfos, OperateTypeEnum.自动完成);
                _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfoDetails);
                BaseDal.UpdateData(proOutOrder);
                _outboundRepository.ProOutOrderDetailRepository.UpdateData(proOutOrder.Details);