15 KiB
会话记录:003-03 部署操作
元数据
- 需求编号: 003-03
- 需求名称: 部署操作
- 创建时间: 2026-02-03
- 创建人: AI Assistant
- 当前阶段: 阶段 9:闭环复盘和接口文档
- 状态: 已完成
- 结束时间: 2026-02-06
需求描述
实现一个通用的 ZIP 部署服务,接收字节数组格式的 ZIP 文件,支持同步轮询、状态查询和取消部署功能。该服务需要与 003-02 的元数据类型定义功能解耦,通过通用字节流接口接收 ZIP 数据。
核心功能点
- 接收字节数组格式的 ZIP 文件进行部署
- 同步轮询直到部署完成(成功或失败)
- 通过 ID 查询部署状态
- 取消正在进行的部署
- 复用 003-02 的部署日志表记录操作历史
执行阶段
阶段 1:需求定义
- 状态: 已完成
- 生成文档: 需求文档
- 关键决策: 确定需求为通用部署接口,不依赖具体的 Metadata 子类
阶段 2:方案设计
- 状态: 已完成
- 生成文档: 设计文档
- 关键决策:
- Service 层接收
byte[]格式的 ZIP 数据 - Controller 层处理文件上传(MultipartFile)
- 同步轮询机制(后端轮询,最多 60 次,每 5 秒一次)
- 复用 003-02 的
datai_metadata_deploy_log表
- Service 层接收
阶段 3:方案决策
- 状态: 已完成
- 生成文档: ADR-003-03 通用部署接口设计
- 关键决策:
- 选择通用字节流接口设计
- 拒绝直接依赖 003-02 的元数据构建逻辑
- 复用 003-02 的日志表,新增操作类型
deploy_zip
阶段 4:数据库结构
- 状态: 已完成(跳过)
- 说明: 复用 003-02 的
datai_metadata_deploy_log表,无需新增表
阶段 5:提示词生成
- 状态: 已完成
- 生成文档: 提示词
- 关键决策:
- 定义详细的 VO 类结构
- 定义错误码体系(METADATA_DEPLOY_001 ~ METADATA_DEPLOY_006)
- 定义同步轮询逻辑(最多 60 次,每 5 秒一次)
- 定义异步日志记录策略
阶段 6:执行代码生成
- 状态: 已完成
- 生成代码文件:
AsyncResultVo.javaDeployMessageVo.javaDeployResultVo.java(更新)IMetadataDeployService.javaMetadataDeployServiceImpl.javaMetadataDeployController.javaMetadataDeployServiceTest.java
- 关键决策:
- VO 类命名采用
Vo后缀(与现有代码一致) deploy方法返回String(deployId),pollDeployStatus返回完整结果- 采用两次日志记录策略(提交时和完成时)
- VO 类命名采用
阶段 7:记录当前会话
- 状态: 已完成
- 生成文档: 本文件
- 关键决策: 完整记录会话过程,包括对话记录、生成的文档和代码、关键决策等
阶段 8:变更记录与归档
- 状态: 已完成
- 生成文档:
- 变更日志
- 更新的根目录 CHANGELOG.md
- 关键决策:
- 创建详细的变更日志,记录所有新增功能、文档、代码文件
- 更新根目录 CHANGELOG.md,添加部署操作功能的变更记录
- 更新索引文件,添加变更日志链接
- 更新需求文档,添加相关文档引用
- 变更内容:
- 新增功能:通用 ZIP 部署服务、同步轮询机制、状态查询与取消、异步日志记录、异常处理与错误码
- 新增文档:变更日志
- 新增代码:7 个新文件(3 个 VO + 2 个 Service + 1 个 Controller + 1 个测试)
- 更新文件:DeployResultVo.java、根目录 CHANGELOG.md、索引文件、需求文档
阶段 9:闭环复盘和接口文档
- 状态: 已完成
- 生成文档:
- 关键决策:
- 创建详细的复盘文档,总结成功经验、改进点、问题分析和行动计划
- 创建完整的 API 文档,包含接口列表、请求参数、响应参数、示例等
- 更新索引文件,添加复盘和 API 文档链接
- 更新需求文档,添加复盘和 API 文档引用
- 复盘结论:
- 成功经验: 通用接口设计的成功实践、组件复用的有效策略、详细的提示词设计、异步日志记录的设计、完整的错误码体系
- 改进点: 阶段间的过渡可以更流畅、代码生成前的验证可以更严格、API 文档的自动生成可以考虑、单元测试的覆盖率可以进一步提高、性能测试可以考虑
- 问题分析: VO 类命名规范的决策、Service 返回值设计的决策、日志记录时机的决策
- 行动计划: 7 项具体行动项,包括阶段转换优化、代码生成验证、Swagger 集成、测试覆盖率提升等
- API 文档内容:
- 4 个 REST API 接口(部署 ZIP 包、检查部署状态、同步轮询部署状态、取消部署)
- 详细的请求参数、响应参数、示例
- 6 个业务错误码和 HTTP 状态码说明
- 使用示例和注意事项
对话记录
2026-02-06 会话开始
用户: 详细扫描这个需求相关文档
AI: 好的,我将详细扫描 003-03 部署操作相关的所有文档。让我先读取需求文档、设计文档、ADR、数据库结构、提示词等文件...
AI: 完成扫描!以下是 003-03 部署操作的关键信息总结:
核心需求:
- 实现一个通用的 ZIP 部署服务,接收字节数组格式的 ZIP 文件
- 支持同步轮询、状态查询和取消部署功能
- 与 003-02 的元数据类型定义功能解耦
关键设计决策:
- 通用字节流接口设计(ADR-003-03)
- 同步轮询机制(最多 60 次,每 5 秒一次)
- 复用 003-02 的
datai_metadata_deploy_log表
数据库表复用:
- 复用 003-02 的
datai_metadata_deploy_log表 - 新增操作类型
deploy_zip
需要生成的代码:
- VO 类:AsyncResultVo, DeployMessageVo, DeployResultVo(更新)
- Service 层:IMetadataDeployService, MetadataDeployServiceImpl
- Controller 层:MetadataDeployController
- 单元测试:MetadataDeployServiceTest
用户: 更新一下这个文档
AI: 好的,我将更新提示词文档,添加更详细的 VO 类定义、错误码表、轮询逻辑实现细节、输出格式规范等...
AI: 提示词文档已更新!主要更新内容:
- 添加了完整的 VO 类定义(AsyncResultVO, DeployMessageVO, DeployResultVO)
- 添加了错误码表(METADATA_DEPLOY_001 ~ METADATA_DEPLOY_006)
- 更新了同步轮询实现细节(最多 60 次,每 5 秒一次)
- 添加了完整的输出格式规范
- 添加了实现检查清单
用户: 继续
AI: 好的,现在进入阶段 6:代码生成。首先扫描项目目录,检查代码生成器已生成的基础代码...
AI: 扫描完成!代码生成器未生成 003-03 部署操作的核心代码,需要手动实现所有代码文件。现在开始生成代码...
AI: 代码生成完成!以下是生成的文件:
VO 类:
- AsyncResultVo.java
- DeployMessageVo.java
- DeployResultVo.java(更新)
Service 层:
- IMetadataDeployService.java
- MetadataDeployServiceImpl.java
Controller 层:
- MetadataDeployController.java
单元测试:
- MetadataDeployServiceTest.java
所有代码已按照提示词要求生成,遵循 Google Java Style Guide 和若依框架规范。
用户: 进入下一阶段(阶段 7:会话记录)
AI: 好的,进入阶段 7(会话记录)。现在更新会话记录文件...
生成的文档
需求文档
- 需求文档 - 部署操作需求定义
设计文档
- 设计文档 - 部署操作技术方案设计
决策记录
- ADR-003-03 通用部署接口设计 - 通用部署接口设计决策
提示词
- 提示词 - 部署操作代码生成提示词
会话记录
- 会话记录 - 本文件
生成的代码文件
VO 类
datai-salesforce-metadata/src/main/java/com/datai/metadata/model/vo/AsyncResultVo.javadatai-salesforce-metadata/src/main/java/com/datai/metadata/model/vo/DeployMessageVo.javadatai-salesforce-metadata/src/main/java/com/datai/metadata/model/vo/DeployResultVo.java(更新)
Service 层
datai-salesforce-metadata/src/main/java/com/datai/metadata/service/IMetadataDeployService.javadatai-salesforce-metadata/src/main/java/com/datai/metadata/service/impl/MetadataDeployServiceImpl.java
Controller 层
datai-salesforce-metadata/src/main/java/com/datai/metadata/controller/MetadataDeployController.java
单元测试
datai-salesforce-metadata/src/test/java/com/datai/metadata/service/impl/MetadataDeployServiceTest.java
复用的组件
datai-salesforce-metadata/src/main/java/com/datai/metadata/mapper/DataiMetadataDeployLogMapper.java(003-02)datai-salesforce-metadata/src/main/java/com/datai/metadata/domain/DataiMetadataDeployLog.java(003-02)datai-salesforce-metadata/src/main/java/com/datai/metadata/service/MetadataConnectionFactory.java(003-01)
代码生成器扫描结果
扫描说明
- 扫描时间: 2026-02-06
- 扫描范围:
datai-salesforce-metadata模块 - 涉及表:
datai_metadata_deploy_log(复用 003-02)
扫描结果
| 文件类型 | 文件名 | 状态 | 说明 |
|---|---|---|---|
| Controller | MetadataDeployController.java |
❌ 未生成 | 手动实现 |
| Service 接口 | IMetadataDeployService.java |
❌ 未生成 | 手动实现 |
| Service 实现 | MetadataDeployServiceImpl.java |
❌ 未生成 | 手动实现 |
| VO - AsyncResult | AsyncResultVO.java |
❌ 未生成 | 手动实现 |
| VO - DeployResult | DeployResultVo.java |
✅ 已生成 | 代码生成器已生成,已更新 |
| VO - DeployMessage | DeployMessageVO.java |
❌ 未生成 | 手动实现 |
| Mapper | DataiMetadataDeployLogMapper.java |
✅ 已生成 | 代码生成器已生成(003-02) |
| Domain | DataiMetadataDeployLog.java |
✅ 已生成 | 代码生成器已生成(003-02) |
结论
代码生成器未生成 003-03 部署操作的核心代码,需要手动实现所有代码文件。
代码统计
| 类别 | 文件数 | 代码行数(估算) |
|---|---|---|
| VO 类 | 3 | ~150 |
| Service 接口 | 1 | ~50 |
| Service 实现 | 1 | ~350 |
| Controller | 1 | ~250 |
| 单元测试 | 1 | ~300 |
| 总计 | 7 | ~1100 |
技术实现要点
1. 通用字节流接口
- Service 层接收
byte[]格式的 ZIP 数据 - 与元数据构建逻辑完全解耦
- 支持多种来源的 ZIP 包(系统生成、用户上传)
2. 同步轮询机制
- 后端轮询,最多 60 次(5 分钟)
- 每 5 秒检查一次状态
- 超时后抛出异常
3. 异步日志记录
- 使用
@Async异步记录部署历史 - 避免阻塞主流程
- 支持并发部署
4. 异常处理
- 完整的错误码体系(METADATA_DEPLOY_001 ~ METADATA_DEPLOY_006)
- 捕获
ConnectionException并转换为SalesforceOperationException - 详细的错误日志记录
5. 日志复用
- 完全复用 003-02 的
datai_metadata_deploy_log表 - 新增操作类型
deploy_zip - 异步更新日志状态
REST API 接口
| 方法 | 路径 | 权限 | 说明 |
|---|---|---|---|
| POST | /salesforce/metadata/deploy |
salesforce:metadata:deploy |
部署 ZIP 包 |
| GET | /salesforce/metadata/deploy/status/{deployId} |
salesforce:metadata:deploy:query |
检查部署状态 |
| GET | /salesforce/metadata/deploy/poll/{deployId} |
salesforce:metadata:deploy:query |
同步轮询部署状态 |
| POST | /salesforce/metadata/deploy/cancel/{deployId} |
salesforce:metadata:deploy:cancel |
取消部署 |
依赖关系
上游依赖
- 003-01 连接管理: 复用
MetadataConnectionFactory - 003-02 元数据类型定义: 复用
datai_metadata_deploy_log表和DataiMetadataDeployLog实体类
下游依赖
- 无
风险与缓解措施
| 风险 | 缓解措施 |
|---|---|
| 大文件上传导致 OOM | Controller 配置 50MB 文件大小限制 |
| 轮询超时导致线程卡死 | 设置 60 次轮询上限(5 分钟) |
| 连接断开 | 每次轮询重新获取连接 |
| 并发部署 | 使用 Spring @Async 线程池 |
验收标准检查
功能完整性
- 能成功接收并部署 ZIP 文件
- 能轮询直到部署完成(成功或失败)
- 能通过 ID 查询部署状态
- 能取消正在进行的部署
代码质量
- Service 层不依赖具体的 Metadata 子类
- 异常处理完善,无未捕获的受检异常
- 单元测试覆盖率 > 80%
AI 的质疑与决策
质疑 1:VO 类命名规范
问题: 提示词中要求生成 AsyncResultVO,但项目中已有的 VO 类使用 Vo 后缀(如 DeployResultVo)。
决策: 为了保持与现有代码的一致性,采用 Vo 后缀(AsyncResultVo, DeployMessageVo),并更新已有的 DeployResultVo。
质疑 2:Service 返回值设计
问题: 提示词中 deploy 方法返回 String(deployId),而 003-02 的类似方法返回 DeployResultVo。
决策: 保持 deploy 方法返回 String,因为 003-03 的设计是通用部署接口,调用方可能需要先获取 deployId 再进行轮询。同时提供 pollDeployStatus 方法返回完整结果。
质疑 3:日志记录时机
问题: 应该在部署提交时立即记录日志,还是等待部署完成后再记录?
决策: 采用两次记录策略:
- 部署提交时立即记录
Queued状态(异步) - 部署完成时更新状态(异步) 这样可以确保即使部署过程中断,也能在数据库中留下记录。
回退记录
无
下一步行动
- 代码审查: 审查生成的代码是否符合项目规范
- 单元测试: 运行单元测试验证代码正确性
- 集成测试: 与 003-02 的元数据类型定义功能进行集成测试
- 进入阶段 10: 代码提交
备注
- 所有代码已按照提示词要求生成
- 代码遵循 Google Java Style Guide
- 代码符合若依框架规范
- 代码包含完整的单元测试
- 会话记录已更新,包含完整的对话记录、生成的文档和代码、关键决策等