wanshenmean
11 小时以前 5bf10c1dafe485d506ec534f98e5220a3b83dd17
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs
@@ -1,4 +1,5 @@
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core.LogHelper;
using WIDESEAWCS_Tasks.Workflow.Abstractions;
namespace WIDESEAWCS_Tasks.Workflow
@@ -26,12 +27,21 @@
        private readonly RobotTaskProcessor _taskProcessor;
        /// <summary>
        /// Socket 网关
        /// </summary>
        /// <remarks>
        /// 用于向客户端发送响应消息。
        /// </remarks>
        private readonly ISocketClientGateway _socketClientGateway;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="taskProcessor">任务处理器实例</param>
        public RobotSimpleCommandHandler(RobotTaskProcessor taskProcessor)
        public RobotSimpleCommandHandler(RobotTaskProcessor taskProcessor, ISocketClientGateway socketClientGateway)
        {
            _taskProcessor = taskProcessor;
            _socketClientGateway = socketClientGateway;
        }
        /// <summary>
@@ -71,12 +81,12 @@
                // 机器人正在回零
                case "homing":
                    state.OperStatus = "Homing";
                    state.Homed = "Homing";
                    return true;
                // 机器人已完成回零
                case "homed":
                    state.OperStatus = "Homed";
                    state.Homed = "Homed";
                    return true;
                // 机器人正在运行
