# 选择机器人块输出参数立即更新说明 ## 修改背景 选择机器人块(CSelectAgvBp)和机器人执行动作块(CAgvOperationBp)是嵌套关系。之前的实现中,虽然选择机器人块在选择完成后状态就显示为成功,但是输出内容(选择出的机器人结果)要等到整个嵌套的动作块执行完成后才会更新到表中,在任务记录详情里才能显示出来。这不符合实际的显示需求。 ## 修改内容 ### 1. 修改 `RobotBlockHandler.update_block_record` 方法 **文件**: `services/execution/handlers/robot_scheduling.py` **修改点**: - 增加 `block_name` 和 `output_data` 参数 - 在选择机器人成功后,立即更新块记录的输出参数到数据库 - 构建完整的输出结构:`{"blocks": {"块名称": {"selectedAgvId": "机器人名称"}}}` - 同时更新 `output_params` 和 `block_out_params_value` 字段 ### 2. 修改选择机器人块的调用逻辑 **文件**: `services/execution/handlers/robot_scheduling.py` **修改点**: - 在选择机器人成功后(第897-902行),立即调用 `update_block_record` 方法 - 传入块名称和输出数据(包含选择的机器人名称) - 这样用户可以立即在任务记录详情中看到选择的机器人 ## 执行流程 ### 修改前的流程 1. 选择机器人块开始执行 2. 调用天风系统接口选择机器人 3. 等待机器人选择完成 4. 更新块记录状态为成功(但不更新输出参数) 5. 执行嵌套的动作块 6. **等待所有子块执行完成** 7. **最后才更新输出参数到数据库** 8. 用户才能看到选择的机器人 ### 修改后的流程 1. 选择机器人块开始执行 2. 调用天风系统接口选择机器人 3. 等待机器人选择完成 4. **立即更新块记录状态为成功,并更新输出参数到数据库** 5. **用户立即可以在任务记录详情中看到选择的机器人** 6. 执行嵌套的动作块 7. 所有子块执行完成后,再次更新输出参数(内容相同,不影响显示) ## 技术细节 ### 输出参数格式 ```json { "blocks": { "块名称": { "selectedAgvId": "机器人名称" } } } ``` ### 数据库字段 - `output_params`: 完整的输出结构(包含 blocks 层级) - `block_out_params_value`: 输出参数值(只包含选择的机器人信息) ## 注意事项 1. **输出参数会被更新两次**:第一次在选择机器人完成时立即更新,第二次在所有子块执行完成后再次更新。两次更新的内容相同,不会造成问题。 2. **不影响子块执行**:立即更新输出参数不会影响子块的执行逻辑,子块仍然可以正常访问 context 中的机器人信息。 3. **兼容性**:这个修改不会影响其他类型的块,只针对选择机器人块(CSelectAgvBp)。 ## 测试建议 1. 启动一个包含选择机器人块和嵌套动作块的任务 2. 在选择机器人完成后,立即查询任务记录详情 3. 验证能否看到选择的机器人信息 4. 等待动作块执行完成后,再次查询任务记录详情 5. 验证机器人信息保持一致 ## 相关文件 - `services/execution/handlers/robot_scheduling.py` - 选择机器人块处理器 - `services/execution/block_executor.py` - 块执行器 - `data/models/blockrecord.py` - 块记录数据模型 ## 修改日期 2025-10-17