using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Core.BaseServices; using WIDESEA_IBasicRepository; using WIDESEA_IBasicService; using WIDESEA_IOutboundRepository; using WIDESEA_IOutboundService; using WIDESEA_IRecordService; using WIDESEA_IStockService; using WIDESEA_Model.Models; using WIDESEA_OutboundRepository; namespace WIDESEA_OutboundService { public class MesPPOutboundOrderService : ServiceBase, IMesPPOutboundOrderService { private readonly IBasicRepository _basicRepository; private readonly IStockService _stockService; private readonly IOutStockLockInfoService _outStockLockInfoService; private readonly IBasicService _basicService; private readonly IRecordService _recordService; public IMesPPOutboundOrderRepository Repository => BaseDal; public MesPPOutboundOrderService(IMesPPOutboundOrderRepository BaseDal, IBasicRepository basicRepository, IStockService stockService, IOutStockLockInfoService outStockLockInfoService, IBasicService basicService, IRecordService recordService) : base(BaseDal) { _basicRepository = basicRepository; _stockService = stockService; _outStockLockInfoService = outStockLockInfoService; _basicService = basicService; _recordService = recordService; } //public (List, Dt_MesPPOutboundOrder, List, List) AssignStockOutbound(Dt_MesPPOutboundOrder mesPPOutboundOrder) //{ // List outStocks = new List(); // List outStockLockInfos = new List(); // List locationInfos = new List(); // float originalNeedQuantity = mesPPOutboundOrder.OrderQuantity; // float needQuantity = originalNeedQuantity; // List stockInfos = _stockService.StockInfoService.GetUseableStocks(mesPPOutboundOrder.MaterialCode, "", mesPPOutboundOrder.Details.FirstOrDefault()?.CarrierCode ?? "",mesPPOutboundOrder.WarehouseId); // if (!stockInfos.Any()) // { // throw new Exception($"未找到可分配库存"); // } // List autoAssignStocks = _stockService.StockInfoService.GetOutboundStocks(stockInfos, mesPPOutboundOrder.MaterialCode, needQuantity, out float residueQuantity); // mesPPOutboundOrder.LockQuantity += needQuantity - residueQuantity; // outStocks.AddRange(autoAssignStocks); // float assignQuantity = needQuantity - residueQuantity; // float orderQuantity = mesPPOutboundOrder.OrderQuantity; // for (int j = 0; j < autoAssignStocks.Count; j++) // { // float detailAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == mesPPOutboundOrder.MaterialCode).Sum(x => x.AssignQuantity);//出库订单明细已分配数量 // float palletAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == mesPPOutboundOrder.MaterialCode && x.PalletCode == autoAssignStocks[j].PalletCode).Sum(x => x.AssignQuantity);//出库详情已分配数量 // float palletOutboundQuantity = autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity); // if (palletAssignQuantity < palletOutboundQuantity)//如果出库详情已分配数量小于托盘已分配数量,则可以继续添加该托盘出库信息 // { // float orderDetailNeedQuantity = mesPPOutboundOrder.OrderQuantity - detailAssignQuantity; // if (orderDetailNeedQuantity > autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity) // { // mesPPOutboundOrder.LockQuantity += autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity; // Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(mesPPOutboundOrder, autoAssignStocks[j], autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity); // outStockLockInfos.Add(outStockLockInfo); // } // else // { // Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(mesPPOutboundOrder, autoAssignStocks[j], mesPPOutboundOrder.OrderQuantity - mesPPOutboundOrder.LockQuantity); // outStockLockInfos.Add(outStockLockInfo); // mesPPOutboundOrder.LockQuantity = mesPPOutboundOrder.OrderQuantity; // break; // } // } // } // locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList())); // return (outStocks, mesPPOutboundOrder, outStockLockInfos, locationInfos); //} //public (List, Dt_MesPPCutOutboundOrderDetail, List, List) AssignStockOutbound(Dt_MesPPCutOutboundOrder mesPPOutboundOrder, Dt_MesPPCutOutboundOrderDetail mesPPCutOutboundOrderDetail) //{ // List outStocks = new List(); // List outStockLockInfos = new List(); // List locationInfos = new List(); // //Dt_MesPPCutOutboundOrder outboundOrder = BaseDal.Db.Queryable().Where(x=>x.Id==mesPPOutboundOrder.OrderId).First(); // float originalNeedQuantity = mesPPCutOutboundOrderDetail.OrderQuantity; // float needQuantity = originalNeedQuantity; // List stockInfos = _stockService.StockInfoService.GetUseableStocks(mesPPCutOutboundOrderDetail.MaterielCode, "", mesPPOutboundOrder.WarehouseId); // if (!stockInfos.Any()) // { // throw new Exception($"未找到可分配库存"); // } // List autoAssignStocks = _stockService.StockInfoService.GetOutboundStocks(stockInfos, mesPPCutOutboundOrderDetail.MaterielCode, needQuantity, out float residueQuantity); // mesPPCutOutboundOrderDetail.LockQuantity += needQuantity - residueQuantity; // outStocks.AddRange(autoAssignStocks); // float assignQuantity = needQuantity - residueQuantity; // float orderQuantity = mesPPCutOutboundOrderDetail.OrderQuantity; // for (int j = 0; j < autoAssignStocks.Count; j++) // { // float detailAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == mesPPCutOutboundOrderDetail.MaterielCode).Sum(x => x.AssignQuantity);//出库订单明细已分配数量 // float palletAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == mesPPCutOutboundOrderDetail.MaterielCode && x.PalletCode == autoAssignStocks[j].PalletCode).Sum(x => x.AssignQuantity);//出库详情已分配数量 // float palletOutboundQuantity = autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity); // if (palletAssignQuantity < palletOutboundQuantity)//如果出库详情已分配数量小于托盘已分配数量,则可以继续添加该托盘出库信息 // { // float orderDetailNeedQuantity = mesPPCutOutboundOrderDetail.OrderQuantity - detailAssignQuantity; // if (orderDetailNeedQuantity > autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity) // { // mesPPCutOutboundOrderDetail.LockQuantity += autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity; // Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(mesPPOutboundOrder, mesPPCutOutboundOrderDetail, autoAssignStocks[j], autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity); // outStockLockInfos.Add(outStockLockInfo); // } // else // { // Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(mesPPOutboundOrder, mesPPCutOutboundOrderDetail, autoAssignStocks[j], mesPPCutOutboundOrderDetail.OrderQuantity - mesPPCutOutboundOrderDetail.LockQuantity); // outStockLockInfos.Add(outStockLockInfo); // mesPPCutOutboundOrderDetail.LockQuantity = mesPPCutOutboundOrderDetail.OrderQuantity; // break; // } // } // } // locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList())); // return (outStocks, mesPPCutOutboundOrderDetail, outStockLockInfos, locationInfos); //} } }