| | |
| | | if (outStockLockInfo != null) |
| | | { |
| | | outStockLockInfo = item; |
| | | Dt_Task? task = tasks.FirstOrDefault(x => x.PalletCode == item.PalletCode); |
| | | if (task != null) |
| | | { |
| | | outStockLockInfo.TaskNum = task.TaskNum; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | Dt_Task? task = tasks.FirstOrDefault(x => x.PalletCode == item.PalletCode); |
| | | if (task != null) |
| | | { |
| | | item.TaskNum = task.TaskNum; |
| | | } |
| | | materielCalc.OutStockLockInfos.Add(item); |
| | | } |
| | | outStockLockInfos.Add(item); |
| | | } |
| | | |
| | | tasks.AddRange(materielPickedDetails.Tasks); |
| | | foreach (var item in materielPickedDetails.Tasks) |
| | | { |
| | | Dt_Task? task = tasks.FirstOrDefault(x => x.PalletCode == item.PalletCode); |
| | | if (task == null) |
| | | { |
| | | tasks.Add(item); |
| | | } |
| | | } |
| | | |
| | | pickedDetails.AddRange(materielPickedDetails.PickedDetails); |
| | | |
| | |
| | | decimal availableQuantity = availableStockMap.GetValueOrDefault(stock.Id, 0); |
| | | if (availableQuantity <= 0) continue; |
| | | |
| | | // 计ç®è¯¥æçå¯åé
æ°é |
| | | decimal allocateQuantity = Math.Min(remainingQuantity, availableQuantity); |
| | | (decimal ActualAllocatedQuantity, List<Dt_OutStockLockInfo> LockInfoList) actualAllocated = AllocateStockQuantity(stock, allocateQuantity, availableQuantity, outboundOrder, firstDetail, request, lockStockMap.GetValueOrDefault(stock.Id, new List<Dt_OutStockLockInfo>()), stockDetailMap); |
| | | |
| | | // æ¬æ¬¡åé
çæ°é |
| | | decimal actualAllocatedQuantity = actualAllocated.ActualAllocatedQuantity; |
| | | |
| | | if (actualAllocatedQuantity > 0) |
| | |
| | | // è®¡ç®æ»åºåæ°é |
| | | decimal totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity); |
| | | |
| | | List<Dt_OutStockLockInfo> outStockLockInfos = allocatedData.Where(x => x.StockId == stockInfo.Id).ToList(); |
| | | List<Dt_OutStockLockInfo> outStockLockInfos = allocatedData.Where(x => x.StockId == stockInfo.Id && x.MaterielCode == materielCalc.MaterielCode).ToList(); |
| | | |
| | | // 计ç®å·²åé
æ°é |
| | | decimal allocatedQuantity = outStockLockInfos.Sum(x => x.AllocatedQuantity); |
| | |
| | | |
| | | lockStockMap[stockInfo.Id] = outStockLockInfos; |
| | | } |
| | | |
| | | |
| | | return (availableStockMap, lockStockMap); |
| | | } |
| | |
| | | |
| | | // æ´æ°åé
åºåºé |
| | | decimal beforeAssignQuantity = totalAllocatedQuantity; // æ¬æ¬¡åé
åçæ»ç´¯è®¡é |
| | | lockInfo.AssignQuantity += actualAllocatedQuantity; // ç´¯å æ¬æ¬¡åé
æ°é |
| | | lockInfo.AssignQuantity += actualAllocatedQuantity; // æ¬æ¬¡åé
æ°é |
| | | lockInfo.AllocatedQuantity = beforeAssignQuantity; // è®°å½æ¬æ¬¡åé
åçæ»ç´¯è®¡é |
| | | |
| | | lockInfoList.Add(lockInfo); |
| | |
| | | return WebResponseContent.Instance.Error($"åºåºå {request.OrderNo} ä¸åå¨"); |
| | | } |
| | | |
| | | // 5. æ¥æ¾åºåºåæç»ä¿¡æ¯ |
| | | List<Dt_OutboundOrderDetail> outboundOrderDetails = FindMatchingOutboundDetails(outboundOrder.Id, stockDetail); |
| | | if (!outboundOrderDetails.Any()) |
| | | { |
| | | response.Success = false; |
| | | response.Message = $"æªæ¾å°å¹é
çåºåºåæç»ï¼ç©æï¼{stockDetail.MaterielCode}ï¼æ¹æ¬¡ï¼{stockDetail.BatchNo}"; |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°å¹é
çåºåºåæç»ï¼ç©æï¼{stockDetail.MaterielCode}ï¼æ¹æ¬¡ï¼{stockDetail.BatchNo}"); |
| | | } |
| | | |
| | | // 6. æ¥æ¾éå®è®°å½ |
| | | // 5. æ¥æ¾éå®è®°å½ |
| | | Dt_OutStockLockInfo lockInfo = _outboundLockInfoService.Repository.QueryFirst(x => |
| | | x.OrderNo == request.OrderNo && |
| | | x.StockId == stockInfo.Id && |
| | |
| | | response.Success = false; |
| | | response.Message = $"该åºå没æåé
åºåºéï¼æ¡ç ï¼{request.Barcode}"; |
| | | return WebResponseContent.Instance.Error($"该åºå没æåé
åºåºéï¼æ¡ç ï¼{request.Barcode}"); |
| | | } |
| | | |
| | | // æ¾åºå·²åé
ç订åæç»Id |
| | | List<int> detailIds = new List<int>(); |
| | | string[] ids = lockInfo.OrderDetailIds.Split(","); |
| | | foreach (string id in ids) |
| | | { |
| | | if(int.TryParse(id, out int detailId)) |
| | | { |
| | | detailIds.Add(detailId); |
| | | } |
| | | } |
| | | // 6. æ¥æ¾åºåºåæç»ä¿¡æ¯ |
| | | List<Dt_OutboundOrderDetail> outboundOrderDetails = FindMatchingOutboundDetails(outboundOrder.Id, stockDetail, detailIds); |
| | | if (!outboundOrderDetails.Any()) |
| | | { |
| | | response.Success = false; |
| | | response.Message = $"æªæ¾å°å¹é
çåºåºåæç»ï¼ç©æï¼{stockDetail.MaterielCode}ï¼æ¹æ¬¡ï¼{stockDetail.BatchNo}"; |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°å¹é
çåºåºåæç»ï¼ç©æï¼{stockDetail.MaterielCode}ï¼æ¹æ¬¡ï¼{stockDetail.BatchNo}"); |
| | | } |
| | | |
| | | // 7. 计ç®å®é
åºåºé |
| | |
| | | response.Success = false; |
| | | response.Message = $"æ æ³åºåºï¼æ¡ç ï¼{request.Barcode}ï¼åºåï¼{stockDetail.StockQuantity}ï¼å·²åºåºï¼{totalAllocatedQuantity}ï¼åé
éï¼{lockInfo.AssignQuantity}ï¼æç»å©ä½ï¼{detailRemainingQuantity}"; |
| | | return WebResponseContent.Instance.Error($"æ æ³åºåºï¼æ¡ç ï¼{request.Barcode}ï¼åºåï¼{stockDetail.StockQuantity}ï¼å·²åºåºï¼{totalAllocatedQuantity}ï¼åé
éï¼{lockInfo.AssignQuantity}ï¼æç»å©ä½ï¼{detailRemainingQuantity}"); |
| | | } |
| | | |
| | | if(actualOutboundQuantity + lockInfo.SortedQuantity > lockInfo.AssignQuantity) |
| | | { |
| | | response.Success = false; |
| | | response.Message = $"æ æ³åºåºï¼æ¡ç ï¼{request.Barcode}ï¼åºåï¼{stockDetail.StockQuantity}ï¼åºåºé{actualOutboundQuantity + lockInfo.SortedQuantity}大äºåé
é{lockInfo.AssignQuantity}"; |
| | | return WebResponseContent.Instance.Error($"æ æ³åºåºï¼æ¡ç ï¼{request.Barcode}ï¼åºåï¼{stockDetail.StockQuantity}ï¼åºåºé{actualOutboundQuantity + lockInfo.SortedQuantity}大äºåé
é{lockInfo.AssignQuantity}"); |
| | | } |
| | | |
| | | // 8. 夿æ¯å¦éè¦æå
ï¼å½åºåºæ°éå°äºåºåæ°éæ¶éè¦æå
ï¼ |
| | |
| | | _detailService.Repository.UpdateData(updateDetails); |
| | | |
| | | // æ´æ°éå®è®°å½ç累计已åºåºæ°éï¼éè¦æ´æ°è¯¥æçè¯¥ç©æçææç¸å
³è®°å½ï¼ |
| | | UpdateLockInfoAllocatedQuantity(stockInfo.Id, stockDetail.MaterielCode, stockDetail.BatchNo, actualOutboundQuantity); |
| | | //UpdateLockInfoAllocatedQuantity(stockInfo.Id, stockDetail.MaterielCode, stockDetail.BatchNo, actualOutboundQuantity); |
| | | |
| | | // æäº¤äºå¡ |
| | | _unitOfWorkManage.CommitTran(); |
| | |
| | | if (CheckOutboundOrderCompleted(request.OrderNo)) |
| | | { |
| | | UpdateOutboundOrderStatus(request.OrderNo, OutOrderStatusEnum.åºåºå®æ.ObjToInt()); |
| | | |
| | | //todo: åä¼ MES |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | |
| | | /// <param name="orderId"></param> |
| | | /// <param name="stockDetail"></param> |
| | | /// <returns></returns> |
| | | private List<Dt_OutboundOrderDetail> FindMatchingOutboundDetails(int orderId, Dt_StockInfoDetail stockDetail) |
| | | private List<Dt_OutboundOrderDetail> FindMatchingOutboundDetails(int orderId, Dt_StockInfoDetail stockDetail, List<int> detailIds) |
| | | { |
| | | List<Dt_OutboundOrderDetail> details = _detailService.Repository.QueryData(x => |
| | | x.OrderId == orderId && |
| | | x.MaterielCode == stockDetail.MaterielCode && x.OrderQuantity - x.MoveQty > x.OverOutQuantity); |
| | | x.MaterielCode == stockDetail.MaterielCode && x.OrderQuantity - x.MoveQty > x.OverOutQuantity && detailIds.Contains(x.Id)); |
| | | |
| | | // 精确å¹é
ï¼å¤çnullå¼çæ¹æ¬¡ãä¾åºåãä»åº |
| | | List<Dt_OutboundOrderDetail> exactMatches = details.Where(x => |
| | |
| | | { |
| | | // æ´æ°ååºåæç» |
| | | stockDetail.StockQuantity = remainingQuantity; |
| | | //stockDetail.Barcode = newBarcode; |
| | | stockDetail.Remark = $"æå
åæ´æ°ï¼åæ¡ç ï¼{request.Barcode}ï¼æ°æ°éï¼{remainingQuantity}ï¼æä½è
ï¼{request.Operator}"; |
| | | _stockDetailService.Repository.UpdateData(stockDetail); |
| | | } |