| | |
| | | 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> |
| | |
| | | // 从数据库重新查询当前任务(确保获取最新状态) |
| | | 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) |
| | | { |
| | |
| | | /// <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); |
| | |
| | | // 如果 API 调用成功 |
| | | if (result.Data.Status && result.IsSuccess) |
| | | { |
| | | // 更新当前动作为"取货完成" |
| | | state.CurrentAction = "PickFinished"; |
| | | } |
| | | } |
| | |
| | | // 非拆盘任务,直接更新动作 |
| | | state.CurrentAction = "PickFinished"; |
| | | } |
| | | |
| | | // 记录取货完成的位置(无论是否拆盘都记录) |
| | | state.LastPickPositions = positions; |
| | | |
| | | // 如果任务存在 |
| | | if (task != null) |
| | |
| | | /// <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> |
| | |
| | | // 记录放货完成的位置 |
| | | 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; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 如果放货成功 |
| | |
| | | { |
| | | // 更新当前动作为"放货完成" |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | } |