9.7 KiB
复盘文档 - 元数据类型定义
元数据
- 需求编号:003-02
- 复盘时间:2026-02-03
- 创建人:AI Assistant
- 状态:已完成
复盘概述
本次复盘对元数据类型定义功能的开发过程进行了全面回顾。该功能实现了 7 种 Salesforce 元数据类型的部署,包括自定义对象、自定义字段、Apex 类、Apex 触发器、Visualforce 页面、Visualforce 组件、Flow。通过严格执行 SSOT 流程,确保了所有开发活动都有文档依据,提高了代码的可追溯性和可维护性。
目标与实际产出对比
目标
- 实现 7 种 Salesforce 元数据类型的部署功能(CustomObject、CustomField、ApexClass、ApexTrigger、ApexPage、ApexComponent、Flow)
- 采用分层架构设计,复用现有连接管理基础设施
- 实现异步日志记录和状态轮询机制
- 提供完整的 REST API 接口
- 遵循 SSOT 流程,确保所有开发活动都有文档依据
实际产出
- ✅ 成功实现了 7 种元数据类型的部署功能
- ✅ 采用分层架构(Controller → Service → Factory → Metadata API)
- ✅ 复用了 003-01 的 MetadataConnectionFactory
- ✅ 实现了异步日志记录(使用 Spring @Async)
- ✅ 实现了状态轮询机制(最多 60 次,每 5 秒一次)
- ✅ 提供了 8 个 REST API 接口(7 个部署接口 + 1 个日志查询接口)
- ✅ 创建了 datai_metadata_deploy_log 表(18 个字段,7 个索引)
- ✅ 严格按照 SSOT 流程执行,每个阶段都有相应的文档
- ✅ 生成了 12 个 Java 代码文件(5 个 AI 手动生成 + 7 个代码生成器生成)
- ✅ 创建了 7 个 Markdown 文档(需求、设计、决策、SQL、提示词、会话记录、变更日志)
成功经验
1. SSOT 流程的严格执行
从需求定义到变更日志的每个阶段都严格按照项目规则执行,确保了所有开发活动都有文档依据。这种规范化的流程带来了以下好处:
- 可追溯性:每个决策都有记录,便于后续查阅和理解
- 可维护性:完整的文档使得代码维护更加容易
- 团队协作:标准化的流程提高了团队协作效率
2. 复用现有基础设施
通过复用 003-01 的 MetadataConnectionFactory,避免了重复开发,提高了开发效率。同时,复用现有的异常处理机制和日志记录机制,确保了代码的一致性和稳定性。
3. 详细的技术方案设计
在阶段 2(方案设计)中,详细设计了:
- 分层架构(Controller → Service → Factory → Metadata API)
- 部署流程(创建 ZIP → 执行部署 → 异步记录日志 → 轮询部署状态)
- 数据模型(18 个字段,7 个索引)
- 接口设计(8 个 REST API 接口)
这种详细的设计为后续的代码生成提供了清晰的指导,减少了开发过程中的不确定性。
4. 合理的架构决策
在阶段 3(方案决策)中,做出了以下关键决策:
- XML 序列化方案:使用 JAXB,标准化与兼容性好
- ZIP 包构建方案:使用 Java 原生 ZipOutputStream,依赖最小化
- 部署交互模式:同步轮询封装(后端轮询),前端交互简化
- 日志记录策略:异步方式记录日志,性能优化
这些决策都经过了充分的分析和比较,确保了技术方案的合理性和可行性。
5. 代码生成器的有效使用
用户首先使用代码生成器生成了基础代码(Domain、Mapper、Service、Controller、DTO、VO),然后 AI 手动生成了业务逻辑代码(MetadataTypeController、IMetadataTypeService、MetadataTypeServiceImpl、DeployOptionsDto、DeployResultVo)。这种分工方式:
- 提高了开发效率
- 确保了基础代码的规范性
- 让 AI 可以专注于业务逻辑的实现
改进点
1. 单元测试需要补充
虽然提示词中要求生成单元测试,但实际生成的代码文件中缺少单元测试。这可能会影响代码的质量和可靠性。
建议:在下一个迭代中,补充单元测试,确保代码覆盖率达标。
2. XML 转换实现需要完善
当前 MetadataTypeServiceImpl 中的 convertMetadataToXml 方法只是简化实现,实际应该使用 JAXB 进行完整的序列化。
建议:在下一个迭代中,完善 XML 转换实现,使用 JAXB 进行完整的元数据对象到 XML 的转换。
3. 部署选项的转换需要完善
当前 MetadataTypeController 中的 convertToDeployOptions 方法需要根据 DeployOptionsDto 创建 DeployOptions 对象,但实现尚未完成。
建议:在下一个迭代中,完善部署选项的转换逻辑。
4. API 文档可以更加详细
当前 API 文档描述了接口的基本信息,但可以进一步增加:
- 接口的调用场景
- 注意事项
- 更多示例
建议:在下一个迭代中,完善 API 文档,增加更多实用信息。
问题分析
问题 1:代码生成器生成的代码与 AI 手动生成的代码存在重复
现象:代码生成器生成了 DataiMetadataDeployLogController,而 AI 手动生成了 MetadataTypeController,两者都提供了部署日志查询功能。
根因:在设计阶段没有明确区分代码生成器和 AI 手动生成代码的职责边界。
解决方案:
- 代码生成器生成的代码负责基础的 CRUD 操作
- AI 手动生成的代码负责业务逻辑和复杂的部署操作
- 在 MetadataTypeController 中调用 DataiMetadataDeployLogService 进行日志查询,而不是直接操作数据库
问题 2:Controller 层的方法签名设计存在问题
现象:MetadataTypeController 中的 deployCustomObject 方法使用了两个 @RequestBody 注解,这在 Spring MVC 中是不允许的。
根因:设计阶段对接口的请求参数设计不够细致。
解决方案:
- 创建一个统一的请求 DTO,包含元数据对象和部署选项
- 或者使用 @RequestPart 注解处理多部分请求
行动计划
| 序号 | 改进项 | 责任人 | 时间节点 | 优先级 |
|---|---|---|---|---|
| 1 | 补充单元测试 | AI Assistant | 下一个迭代 | 高 |
| 2 | 完善 XML 转换实现 | AI Assistant | 下一个迭代 | 高 |
| 3 | 完善部署选项转换逻辑 | AI Assistant | 下一个迭代 | 中 |
| 4 | 完善 API 文档 | AI Assistant | 下一个迭代 | 中 |
| 5 | 优化 Controller 层方法签名 | AI Assistant | 下一个迭代 | 高 |
| 6 | 明确代码生成器和 AI 手动生成代码的职责边界 | 项目团队 | 立即执行 | 中 |
提取模式
有效的 Prompt 技巧
1. 引用真源
在提示词开头明确引用需求文档和设计文档的链接,可以确保生成的代码符合需求和设计要求。
示例:
引用真源:
- 需求文档:[2026-01-28-003-02-元数据类型定义.md](../requirements/sub/2026-01-28-003-02-元数据类型定义.md)
- 设计文档:[2026-02-03-003-02-元数据类型定义-设计.md](../design/2026-02-03-003-02-元数据类型定义-设计.md)
2. 详细的输出格式要求
在提示词中明确指定需要生成的文件、路径、格式等,可以提高生成代码的准确性和规范性。
示例:
输出格式要求:
1. **Controller 类**:
- 路径:`datai-salesforce-metadata/src/main/java/com/datai/metadata/controller/MetadataTypeController.java`
- 要求:继承 BaseController,使用 @RestController 注解
3. 具体的代码规范要求
在提示词中明确指定代码规范、命名规范、注释规范等,可以提高生成代码的质量和可读性。
示例:
代码规范要求:
1. **包结构**:遵循若依框架的包结构规范
2. **命名规范**:类名使用大驼峰命名法,方法名使用小驼峰命名法
3. **注释规范**:类注释使用 Javadoc 格式,包含 @author 和 @since 标签
避免的坑
1. 不要忽略代码生成器的使用
在代码生成阶段,应该先使用代码生成器生成基础代码,然后再由 AI 手动生成业务逻辑代码。如果忽略代码生成器的使用,会导致重复劳动和代码不一致。
2. 不要设计不合理的接口参数
在设计 API 接口时,要考虑 Spring MVC 的限制(如不能使用两个 @RequestBody 注解)。不合理的设计会导致代码无法正常运行。
3. 不要忽略边界情况的处理
在实现业务逻辑时,要考虑各种边界情况(如部署超时、连接失败等)。忽略边界情况的处理会导致系统不稳定。
模板迭代
经过本次复盘,发现当前的提示词模板在以下方面可以改进:
1. 增加代码生成器使用说明
在提示词模板中增加代码生成器使用说明,明确:
- 哪些代码应该由代码生成器生成
- 哪些代码应该由 AI 手动生成
- 如何协调两者的关系
2. 增加接口设计检查清单
在提示词模板中增加接口设计检查清单,确保:
- 接口参数设计合理
- 接口路径设计规范
- 接口权限控制正确
3. 增加边界情况处理要求
在提示词模板中增加边界情况处理要求,确保生成的代码能够处理:
- 异常情况
- 超时情况
- 并发情况