From 5af11cc200dd5ebe474b9c0475883b0e6d1e3759 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期三, 11 三月 2026 10:00:49 +0800
Subject: [PATCH] 重构整个项目:改进代码质量和架构
---
Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs | 96 +++++++++++++++++++++++++++++++++--------------
1 files changed, 67 insertions(+), 29 deletions(-)
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
index e02e62f..54429f5 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -8,7 +8,8 @@
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
-using WIDESEA_DTO;
+using WIDESEA_Core.Core;
+using WIDESEA_DTO.GradingMachine;
using WIDESEA_DTO.Task;
using WIDESEA_IBasicService;
using WIDESEA_IStockService;
@@ -24,6 +25,7 @@
private readonly ILocationInfoService _locationInfoService;
private readonly HttpClientHelper _httpClientHelper;
private readonly IConfiguration _configuration;
+ private readonly RoundRobinService _roundRobinService;
public IRepository<Dt_Task> Repository => BaseDal;
@@ -42,13 +44,15 @@
IStockInfoService stockInfoService,
ILocationInfoService locationInfoService,
HttpClientHelper httpClientHelper,
- IConfiguration configuration) : base(BaseDal)
+ IConfiguration configuration,
+ RoundRobinService roundRobinService) : base(BaseDal)
{
_mapper = mapper;
_stockInfoService = stockInfoService;
_locationInfoService = locationInfoService;
_httpClientHelper = httpClientHelper;
_configuration = configuration;
+ _roundRobinService = roundRobinService;
}
#region WCS閫昏緫澶勭悊
@@ -206,6 +210,7 @@
var r when r.Contains("CW") => DateTime.Now.AddHours(1),
_ => DateTime.Now
};
+ stockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.GetHashCode();
location.LocationStatus = LocationStatusEnum.InStock.GetHashCode();
@@ -380,20 +385,37 @@
}
/// <summary>
- /// 鏍规嵁宸烽亾纭畾鐩爣鍦板潃
+ /// 鏍规嵁宸烽亾纭畾鐩爣鍦板潃锛堟敮鎸佸鍑哄簱鍙h疆璇級
/// </summary>
- private string DetermineTargetAddress(string roadway, Dictionary<string, string> addressMap)
+ private string DetermineTargetAddress(string roadway, Dictionary<string, List<string>> addressMap)
{
if (string.IsNullOrWhiteSpace(roadway))
- return "10080"; // 榛樿鍦板潃
+ return "10080";
+ // 鏌ユ壘鍖归厤鐨勫贩閬撳墠缂�
+ string matchedPrefix = null;
foreach (var kvp in addressMap)
{
if (roadway.Contains(kvp.Key))
- return kvp.Value;
+ {
+ matchedPrefix = kvp.Key;
+ break;
+ }
}
- return "10080"; // 榛樿鍦板潃
+ if (matchedPrefix == null)
+ return "10080";
+
+ var addresses = addressMap[matchedPrefix];
+ if (addresses == null || addresses.Count == 0)
+ return "10080";
+
+ // 鍗曚釜鍦板潃锛岀洿鎺ヨ繑鍥�
+ if (addresses.Count == 1)
+ return addresses[0];
+
+ // 澶氫釜鍦板潃锛屼娇鐢ㄨ疆璇㈡湇鍔�
+ return _roundRobinService.GetNextAddress(matchedPrefix, addresses);
}
/// <summary>
@@ -405,7 +427,7 @@
{
// 1. 鏌ヨ鍒版湡搴撳瓨
var expiredStocks = await _stockInfoService.Repository
- .QueryAsync(s => s.OutboundDate <= DateTime.Now
+ .QueryDataAsync(s => s.OutboundDate <= DateTime.Now
&& s.StockStatus == StockStatusEmun.鍏ュ簱瀹屾垚.GetHashCode());
if (expiredStocks == null || !expiredStocks.Any())
@@ -413,13 +435,29 @@
return WebResponseContent.Instance.OK("鏃犲埌鏈熷簱瀛橀渶瑕佸鐞�");
}
- // 鍔犺浇浣嶇疆璇︽儏
- foreach (var stock in expiredStocks)
+ // 鎵归噺鍔犺浇浣嶇疆璇︽儏锛堜紭鍖� N+1 鏌ヨ闂锛�
+ var locationIds = expiredStocks
+ .Where(s => s.LocationId > 0)
+ .Select(s => s.LocationId)
+ .Distinct()
+ .Cast<object>()
+ .ToList();
+
+ if (locationIds.Any())
{
- if (stock.LocationId > 0)
+ var locations = await _locationInfoService.Repository
+ .QureyDataByIdsAsync(locationIds);
+
+ // 鍒涘缓浣嶇疆瀛楀吀浠ヤ究蹇�熸煡鎵�
+ var locationDict = locations.ToDictionary(l => l.Id, l => l);
+
+ // 涓烘瘡涓簱瀛樺叧鑱斾綅缃鎯�
+ foreach (var stock in expiredStocks)
{
- stock.LocationDetails = await _locationInfoService.Repository
- .GetFirstAsync(s => s.Id == stock.LocationId);
+ if (stock.LocationId > 0 && locationDict.ContainsKey(stock.LocationId))
+ {
+ stock.LocationDetails = locationDict[stock.LocationId];
+ }
}
}
@@ -436,11 +474,11 @@
// 2. 妫�鏌ュ凡瀛樺湪鐨勪换鍔�
var palletCodes = expiredStocks.Select(s => s.PalletCode).ToList();
- var existingTasks = await Repository.QueryAsync(t =>
+ var existingTasks = await Repository.QueryDataAsync(t =>
palletCodes.Contains(t.PalletCode)
&& (t.TaskStatus == TaskStatusEnum.New.GetHashCode()
- || t.TaskStatus == TaskStatusEnum.Executing.GetHashCode()
- || t.TaskInStatus == TaskInStatusEnum.InNew.GetHashCode()));
+ || t.TaskStatus == TaskStatusEnum.SC_Executing.GetHashCode()
+ || t.TaskStatus == TaskInStatusEnum.InNew.GetHashCode()));
var processedPallets = existingTasks.Select(t => t.PalletCode).ToHashSet();
@@ -456,8 +494,8 @@
// 4. 鑾峰彇閰嶇疆鐨勭洰鏍囧湴鍧�鏄犲皠
var targetAddressMap = _configuration.GetSection("AutoOutboundTask:TargetAddresses")
- .Get<Dictionary<string, string>>()
- ?? new Dictionary<string, string>();
+ .Get<Dictionary<string, List<string>>>()
+ ?? new Dictionary<string, List<string>>();
// 5. 鎵归噺鍒涘缓浠诲姟
var taskList = new List<Dt_Task>();
@@ -481,7 +519,7 @@
TaskType = TaskTypeEnum.Outbound.GetHashCode(),
TaskStatus = TaskStatusEnum.New.GetHashCode(),
Grade = 1,
- TaskNum = await Repository.GetTaskNo(),
+ TaskNum = await BaseDal.GetTaskNo(),
Creater = "system_auto"
};
taskList.Add(task);
@@ -494,15 +532,15 @@
}
// 6. 閫氱煡 WCS锛堝紓姝ワ紝涓嶅奖鍝嶄富娴佺▼锛�
- _ = Task.Run(async () =>
+ _ = Task.Run(() =>
{
foreach (var task in taskList)
{
try
{
var wmstaskDto = _mapper.Map<WMSTaskDTO>(task);
- await _httpClientHelper.Post<WebResponseContent>(
- "http://logistics-service/api/logistics/notifyoutbound",
+ _httpClientHelper.Post<WebResponseContent>(
+ "http://localhost:9292/api/Task/ReceiveTask",
JsonSerializer.Serialize(wmstaskDto));
}
catch (Exception ex)
@@ -528,7 +566,7 @@
/// <summary>
/// 鍫嗗灈鏈哄彇鏀捐揣瀹屾垚鍚庣墿娴侀�氱煡鍖栨垚鍒嗗鏌滃畬鎴愪俊鍙�
/// </summary>
- public async Task<WebResponseContent> InOrOutCompletedAsync(InputDto input)
+ public async Task<WebResponseContent> InOrOutCompletedAsync(GradingMachineInputDto input)
{
WebResponseContent content = new WebResponseContent();
if (string.IsNullOrWhiteSpace(input.PalletCode) || string.IsNullOrWhiteSpace(input.LocationCode))
@@ -543,7 +581,7 @@
{
var location = await _locationInfoService.GetLocationInfoAsync(input.LocationCode);
- OutPutDto outPutDto = new OutPutDto()
+ OutputDto outPutDto = new OutputDto()
{
LocationCode = input.LocationCode,
PalletCode = input.PalletCode,
@@ -554,7 +592,7 @@
}
else
{
- OutPutDto outPutDto = new OutPutDto()
+ OutputDto outPutDto = new OutputDto()
{
LocationCode = input.LocationCode,
PalletCode = input.PalletCode,
@@ -577,7 +615,7 @@
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
- public async Task<WebResponseContent> SendLocationStatusAsync(InputDto input)
+ public async Task<WebResponseContent> SendLocationStatusAsync(GradingMachineInputDto input)
{
WebResponseContent content = new WebResponseContent();
if (string.IsNullOrWhiteSpace(input.LocationCode))
@@ -614,7 +652,7 @@
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
- public async Task<WebResponseContent> RequestOutboundAsync(InputDto input)
+ public async Task<WebResponseContent> RequestOutboundAsync(GradingMachineInputDto input)
{
WebResponseContent content = new WebResponseContent();
if (string.IsNullOrWhiteSpace(input.LocationCode) || string.IsNullOrWhiteSpace(input.PalletCode))
@@ -673,7 +711,7 @@
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
- public async Task<WebResponseContent> GetPalletCodeCellAsync(InputDto input)
+ public async Task<WebResponseContent> GetPalletCodeCellAsync(GradingMachineInputDto input)
{
WebResponseContent content = new WebResponseContent();
if (string.IsNullOrWhiteSpace(input.PalletCode) || string.IsNullOrWhiteSpace(input.LocationCode))
@@ -687,7 +725,7 @@
{
return content.Error("鏈壘鍒板搴旂殑鎵樼洏");
}
- var outPutDtos = stockInfo.Details.Select(x => new OutPutDto()
+ var outPutDtos = stockInfo.Details.Select(x => new OutputDto()
{
LocationCode = input.LocationCode,
PalletCode = input.PalletCode,
--
Gitblit v1.9.3