From 458dea79f2b5045620bc85134baeb87b31081e5c Mon Sep 17 00:00:00 2001
From: pan <antony1029@163.com>
Date: 星期日, 30 十一月 2025 18:14:08 +0800
Subject: [PATCH] 提交
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs | 194 +++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 180 insertions(+), 14 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 84ab0f8..0fb6e2d 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"
@@ -53,6 +53,10 @@
private readonly IESSApiService _eSSApiService;
private readonly IInvokeMESService _invokeMESService;
private readonly IDailySequenceService _dailySequenceService;
+ private readonly IAllocateService _allocateService;
+ private readonly IRepository<Dt_InboundOrder> _inboundOrderRepository;
+ private readonly IInboundOrderDetailService _inboundOrderDetailService;
+
private readonly ILogger<OutboundPickingService> _logger;
@@ -73,7 +77,7 @@
public OutboundPickingService(IRepository<Dt_PickingRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, IStockService stockService,
IOutStockLockInfoService outStockLockInfoService, IStockInfoDetailService stockInfoDetailService, ILocationInfoService locationInfoService,
IOutboundOrderDetailService outboundOrderDetailService, ISplitPackageService splitPackageService, IOutboundOrderService outboundOrderService,
- IRepository<Dt_Task> taskRepository, IESSApiService eSSApiService, ILogger<OutboundPickingService> logger, IInvokeMESService invokeMESService, IDailySequenceService dailySequenceService) : base(BaseDal)
+ IRepository<Dt_Task> taskRepository, IESSApiService eSSApiService, ILogger<OutboundPickingService> logger, IInvokeMESService invokeMESService, IDailySequenceService dailySequenceService, IAllocateService allocateService, IRepository<Dt_InboundOrder> inboundOrderRepository,IInboundOrderDetailService inboundOrderDetailService) : base(BaseDal)
{
_unitOfWorkManage = unitOfWorkManage;
_stockInfoService = stockInfoService;
@@ -89,6 +93,9 @@
_logger = logger;
_invokeMESService = invokeMESService;
_dailySequenceService = dailySequenceService;
+ _allocateService = allocateService;
+ _inboundOrderRepository = inboundOrderRepository;
+ _inboundOrderDetailService = inboundOrderDetailService;
}
@@ -677,9 +684,7 @@
if (newOverOutQuantity > currentOrderDetail.NeedOutQuantity)
{
-
_logger.LogError($"闃茶秴鎷f鏌ュけ璐� - OrderDetailId: {orderDetailId}, 宸插嚭搴�: {newOverOutQuantity}, 闇�姹�: {currentOrderDetail.NeedOutQuantity}, 鏈鍒嗘嫞: {pickedQty}");
-
decimal adjustedQty = currentOrderDetail.NeedOutQuantity - currentOrderDetail.OverOutQuantity;
@@ -688,6 +693,7 @@
_logger.LogWarning($"鑷姩璋冩暣鍒嗘嫞鏁伴噺闃叉瓒呮嫞锛氫粠{pickedQty}璋冩暣涓簕adjustedQty}");
newOverOutQuantity = currentOrderDetail.NeedOutQuantity;
newPickedQty = currentOrderDetail.PickedQty + adjustedQty;
+ pickedQty = adjustedQty; // 鏇存柊瀹為檯鎷i�夋暟閲�
}
else
{
@@ -695,15 +701,21 @@
}
}
- // 鏇存柊璁㈠崟鏄庣粏
+ // 鏇存柊璁㈠崟鏄庣粏鏁伴噺鍜岀姸鎬�
await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
.SetColumns(it => new Dt_OutboundOrderDetail
{
PickedQty = newPickedQty,
OverOutQuantity = newOverOutQuantity,
+ OrderDetailStatus = newOverOutQuantity >= currentOrderDetail.NeedOutQuantity ?
+ OrderDetailStatusEnum.Over.ObjToInt() :
+ OrderDetailStatusEnum.Outbound.ObjToInt()
})
.Where(it => it.Id == orderDetailId)
.ExecuteCommandAsync();
+
+ // 鏇存柊閿佸畾鏁伴噺
+ await UpdateOrderDetailLockQuantity(orderDetailId);
// 妫�鏌ュ苟鏇存柊璁㈠崟鐘舵��
await CheckAndUpdateOrderStatus(orderNo);
@@ -734,7 +746,15 @@
PickQuantity = result.ActualPickedQty,
PickTime = DateTime.Now,
Operator = App.User.UserName,
- OutStockLockId = result.FinalLockInfo.Id
+ OutStockLockId = result.FinalLockInfo.Id,
+ BarcodeUnit=result.FinalLockInfo.BarcodeUnit,
+ BarcodeQty=result.FinalLockInfo.BarcodeQty,
+ BatchNo= result.FinalLockInfo.BatchNo,
+ lineNo= result.FinalLockInfo.lineNo ,
+ SupplyCode= result.FinalLockInfo.SupplyCode ,
+ WarehouseCode = result.FinalLockInfo.WarehouseCode ,
+
+
};
await Db.Insertable(pickingHistory).ExecuteCommandAsync();
@@ -1097,12 +1117,28 @@
if (newPickedQty < 0)
throw new Exception($"鍙栨秷鍒嗘嫞灏嗗鑷村凡鎷i�夋暟閲�({newPickedQty})涓鸿礋鏁�");
+ // 纭畾鏂扮殑鐘舵��
+ int newStatus;
+ if (newOverOutQuantity >= currentOrderDetail.NeedOutQuantity)
+ {
+ newStatus = OrderDetailStatusEnum.Over.ObjToInt();
+ }
+ else if (newOverOutQuantity > 0)
+ {
+ newStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
+ }
+ else
+ {
+ newStatus = OrderDetailStatusEnum.New.ObjToInt();
+ }
+
// 鏇存柊璁㈠崟鏄庣粏
var updateResult = await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
.SetColumns(it => new Dt_OutboundOrderDetail
{
PickedQty = newPickedQty,
- OverOutQuantity = newOverOutQuantity
+ OverOutQuantity = newOverOutQuantity,
+ OrderDetailStatus = newStatus
})
.Where(it => it.Id == orderDetailId)
.ExecuteCommandAsync();
@@ -1110,9 +1146,13 @@
if (updateResult <= 0)
throw new Exception("鏇存柊璁㈠崟鏄庣粏澶辫触");
+ // 鏇存柊閿佸畾鏁伴噺
+ await UpdateOrderDetailLockQuantity(orderDetailId);
+
_logger.LogInformation($"鏇存柊璁㈠崟鏄庣粏 - OrderDetailId: {orderDetailId}, " +
$"鎵e噺宸插嚭搴�: {cancelQty}, 鏂板凡鍑哄簱: {newOverOutQuantity}, " +
- $"鎵e噺宸叉嫞閫�: {cancelQty}, 鏂板凡鎷i��: {newPickedQty}");
+ $"鎵e噺宸叉嫞閫�: {cancelQty}, 鏂板凡鎷i��: {newPickedQty}, " +
+ $"鏂扮姸鎬�: {newStatus}");
}
#endregion
@@ -1449,6 +1489,7 @@
if (stockDetail != null)
{
+ stockDetail.StockQuantity += returnQty;
// 鎭㈠搴撳瓨鐘舵��
stockDetail.OutboundQuantity = Math.Max(0, stockDetail.OutboundQuantity - returnQty);
stockDetail.Status = StockStatusEmun.鍏ュ簱纭.ObjToInt();
@@ -1456,6 +1497,7 @@
}
else
{
+ _logger.LogWarning($"鏈壘鍒板搴旂殑搴撳瓨鏄庣粏 - 鏉$爜: {lockInfo.CurrentBarcode}, 搴撳瓨ID: {lockInfo.StockId}");
// 鍒涘缓鏂扮殑搴撳瓨璁板綍
//var newStockDetail = new Dt_StockInfoDetail
//{
@@ -1475,7 +1517,34 @@
//};
//await _stockInfoDetailService.Db.Insertable(newStockDetail).ExecuteCommandAsync();
}
+ try
+ {
+ var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+ .FirstAsync(x => x.Id == lockInfo.OrderDetailId);
+
+ if (orderDetail != null)
+ {
+ decimal newLockQuantity = Math.Max(0, orderDetail.LockQuantity - returnQty);
+
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(it => new Dt_OutboundOrderDetail
+ {
+ LockQuantity = newLockQuantity
+ })
+ .Where(it => it.Id == lockInfo.OrderDetailId)
+ .ExecuteCommandAsync();
+
+ _logger.LogInformation($"鏇存柊璁㈠崟鏄庣粏閿佸畾鏁伴噺 - OrderDetailId: {lockInfo.OrderDetailId}, " +
+ $"鎵e噺閿佸畾: {returnQty}, 鏂伴攣瀹氭暟閲�: {newLockQuantity}");
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError($"鏇存柊璁㈠崟鏄庣粏閿佸畾鏁伴噺澶辫触 - OrderDetailId: {lockInfo.OrderDetailId}, Error: {ex.Message}");
+ }
}
+
+
}
private async Task UpdateOrderDetailsOnReturn(List<Dt_OutStockLockInfo> remainingLocks)
@@ -1677,13 +1746,25 @@
.ToListAsync();
bool allCompleted = true;
+ bool hasPartial = false;
+ bool hasLocked = false;
+
foreach (var detail in orderDetails)
{
if (detail.OverOutQuantity < detail.NeedOutQuantity)
{
allCompleted = false;
- break;
}
+
+ if (detail.OrderDetailStatus == OrderDetailStatusEnum.Outbound.ObjToInt())
+ {
+ hasPartial = true;
+ }
+
+ //if (detail.OrderDetailStatus == OrderDetailStatusEnum.Locked.ObjToInt())
+ //{
+ // hasLocked = true;
+ //}
}
var outboundOrder = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>()
@@ -1691,7 +1772,19 @@
if (outboundOrder == null) return;
- int newStatus = allCompleted ? (int)OutOrderStatusEnum.鍑哄簱瀹屾垚 : (int)OutOrderStatusEnum.鍑哄簱涓�;
+ int newStatus;
+ if (allCompleted)
+ {
+ newStatus = (int)OutOrderStatusEnum.鍑哄簱瀹屾垚;
+ }
+ else if (hasPartial )
+ {
+ newStatus = (int)OutOrderStatusEnum.鍑哄簱涓�;
+ }
+ else
+ {
+ newStatus = (int)OutOrderStatusEnum.鏈紑濮�;
+ }
if (outboundOrder.OrderStatus != newStatus)
{
@@ -1704,11 +1797,13 @@
.Where(x => x.OrderNo == orderNo)
.ExecuteCommandAsync();
+ _logger.LogInformation($"璁㈠崟鐘舵�佹洿鏂� - OrderNo: {orderNo}, 鏃х姸鎬�: {outboundOrder.OrderStatus}, 鏂扮姸鎬�: {newStatus}");
+
// 鍙湁姝e父鍒嗘嫞瀹屾垚鏃舵墠鍚慚ES鍙嶉
- //if (allCompleted && newStatus == (int)OutOrderStatusEnum.鍑哄簱瀹屾垚)
- //{
- // await HandleOrderCompletion(outboundOrder, orderNo);
- //}
+ if (allCompleted && newStatus == (int)OutOrderStatusEnum.鍑哄簱瀹屾垚)
+ {
+ await HandleOrderCompletion(outboundOrder, orderNo);
+ }
}
}
catch (Exception ex)
@@ -1717,8 +1812,70 @@
}
}
+ /// <summary>
+ /// 鏇存柊璁㈠崟鏄庣粏鐘舵�侊紙鍩轰簬宸插嚭搴撴暟閲忥級
+ /// </summary>
+ private async Task UpdateOrderDetailStatus(int orderDetailId)
+ {
+ var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+ .FirstAsync(x => x.Id == orderDetailId);
+ if (orderDetail == null) return;
+ int newStatus = orderDetail.OrderDetailStatus;
+
+ if (orderDetail.OverOutQuantity >= orderDetail.NeedOutQuantity)
+ {
+ // 宸插嚭搴撴暟閲� >= 闇�姹傛暟閲忥紝鏍囪涓哄畬鎴�
+ newStatus = OrderDetailStatusEnum.Over.ObjToInt();
+ }
+ else if (orderDetail.OverOutQuantity > 0)
+ {
+ // 鏈夐儴鍒嗗嚭搴擄紝浣嗘湭瀹屾垚
+ newStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
+ }
+ else if (orderDetail.LockQuantity > 0)
+ {
+ // 鏈夐攣瀹氭暟閲忥紝浣嗘湭鍑哄簱
+ //newStatus = OrderDetailStatusEnum.Locked.ObjToInt();
+ }
+ else
+ {
+ // 鏂板缓鐘舵��
+ newStatus = OrderDetailStatusEnum.New.ObjToInt();
+ }
+
+ // 鍙湁鐘舵�佸彂鐢熷彉鍖栨椂鎵嶆洿鏂�
+ if (orderDetail.OrderDetailStatus != newStatus)
+ {
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(it => new Dt_OutboundOrderDetail
+ {
+ OrderDetailStatus = newStatus,
+
+ })
+ .Where(it => it.Id == orderDetailId)
+ .ExecuteCommandAsync();
+ }
+ }
+ /// <summary>
+ /// 鏇存柊璁㈠崟鏄庣粏閿佸畾鏁伴噺
+ /// </summary>
+ private async Task UpdateOrderDetailLockQuantity(int orderDetailId)
+ {
+ var totalLockedQty = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(x => x.OrderDetailId == orderDetailId &&
+ x.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
+ .SumAsync(x => x.AssignQuantity - x.PickedQty);
+
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(it => new Dt_OutboundOrderDetail
+ {
+ LockQuantity = totalLockedQty
+ })
+ .Where(it => it.Id == orderDetailId)
+ .ExecuteCommandAsync();
+ }
private async Task UpdateOrderStatusForReturn(string orderNo)
{
try
@@ -2453,7 +2610,7 @@
return WebResponseContent.Instance.Error($"鍑哄簱鍗曟槑缁嗘暟閲忔孩鍑簕matchedCode.LockQuantity - matchedCode.OrderQuantity}");
}
matchedDetail.OrderDetailStatus = OrderDetailStatusEnum.Inbounding.ObjToInt();
- matchedCode.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
+ matchedCode.OrderDetailStatus = OrderDetailStatusEnum.AssignOver.ObjToInt();
_unitOfWorkManage.BeginTran();
_inboundOrderDetailService.UpdateData(matchedDetail);
@@ -2486,6 +2643,11 @@
}
matchedDetail.NoStockOutQty = 0;
+ if(matchedDetail.ReceiptQuantity==0 && matchedDetail.OverInQuantity==0)
+ {
+ matchedDetail.OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt();
+ }
+
Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == noStockOut.outOder && x.OrderStatus != OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()).Includes(x => x.Details).First();
if (outboundOrder == null)
{
@@ -2498,6 +2660,10 @@
return WebResponseContent.Instance.Error($"鍦ㄥ嚭搴撳崟鐨勭墿鏂欑紪鐮佷腑鏈壘鍒颁笌閲囪喘鍗曚腑鐨剓matchedDetail.MaterielCode} 瀵瑰簲鐨勭墿鏂欍��");
}
matchedCode.NoStockOutQty = 0;
+ if (matchedCode.LockQuantity == 0 && matchedCode.OverOutQuantity == 0)
+ {
+ matchedCode.OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt();
+ }
_unitOfWorkManage.BeginTran();
_inboundOrderDetailService.UpdateData(matchedDetail);
_outboundOrderDetailService.UpdateData(matchedCode);
--
Gitblit v1.9.3