| | |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | public async Task<WebResponseContent> ConfirmPicking(string orderNo, string palletCode, string barcode) |
| | | { |
| | | #region "æµè¯æå°" |
| | |
| | | { |
| | | _unitOfWorkManage.BeginTran(); |
| | | |
| | | // 1. æ¥æ¾åºåºéå®ä¿¡æ¯ |
| | | var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(it => it.OrderNo == orderNo && |
| | | it.Status == (int)OutLockStockStatusEnum.åºåºä¸ && |
| | | it.PalletCode == palletCode && |
| | | it.CurrentBarcode == barcode && |
| | | it.AssignQuantity > it.PickedQty) // å¢å ï¼åªææªå®æåæ£çæè½ç»§ç» |
| | | .FirstAsync(); |
| | | .Where(it => it.OrderNo == orderNo && |
| | | it.Status == (int)OutLockStockStatusEnum.åºåºä¸ && |
| | | it.PalletCode == palletCode && |
| | | it.CurrentBarcode == barcode && |
| | | it.AssignQuantity > it.PickedQty) |
| | | .FirstAsync(); |
| | | |
| | | if (lockInfo == null) |
| | | { |
| | | lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(it => it.CurrentBarcode == barcode && |
| | | it.Status == (int)OutLockStockStatusEnum.åºåºä¸ && |
| | | it.AssignQuantity > it.PickedQty) // å¢å ï¼æ£æ¥åæ£è¿åº¦ |
| | | it.AssignQuantity > it.PickedQty) |
| | | .FirstAsync(); |
| | | |
| | | if (lockInfo == null) |
| | | { |
| | | // æ£æ¥æ¯å¦å·²ç»å®æåæ£ |
| | | var completedLockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(it => it.CurrentBarcode == barcode && |
| | | (it.Status == (int)OutLockStockStatusEnum.æ£é宿 || |
| | |
| | | if (lockInfo.PalletCode != palletCode) |
| | | throw new Exception($"æ¡ç {barcode}ä¸å±äºæç{palletCode}"); |
| | | |
| | | if (lockInfo.PickedQty >= lockInfo.AssignQuantity) |
| | | { |
| | | throw new Exception($"æ¡ç {barcode}å·²ç»å®æåæ£ï¼ä¸è½éå¤åæ£"); |
| | | } |
| | | |
| | | // æ£æ¥æ£éåå²ï¼é²æ¢éå¤åæ£ |
| | | // æ£æ¥æ£éåå²ï¼é²æ¢éå¤åæ£ |
| | | var existingPicking = await Db.Queryable<Dt_PickingRecord>() |
| | | .Where(x => x.Barcode == barcode && |
| | | x.OrderNo == orderNo && |
| | |
| | | throw new Exception($"æ¡ç {barcode}å·²ç»åæ£è¿ï¼ä¸è½éå¤åæ£"); |
| | | } |
| | | |
| | | var outorderdetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .FirstAsync(x => x.Id == lockInfo.OrderDetailId); |
| | | |
| | | var outorderdetail = _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>().First(x => x.Id == lockInfo.OrderDetailId); |
| | | if (outorderdetail != null && lockInfo.AssignQuantity > outorderdetail.OrderQuantity) |
| | | if (outorderdetail != null && (lockInfo.AssignQuantity + outorderdetail.OverOutQuantity) > outorderdetail.NeedOutQuantity) |
| | | { |
| | | throw new Exception($"æ¡ç {barcode}çåºåºæ°é大äºè®¢åçæ°é"); |
| | | throw new Exception($"æ¡ç {barcode}çåºåºæ°éå°å¯¼è´è®¢åæç»å·²åºåºæ°éè¶
è¿éæ±æ°é"); |
| | | } |
| | | |
| | | var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(x => x.Barcode == barcode && x.StockId == lockInfo.StockId) |
| | | .FirstAsync(); |
| | | .Where(x => x.Barcode == barcode && x.StockId == lockInfo.StockId) |
| | | .FirstAsync(); |
| | | |
| | | if (stockDetail == null) |
| | | return WebResponseContent.Instance.Error("æ æçæ¡ç æç©æç¼ç "); |
| | |
| | | Dt_OutStockLockInfo finalLockInfo = lockInfo; |
| | | var finalBarcode = barcode; |
| | | var finalStockId = stockDetail.Id; |
| | | decimal actualPickedQty = actualQty; // å®é
æ£éæ°é |
| | | |
| | | if (actualQty < stockQuantity) |
| | | { |
| | | // æ
åµ1: åé
æ°éå°äºåºåæ°éï¼éè¦èªå¨æå
|
| | | // 计ç®å©ä½åºåæ°é |
| | | decimal remainingStockQty = stockQuantity - actualQty; |
| | | |
| | | // æ´æ°åæ¡ç åºå为å©ä½æ°é |
| | | stockDetail.StockQuantity = remainingStockQty; |
| | | stockDetail.OutboundQuantity = remainingStockQty; |
| | | await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | |
| | | // çææ°æ¡ç ç¨äºè®°å½æ£éæ°éï¼ä½ä¸å建åºåè®°å½ï¼ |
| | | var seq = await _dailySequenceService.GetNextSequenceAsync(); |
| | | string newBarcode = "WSLOT" + DateTime.Now.ToString("yyyyMMdd") + seq.ToString()?.PadLeft(5, '0'); |
| | | |
| | | // ä¸ºæ°æ¡ç å建åºåºéå®ä¿¡æ¯ï¼ç¨äºè®°å½æ£éï¼ |
| | | var newLockInfo = new Dt_OutStockLockInfo |
| | | { |
| | | OrderNo = lockInfo.OrderNo, |
| | |
| | | IsSplitted = 1, |
| | | ParentLockId = lockInfo.Id |
| | | }; |
| | | // æå
¥æ°éå®ä¿¡æ¯å¹¶è·åID |
| | | var newLockId = await _outStockLockInfoService.Db.Insertable(newLockInfo).ExecuteReturnIdentityAsync(); |
| | | newLockInfo.Id = newLockId; // ç¡®ä¿ID被æ£ç¡®è®¾ç½® |
| | | |
| | | // è®°å½æå
åå²ï¼ç¨äºè¿½è¸ªï¼ |
| | | var newLockId = await _outStockLockInfoService.Db.Insertable(newLockInfo).ExecuteReturnIdentityAsync(); |
| | | newLockInfo.Id = newLockId; |
| | | |
| | | var splitHistory = new Dt_SplitPackageRecord |
| | | { |
| | | FactoryArea = lockInfo.FactoryArea, |
| | |
| | | }; |
| | | await _splitPackageService.Db.Insertable(splitHistory).ExecuteCommandAsync(); |
| | | |
| | | // æ´æ°åéå®ä¿¡æ¯ä¸ºå©ä½åºåæ°é |
| | | lockInfo.AssignQuantity = remainingStockQty; |
| | | lockInfo.PickedQty = 0; |
| | | |
| | | await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync(); |
| | | |
| | | splitResults.Add(new SplitResult |
| | |
| | | batch = lockInfo.BatchNo, |
| | | factory = lockInfo.FactoryArea, |
| | | date = DateTime.Now.ToString("yyyy-MM-dd"), |
| | | |
| | | }); |
| | | |
| | | splitResults.Add(new SplitResult |
| | | { |
| | | materialCode = lockInfo.MaterielCode, |
| | |
| | | factory = lockInfo.FactoryArea, |
| | | date = DateTime.Now.ToString("yyyy-MM-dd"), |
| | | }); |
| | | // æ´æ°æ£éè®°å½ä¸çæ¡ç ä¸ºæ°æ¡ç |
| | | |
| | | barcode = newBarcode; |
| | | lockInfo = newLockInfo; |
| | | finalLockInfo = newLockInfo; |
| | | finalBarcode = newBarcode; |
| | | finalStockId = stockDetail.Id; // 使ç¨ååºåID |
| | | finalStockId = stockDetail.Id; |
| | | } |
| | | else if (actualQty == stockQuantity) |
| | | { |
| | |
| | | lockInfo.PickedQty += actualQty; |
| | | lockInfo.Status = (int)OutLockStockStatusEnum.æ£é宿; |
| | | await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync(); |
| | | |
| | | finalLockInfo = lockInfo; |
| | | finalBarcode = barcode; |
| | | finalStockId = stockDetail.Id; |
| | |
| | | else |
| | | { |
| | | // æ
åµ3: åé
æ°é大äºåºåæ°éï¼åºåæ´å
åºåº |
| | | // æ´å
åºåºå½ååºå |
| | | decimal stockOutQty = stockQuantity; |
| | | stockDetail.StockQuantity = 0; |
| | | stockDetail.OutboundQuantity = 0; |
| | | await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | |
| | | // 计ç®å©ä½åé
æ°é |
| | | decimal remainingAssignQty = actualQty - stockQuantity; |
| | | |
| | | // æ´æ°éå®ä¿¡æ¯ï¼åªå®æåºåé¨åï¼ |
| | | lockInfo.PickedQty += stockOutQty; |
| | | lockInfo.AssignQuantity = remainingAssignQty; |
| | | |
| | | await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync(); |
| | | |
| | | var _relatedSplitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>() |
| | | .Where(it => it.OriginalBarcode == barcode || it.NewBarcode == barcode) |
| | | .Where(it => !it.IsReverted) |
| | | .ToListAsync(); |
| | | .Where(it => it.OriginalBarcode == barcode || it.NewBarcode == barcode) |
| | | .Where(it => !it.IsReverted) |
| | | .ToListAsync(); |
| | | |
| | | foreach (var record in _relatedSplitRecords) |
| | | { |
| | | record.Status = (int)SplitPackageStatusEnum.å·²æ£é; |
| | | await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | finalLockInfo = lockInfo; |
| | | finalBarcode = barcode; |
| | | finalStockId = stockDetail.Id; |
| | | actualPickedQty = stockOutQty; // å®é
æ£éæ°éè°æ´ä¸ºåºåæ°é |
| | | } |
| | | |
| | | |
| | | |
| | | // æ´æ°è®¢åæç»çæ£éæ°éåå·²åºåºæ°é |
| | | await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>() |
| | | .SetColumns(it => it.PickedQty == it.PickedQty + actualQty) |
| | | .SetColumns(it => new Dt_OutboundOrderDetail |
| | | { |
| | | PickedQty = it.PickedQty + actualPickedQty, |
| | | OverOutQuantity = it.OverOutQuantity + actualPickedQty |
| | | }) |
| | | .Where(it => it.Id == lockInfo.OrderDetailId) |
| | | .ExecuteCommandAsync(); |
| | | |
| | | await CheckAndUpdateOrderStatus(orderNo); |
| | | |
| | | // æ¥è¯¢ä»»å¡è¡¨ |
| | | // æ¥è¯¢ä»»å¡è¡¨ |
| | | var task = _taskRepository.QueryData(x => x.OrderNo == orderNo && x.PalletCode == palletCode).FirstOrDefault(); |
| | | |
| | | if (finalLockInfo.Id <= 0) |
| | | { |
| | | throw new Exception($"éå®ä¿¡æ¯IDæ æ: {finalLockInfo.Id}ï¼æ æ³è®°å½æ£éåå²"); |
| | | } |
| | | |
| | | // è®°å½æ£éåå² |
| | | var pickingHistory = new Dt_PickingRecord |
| | | { |
| | |
| | | PalletCode = palletCode, |
| | | Barcode = finalBarcode, |
| | | MaterielCode = finalLockInfo.MaterielCode, |
| | | PickQuantity = actualQty, |
| | | PickQuantity = actualPickedQty, |
| | | PickTime = DateTime.Now, |
| | | Operator = App.User.UserName, |
| | | OutStockLockId = finalLockInfo.Id |
| | |
| | | |
| | | _unitOfWorkManage.CommitTran(); |
| | | |
| | | // 妿ææå
ç»æï¼è¿åæå
ä¿¡æ¯ |
| | | if (splitResults.Any()) |
| | | { |
| | | return WebResponseContent.Instance.OK("æ£é确认æåï¼å·²èªå¨æå
", new { SplitResults = splitResults }); |
| | | } |
| | | |
| | | return WebResponseContent.Instance.OK("æ£é确认æå", new { SplitResults = splitResults }); |
| | | return WebResponseContent.Instance.OK("æ£é确认æå"); |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | _logger.LogError($"ConfirmPicking失败 - OrderNo: {orderNo}, PalletCode: {palletCode}, Barcode: {barcode}, Error: {ex.Message}"); |
| | | return WebResponseContent.Instance.Error($"æ£é确认失败ï¼{ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ååºæä½ |
| | | /// </summary> |