using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Tasks.Workflow.Abstractions;
namespace WIDESEAWCS_Tasks.Workflow
{
///
/// 简单命令处理器
///
///
/// 迁移原 RobotMessageHandler 中的简单命令分支,不改变业务语义。
///
/// 简单命令是指不需要额外参数的状态更新命令,如运行状态、模式切换等。
/// 与前缀命令(需要解析位置参数)相对。
///
/// 处理完成后返回 true;无法识别的命令返回 false。
///
public class RobotSimpleCommandHandler : IRobotSimpleCommandHandler
{
///
/// 机器人任务处理器
///
///
/// 用于处理 allpickfinished 和 allputfinished 命令时,
/// 调用任务入库和删除逻辑。
///
private readonly RobotTaskProcessor _taskProcessor;
///
/// 构造函数
///
/// 任务处理器实例
public RobotSimpleCommandHandler(RobotTaskProcessor taskProcessor)
{
_taskProcessor = taskProcessor;
}
///
/// 处理简单命令
///
///
/// 根据消息内容更新机器人的运行状态、模式、手臂对象等属性。
/// 某些命令(如 allpickfinished、allputfinished)会触发实际的业务逻辑。
///
/// 命令列表:
/// - homing: 回零中
/// - homed: 已回零
/// - running: 运行中
/// - pausing: 暂停中
/// - warming: 预热中
/// - emstoping: 急停中
/// - picking: 取货中
/// - puting: 放货中
/// - runmode,1: 运行模式切换到手动
/// - runmode,2: 运行模式切换到自动
/// - controlmode,1: 控制模式切换到客户端控制
/// - controlmode,2: 控制模式切换到其他
/// - armobject,1: 手臂有物料
/// - armobject,0: 手臂无物料
/// - allpickfinished: 全部取货完成
/// - allputfinished: 全部放货完成
///
/// 消息内容(小写形式)
/// 机器人当前状态(会被修改)
/// 是否成功处理;无法识别的命令返回 false
public async Task HandleAsync(string message, RobotSocketState state)
{
// 使用 switch 表达式进行模式匹配,提高可读性和性能
switch (message)
{
// ==================== 运行状态命令 ====================
// 机器人正在回零
case "homing":
state.OperStatus = "Homing";
return true;
// 机器人已完成回零
case "homed":
state.OperStatus = "Homed";
return true;
// 机器人正在取货
case "picking":
state.CurrentAction = "Picking";
return true;
// 机器人正在放货
case "puting":
state.CurrentAction = "Putting";
return true;
// ==================== 全部完成命令 ====================
// 全部取货完成
case "allpickfinished":
{
// 更新当前动作为"全部取货完成"
state.CurrentAction = "AllPickFinished";
// 获取当前关联的任务
var currentTask = state.CurrentTask;
if (currentTask == null)
{
// 没有任务关联,返回 false
return false;
}
// 判断任务类型
var robotTaskType = (RobotTaskTypeEnum)currentTask.RobotTaskType;
// 只有拆盘或换盘任务需要处理入库
if (robotTaskType == RobotTaskTypeEnum.SplitPallet || robotTaskType == RobotTaskTypeEnum.ChangePallet)
{
// 处理入库任务回传
// useSourceAddress: true 表示使用源地址(拆盘/换盘场景)
if (await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: true))
{
// 入库成功,删除任务记录
_taskProcessor.DeleteTask(currentTask.RobotTaskId);
return true;
}
}
return false;
}
// 全部放货完成
case "allputfinished":
{
// 更新当前动作为"全部放货完成"
state.CurrentAction = "AllPutFinished";
// 获取当前关联的任务
var currentTask = state.CurrentTask;
if (currentTask == null)
{
return false;
}
// 判断任务类型
var robotTaskType = (RobotTaskTypeEnum)currentTask.RobotTaskType;
// 只有组盘或换盘任务需要处理入库
if (robotTaskType == RobotTaskTypeEnum.GroupPallet || robotTaskType == RobotTaskTypeEnum.ChangePallet)
{
// 处理入库任务回传
// useSourceAddress: false 表示使用目标地址(组盘/换盘场景)
if (await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: false))
{
// 入库成功,删除任务记录
_taskProcessor.DeleteTask(currentTask.RobotTaskId);
// 清理状态,为下一个任务做准备
state.CurrentTask = null; // 清除当前任务
state.RobotTaskTotalNum = 0; // 重置任务计数
state.CellBarcode = new List(); // 清空条码列表
return true;
}
}
return false;
}
// ==================== 运行状态命令(续) ====================
// 机器人正在运行
case "running":
state.OperStatus = "Running";
return true;
// 机器人正在暂停
case "pausing":
state.OperStatus = "Pausing";
return true;
// 机器人正在预热
case "warming":
state.OperStatus = "Warming";
return true;
// 机器人正在急停
case "emstoping":
state.OperStatus = "Emstoping";
return true;
// ==================== 模式切换命令 ====================
// 运行模式切换为手动(模式1)
case "runmode,1":
state.RobotRunMode = 1;
return true;
// 运行模式切换为自动(模式2)
case "runmode,2":
state.RobotRunMode = 2;
return true;
// 控制模式切换为客户端控制(模式1)
case "controlmode,1":
state.RobotControlMode = 1;
return true;
// 控制模式切换为其他(模式2)
case "controlmode,2":
state.RobotControlMode = 2;
return true;
// ==================== 手臂对象命令 ====================
// 手臂有物料(抓取到货物)
case "armobject,1":
state.RobotArmObject = 1;
return true;
// 手臂无物料(手臂空闲)
case "armobject,0":
state.RobotArmObject = 0;
return true;
// ==================== 默认情况 ====================
// 无法识别的命令,返回 false
default:
return false;
}
}
}
}