From 419159c8611dca81b94b3103cdeaeb9272aed5ea Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期四, 23 四月 2026 16:40:32 +0800
Subject: [PATCH] feat(机器人任务): 实现本地创建机器人任务功能
---
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs | 163 +++++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 148 insertions(+), 15 deletions(-)
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
index f88a4e6..ebaa465 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
@@ -20,7 +20,9 @@
using MapsterMapper;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
+using Serilog;
using SqlSugar;
+using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using WIDESEA_Core;
using WIDESEAWCS_Common.HttpEnum;
@@ -28,6 +30,7 @@
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_Core.Helper;
+using WIDESEAWCS_Core.Utilities;
using WIDESEAWCS_DTO.Stock;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_ITaskInfoRepository;
@@ -35,6 +38,7 @@
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DTO;
+using WIDESEAWCS_Tasks;
namespace WIDESEAWCS_TaskInfoService
{
@@ -43,6 +47,7 @@
private readonly IMapper _mapper;
private readonly HttpClientHelper _httpClientHelper;
private readonly ITaskExecuteDetailService _taskExecuteDetailService;
+ private readonly ILogger _logger;
private Dictionary<string, OrderByType> _taskOrderBy = new()
{
@@ -59,11 +64,12 @@
public List<int> TaskRobotTypes => typeof(TaskOtherTypeEnum).GetEnumIndexList();
- public RobotTaskService(IRobotTaskRepository BaseDal, IMapper mapper, HttpClientHelper httpClientHelper, ITaskExecuteDetailService taskExecuteDetailService) : base(BaseDal)
+ public RobotTaskService(IRobotTaskRepository BaseDal, IMapper mapper, HttpClientHelper httpClientHelper, ITaskExecuteDetailService taskExecuteDetailService, ILogger logger) : base(BaseDal)
{
_mapper = mapper;
_httpClientHelper = httpClientHelper;
_taskExecuteDetailService = taskExecuteDetailService;
+ _logger = logger;
}
public WebResponseContent ReceiveWMSTask([NotNull] WMSTaskDTO taskDTO, StockDTO stockDTO)
@@ -79,18 +85,18 @@
Dt_RobotTask task = new Dt_RobotTask
{
RobotTaskNum = taskDTO.TaskNum,
- RobotSourceAddressLineCode = stockDTO.SourceLineNo,
- RobotTargetAddressLineCode = stockDTO.TargetLineNo,
- RobotRoadway = stockDTO.Roadway,
- RobotSourceAddress = stockDTO.SourceLineNo,
- RobotTargetAddress = stockDTO.TargetLineNo,
- RobotSourceAddressPalletCode = stockDTO.SourcePalletNo,
- RobotTargetAddressPalletCode = stockDTO.TargetPalletNo,
+ RobotSourceAddressLineCode = stockDTO?.SourceLineNo ?? string.Empty,
+ RobotTargetAddressLineCode = stockDTO?.TargetLineNo ?? string.Empty,
+ RobotRoadway = stockDTO?.Roadway ?? string.Empty,
+ RobotSourceAddress = taskDTO.SourceAddress,
+ RobotTargetAddress = taskDTO.TargetAddress,
+ RobotSourceAddressPalletCode = stockDTO?.SourcePalletNo ?? string.Empty,
+ RobotTargetAddressPalletCode = stockDTO?.TargetPalletNo ?? string.Empty,
RobotTaskType = taskDTO.TaskType,
RobotTaskState = taskDTO.TaskStatus,
RobotGrade = taskDTO.Grade,
Creater = "WMS",
- RobotTaskTotalNum = 0,
+ RobotTaskTotalNum = taskDTO.TaskQuantity,
};
BaseDal.AddData(task);
@@ -111,6 +117,11 @@
return BaseDal.QueryFirst(x => x.RobotRoadway == deviceCode && x.RobotTaskState != (int)TaskRobotStatusEnum.RobotExecuting, TaskOrderBy);
}
+ public Dt_RobotTask? QueryRobotCraneExecutingTask(string deviceCode)
+ {
+ return BaseDal.QueryFirst(x => x.RobotRoadway == deviceCode && x.RobotTaskState == (int)TaskRobotStatusEnum.RobotExecuting, TaskOrderBy);
+ }
+
public async Task<bool> UpdateRobotTaskAsync(Dt_RobotTask robotTask)
{
return await BaseDal.UpdateDataAsync(robotTask);
@@ -125,17 +136,96 @@
{
string configKey = ResolveRobotTaskConfigKey(task.TargetAddress);
StockDTO stock = BuildRobotTaskStock(task, configKey);
+ string requestParam = stock.ToJson();
+ var stopwatch = Stopwatch.StartNew();
- var result = _httpClientHelper.Post<WebResponseContent>(configKey, stock.ToJson());
-
+ var result = _httpClientHelper.Post<WebResponseContent>(configKey, requestParam);
+ stopwatch.Stop();
if (!result.IsSuccess || !result.Data.Status)
+ {
+ QuartzLogHelper.LogError(_logger, $"璋冪敤WMS鎺ュ彛澶辫触,鎺ュ彛:銆恵configKey}銆�,璇锋眰鍙傛暟:銆恵requestParam}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�", "RobotTaskService");
return WebResponseContent.Instance.Error($"鑾峰彇WMS绯荤粺鏈烘鎵嬩换鍔″け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,鐩爣鍦板潃:銆恵task.TargetAddress}銆�,鎺ュ彛:銆恵configKey}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
+ }
- var wMSTask = JsonConvert.DeserializeObject<WMSTaskDTO>(result.Data.Data?.ToString() ?? string.Empty);
+ QuartzLogHelper.LogInfo(_logger, $"璋冪敤WMS鎺ュ彛鎴愬姛,鎺ュ彛:銆恵configKey}銆�,鍝嶅簲鏁版嵁:銆恵result.Data?.Data}銆�,鑰楁椂:{stopwatch.ElapsedMilliseconds}ms", "RobotTaskService");
+
+ var wMSTask = JsonConvert.DeserializeObject<WMSTaskDTO>(result?.Data?.Data?.ToString() ?? string.Empty);
if (wMSTask == null)
return WebResponseContent.Instance.Error($"鑾峰彇WMS绯荤粺鏈烘鎵嬩换鍔″け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆怶MS鏈繑鍥炴湁鏁堜换鍔℃暟鎹��");
return ReceiveWMSTask(wMSTask, stock);
+ }
+
+ /// <summary>
+ /// 鍦ㄦ湰鍦扮洿鎺ュ垱寤烘満姊版墜浠诲姟锛屼笉璋冪敤WMS鎺ュ彛銆�
+ /// 鏍规嵁鐩爣鍦板潃瑙f瀽浠诲姟绫诲瀷锛屾瀯寤轰换鍔℃暟鎹苟鍐欏叆鏁版嵁搴撱��
+ /// </summary>
+ /// <param name="task">鍑哄簱浠诲姟瀹炰綋</param>
+ /// <returns>鎿嶄綔缁撴灉</returns>
+ public WebResponseContent CreateLocalRobotTask(Dt_Task task)
+ {
+ WebResponseContent content = new();
+ try
+ {
+ // 鏍规嵁鐩爣鍦板潃瑙f瀽浠诲姟绫诲瀷閰嶇疆閿�
+ string configKey = ResolveRobotTaskConfigKey(task.TargetAddress);
+
+ // 鏋勫缓Stock鏁版嵁
+ StockDTO stock = BuildRobotTaskStock(task, configKey);
+
+ // 鑾峰彇鎶撳彇鍜屾斁缃湴鍧�鐨勭嚎浣撻厤缃紙濡傛灉鏈夛級
+ var section = App.Configuration.GetSection("RobotTaskAddressRules").GetSection(stock?.TargetLineNo ?? string.Empty).GetChildren().Select(c => c.Value).ToArray();
+ if (section.Length < 2)
+ return WebResponseContent.Instance.Error($"鏈壘鍒扮嚎浣揫{stock?.TargetLineNo}]鐨勫湴鍧�閰嶇疆");
+
+ // 鍒涘缓鏈湴鏈哄櫒浜轰换鍔�
+ Dt_RobotTask robotTask = new()
+ {
+ RobotTaskNum = Random.Shared.Next(),
+ RobotSourceAddress = section[0]!,
+ RobotTargetAddress = section[1]!,
+ RobotSourceAddressLineCode = stock?.SourceLineNo ?? string.Empty,
+ RobotTargetAddressLineCode = stock?.TargetLineNo ?? string.Empty,
+ RobotRoadway = stock?.Roadway ?? string.Empty,
+ RobotSourceAddressPalletCode = stock?.SourcePalletNo ?? string.Empty,
+ RobotTargetAddressPalletCode = stock?.TargetPalletNo ?? string.Empty,
+ RobotTaskType = MapConfigKeyToRobotTaskType(configKey),
+ RobotTaskState = (int)TaskRobotStatusEnum.RobotNew,
+ RobotGrade = task.Grade,
+ Creater = "WCS_Local",
+ RobotTaskTotalNum = 1,
+ CreateDate = DateTime.Now
+ };
+
+ BaseDal.AddData(robotTask);
+
+ _taskExecuteDetailService.AddTaskExecuteDetail(new List<int> { robotTask.RobotTaskNum }, "鏈湴鍒涘缓鏈哄櫒浜轰换鍔�");
+
+ QuartzLogHelper.LogInfo(_logger, $"鏈湴鍒涘缓鏈哄櫒浜轰换鍔℃垚鍔�,浠诲姟鍙�:銆恵robotTask.RobotTaskNum}銆�,婧愬湴鍧�:銆恵robotTask.RobotSourceAddress}銆�,鐩爣鍦板潃:銆恵robotTask.RobotTargetAddress}銆�,浠诲姟绫诲瀷:銆恵configKey}銆�", "RobotTaskService");
+
+ content = WebResponseContent.Instance.OK("鏈湴鍒涘缓鏈哄櫒浜轰换鍔℃垚鍔�", robotTask);
+ }
+ catch (Exception ex)
+ {
+ QuartzLogHelper.LogError(_logger, $"鏈湴鍒涘缓鏈哄櫒浜轰换鍔″け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:{ex.Message}", "RobotTaskService");
+ content = WebResponseContent.Instance.Error($"鏈湴鍒涘缓鏈哄櫒浜轰换鍔″け璐�,閿欒淇℃伅:{ex.Message}");
+ }
+ return content;
+ }
+
+ /// <summary>
+ /// 灏嗛厤缃敭鏄犲皠鍒版満姊版墜浠诲姟绫诲瀷鏋氫妇鍊笺��
+ /// </summary>
+ /// <param name="configKey">閰嶇疆閿悕绉�</param>
+ /// <returns>浠诲姟绫诲瀷鏋氫妇鍊�</returns>
+ public int MapConfigKeyToRobotTaskType(string? configKey)
+ {
+ return configKey switch
+ {
+ nameof(ConfigKey.CreateRobotGroupPalletTask) => (int)RobotTaskTypeEnum.GroupPallet,
+ nameof(ConfigKey.CreateRobotSplitPalletTask) => (int)RobotTaskTypeEnum.SplitPallet,
+ _ => (int)RobotTaskTypeEnum.ChangePallet
+ };
}
/// <summary>
@@ -220,15 +310,58 @@
CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
DeviceProDTO? devicePro = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(ConveyorLineDBNameNew.Barcode) && x.DeviceChildCode == sourceLineNo);
- ConveyorLineTaskCommandNew command = conveyorLine.ReadCustomer<ConveyorLineTaskCommandNew>(sourceLineNo); // 娴嬭瘯鐢�
- //var barcode = conveyorLine.GetValue<ConveyorLineDBNameNew, string>(ConveyorLineDBNameNew.Barcode, sourceLineNo);
- stock.SourcePalletNo = string.IsNullOrEmpty(command.Barcode.Replace("\0", "").ToString()) ? string.Empty : command.Barcode.Replace("\0", "").ToString();
+ //ConveyorLineTaskCommandNew command = conveyorLine.ReadCustomer<ConveyorLineTaskCommandNew>(sourceLineNo); // 娴嬭瘯鐢�
+ var barcode = conveyorLine.GetValue<ConveyorLineDBNameNew, string>(ConveyorLineDBNameNew.Barcode, sourceLineNo);
+ stock.SourcePalletNo = string.IsNullOrEmpty(barcode) ? string.Empty : barcode;
}
}
return stock;
}
+ public override WebResponseContent AddData(SaveModel saveModel)
+ {
+ try
+ {
+ if (saveModel == null || saveModel.MainData == null || saveModel.MainData.Count == 0)
+ {
+ return WebResponseContent.Instance.Error("浼犲弬閿欒,鍙傛暟涓嶈兘涓虹┖");
+ }
+
+ string validResult = typeof(Dt_RobotTask).ValidateDicInEntity(saveModel.MainData, true, TProperties);
+ if (!string.IsNullOrEmpty(validResult))
+ {
+ return WebResponseContent.Instance.Error(validResult);
+ }
+
+ object? taskNumObj = saveModel.MainData[nameof(Dt_RobotTask.RobotTaskNum)];
+ if (taskNumObj != null)
+ {
+ int taskNum = Convert.ToInt32(taskNumObj);
+ if (BaseDal.QueryFirst(x => x.RobotTaskNum == taskNum) != null)
+ {
+ return WebResponseContent.Instance.Error($"浠诲姟缂栧彿 {taskNum} 宸插瓨鍦�");
+ }
+ }
+
+ Dt_RobotTask entity = saveModel.MainData.DicToModel<Dt_RobotTask>();
+ entity.Creater = "鎵嬪姩鍒涘缓";
+ entity.CreateDate = DateTime.Now;
+
+ if (saveModel.DetailData == null || saveModel.DetailData.Count == 0)
+ {
+ BaseDal.AddData(entity);
+ return WebResponseContent.Instance.OK("鏂板鎴愬姛", entity);
+ }
+
+ return base.AddData(saveModel);
+ }
+ catch (Exception ex)
+ {
+ return WebResponseContent.Instance.Error($"鏂板澶辫触,閿欒淇℃伅:{ex.Message}");
+ }
+ }
+
/// <summary>
/// 鏍规嵁鐩爣鍦板潃鎸夈�岀簿纭� > 鍥為��鍊笺�嶈В鏋愯鍒欏�笺��
/// </summary>
--
Gitblit v1.9.3