using AutoMapper; using System; using System.Collections.Generic; 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; using WIDESEA_Model.Models; namespace WIDESEA_OutboundService { public class ProDeliveryOrderService : ServiceBase, IProDeliveryOrderService { public IProDeliveryOrderRepository Repository => BaseDal; private readonly IBasicRepository _basicRepository; private readonly IMapper _mapper; private readonly IProDeliveryOrderDetailRepository _proDeliveryOrderDetailRepository; public ProDeliveryOrderService(IProDeliveryOrderRepository BaseDal, IBasicRepository basicRepository, IMapper mapper, IProDeliveryOrderDetailRepository proDeliveryOrderDetailRepository) : base(BaseDal) { _basicRepository = basicRepository; _mapper = mapper; _proDeliveryOrderDetailRepository = proDeliveryOrderDetailRepository; } /// /// 接收ERP成品销售出库信息 /// /// 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 materielInfos = _basicRepository.MaterielInfoRepository.QueryData(x => x.WarehouseId == warehouse.WarehouseId && x.MaterielInvOrgId == MaterielInvOrgEnum.新厂.ObjToInt()); //获取所有客户 List 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 proDeliveryOrdersOld = BaseDal.Db.Queryable().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 proDeliveryOrderDetails = eRPProDeliveryDTO.DeliveryDetail.Select(x => _mapper.Map(x)).ToList(); Dt_ProDeliveryOrder proDeliveryOrderAdd = _mapper.Map(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 proDeliveryOrderDetails = eRPProDeliveryDTO.DeliveryDetail.Select(x => _mapper.Map(x)).ToList(); Dt_ProDeliveryOrder proDeliveryOrder = _mapper.Map(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; } /// /// ERP成品销售出库分配库存 /// public (List, List, List, List, List) AssignProStockOutbound(List proDeliveryOrders,List deliveryOrderDetails) { List outStocks = new List(); //出库详情 List outStockLockInfos = new List(); //货位存储 List locationInfos = new List(); //foreach (var item in ) //{ //} //foreach (var item in deliveryOrderDetails) //{ // decimal needQuantity = item.ReqQuantity; // //获取可用库存 // List 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 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); } } }