--- name: 子任务完成时更新容器位置 overview: 在子任务完成钩子中,根据任务链类型(移库/出库/入库)判断是否需要更新容器位置,调用容器位置绑定/解绑API更新容器与库位的关系。 todos: [] --- # 子任务完成时更新容器位置 ## 需求说明 在子任务完成时,根据任务链类型判断是否需要更新容器位置: - **移库完成**:容器与源库位解绑,与目标库位绑定 - **出库完成**:容器与源库位解绑 - **入库完成**:容器与目标库位绑定 ## 实现方案 ### 1. 修改 `MachineTaskCompletedHook` 类 **文件路径**:`baoshi-robot/baoshi-robot-core/src/main/java/com/baoshi/robot/core/statemachine/hook/after/MachineTaskCompletedHook.java` **变更内容**: - 注入 `CustomLocationContainerRpcApi` 和 `IMachineTaskChainService` - 在 `execute` 方法中,子任务完成时调用容器位置更新逻辑 - 添加私有方法 `updateContainerLocation` 处理容器位置更新: - 通过 `machineTask.getChainCode()` 获取任务链 - 根据任务链类型(`MachineTaskChainTypeEnum`)判断操作类型 - 移库(MOVE):解绑源库位,绑定目标库位 - 出库(OUTBOUND):解绑源库位 - 入库(INBOUND):绑定目标库位 - 调用 `CustomLocationContainerRpcApi` 的相应方法 ### 2. 实现细节 **判断逻辑**: - 通过 `machineTask.getChainCode()` 查询 `MachineTaskChain` - 使用 `MachineTaskChain.getType()` 判断任务链类型 - 根据类型执行相应的绑定/解绑操作 **API调用**: - `unbindContainerLocation(containerCode, warehouseId)`:解绑容器与库位 - `bindContainerLocation(ContainerBindLocationDTO)`:绑定容器与库位 - 需要构建 `ContainerBindLocationDTO`,包含 `warehouseId` 和 `dataList` - `dataList` 包含 `ContainerLocationDataDTO`,需要 `containerCode` 和 `locationId` **注意事项**: - 需要校验容器编码和库位编码不为空 - 需要校验任务链类型是否支持位置更新 - 异常处理:记录日志但不影响任务完成流程 - 只在批次完成时执行(避免重复执行) ## 文件变更清单 1. **修改文件**: - `baoshi-robot/baoshi-robot-core/src/main/java/com/baoshi/robot/core/statemachine/hook/after/MachineTaskCompletedHook.java` - 添加依赖注入 - 添加容器位置更新逻辑 - 添加私有方法处理位置更新 ## 实现流程图 ```mermaid flowchart TD A[子任务完成] --> B{获取任务链} B --> C{判断任务链类型} C -->|MOVE 移库| D[解绑源库位] D --> E[绑定目标库位] C -->|OUTBOUND 出库| F[解绑源库位] C -->|INBOUND 入库| G[绑定目标库位] E --> H[完成] F --> H G --> H ```