using System.Net.Sockets; using WIDESEAWCS_Common.HttpEnum; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_DTO.TaskInfo; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_Tasks.Workflow.Abstractions; namespace WIDESEAWCS_Tasks.Workflow { /// /// 前缀命令处理:迁移原 RobotMessageHandler 的 pickfinished/putfinished 分支。 /// public class RobotPrefixCommandHandler : IRobotPrefixCommandHandler { private readonly IRobotTaskService _robotTaskService; private readonly RobotTaskProcessor _taskProcessor; private readonly RobotStateManager _stateManager; private readonly ISocketClientGateway _socketClientGateway; public RobotPrefixCommandHandler( IRobotTaskService robotTaskService, RobotTaskProcessor taskProcessor, RobotStateManager stateManager, ISocketClientGateway socketClientGateway) { _robotTaskService = robotTaskService; _taskProcessor = taskProcessor; _stateManager = stateManager; _socketClientGateway = socketClientGateway; } public bool IsPrefixCommand(string message) { return message.StartsWith("pickfinished") || message.StartsWith("putfinished"); } public async Task HandleAsync(string message, RobotSocketState state, TcpClient client) { try { var parts = message.Split(','); if (parts.Length < 1 || state.CurrentTask == null) { return; } var cmd = parts[0].ToLowerInvariant(); int[] positions = parts.Skip(1) .Select(p => int.TryParse(p, out int value) ? value : (int?)null) .Where(v => v.HasValue && v.Value != 0) .Select(v => v!.Value) .ToArray(); var task = await _robotTaskService.Repository.QueryFirstAsync(x => x.RobotTaskId == state.CurrentTask.RobotTaskId); if (cmd.StartsWith("pickfinished")) { await HandlePickFinishedAsync(state, positions, task); } else if (cmd.StartsWith("putfinished")) { await HandlePutFinishedAsync(state, positions, task); } await _socketClientGateway.SendMessageAsync(client, message); } catch (Exception ex) { Console.WriteLine($"RobotJob MessageReceived Error: {ex.Message}"); } } private async Task HandlePickFinishedAsync(RobotSocketState state, int[] positions, Dt_RobotTask? task) { if (state.IsSplitPallet) { var stockDTO = RobotTaskProcessor.BuildStockDTO(state, positions); state.LastPickPositions = positions; var result = _taskProcessor.PostSplitPalletAsync(stockDTO); if (result.Data.Status && result.IsSuccess) { state.CurrentAction = "PickFinished"; } } else { state.CurrentAction = "PickFinished"; } state.LastPickPositions = positions; if (task != null) { task.RobotTaskState = TaskRobotStatusEnum.RobotPickFinish.GetHashCode(); if (_stateManager.TryUpdateStateSafely(state.IPAddress, state)) { await _robotTaskService.Repository.UpdateDataAsync(task); } } } private async Task HandlePutFinishedAsync(RobotSocketState state, int[] positions, Dt_RobotTask? task) { bool putSuccess = true; if (state.IsGroupPallet) { state.LastPutPositions = positions; var stockDTO = RobotTaskProcessor.BuildStockDTO(state, positions); var configKey = state.CurrentTask?.RobotTaskType == RobotTaskTypeEnum.ChangePallet.GetHashCode() ? nameof(ConfigKey.ChangePalletAsync) : nameof(ConfigKey.GroupPalletAsync); var result = _taskProcessor.PostGroupPalletAsync(configKey, stockDTO); putSuccess = result.Data.Status && result.IsSuccess; } if (putSuccess) { state.CurrentAction = "PutFinished"; state.RobotTaskTotalNum += positions.Length; if (task != null) { task.RobotTaskTotalNum += positions.Length; } } if (task != null) { task.RobotTaskState = TaskRobotStatusEnum.RobotPutFinish.GetHashCode(); if (_stateManager.TryUpdateStateSafely(state.IPAddress, state)) { await _robotTaskService.Repository.UpdateDataAsync(task); } } } } }