@@ -113,71 +123,160 @@
                // 全部取货完成
                case "allpickfinished":
                {
                    // 更新当前动作为"全部取货完成"
                    state.CurrentAction = "AllPickFinished";
                    // 获取当前关联的任务
                    var currentTask = state.CurrentTask;
                    if (currentTask == null)
                    {
                        // 没有任务关联,返回 false
                        return false;
                    }
                        // 更新当前动作为"全部取货完成"
                        state.CurrentAction = "AllPickFinished";
                    // 判断任务类型
                    var robotTaskType = (RobotTaskTypeEnum)currentTask.RobotTaskType;
                    // 只有拆盘或换盘任务需要处理入库
                    if (robotTaskType == RobotTaskTypeEnum.SplitPallet || robotTaskType == RobotTaskTypeEnum.ChangePallet)
                    {
                        // 处理入库任务回传
                        // useSourceAddress: true 表示使用源地址(拆盘/换盘场景)
                        if (await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: true))
                        // 获取当前关联的任务
                        var currentTask = state.CurrentTask;
                        if (currentTask == null)
                        {
                            // 入库成功,删除任务记录
                            _taskProcessor.DeleteTask(currentTask.RobotTaskId);
                            // 没有任务关联,返回 false
                            return false;
                        }
                        // 判断任务类型
                        var robotTaskType = (RobotTaskTypeEnum)currentTask.RobotTaskType;
                        // 换盘任务:仅当所有阶段完成时才处理入库
                        if (robotTaskType == RobotTaskTypeEnum.ChangePallet)
                        {
                            if (state.ChangePalletPhase == 0)
                            {
                                // 调用批量拆盘确认接口(换盘取完阶段)
                                var sourcePallet = state.CurrentTask.RobotSourceAddressPalletCode;
                                var confirmResult = _taskProcessor.PostSplitPalletConfirmAsync(sourcePallet);
                                if (!confirmResult.IsSuccess)
                                {
                                    QuartzLogger.Error($"批量拆盘确认失败: {confirmResult.ErrorMessage}", state.RobotCrane?.DeviceName ?? "Unknown");
                                }
                                // 所有阶段完成,处理入库
                                if (await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: true))
                                {
                                    // 入库成功,删除任务记录
                                    _taskProcessor.DeleteTask(currentTask.RobotTaskId);
                                    await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Swap,diskFinished");
                                    QuartzLogger.Info($"发送消息:【Swap,diskFinished】", state.RobotCrane.DeviceName);
                                    // 重置批次状态
                                    state.ChangePalletPhase = 0;
                                    state.CurrentBatchIndex = 1;
                                    state.IsInFakeBatteryMode = false;
                                    return true;
                                }
                            }
                            // 中间阶段不处理,仅更新状态
                            return true;
                        }
                        // 拆盘任务:直接处理入库
                        if (robotTaskType == RobotTaskTypeEnum.SplitPallet)
                        {
                            // 调用批量拆盘确认接口
                            var sourcePallet = state.CurrentTask.RobotSourceAddressPalletCode;
                            var confirmResult = _taskProcessor.PostSplitPalletConfirmAsync(sourcePallet);
                            if (!confirmResult.IsSuccess)
                            {
                                QuartzLogger.Error($"批量拆盘确认失败: {confirmResult.ErrorMessage}", state.RobotCrane?.DeviceName ?? "Unknown");
                            }
                            if (await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: true))
                            {
                                // 入库成功,删除任务记录
                                _taskProcessor.DeleteTask(currentTask.RobotTaskId);
                                await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Swap,diskFinished");
                                QuartzLogger.Info($"发送消息:【Swap,diskFinished】", state.RobotCrane.DeviceName);
                                return true;
                            }
                        }
                        return false;
                    }
                    return false;
                }
                // 全部放货完成
                case "allputfinished":
                {
                    // 更新当前动作为"全部放货完成"
                    state.CurrentAction = "AllPutFinished";
                    // 获取当前关联的任务
                    var currentTask = state.CurrentTask;
                    if (currentTask == null)
                    {
                        return false;
                    }
                        // 更新当前动作为"全部放货完成"
                        state.CurrentAction = "AllPutFinished";
                    // 判断任务类型
                    var robotTaskType = (RobotTaskTypeEnum)currentTask.RobotTaskType;
                    // 只有组盘或换盘任务需要处理入库
                    if (robotTaskType == RobotTaskTypeEnum.GroupPallet || robotTaskType == RobotTaskTypeEnum.ChangePallet)
                    {
                        // 处理入库任务回传
                        // useSourceAddress: false 表示使用目标地址(组盘/换盘场景)
                        if (await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: false))
                        // 获取当前关联的任务
                        var currentTask = state.CurrentTask;
                        if (currentTask == null)
                        {
                            // 入库成功,删除任务记录
                            _taskProcessor.DeleteTask(currentTask.RobotTaskId);
                            return false;
                        }
                            // 清理状态,为下一个任务做准备
                            state.CurrentTask = null;           // 清除当前任务
                            state.RobotTaskTotalNum = 0;        // 重置任务计数
                            state.CellBarcode = new List<string>();  // 清空条码列表
                        // 判断任务类型
                        var robotTaskType = (RobotTaskTypeEnum)currentTask.RobotTaskType;
                        // 换盘任务:仅当所有阶段完成时才处理入库
                        if (robotTaskType == RobotTaskTypeEnum.ChangePallet)
                        {
                            if (state.ChangePalletPhase == 0)
                            {
                                // 调用批量组盘确认接口(换盘放完阶段)
                                var targetPallet = state.CurrentTask.RobotTargetAddressPalletCode;
                                var confirmResult = _taskProcessor.PostGroupPalletConfirmAsync(targetPallet);
                                if (!confirmResult.IsSuccess)
                                {
                                    QuartzLogger.Error($"批量组盘确认失败: {confirmResult.ErrorMessage}", state.RobotCrane?.DeviceName ?? "Unknown");
                                }
                                // 所有阶段完成,处理入库
                                if (await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: false))
                                {
                                    // 入库成功,删除任务记录
                                    _taskProcessor.DeleteTask(currentTask.RobotTaskId);
                                    // 清理状态,为下一个任务做准备
                                    state.CurrentTask = null;           // 清除当前任务
                                    state.RobotTaskTotalNum = 0;        // 重置任务计数
                                    state.CellBarcode = new List<string>();  // 清空条码列表
                                    await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Group,diskFinished");
                                    QuartzLogger.Info($"发送消息:【Group,diskFinished】", state.RobotCrane.DeviceName);
                                    // 重置批次状态
                                    state.ChangePalletPhase = 0;
                                    state.CurrentBatchIndex = 1;
                                    state.IsInFakeBatteryMode = false;
                                    return true;
                                }
                            }
                            // 中间阶段不处理,仅更新状态
                            return true;
                        }
                        // 组盘任务:直接处理入库
                        if (robotTaskType == RobotTaskTypeEnum.GroupPallet)
                        {
                            // 调用批量组盘确认接口
                            var targetPallet = state.CurrentTask.RobotTargetAddressPalletCode;
                            var confirmResult = _taskProcessor.PostGroupPalletConfirmAsync(targetPallet);
                            if (!confirmResult.IsSuccess)
                            {
                                QuartzLogger.Error($"批量组盘确认失败: {confirmResult.ErrorMessage}", state.RobotCrane?.DeviceName ?? "Unknown");
                            }
                            // 处理入库任务回传
                            // useSourceAddress: false 表示使用目标地址(组盘场景)
                            if (await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: false))
                            {
                                // 入库成功,删除任务记录
                                _taskProcessor.DeleteTask(currentTask.RobotTaskId);
                                // 清理状态,为下一个任务做准备
                                state.CurrentTask = null;           // 清除当前任务
                                state.RobotTaskTotalNum = 0;        // 重置任务计数
                                state.CellBarcode = new List<string>();  // 清空条码列表
                                await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Group,diskFinished");
                                QuartzLogger.Info($"发送消息:【Group,diskFinished】", state.RobotCrane.DeviceName);
                                return true;
                            }
                        }
                        return false;
                    }
                    return false;
                }
                // ==================== 模式切换命令 ====================
@@ -221,4 +320,4 @@
            }
        }
    }
}
}