14 KiB
会话记录
元数据
- 需求编号:014-1
- 开始时间:2026-01-26
- 结束时间:2026-01-27
- 创建人:SSOT 架构师
- 状态:已完成
当前阶段
阶段 8:变更记录与归档 - 已完成
需求描述
作为 Tooling API 模块的基础,本需求负责建立与 Salesforce Tooling API 的连接,并封装针对 ApexClass 和 ApexTrigger 的基础 CRUD 操作。
执行阶段
阶段 1:需求定义 - 已完成
完成时间
2026-01-26
生成文档
关键决策
- 确定需求优先级为高
- 确定需求复杂度为中等
- 确定需求类型为新功能开发
阶段 2:方案设计 - 已完成
完成时间
2026-01-27
生成文档
关键决策
- 架构设计:采用分层架构(Controller → Service → Manager → Factory → Core)
- 技术选型:Spring Boot 3.x + force-wsc 61.0.0
- 连接工厂设计:继承
AbstractConnectionFactory<ToolingConnection> - Manager 层设计:封装 Apex 类和触发器的 CRUD 操作
- 接口设计:RESTful API + 权限控制 + 参数验证
- 数据模型设计:Domain、DTO、VO 三层模型
- 性能优化:连接缓存、查询优化、批量操作
- 安全设计:权限控制、参数验证、SQL 注入防护
阶段 3:方案决策 - 已完成
完成时间
2026-01-27
生成文档
关键决策
- 选择方案 1:直接使用现有的 Tooling API 客户端代码
- 决策理由:
- 代码完整性:
docs/reference-code/sforce/soap/tooling目录下已包含完整的 Tooling API 客户端代码 - 版本一致性:现有代码与项目中使用的 force-wsc 61.0.0 版本一致
- 开发效率:直接使用现有代码可以节省重新生成的时间
- 维护成本:使用现有代码可以避免版本不一致带来的潜在问题
- 架构一致性:与项目中已有的 Metadata API、Partner API 等客户端代码保持一致的处理方式
- 代码完整性:
- 拒绝方案 2:使用 WSC 工具重新生成(需要额外的工具配置,可能生成与现有代码不一致的版本)
- 拒绝方案 3:引入完整的 Tooling API Jar 包(Jar 包体积大,可能与现有 force-wsc 版本冲突)
阶段 4:数据库结构 - 已完成(跳过)
完成时间
2026-01-27
说明
本需求不涉及数据库表,所有数据存储在 Salesforce 端。
结论
跳过 SQL 脚本生成,直接进入阶段 5(提示词生成)。
阶段 5:提示词生成 - 已完成
完成时间
2026-01-27
生成文档
关键决策
- 核心任务定义:明确 7 个核心任务(Factory、Manager、Controller、Service、Model、Exception)
- 输出格式要求:必须包含 20 个文件(17 个核心文件 + 3 个单元测试)
- 代码规范要求:明确命名规范、注释规范、代码格式、异常处理、日志规范、权限控制、参数验证
- 测试要求:单元测试覆盖率不低于 80%,包含正常场景和异常场景
- 注意事项:10 个注意事项,确保代码质量和架构一致性
阶段 6:代码生成 - 已完成
完成时间
2026-01-27
生成的代码文件(共 20 个)
Exception 层(3 个):
ToolingConnectionException.java- Tooling 连接异常ApexClassException.java- Apex 类操作异常ApexTriggerException.java- Apex 触发器操作异常
Model 层 - Domain(2 个):
ApexClass.java- Apex 类领域对象ApexTrigger.java- Apex 触发器领域对象
Model 层 - DTO(6 个):
ApexClassDto.java- Apex 类数据传输对象ApexTriggerDto.java- Apex 触发器数据传输对象ApexClassCreateRequest.java- Apex 类创建请求ApexClassUpdateRequest.java- Apex 类更新请求ApexTriggerCreateRequest.java- Apex 触发器创建请求ApexTriggerUpdateRequest.java- Apex 触发器更新请求
Model 层 - VO(2 个):
ApexClassVo.java- Apex 类视图对象ApexTriggerVo.java- Apex 触发器视图对象
Factory 层(1 个):
ToolingConnectionFactory.java- Tooling 连接工厂
Manager 层(2 个):
ApexClassManager.java- Apex 类管理器ApexTriggerManager.java- Apex 触发器管理器
Service 层(4 个):
IApexClassService.java- Apex 类服务接口ApexClassServiceImpl.java- Apex 类服务实现IApexTriggerService.java- Apex 触发器服务接口ApexTriggerServiceImpl.java- Apex 触发器服务实现
Controller 层(2 个):
ApexClassController.java- Apex 类控制器ApexTriggerController.java- Apex 触发器控制器
单元测试(3 个):
ToolingConnectionFactoryTest.java- Tooling 连接工厂测试ApexClassManagerTest.java- Apex 类管理器测试ApexTriggerManagerTest.java- Apex 触发器管理器测试
代码生成器使用情况
- ❌ 不涉及数据库表新增,未使用代码生成器
- ✅ 所有代码均为手动实现
AI 质疑与解决方案
质疑 1:Service 实现类中直接 new Manager 和 Factory
问题描述:在 ApexClassServiceImpl 和 ApexTriggerServiceImpl 的 listApexClasses 和 listApexTriggers 方法中,直接 new 了 Manager 和 Factory 实例,没有使用依赖注入。
解决方案:
- 在 Service 实现类中添加
@Autowired private ToolingConnectionFactory connectionFactory; - 移除
ApexClassManager manager = new ApexClassManager();和ToolingConnectionFactory factory = new ToolingConnectionFactory(); - 直接使用注入的
connectionFactory.getConnection(orgType)
最终实现:
@Autowired
private ToolingConnectionFactory connectionFactory;
com.sforce.soap.tooling.ToolingConnection connection = connectionFactory.getConnection(orgType);
代码规范符合性
- ✅ 类命名:首字母大写,驼峰命名
- ✅ 接口命名:以
I开头 - ✅ 实现类命名:接口名 +
Impl - ✅ 方法命名:首字母小写,驼峰命名
- ✅ 注释规范:使用
/** */,包含功能描述 - ✅ 代码格式:4 个空格缩进
- ✅ 异常处理:捕获并处理 Salesforce API 异常,转换为自定义异常
- ✅ 日志规范:使用
@Slf4j注解,关键操作记录日志 - ✅ 权限控制:使用
@PreAuthorize注解 - ✅ 参数验证:使用
@Validated注解和验证注解
架构一致性
- ✅ 继承
AbstractConnectionFactory<ToolingConnection> - ✅ 使用
ConnectionProxy创建代理连接 - ✅ 复用
SessionManager获取 Session 信息 - ✅ 遵循若依框架规范
- ✅ 遵循 Spring Boot 最佳实践
阶段 7:记录当前会话 - 已完成
完成时间
2026-01-27
生成文档
- 本会话记录
关键决策
- 完整记录会话:记录从阶段 1 到阶段 6 的完整过程
- 记录关键决策:记录每个阶段的关键决策和理由
- 记录生成的文档:记录所有生成的文档和代码文件
- 记录 AI 质疑:记录代码生成过程中的 AI 质疑和解决方案
阶段 8:变更记录与归档 - 已完成
完成时间
2026-01-27
生成文档
关键决策
- 变更分析:识别所有变更内容(新增功能、新增文档、新增代码文件)
- 创建变更日志:在
docs/changelog/目录下创建变更日志,记录所有变更内容 - 更新根目录 CHANGELOG.md:在根目录的 CHANGELOG.md 中追加新的变更记录
- 更新索引:在
docs/index.md中添加变更日志链接,标注该需求已完成 - 更新需求文档:在需求文档的"相关文档"部分添加变更日志引用
变更内容
- 新增功能:Tooling API 连接管理、Apex 类基础管理、Apex 触发器基础管理、RESTful API 接口、异常处理机制、数据模型封装、单元测试
- 新增文档:需求文档、设计文档、决策记录、提示词文档、会话记录、变更日志(共 6 个文档)
- 新增代码文件:20 个代码文件(3 个异常类、2 个 Domain 类、6 个 DTO 类、2 个 VO 类、1 个 Factory 类、2 个 Manager 类、4 个 Service 类、2 个 Controller 类、3 个单元测试类)
影响范围
- 模块级别:新增模块
datai-salesforce-tooling,影响模块datai-salesforce-integration - 文件级别:新增 20 个代码文件,新增 6 个文档文件
- 功能级别:新增 Apex 类与触发器基础管理功能,新增 8 个 RESTful API 接口
对话记录
2026-01-26 用户:d:\idea_demo\datai\datai-scenes\datai-scene-salesforce 扫描了解当前模块
2026-01-26 AI:扫描了 datai-scene-salesforce 模块,提供了模块结构、子模块、技术栈和核心功能的概述。
2026-01-27 用户:d:\idea_demo\datai\datai-scenes\datai-scene-salesforce\docs\requirements\REQ-014-1.md 进入阶段二
2026-01-27 AI:进入阶段 2(方案设计),创建了设计文档 2026-01-27-014-1-Apex类与触发器基础管理-设计.md,包含架构设计、技术方案、数据模型和接口设计。
2026-01-27 AI:设计文档已创建,内容是否达标?是否进入下一阶段?
2026-01-27 用户:进入下一阶段(方案决策)
2026-01-27 AI:进入阶段 3(方案决策),创建了决策记录 2026-01-27-014-1-ADR-ToolingAPI客户端代码生成方案.md,决策选择方案 1:直接使用现有的 Tooling API 客户端代码。
2026-01-27 AI:决策记录已创建,内容是否达标?是否进入下一阶段?
2026-01-27 用户:进入下一阶段(代码生成)
2026-01-27 AI:进入阶段 6(代码生成),分析了需求和设计文档,确认不涉及数据库表新增,不需要使用代码生成器。
2026-01-27 AI:生成了 20 个代码文件(3 个异常类、2 个 Domain 类、6 个 DTO 类、2 个 VO 类、1 个 Factory 类、2 个 Manager 类、4 个 Service 类、2 个 Controller 类、3 个单元测试类)。
2026-01-27 AI:代码已生成,代码是否正确?是否进入下一阶段(记录当前会话)?
2026-01-27 用户:进入下一阶段(记录当前会话)
2026-01-27 AI:进入阶段 7(记录当前会话),准备完整记录当前会话的所有信息。
生成的文档
需求文档
- REQ-014-1.md - Apex 类与触发器基础管理需求
设计文档
- 2026-01-27-014-1-Apex类与触发器基础管理-设计.md - Apex 类与触发器基础管理设计
决策记录
- 2026-01-27-014-1-ADR-ToolingAPI客户端代码生成方案.md - Tooling API 客户端代码生成方案
提示词文档
- 2026-01-27-014-1-prompt-Apex类与触发器基础管理.md - Apex 类与触发器基础管理提示词
会话记录
- 2026-01-27-014-1-session.md - REQ-014-1 Apex 类与触发器基础管理会话记录
生成的代码文件
Exception 层
datai-salesforce-tooling/src/main/java/com/datai/tooling/exception/ToolingConnectionException.javadatai-salesforce-tooling/src/main/java/com/datai/tooling/exception/ApexClassException.javadatai-salesforce-tooling/src/main/java/com/datai/tooling/exception/ApexTriggerException.java
Model 层 - Domain
datai-salesforce-tooling/src/main/java/com/datai/tooling/model/domain/ApexClass.javadatai-salesforce-tooling/src/main/java/com/datai/tooling/model/domain/ApexTrigger.java
Model 层 - DTO
datai-salesforce-tooling/src/main/java/com/datai/tooling/model/dto/ApexClassDto.javadatai-salesforce-tooling/src/main/java/com/datai/tooling/model/dto/ApexTriggerDto.javadatai-salesforce-tooling/src/main/java/com/datai/tooling/model/dto/ApexClassCreateRequest.javadatai-salesforce-tooling/src/main/java/com/datai/tooling/model/dto/ApexClassUpdateRequest.javadatai-salesforce-tooling/src/main/java/com/datai/tooling/model/dto/ApexTriggerCreateRequest.javadatai-salesforce-tooling/src/main/java/com/datai/tooling/model/dto/ApexTriggerUpdateRequest.java
Model 层 - VO
datai-salesforce-tooling/src/main/java/com/datai/tooling/model/vo/ApexClassVo.javadatai-salesforce-tooling/src/main/java/com/datai/tooling/model/vo/ApexTriggerVo.java
Factory 层
datai-salesforce-tooling/src/main/java/com/datai/tooling/factory/impl/ToolingConnectionFactory.java
Manager 层
datai-salesforce-tooling/src/main/java/com/datai/tooling/manager/ApexClassManager.javadatai-salesforce-tooling/src/main/java/com/datai/tooling/manager/ApexTriggerManager.java
Service 层
datai-salesforce-tooling/src/main/java/com/datai/tooling/service/IApexClassService.javadatai-salesforce-tooling/src/main/java/com/datai/tooling/service/impl/ApexClassServiceImpl.javadatai-salesforce-tooling/src/main/java/com/datai/tooling/service/IApexTriggerService.javadatai-salesforce-tooling/src/main/java/com/datai/tooling/service/impl/ApexTriggerServiceImpl.java
Controller 层
datai-salesforce-tooling/src/main/java/com/datai/tooling/controller/ApexClassController.javadatai-salesforce-tooling/src/main/java/com/datai/tooling/controller/ApexTriggerController.java
单元测试
datai-salesforce-tooling/src/test/java/com/datai/tooling/factory/impl/ToolingConnectionFactoryTest.javadatai-salesforce-tooling/src/test/java/com/datai/tooling/manager/ApexClassManagerTest.javadatai-salesforce-tooling/src/test/java/com/datai/tooling/manager/ApexTriggerManagerTest.java
回退记录
无