# Prompt First - 元数据变更自动同步本地数据库实现 ## 输入引用 引用相关的 docs 文档链接: - [REQ-006](../requirements/REQ-006.md) - 元数据变更自动同步本地数据库需求 - [0006-metadata-change-auto-sync](../decisions/adr/0006-metadata-change-auto-sync.md) - 元数据变更自动同步本地数据库架构决策 ## Context Maps 强制列出本次 Prompt 依赖的 Canvas 文件: - [Authentication.canvas](../Authentication.canvas) - 项目架构视觉化展示 - **相关节点**: DataiIntegrationMetadataChangeController - 对象元数据变更控制器 - **相关节点**: DataiIntegrationMetadataChangeService - 对象元数据变更服务 - **相关节点**: DataiIntegrationObject - 对象同步控制实体 - **相关节点**: DataiIntegrationMetadataChange - 对象元数据变更实体 ## 目标 实现元数据变更自动同步的定时任务类,自动扫描未同步的元数据变更记录,根据元数据变更的类型、操作类型、对象配置等信息判断是否应该自动同步,并调用 DataiIntegrationMetadataChangeService 的方法执行同步操作。 ## 输出格式 **MetadataChangeAutoSyncTask.java** - 元数据变更自动同步任务 - 路径:`d:\idea_demo\datai\datai-scenes\datai-scene-salesforce\datai-salesforce-integration\src\main\java\com\datai\integration\task\MetadataChangeAutoSyncTask.java` - 类名:MetadataChangeAutoSyncTask - Bean 名称:metadataChangeAutoSyncTask - 方法:autoSyncMetadataChanges() - 功能:扫描所有未同步的元数据变更记录,判断是否满足自动同步条件,调用相应的同步方法 ## 约束 - 必须参考 ObjectSyncTask 的代码风格 - 必须使用 @Component 注解,指定 bean 名称 - 必须使用 @Slf4j 注解进行日志记录 - 必须使用 @Autowired 注入 DataiIntegrationMetadataChangeService 和 DataiIntegrationObjectService - 必须定义公共方法作为定时任务的执行方法 - 必须在方法内部有 try-catch 异常处理 - 必须记录详细的日志信息 - 必须扫描所有未同步的元数据变更记录(syncStatus = false 或 null) - 必须根据元数据变更的类型、操作类型、对象配置等信息判断是否应该自动同步 - 必须调用 DataiIntegrationMetadataChangeService 的方法,而不是 Controller 的方法 ## Rule Set "请严格参考 @Authentication.canvas 中的状态机转移逻辑,不要自行发挥。" **具体规则**: - 必须使用 Canvas 中定义的类名和方法名 - 必须遵循 Canvas 中定义的调用关系 - 必须参考 Canvas 中的流程图逻辑 - 必须参考 ObjectSyncTask 的代码风格 ## Prompt Content 详细要求 ### 1. MetadataChangeAutoSyncTask.java - 元数据变更自动同步任务 - 参考 ObjectSyncTask 的代码风格 - 使用 @Component("metadataChangeAutoSyncTask") 注解 - 使用 @Slf4j 注解 - 使用 @Autowired 注入 DataiIntegrationMetadataChangeService 和 DataiIntegrationObjectService - 定义 public void autoSyncMetadataChanges() 方法 - 方法功能: 1. 查询所有未同步的元数据变更记录(syncStatus = false 或 null) 2. 遍历每个元数据变更记录,判断是否满足自动同步条件 3. 对于满足条件的元数据变更记录,调用相应的同步方法 4. 记录详细的日志信息 5. 使用 try-catch 处理异常 ### 2. 元数据变更自动同步条件判断 - 通用条件: - syncStatus = false 或 null(未同步) - retryCount < 3(重试次数小于3次) - 对象变更条件(changeType = OBJECT): - 对象配置完整(objectApi、objectLabel 不为空) - 对象启用同步(DataiIntegrationObject.isWork = true) - 对象当前没有正在执行的同步任务(DataiIntegrationObject.syncStatus = false) - 所有操作类型(CREATE、UPDATE、DELETE)都允许自动同步 - 字段变更条件(changeType = FIELD): - 字段配置完整(objectApi、fieldApi、fieldLabel 不为空) - 对象启用同步(DataiIntegrationObject.isWork = true) - 对象当前没有正在执行的同步任务(DataiIntegrationObject.syncStatus = false) - 所有操作类型(CREATE、UPDATE、DELETE)都允许自动同步 ### 3. 同步方法调用 - 调用 DataiIntegrationMetadataChangeService.syncToLocalDatabase(Long id) 方法同步单个元数据变更 - 处理同步结果,更新元数据变更记录的同步状态 - 使用 try-catch 处理异常,单个元数据变更同步失败不影响其他元数据变更的同步 ### 4. 同步失败处理 - 如果同步失败,需要: - 更新元数据变更记录的 syncErrorMessage 字段,记录失败原因 - 增加元数据变更记录的 retryCount 字段 - 更新元数据变更记录的 lastRetryTime 字段 - 记录详细的错误日志 ### 5. 日志格式 - 开始执行时:log.info("开始执行元数据变更自动同步任务") - 查询未同步的元数据变更记录时:log.info("查询到 {} 条未同步的元数据变更记录", count) - 开始同步元数据变更时:log.info("开始同步元数据变更,变更ID: {}, 变更类型: {}, 操作类型: {}, 对象API: {}", id, changeType, operationType, objectApi) - 元数据变更同步成功时:log.info("元数据变更同步成功,变更ID: {}", id) - 元数据变更同步失败时:log.error("元数据变更同步失败,变更ID: {}", id, e) - 元数据变更不满足同步条件时:log.debug("元数据变更不满足同步条件,跳过同步,变更ID: {}, 变更类型: {}, 操作类型: {}", id, changeType, operationType) - 任务完成时:log.info("元数据变更自动同步任务完成,共扫描 {} 条记录,成功同步 {} 条,跳过 {} 条,失败 {} 条", totalCount, syncCount, skipCount, failCount) ### 6. 条件判断方法 - 创建独立的条件判断方法: - isAutoSyncConditionMet(DataiIntegrationMetadataChange metadataChange, DataiIntegrationObject object):判断元数据变更是否满足自动同步条件 - 该方法需要查询对象配置(DataiIntegrationObject),根据对象配置判断是否满足自动同步条件 - 该方法需要详细列出判断条件,确保条件判断逻辑准确 ### 7. 异常处理 - 外层 try-catch 处理任务级别的异常 - 内层 try-catch 处理单个元数据变更级别的异常 - 单个元数据变更同步失败不影响其他元数据变更的同步 - 记录详细的错误日志,便于问题排查 ### 8. 性能考虑 - 可以考虑批量处理,减少数据库查询次数 - 可以考虑异步处理,提高执行效率 - 可以考虑缓存对象配置,减少重复查询 ## 验收标准 - 功能完整性:定时任务类能够正确实现 - 代码正确性:代码能够编译通过,无语法错误 - 代码风格:符合 ObjectSyncTask 的代码风格 - 日志完整性:每个任务都有详细的日志记录 - 异常处理:每个任务都有完善的异常处理 - 条件判断准确性:能够准确判断元数据变更是否满足自动同步条件 ## 风险 - 输出质量风险:生成的代码可能存在逻辑错误 - 技术实现风险:条件判断逻辑可能存在错误,导致元数据变更被错误地同步或遗漏 - 时间成本风险:生成代码可能需要一定时间 - 其他潜在风险:对象配置查询可能存在性能问题 ## 使用记录 | 日期 | 使用场景 | 输入参数 | 输出结果 | 反馈 | 改进措施 | |------|---------|---------|---------|------|----------| | 2026-01-16 | 实现元数据变更自动同步本地数据库 | REQ-006, 0006-metadata-change-auto-sync.md | MetadataChangeAutoSyncTask.java 的 Java 代码 | 待反馈 | 待改进 |