wangxinhui
昨天 011ca316e6ec2ed93e31c45a9ebd9d3c66664871
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundService/ProDeliveryOrderService.cs
@@ -4,7 +4,13 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.MaterielEnum;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.ERP;
using WIDESEA_IBasicRepository;
using WIDESEA_IOutboundRepository;
using WIDESEA_IOutboundService;
@@ -17,10 +23,197 @@
        public IProDeliveryOrderRepository Repository => BaseDal;
        private readonly IBasicRepository _basicRepository;
        private readonly IMapper _mapper;
        public ProDeliveryOrderService(IProDeliveryOrderRepository BaseDal, IBasicRepository basicRepository, IMapper mapper) : base(BaseDal)
        private readonly IProDeliveryOrderDetailRepository _proDeliveryOrderDetailRepository;
        public ProDeliveryOrderService(IProDeliveryOrderRepository BaseDal, IBasicRepository basicRepository, IMapper mapper, IProDeliveryOrderDetailRepository proDeliveryOrderDetailRepository) : base(BaseDal)
        {
            _basicRepository = basicRepository;
            _mapper = mapper;
            _proDeliveryOrderDetailRepository = proDeliveryOrderDetailRepository;
        }
        /// <summary>
        /// æŽ¥æ”¶ERP成品销售出库信息
        /// </summary>
        /// <returns></returns>
        public WebResponseContent ReceiveProDeliveryOrder(ERPProDeliveryDTO eRPProDeliveryDTO)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (eRPProDeliveryDTO == null)
                {
                    return content.Error("销售出库信息不能为空");
                }
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == eRPProDeliveryDTO.WarehouseCode);
                if (warehouse == null)
                {
                    return content.Error($"仓库信息不存在{eRPProDeliveryDTO.WarehouseCode}");
                }
                //获取所有物料
                List<Dt_MaterielInfo> materielInfos = _basicRepository.MaterielInfoRepository.QueryData(x => x.WarehouseId == warehouse.WarehouseId && x.MaterielInvOrgId == MaterielInvOrgEnum.新厂.ObjToInt());
                //获取所有客户
                List<Dt_CustomerInfo> customerInfos = _basicRepository.CustomerInfoRepository.QueryData();
                //判断是否存在物料
                DeliveryDetailItem? deliveryDetailItem = eRPProDeliveryDTO.DeliveryDetail.FirstOrDefault(x => !materielInfos.Select(x => x.MaterielCode).Contains(x.MaterialCode));
                if (deliveryDetailItem != null)
                {
                    return content.Error($"物料信息{deliveryDetailItem.MaterialCode}不存在");
                }
                //判断是否存在客户
                DeliveryDetailItem? deliveryDetailCustom = eRPProDeliveryDTO.DeliveryDetail.FirstOrDefault(x => !customerInfos.Select(x => x.CustomerCode).Contains(x.Customer));
                if (deliveryDetailCustom != null)
                {
                    return content.Error($"客户信息{deliveryDetailCustom.Customer}不存在");
                }
                //获取所有销售出库信息
                List<Dt_ProDeliveryOrder> proDeliveryOrdersOld = BaseDal.Db.Queryable<Dt_ProDeliveryOrder>().Includes(x => x.Details).ToList();
                if (eRPProDeliveryDTO.OperateType == 1)
                {
                    //判断重复插入
                    Dt_ProDeliveryOrder? proDeliveryOrderOld = proDeliveryOrdersOld.FirstOrDefault(x => x.DeliveryCode == eRPProDeliveryDTO.DeliveryCode);
                    if (proDeliveryOrderOld != null)
                    {
                        return content.Error($"销售出库单号{proDeliveryOrderOld.DeliveryCode}信息已存在");
                    }
                    List<Dt_ProDeliveryOrderDetail> proDeliveryOrderDetails = eRPProDeliveryDTO.DeliveryDetail.Select(x => _mapper.Map<Dt_ProDeliveryOrderDetail>(x)).ToList();
                    Dt_ProDeliveryOrder proDeliveryOrderAdd = _mapper.Map<Dt_ProDeliveryOrder>(eRPProDeliveryDTO);
                    proDeliveryOrderDetails.ForEach(x =>
                    {
                        Dt_MaterielInfo? materielInfo = materielInfos.FirstOrDefault(t => t.MaterielCode == x.MaterialCode);
                        x.MaterielName = materielInfo?.MaterielName;
                        x.Unit = materielInfo?.MaterielUnit;
                    });
                    proDeliveryOrderAdd.Details = proDeliveryOrderDetails;
                    proDeliveryOrderAdd.WarehouseId = warehouse.WarehouseId;
                    //新增
                    BaseDal.Db.InsertNav(proDeliveryOrderAdd).Include(x => x.Details).ExecuteCommand();
                }
                else if (eRPProDeliveryDTO.OperateType == 2)
                {
                    //判断是否存在
                    Dt_ProDeliveryOrder? proDeliveryOrderOld = proDeliveryOrdersOld.FirstOrDefault(x => x.DeliveryCode == eRPProDeliveryDTO.DeliveryCode);
                    if (proDeliveryOrderOld == null)
                    {
                        return content.Error($"销售出库单号{eRPProDeliveryDTO.DeliveryCode}信息不存在");
                    }
                    if (proDeliveryOrderOld.ProDeliveryStatus != OutOrderStatusEnum.未开始.ObjToInt())
                    {
                        return content.Error($"销售出库单号{proDeliveryOrderOld.DeliveryCode}状态为{(OutOrderStatusEnum)proDeliveryOrderOld.ProDeliveryStatus}");
                    }
                    List<Dt_ProDeliveryOrderDetail> proDeliveryOrderDetails = eRPProDeliveryDTO.DeliveryDetail.Select(x => _mapper.Map<Dt_ProDeliveryOrderDetail>(x)).ToList();
                    Dt_ProDeliveryOrder proDeliveryOrder = _mapper.Map<Dt_ProDeliveryOrder>(eRPProDeliveryDTO);
                    proDeliveryOrder.Id = proDeliveryOrderOld.Id;
                    proDeliveryOrderDetails.ForEach(x =>
                    {
                        Dt_MaterielInfo? materielInfo = materielInfos.FirstOrDefault(t => t.MaterielCode == x.MaterialCode);
                        x.MaterielName = materielInfo?.MaterielName;
                        x.Unit = materielInfo?.MaterielUnit;
                    });
                    proDeliveryOrder.Details = proDeliveryOrderDetails;
                    proDeliveryOrder.WarehouseId = warehouse.WarehouseId;
                    //更新
                    BaseDal.Db.UpdateNav(proDeliveryOrder).Include(x => x.Details).ExecuteCommand();
                }
                else if (eRPProDeliveryDTO.OperateType == 3)
                {
                    //判断是否存在
                    Dt_ProDeliveryOrder? proDeliveryOrderOld = proDeliveryOrdersOld.FirstOrDefault(x => x.DeliveryCode == eRPProDeliveryDTO.DeliveryCode);
                    if (proDeliveryOrderOld == null)
                    {
                        return content.Error($"销售出库单号{eRPProDeliveryDTO.DeliveryCode}信息不存在");
                    }
                    if (proDeliveryOrderOld.ProDeliveryStatus != OutOrderStatusEnum.未开始.ObjToInt())
                    {
                        return content.Error($"销售出库单号{proDeliveryOrderOld.DeliveryCode}状态为{(OutOrderStatusEnum)proDeliveryOrderOld.ProDeliveryStatus}");
                    }
                    //删除
                    BaseDal.Db.DeleteNav(proDeliveryOrderOld).Include(x => x.Details).ExecuteCommand();
                }
                else
                {
                    return content.Error("未找到操作类型");
                }
                //更新数据
                return content.OK("接收成功");
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// ERP成品销售出库分配库存
        /// </summary>
        public (List<Dt_ProStockInfo>, List<Dt_ProDeliveryOrder>, List<Dt_ProDeliveryOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignProStockOutbound(List<Dt_ProDeliveryOrder> proDeliveryOrders,List<Dt_ProDeliveryOrderDetail> deliveryOrderDetails)
        {
            List<Dt_ProStockInfo> outStocks = new List<Dt_ProStockInfo>();
            //出库详情
            List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
            //货位存储
            List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
            //foreach (var item in )
            //{
            //}
            //foreach (var item in deliveryOrderDetails)
            //{
            //    decimal needQuantity = item.ReqQuantity;
            //    //获取可用库存
            //    List<Dt_ProStockInfo> stockInfos = _stockService.ProStockInfoService.GetUseableStocks(item.MaterialCode, WarehouseEnum.LLDCP.ObjToInt()).Where(x => !outStocks.Select(x => x.PalletCode).Contains(x.PalletCode)).ToList();
            //    if (!stockInfos.Any())
            //    {
            //        continue;
            //    }
            //    //分配实际库存
            //    List<Dt_ProStockInfo> autoAssignStocks = _stockService.ProStockInfoService.GetOutboundStocks(stockInfos, needQuantity);
            //    //添加库存分配
            //    outStocks.AddRange(autoAssignStocks);
            //    //订单数量
            //    decimal orderQuantity = item.ReqQuantity;
            //    bool assignStop = true;
            //    while (assignStop)
            //    {
            //        //出库订单明细已分配数量
            //        decimal detailAssignQuantity = outStockLockInfos.Where(x => x.OrderDetailId == item.OutDetailId).Sum(x => x.AssignQuantity);
            //        decimal orderDetailNeedQuantity = item.ReqQuantity - detailAssignQuantity;
            //        decimal useStockLength = autoAssignStocks[0].proStockInfoDetails
            //            .Sum(x => x.StockQty);
            //        if (orderDetailNeedQuantity > useStockLength)
            //        {
            //            //生成详情
            //            Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(item, autoAssignStocks[0], useStockLength);
            //            outStockLockInfos.Add(outStockLockInfo);
            //            item.AssignTotalUsage += useStockLength;
            //            autoAssignStocks.Remove(autoAssignStocks[0]);
            //        }
            //        else
            //        {
            //            //生成详情
            //            Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(item, autoAssignStocks[0], orderDetailNeedQuantity);
            //            outStockLockInfos.Add(outStockLockInfo);
            //            item.AssignTotalUsage = orderQuantity;
            //            autoAssignStocks.Remove(autoAssignStocks[0]);
            //            assignStop = false;
            //        }
            //    }
            //    item.OutMESOrderStatus = OutOrderStatusEnum.出库中.ObjToInt();
            //    locationInfos.AddRange(_basicRepository.LocationInfoRepository.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList()));
            //}
            return (outStocks, proDeliveryOrders, deliveryOrderDetails, outStockLockInfos, locationInfos);
        }
    }
}