using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_DTO.Stock; using WIDESEA_IBasicRepository; using WIDESEA_IBasicService; using WIDESEA_IOutboundRepository; using WIDESEA_IOutboundService; using WIDESEA_IRecordService; using WIDESEA_IStockRepository; using WIDESEA_IStockService; using WIDESEA_Model.Models; using WIDESEA_StockRepository; namespace WIDESEA_OutboundService { public partial class OutboundOrderDetailService : ServiceBase, IOutboundOrderDetailService { private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IStockService _stockService; private readonly IBasicService _basicService; private readonly IRecordService _recordService; private readonly IOutboundRepository _outboundRepository; private readonly IOutStockLockInfoService _outStockLockInfoService; public IOutboundOrderDetailRepository Repository => BaseDal; public OutboundOrderDetailService(IOutboundOrderDetailRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockService stockService, IBasicService basicService, IRecordService recordService, IOutboundRepository outboundRepository, IOutStockLockInfoService outStockLockInfoService) : base(BaseDal) { _unitOfWorkManage = unitOfWorkManage; _stockService = stockService; _basicService = basicService; _recordService = recordService; _outboundRepository = outboundRepository; _outStockLockInfoService = outStockLockInfoService; } public (List, List, List, Dt_OutboundOrder) AssignStockOutbound(Dt_OutboundOrderDetail outboundOrderDetail) { Dt_OutboundOrder outboundOrder = _outboundRepository.OutboundOrderRepository.QueryFirst(x => x.Id == outboundOrderDetail.OrderId); List outStocks = new List(); List LocationCodes = new List(); List outStockLockInfos = new List(); List locationInfos = new List(); return (outStocks, outStockLockInfos, locationInfos, outboundOrder); } public (List, List, List, List, Dt_OutboundOrder) AssignStockOutbound(List outboundOrderDetails) { if (outboundOrderDetails.GroupBy(x => x.OrderId).Count() > 1) { throw new Exception($"请勿同时操作多个单据明细"); } Dt_OutboundOrder outboundOrder = _outboundRepository.OutboundOrderRepository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().OrderId); List outStocks = new List(); List LocationCodes = new List(); List outStockLockInfos = new List(); List locationInfos = new List(); List keys = new List(); foreach (var item in outboundOrderDetails) { var StockSelectViews = _stockService.StockInfoService.GetStockSelectViews(item.MaterielCode); if (StockSelectViews.Count < 1) throw new Exception($"未找到可分配库存"); StockSelectViews = StockSelectViews.Where(x => !keys.Contains(x.Id)).OrderBy(x => x.InDate).ToList(); if (StockSelectViews.Count < 1) throw new Exception($"可分配库存不足"); foreach (var StockSelectView in StockSelectViews.GroupBy(x => x.LocationCode)) { if (item.OrderQuantity - item.LockQuantity <= 0) break; decimal StockQuantity = StockSelectView.Sum(x => x.UseableQuantity); if (StockQuantity <= item.OrderQuantity - item.LockQuantity) { foreach (var Stock in StockSelectView.OrderByDescending(x => x.InDate)) { keys.Add(Stock.Id); item.LockQuantity += Stock.UseableQuantity; item.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); List dt_StockInfos = _stockService.StockInfoService.Repository.QueryData(x => Stock.PalletCode.Contains(x.PalletCode)); dt_StockInfos.ForEach(x => { x.StockStatus = StockStatusEmun.出库中.ObjToInt(); }); outboundOrder.OrderStatus = OutboundStatusEnum.出库中.ObjToInt(); outStockLockInfos.AddRange(_outStockLockInfoService.GetOutStockLockInfo(outboundOrder, item, dt_StockInfos, BatchNo: Stock.BatchNo)); outStocks.AddRange(dt_StockInfos); } LocationCodes.Add(StockSelectView.Key); } else { foreach (var Stock in StockSelectView.OrderByDescending(x => x.InDate)) { if (item.OrderQuantity - item.LockQuantity - Stock.UseableQuantity >= 0) { keys.Add(Stock.Id); item.LockQuantity += Stock.UseableQuantity; item.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); List StockInfos = _stockService.StockInfoService.Repository.QueryData(x => Stock.PalletCode.Contains(x.PalletCode)); StockInfos.ForEach(x => { x.StockStatus = StockStatusEmun.出库中.ObjToInt(); }); outboundOrder.OrderStatus = OutboundStatusEnum.出库中.ObjToInt(); outStockLockInfos.AddRange(_outStockLockInfoService.GetOutStockLockInfo(outboundOrder, item, StockInfos, BatchNo: Stock.BatchNo)); outStocks.AddRange(StockInfos); LocationCodes.Add(Stock.LocationCode); } } } } #region MyRegion //StockSelectViewDTO? stockSelectView = StockSelectViews.Where(x => x.UseableQuantity == item.OrderQuantity).FirstOrDefault(); //if (stockSelectView == null) //{ // foreach (var StockSelectView in StockSelectViews) // { // if (item.OrderQuantity - item.LockQuantity - StockSelectView.UseableQuantity >= 0) // { // keys.Add(StockSelectView.Id); // item.LockQuantity += StockSelectView.UseableQuantity; // item.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); // List StockInfos = _stockService.StockInfoService.Repository.QueryData(x => StockSelectView.PalletCode.Contains(x.PalletCode)); // StockInfos.ForEach(x => // { // x.StockStatus = StockStatusEmun.出库中.ObjToInt(); // }); // outboundOrder.OrderStatus = OutboundStatusEnum.出库中.ObjToInt(); // outStockLockInfos.AddRange(_outStockLockInfoService.GetOutStockLockInfo(outboundOrder, item, StockInfos, BatchNo: StockSelectView.BatchNo)); // outStocks.AddRange(StockInfos); // LocationCodes.Add(StockSelectView.LocationCode); // } // } // if (keys.Count < 1) throw new Exception($"未找到匹配出库单数量库存"); //} //else //{ // keys.Add(stockSelectView.Id); // item.LockQuantity = stockSelectView.UseableQuantity; // item.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); // List dt_StockInfos = _stockService.StockInfoService.Repository.QueryData(x => stockSelectView.PalletCode.Contains(x.PalletCode)); // dt_StockInfos.ForEach(x => // { // x.StockStatus = StockStatusEmun.出库中.ObjToInt(); // }); // outboundOrder.OrderStatus = OutboundStatusEnum.出库中.ObjToInt(); // outStockLockInfos.AddRange(_outStockLockInfoService.GetOutStockLockInfo(outboundOrder, item, dt_StockInfos, BatchNo: stockSelectView.BatchNo)); // outStocks.AddRange(dt_StockInfos); // LocationCodes.Add(stockSelectView.LocationCode); //} #endregion } locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(LocationCodes)); locationInfos.ForEach(x => { x.LocationStatus = LocationStatusEnum.Outbounding.ObjToInt(); }); return (outStocks, outboundOrderDetails, outStockLockInfos, locationInfos, outboundOrder); } } }