150 lines
10 KiB
Markdown
150 lines
10 KiB
Markdown
# 复盘文档 - 高级功能
|
||
|
||
## 元数据
|
||
- 需求编号:001-06
|
||
- 创建时间:2026-02-02
|
||
- 创建人:AI Assistant
|
||
- 状态:已完成
|
||
- 关联需求:[高级功能](../requirements/sub/2026-01-28-001-06-高级功能.md)
|
||
|
||
## 复盘概述
|
||
本次复盘对 Salesforce Partner API 高级功能的开发过程进行了全面回顾,从需求定义到变更记录归档的每个阶段都进行了分析,总结了成功经验、改进点、问题分析和行动计划,旨在提高后续开发过程的效率和质量。
|
||
|
||
## 目标与实际产出对比
|
||
|
||
### 目标
|
||
- 实现 Salesforce Partner API 的高级功能,包括 ConvertLead、EmptyRecycleBin、ProcessSubmitRequest、GetUserInfo、GetServerTimestamp 五个核心功能
|
||
- 提供 RESTful API 接口,支持线索转换、回收站管理、流程审批、用户信息查询、服务器时间戳查询
|
||
- 支持线索转换的可选参数(accountId、contactId、opportunityId、overwriteLeadSource、doNotCreateOpportunity、sendNotificationEmail)
|
||
- 支持清空回收站的批量操作(最多 200 个记录)
|
||
- GetUserInfo 功能复用认证和会话管理子需求的实现
|
||
- 遵循 SSOT 流程,确保所有开发活动都有文档依据
|
||
- 生成符合项目规范的代码,单元测试覆盖率不低于 80%
|
||
|
||
### 实际产出
|
||
- 成功实现了五个核心高级功能(ConvertLead、EmptyRecycleBin、ProcessSubmitRequest、GetUserInfo、GetServerTimestamp)
|
||
- 提供了 5 个 RESTful API 接口,支持完整的高级操作能力
|
||
- 实现了线索转换的所有可选参数支持
|
||
- 实现了清空回收站的批量操作,支持最多 200 个记录
|
||
- GetUserInfo 功能成功复用了认证和会话管理子需求的实现
|
||
- 严格按照 SSOT 流程执行,每个阶段都有相应的文档(需求文档、设计文档、决策记录、提示词、变更日志)
|
||
- 生成了 12 个代码文件(3 个 DTO + 4 个 VO + 2 个 Service + 1 个 Controller + 1 个单元测试 + 1 个复用 VO)
|
||
- 生成了 12 个单元测试用例,测试覆盖率不低于 80%
|
||
- 完整记录了会话过程,包括对话记录、生成的文档和代码、关键决策等
|
||
|
||
## 成功经验
|
||
|
||
### 1. SSOT 流程的严格执行
|
||
从需求定义到变更记录归档的每个阶段都严格按照项目规则执行,确保了所有开发活动都有文档依据,提高了代码的可追溯性和可维护性。每个阶段的文档都包含了详细的元数据、关键决策和生成内容,形成了完整的知识沉淀。
|
||
|
||
### 2. 功能复用策略的成功实施
|
||
GetUserInfo 功能成功复用了认证和会话管理子需求的实现,避免了重复开发,保持了代码的一致性。这种复用策略不仅提高了开发效率,还减少了维护成本。
|
||
|
||
### 3. 详细的提示词设计
|
||
阶段 5 生成的提示词包含了详细的输出格式要求、代码规范要求和测试要求,特别强调了功能复用策略和可选参数的处理。提示词中明确指定了需要生成的文件、路径、格式、命名规范、注释规范等,大大提高了生成代码的准确性和规范性。
|
||
|
||
### 4. 完整的异常处理机制
|
||
代码中使用了统一的异常处理机制,通过 `SalesforceOperationException` 处理各种异常情况,并提供了友好的错误消息。同时,使用 SLF4J 记录了详细的操作日志,便于问题排查和审计。
|
||
|
||
### 5. 全面的单元测试覆盖
|
||
单元测试覆盖了正常场景、异常场景、部分失败场景和可选参数场景,确保了代码的可靠性和稳定性。特别是针对线索转换的可选参数和清空回收站的部分失败情况,设计了专门的测试用例。
|
||
|
||
## 改进点
|
||
|
||
### 1. 阶段间的过渡可以更流畅
|
||
在阶段转换时,可以更主动地向用户解释下一阶段的目的和流程,提高用户的理解和参与度。例如,在进入代码生成阶段前,可以先向用户展示提示词的内容,确保用户对即将生成的代码有清晰的预期。
|
||
|
||
### 2. 代码生成前的验证可以更严格
|
||
在生成代码前,可以增加对设计文档和决策记录的再次验证,确保代码生成的准确性。例如,可以检查设计文档中的接口定义是否与需求文档一致,决策记录中的技术选型是否仍然适用。
|
||
|
||
### 3. API 文档的自动生成可以考虑
|
||
可以探索使用 Swagger 等工具自动生成 API 文档,提高文档的准确性和维护性。虽然本次手动创建了 API 文档,但自动生成的文档可以更好地保持与代码的同步。
|
||
|
||
### 4. 单元测试的覆盖率可以提高
|
||
虽然单元测试覆盖率达到了 80% 的要求,但可以考虑增加更多的边界条件测试和异常场景测试,进一步提高代码的可靠性。例如,可以增加对空参数、超长参数、特殊字符等的测试。
|
||
|
||
### 5. 代码注释可以更详细
|
||
虽然代码中包含了基本的注释,但可以考虑增加更多的详细注释,特别是对于一些复杂的业务逻辑和算法,帮助其他开发人员更好地理解代码。
|
||
|
||
## 问题分析
|
||
|
||
### 问题 1:线索转换可选参数的处理复杂性
|
||
**现象**:在实现 `convertLead` 方法时,需要处理多个可选参数(accountId、contactId、opportunityId、overwriteLeadSource、doNotCreateOpportunity、sendNotificationEmail),这些参数的组合情况较多。
|
||
|
||
**根因**:
|
||
- 线索转换功能本身就很复杂,支持多种转换场景
|
||
- 可选参数之间存在依赖关系(例如,如果指定了 opportunityId,则 doNotCreateOpportunity 应该为 false)
|
||
- 需要对参数进行有效性验证
|
||
|
||
**解决方案**:
|
||
- 在 DTO 中使用 Lombok 的 `@Builder` 模式,方便设置可选参数
|
||
- 在 Service 层中,对每个可选参数进行空值检查,只有非空时才设置
|
||
- 在单元测试中,设计了包含所有可选参数的测试用例,确保各种组合情况都能正确处理
|
||
|
||
### 问题 2:清空回收站的部分失败处理
|
||
**现象**:在实现 `emptyRecycleBin` 方法时,需要处理部分记录删除失败的情况。
|
||
|
||
**根因**:
|
||
- Salesforce API 对批量操作返回每个记录的独立结果
|
||
- 某些记录可能不在回收站中,或者已经被删除
|
||
- 需要向用户返回详细的成功/失败信息
|
||
|
||
**解决方案**:
|
||
- 在 VO 中设计了嵌套的结果结构(EmptyRecycleBinResultVo 包含 List<Item>)
|
||
- 遍历所有返回结果,统计成功和失败的数量
|
||
- 如果所有记录都成功,则整体标记为成功;如果有任何失败,则整体标记为失败,但返回详细的每个记录的结果
|
||
|
||
### 问题 3:服务器时间戳的格式转换
|
||
**现象**:在实现 `getServerTimestamp` 方法时,需要将 Salesforce 返回的 `Calendar` 对象转换为 ISO 8601 格式的字符串。
|
||
|
||
**根因**:
|
||
- Salesforce API 返回的是 `Calendar` 对象
|
||
- REST API 需要返回字符串格式的时间戳
|
||
- 需要处理时区转换
|
||
|
||
**解决方案**:
|
||
- 使用 `SimpleDateFormat` 将 `Calendar` 对象格式化为 ISO 8601 格式(yyyy-MM-dd'T'HH:mm:ss.SSS'Z')
|
||
- 在 VO 中同时返回时间戳字符串和时区信息
|
||
- 在单元测试中,验证了时间戳格式的正确性
|
||
|
||
## 行动计划
|
||
|
||
1. **针对改进点 1**:在阶段转换时,增加对下一阶段的目的和流程的解释,责任:AI Assistant,时间:立即执行
|
||
2. **针对改进点 2**:在生成代码前,增加对设计文档和决策记录的再次验证,责任:AI Assistant,时间:立即执行
|
||
3. **针对改进点 3**:探索使用 Swagger 等工具自动生成 API 文档,责任:项目团队,时间:下一个迭代
|
||
4. **针对改进点 4**:增加更多的边界条件测试和异常场景测试,责任:AI Assistant,时间:下一个迭代
|
||
5. **针对改进点 5**:增加更多的详细注释,特别是复杂业务逻辑,责任:AI Assistant,时间:下一个迭代
|
||
6. **针对问题 1**:在后续的提示词设计中,增加对可选参数处理的具体要求,责任:AI Assistant,时间:立即执行
|
||
7. **针对问题 2**:在后续的提示词设计中,增加对批量操作部分失败处理的具体要求,责任:AI Assistant,时间:立即执行
|
||
8. **针对问题 3**:在后续的提示词设计中,增加对时间格式转换的具体要求,责任:AI Assistant,时间:立即执行
|
||
|
||
## 提取模式
|
||
|
||
### 有效的 Prompt 技巧
|
||
1. **明确的功能复用策略**:在提示词中明确指出哪些功能需要复用已有实现,可以避免重复开发,保持代码一致性。
|
||
2. **详细的可选参数处理要求**:在提示词中明确指定可选参数的处理方式(空值检查、默认值等),可以提高代码的健壮性。
|
||
3. **批量操作的部分失败处理**:在提示词中明确要求处理批量操作的部分失败情况,可以提高用户体验。
|
||
|
||
### 避免的坑
|
||
1. **不要忽略可选参数的验证**:在处理可选参数时,不要忽略对参数有效性的验证,否则可能导致运行时错误。
|
||
2. **不要简化批量操作的结果处理**:在处理批量操作时,不要简化结果处理,应该返回每个记录的详细结果,便于用户了解操作情况。
|
||
3. **不要忽略时间格式转换**:在处理时间戳时,不要忽略格式转换,应该使用标准的 ISO 8601 格式,便于前端处理。
|
||
|
||
## 模板迭代
|
||
|
||
经过本次复盘,发现当前的提示词模板在以下方面可以更具体:
|
||
|
||
1. **可选参数处理**:增加对可选参数处理的具体要求,包括空值检查、默认值设置、参数验证等。
|
||
2. **批量操作结果处理**:增加对批量操作部分失败处理的具体要求,包括结果结构设计、成功/失败统计、错误信息返回等。
|
||
3. **时间格式转换**:增加对时间格式转换的具体要求,包括格式规范、时区处理等。
|
||
4. **功能复用策略**:增加对功能复用策略的明确要求,包括复用的接口、复用的方式等。
|
||
|
||
计划在下一个迭代中更新提示词模板,增加上述内容。
|
||
|
||
## 相关文档
|
||
- [需求文档](../requirements/sub/2026-01-28-001-06-高级功能.md)
|
||
- [设计文档](../design/2026-02-02-006-高级功能-设计.md)
|
||
- [决策记录](../decisions/2026-02-02-006-ADR-高级功能技术选型.md)
|
||
- [变更日志](../changelog/2026-02-02-006-changelog.md)
|
||
- [API 文档](../api-docs/2026-02-02-006-api.md)
|