wanshenmean
11 小时以前 5bf10c1dafe485d506ec534f98e5220a3b83dd17
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotPrefixCommandHandler.cs
@@ -58,22 +58,33 @@
        private readonly ISocketClientGateway _socketClientGateway;
        /// <summary>
        /// 假电芯位置服务
        /// </summary>
        /// <remarks>
        /// 用于释放假电芯点位。
        /// </remarks>
        private readonly IFakeBatteryPositionService _fakeBatteryPositionService;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="robotTaskService">任务服务</param>
        /// <param name="taskProcessor">任务处理器</param>
        /// <param name="stateManager">状态管理器</param>
        /// <param name="socketClientGateway">Socket 网关</param>
        /// <param name="fakeBatteryPositionService">假电芯位置服务</param>
        public RobotPrefixCommandHandler(
            IRobotTaskService robotTaskService,
            RobotTaskProcessor taskProcessor,
            RobotStateManager stateManager,
            ISocketClientGateway socketClientGateway)
            ISocketClientGateway socketClientGateway,
            IFakeBatteryPositionService fakeBatteryPositionService)
        {
            _robotTaskService = robotTaskService;
            _taskProcessor = taskProcessor;
            _stateManager = stateManager;
            _socketClientGateway = socketClientGateway;
            _fakeBatteryPositionService = fakeBatteryPositionService;
        }
        /// <summary>
@@ -134,20 +145,27 @@
                // 从数据库重新查询当前任务(确保获取最新状态)
                var task = await _robotTaskService.Repository.QueryFirstAsync(x => x.RobotTaskId == state.CurrentTask.RobotTaskId);
                // 根据命令前缀分发处理
                if (cmd.StartsWith("pickfinished"))
                if (task != null)
                {
                    // 处理取货完成
                    await HandlePickFinishedAsync(state, positions, task);
                }
                else if (cmd.StartsWith("putfinished"))
                {
                    // 处理放货完成
                    await HandlePutFinishedAsync(state, positions, task);
                }
                    // 根据命令前缀分发处理
                    if (cmd.StartsWith("pickfinished"))
                    {
                        // 处理取货完成
                        await HandlePickFinishedAsync(state, positions, task);
                    }
                    else if (cmd.StartsWith("putfinished"))
                    {
                        // 处理放货完成
                        await HandlePutFinishedAsync(state, positions, task);
                    }
                // 回写原消息到客户端(保持原有行为)
                await _socketClientGateway.SendMessageAsync(client, message);
                    // 回写原消息到客户端(保持原有行为)
                    await _socketClientGateway.SendMessageAsync(client, message);
                }
                else
                {
                    Console.WriteLine($"RobotJob HandleAsync Warning: Current task not found for RobotTaskId {state.CurrentTask.RobotTaskId}");
                }
            }
            catch (Exception ex)
            {
@@ -162,24 +180,31 @@
        /// <remarks>
        /// 处理逻辑:
        /// 1. 如果是拆盘任务,构建库存 DTO 并调用拆盘 API
        /// 2. 更新当前动作为"取货完成"
        /// 3. 记录取货完成的位置
        /// 4. 更新任务状态为"机器人取货完成"
        /// 5. 安全更新状态到 Redis
        /// 2. 换盘任务 Phase3 取假电芯时不调用拆盘 API
        /// 3. 更新当前动作为"取货完成"
        /// 4. 记录取货完成的位置
        /// 5. 更新任务状态为"机器人取货完成"
        /// 6. 安全更新状态到 Redis
        /// </remarks>
        /// <param name="state">机器人当前状态</param>
        /// <param name="positions">取货完成的位置编号数组</param>
        /// <param name="task">机器人任务记录</param>
        private async Task HandlePickFinishedAsync(RobotSocketState state, int[] positions, Dt_RobotTask? task)
        {
            // 如果是拆盘任务
            if (state.IsSplitPallet)
            // 记录取货完成的位置
            state.LastPickPositions = positions;
            // 换盘任务 Phase3 取假电芯:不调用拆盘 API
            if (state.CurrentTask?.RobotTaskType == RobotTaskTypeEnum.ChangePallet.GetHashCode()
                && state.ChangePalletPhase == 3)
            {
                state.CurrentAction = "PickFinished";
            }
            // 拆盘任务
            else if (state.IsSplitPallet)
            {
                // 构建库存 DTO,包含位置信息和托盘条码
                var stockDTO = RobotTaskProcessor.BuildStockDTO(state, positions);
                // 记录取货完成的位置
                state.LastPickPositions = positions;
                // 调用拆盘 API
                var result = _taskProcessor.PostSplitPalletAsync(stockDTO);
@@ -187,7 +212,6 @@
                // 如果 API 调用成功
                if (result.Data.Status && result.IsSuccess)
                {
                    // 更新当前动作为"取货完成"
                    state.CurrentAction = "PickFinished";
                }
            }
@@ -196,9 +220,6 @@
                // 非拆盘任务,直接更新动作
                state.CurrentAction = "PickFinished";
            }
            // 记录取货完成的位置(无论是否拆盘都记录)
            state.LastPickPositions = positions;
            // 如果任务存在
            if (task != null)
@@ -220,10 +241,11 @@
        /// <remarks>
        /// 处理逻辑:
        /// 1. 如果是组盘任务,构建库存 DTO 并调用组盘/换盘 API
        /// 2. 如果组盘成功,增加任务计数
        /// 3. 更新当前动作为"放货完成"
        /// 4. 更新任务状态为"机器人放货完成"
        /// 5. 安全更新状态到 Redis
        /// 2. 换盘任务根据阶段区分处理:流向A Phase2 不调用 API;流向B Phase2 正常调用;Phase4 调用 MarkAsAvailable
        /// 3. 如果组盘成功,增加任务计数
        /// 4. 更新当前动作为"放货完成"
        /// 5. 更新任务状态为"机器人放货完成"
        /// 6. 安全更新状态到 Redis
        /// </remarks>
        /// <param name="state">机器人当前状态</param>
        /// <param name="positions">放货完成的位置编号数组</param>
@@ -239,20 +261,65 @@
                // 记录放货完成的位置
                state.LastPutPositions = positions;
                // 构建库存 DTO
                var stockDTO = RobotTaskProcessor.BuildStockDTO(state, positions);
                // 判断是否为换盘任务
                var isChangePallet = state.CurrentTask?.RobotTaskType == RobotTaskTypeEnum.ChangePallet.GetHashCode();
                var isFlowA = state.CurrentTask?.RobotSourceAddressLineCode is "11001" or "11010";
                // 根据任务类型决定调用哪个 API
                // 换盘任务调用 ChangePalletAsync,组盘任务调用 GroupPalletAsync
                var configKey = state.CurrentTask?.RobotTaskType == RobotTaskTypeEnum.ChangePallet.GetHashCode()
                    ? nameof(ConfigKey.ChangePalletAsync)
                    : nameof(ConfigKey.GroupPalletAsync);
                if (isChangePallet)
                {
                    // 换盘任务:根据阶段区分处理
                    if (state.ChangePalletPhase == 2)
                    {
                        if (isFlowA)
                        {
                            // 流向A Phase2:放假电芯到目标托盘,不调用 API,不递增计数
                            // 仅更新状态
                        }
                        else
                        {
                            // 流向B Phase2:放正常电芯,递增计数
                            state.RobotTaskTotalNum += positions.Length;
                            if (task != null)
                                task.RobotTaskTotalNum -= positions.Length;
                // 调用组盘/换盘 API
                var result = _taskProcessor.PostGroupPalletAsync(configKey, stockDTO);
                            // 构建库存 DTO 并调用 ChangePalletAsync API
                            var stockDTO = RobotTaskProcessor.BuildStockDTO(state, positions);
                            var result = _taskProcessor.PostGroupPalletAsync(nameof(ConfigKey.ChangePalletAsync), stockDTO);
                            putSuccess = result.Data.Status && result.IsSuccess;
                        }
                    }
                    else if (state.ChangePalletPhase == 4)
                    {
                        // 流向B Phase4:放假电芯到5号位,不调用 API,不递增计数,释放点位
                        _fakeBatteryPositionService.MarkAsAvailable(positions.ToList());
                    }
                    else
                    {
                        // 非批次模式:正常递增计数并调用 API
                        state.RobotTaskTotalNum += positions.Length;
                        if (task != null)
                            task.RobotTaskTotalNum -= positions.Length;
                // 检查 API 返回状态
                putSuccess = result.Data.Status && result.IsSuccess;
                        var stockDTO = RobotTaskProcessor.BuildStockDTO(state, positions);
                        var result = _taskProcessor.PostGroupPalletAsync(nameof(ConfigKey.GroupPalletAsync), stockDTO);
                        putSuccess = result.Data.Status && result.IsSuccess;
                    }
                }
                else
                {
                    // 组盘任务:原有逻辑
                    var stockDTO = RobotTaskProcessor.BuildStockDTO(state, positions);
                    var result = _taskProcessor.PostGroupPalletAsync(nameof(ConfigKey.GroupPalletAsync), stockDTO);
                    putSuccess = result.Data.Status && result.IsSuccess;
                    // 增加任务计数
                    if (!state.IsScanNG)
                    {
                        state.RobotTaskTotalNum += positions.Length;
                        if (task != null)
                            task.RobotTaskTotalNum -= positions.Length;
                    }
                }
            }
            // 如果放货成功
