| | |
| | | details = new List<FeedbackOutboundDetailsModel>() |
| | | |
| | | }; |
| | | var lists = _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>().Where(x => x.OrderNo == orderNo).ToList(); |
| | | var lists = _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>().Where(x => x.OrderNo == orderNo && x.Status == (int)OutLockStockStatusEnum.æ£é宿).ToList(); |
| | | |
| | | var groupedData = lists.GroupBy(item => new { item.MaterielCode, item.lineNo, item.Unit, item.WarehouseCode }) |
| | | .Select(group => new FeedbackOutboundDetailsModel |
| | |
| | | supplyCode = row.SupplyCode, |
| | | batchNo = row.BatchNo, |
| | | unit = row.Unit, |
| | | qty = row.AssignQuantity |
| | | qty = row.PickedQty |
| | | }).ToList() |
| | | }).ToList(); |
| | | feedmodel.details = groupedData; |
| | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ååºæä½ |
| | | /// </summary> |
| | | |
| | | public async Task<WebResponseContent> ReturnRemaining(string orderNo, string palletCode, string reason) |
| | | { |
| | | try |
| | | { |
| | | _unitOfWorkManage.BeginTran(); |
| | | |
| | | if (string.IsNullOrEmpty(orderNo) || string.IsNullOrEmpty(palletCode)) |
| | | { |
| | | return WebResponseContent.Instance.Error("订åå·åæçç ä¸è½ä¸ºç©º"); |
| | | } |
| | | var stockInfo = await _stockInfoService.Db.Queryable<Dt_StockInfo>() |
| | | .FirstAsync(x => x.PalletCode == palletCode); |
| | | |
| | | // è·åæææªåæ£çåºåºéå®è®°å½ï¼å
æ¬æå
产ççè®°å½ |
| | | var remainingLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(it => it.OrderNo == orderNo && it.Status == (int)OutLockStockStatusEnum.åºåºä¸) |
| | | .ToListAsync(); |
| | | |
| | | var stockinfo = _stockInfoService.Db.Queryable<Dt_StockInfo>().First(x => x.PalletCode == palletCode); |
| | | |
| | | var tasks = new List<Dt_Task>(); |
| | | |
| | | // æ¥è¯¢ä»»å¡è¡¨ |
| | | var task = remainingLocks.Any() |
| | | ? _taskRepository.QueryData(x => x.TaskNum == remainingLocks.First().TaskNum).FirstOrDefault() |
| | | : _taskRepository.QueryData(x => x.PalletCode == palletCode).FirstOrDefault(); |
| | | |
| | | if (stockInfo == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°æç {palletCode} 对åºçåºåä¿¡æ¯"); |
| | | } |
| | | var task = await GetCurrentTask(orderNo, palletCode); |
| | | if (task == null) |
| | | { |
| | | return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡ä¿¡æ¯"); |
| | | } |
| | | |
| | | // æ£æ¥æç䏿¯å¦æå
¶ä»éåºåºè´§ç©ï¼åºåè´§ç©ï¼ |
| | | var palletStockGoods = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(it => it.StockId == stockinfo.Id && |
| | | (it.Status == StockStatusEmun.å
¥åºç¡®è®¤.ObjToInt() || |
| | | it.Status == StockStatusEmun.å
¥åºå®æ.ObjToInt() || |
| | | it.Status == StockStatusEmun.åºåºéå®.ObjToInt())) |
| | | .Where(it => it.OutboundQuantity == 0 || it.OutboundQuantity < it.StockQuantity) // æªå®å
¨åºåºç |
| | | .ToListAsync(); |
| | | // åæéè¦ååºçè´§ç© |
| | | var returnAnalysis = await AnalyzeReturnItems(orderNo, palletCode, stockInfo.Id); |
| | | |
| | | // æ£æ¥æå
è®°å½ï¼æ¾åºéè¦ååºçæ¡ç |
| | | var splitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>() |
| | | .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode && !it.IsReverted) |
| | | .ToListAsync(); |
| | | |
| | | // 计ç®éè¦ååºçæå
æ¡ç |
| | | var splitBarcodesToReturn = new List<string>(); |
| | | foreach (var splitRecord in splitRecords) |
| | | if (!returnAnalysis.HasItemsToReturn) |
| | | { |
| | | // æ£æ¥åæ¡ç æ¯å¦è¿æåºåéè¦ååº |
| | | var originalStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(it => it.Barcode == splitRecord.OriginalBarcode && it.StockId == stockinfo.Id) |
| | | .FirstAsync(); |
| | | |
| | | if (originalStock != null && originalStock.StockQuantity > 0) |
| | | { |
| | | splitBarcodesToReturn.Add(splitRecord.OriginalBarcode); |
| | | } |
| | | |
| | | // æ£æ¥æ°æ¡ç æ¯å¦è¿æåºåéè¦ååº |
| | | var newStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(it => it.Barcode == splitRecord.NewBarcode && it.StockId == stockinfo.Id) |
| | | .FirstAsync(); |
| | | |
| | | if (newStock != null && newStock.StockQuantity > 0) |
| | | { |
| | | splitBarcodesToReturn.Add(splitRecord.NewBarcode); |
| | | } |
| | | return await HandleNoReturnItems(orderNo, palletCode); |
| | | } |
| | | |
| | | // å¦ææ²¡æéè¦ååºçè´§ç©ï¼æ¢æ æªåæ£åºåºè´§ç©ï¼ä¹æ å
¶ä»åºåè´§ç©ï¼ä¹æ æå
å©ä½è´§ç©ï¼ |
| | | if (!remainingLocks.Any() && !palletStockGoods.Any() && !splitBarcodesToReturn.Any()) |
| | | { |
| | | // æ£æ¥æ¯å¦ææè´§ç©é½å·²æ£é宿 |
| | | var allPicked = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode) |
| | | .AnyAsync(it => it.Status == (int)OutLockStockStatusEnum.æ£é宿); |
| | | // æ§è¡ååºæä½ |
| | | await ExecuteReturnOperations(orderNo, palletCode, stockInfo, task, returnAnalysis); |
| | | |
| | | if (allPicked) |
| | | { |
| | | return WebResponseContent.Instance.OK("ææè´§ç©å·²æ£éå®æï¼æç为空"); |
| | | } |
| | | else |
| | | { |
| | | return WebResponseContent.Instance.Error("没æéè¦ååºçå©ä½è´§ç©"); |
| | | } |
| | | } |
| | | //å建ååºä»»å¡å¹¶å¤çESS |
| | | await CreateReturnTaskAndHandleESS(orderNo, palletCode, task, returnAnalysis); |
| | | |
| | | var firstlocation = _locationInfoService.Db.Queryable<Dt_LocationInfo>().First(x => x.LocationCode == task.SourceAddress); |
| | | decimal totalReturnQty = 0; |
| | | _unitOfWorkManage.CommitTran(); |
| | | |
| | | // æ
åµ1ï¼å¤çæªåæ£çåºåºéå®è®°å½ |
| | | if (remainingLocks.Any(x => x.PalletCode == palletCode)) |
| | | { |
| | | var palletLocks = remainingLocks.Where(x => x.PalletCode == palletCode).ToList(); |
| | | totalReturnQty = palletLocks.Sum(x => x.AssignQuantity - x.PickedQty); |
| | | // æ´æ°è®¢åç¶æ |
| | | await UpdateOrderStatusForReturn(orderNo); |
| | | |
| | | if (totalReturnQty > 0) |
| | | { |
| | | // åé
æ°è´§ä½ |
| | | var newLocation = _locationInfoService.AssignLocation(firstlocation.LocationType); |
| | | return WebResponseContent.Instance.OK($"ååºæä½æåï¼å
±ååºæ°éï¼{returnAnalysis.TotalReturnQty}"); |
| | | |
| | | // æ´æ°åºåºéå®è®°å½ç¶æ |
| | | var lockIds = palletLocks.Select(x => x.Id).ToList(); |
| | | await _outStockLockInfoService.Db.Updateable<Dt_OutStockLockInfo>() |
| | | .SetColumns(it => new Dt_OutStockLockInfo { Status = (int)OutLockStockStatusEnum.ååºä¸ }) |
| | | .Where(it => lockIds.Contains(it.Id)) |
| | | .ExecuteCommandAsync(); |
| | | |
| | | |
| | | |
| | | // å¤çåºåè®°å½ |
| | | foreach (var lockInfo in palletLocks) |
| | | { |
| | | decimal returnQty = lockInfo.AssignQuantity - lockInfo.PickedQty; |
| | | |
| | | // æ£æ¥åºåè®°å½æ¯å¦åå¨ |
| | | var existingStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(it => it.Barcode == lockInfo.CurrentBarcode && it.StockId == lockInfo.StockId) |
| | | .FirstAsync(); |
| | | |
| | | if (existingStock != null) |
| | | { |
| | | // åºåè®°å½åå¨ï¼æ¢å¤é宿°é |
| | | existingStock.OutboundQuantity = 0; |
| | | |
| | | await _stockInfoDetailService.Db.Updateable(existingStock).ExecuteCommandAsync(); |
| | | } |
| | | else |
| | | { |
| | | // åºåè®°å½ä¸åå¨ï¼å¯è½æ¯æå
产ççæ°æ¡ç ï¼ï¼å建æ°çåºåè®°å½ |
| | | var newStockDetail = new Dt_StockInfoDetail |
| | | { |
| | | StockId = lockInfo.StockId, |
| | | MaterielCode = lockInfo.MaterielCode, |
| | | MaterielName = lockInfo.MaterielName, |
| | | OrderNo = lockInfo.OrderNo, |
| | | BatchNo = lockInfo.BatchNo, |
| | | StockQuantity = returnQty, |
| | | OutboundQuantity = 0, |
| | | Barcode = lockInfo.CurrentBarcode, |
| | | InboundOrderRowNo = "", |
| | | Status = StockStatusEmun.å
¥åºå®æ.ObjToInt(), |
| | | SupplyCode = lockInfo.SupplyCode, |
| | | WarehouseCode = lockInfo.WarehouseCode, |
| | | Unit = lockInfo.Unit |
| | | }; |
| | | await _stockInfoDetailService.Db.Insertable(newStockDetail).ExecuteCommandAsync(); |
| | | } |
| | | } |
| | | |
| | | // å建ååºä»»å¡ |
| | | CreateReturnTask(tasks, task, palletCode, newLocation); |
| | | } |
| | | } |
| | | |
| | | // æ
åµ2ï¼å¤çæå
å©ä½çåºåè´§ç© |
| | | if (splitBarcodesToReturn.Any()) |
| | | { |
| | | decimal splitReturnQty = 0; |
| | | |
| | | foreach (var barcode in splitBarcodesToReturn) |
| | | { |
| | | var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(it => it.Barcode == barcode && it.StockId == stockinfo.Id) |
| | | .FirstAsync(); |
| | | |
| | | if (stockDetail != null && stockDetail.StockQuantity > 0) |
| | | { |
| | | splitReturnQty += stockDetail.StockQuantity; |
| | | |
| | | // æ¢å¤åºåç¶æä¸ºå
¥åºå®æ |
| | | stockDetail.OutboundQuantity = 0; |
| | | |
| | | await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | } |
| | | } |
| | | |
| | | totalReturnQty += splitReturnQty; |
| | | |
| | | // å¦ææ²¡æå建任å¡ï¼å建ååºä»»å¡ |
| | | if (!tasks.Any()) |
| | | { |
| | | var newLocation = _locationInfoService.AssignLocation(firstlocation.LocationType); |
| | | CreateReturnTask(tasks, task, palletCode, newLocation); |
| | | } |
| | | } |
| | | |
| | | // æ
åµ3ï¼åºåºè´§ç©å·²åæ£å®ï¼ä½æçä¸è¿æå
¶ä»åºåè´§ç©éè¦ååº |
| | | if (palletStockGoods.Any() && !remainingLocks.Any(x => x.PalletCode == palletCode)) |
| | | { |
| | | decimal otherReturnQty = palletStockGoods.Sum(x => x.StockQuantity - x.OutboundQuantity); |
| | | totalReturnQty += otherReturnQty; |
| | | // æ´æ°è¿äºåºåè´§ç©çç¶æ |
| | | foreach (var stockGood in palletStockGoods) |
| | | { |
| | | stockGood.OutboundQuantity = 0; |
| | | |
| | | await _stockInfoDetailService.Db.Updateable(stockGood).ExecuteCommandAsync(); |
| | | } |
| | | // å¦ææ²¡æå建任å¡ï¼å建ååºä»»å¡ |
| | | if (!tasks.Any()) |
| | | { |
| | | var newLocation = _locationInfoService.AssignLocation(firstlocation.LocationType); |
| | | CreateReturnTask(tasks, task, palletCode, newLocation); |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | var allSplitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>() |
| | | .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode && !it.IsReverted) |
| | | .ToListAsync(); |
| | | |
| | | foreach (var record in allSplitRecords) |
| | | { |
| | | record.Status = (int)SplitPackageStatusEnum.å·²ååº; |
| | | await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync(); |
| | | } |
| | | // ä¿åä»»å¡ ç»ESSä¸åä»»å¡ |
| | | if (tasks.Any()) |
| | | { |
| | | 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[targetAddress], |
| | | containerCode = palletCode |
| | | }); |
| | | |
| | | if (result) |
| | | { |
| | | TaskModel esstask = new TaskModel() |
| | | { |
| | | taskType = "putaway", |
| | | taskGroupCode = "", |
| | | groupPriority = 0, |
| | | tasks = new List<TasksType> |
| | | { |
| | | new() |
| | | { |
| | | taskCode = tasks.First().TaskNum.ToString(), |
| | | taskPriority = 0, |
| | | taskDescribe = new TaskDescribeType { |
| | | containerCode = palletCode, |
| | | containerType = "CT_KUBOT_STANDARD", |
| | | fromLocationCode = stations.GetValueOrDefault(targetAddress) ?? "", |
| | | toStationCode = "", |
| | | toLocationCode = tasks.First().TargetAddress, |
| | | deadline = 0, storageTag = "" |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | |
| | | var resulttask = await _eSSApiService.CreateTaskAsync(esstask); |
| | | _logger.LogInformation("ReturnRemaining å建任å¡è¿å: " + resulttask); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _logger.LogInformation("ReturnRemaining å建任å¡è¿å catch err: " + ex.Message); |
| | | } |
| | | |
| | | _unitOfWorkManage.CommitTran(); |
| | | return WebResponseContent.Instance.OK($"ååºæä½æåï¼å
±ååºæ°éï¼{totalReturnQty}"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error($"å建ååºä»»å¡å¤±è´¥: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error("æªå建任ä½ååºä»»å¡"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | _logger.LogError($"ReturnRemaining失败 - OrderNo: {orderNo}, PalletCode: {palletCode}, Error: {ex.Message}"); |
| | | return WebResponseContent.Instance.Error($"ååºæä½å¤±è´¥: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | #region 订åç¶æ |
| | | |
| | | private async Task UpdateOrderStatusForReturn(string orderNo) |
| | | { |
| | | try |
| | | { |
| | | var orderDetails = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .LeftJoin<Dt_OutboundOrder>((o, item) => o.OrderId == item.Id) |
| | | .Where((o, item) => item.OrderNo == orderNo) |
| | | .Select((o, item) => o) |
| | | .ToListAsync(); |
| | | |
| | | bool allCompleted = true; |
| | | foreach (var detail in orderDetails) |
| | | { |
| | | if (detail.OverOutQuantity < detail.NeedOutQuantity) |
| | | { |
| | | allCompleted = false; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | var outboundOrder = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>() |
| | | .FirstAsync(x => x.OrderNo == orderNo); |
| | | |
| | | if (outboundOrder == null) return; |
| | | |
| | | // åªæå½ç¶æç¡®å®åçååæ¶ææ´æ° |
| | | int newStatus = allCompleted ? (int)OutOrderStatusEnum.åºåºå®æ : (int)OutOrderStatusEnum.åºåºä¸; |
| | | |
| | | if (outboundOrder.OrderStatus != newStatus) |
| | | { |
| | | await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>() |
| | | .SetColumns(x => x.OrderStatus == newStatus) |
| | | .Where(x => x.OrderNo == orderNo) |
| | | .ExecuteCommandAsync(); |
| | | |
| | | _logger.LogInformation($"ååºæä½æ´æ°è®¢åç¶æ - OrderNo: {orderNo}, æ°ç¶æ: {newStatus}"); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _logger.LogError($"UpdateOrderStatusForReturn失败 - OrderNo: {orderNo}, Error: {ex.Message}"); |
| | | |
| | | } |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region Private Methods |
| | | |
| | | private async Task<Dt_Task> GetCurrentTask(string orderNo, string palletCode) |
| | | { |
| | | // å
å°è¯éè¿è®¢åå·åæçå·æ¥æ¾ä»»å¡ |
| | | var task = await _taskRepository.Db.Queryable<Dt_Task>() |
| | | .Where(x => x.OrderNo == orderNo && x.PalletCode == palletCode) |
| | | .FirstAsync(); |
| | | |
| | | if (task == null) |
| | | { |
| | | // 妿æ¾ä¸å°ï¼åéè¿æçå·æ¥æ¾ |
| | | task = await _taskRepository.Db.Queryable<Dt_Task>() |
| | | .Where(x => x.PalletCode == palletCode) |
| | | .FirstAsync(); |
| | | } |
| | | |
| | | return task; |
| | | } |
| | | |
| | | private async Task<ReturnAnalysisResult> AnalyzeReturnItems(string orderNo, string palletCode, int stockId) |
| | | { |
| | | var result = new ReturnAnalysisResult(); |
| | | |
| | | // è·åæªåæ£çåºåºéå®è®°å½ |
| | | var remainingLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(it => it.OrderNo == orderNo && |
| | | it.PalletCode == palletCode && |
| | | it.Status == (int)OutLockStockStatusEnum.åºåºä¸) |
| | | .ToListAsync(); |
| | | |
| | | if (remainingLocks.Any()) |
| | | { |
| | | result.HasRemainingLocks = true; |
| | | result.RemainingLocks = remainingLocks; |
| | | result.RemainingLocksReturnQty = remainingLocks.Sum(x => x.AssignQuantity - x.PickedQty); |
| | | } |
| | | |
| | | // æ£æ¥æç䏿¯å¦æå
¶ä»åºåè´§ç© |
| | | var palletStockGoods = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(it => it.StockId == stockId && |
| | | (it.Status == StockStatusEmun.å
¥åºç¡®è®¤.ObjToInt() || |
| | | it.Status == StockStatusEmun.å
¥åºå®æ.ObjToInt() || |
| | | it.Status == StockStatusEmun.åºåºéå®.ObjToInt())) |
| | | .Where(it => it.StockQuantity > 0) // æåºåç |
| | | .ToListAsync(); |
| | | |
| | | |
| | | if (palletStockGoods.Any()) |
| | | { |
| | | result.HasPalletStockGoods = true; |
| | | result.PalletStockGoods = palletStockGoods; |
| | | result.PalletStockReturnQty = palletStockGoods.Sum(x => x.StockQuantity); |
| | | } |
| | | |
| | | // æ£æ¥æå
è®°å½ |
| | | var splitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>() |
| | | .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode && !it.IsReverted) |
| | | .ToListAsync(); |
| | | |
| | | if (splitRecords.Any()) |
| | | { |
| | | result.HasSplitRecords = true; |
| | | result.SplitRecords = splitRecords; |
| | | result.SplitReturnQty = await CalculateSplitReturnQuantity(splitRecords, stockId); |
| | | } |
| | | |
| | | result.TotalReturnQty = result.RemainingLocksReturnQty + result.PalletStockReturnQty + result.SplitReturnQty; |
| | | result.HasItemsToReturn = result.TotalReturnQty > 0; |
| | | |
| | | return result; |
| | | } |
| | | |
| | | private async Task<decimal> CalculateSplitReturnQuantity(List<Dt_SplitPackageRecord> splitRecords, int stockId) |
| | | { |
| | | decimal totalQty = 0; |
| | | var processedBarcodes = new HashSet<string>(); |
| | | |
| | | foreach (var splitRecord in splitRecords) |
| | | { |
| | | // æ£æ¥åæ¡ç |
| | | if (!processedBarcodes.Contains(splitRecord.OriginalBarcode)) |
| | | { |
| | | var originalStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(it => it.Barcode == splitRecord.OriginalBarcode && it.StockId == stockId) |
| | | .FirstAsync(); |
| | | |
| | | if (originalStock != null && originalStock.StockQuantity > 0) |
| | | { |
| | | totalQty += originalStock.StockQuantity; |
| | | processedBarcodes.Add(splitRecord.OriginalBarcode); |
| | | } |
| | | } |
| | | |
| | | // æ£æ¥æ°æ¡ç |
| | | if (!processedBarcodes.Contains(splitRecord.NewBarcode)) |
| | | { |
| | | var newStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(it => it.Barcode == splitRecord.NewBarcode && it.StockId == stockId) |
| | | .FirstAsync(); |
| | | |
| | | if (newStock != null && newStock.StockQuantity > 0) |
| | | { |
| | | totalQty += newStock.StockQuantity; |
| | | processedBarcodes.Add(splitRecord.NewBarcode); |
| | | } |
| | | } |
| | | } |
| | | |
| | | return totalQty; |
| | | } |
| | | |
| | | private async Task<WebResponseContent> HandleNoReturnItems(string orderNo, string palletCode) |
| | | { |
| | | // æ£æ¥æ¯å¦ææè´§ç©é½å·²æ£é宿 |
| | | var allPicked = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode) |
| | | .AnyAsync(it => it.Status == (int)OutLockStockStatusEnum.æ£é宿); |
| | | |
| | | if (allPicked) |
| | | { |
| | | return WebResponseContent.Instance.OK("ææè´§ç©å·²æ£éå®æï¼æç为空"); |
| | | } |
| | | else |
| | | { |
| | | return WebResponseContent.Instance.Error("没æéè¦ååºçå©ä½è´§ç©"); |
| | | } |
| | | } |
| | | |
| | | private async Task ExecuteReturnOperations(string orderNo, string palletCode, Dt_StockInfo stockInfo, |
| | | Dt_Task task, ReturnAnalysisResult analysis) |
| | | { |
| | | // æ
åµ1ï¼å¤çæªåæ£çåºåºéå®è®°å½ |
| | | if (analysis.HasRemainingLocks) |
| | | { |
| | | await HandleRemainingLocksReturn(analysis.RemainingLocks, stockInfo.Id); |
| | | |
| | | // å
³é®ï¼æ´æ°è®¢åæç»çå·²æ£éæ°é |
| | | await UpdateOrderDetailsOnReturn(analysis.RemainingLocks); |
| | | } |
| | | |
| | | // æ
åµ2ï¼å¤çæçä¸å
¶ä»åºåè´§ç© |
| | | if (analysis.HasPalletStockGoods) |
| | | { |
| | | await HandlePalletStockGoodsReturn(analysis.PalletStockGoods); |
| | | } |
| | | |
| | | // æ
åµ3ï¼å¤çæå
è®°å½ |
| | | if (analysis.HasSplitRecords) |
| | | { |
| | | await HandleSplitRecordsReturn(analysis.SplitRecords, orderNo, palletCode); |
| | | } |
| | | |
| | | // æ´æ°åºåä¸»è¡¨ç¶æ |
| | | await UpdateStockInfoStatus(stockInfo); |
| | | } |
| | | |
| | | private async Task HandleRemainingLocksReturn(List<Dt_OutStockLockInfo> remainingLocks, int stockId) |
| | | { |
| | | var lockIds = remainingLocks.Select(x => x.Id).ToList(); |
| | | |
| | | // æ´æ°åºåºéå®è®°å½ç¶æä¸ºååºä¸ |
| | | await _outStockLockInfoService.Db.Updateable<Dt_OutStockLockInfo>() |
| | | .SetColumns(it => new Dt_OutStockLockInfo |
| | | { |
| | | Status = (int)OutLockStockStatusEnum.ååºä¸ |
| | | }) |
| | | .Where(it => lockIds.Contains(it.Id)) |
| | | .ExecuteCommandAsync(); |
| | | |
| | | // å¤çåºåè®°å½ |
| | | foreach (var lockInfo in remainingLocks) |
| | | { |
| | | decimal returnQty = lockInfo.AssignQuantity - lockInfo.PickedQty; |
| | | |
| | | // æ¥æ¾å¯¹åºçåºåæç» |
| | | var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(it => it.Barcode == lockInfo.CurrentBarcode && it.StockId == lockInfo.StockId) |
| | | .FirstAsync(); |
| | | |
| | | if (stockDetail != null) |
| | | { |
| | | // æ¢å¤åºåç¶æ |
| | | stockDetail.OutboundQuantity = Math.Max(0, stockDetail.OutboundQuantity - returnQty); |
| | | stockDetail.Status = StockStatusEmun.å
¥åºå®æ.ObjToInt(); |
| | | await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | } |
| | | else |
| | | { |
| | | // å建æ°çåºåè®°å½ï¼æå
产ççæ°æ¡ç ï¼ |
| | | var newStockDetail = new Dt_StockInfoDetail |
| | | { |
| | | StockId = lockInfo.StockId, |
| | | MaterielCode = lockInfo.MaterielCode, |
| | | MaterielName = lockInfo.MaterielName, |
| | | OrderNo = lockInfo.OrderNo, |
| | | BatchNo = lockInfo.BatchNo, |
| | | StockQuantity = returnQty, |
| | | OutboundQuantity = 0, |
| | | Barcode = lockInfo.CurrentBarcode, |
| | | InboundOrderRowNo = "", |
| | | Status = StockStatusEmun.å
¥åºå®æ.ObjToInt(), |
| | | SupplyCode = lockInfo.SupplyCode, |
| | | WarehouseCode = lockInfo.WarehouseCode, |
| | | Unit = lockInfo.Unit |
| | | }; |
| | | await _stockInfoDetailService.Db.Insertable(newStockDetail).ExecuteCommandAsync(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private async Task UpdateOrderDetailsOnReturn(List<Dt_OutStockLockInfo> remainingLocks) |
| | | { |
| | | // æè®¢åæç»åç» |
| | | var orderDetailGroups = remainingLocks.GroupBy(x => x.OrderDetailId); |
| | | |
| | | foreach (var group in orderDetailGroups) |
| | | { |
| | | var orderDetailId = group.Key; |
| | | var totalReturnQty = group.Sum(x => x.AssignQuantity - x.PickedQty); |
| | | |
| | | // è·åå½å订åæç» |
| | | var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .FirstAsync(x => x.Id == orderDetailId); |
| | | |
| | | if (orderDetail != null) |
| | | { |
| | | // è°æ´å·²æ£éæ°éåå·²åºåºæ°é |
| | | decimal newPickedQty = Math.Max(0, orderDetail.PickedQty - totalReturnQty); |
| | | decimal newOverOutQuantity = Math.Max(0, orderDetail.OverOutQuantity - totalReturnQty); |
| | | |
| | | await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>() |
| | | .SetColumns(it => new Dt_OutboundOrderDetail |
| | | { |
| | | PickedQty = newPickedQty, |
| | | OverOutQuantity = newOverOutQuantity |
| | | }) |
| | | .Where(it => it.Id == orderDetailId) |
| | | .ExecuteCommandAsync(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private async Task HandlePalletStockGoodsReturn(List<Dt_StockInfoDetail> palletStockGoods) |
| | | { |
| | | foreach (var stockGood in palletStockGoods) |
| | | { |
| | | // æ¢å¤åºåç¶æ |
| | | stockGood.OutboundQuantity = 0; |
| | | stockGood.Status = StockStatusEmun.å
¥åºå®æ.ObjToInt(); |
| | | await _stockInfoDetailService.Db.Updateable(stockGood).ExecuteCommandAsync(); |
| | | } |
| | | } |
| | | |
| | | private async Task HandleSplitRecordsReturn(List<Dt_SplitPackageRecord> splitRecords, string orderNo, string palletCode) |
| | | { |
| | | // æ´æ°æå
è®°å½ç¶æ |
| | | await _splitPackageService.Db.Updateable<Dt_SplitPackageRecord>() |
| | | .SetColumns(x => new Dt_SplitPackageRecord |
| | | { |
| | | Status = (int)SplitPackageStatusEnum.å·²ååº |
| | | }) |
| | | .Where(x => x.OrderNo == orderNo && x.PalletCode == palletCode && !x.IsReverted) |
| | | .ExecuteCommandAsync(); |
| | | } |
| | | |
| | | private async Task UpdateStockInfoStatus(Dt_StockInfo stockInfo) |
| | | { |
| | | // æ´æ°åºåä¸»è¡¨ç¶æ |
| | | stockInfo.StockStatus = StockStatusEmun.å
¥åºå®æ.ObjToInt(); |
| | | await _stockInfoService.Db.Updateable(stockInfo).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | private async Task CreateReturnTaskAndHandleESS(string orderNo, string palletCode, Dt_Task originalTask, ReturnAnalysisResult analysis) |
| | | { |
| | | var firstLocation = await _locationInfoService.Db.Queryable<Dt_LocationInfo>() |
| | | .FirstAsync(x => x.LocationCode == originalTask.SourceAddress); |
| | | |
| | | // åé
æ°è´§ä½ï¼ååºå°åå¨ä½ï¼ |
| | | var newLocation = _locationInfoService.AssignLocation(firstLocation.LocationType); |
| | | |
| | | Dt_Task returnTask = new() |
| | | { |
| | | CurrentAddress = stations[originalTask.TargetAddress], |
| | | Grade = 0, |
| | | PalletCode = palletCode, |
| | | NextAddress = "", |
| | | OrderNo = originalTask.OrderNo, |
| | | Roadway = newLocation.RoadwayNo, |
| | | SourceAddress = stations[originalTask.TargetAddress], |
| | | TargetAddress = newLocation.LocationCode, |
| | | TaskStatus = TaskStatusEnum.New.ObjToInt(), |
| | | TaskType = TaskTypeEnum.InPick.ObjToInt(), |
| | | PalletType = originalTask.PalletType, |
| | | WarehouseId = originalTask.WarehouseId, |
| | | |
| | | }; |
| | | |
| | | // ä¿åååºä»»å¡ |
| | | await _taskRepository.Db.Insertable(returnTask).ExecuteCommandAsync(); |
| | | |
| | | // å é¤åå§åºåºä»»å¡ |
| | | _taskRepository.Db.Deleteable(originalTask); |
| | | |
| | | // ç» ESS åéæµå¨ä¿¡å·ååå»ºä»»å¡ |
| | | await SendESSCommands(palletCode, originalTask, returnTask); |
| | | } |
| | | |
| | | private async Task<int> GenerateTaskNumber() |
| | | { |
| | | return await _dailySequenceService.GetNextSequenceAsync(); |
| | | } |
| | | |
| | | private async Task SendESSCommands(string palletCode, Dt_Task originalTask, Dt_Task returnTask) |
| | | { |
| | | try |
| | | { |
| | | // 1. åéæµå¨ä¿¡å· |
| | | var moveResult = await _eSSApiService.MoveContainerAsync(new WIDESEA_DTO.Basic.MoveContainerRequest |
| | | { |
| | | slotCode = movestations[originalTask.TargetAddress], |
| | | containerCode = palletCode |
| | | }); |
| | | |
| | | if (moveResult) |
| | | { |
| | | // 2. å建ååºä»»å¡ |
| | | var essTask = new TaskModel() |
| | | { |
| | | taskType = "putaway", |
| | | taskGroupCode = "", |
| | | groupPriority = 0, |
| | | tasks = new List<TasksType> |
| | | { |
| | | new() |
| | | { |
| | | taskCode = returnTask.TaskNum.ToString(), |
| | | taskPriority = 0, |
| | | taskDescribe = new TaskDescribeType |
| | | { |
| | | containerCode = palletCode, |
| | | containerType = "CT_KUBOT_STANDARD", |
| | | fromLocationCode = stations.GetValueOrDefault(originalTask.TargetAddress) ?? "", |
| | | toStationCode = "", |
| | | toLocationCode = returnTask.TargetAddress, |
| | | deadline = 0, |
| | | storageTag = "" |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | |
| | | var resultTask = await _eSSApiService.CreateTaskAsync(essTask); |
| | | _logger.LogInformation($"ReturnRemaining åå»ºä»»å¡æå: {resultTask}"); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _logger.LogError($"ReturnRemaining ESSå½ä»¤åé失败: {ex.Message}"); |
| | | throw new Exception($"ESSç³»ç»é信失败: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// ååºæä½ |
| | | /// </summary> |
| | | |
| | | //public async Task<WebResponseContent> ReturnRemaining(string orderNo, string palletCode, string reason) |
| | | //{ |
| | | // try |
| | | // { |
| | | // _unitOfWorkManage.BeginTran(); |
| | | |
| | | // // è·åæææªåæ£çåºåºéå®è®°å½ï¼å
æ¬æå
产ççè®°å½ |
| | | // var remainingLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | // .Where(it => it.OrderNo == orderNo && it.Status == (int)OutLockStockStatusEnum.åºåºä¸) |
| | | // .ToListAsync(); |
| | | |
| | | // var stockinfo = _stockInfoService.Db.Queryable<Dt_StockInfo>().First(x => x.PalletCode == palletCode); |
| | | |
| | | // var tasks = new List<Dt_Task>(); |
| | | |
| | | // // æ¥è¯¢ä»»å¡è¡¨ |
| | | // var task = remainingLocks.Any() |
| | | // ? _taskRepository.QueryData(x => x.TaskNum == remainingLocks.First().TaskNum).FirstOrDefault() |
| | | // : _taskRepository.QueryData(x => x.PalletCode == palletCode).FirstOrDefault(); |
| | | |
| | | // if (task == null) |
| | | // { |
| | | // return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡ä¿¡æ¯"); |
| | | // } |
| | | |
| | | // // æ£æ¥æç䏿¯å¦æå
¶ä»éåºåºè´§ç©ï¼åºåè´§ç©ï¼ |
| | | // var palletStockGoods = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | // .Where(it => it.StockId == stockinfo.Id && |
| | | // (it.Status == StockStatusEmun.å
¥åºç¡®è®¤.ObjToInt() || |
| | | // it.Status == StockStatusEmun.å
¥åºå®æ.ObjToInt() || |
| | | // it.Status == StockStatusEmun.åºåºéå®.ObjToInt())) |
| | | // .Where(it => it.OutboundQuantity == 0 || it.OutboundQuantity < it.StockQuantity) // æªå®å
¨åºåºç |
| | | // .ToListAsync(); |
| | | |
| | | // // æ£æ¥æå
è®°å½ï¼æ¾åºéè¦ååºçæ¡ç |
| | | // var splitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>() |
| | | // .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode && !it.IsReverted) |
| | | // .ToListAsync(); |
| | | |
| | | // // 计ç®éè¦ååºçæå
æ¡ç |
| | | // var splitBarcodesToReturn = new List<string>(); |
| | | // foreach (var splitRecord in splitRecords) |
| | | // { |
| | | // // æ£æ¥åæ¡ç æ¯å¦è¿æåºåéè¦ååº |
| | | // var originalStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | // .Where(it => it.Barcode == splitRecord.OriginalBarcode && it.StockId == stockinfo.Id) |
| | | // .FirstAsync(); |
| | | |
| | | // if (originalStock != null && originalStock.StockQuantity > 0) |
| | | // { |
| | | // splitBarcodesToReturn.Add(splitRecord.OriginalBarcode); |
| | | // } |
| | | |
| | | // // æ£æ¥æ°æ¡ç æ¯å¦è¿æåºåéè¦ååº |
| | | // var newStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | // .Where(it => it.Barcode == splitRecord.NewBarcode && it.StockId == stockinfo.Id) |
| | | // .FirstAsync(); |
| | | |
| | | // if (newStock != null && newStock.StockQuantity > 0) |
| | | // { |
| | | // splitBarcodesToReturn.Add(splitRecord.NewBarcode); |
| | | // } |
| | | // } |
| | | |
| | | // // å¦ææ²¡æéè¦ååºçè´§ç©ï¼æ¢æ æªåæ£åºåºè´§ç©ï¼ä¹æ å
¶ä»åºåè´§ç©ï¼ä¹æ æå
å©ä½è´§ç©ï¼ |
| | | // if (!remainingLocks.Any() && !palletStockGoods.Any() && !splitBarcodesToReturn.Any()) |
| | | // { |
| | | // // æ£æ¥æ¯å¦ææè´§ç©é½å·²æ£é宿 |
| | | // var allPicked = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | // .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode) |
| | | // .AnyAsync(it => it.Status == (int)OutLockStockStatusEnum.æ£é宿); |
| | | |
| | | // if (allPicked) |
| | | // { |
| | | // return WebResponseContent.Instance.OK("ææè´§ç©å·²æ£éå®æï¼æç为空"); |
| | | // } |
| | | // else |
| | | // { |
| | | // return WebResponseContent.Instance.Error("没æéè¦ååºçå©ä½è´§ç©"); |
| | | // } |
| | | // } |
| | | |
| | | // var firstlocation = _locationInfoService.Db.Queryable<Dt_LocationInfo>().First(x => x.LocationCode == task.SourceAddress); |
| | | // decimal totalReturnQty = 0; |
| | | |
| | | // // æ
åµ1ï¼å¤çæªåæ£çåºåºéå®è®°å½ |
| | | // if (remainingLocks.Any(x => x.PalletCode == palletCode)) |
| | | // { |
| | | // var palletLocks = remainingLocks.Where(x => x.PalletCode == palletCode).ToList(); |
| | | // totalReturnQty = palletLocks.Sum(x => x.AssignQuantity - x.PickedQty); |
| | | |
| | | // if (totalReturnQty > 0) |
| | | // { |
| | | // // åé
æ°è´§ä½ |
| | | // var newLocation = _locationInfoService.AssignLocation(firstlocation.LocationType); |
| | | |
| | | // // æ´æ°åºåºéå®è®°å½ç¶æ |
| | | // var lockIds = palletLocks.Select(x => x.Id).ToList(); |
| | | // await _outStockLockInfoService.Db.Updateable<Dt_OutStockLockInfo>() |
| | | // .SetColumns(it => new Dt_OutStockLockInfo { Status = (int)OutLockStockStatusEnum.ååºä¸ }) |
| | | // .Where(it => lockIds.Contains(it.Id)) |
| | | // .ExecuteCommandAsync(); |
| | | |
| | | |
| | | |
| | | // // å¤çåºåè®°å½ |
| | | // foreach (var lockInfo in palletLocks) |
| | | // { |
| | | // decimal returnQty = lockInfo.AssignQuantity - lockInfo.PickedQty; |
| | | |
| | | // // æ£æ¥åºåè®°å½æ¯å¦åå¨ |
| | | // var existingStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | // .Where(it => it.Barcode == lockInfo.CurrentBarcode && it.StockId == lockInfo.StockId) |
| | | // .FirstAsync(); |
| | | |
| | | // if (existingStock != null) |
| | | // { |
| | | // // åºåè®°å½åå¨ï¼æ¢å¤é宿°é |
| | | // existingStock.OutboundQuantity = 0; |
| | | |
| | | // await _stockInfoDetailService.Db.Updateable(existingStock).ExecuteCommandAsync(); |
| | | // } |
| | | // else |
| | | // { |
| | | // // åºåè®°å½ä¸åå¨ï¼å¯è½æ¯æå
产ççæ°æ¡ç ï¼ï¼å建æ°çåºåè®°å½ |
| | | // var newStockDetail = new Dt_StockInfoDetail |
| | | // { |
| | | // StockId = lockInfo.StockId, |
| | | // MaterielCode = lockInfo.MaterielCode, |
| | | // MaterielName = lockInfo.MaterielName, |
| | | // OrderNo = lockInfo.OrderNo, |
| | | // BatchNo = lockInfo.BatchNo, |
| | | // StockQuantity = returnQty, |
| | | // OutboundQuantity = 0, |
| | | // Barcode = lockInfo.CurrentBarcode, |
| | | // InboundOrderRowNo = "", |
| | | // Status = StockStatusEmun.å
¥åºå®æ.ObjToInt(), |
| | | // SupplyCode = lockInfo.SupplyCode, |
| | | // WarehouseCode = lockInfo.WarehouseCode, |
| | | // Unit = lockInfo.Unit |
| | | // }; |
| | | // await _stockInfoDetailService.Db.Insertable(newStockDetail).ExecuteCommandAsync(); |
| | | // } |
| | | // } |
| | | |
| | | // // å建ååºä»»å¡ |
| | | // CreateReturnTask(tasks, task, palletCode, newLocation); |
| | | // } |
| | | // } |
| | | |
| | | // // æ
åµ2ï¼å¤çæå
å©ä½çåºåè´§ç© |
| | | // if (splitBarcodesToReturn.Any()) |
| | | // { |
| | | // decimal splitReturnQty = 0; |
| | | |
| | | // foreach (var barcode in splitBarcodesToReturn) |
| | | // { |
| | | // var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | // .Where(it => it.Barcode == barcode && it.StockId == stockinfo.Id) |
| | | // .FirstAsync(); |
| | | |
| | | // if (stockDetail != null && stockDetail.StockQuantity > 0) |
| | | // { |
| | | // splitReturnQty += stockDetail.StockQuantity; |
| | | |
| | | // // æ¢å¤åºåç¶æä¸ºå
¥åºå®æ |
| | | // stockDetail.OutboundQuantity = 0; |
| | | |
| | | // await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | // } |
| | | // } |
| | | |
| | | // totalReturnQty += splitReturnQty; |
| | | |
| | | // // å¦ææ²¡æå建任å¡ï¼å建ååºä»»å¡ |
| | | // if (!tasks.Any()) |
| | | // { |
| | | // var newLocation = _locationInfoService.AssignLocation(firstlocation.LocationType); |
| | | // CreateReturnTask(tasks, task, palletCode, newLocation); |
| | | // } |
| | | // } |
| | | |
| | | // // æ
åµ3ï¼åºåºè´§ç©å·²åæ£å®ï¼ä½æçä¸è¿æå
¶ä»åºåè´§ç©éè¦ååº |
| | | // if (palletStockGoods.Any() && !remainingLocks.Any(x => x.PalletCode == palletCode)) |
| | | // { |
| | | // decimal otherReturnQty = palletStockGoods.Sum(x => x.StockQuantity - x.OutboundQuantity); |
| | | // totalReturnQty += otherReturnQty; |
| | | // // æ´æ°è¿äºåºåè´§ç©çç¶æ |
| | | // foreach (var stockGood in palletStockGoods) |
| | | // { |
| | | // stockGood.OutboundQuantity = 0; |
| | | |
| | | // await _stockInfoDetailService.Db.Updateable(stockGood).ExecuteCommandAsync(); |
| | | // } |
| | | // // å¦ææ²¡æå建任å¡ï¼å建ååºä»»å¡ |
| | | // if (!tasks.Any()) |
| | | // { |
| | | // var newLocation = _locationInfoService.AssignLocation(firstlocation.LocationType); |
| | | // CreateReturnTask(tasks, task, palletCode, newLocation); |
| | | // } |
| | | |
| | | |
| | | // } |
| | | |
| | | // var allSplitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>() |
| | | // .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode && !it.IsReverted) |
| | | // .ToListAsync(); |
| | | |
| | | // foreach (var record in allSplitRecords) |
| | | // { |
| | | // record.Status = (int)SplitPackageStatusEnum.å·²ååº; |
| | | // await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync(); |
| | | // } |
| | | // // ä¿åä»»å¡ ç»ESSä¸åä»»å¡ |
| | | // if (tasks.Any()) |
| | | // { |
| | | // 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[targetAddress], |
| | | // containerCode = palletCode |
| | | // }); |
| | | |
| | | // if (result) |
| | | // { |
| | | // TaskModel esstask = new TaskModel() |
| | | // { |
| | | // taskType = "putaway", |
| | | // taskGroupCode = "", |
| | | // groupPriority = 0, |
| | | // tasks = new List<TasksType> |
| | | // { |
| | | // new() |
| | | // { |
| | | // taskCode = tasks.First().TaskNum.ToString(), |
| | | // taskPriority = 0, |
| | | // taskDescribe = new TaskDescribeType { |
| | | // containerCode = palletCode, |
| | | // containerType = "CT_KUBOT_STANDARD", |
| | | // fromLocationCode = stations.GetValueOrDefault(targetAddress) ?? "", |
| | | // toStationCode = "", |
| | | // toLocationCode = tasks.First().TargetAddress, |
| | | // deadline = 0, storageTag = "" |
| | | // } |
| | | // } |
| | | // } |
| | | // }; |
| | | |
| | | // var resulttask = await _eSSApiService.CreateTaskAsync(esstask); |
| | | // _logger.LogInformation("ReturnRemaining å建任å¡è¿å: " + resulttask); |
| | | // } |
| | | // } |
| | | // catch (Exception ex) |
| | | // { |
| | | // _logger.LogInformation("ReturnRemaining å建任å¡è¿å catch err: " + ex.Message); |
| | | // } |
| | | |
| | | // _unitOfWorkManage.CommitTran(); |
| | | // return WebResponseContent.Instance.OK($"ååºæä½æåï¼å
±ååºæ°éï¼{totalReturnQty}"); |
| | | // } |
| | | // catch (Exception ex) |
| | | // { |
| | | // _unitOfWorkManage.RollbackTran(); |
| | | // return WebResponseContent.Instance.Error($"å建ååºä»»å¡å¤±è´¥: {ex.Message}"); |
| | | // } |
| | | // } |
| | | |
| | | // _unitOfWorkManage.RollbackTran(); |
| | | // return WebResponseContent.Instance.Error("æªå建任ä½ååºä»»å¡"); |
| | | // } |
| | | // catch (Exception ex) |
| | | // { |
| | | // _unitOfWorkManage.RollbackTran(); |
| | | // return WebResponseContent.Instance.Error($"ååºæä½å¤±è´¥: {ex.Message}"); |
| | | // } |
| | | //} |
| | | |
| | | |
| | | /// <summary> |
| | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è®°å½åæ¶æä½åå² |
| | | /// </summary> |
| | | private async Task RecordCancelHistory(string orderNo, string palletCode, string barcode, |
| | | decimal cancelQty, int pickingRecordId, string materielCode, string reason) |
| | | { |
| | | |
| | | |
| | | //var cancelHistory = new Dt_PickingCancelRecord |
| | | //{ |
| | | // OrderNo = orderNo, |
| | | // PalletCode = palletCode, |
| | | // Barcode = barcode, |
| | | // CancelQuantity = cancelQty, |
| | | // CancelTime = DateTime.Now, |
| | | // Operator = App.User.UserName, |
| | | // OriginalPickingRecordId = pickingRecordId, |
| | | // MaterielCode = materielCode, |
| | | // Reason = reason |
| | | //}; |
| | | //await Db.Insertable(cancelHistory).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æå
é¾é¡¹ |
| | | /// </summary> |
| | | public class SplitChainItem |
| | | { |
| | | public Dt_SplitPackageRecord SplitRecord { get; set; } |
| | | public string OriginalBarcode { get; set; } |
| | | public string NewBarcode { get; set; } |
| | | public decimal SplitQuantity { get; set; } |
| | | } |
| | | // è·åæªæ£éå表 |
| | | public async Task<List<Dt_OutStockLockInfo>> GetUnpickedList(string orderNo, string palletCode) |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | #region è¿å |
| | | /// <summary> |
| | | /// æå
é¾é¡¹ |
| | | /// </summary> |
| | | public class SplitChainItem |
| | | { |
| | | public Dt_SplitPackageRecord SplitRecord { get; set; } |
| | | public string OriginalBarcode { get; set; } |
| | | public string NewBarcode { get; set; } |
| | | public decimal SplitQuantity { get; set; } |
| | | } |
| | | public class ReturnAnalysisResult |
| | | { |
| | | public bool HasItemsToReturn { get; set; } |
| | | public bool HasRemainingLocks { get; set; } |
| | | public bool HasPalletStockGoods { get; set; } |
| | | public bool HasSplitRecords { get; set; } |
| | | public decimal RemainingLocksReturnQty { get; set; } |
| | | public decimal PalletStockReturnQty { get; set; } |
| | | public decimal SplitReturnQty { get; set; } |
| | | public decimal TotalReturnQty { get; set; } |
| | | public List<Dt_OutStockLockInfo> RemainingLocks { get; set; } = new List<Dt_OutStockLockInfo>(); |
| | | public List<Dt_StockInfoDetail> PalletStockGoods { get; set; } = new List<Dt_StockInfoDetail>(); |
| | | public List<Dt_SplitPackageRecord> SplitRecords { get; set; } = new List<Dt_SplitPackageRecord>(); |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | } |