From 26676bd2c481d67e856f683a1431910bf351f740 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期一, 30 三月 2026 14:20:26 +0800
Subject: [PATCH] feat(TaskService): InboundFinishTaskTrayAsync添加任务和库存历史保存
---
Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs | 149 +++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 142 insertions(+), 7 deletions(-)
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs
index 9de9cb6..d992bdf 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs
@@ -1,22 +1,47 @@
-锘縰sing WIDESEA_Common.StockEnum;
+using WIDESEA_Common.StockEnum;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
+using WIDESEA_DTO.Stock;
+using WIDESEA_IBasicService;
using WIDESEA_IStockService;
using WIDESEA_Model.Models;
namespace WIDESEA_StockService
{
+ /// <summary>
+ /// 搴撳瓨淇℃伅鏈嶅姟瀹炵幇绫�
+ /// </summary>
public partial class StockInfoService : ServiceBase<Dt_StockInfo, IRepository<Dt_StockInfo>>, IStockInfoService
{
+ /// <summary>
+ /// 鑾峰彇搴撳瓨淇℃伅浠撳偍鎺ュ彛
+ /// </summary>
public IRepository<Dt_StockInfo> Repository => BaseDal;
- public StockInfoService(IRepository<Dt_StockInfo> BaseDal) : base(BaseDal)
+ /// <summary>
+ /// 璐т綅淇℃伅鏈嶅姟鎺ュ彛锛堢敤浜庤幏鍙栦粨搴撹揣浣嶄俊鎭級
+ /// </summary>
+ private readonly ILocationInfoService _locationInfoService;
+
+ /// <summary>
+ /// 浠撳簱淇℃伅鏈嶅姟鎺ュ彛锛堢敤浜庤幏鍙栦粨搴撳熀鏈俊鎭級
+ /// </summary>
+ private readonly IWarehouseService _warehouseService;
+
+ /// <summary>
+ /// 鏋勯�犲嚱鏁�
+ /// </summary>
+ /// <param name="baseDal">鍩虹鏁版嵁璁块棶瀵硅薄</param>
+ public StockInfoService(IRepository<Dt_StockInfo> baseDal, ILocationInfoService locationInfoService, IWarehouseService warehouseService) : base(baseDal)
{
+ _locationInfoService = locationInfoService;
+ _warehouseService = warehouseService;
}
/// <summary>
/// 鑾峰彇搴撳瓨淇℃伅鍒楄〃锛堝嚭搴撴棩鏈熷皬浜庡綋鍓嶆椂闂翠笖搴撳瓨鐘舵�佷负鍏ュ簱瀹屾垚鐨勮褰曪級
/// </summary>
+ /// <returns>搴撳瓨淇℃伅鍒楄〃</returns>
public async Task<List<Dt_StockInfo>> GetStockInfoAsync()
{
return await BaseDal.QueryDataAsync(x =>
@@ -27,6 +52,8 @@
/// <summary>
/// 鑾峰彇搴撳瓨淇℃伅鍒楄〃锛堝嚭搴撴棩鏈熷皬浜庡綋鍓嶆椂闂翠笖搴撳瓨鐘舵�佷负鍏ュ簱瀹屾垚鐨勮褰曪紝涓斾粨搴揑D鍖归厤锛�
/// </summary>
+ /// <param name="warehouseId">浠撳簱ID</param>
+ /// <returns>搴撳瓨淇℃伅鍒楄〃</returns>
public async Task<List<Dt_StockInfo>> GetStockInfoAsync(int warehouseId)
{
return await BaseDal.QueryDataAsync(x =>
@@ -38,6 +65,8 @@
/// <summary>
/// 鑾峰彇搴撳瓨淇℃伅锛堟牴鎹墭鐩樼爜鏌ヨ锛�
/// </summary>
+ /// <param name="palletCode">鎵樼洏缂栫爜</param>
+ /// <returns>搴撳瓨淇℃伅</returns>
public async Task<Dt_StockInfo> GetStockInfoAsync(string palletCode)
{
return await BaseDal.QueryDataNavFirstAsync(x => x.PalletCode == palletCode);
@@ -46,21 +75,127 @@
/// <summary>
/// 鏇存柊搴撳瓨鏁版嵁
/// </summary>
+ /// <param name="stockInfo">搴撳瓨淇℃伅瀵硅薄</param>
+ /// <returns>鏇存柊鏄惁鎴愬姛</returns>
public async Task<bool> UpdateStockAsync(Dt_StockInfo stockInfo)
{
return await BaseDal.UpdateDataAsync(stockInfo);
}
-
/// <summary>
- /// 妫�绱㈡寚瀹氭墭鐩樺湪缁欏畾浣嶇疆鐨勫簱瀛樿缁嗕俊鎭��
+ /// 妫�绱㈡寚瀹氭墭鐩樺湪缁欏畾浣嶇疆鐨勫簱瀛樿缁嗕俊鎭�
/// </summary>
- /// <param name="palletCode">璇锋眰搴撳瓨淇℃伅鐨勬墭鐩樺敮涓�鏍囪瘑绗︺�備笉鑳戒负 null 鎴栫┖銆�</param>
- /// <param name="locationCode">琛ㄧず鎵樼洏瀛樺偍浣嶇疆鐨勪唬鐮併�備笉鑳戒负 null 鎴栫┖銆�</param>
- /// <returns>琛ㄧず寮傛鎿嶄綔鐨勪换鍔°�備换鍔$粨鏋滃寘鍚竴涓� <see cref="Dt_StockInfo"/> 瀵硅薄锛岃瀵硅薄鍖呭惈鎸囧畾鎵樼洏鍜屼綅缃殑搴撳瓨璇︾粏淇℃伅銆傚鏋滄湭鎵惧埌鍖归厤鐨勫簱瀛樹俊鎭紝鍒欒繑鍥� null銆�</returns>
+ /// <param name="palletCode">鎵樼洏缂栫爜</param>
+ /// <param name="locationCode">璐т綅缂栫爜</param>
+ /// <returns>搴撳瓨淇℃伅</returns>
public async Task<Dt_StockInfo> GetStockInfoAsync(string palletCode, string locationCode)
{
return await BaseDal.QueryFirstAsync(x => x.PalletCode == palletCode && x.LocationCode == locationCode);
}
+
+ /// <summary>
+ /// 鑾峰彇浠撳簱3D甯冨眬鏁版嵁
+ /// </summary>
+ /// <param name="warehouseId">浠撳簱ID</param>
+ /// <returns>3D甯冨眬DTO</returns>
+ public async Task<Stock3DLayoutDTO> Get3DLayoutAsync(int warehouseId)
+ {
+ // 1. 鏌ヨ浠撳簱淇℃伅
+ var warehouse = await _warehouseService.Repository.QueryFirstAsync(x => x.WarehouseId == warehouseId);
+
+ // 2. 鏌ヨ璇ヤ粨搴撴墍鏈夎揣浣�
+ var locations = await _locationInfoService.Repository.QueryDataAsync(x => x.WarehouseId == warehouseId);
+
+ // 3. 鏌ヨ璇ヤ粨搴撴墍鏈夊簱瀛樹俊鎭紙鍖呭惈Details瀵艰埅灞炴�э級
+ var stockInfos = await Repository.QueryDataNavAsync(x => x.WarehouseId == warehouseId);
+
+ // 4. 鎻愬彇鐗╂枡缂栧彿鍜屾壒娆″彿鍒楄〃锛堝幓閲嶏級
+ var materielCodeList = stockInfos
+ .Where(s => s.Details != null)
+ .SelectMany(s => s.Details)
+ .Select(d => d.MaterielCode)
+ .Where(c => !string.IsNullOrEmpty(c))
+ .Distinct()
+ .ToList();
+
+ var batchNoList = stockInfos
+ .Where(s => s.Details != null)
+ .SelectMany(s => s.Details)
+ .Select(d => d.BatchNo)
+ .Where(b => !string.IsNullOrEmpty(b))
+ .Distinct()
+ .ToList();
+
+ // 5. 鍒涘缓搴撳瓨瀛楀吀鐢ㄤ簬蹇�熸煡鎵撅紙浠ocationId涓洪敭锛�
+ var stockDict = stockInfos.ToDictionary(s => s.LocationId, s => s);
+
+ // 6. 鏄犲皠姣忎釜璐т綅鍒癓ocation3DItemDTO
+ const float defaultMaxCapacity = 100f;
+ var locationItems = locations.Select(loc =>
+ {
+ var item = new Location3DItemDTO
+ {
+ LocationId = loc.Id,
+ LocationCode = loc.LocationCode,
+ Row = loc.Row,
+ Column = loc.Column,
+ Layer = loc.Layer,
+ LocationStatus = loc.LocationStatus,
+ MaxCapacity = defaultMaxCapacity
+ };
+
+ // 灏濊瘯浠庡簱瀛樺瓧鍏镐腑鑾峰彇搴撳瓨淇℃伅
+ if (stockDict.TryGetValue(loc.Id, out var stockInfo) && stockInfo.Details != null)
+ {
+ item.PalletCode = stockInfo.PalletCode;
+ item.StockQuantity = stockInfo.Details.Sum(d => d.StockQuantity);
+
+ // 鑾峰彇绗竴涓槑缁嗙殑鐗╂枡淇℃伅锛堝鏋滃瓨鍦級
+ var firstDetail = stockInfo.Details.FirstOrDefault();
+ if (firstDetail != null)
+ {
+ item.MaterielCode = firstDetail.MaterielCode;
+ item.MaterielName = firstDetail.MaterielName;
+ item.BatchNo = firstDetail.BatchNo;
+ }
+
+ // 璁$畻搴撳瓨鐘舵��
+ var ratio = item.MaxCapacity > 0 ? item.StockQuantity / item.MaxCapacity : 0;
+ if (ratio >= 0.9f)
+ item.StockStatus = 3; // 宸叉弧 (FULL)
+ else if (ratio >= 0.1f)
+ item.StockStatus = 1; // 鏈夎揣 (HAS_STOCK)
+ else if (ratio > 0)
+ item.StockStatus = 2; // 搴撳瓨绱у紶 (LOW_STOCK)
+ else
+ item.StockStatus = 0; // 鏃犺揣 (EMPTY)
+ }
+ else
+ {
+ item.StockStatus = 0; // 鏃犺揣 (EMPTY)
+ item.StockQuantity = 0;
+ }
+
+ return item;
+ }).ToList();
+
+ // 7. 璁$畻浠撳簱灏哄
+ var maxRow = locations.Any() ? locations.Max(l => l.Row) : 0;
+ var maxColumn = locations.Any() ? locations.Max(l => l.Column) : 0;
+ var maxLayer = locations.Any() ? locations.Max(l => l.Layer) : 0;
+
+ // 8. 鏋勫缓杩斿洖缁撴灉
+ return new Stock3DLayoutDTO
+ {
+ WarehouseId = warehouseId,
+ WarehouseName = warehouse?.WarehouseName ?? string.Empty,
+ MaxRow = maxRow,
+ MaxColumn = maxColumn,
+ MaxLayer = maxLayer,
+ MaterielCodeList = materielCodeList,
+ BatchNoList = batchNoList,
+ Locations = locationItems
+ };
+ }
}
}
--
Gitblit v1.9.3