| | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ«ç æ£é确认 |
| | | /// </summary> |
| | | public async Task<WebResponseContent> ConfirmPicking(PickingConfirmRequest request) |
| | | { |
| | | try |
| | | { |
| | | _unitOfWorkManage.BeginTran(); |
| | | |
| | | // 1. éªè¯æ¡ç æææ§ |
| | | var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(x => x.Barcode == request.Barcode && x.MaterielCode == request.MaterielCode) |
| | | .FirstAsync(); |
| | | |
| | | if (stockDetail == null) |
| | | return WebResponseContent.Instance.Error("æ æçæ¡ç æç©æç¼ç "); |
| | | |
| | | // 2. æ£æ¥åºåå¯ç¨æ°é |
| | | decimal availableQuantity = stockDetail.StockQuantity - stockDetail.OutboundQuantity; |
| | | if (request.PickQuantity > availableQuantity) |
| | | return WebResponseContent.Instance.Error($"æ£éæ°éè¶
è¿å¯ç¨åºåï¼å¯ç¨æ°éï¼{availableQuantity}"); |
| | | |
| | | // 3. æ¥æ¾ç¸å
³çåºåºéå®ä¿¡æ¯ï¼æ¯ææå
åçæ°æ¡ç ï¼ |
| | | var lockInfo = await FindLockInfoByBarcode(request.OrderDetailId, request.Barcode, request.MaterielCode); |
| | | |
| | | if (lockInfo == null) |
| | | return WebResponseContent.Instance.Error("æªæ¾å°ç¸å
³çåºåºéå®ä¿¡æ¯"); |
| | | |
| | | // 4. æ£æ¥é宿°é |
| | | decimal remainingLockQuantity = lockInfo.AssignQuantity - lockInfo.PickedQty; |
| | | if (request.PickQuantity > remainingLockQuantity) |
| | | return WebResponseContent.Instance.Error($"æ£éæ°éè¶
è¿é宿°éï¼å©ä½å¯æ£éï¼{remainingLockQuantity}"); |
| | | |
| | | // 5. æ´æ°éå®ä¿¡æ¯çå·²æ£éæ°é |
| | | lockInfo.PickedQty += request.PickQuantity; |
| | | await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync(); |
| | | |
| | | // 6. æ´æ°åºååºåºæ°é - å®é
åå°åºå |
| | | stockDetail.OutboundQuantity += request.PickQuantity; |
| | | await _stockInfoService.Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | |
| | | // 7. æ´æ°åºåºåæç» |
| | | var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .Where(x => x.Id == request.OrderDetailId) |
| | | .FirstAsync(); |
| | | |
| | | orderDetail.OverOutQuantity += request.PickQuantity; |
| | | orderDetail.LockQuantity -= request.PickQuantity; |
| | | |
| | | // æ£æ¥æ¯å¦å®æåºåº |
| | | if (Math.Abs(orderDetail.OverOutQuantity - orderDetail.OrderQuantity) < 0.001m) |
| | | { |
| | | orderDetail.OrderDetailStatus = (int)OrderDetailStatusEnum.Over; |
| | | orderDetail.LockQuantity = 0; |
| | | |
| | | // æ´æ°ç¸å
³çéå®ä¿¡æ¯ç¶æä¸ºå·²åºåº |
| | | var relatedLockInfos = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.OrderDetailId == request.OrderDetailId && |
| | | x.Status == (int)OutLockStockStatusEnum.åºåºä¸) |
| | | .ToListAsync(); |
| | | |
| | | foreach (var relatedLock in relatedLockInfos) |
| | | { |
| | | relatedLock.Status = (int)OutLockStockStatusEnum.å·²åºåº; |
| | | } |
| | | await _outStockLockInfoService.Db.Updateable(relatedLockInfos).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync(); |
| | | |
| | | // 8. è®°å½æ£éåå² |
| | | var pickHistory = new Dt_PickingRecord |
| | | { |
| | | OrderDetailId = request.OrderDetailId, |
| | | Barcode = request.Barcode, |
| | | PickQuantity = request.PickQuantity, |
| | | PickTime = DateTime.Now, |
| | | |
| | | LocationCode = request.LocationCode, |
| | | StockId = stockDetail.StockId |
| | | }; |
| | | await Db.Insertable(pickHistory).ExecuteCommandAsync(); |
| | | |
| | | _unitOfWorkManage.CommitTran(); |
| | | |
| | | return WebResponseContent.Instance.OK("æ£é确认æå"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error($"æ£é确认失败: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | public async Task<WebResponseContent> ConfirmPicking(string orderNo, string palletCode, string barcode) |
| | | { |
| | |
| | | try |
| | | { |
| | | await _taskRepository.Db.Insertable(tasks).ExecuteCommandAsync(); |
| | | |
| | | var targetAddress = task.TargetAddress; |
| | | _taskRepository.DeleteData(task); |
| | | // ç» ESS æµå¨ä¿¡å·ååå»ºä»»å¡ |
| | | try |
| | | { |
| | | var result = await _eSSApiService.MoveContainerAsync(new WIDESEA_DTO.Basic.MoveContainerRequest |
| | | { |
| | | slotCode = movestations[task.TargetAddress], |
| | | slotCode = movestations[targetAddress], |
| | | containerCode = palletCode |
| | | }); |
| | | if (result) |
| | |
| | | taskDescribe = new TaskDescribeType { |
| | | containerCode = palletCode, |
| | | containerType = "CT_KUBOT_STANDARD", |
| | | fromLocationCode = stations.GetValueOrDefault(task.TargetAddress) ?? "", |
| | | fromLocationCode = stations.GetValueOrDefault(targetAddress) ?? "", |
| | | toStationCode = "", |
| | | toLocationCode = tasks.First().TargetAddress, |
| | | deadline = 0, storageTag = "" |
| | |
| | | .Where(x => x.OrderNo == orderNo && |
| | | x.PalletCode == palletCode && |
| | | x.CurrentBarcode == barcode && |
| | | x.Status == 2) |
| | | x.Status == 6) |
| | | .FirstAsync(); |
| | | |
| | | if (outStockInfo == null) |
| | |
| | | outStockInfo.Status = 1; |
| | | await _outStockLockInfoService.Db.Updateable(outStockInfo).ExecuteCommandAsync(); |
| | | |
| | | //// è¿ååºååºåºæ°é |
| | | //await _stockInfoDetailService.Db.Updateable<Dt_StockInfoDetail>() |
| | | // .SetColumns(x => x.OutboundQuantity == x.OutboundQuantity - outStockInfo.AssignQuantity) |
| | | // .Where(x => x.Barcode == barcode) |
| | | // .ExecuteCommandAsync(); |
| | | |
| | | var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(x => x.Barcode == barcode && x.StockId == outStockInfo.StockId) |
| | | .FirstAsync(); |
| | | |
| | | stockDetail.StockQuantity += outStockInfo.AssignQuantity; |
| | | stockDetail.OutboundQuantity += outStockInfo.AssignQuantity; |
| | | await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | |
| | | |
| | | // è¿ååºåºåæç» |
| | | var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | |
| | | { |
| | | return WebResponseContent.Instance.Error($"åæ¶æ£é失败ï¼{ex.Message}"); |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// æ ¹æ®æ¡ç æ¥æ¾éå®ä¿¡æ¯ |
| | | /// </summary> |
| | | private async Task<Dt_OutStockLockInfo> FindLockInfoByBarcode(int orderDetailId, string barcode, string materielCode) |
| | | { |
| | | return await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.OrderDetailId == orderDetailId && |
| | | x.MaterielCode == materielCode && |
| | | x.CurrentBarcode == barcode && |
| | | x.Status == (int)OutLockStockStatusEnum.åºåºä¸ && |
| | | x.AssignQuantity > x.PickedQty) |
| | | .FirstAsync(); |
| | | } |
| | | |
| | | // è·åæªæ£éå表 |
| | |
| | | .ToListAsync(); |
| | | } |
| | | |
| | | public async Task GetPalletPickingSummary(string orderNo, string palletCode) |
| | | { |
| | | var summary = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.OrderNo == orderNo && x.PalletCode == palletCode) |
| | | .GroupBy(x => new { x.PalletCode, x.Status }) |
| | | .Select(x => new |
| | | { |
| | | PalletCode = x.PalletCode, |
| | | Status = x.Status, |
| | | TotalAssignQty = SqlFunc.AggregateSum(x.AssignQuantity), |
| | | TotalPickedQty = SqlFunc.AggregateSum(x.PickedQty) |
| | | }) |
| | | .ToListAsync(); |
| | | |
| | | // return summary; |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// æ¤éæ£é |
| | | /// </summary> |
| | | public async Task<WebResponseContent> CancelPicking(CancelPickingRequest request) |
| | | { |
| | | // å®ç°æ¤éæ£éçé»è¾ï¼éè¦ï¼ |
| | | // 1. æ¢å¤åºååºåºæ°é |
| | | // 2. æ¢å¤éå®ä¿¡æ¯çå·²æ£éæ°é |
| | | // 3. æ¢å¤åºåºåæç»çå·²åºæ°éåé宿°é |
| | | // 4. å 餿æ è®°æ£éåå²è®°å½ |
| | | // 注æï¼è¿ééè¦äºå¡å¤ç |
| | | try |
| | | { |
| | | _unitOfWorkManage.BeginTran(); |
| | | |
| | | var pickHistory = await Db.Queryable<Dt_PickingRecord>() |
| | | .Where(x => x.Id == request.PickingHistoryId) |
| | | .FirstAsync(); |
| | | |
| | | if (pickHistory == null) |
| | | return WebResponseContent.Instance.Error("æªæ¾å°æ£éè®°å½"); |
| | | |
| | | // æ¢å¤åºå |
| | | var stockDetail = await _stockInfoService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(x => x.Barcode == pickHistory.Barcode && x.StockId == pickHistory.StockId) |
| | | .FirstAsync(); |
| | | if (stockDetail != null) |
| | | { |
| | | stockDetail.OutboundQuantity -= pickHistory.PickQuantity; |
| | | await _stockInfoService.Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | } |
| | | // æ¢å¤éå®ä¿¡æ¯ |
| | | var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.OrderDetailId == pickHistory.OrderDetailId && x.StockId == pickHistory.StockId) |
| | | .FirstAsync(); |
| | | lockInfo.PickedQty -= pickHistory.PickQuantity; |
| | | await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync(); |
| | | |
| | | // æ¢å¤åºåºåæç» |
| | | var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .Where(x => x.Id == pickHistory.OrderDetailId) |
| | | .FirstAsync(); |
| | | orderDetail.OverOutQuantity -= pickHistory.PickQuantity; |
| | | orderDetail.LockQuantity += pickHistory.PickQuantity; |
| | | if (orderDetail.OverOutQuantity < orderDetail.OrderQuantity) |
| | | { |
| | | orderDetail.OrderDetailStatus = orderDetail.LockQuantity > 0 ? |
| | | (int)OrderDetailStatusEnum.Outbound : (int)OrderDetailStatusEnum.AssignOverPartial; |
| | | } |
| | | await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync(); |
| | | |
| | | // å 餿£éåå²è®°å½ |
| | | await Db.Deleteable<Dt_PickingRecord>().Where(x => x.Id == request.PickingHistoryId).ExecuteCommandAsync(); |
| | | |
| | | _unitOfWorkManage.CommitTran(); |
| | | return WebResponseContent.Instance.OK("æ¤éæå"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error($"æ¤é失败: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åæççåºåºç¶æä¿¡æ¯ |