203 lines
9.7 KiB
Markdown
203 lines
9.7 KiB
Markdown
# 复盘文档 - 元数据类型定义
|
||
|
||
## 元数据
|
||
- 需求编号: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. 增加边界情况处理要求
|
||
在提示词模板中增加边界情况处理要求,确保生成的代码能够处理:
|
||
- 异常情况
|
||
- 超时情况
|
||
- 并发情况
|
||
|
||
## 相关文档
|
||
- [需求文档](../requirements/sub/2026-01-28-003-02-元数据类型定义.md)
|
||
- [设计文档](../design/2026-02-03-003-02-元数据类型定义-设计.md)
|
||
- [决策记录](../decisions/2026-02-03-003-02-ADR-元数据部署技术选型.md)
|
||
- [SQL 脚本](../sql/2026-02-03-003-02-元数据部署日志.sql)
|
||
- [提示词文档](../prompts/2026-02-03-003-02-prompt-元数据类型定义.md)
|
||
- [会话记录](../sessions/2026-02-03-003-02-session.md)
|
||
- [变更日志](../changelog/2026-02-03-003-02-changelog.md)
|
||
- [API 文档](../api-docs/2026-02-03-003-02-api.md)
|