From e31ca4e3e1774b7ddb832e8ec498b5ada24b2608 Mon Sep 17 00:00:00 2001
From: pan <antony1029@163.com>
Date: 星期日, 16 十一月 2025 19:13:58 +0800
Subject: [PATCH] 提交
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs | 201 ++++++++++++++++++++++++++++++++++----------------
1 files changed, 136 insertions(+), 65 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 fafc2a8..cf875b6 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 Microsoft.AspNetCore.Http;
+锘縰sing Dm.filter;
+using MailKit.Search;
+using Microsoft.AspNetCore.Http;
using SqlSugar;
using System;
using System.Collections.Generic;
@@ -36,9 +38,10 @@
private readonly IOutboundOrderDetailService _outboundOrderDetailService;
private readonly IOutboundOrderService _outboundOrderService;
private readonly ISplitPackageService _splitPackageService;
+ private readonly IRepository<Dt_Task> _taskRepository;
- 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)
+ 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) : base(BaseDal)
{
_unitOfWorkManage = unitOfWorkManage;
_stockInfoService = stockInfoService;
@@ -49,6 +52,7 @@
_outboundOrderDetailService = outboundOrderDetailService;
_splitPackageService = splitPackageService;
_outboundOrderService = outboundOrderService;
+ _taskRepository = taskRepository;
}
@@ -114,8 +118,7 @@
}
/// <summary>
- /// 鎵爜鎷i�夌‘璁� - 绠�鍖栫増鏈�
- /// 鍙鐞嗗疄闄呮嫞閫夌殑搴撳瓨鎵e噺
+ /// 鎵爜鎷i�夌‘璁�
/// </summary>
public async Task<WebResponseContent> ConfirmPicking(PickingConfirmRequest request)
{
@@ -221,19 +224,20 @@
if (stockDetail == null)
return WebResponseContent.Instance.Error("鏃犳晥鐨勬潯鐮佹垨鐗╂枡缂栫爜");
- // 2. 妫�鏌ュ簱瀛樺彲鐢ㄦ暟閲�
- var availableQty = stockDetail.StockQuantity - stockDetail.OutboundQuantity;
- if (availableQty <= 0)
- 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)
+ x.Status == (int)OutLockStockStatusEnum.鍑哄簱涓� &&
+ x.AssignQuantity - x.PickedQty > 0)
.FirstAsync();
+
if (outStockInfo == null)
return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑鎷i�変俊鎭垨宸叉嫞閫夊畬鎴�");
@@ -244,36 +248,45 @@
// 5. 鏇存柊鍑哄簱璇︽儏鐨勫凡鎷i�夋暟閲�
outStockInfo.PickedQty = outStockInfo.AssignQuantity;
- outStockInfo.Status = 1;
+ outStockInfo.Status = (int)OutLockStockStatusEnum.宸叉嫞閫�;
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();
+ //// 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();
-
+ if (orderDetail != null)
+ {
+ orderDetail.OverOutQuantity += outStockInfo.AssignQuantity;
+ orderDetail.LockQuantity -= outStockInfo.AssignQuantity;
+ await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
+ }
// 8. 妫�鏌ユ槸鍚﹀畬鎴愬嚭搴�
await CheckAndUpdateOrderStatus(orderNo);
+ //鏌ヨ浠诲姟琛�
+ var task = _taskRepository.QueryData(x => x.OrderNo == orderNo && x.PalletCode == palletCode).FirstOrDefault();
// 9. 璁板綍鎷i�夊巻鍙�
var pickingHistory = new Dt_PickingRecord
{
-
+ FactoryArea = outStockInfo.FactoryArea,
+ TaskNo = task?.TaskNum ?? 0,
+ LocationCode = task?.SourceAddress ?? "",
+ StockId = stockDetail.Id,
OrderNo = orderNo,
+ OrderDetailId = orderDetail?.Id ?? 0,
PalletCode = palletCode,
Barcode = barcode,
MaterielCode = outStockInfo.MaterielCode,
PickQuantity = outStockInfo.AssignQuantity,
PickTime = DateTime.Now,
+ Operator = App.User.UserName,
OutStockLockId = outStockInfo.Id
};
await Db.Insertable(pickingHistory).ExecuteCommandAsync();
@@ -325,7 +338,7 @@
.Where(x => x.OrderNo == orderNo &&
x.PalletCode == palletCode &&
x.CurrentBarcode == barcode &&
- x.Status == 1)
+ x.Status == 2)
.FirstAsync();
if (outStockInfo == null)
@@ -333,14 +346,14 @@
// 杩樺師鍑哄簱璇︽儏鐘舵��
outStockInfo.PickedQty = 0;
- outStockInfo.Status = 0;
+ outStockInfo.Status = 1;
await _outStockLockInfoService.Db.Updateable(outStockInfo).ExecuteCommandAsync();
- // 杩樺師搴撳瓨鍑哄簱鏁伴噺
- await _stockInfoDetailService.Db.Updateable<Dt_StockInfoDetail>()
- .SetColumns(x => x.OutboundQuantity == x.OutboundQuantity - outStockInfo.AssignQuantity)
- .Where(x => x.Barcode == barcode)
- .ExecuteCommandAsync();
+ //// 杩樺師搴撳瓨鍑哄簱鏁伴噺
+ //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>()
@@ -384,10 +397,9 @@
var list = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
.Where(x => x.OrderNo == orderNo &&
x.PalletCode == palletCode &&
- x.Status == 0 &&
- x.RemainQuantity > 0)
+ x.Status == 1)
.ToListAsync();
- return list;
+ return list.Where(x => x.RemainQuantity > 0).ToList();
}
// 鑾峰彇宸叉嫞閫夊垪琛�
@@ -396,26 +408,68 @@
var list = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
.Where(x => x.OrderNo == orderNo &&
x.PalletCode == palletCode &&
- x.Status == 1)
+ x.Status == 2)
.ToListAsync();
return list;
}
- // 鑾峰彇鎷i�夋眹鎬�
- public async Task<object> GetPickingSummary(string orderNo)
+
+ public async Task<object> GetPickingSummary(string orderNo, string palletCode)
{
var summary = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(x => x.OrderNo == orderNo && x.Status == 0)
+ .Where(x => x.OrderNo == orderNo &&
+ x.PalletCode == palletCode && x.Status == 1)
.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)
+ UnpickedQuantity = SqlFunc.AggregateSum(x.AssignQuantity) - SqlFunc.AggregateSum(x.PickedQty)
})
- .ToListAsync();
+ .FirstAsync();
- return summary;
+ return summary;
+ }
+
+ // 鑾峰彇鎷i�夋眹鎬�
+ public async Task<object> GetPickingSummary(ConfirmPickingDto dto)
+ {
+ var picked = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .WhereIF(!string.IsNullOrEmpty(dto.OrderNo), x => x.OrderNo == dto.OrderNo)
+ .WhereIF(!string.IsNullOrEmpty(dto.PalletCode), x => x.PalletCode == dto.PalletCode)
+ .Where(x => x.Status == 2)
+ .GroupBy(x => new { x.PalletCode, x.MaterielCode })
+ .Select(x => new SummaryPickingDto
+ {
+ PalletCode = x.PalletCode,
+ MaterielCode = x.MaterielCode,
+ pickedCount = SqlFunc.AggregateCount(x.Id)
+ }).FirstAsync();
+ if (picked == null)
+ {
+ picked = new SummaryPickingDto { pickedCount = 0 };
+ }
+
+ var summary = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .WhereIF(!string.IsNullOrEmpty(dto.OrderNo), x => x.OrderNo == dto.OrderNo)
+ .WhereIF(!string.IsNullOrEmpty(dto.PalletCode), x => x.PalletCode == dto.PalletCode)
+ .Where(x => x.Status == 1)
+ .GroupBy(x => new { x.PalletCode, x.MaterielCode })
+ .Select(x => new SummaryPickingDto
+ {
+ PalletCode = x.PalletCode,
+ MaterielCode = x.MaterielCode,
+ UnpickedCount = SqlFunc.AggregateCount(x.Id),
+ UnpickedQuantity = SqlFunc.AggregateSum(x.AssignQuantity) - SqlFunc.AggregateSum(x.PickedQty),
+
+ }).FirstAsync();
+ if (summary == null)
+ {
+ summary = new SummaryPickingDto { pickedCount = 0 };
+ }
+ summary.pickedCount = picked.pickedCount;
+
+ return summary;
}
/// <summary>
/// 鑾峰彇鎷i�夊巻鍙�
@@ -587,50 +641,59 @@
{
_unitOfWorkManage.BeginTran();
- // 1. 鑾峰彇鎵樼洏搴撳瓨淇℃伅
var stockInfo = await _stockInfoService.Db.Queryable<Dt_StockInfo>()
.Includes(x => x.Details)
- .Where(x => x.PalletCode == request.PalletCode)
- .FirstAsync();
+ .Where(x => x.PalletCode == request.PalletCode).FirstAsync();
if (stockInfo == null)
return WebResponseContent.Instance.Error("鏈壘鍒版墭鐩樺簱瀛樹俊鎭�");
- // 2. 鑾峰彇鐩稿叧鐨勫嚭搴撻攣瀹氫俊鎭�
+
var lockInfos = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(x => x.PalletCode == request.PalletCode &&
- x.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
+ .Where(x => x.OrderNo == request.OrderNo && x.PalletCode == request.PalletCode)
.ToListAsync();
- // 3. 鏁翠釜鎵樼洏鍑哄簱 - 璁剧疆鍑哄簱鏁伴噺绛変簬搴撳瓨鏁伴噺
- foreach (var detail in stockInfo.Details)
- {
- decimal outboundQuantity = detail.StockQuantity - detail.OutboundQuantity;
- detail.OutboundQuantity = detail.StockQuantity; // 鍏ㄩ儴鍑哄簱
- await _stockInfoDetailService.Db.Updateable(detail).ExecuteCommandAsync();
- }
- // 4. 鏇存柊鍑哄簱閿佸畾淇℃伅
foreach (var lockInfo in lockInfos)
{
- decimal unpicked = lockInfo.AssignQuantity - lockInfo.PickedQty;
- lockInfo.PickedQty += unpicked; // 鏍囪涓哄叏閮ㄦ嫞閫�
+ if (lockInfo.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
+ {
+ lockInfo.PickedQty = lockInfo.AssignQuantity;
+ }
lockInfo.Status = (int)OutLockStockStatusEnum.宸插嚭搴�;
await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
- // 鏇存柊鍑哄簱鍗曟槑缁�
var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
- .Where(x => x.Id == lockInfo.OrderDetailId)
- .FirstAsync();
- orderDetail.OverOutQuantity += unpicked;
- orderDetail.LockQuantity -= unpicked;
- orderDetail.OrderDetailStatus = (int)OrderDetailStatusEnum.Over;
- orderDetail.LockQuantity = 0;
-
- await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
+ .Where(x => x.Id == lockInfo.OrderDetailId)
+ .FirstAsync();
+ if (orderDetail != null)
+ {
+ orderDetail.OverOutQuantity += lockInfo.PickedQty;
+ orderDetail.LockQuantity -= lockInfo.PickedQty;
+ orderDetail.OrderDetailStatus = (int)OrderDetailStatusEnum.Over;
+ orderDetail.LockQuantity = 0;
+ await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
+ }
+ }
+ var groupDetails = lockInfos.GroupBy(x => x.OrderDetailId).Select(x => new
+ {
+ OrderDetailId = x.Key,
+ TotalQuantity = x.Sum(o => o.PickedQty)
+ }).ToList();
+ foreach (var item in groupDetails)
+ {
+ var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>().Where(x => x.Id == item.OrderDetailId).FirstAsync();
+ if (orderDetail != null)
+ {
+ orderDetail.OverOutQuantity = item.TotalQuantity;
+ orderDetail.LockQuantity = 0;
+ orderDetail.OrderDetailStatus = (int)OrderDetailStatusEnum.Over;
+ await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
+ }
}
- // 5. 鏇存柊鎷嗗寘璁板綍鐘舵��
+ await CheckAndUpdateOrderStatus(request.OrderNo);
+
var lockInfoIds = lockInfos.Select(x => x.Id).ToList();
var splitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
.Where(x => lockInfoIds.Contains(x.OutStockLockInfoId) &&
@@ -643,7 +706,7 @@
await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync();
}
- // 6. 娓呯┖璐т綅
+
var location = await _locationInfoService.Db.Queryable<Dt_LocationInfo>()
.Where(x => x.LocationCode == stockInfo.LocationCode)
.FirstAsync();
@@ -653,6 +716,14 @@
await _locationInfoService.Db.Updateable(location).ExecuteCommandAsync();
}
+ foreach (var detail in stockInfo.Details)
+ {
+ await _stockInfoDetailService.Db.Deleteable(detail).ExecuteCommandAsync();
+ }
+ await _stockInfoService.Db.Deleteable(stockInfo).ExecuteCommandAsync();
+
+
+
_unitOfWorkManage.CommitTran();
return WebResponseContent.Instance.OK("鐩存帴鍑哄簱鎴愬姛");
}
--
Gitblit v1.9.3