From 51922d7093b9c8f52417bfdd0fe9aa087d1fb5be Mon Sep 17 00:00:00 2001
From: xiazhengtongxue <133085197+xiazhengtongxue@users.noreply.github.com>
Date: 星期五, 01 五月 2026 18:31:01 +0800
Subject: [PATCH] feat: 优化仓库仪表盘界面并添加电池和空托盘统计功能
---
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/InboundTaskFlowService.cs | 356 ++++++++++++++++++++++++++++++++++-------------------------
1 files changed, 205 insertions(+), 151 deletions(-)
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/InboundTaskFlowService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/InboundTaskFlowService.cs
index 69c8796..5a3c6f4 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/InboundTaskFlowService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/InboundTaskFlowService.cs
@@ -1,151 +1,205 @@
-锘縰sing System.Diagnostics.CodeAnalysis;
-using WIDESEAWCS_Common.HttpEnum;
-using WIDESEAWCS_Common.TaskEnum;
-using WIDESEA_Core;
-using WIDESEAWCS_Core;
-using WIDESEAWCS_Core.Helper;
-using WIDESEAWCS_DTO;
-using WIDESEAWCS_DTO.TaskInfo;
-using WIDESEAWCS_ITaskInfoService;
-using WIDESEAWCS_Model.Models;
-using WIDESEAWCS_QuartzJob.Models;
-using WIDESEAWCS_QuartzJob.Service;
-
-namespace WIDESEAWCS_TaskInfoService.Flows
-{
- /// <summary>
- /// 鍏ュ簱浠诲姟娴佺▼鏈嶅姟銆�
- /// 璐熻矗鍏ュ簱浠诲姟鎺ユ敹鍒濆鍖栥�佺姸鎬佹帹杩涘強鍫嗗灈鏈哄畬鎴愬鐞嗐��
- /// </summary>
- public class InboundTaskFlowService : IInboundTaskFlowService
- {
- private readonly IRouterService _routerService;
- private readonly HttpClientHelper _httpClientHelper;
-
- /// <summary>
- /// 鍒濆鍖栧叆搴撲换鍔℃祦绋嬫湇鍔°��
- /// </summary>
- /// <param name="routerService">璺敱鏈嶅姟銆�</param>
- /// <param name="httpClientHelper">WMS鎺ュ彛璋冪敤甯姪绫汇��</param>
- public InboundTaskFlowService(IRouterService routerService, HttpClientHelper httpClientHelper)
- {
- _routerService = routerService;
- _httpClientHelper = httpClientHelper;
- }
-
- /// <summary>
- /// 鎺ユ敹WMS浠诲姟鏃跺垵濮嬪寲鍏ュ簱浠诲姟銆�
- /// </summary>
- /// <param name="task">浠诲姟瀹炰綋銆�</param>
- /// <param name="source">WMS浠诲姟鍘熷鏁版嵁銆�</param>
- public WebResponseContent InitializeOnReceive([NotNull] Dt_Task task, [NotNull] WMSTaskDTO source)
- {
- WebResponseContent content = new WebResponseContent();
- Dt_Router routers = _routerService.QueryNextRoute(source.SourceAddress);
- if (routers.IsNullOrEmpty())
- {
- return content.Error("鏈壘鍒拌矾鐢变俊鎭�");
- }
-
- task.TaskStatus = (int)TaskInStatusEnum.InNew;
- task.CurrentAddress = source.SourceAddress;
- task.NextAddress = routers.ChildPosi;
-
- return content.OK();
- }
-
- /// <summary>
- /// 鎺ㄨ繘鍏ュ簱浠诲姟鐘舵�侊紝骞跺湪鍏抽敭鐘舵�佽皟鐢╓MS鎺ュ彛銆�
- /// </summary>
- /// <param name="task">浠诲姟瀹炰綋銆�</param>
- /// <returns>鎺ㄨ繘缁撴灉銆�</returns>
- public WebResponseContent MoveToNextStatus([NotNull] Dt_Task task)
- {
- if (task.TaskStatus >= (int)TaskInStatusEnum.InFinish)
- return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
-
- task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskInStatusEnum>();
- if (task.TaskStatus <= 0)
- return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
-
- if (task.TaskStatus == (int)TaskInStatusEnum.Line_InFinish)
- {
- return GetWMSInboundLocation(task);
- }
-
- return UpdateWMSTaskStatus(task);
- }
-
- /// <summary>
- /// 澶勭悊鍫嗗灈鏈哄叆搴撳畬鎴愬姩浣溿��
- /// </summary>
- /// <param name="task">浠诲姟瀹炰綋銆�</param>
- /// <returns>澶勭悊缁撴灉銆�</returns>
- public WebResponseContent CompleteStackerTask([NotNull] Dt_Task task)
- {
- WebResponseContent content = new WebResponseContent();
- if (task.TaskStatus != (int)TaskInStatusEnum.SC_InExecuting)
- {
- return WebResponseContent.Instance.OK();
- }
-
- int nextStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskInStatusEnum>();
- task.TaskStatus = nextStatus;
- task.ModifyDate = DateTime.Now;
- task.Modifier = "System";
-
- var result = _httpClientHelper.Post<WebResponseContent>(
- nameof(ConfigKey.InboundFinishTaskAsync),
- (new CreateTaskDto { PalletCode = task.PalletCode }).ToJson());
-
- if (!result.IsSuccess || !result.Data.Status)
- {
- return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄叆搴撳畬鎴愬け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
- }
-
- return content.OK($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄叆搴撳畬鎴愭垚鍔�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�");
- }
-
- /// <summary>
- /// 浠嶹MS鑾峰彇鍏ュ簱鐩爣鍦板潃骞跺洖鍐欎换鍔°��
- /// </summary>
- /// <param name="task">浠诲姟瀹炰綋銆�</param>
- /// <returns>璋冪敤缁撴灉銆�</returns>
- private WebResponseContent GetWMSInboundLocation(Dt_Task task)
- {
- var result = _httpClientHelper.Post<WebResponseContent>(
- nameof(ConfigKey.GetTasksLocation),
- new CreateTaskDto { PalletCode = task.PalletCode }.ToJson());
-
- if (!result.IsSuccess || !result.Data.Status)
- return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鑾峰彇浠诲姟鐩爣鍦板潃澶辫触,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
-
- string? nextAddress = result.Data.Data?.ToString();
- if (string.IsNullOrEmpty(nextAddress))
- return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鑾峰彇浠诲姟鐩爣鍦板潃澶辫触,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆愭湭鑾峰彇鍒版湁鏁堢殑鐩爣鍦板潃銆�");
-
- task.CurrentAddress = task.NextAddress;
- task.NextAddress = nextAddress;
- task.TargetAddress = nextAddress;
-
- return WebResponseContent.Instance.OK();
- }
-
- /// <summary>
- /// 灏嗕换鍔$姸鎬佸悓姝ュ埌WMS銆�
- /// </summary>
- /// <param name="task">浠诲姟瀹炰綋銆�</param>
- /// <returns>鍚屾缁撴灉銆�</returns>
- private WebResponseContent UpdateWMSTaskStatus(Dt_Task task)
- {
- var result = _httpClientHelper.Post<WebResponseContent>(
- nameof(ConfigKey.UpdateTaskByStatus),
- new UpdateTaskDto { Id = task.TaskNum, NewStatus = task.TaskStatus, NextAddress = task.NextAddress, CurrentAddress = task.CurrentAddress }.ToJson());
-
- if (!result.IsSuccess || !result.Data.Status)
- return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鏇存柊浠诲姟鐘舵�佸け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
-
- return WebResponseContent.Instance.OK();
- }
- }
-}
+锘縰sing Serilog;
+using System.Diagnostics.CodeAnalysis;
+using WIDESEA_Core;
+using WIDESEAWCS_Common.HttpEnum;
+using WIDESEAWCS_Common.TaskEnum;
+using WIDESEAWCS_Core;
+using WIDESEAWCS_Core.Enums;
+using WIDESEAWCS_Core.Helper;
+using WIDESEAWCS_DTO;
+using WIDESEAWCS_DTO.TaskInfo;
+using WIDESEAWCS_ITaskInfoRepository;
+using WIDESEAWCS_ITaskInfoService;
+using WIDESEAWCS_Model.Models;
+using WIDESEAWCS_QuartzJob.Models;
+using WIDESEAWCS_QuartzJob.Service;
+using WIDESEAWCS_Tasks;
+
+namespace WIDESEAWCS_TaskInfoService.Flows
+{
+ /// <summary>
+ /// 鍏ュ簱浠诲姟娴佺▼鏈嶅姟銆�
+ /// 璐熻矗鍏ュ簱浠诲姟鎺ユ敹鍒濆鍖栥�佺姸鎬佹帹杩涘強鍫嗗灈鏈哄畬鎴愬鐞嗐��
+ /// </summary>
+ public class InboundTaskFlowService : IInboundTaskFlowService
+ {
+ private readonly IRouterService _routerService;
+ private readonly ITaskRepository _taskRepository;
+ private readonly HttpClientHelper _httpClientHelper;
+ private readonly ILogger _logger;
+
+ /// <summary>
+ /// 鍒濆鍖栧叆搴撲换鍔℃祦绋嬫湇鍔°��
+ /// </summary>
+ /// <param name="routerService">璺敱鏈嶅姟銆�</param>
+ /// <param name="httpClientHelper">WMS鎺ュ彛璋冪敤甯姪绫汇��</param>
+ public InboundTaskFlowService(IRouterService routerService, ITaskRepository taskRepository, HttpClientHelper httpClientHelper, ILogger logger)
+ {
+ _routerService = routerService;
+ _taskRepository = taskRepository;
+ _httpClientHelper = httpClientHelper;
+ _logger = logger;
+ }
+
+ /// <summary>
+ /// 鎺ユ敹WMS浠诲姟鏃跺垵濮嬪寲鍏ュ簱浠诲姟銆�
+ /// </summary>
+ /// <param name="task">浠诲姟瀹炰綋銆�</param>
+ /// <param name="source">WMS浠诲姟鍘熷鏁版嵁銆�</param>
+ public WebResponseContent InitializeOnReceive([NotNull] Dt_Task task, [NotNull] WMSTaskDTO source)
+ {
+ WebResponseContent content = new WebResponseContent();
+ Dt_Router routers = _routerService.QueryNextRoute(source.SourceAddress);
+ if (routers.IsNullOrEmpty())
+ {
+ return content.Error("鏈壘鍒拌矾鐢变俊鎭�");
+ }
+
+ task.TaskStatus = (int)TaskInStatusEnum.InNew;
+ task.CurrentAddress = source.SourceAddress;
+ task.NextAddress = routers.ChildPosi;
+
+ return content.OK();
+ }
+
+ /// <summary>
+ /// 鎺ㄨ繘鍏ュ簱浠诲姟鐘舵�侊紝骞跺湪鍏抽敭鐘舵�佽皟鐢╓MS鎺ュ彛銆�
+ /// </summary>
+ /// <param name="task">浠诲姟瀹炰綋銆�</param>
+ /// <returns>鎺ㄨ繘缁撴灉銆�</returns>
+ public WebResponseContent MoveToNextStatus([NotNull] Dt_Task task)
+ {
+ if (task.TaskStatus >= (int)TaskInStatusEnum.InFinish)
+ return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
+
+ task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskInStatusEnum>();
+ if (task.TaskStatus <= 0)
+ return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
+
+ if (task.TaskStatus == (int)TaskInStatusEnum.Line_InFinish)
+ {
+ return GetWMSInboundLocation(task);
+ }
+
+ return UpdateWMSTaskStatus(task);
+ }
+
+ /// <summary>
+ /// 澶勭悊鍫嗗灈鏈哄叆搴撳畬鎴愬姩浣溿��
+ /// </summary>
+ /// <param name="task">浠诲姟瀹炰綋銆�</param>
+ /// <returns>澶勭悊缁撴灉銆�</returns>
+ public WebResponseContent CompleteStackerTask([NotNull] Dt_Task task)
+ {
+ WebResponseContent content = new WebResponseContent();
+ if (task.TaskStatus != (int)TaskInStatusEnum.SC_InExecuting)
+ {
+ return WebResponseContent.Instance.OK();
+ }
+
+ int nextStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskInStatusEnum>();
+ task.TaskStatus = nextStatus;
+ task.ModifyDate = DateTime.Now;
+ task.Modifier = "System";
+
+ var result = _httpClientHelper.Post<WebResponseContent>(
+ nameof(ConfigKey.InboundFinishTaskAsync),
+ (new CreateTaskDto { PalletCode = task.PalletCode }).ToJson());
+
+ if (!result.IsSuccess || !result.Data.Status)
+ {
+ QuartzLogHelper.LogError(_logger, $"璋冪敤WMS鎺ュ彛澶辫触,鎺ュ彛:銆怚nboundFinishTaskAsync銆�,璇锋眰鍙傛暟:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�", "InboundTaskFlowService");
+ return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄叆搴撳畬鎴愬け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
+ }
+
+ QuartzLogHelper.LogInfo(_logger, $"璋冪敤WMS鎺ュ彛鎴愬姛,鎺ュ彛:銆怚nboundFinishTaskAsync銆�,鍝嶅簲鏁版嵁:銆恵result.Data?.Data}銆�,鑰楁椂:0ms", "InboundTaskFlowService");
+ return content.OK($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄叆搴撳畬鎴愭垚鍔�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�");
+ }
+
+ /// <summary>
+ /// 浠嶹MS鑾峰彇鍏ュ簱鐩爣鍦板潃骞跺洖鍐欎换鍔°��
+ /// </summary>
+ /// <param name="task">浠诲姟瀹炰綋銆�</param>
+ /// <returns>璋冪敤缁撴灉銆�</returns>
+ private WebResponseContent GetWMSInboundLocation(Dt_Task task)
+ {
+ string configKey = nameof(ConfigKey.GetTasksLocation);
+ string requestParam = new CreateTaskDto { PalletCode = task.PalletCode }.ToJson();
+ DateTime startTime = DateTime.Now;
+
+ var result = _httpClientHelper.Post<WebResponseContent>(
+ configKey,
+ requestParam);
+
+ if (!result.IsSuccess || !result.Data.Status)
+ {
+ QuartzLogHelper.LogError(_logger, $"璋冪敤WMS鎺ュ彛澶辫触,鎺ュ彛:銆恵configKey}銆�,璇锋眰鍙傛暟:銆恵requestParam}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�", "InboundTaskFlowService");
+ return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鑾峰彇浠诲姟鐩爣鍦板潃澶辫触,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
+ }
+
+ QuartzLogHelper.LogInfo(_logger, $"璋冪敤WMS鎺ュ彛鎴愬姛,鎺ュ彛:銆恵configKey}銆�,鍝嶅簲鏁版嵁:銆恵result.Data?.Data}銆�,鑰楁椂:{(DateTime.Now - startTime).TotalMilliseconds}ms", "InboundTaskFlowService");
+
+ string? nextAddress = result.Data.Data?.ToString();
+ if (string.IsNullOrEmpty(nextAddress))
+ return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鑾峰彇浠诲姟鐩爣鍦板潃澶辫触,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆愭湭鑾峰彇鍒版湁鏁堢殑鐩爣鍦板潃銆�");
+
+ task.CurrentAddress = task.NextAddress;
+ task.NextAddress = nextAddress;
+ task.TargetAddress = nextAddress;
+
+ return WebResponseContent.Instance.OK();
+ }
+
+ /// <summary>
+ /// 灏嗕换鍔$姸鎬佸悓姝ュ埌WMS銆�
+ /// </summary>
+ /// <param name="task">浠诲姟瀹炰綋銆�</param>
+ /// <returns>鍚屾缁撴灉銆�</returns>
+ private WebResponseContent UpdateWMSTaskStatus(Dt_Task task)
+ {
+ DateTime startTime = DateTime.Now;
+
+ // 澶勭悊鍏ュ簱瀹屾垚鐘舵�佺殑鐗规畩鍚屾
+ if (task.TaskStatus == (int)TaskInStatusEnum.InFinish)
+ {
+ string InboundFinishKey = nameof(ConfigKey.InboundFinishTaskAsync);
+ var requestDto = new CreateTaskDto()
+ {
+ PalletCode = task.PalletCode,
+ SourceAddress = task.SourceAddress,
+ TargetAddress = task.TargetAddress,
+ Roadway = task.Roadway,
+ TaskType = task.TaskType,
+ }.ToJson();
+
+ var resultFinish = _httpClientHelper.Post<WebResponseContent>(InboundFinishKey, requestDto);
+ if (!resultFinish.IsSuccess || !resultFinish.Data.Status)
+ {
+ QuartzLogHelper.LogError(_logger, $"璋冪敤WMS鎺ュ彛澶辫触,鎺ュ彛:銆恵resultFinish}銆�,璇锋眰鍙傛暟:銆恵requestDto}銆�,閿欒淇℃伅:銆恵resultFinish.Data?.Message}銆�", "InboundTaskFlowService");
+ return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鏇存柊浠诲姟鐘舵�佸け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆恵resultFinish.Data?.Message}銆�");
+ }
+
+ QuartzLogHelper.LogInfo(_logger, $"璋冪敤WMS鎺ュ彛鎴愬姛,鎺ュ彛:銆恵InboundFinishKey}銆�,鍝嶅簲鏁版嵁:銆恵resultFinish.Data?.Data}銆�,鑰楁椂:{(DateTime.Now - startTime).TotalMilliseconds}ms", "InboundTaskFlowService");
+ _taskRepository.DeleteAndMoveIntoHty(task, OperateTypeEnum.浜哄伐瀹屾垚);
+
+ return WebResponseContent.Instance.OK();
+ }
+
+ string configKey = nameof(ConfigKey.UpdateTaskByStatus);
+ string requestParam = new UpdateTaskDto { Id = task.TaskNum, NewStatus = task.TaskStatus, NextAddress = task.NextAddress, CurrentAddress = task.CurrentAddress }.ToJson();
+
+ var result = _httpClientHelper.Post<WebResponseContent>(
+ configKey,
+ requestParam);
+
+ if (!result.IsSuccess || !result.Data.Status)
+ {
+ QuartzLogHelper.LogError(_logger, $"璋冪敤WMS鎺ュ彛澶辫触,鎺ュ彛:銆恵configKey}銆�,璇锋眰鍙傛暟:銆恵requestParam}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�", "InboundTaskFlowService");
+ return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鏇存柊浠诲姟鐘舵�佸け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
+ }
+
+ QuartzLogHelper.LogInfo(_logger, $"璋冪敤WMS鎺ュ彛鎴愬姛,鎺ュ彛:銆恵configKey}銆�,鍝嶅簲鏁版嵁:銆恵result.Data?.Data}銆�,鑰楁椂:{(DateTime.Now - startTime).TotalMilliseconds}ms", "InboundTaskFlowService");
+ return WebResponseContent.Instance.OK();
+ }
+ }
+}
--
Gitblit v1.9.3