| | |
| | | var outboundOrder = _outboundOrderService.Db.Queryable<Dt_OutboundOrder>() |
| | | .First(x => x.Id == orderId); |
| | | |
| | | if (!CanReassignOrder(outboundOrder)) |
| | | { |
| | | throw new Exception($"订å{outboundOrder.OrderNo}ç¶æä¸å
è®¸éæ°åé
åºå"); |
| | | } |
| | | |
| | | List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>(); |
| | | List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>(); |
| | | List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>(); |
| | |
| | | BatchNo = x.Key.BatchNo, |
| | | SupplyCode = x.Key.SupplyCode, |
| | | Details = x.ToList(), |
| | | TotalNeedQuantity = x.Sum(v => v.OrderQuantity - v.OverOutQuantity - v.LockQuantity - v.MoveQty) |
| | | TotalNeedQuantity = CalculateReassignNeedQuantity(x.ToList()) |
| | | }) |
| | | .Where(x => x.TotalNeedQuantity > 0) |
| | | .ToList(); |
| | |
| | | |
| | | if (!stockInfos.Any()) |
| | | { |
| | | throw new Exception($"ç©æ[{item.MaterielCode}]æ¹æ¬¡[{item.BatchNo}]æªæ¾å°å¯åé
åºå"); |
| | | throw new Exception($"ç©æ[{item.MaterielCode}]æ¹æ¬¡[{item.BatchNo}]ä¾åºå[{item.SupplyCode}]æªæ¾å°å¯åé
åºå"); |
| | | } |
| | | |
| | | // åé
åºåï¼æå
è¿å
åºï¼ |
| | |
| | | } |
| | | |
| | | return (outStocks, outboundOrderDetails, outStockLockInfos, locationInfos); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ£æ¥è®¢åæ¯å¦å
è®¸éæ°åé
|
| | | /// </summary> |
| | | private bool CanReassignOrder(Dt_OutboundOrder outboundOrder) |
| | | { |
| | | // å
è®¸éæ°åé
çç¶æ |
| | | var allowedStatus = new[] {OutOrderStatusEnum.æªå¼å§, OutOrderStatusEnum.åºåºä¸,OutOrderStatusEnum.é¨å宿}; |
| | | |
| | | return allowedStatus.Contains((OutOrderStatusEnum)outboundOrder.OrderStatus); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// éæ°è®¡ç®éæ±æ°éï¼èèéæ°åé
çåºæ¯ï¼ |
| | | /// </summary> |
| | | private decimal CalculateReassignNeedQuantity(List<Dt_OutboundOrderDetail> details) |
| | | { |
| | | decimal totalNeed = 0; |
| | | |
| | | foreach (var detail in details) |
| | | { |
| | | // å
³é®ä¿®æ¹ï¼éæ°åé
æ¶ï¼åªèèæªåºåºçé¨åï¼å¿½ç¥é宿°é |
| | | // å 为é宿°éå¨ååºæ¶å·²ç»è¢«éç½® |
| | | decimal remainingNeed = detail.OrderQuantity - detail.OverOutQuantity - detail.MoveQty; |
| | | |
| | | if (remainingNeed > 0) |
| | | { |
| | | totalNeed += remainingNeed; |
| | | } |
| | | } |
| | | |
| | | return totalNeed; |
| | | } |
| | | private (bool success, string message) DistributeLockQuantityByFIFO( |
| | | List<Dt_OutboundOrderDetail> details, |
| | |
| | | /// <summary> |
| | | /// ä¸ºåæ¹åé
åºå |
| | | /// </summary> |
| | | public async Task<(List<Dt_StockInfo>, List<Dt_OutboundOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>)> |
| | | public async Task<(List<Dt_StockInfo>, List<Dt_OutboundOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>)> |
| | | AssignStockForBatch(Dt_OutboundOrderDetail orderDetail, decimal batchQuantity, string batchNo) |
| | | { |
| | | if (orderDetail == null) |
| | |
| | | foreach (var item in groupDetails) |
| | | { |
| | | var needQuantity = item.TotalNeedQuantity; |
| | | |
| | | |
| | | // è·åå¯ç¨åºåï¼æå
è¿å
åºæåºï¼ |
| | | List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(item.MaterielCode, item.BatchNo, item.SupplyCode); |
| | | if (!stockInfos.Any()) |
| | |
| | | } |
| | | |
| | | // åé
åºåï¼æå
è¿å
åºï¼ |
| | | var (autoAssignStocks, stockAllocations) = _stockService.StockInfoService.GetOutboundStocks (stockInfos, item.MaterielCode, needQuantity, out decimal residueQuantity); |
| | | var (autoAssignStocks, stockAllocations) = _stockService.StockInfoService.GetOutboundStocks(stockInfos, item.MaterielCode, needQuantity, out decimal residueQuantity); |
| | | |
| | | // æ£æ¥åé
ç»æ |
| | | decimal allocatedQuantity = needQuantity - residueQuantity; |
| | |
| | | locationInfos.AddRange(_locationInfoService.GetLocationInfos( |
| | | outStocks.Select(x => x.LocationCode).Distinct().ToList())); |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | return (outStocks, groupDetails.SelectMany(x => x.Details).ToList(), outStockLockInfos, locationInfos); |
| | |
| | | { |
| | | return (false, $"åºåæç»ID[{stockDetail.Id}]çæ¡ç 为空"); |
| | | } |
| | | |
| | | |
| | | |
| | | // å建åºåºéå®ä¿¡æ¯ |
| | | var lockInfo = _outStockLockInfoService.GetOutStockLockInfo( |
| | | outboundOrder, detail, stockInfo, assignQuantity, stockDetail.Barcode,batchNo); |
| | | outboundOrder, detail, stockInfo, assignQuantity, stockDetail.Barcode, batchNo); |
| | | outStockLockInfos.Add(lockInfo); |
| | | |
| | | |
| | | // æ´æ°æç»çå·²åé
æ°é |
| | | detail.AllocatedQuantity += assignQuantity; |
| | | remainingAllocate -= assignQuantity; |