From 94ad631d316da04c46266ddb1fc6e63e6f8f2fae Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期二, 17 三月 2026 17:34:15 +0800
Subject: [PATCH] feat: 同步协议处理、前端交互与业务联调改动
---
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs | 222 +++++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 205 insertions(+), 17 deletions(-)
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
index c0645bf..64f3c61 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -18,10 +18,10 @@
#endregion << 鐗� 鏈� 娉� 閲� >>
using MapsterMapper;
+using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using SqlSugar;
using System.Diagnostics.CodeAnalysis;
-using System.Text.Json;
using WIDESEA_Core;
using WIDESEAWCS_Common.HttpEnum;
using WIDESEAWCS_Common.TaskEnum;
@@ -29,13 +29,13 @@
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_Core.Enums;
using WIDESEAWCS_Core.Helper;
-using WIDESEAWCS_Core.Http;
using WIDESEAWCS_DTO;
using WIDESEAWCS_DTO.Stock;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
+using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Service;
@@ -96,9 +96,10 @@
task.Creater = "WMS";
if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
{
- Dt_Router router = _routerService.QueryNextRoute(item.RoadWay, item.TargetAddress,item.TaskType);
+ var taskType = 100;
+ Dt_Router router = _routerService.QueryNextRoute(item.Roadway, item.TargetAddress, taskType);
//鏆備笉鑰冭檻澶氳矾寰�
- if (router !=null )
+ if (router != null)
{
task.TaskStatus = (int)TaskOutStatusEnum.OutNew;
task.CurrentAddress = item.SourceAddress;
@@ -147,7 +148,7 @@
TaskNum = Convert.ToInt32(DateTime.Now.ToString("HHmmss")),
Grade = 1,
PalletCode = palletCode,
- RoadWay = "SC01",
+ Roadway = "SC01",
SourceAddress = sourceAddress,
TargetAddress = "SC01",
TaskState = (int)TaskInStatusEnum.InNew,
@@ -369,7 +370,14 @@
// 鏇存柊浠诲姟鏁版嵁
task.ModifyDate = DateTime.Now;
task.Modifier = "System";
- BaseDal.UpdateData(task);
+ if(task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish)
+ {
+ BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.鑷姩鍒犻櫎);
+ }
+ else
+ {
+ BaseDal.UpdateData(task);
+ }
// 璁板綍浠诲姟鎵ц璇︽儏
string logMessage = App.User.UserId > 0
@@ -394,9 +402,13 @@
return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
// 鏍规嵁鐘舵�佽皟鐢ㄤ笉鍚岀殑WMS鎺ュ彛
- if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish)
+ if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish && task.TaskType == (int)TaskOutboundTypeEnum.Outbound)
{
- return NotifyWMSOutboundFinish(task);
+ return GetWMSOutboundTrayTask(task);
+ }
+ else if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish && task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty)
+ {
+ return GetWMSRobotTask(task);
}
else
{
@@ -486,6 +498,170 @@
return WebResponseContent.Instance.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄嚭搴撳畬鎴愬け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
return WebResponseContent.Instance.OK();
+ }
+
+ /// <summary>
+ /// 鑾峰彇绌烘墭鍑哄簱浠诲姟
+ /// </summary>
+ private WebResponseContent GetWMSOutboundTrayTask(Dt_Task task)
+ {
+ var targetAddress = task.TargetAddress;
+ var warehouseId = MapWarehouseIdConfigKey(task.TargetAddress);
+ string sourceLineNo = ResolveRobotRuleValue(targetAddress, "AddressSourceLineNoMap", task.TargetAddress);
+
+ var result = _httpClientHelper.Post<WebResponseContent>(
+ nameof(ConfigKey.GetOutBoundTrayTaskAsync),
+ new CreateTaskDto { WarehouseId = warehouseId, TargetAddress = sourceLineNo }.ToJson());
+
+ if (!result.IsSuccess || !result.Data.Status)
+ return WebResponseContent.Instance.Error($"鑾峰彇WMS绯荤粺绌烘墭鐩樺嚭搴撲换鍔″け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
+
+ var wMSTask = JsonConvert.DeserializeObject<WMSTaskDTO>(result.Data.Data.ToString());
+
+ var tasks = new List<WMSTaskDTO>();
+ tasks.Add(wMSTask);
+
+
+ return ReceiveWMSTask(tasks);
+ }
+
+ /// <summary>
+ /// 鑾峰彇WMS绯荤粺鏈烘鎵嬩换鍔�
+ /// </summary>
+ /// <param name="task"></param>
+ /// <returns></returns>
+ private WebResponseContent GetWMSRobotTask(Dt_Task task)
+ {
+ string configKey = ResolveRobotTaskConfigKey(task.TargetAddress);
+ StockDTO stock = BuildRobotTaskStock(task, configKey);
+
+ var result = _httpClientHelper.Post<WebResponseContent>(configKey, stock.ToJson());
+
+ if (!result.IsSuccess || !result.Data.Status)
+ return WebResponseContent.Instance.Error($"鑾峰彇WMS绯荤粺鏈烘鎵嬩换鍔″け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,鐩爣鍦板潃:銆恵task.TargetAddress}銆�,鎺ュ彛:銆恵configKey}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
+
+ var tasks = JsonConvert.DeserializeObject<List<WMSTaskDTO>>(result.Data.Data?.ToString() ?? string.Empty);
+ if (tasks == null || tasks.Count == 0)
+ return WebResponseContent.Instance.Error($"鑾峰彇WMS绯荤粺鏈烘鎵嬩换鍔″け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆怶MS鏈繑鍥炴湁鏁堜换鍔℃暟鎹��");
+
+ return ReceiveWMSTask(tasks);
+ }
+
+ /// <summary>
+ /// 鏍规嵁杈撻�佺嚎鐩爣鍦板潃瑙f瀽鏈烘鎵嬩换鍔℃帴鍙c��
+ /// 瑙勫垯锛�
+ /// 1. 浠庨厤缃鍙栫簿纭湴鍧�鏄犲皠锛圓ddressMap锛�
+ /// 2. 鏈懡涓椂榛樿鎹㈢洏
+ /// </summary>
+ private string ResolveRobotTaskConfigKey(string? targetAddress)
+ {
+ string address = (targetAddress ?? string.Empty).Trim();
+ if (string.IsNullOrWhiteSpace(address))
+ return nameof(ConfigKey.CreateRobotChangePalletTask);
+
+ var section = App.Configuration.GetSection("RobotTaskAddressRules");
+ var addressMap = ReadRobotRuleMap(section.GetSection("AddressMap"));
+ if (addressMap.TryGetValue(address, out string? exactTaskType))
+ return MapRobotTaskTypeToConfigKey(exactTaskType);
+
+ return nameof(ConfigKey.CreateRobotChangePalletTask);
+ }
+
+ private int MapWarehouseIdConfigKey(string? targetAddress)
+ {
+ return targetAddress switch
+ {
+ "11068" => 1,
+ "11001" => 3,
+ "11010" => 3,
+ "10010" => 1,
+ "10030" => 1,
+ _ => 1
+ };
+ }
+
+ /// <summary>
+ /// 灏嗛厤缃换鍔$被鍨嬭浆鎹负鎺ュ彛閰嶇疆閿��
+ /// 鏀寔鍊硷細Split/Group/Change锛堝ぇ灏忓啓涓嶆晱鎰燂級
+ /// </summary>
+ private string MapRobotTaskTypeToConfigKey(string? taskType)
+ {
+ string type = (taskType ?? string.Empty).Trim().ToLowerInvariant();
+ return type switch
+ {
+ "split" => nameof(ConfigKey.CreateRobotSplitPalletTask),
+ "group" => nameof(ConfigKey.CreateRobotGroupPalletTask),
+ _ => nameof(ConfigKey.CreateRobotChangePalletTask)
+ };
+ }
+
+ /// <summary>
+ /// 鏍规嵁鎺ュ彛绫诲瀷鏋勫缓鏈烘鎵嬩换鍔″叆鍙傘��
+ /// </summary>
+ private StockDTO BuildRobotTaskStock(Dt_Task task, string configKey)
+ {
+ string targetAddress = task.TargetAddress ?? string.Empty;
+ string roadway = ResolveRobotRuleValue(targetAddress, "AddressRoadwayMap", task.Roadway);
+ string sourceLineNo = ResolveRobotRuleValue(targetAddress, "AddressSourceLineNoMap", task.SourceAddress);
+
+ var stock = new StockDTO
+ {
+ Roadway = roadway,
+ SourceLineNo = sourceLineNo,
+ TargetLineNo = task.TargetAddress,
+ SourcePalletNo = task.PalletCode,
+ TargetPalletNo = task.PalletCode
+ };
+
+ if (configKey == nameof(ConfigKey.CreateRobotSplitPalletTask))
+ {
+ stock.TargetPalletNo = string.Empty;
+ }
+ else if (configKey == nameof(ConfigKey.CreateRobotGroupPalletTask))
+ {
+ stock.SourcePalletNo = string.Empty;
+ }
+ else if (configKey == nameof(ConfigKey.CreateRobotChangePalletTask))
+ {
+ IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceProDTOs.Any(d => d.DeviceChildCode == sourceLineNo));
+ if (device != null)
+ {
+ CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
+ var barcode = conveyorLine.GetValue<ConveyorLineDBNameNew, string>(ConveyorLineDBNameNew.Barcode, sourceLineNo);
+ stock.SourcePalletNo = string.IsNullOrEmpty(barcode) ? string.Empty : barcode;
+ }
+ }
+
+ return stock;
+ }
+
+ /// <summary>
+ /// 鏍规嵁鐩爣鍦板潃鎸夈�岀簿纭� > 鍥為��鍊笺�嶈В鏋愯鍒欏�笺��
+ /// </summary>
+ private string ResolveRobotRuleValue(string? targetAddress, string addressSectionName, string? fallback)
+ {
+ string address = (targetAddress ?? string.Empty).Trim();
+ string defaultValue = fallback ?? string.Empty;
+ if (string.IsNullOrWhiteSpace(address))
+ return defaultValue;
+
+ var section = App.Configuration.GetSection("RobotTaskAddressRules");
+ var addressMap = ReadRobotRuleMap(section.GetSection(addressSectionName));
+ if (addressMap.TryGetValue(address, out string? value))
+ return value;
+
+ return defaultValue;
+ }
+
+ /// <summary>
+ /// 璇诲彇瑙勫垯鏄犲皠娈点��
+ /// </summary>
+ private Dictionary<string, string> ReadRobotRuleMap(IConfigurationSection section)
+ {
+ return section
+ .GetChildren()
+ .Where(x => !string.IsNullOrWhiteSpace(x.Key) && !string.IsNullOrWhiteSpace(x.Value))
+ .ToDictionary(x => x.Key.Trim(), x => x.Value!.Trim());
}
/// <summary>
@@ -613,19 +789,28 @@
task.ModifyDate = DateTime.Now;
task.Modifier = "System";
- var result = _httpClientHelper.Post<WebResponseContent>(nameof(ConfigKey.OutboundFinishTaskAsync), (new StockInfoDTO() { PalletCode = task.PalletCode, TaskNum = task.TaskNum }).ToJson());
- if (result.IsSuccess && result.Data.Status)
+ content = NotifyWMSOutboundFinish(task);
+ if (content.Status)
{
BaseDal.UpdateData(task);
_taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"鍫嗗灈鏈哄嚭搴撳畬鎴�");
return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄嚭搴撳畬鎴愭垚鍔�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�");
+ }
- }
- else
- {
- return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄嚭搴撳畬鎴愬け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Data.Message}銆�");
- }
+ //var result = _httpClientHelper.Post<WebResponseContent>(nameof(ConfigKey.OutboundFinishTaskAsync), (new StockInfoDTO() { PalletCode = task.PalletCode, TaskNum = task.TaskNum }).ToJson());
+ //if (result.IsSuccess && result.Data.Status)
+ //{
+ // BaseDal.UpdateData(task);
+
+ // _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"鍫嗗灈鏈哄嚭搴撳畬鎴�");
+ // return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄嚭搴撳畬鎴愭垚鍔�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�");
+
+ //}
+ //else
+ //{
+ // return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄嚭搴撳畬鎴愬け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Data.Message}銆�");
+ //}
}
else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup && task.TaskStatus == (int)TaskInStatusEnum.SC_InExecuting)
{
@@ -633,8 +818,6 @@
task.TaskStatus = nextStatus;
task.ModifyDate = DateTime.Now;
task.Modifier = "System";
-
-
var result = _httpClientHelper.Post<WebResponseContent>(nameof(ConfigKey.InboundFinishTaskAsync), (new CreateTaskDto()
{
@@ -817,4 +1000,9 @@
return BaseDal.QueryFirst(x => x.TaskNum == taskNum);
}
}
+
+ public enum ConveyorLineDBNameNew
+ {
+ Barcode
+ }
}
--
Gitblit v1.9.3