@@ -260,27 +327,27 @@
            {
                // 更新当前动作为"放货完成"
                state.CurrentAction = "PutFinished";
                state.IsScanNG = false;
                // 增加任务计数(累加本次完成的数量)
                state.RobotTaskTotalNum += positions.Length;
                // 非组盘任务时增加计数(组盘任务已在上面递增)
                if (!state.IsGroupPallet)
                {
                    state.RobotTaskTotalNum += positions.Length;
                    if (task != null)
                        task.RobotTaskTotalNum -= positions.Length;
                }
                // 如果任务存在,同步更新任务的计数
                // 如果任务存在
                if (task != null)
                {
                    task.RobotTaskTotalNum -= positions.Length;
                }
            }
                    // 更新任务状态为"机器人放货完成"
                    task.RobotTaskState = TaskRobotStatusEnum.RobotPutFinish.GetHashCode();
            // 如果任务存在
            if (task != null)
            {
                // 更新任务状态为"机器人放货完成"
                task.RobotTaskState = TaskRobotStatusEnum.RobotPutFinish.GetHashCode();
                // 安全更新状态到 Redis
                if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
                {
                    await _robotTaskService.Repository.UpdateDataAsync(task);
                    // 安全更新状态到 Redis
                    if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
                    {
                        await _robotTaskService.Repository.UpdateDataAsync(task);
                    }
                }
            }
        }