9.2 KiB
9.2 KiB
提示词:Apex 代码编译和执行
引用真源
需求描述
根据需求文档,实现 Apex 代码编译和执行功能,包括:
- CompileClasses:编译 Apex 类,接收类代码数组,返回编译结果
- CompileTriggers:编译 Apex 触发器,接收触发器代码数组,返回编译结果
- CompileAndTest:编译并运行测试,支持编译类、触发器、删除类、删除触发器,并运行测试
- ExecuteAnonymous:执行匿名 Apex 代码,接收代码字符串,返回执行结果
- 查询编译历史:支持按编译类型、时间范围查询编译历史记录
- 查询测试结果:支持按测试运行ID、时间范围查询测试结果
- 查询代码覆盖率:支持按类名、类型查询代码覆盖率
设计方案
根据设计文档,采用以下技术方案:
- 架构设计:Controller -> Service -> Factory -> Salesforce API 分层架构
- 连接管理:使用 ApexConnectionFactory 获取 SoapConnection 实例
- 数据持久化:使用 MyBatis Plus 将编译和测试结果持久化到数据库
- 并发控制:使用 ReentrantLock 保证多线程安全
- 权限控制:使用 Spring Security 进行方法级权限控制
- 固定使用 source org:所有编译和执行操作都使用 source org 类型
数据库表结构
根据 SQL 脚本,需要创建以下 4 张表:
- datai_apex_compile_history - Apex 编译历史表
- datai_apex_test_result - Apex 测试结果表
- datai_apex_test_failure - Apex 测试失败详情表
- datai_apex_code_coverage - Apex 代码覆盖率表
所有表包含标准字段:dept_id、create_by、create_time、update_by、update_time、del_flag
输出格式要求
必须包含的文件
-
Controller 层(路径:
datai-salesforce-apex/src/main/java/com/datai/apex/controller/):ApexCompileController.java- 编译相关接口(编译类、编译触发器、编译并测试)ApexExecuteController.java- 执行相关接口(执行匿名代码)ApexQueryController.java- 查询相关接口(查询编译历史、测试结果、代码覆盖率)
-
Service 层(路径:
datai-salesforce-apex/src/main/java/com/datai/apex/service/):IApexCompileService.java- 服务接口impl/ApexCompileServiceImpl.java- 服务实现
-
Mapper 层(路径:
datai-salesforce-apex/src/main/java/com/datai/apex/mapper/):ApexCompileHistoryMapper.java- 编译历史 MapperApexTestResultMapper.java- 测试结果 MapperApexTestFailureMapper.java- 测试失败 MapperApexCodeCoverageMapper.java- 代码覆盖率 Mapper
-
Domain 层(路径:
datai-salesforce-apex/src/main/java/com/datai/apex/domain/):ApexCompileHistory.java- 编译历史实体ApexTestResult.java- 测试结果实体ApexTestFailure.java- 测试失败实体ApexCodeCoverage.java- 代码覆盖率实体
-
DTO 层(路径:
datai-salesforce-apex/src/main/java/com/datai/apex/model/dto/):CompileClassesDto.java- 编译类请求 DTOCompileTriggersDto.java- 编译触发器请求 DTOCompileAndTestDto.java- 编译并测试请求 DTOExecuteAnonymousDto.java- 执行匿名代码请求 DTORunTestsRequestDto.java- 运行测试请求 DTO
-
VO 层(路径:
datai-salesforce-apex/src/main/java/com/datai/apex/model/vo/):CompileClassResultVo.java- 编译类结果 VOCompileTriggerResultVo.java- 编译触发器结果 VOCompileAndTestResultVo.java- 编译并测试结果 VOExecuteAnonymousResultVo.java- 执行匿名代码结果 VORunTestsResultVo.java- 运行测试结果 VOCodeCoverageResultVo.java- 代码覆盖率结果 VOTestFailureVo.java- 测试失败详情 VO
REST API 接口列表
POST /api/apex/compile/classes- 编译 Apex 类(权限:apex:compile:classes)POST /api/apex/compile/triggers- 编译 Apex 触发器(权限:apex:compile:triggers)POST /api/apex/compile/compile-and-test- 编译并测试(权限:apex:compile:compile-and-test)POST /api/apex/execute/anonymous- 执行匿名 Apex 代码(权限:apex:execute:anonymous)GET /api/apex/compile/history- 查询编译历史(权限:apex:compile:history)GET /api/apex/test/results- 查询测试结果(权限:apex:test:results)GET /api/apex/test/coverage- 查询代码覆盖率(权限:apex:test:coverage)
代码规范要求
- 类命名:首字母大写,驼峰命名,如
ApexCompileController - 方法命名:首字母小写,驼峰命名,如
compileClasses - 变量命名:首字母小写,驼峰命名,如
compileType - 注释规范:
- 类注释:使用
/** */,包含类功能描述、作者、创建时间 - 方法注释:使用
/** */,包含方法功能、参数、返回值、异常描述 - 字段注释:使用
/** */,包含字段功能描述
- 类注释:使用
- 代码格式:使用 4 个空格缩进,行宽不超过 120 字符
- 导入规范:使用具体导入,避免通配符导入
异常处理要求
- 使用
SalesforceAuthException处理认证相关异常 - 使用
SalesforceOperationException处理操作相关异常 - 使用
SalesforceSessionException处理会话相关异常 - 所有异常必须转换为友好的中文错误消息
- 记录详细的错误日志,包括错误时间、错误位置、错误原因
日志要求
- 使用 SLF4J 日志框架
- 关键操作必须记录日志(编译、执行、查询)
- 日志级别:INFO(正常操作)、ERROR(异常)、DEBUG(调试信息)
- 日志内容:操作类型、操作参数、操作结果、执行时间
技术实现要点
1. 编译 Apex 类
@PreAuthorize("hasAuthority('apex:compile:classes')")
public CompileClassResultVo[] compileClasses(CompileClassesDto dto) {
// 1. 获取 SoapConnection
SoapConnection connection = apexConnectionFactory.getConnection("source");
// 2. 调用 Salesforce API
CompileClassResult[] results = connection.compileClasses(dto.getClasses());
// 3. 转换结果
CompileClassResultVo[] vos = convertToVo(results);
// 4. 保存到数据库
saveCompileHistory(vos, dto.getClasses(), "class");
return vos;
}
2. 执行匿名 Apex 代码
@PreAuthorize("hasAuthority('apex:execute:anonymous')")
public ExecuteAnonymousResultVo executeAnonymous(ExecuteAnonymousDto dto) {
// 1. 获取 SoapConnection
SoapConnection connection = apexConnectionFactory.getConnection("source");
// 2. 调用 Salesforce API
ExecuteAnonymousResult result = connection.executeAnonymous(dto.getCode());
// 3. 转换结果
ExecuteAnonymousResultVo vo = convertToVo(result);
return vo;
}
3. 数据库实体类示例
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("datai_apex_compile_history")
public class ApexCompileHistory extends BaseEntity {
@TableField("compile_type")
private String compileType;
@TableField("code_content")
private String codeContent;
@TableField("compile_success")
private Boolean compileSuccess;
@TableField("compile_problem")
private String compileProblem;
@TableField("compile_time")
private Date compileTime;
}
测试要求
- 单元测试覆盖率不低于 80%
- 测试用例包含以下场景:
- 正常编译成功
- 编译失败(语法错误)
- 执行匿名代码成功
- 执行匿名代码失败(编译错误)
- 执行匿名代码失败(运行时异常)
- 查询编译历史
- 查询测试结果
- 查询代码覆盖率
- 使用 JUnit 5 和 Mockito 进行测试
- 测试用例命名规范:
test+方法名+场景,如testCompileClassesSuccess - 测试数据使用 Mockito 模拟 Salesforce API 调用
注意事项
- 直接使用 apex.jar 原生类:CompileClassResult、CompileTriggerResult、ExecuteAnonymousResult 等,避免二次封装
- 复用 ApexConnectionFactory:使用已有的连接工厂获取 SoapConnection 实例
- 固定使用 source org:所有编译和执行操作都使用 "source" 类型
- 多线程安全:使用 ReentrantLock 保证并发安全
- 数据库事务:使用 @Transactional 注解保证数据一致性
- 参数校验:使用 @Valid 和 @NotBlank 等注解进行参数校验
- 数据权限:使用若依的 @DataScope 注解进行数据权限控制(如果需要)
- 操作日志:使用若依的 @Log 注解记录操作日志
依赖项
datai-salesforce-auth模块的 ApexConnectionFactorydatai-salesforce-common模块的异常类apex.jar中的 SoapConnection、CompileClassResult 等类- Spring Security 用于权限控制
- MyBatis Plus 用于数据库操作
- Lombok 用于简化代码