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
|
{
|
/// <summary>
|
/// 前缀命令处理:迁移原 RobotMessageHandler 的 pickfinished/putfinished 分支。
|
/// </summary>
|
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);
|
}
|
}
|
}
|
}
|
}
|