From 4476740c214edb7ab667c48fcab00488fbdd9879 Mon Sep 17 00:00:00 2001
From: pan <antony1029@163.com>
Date: 星期六, 15 十一月 2025 09:03:54 +0800
Subject: [PATCH] 提交
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs | 235 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 227 insertions(+), 8 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 82df3f5..fafc2a8 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"
@@ -1,4 +1,6 @@
-锘縰sing System;
+锘縰sing Microsoft.AspNetCore.Http;
+using SqlSugar;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -9,6 +11,7 @@
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
+using WIDESEA_Core.Helper;
using WIDESEA_DTO.Outbound;
using WIDESEA_IBasicService;
using WIDESEA_IOutboundService;
@@ -31,10 +34,11 @@
private readonly IStockInfoDetailService _stockInfoDetailService;
private readonly ILocationInfoService _locationInfoService;
private readonly IOutboundOrderDetailService _outboundOrderDetailService;
+ private readonly IOutboundOrderService _outboundOrderService;
private readonly ISplitPackageService _splitPackageService;
-
- public OutboundPickingService(IRepository<Dt_PickingRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, IStockService stockService, IOutStockLockInfoService outStockLockInfoService, IStockInfoDetailService stockInfoDetailService, ILocationInfoService locationInfoService, IOutboundOrderDetailService outboundOrderDetailService, ISplitPackageService splitPackageService) : base(BaseDal)
+
+ public OutboundPickingService(IRepository<Dt_PickingRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, IStockService stockService, IOutStockLockInfoService outStockLockInfoService, IStockInfoDetailService stockInfoDetailService, ILocationInfoService locationInfoService, IOutboundOrderDetailService outboundOrderDetailService, ISplitPackageService splitPackageService, IOutboundOrderService outboundOrderService) : base(BaseDal)
{
_unitOfWorkManage = unitOfWorkManage;
_stockInfoService = stockInfoService;
@@ -44,9 +48,10 @@
_locationInfoService = locationInfoService;
_outboundOrderDetailService = outboundOrderDetailService;
_splitPackageService = splitPackageService;
+ _outboundOrderService = outboundOrderService;
}
-
+
#region 鏌ヨ鍑哄簱璇︽儏鍒楄〃
public async Task<List<OutStockLockListResp>> GetOutStockLockListAsync(string orderNo)
{
@@ -57,13 +62,13 @@
return locks.Select(t => new OutStockLockListResp
{
Id = t.Id,
- // TaskNum = t.TaskNum,
+ // TaskNum = t.TaskNum,
PalletCode = t.PalletCode,
CurrentBarcode = t.CurrentBarcode,
AssignQuantity = t.AssignQuantity,
PickedQty = t.PickedQty,
Status = t.Status,
- // IsSplitted = t.IsSplitted
+ // IsSplitted = t.IsSplitted
}).ToList();
}
#endregion
@@ -87,13 +92,13 @@
return WebResponseContent.Instance.Error("鏉$爜涓嶅瓨鍦�");
}
-
+
var result = new
{
Barcode = barcode,
MaterielCode = stockDetail.MaterielCode,
-
+
BatchNo = stockDetail.BatchNo,
AvailableQuantity = stockDetail.StockQuantity - stockDetail.OutboundQuantity,
LocationCode = stockDetail.StockInfo?.LocationCode,
@@ -203,6 +208,162 @@
}
}
+ public async Task<WebResponseContent> ConfirmPicking(string orderNo, string palletCode, string barcode)
+ {
+ try
+ {
+ _unitOfWorkManage.BeginTran();
+ // 1. 楠岃瘉鏉$爜鏈夋晥鎬�
+ var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(x => x.Barcode == barcode)
+ .FirstAsync();
+
+ if (stockDetail == null)
+ return WebResponseContent.Instance.Error("鏃犳晥鐨勬潯鐮佹垨鐗╂枡缂栫爜");
+
+ // 2. 妫�鏌ュ簱瀛樺彲鐢ㄦ暟閲�
+ var availableQty = stockDetail.StockQuantity - stockDetail.OutboundQuantity;
+ if (availableQty <= 0)
+ return WebResponseContent.Instance.Error("搴撳瓨鏁伴噺涓嶈冻");
+
+ // 3. 鏌ユ壘鐩稿叧鐨勫嚭搴撹鎯呬俊鎭�
+ var outStockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(x => x.OrderNo == orderNo &&
+ x.PalletCode == palletCode &&
+ x.CurrentBarcode == barcode &&
+ x.Status == 0 &&
+ x.RemainQuantity > 0)
+ .FirstAsync();
+
+ if (outStockInfo == null)
+ return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑鎷i�変俊鎭垨宸叉嫞閫夊畬鎴�");
+
+ // 4. 妫�鏌ュ嚭搴撹鎯呴攣瀹氭暟閲�
+ if (outStockInfo.RemainQuantity <= 0)
+ return WebResponseContent.Instance.Error("璇ユ潯鐮佸凡鏃犲墿浣欏彲鎷i�夋暟閲�");
+
+ // 5. 鏇存柊鍑哄簱璇︽儏鐨勫凡鎷i�夋暟閲�
+ outStockInfo.PickedQty = outStockInfo.AssignQuantity;
+ outStockInfo.Status = 1;
+ await _outStockLockInfoService.Db.Updateable(outStockInfo).ExecuteCommandAsync();
+
+ // 6. 鏇存柊搴撳瓨鍑哄簱鏁伴噺
+ await _stockInfoDetailService.Db.Updateable<Dt_StockInfoDetail>()
+ .SetColumns(x => x.OutboundQuantity == x.OutboundQuantity + outStockInfo.AssignQuantity)
+ .Where(x => x.Id == stockDetail.Id)
+ .ExecuteCommandAsync();
+
+ // 7. 鏇存柊鍑哄簱鍗曟槑缁�
+ var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+ .Where(x => x.Id == outStockInfo.OrderDetailId)
+ .FirstAsync();
+
+ orderDetail.OverOutQuantity += outStockInfo.AssignQuantity;
+ await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
+
+ // 8. 妫�鏌ユ槸鍚﹀畬鎴愬嚭搴�
+ await CheckAndUpdateOrderStatus(orderNo);
+
+ // 9. 璁板綍鎷i�夊巻鍙�
+ var pickingHistory = new Dt_PickingRecord
+ {
+
+ OrderNo = orderNo,
+ PalletCode = palletCode,
+ Barcode = barcode,
+ MaterielCode = outStockInfo.MaterielCode,
+ PickQuantity = outStockInfo.AssignQuantity,
+ PickTime = DateTime.Now,
+ OutStockLockId = outStockInfo.Id
+ };
+ await Db.Insertable(pickingHistory).ExecuteCommandAsync();
+
+ _unitOfWorkManage.CommitTran();
+ return WebResponseContent.Instance.OK("鎷i�夌‘璁ゆ垚鍔�");
+
+ }
+ catch (Exception ex)
+ {
+ return WebResponseContent.Instance.Error($"鎷i�夌‘璁ゅけ璐ワ細{ex.Message}");
+ }
+ }
+ // 妫�鏌ュ苟鏇存柊璁㈠崟鐘舵��
+ private async Task CheckAndUpdateOrderStatus(string orderNo)
+ {
+
+
+ var orderDetails = await _stockInfoDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+ .Where(x => x.OrderId == orderNo.ObjToInt())
+ .ToListAsync();
+
+ bool allCompleted = true;
+ foreach (var detail in orderDetails)
+ {
+ if (detail.OverOutQuantity < detail.NeedOutQuantity)
+ {
+ allCompleted = false;
+ break;
+ }
+ }
+
+ if (allCompleted)
+ {
+ await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+ .SetColumns(x => x.OrderStatus == 2) // 宸插畬鎴�
+ .Where(x => x.OrderNo == orderNo)
+ .ExecuteCommandAsync();
+ }
+ }
+ // 鍙栨秷鎷i�夊姛鑳�
+ public async Task<WebResponseContent> CancelPicking(string orderNo, string palletCode, string barcode)
+ {
+ try
+ {
+ _unitOfWorkManage.BeginTran();
+ // 鏌ユ壘鎷i�夎褰�
+ var outStockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(x => x.OrderNo == orderNo &&
+ x.PalletCode == palletCode &&
+ x.CurrentBarcode == barcode &&
+ x.Status == 1)
+ .FirstAsync();
+
+ if (outStockInfo == null)
+ return WebResponseContent.Instance.Error("鏈壘鍒板凡鎷i�夎褰�");
+
+ // 杩樺師鍑哄簱璇︽儏鐘舵��
+ outStockInfo.PickedQty = 0;
+ outStockInfo.Status = 0;
+ 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 orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+ .Where(x => x.Id == outStockInfo.OrderDetailId)
+ .FirstAsync();
+
+ orderDetail.OverOutQuantity -= outStockInfo.AssignQuantity;
+ await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
+
+ // 鍒犻櫎鎷i�夊巻鍙�
+ await Db.Deleteable<Dt_PickingRecord>()
+ .Where(x => x.OutStockLockId == outStockInfo.Id)
+ .ExecuteCommandAsync();
+
+ _unitOfWorkManage.CommitTran();
+ return WebResponseContent.Instance.OK("鍙栨秷鎷i�夋垚鍔�");
+
+ }
+ catch (Exception ex)
+ {
+ return WebResponseContent.Instance.Error($"鍙栨秷鎷i�夊け璐ワ細{ex.Message}");
+ }
+ }
/// <summary>
/// 鏍规嵁鏉$爜鏌ユ壘閿佸畾淇℃伅
/// </summary>
@@ -217,6 +378,45 @@
.FirstAsync();
}
+ // 鑾峰彇鏈嫞閫夊垪琛�
+ public async Task<List<Dt_OutStockLockInfo>> GetUnpickedList(string orderNo, string palletCode)
+ {
+ var list = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(x => x.OrderNo == orderNo &&
+ x.PalletCode == palletCode &&
+ x.Status == 0 &&
+ x.RemainQuantity > 0)
+ .ToListAsync();
+ return list;
+ }
+
+ // 鑾峰彇宸叉嫞閫夊垪琛�
+ public async Task<List<Dt_OutStockLockInfo>> GetPickedList(string orderNo, string palletCode)
+ {
+ var list = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(x => x.OrderNo == orderNo &&
+ x.PalletCode == palletCode &&
+ x.Status == 1)
+ .ToListAsync();
+ return list;
+ }
+ // 鑾峰彇鎷i�夋眹鎬�
+ public async Task<object> GetPickingSummary(string orderNo)
+ {
+ var summary = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(x => x.OrderNo == orderNo && x.Status == 0)
+ .GroupBy(x => new { x.PalletCode, x.MaterielCode })
+ .Select(x => new
+ {
+ PalletCode = x.PalletCode,
+ MaterielCode = x.MaterielCode,
+ UnpickedCount = SqlFunc.AggregateCount(x.Id),
+ UnpickedQuantity = SqlFunc.AggregateSum(x.RemainQuantity)
+ })
+ .ToListAsync();
+
+ return summary;
+ }
/// <summary>
/// 鑾峰彇鎷i�夊巻鍙�
/// </summary>
@@ -235,6 +435,25 @@
.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>
/// 鎾ら攢鎷i��
/// </summary>
--
Gitblit v1.9.3