From 482aa82a99419383848cabbdf135744259b17c77 Mon Sep 17 00:00:00 2001
From: pan <antony1029@163.com>
Date: 星期五, 21 十一月 2025 18:59:23 +0800
Subject: [PATCH] 提交
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs | 1055 ++++++++++++++++++++++++++++++++++++++++++----------------
1 files changed, 762 insertions(+), 293 deletions(-)
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs"
index 4c19d90..90abb47 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs"
@@ -209,7 +209,7 @@
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.鎷i�夊畬鎴�).ToList();
var groupedData = lists.GroupBy(item => new { item.MaterielCode, item.lineNo, item.Unit, item.WarehouseCode })
.Select(group => new FeedbackOutboundDetailsModel
@@ -226,7 +226,7 @@
supplyCode = row.SupplyCode,
batchNo = row.BatchNo,
unit = row.Unit,
- qty = row.AssignQuantity
+ qty = row.PickedQty
}).ToList()
}).ToList();
feedmodel.details = groupedData;
@@ -700,294 +700,763 @@
}
}
- /// <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.鎷i�夊畬鎴�);
+ // 鎵ц鍥炲簱鎿嶄綔
+ await ExecuteReturnOperations(orderNo, palletCode, stockInfo, task, returnAnalysis);
- if (allPicked)
- {
- return WebResponseContent.Instance.OK("鎵�鏈夎揣鐗╁凡鎷i�夊畬鎴愶紝鎵樼洏涓虹┖");
- }
- else
- {
- return WebResponseContent.Instance.Error("娌℃湁闇�瑕佸洖搴撶殑鍓╀綑璐х墿");
- }
- }
+ //鍒涘缓鍥炲簱浠诲姟骞跺鐞咵SS
+ 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();
- }
- // 淇濆瓨浠诲姟 缁橢SS涓嬪彂浠诲姟
- 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();
+
+ // 鑾峰彇鏈垎鎷g殑鍑哄簱閿佸畾璁板綍
+ 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.鎷i�夊畬鎴�);
+
+ if (allPicked)
+ {
+ return WebResponseContent.Instance.OK("鎵�鏈夎揣鐗╁凡鎷i�夊畬鎴愶紝鎵樼洏涓虹┖");
+ }
+ 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.鎷i�夊畬鎴�);
+
+ // if (allPicked)
+ // {
+ // return WebResponseContent.Instance.OK("鎵�鏈夎揣鐗╁凡鎷i�夊畬鎴愶紝鎵樼洏涓虹┖");
+ // }
+ // 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();
+ // }
+ // // 淇濆瓨浠诲姟 缁橢SS涓嬪彂浠诲姟
+ // 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>
@@ -1262,38 +1731,9 @@
}
}
- /// <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)
{
@@ -1537,4 +1977,33 @@
}
}
+
+ #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
+
}
--
Gitblit v1.9.3