datai/datai-scenes/datai-scene-salesforce/docs/retros/2026-02-06-003-04-retro.md

314 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 复盘文档003-04 异步操作
## 元数据
- **需求编号**: 003-04
- **需求名称**: 异步操作
- **创建时间**: 2026-02-06
- **创建人**: AI Assistant
- **状态**: 已完成
---
## 复盘概述
本次复盘对 003-04 异步操作功能的开发过程进行了全面回顾。该功能是 Metadata API 管理模块的重要组成部分为部署操作003-03和其他异步操作提供状态管理能力。复盘从需求定义到代码提交的每个阶段都进行了分析总结了成功经验、改进点、问题分析和行动计划旨在提高后续开发过程的效率和质量。
---
## 目标与实际产出对比
### 目标
- 实现 Metadata API 异步操作管理模块
- 提供异步操作状态查询、服务端同步轮询、异步操作取消、操作历史记录功能
- 遵循 SSOT 流程,确保所有开发活动都有文档依据
- 生成符合项目规范的代码
- 复用现有表结构,避免重复创建
### 实际产出
- ✅ 成功实现了异步操作管理功能,包括状态查询、服务端同步轮询、取消操作、历史记录
- ✅ 严格按照 SSOT 流程执行,每个阶段都有相应的文档
- ✅ 生成的代码符合项目规范,遵循若依框架和项目既有模式
- ✅ 复用了现有的 `datai_metadata_async` 表,无需新建表
- ✅ 生成了 5 个新代码文件,修改了 1 个文件
- ✅ 提供了 5 个 REST API 接口,满足前端调用需求
---
## 成功经验
### 1. 复用现有代码和表结构的策略成功
**经验描述**: 在开发前充分调研了现有代码,发现已经存在 `datai_metadata_async` 表和基础的 CRUD 操作,决定复用现有表结构并扩展业务方法。
**成功原因**:
- 在阶段 1需求定义中明确了复用现有表的目标
- 在阶段 2方案设计中确认了复用策略的可行性
- 避免了重复创建表和基础代码,减少了开发工作量
- 保持了数据模型的一致性
**可推广性**: 高。在后续开发中,应继续遵循"先调研、后开发"的原则,充分复用现有资源。
### 2. 清晰的架构决策ADR指导实现
**经验描述**: 在阶段 3 创建了详细的 ADR 文档,明确了服务端同步轮询策略,为后续代码实现提供了清晰的指导。
**成功原因**:
- ADR 文档详细对比了三种轮询策略的优缺点
- 明确记录了决策理由:简单可靠、实现成本低、简化上层业务代码
- 为代码实现提供了明确的参数指导(轮询间隔 5 秒、超时 5 分钟)
**可推广性**: 高。对于技术方案选择,应继续编写 ADR 文档,记录决策过程和理由。
### 3. 分层架构设计确保代码质量
**经验描述**: 严格按照 Controller → Service → Factory → Metadata API 的分层架构设计代码。
**成功原因**:
- Controller 层专注于请求处理和参数校验
- Service 层专注于业务逻辑和异常处理
- Factory 层专注于连接管理
- 各层职责清晰,便于维护和测试
**可推广性**: 高。继续遵循分层架构设计原则,确保代码的可维护性。
### 4. 完善的异常处理机制
**经验描述**: 实现了详细的异常转换规则,将 Salesforce 异常转换为业务异常。
**成功原因**:
- 针对不同的错误类型InvalidSessionId、Unauthorized、InvalidAsyncId 等)提供了特定的异常处理
- 异常信息清晰,便于前端展示和问题定位
- 异常处理不影响主流程,数据库记录失败不会中断业务
**可推广性**: 高。在后续开发中,继续完善异常处理机制。
### 5. 详细的日志记录
**经验描述**: 在关键操作点(状态查询、轮询、取消)都添加了详细的日志记录。
**成功原因**:
- 使用 SLF4J 日志框架,支持不同级别的日志
- 日志信息包含关键参数asyncId、state、轮询次数等
- 便于问题排查和性能监控
**可推广性**: 高。继续遵循"关键操作必记录日志"的原则。
---
## 改进点
### 1. Mapper XML 的 SQL 实现可以同步完成
**改进描述**: 在代码生成阶段Mapper 接口添加了新方法,但对应的 XML SQL 实现未同步完成。
**具体措施**:
- 在生成 Java 代码的同时,同步生成对应的 XML SQL
- 建立 Mapper 接口方法与 XML 的对应检查清单
**优先级**: 中
**责任人**: AI Assistant
**时间节点**: 立即执行
### 2. 单元测试可以在代码生成阶段同步完成
**改进描述**: 代码生成阶段未同步生成单元测试,需要后续补充。
**具体措施**:
- 在提示词中明确要求生成单元测试
- 使用 Mockito 模拟 Salesforce API 调用
- 覆盖正常流程和异常流程
**优先级**: 中
**责任人**: AI Assistant
**时间节点**: 下一个迭代
### 3. API 文档的示例可以更丰富
**改进描述**: API 文档中的请求/响应示例可以包含更多场景(成功、失败、超时等)。
**具体措施**:
- 在 API 文档中增加多种场景的示例
- 包含错误响应的示例
- 提供 curl 命令示例
**优先级**: 低
**责任人**: AI Assistant
**时间节点**: 下一个迭代
### 4. 可以考虑添加性能监控
**改进描述**: 异步操作轮询可能耗时较长(最多 5 分钟),可以考虑添加性能监控。
**具体措施**:
- 记录轮询次数和耗时
- 添加性能指标收集(如 Micrometer
- 提供性能监控接口
**优先级**: 低
**责任人**: 项目团队
**时间节点**: 下一个迭代
---
## 问题分析
### 问题 1: 代码生成时未同步检查依赖项
**问题描述**: 在生成 `MetadataAsyncServiceImpl` 时,发现 `DataiMetadataAsyncMapper` 缺少需要的方法,需要后续添加。
**根因分析**:
- 代码生成前未充分检查 Mapper 接口的完整性
- 提示词中未明确要求检查依赖项
**影响**:
- 需要额外修改 Mapper 接口
- 增加了开发步骤
**解决方案**:
- 在代码生成前,先检查所有依赖项的完整性
- 在提示词中增加"检查依赖项"的要求
- 建立依赖项检查清单
**预防措施**:
- 在阶段 6 开始前,先检查所有依赖项
- 更新提示词模板,增加依赖项检查要求
### 问题 2: 权限配置未在代码生成阶段完成
**问题描述**: 代码中使用了新的权限点(`salesforce:metadata:async:query`、`salesforce:metadata:async:cancel`),但未在代码生成阶段同步配置权限。
**根因分析**:
- 权限配置分散在多个文件中,容易遗漏
- 提示词中未明确要求配置权限
**影响**:
- 需要后续手动配置权限
- 可能导致权限不生效
**解决方案**:
- 在代码生成阶段,同步生成权限配置
- 在提示词中增加权限配置要求
- 建立权限配置检查清单
**预防措施**:
- 更新提示词模板,增加权限配置要求
- 在代码生成后检查权限配置
---
## 行动计划
| 序号 | 行动项 | 责任人 | 时间节点 | 优先级 |
|------|--------|--------|----------|--------|
| 1 | 补充 Mapper XML 的 SQL 实现 | AI Assistant | 立即执行 | 高 |
| 2 | 编写单元测试 | AI Assistant | 下一个迭代 | 中 |
| 3 | 配置权限 | AI Assistant | 立即执行 | 高 |
| 4 | 更新提示词模板,增加依赖项检查要求 | AI Assistant | 立即执行 | 中 |
| 5 | 探索性能监控方案 | 项目团队 | 下一个迭代 | 低 |
---
## 提取模式
### 有效的 Prompt 技巧
#### 1. 明确的复用策略
**技巧描述**: 在提示词开头明确说明复用现有资源的策略。
**示例**:
```
## 复用策略
- 复用现有的 `datai_metadata_async` 表
- 复用 `MetadataConnectionFactory` 进行连接管理
- 复用现有的异常类SalesforceAuthException、SalesforceOperationException
```
**效果**: 确保生成的代码与现有系统保持一致,避免重复创建。
#### 2. 详细的接口定义
**技巧描述**: 在提示词中提供详细的接口定义,包括方法签名、参数、返回值。
**示例**:
```
## Service 接口定义
### getAsyncResult(String asyncId)
- 功能:获取异步操作结果
- 参数asyncId - 异步操作 ID
- 返回AsyncResultVo
- 异常SalesforceAuthException、SalesforceOperationException
```
**效果**: 生成的代码更符合设计要求,减少修改次数。
#### 3. 异常处理规范
**技巧描述**: 在提示词中明确异常转换规则和错误处理要求。
**示例**:
```
## 异常处理
- InvalidSessionId / Session expired → SalesforceAuthException
- Unauthorized → SalesforceAuthException
- InvalidAsyncId → SalesforceOperationException
- 其他 → SalesforceOperationException
```
**效果**: 生成的代码具有统一的异常处理机制。
### 避免的坑
#### 1. 不要忽略依赖项检查
**坑描述**: 在代码生成时未检查依赖项,导致生成的代码无法编译。
**避免方法**:
- 在代码生成前,先检查所有依赖项
- 建立依赖项检查清单
- 在提示词中明确要求检查依赖项
#### 2. 不要遗漏权限配置
**坑描述**: 代码中使用了新的权限点,但未同步配置权限。
**避免方法**:
- 在代码生成阶段,同步生成权限配置
- 建立权限配置检查清单
- 在提示词中增加权限配置要求
#### 3. 不要忽略数据库持久化
**坑描述**: 业务逻辑中缺少数据库持久化,导致操作记录丢失。
**避免方法**:
- 在提示词中明确要求数据库持久化
- 在代码生成后检查持久化逻辑
- 建立持久化检查清单
---
## 模板迭代
经过本次复盘,发现当前的提示词模板可以在以下方面改进:
### 1. 增加依赖项检查要求
在提示词模板中增加"依赖项检查"章节,要求:
- 列出所有依赖的类和方法
- 检查依赖项是否存在
- 如不存在,先创建依赖项
### 2. 增加权限配置要求
在提示词模板中增加"权限配置"章节,要求:
- 列出所有使用的权限点
- 生成权限配置代码
- 提供权限配置检查清单
### 3. 增加数据库持久化要求
在提示词模板中增加"数据库持久化"章节,要求:
- 明确持久化策略(插入/更新)
- 处理持久化异常(不影响主流程)
- 记录创建人和更新人
### 4. 增加单元测试要求
在提示词模板中增加"单元测试"章节,要求:
- 为每个 Service 方法生成单元测试
- 使用 Mockito 模拟外部依赖
- 覆盖正常流程和异常流程
---
## 相关文档
- [需求文档](../requirements/sub/2026-01-28-003-04-异步操作.md)
- [设计文档](../design/2026-02-03-003-04-异步操作-设计.md)
- [决策记录](../decisions/2026-02-03-003-04-ADR-异步操作轮询策略.md)
- [提示词文档](../prompts/2026-02-03-003-04-prompt-异步操作.md)
- [会话记录](../sessions/2026-02-06-003-04-session.md)
- [变更日志](../changelog/2026-02-06-003-04-changelog.md)
- [API 文档](../api-docs/2026-02-06-003-04-api.md)
- [父需求 - MetadataAPI源org实现](../requirements/2026-01-28-003-MetadataAPI源org实现.md)