1
dengjunjie
2025-05-08 092971a8ba7848f024427694c642959d0fbc8599
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/Base/OutboundOrderDetailService.cs
@@ -1,5 +1,6 @@
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
@@ -35,7 +36,7 @@
        public IOutboundOrderDetailRepository Repository => BaseDal;
        public OutboundOrderDetailService(IOutboundOrderDetailRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockService stockService, IBasicService basicService,  IRecordService recordService, IOutboundRepository outboundRepository, IOutStockLockInfoService outStockLockInfoService) : base(BaseDal)
        public OutboundOrderDetailService(IOutboundOrderDetailRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockService stockService, IBasicService basicService, IRecordService recordService, IOutboundRepository outboundRepository, IOutStockLockInfoService outStockLockInfoService) : base(BaseDal)
        {
            _unitOfWorkManage = unitOfWorkManage;
            _stockService = stockService;
@@ -44,5 +45,126 @@
            _outboundRepository = outboundRepository;
            _outStockLockInfoService = outStockLockInfoService;
        }
        public (List<Dt_StockInfo>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>, Dt_OutboundOrder) AssignStockOutbound(Dt_OutboundOrderDetail outboundOrderDetail)
        {
            Dt_OutboundOrder outboundOrder = _outboundRepository.OutboundOrderRepository.QueryFirst(x => x.Id == outboundOrderDetail.OrderId);
            List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>();
            List<string> LocationCodes = new List<string>();
            List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
            List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
            return (outStocks, outStockLockInfos, locationInfos, outboundOrder);
        }
        public (List<Dt_StockInfo>, List<Dt_OutboundOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>, Dt_OutboundOrder) AssignStockOutbound(List<Dt_OutboundOrderDetail> 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<Dt_StockInfo> outStocks = new List<Dt_StockInfo>();
            List<string> LocationCodes = new List<string>();
            List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
            List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
            List<int> keys = new List<int>();
            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_StockInfo> 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<Dt_StockInfo> 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<Dt_StockInfo> 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_StockInfo> 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);
        }
    }
}