| | |
| | | |
| | | if (lockInfo != null && lockInfo.SortedQuantity != lockInfo.AssignQuantity) |
| | | { |
| | | return content.Error($"æç{palletCode}åºåï¼å¨åæ®{lockInfo.OrderNo}éé¢è¿æªæ£é宿ï¼ä¸å
许ååº"); |
| | | // 1. 计ç®éè¦åæ»çæ»æ°é |
| | | decimal? rollbackTotalQuantity = lockInfo.AssignQuantity - lockInfo.SortedQuantity; |
| | | // ç¡®ä¿åæ»æ°éä¸ºæ£æ° |
| | | if (rollbackTotalQuantity <= 0) |
| | | { |
| | | // 没æéè¦åæ»çæ°é |
| | | stock.StockStatus = (int)StockStatusEmun.å
¥åºç¡®è®¤; |
| | | stock.LocationCode = ""; |
| | | } |
| | | |
| | | try |
| | | { |
| | | //å¤çOrderDetailIdsï¼åå²å¹¶è½¬æ¢ä¸ºIDå表 |
| | | List<long> orderDetailIds = new List<long>(); |
| | | if (!string.IsNullOrEmpty(lockInfo.OrderDetailIds)) |
| | | { |
| | | orderDetailIds = lockInfo.OrderDetailIds.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) |
| | | .Select(id => |
| | | { |
| | | if (long.TryParse(id.Trim(), out long result)) |
| | | { |
| | | return result; |
| | | } |
| | | return 0; // æ æIDæ 记为0 |
| | | }) |
| | | .Where(id => id > 0) |
| | | .OrderByDescending(id => id) |
| | | .ToList(); |
| | | } |
| | | |
| | | if (orderDetailIds.Count == 0) |
| | | { |
| | | return WebResponseContent.Instance.Error("åæ®éå®åºåºåæç»Idæ æï¼æ£æ¥éå®åºåºæ°æ®æ¯å¦æ£ç¡®"); |
| | | } |
| | | |
| | | //æ¥è¯¢å¯¹åºç订åæç» |
| | | List<Dt_OutboundOrderDetail> orderDetails = _outboundRepository.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .Where(x => orderDetailIds.Contains(x.Id)) |
| | | .ToList(); |
| | | |
| | | if (orderDetails.Count == 0) |
| | | { |
| | | return WebResponseContent.Instance.Error("æªæ¾å°å¯åæ»æç»ï¼è¯·æ£æ¥åºåºåæç»"); |
| | | } |
| | | |
| | | decimal remainingRollbackQty = (decimal)rollbackTotalQuantity; |
| | | foreach (var detail in orderDetails) |
| | | { |
| | | if (remainingRollbackQty <= 0) |
| | | { |
| | | break; |
| | | } |
| | | |
| | | // 计ç®è¯¥æç»çå¯åæ»æ°é |
| | | decimal availableRollbackQty = detail.LockQuantity - detail.OverOutQuantity - detail.MoveQty; |
| | | |
| | | availableRollbackQty = Math.Max(0, availableRollbackQty); |
| | | |
| | | if (availableRollbackQty <= 0) |
| | | { |
| | | continue; // 该æç»æ å¯åæ»æ°éï¼è·³è¿ |
| | | } |
| | | |
| | | // è®¡ç®æ¬æ¬¡å®é
åæ»æ°éï¼åå¯åæ»æ°éåå©ä½éè¦åæ»æ°éçè¾å°å¼ï¼ |
| | | decimal actualRollbackQty = Math.Min(availableRollbackQty, remainingRollbackQty); |
| | | |
| | | detail.LockQuantity -= actualRollbackQty; |
| | | detail.LockQuantity = Math.Max(0, detail.LockQuantity); |
| | | |
| | | _detailRepository.UpdateData(detail); |
| | | |
| | | //æ´æ°å©ä½éè¦åæ»çæ°é |
| | | remainingRollbackQty -= actualRollbackQty; |
| | | } |
| | | |
| | | if (remainingRollbackQty > 0) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å©ä½åæ»æ°é{remainingRollbackQty}"); |
| | | } |
| | | _outboundLockInfoRepository.DeleteAndMoveIntoHty(lockInfo, WIDESEA_Core.Enums.OperateTypeEnum.人工å é¤); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | } |
| | | |
| | | stock.StockStatus = (int)StockStatusEmun.å
¥åºç¡®è®¤; |
| | | stock.LocationCode = ""; |
| | | } |