11 KiB
11 KiB
提示词:SOQL 查询功能
引用真源
需求描述
根据需求文档,实现 Tooling API SOQL 查询功能,包括:
- 执行 SOQL 查询(executeQuery)
- 获取更多查询结果(queryMore)
- 查询所有结果(queryAll,自动处理分页)
- 使用 SoqlBuilder 执行查询(executeQuery with SoqlBuilder)
- 使用 SoqlBuilder 查询所有结果(queryAll with SoqlBuilder)
- 获取查询日志(getLogs)
- 支持所有 Tooling API 对象的查询
- 支持复杂的查询条件、排序、分页
- 所有操作都记录到数据库(datai_tooling_soql_query_log 表)
设计方案
根据设计文档和决策记录,采用以下技术方案:
- 复用子需求 004-01 实现的 ToolingConnectionFactory,使用 getConnection("source") 获取连接
- 使用 CompletableFuture 异步记录操作日志,不影响主流程性能
- 使用 datai-salesforce-common 模块的异常体系,统一处理各种异常情况
- 使用 SoqlBuilder 构建 SOQL 查询语句,简化查询逻辑
- 遵循 RESTful API 设计规范,接口清晰易懂
- 使用 MyBatis Plus 进行数据库操作
- 使用若依框架的 @PreAuthorize 注解进行权限控制
- 使用若依框架的 @DataScope 注解进行数据权限控制
- 使用若依框架的 @Log 注解记录操作日志
- 使用若依框架的 GlobalExceptionHandler 处理异常
输出格式要求
必须包含以下文件
Controller 层
- ToolingSoqlQueryController.java
- 路径:
datai-salesforce-tooling/src/main/java/com/datai/salesforce/tooling/controller/ToolingSoqlQueryController.java - 功能:提供 REST API 接口
- 接口列表:
- POST /salesforce/tooling/soql/query - 执行 SOQL 查询
- POST /salesforce/tooling/soql/queryMore - 获取更多查询结果
- POST /salesforce/tooling/soql/queryAll - 查询所有结果
- POST /salesforce/tooling/soql/queryWithBuilder - 使用 SoqlBuilder 查询
- GET /salesforce/tooling/soql/logs - 获取查询日志
- 路径:
Service 层
-
IToolingSoqlQueryService.java
- 路径:
datai-salesforce-tooling/src/main/java/com/datai/salesforce/tooling/service/IToolingSoqlQueryService.java - 功能:Service 接口定义
- 路径:
-
ToolingSoqlQueryServiceImpl.java
- 路径:
datai-salesforce-tooling/src/main/java/com/datai/salesforce/tooling/service/impl/ToolingSoqlQueryServiceImpl.java - 功能:Service 实现
- 路径:
-
IAsyncLogService.java
- 路径:
datai-salesforce-tooling/src/main/java/com/datai/salesforce/tooling/service/IAsyncLogService.java - 功能:异步日志记录 Service 接口定义
- 路径:
-
AsyncLogServiceImpl.java
- 路径:
datai-salesforce-tooling/src/main/java/com/datai/salesforce/tooling/service/impl/AsyncLogServiceImpl.java - 功能:异步日志记录 Service 实现
- 路径:
Mapper 层
- ToolingSoqlQueryLogMapper.java
- 路径:
datai-salesforce-tooling/src/main/java/com/datai/salesforce/tooling/mapper/ToolingSoqlQueryLogMapper.java - 功能:MyBatis Plus Mapper 接口
- 路径:
Domain 层
-
ToolingSoqlQueryLog.java
- 路径:
datai-salesforce-tooling/src/main/java/com/datai/salesforce/tooling/domain/ToolingSoqlQueryLog.java - 功能:操作日志实体类
- 路径:
-
ToolingSoqlQueryRequest.java
- 路径:
datai-salesforce-tooling/src/main/java/com/datai/salesforce/tooling/domain/dto/ToolingSoqlQueryRequest.java - 功能:SOQL 查询请求 DTO
- 路径:
-
ToolingSoqlQueryResult.java
- 路径:
datai-salesforce-tooling/src/main/java/com/datai/salesforce/tooling/domain/dto/ToolingSoqlQueryResult.java - 功能:SOQL 查询结果 DTO
- 路径:
-
ToolingSoqlQueryLogVO.java
- 路径:
datai-salesforce-tooling/src/main/java/com/datai/salesforce/tooling/domain/vo/ToolingSoqlQueryLogVO.java - 功能:操作日志 VO
- 路径:
Enums 层
- ToolingSoqlErrorCode.java
- 路径:
datai-salesforce-tooling/src/main/java/com/datai/salesforce/tooling/enums/ToolingSoqlErrorCode.java - 功能:SOQL 查询错误码枚举
- 路径:
必须包含单元测试
-
ToolingSoqlQueryServiceImplTest.java
- 路径:
datai-salesforce-tooling/src/test/java/com/datai/salesforce/tooling/service/impl/ToolingSoqlQueryServiceImplTest.java - 功能:Service 层单元测试
- 路径:
-
ToolingSoqlQueryControllerTest.java
- 路径:
datai-salesforce-tooling/src/test/java/com/datai/salesforce/tooling/controller/ToolingSoqlQueryControllerTest.java - 功能:Controller 层单元测试
- 路径:
必须符合以下规范
- 必须符合 Spring Boot 最佳实践
- 必须遵循若依框架规范
- 必须使用 MyBatis Plus 进行数据库操作
- 必须使用 Lombok 简化代码
- 必须使用 Jakarta Validation 进行请求参数校验
- 必须使用 CompletableFuture 异步记录日志
- 必须使用自定义线程池进行异步操作
代码规范要求
类命名规范
- Controller 类:
XxxController,如ToolingSoqlQueryController - Service 接口:
IXxxService,如IToolingSoqlQueryService - Service 实现:
XxxServiceImpl,如ToolingSoqlQueryServiceImpl - Mapper 接口:
XxxMapper,如ToolingSoqlQueryLogMapper - Entity 类:
Xxx,如ToolingSoqlQueryLog - DTO 类:
XxxRequest、XxxResult,如ToolingSoqlQueryRequest、ToolingSoqlQueryResult - VO 类:
XxxVO,如ToolingSoqlQueryLogVO - Enum 类:
XxxErrorCode,如ToolingSoqlErrorCode
方法命名规范
- Controller 方法:使用动词,如
executeQuery、queryMore、queryAll、getLogs - Service 方法:使用动词,如
executeQuery、queryMore、queryAll、saveLog - Mapper 方法:遵循 MyBatis Plus 规范,如
selectList、selectById、insert
变量命名规范
- 类成员变量:使用驼峰命名,如
queryString、queryLocator - 局部变量:使用驼峰命名,如
startTime、endTime - 常量:使用全大写下划线分隔,如
MAX_QUERY_SIZE
注释规范
- 类注释:使用
/** */,包含类功能描述、作者、创建时间 - 方法注释:使用
/** */,包含方法功能、参数、返回值、异常描述 - 字段注释:使用
/** */,包含字段功能描述 - 枚举注释:使用
/** */,包含枚举值说明
代码格式规范
- 使用 4 个空格缩进
- 行宽不超过 120 字符
- 左大括号不换行
- 右大括号独占一行
- if、for、while 等关键字后加空格
导入规范
- 使用 import 静态导入,避免通配符导入
- 导入顺序:Java 标准库、第三方库、项目内部类
- 每组导入之间空一行
异常处理规范
- 使用 datai-salesforce-common 模块的异常体系
- 捕获 Salesforce ConnectionException,转换为自定义异常
- 使用 try-catch-finally 确保资源释放
- 在 finally 块中记录日志
日志规范
- 使用 SLF4J + Logback
- 日志级别:ERROR(错误)、WARN(警告)、INFO(信息)、DEBUG(调试)
- 使用占位符:
log.error("查询失败: {}", e.getMessage()) - 异常日志必须包含堆栈信息
测试要求
单元测试要求
- 单元测试覆盖率不低于 80%
- 测试用例包含以下场景:
- 正常查询成功
- 查询失败(语法错误)
- Session 无效
- 用户未登录
- 权限不足
- 查询定位器无效
- 查询结果超出限制
- 异步日志记录成功
- 异步日志记录失败
- 使用 JUnit 5 和 Mockito 进行测试
- 测试用例命名规范:
test+方法名+场景,如testExecuteQuerySuccess - 测试数据使用 Mockito 模拟
集成测试要求
- 测试完整的请求流程
- 测试数据库操作
- 测试异常处理
- 测试异步日志记录
测试数据准备
- 使用 @BeforeEach 初始化测试数据
- 使用 @AfterEach 清理测试数据
- 使用 @TestConfiguration 配置测试环境
注意事项
Salesforce API 约束
- 不支持 SELECT *,必须明确指定字段或使用 FIELDS()
- 不支持 BETWEEN 运算符,使用 >= 和 <= 组合代替
- 不支持 JOIN,使用关系查询(Relationship Queries)
- 不支持 UNION,无法合并两个不相关的结果集
- 支持的运算符:=, !=, >, >=, <, <=, LIKE, IN, NOT IN, = NULL, != NULL
- 支持的子句:WHERE, GROUP BY, HAVING, ORDER BY, LIMIT, OFFSET
- 查询最多返回 50000 条记录
- OFFSET 上限为 2000,且必须与 LIMIT 一起使用
- 查询定位器(queryLocator)有有效期限制,过期后需要重新查询
若依框架集成
- 必须使用若依的
@PreAuthorize注解进行权限控制 - 必须使用若依的
@DataScope注解进行数据权限控制 - 必须使用若依的
@Log注解记录操作日志 - 必须使用若依的
GlobalExceptionHandler处理异常 - 必须使用若依的
AjaxResult作为统一响应格式 - 必须使用若依的
TableDataInfo作为分页响应格式
异常处理
- Session 无效异常:INVALID_SESSION_ID -> SalesforceAuthException(TOOLING_SOQL_001)
- 查询失败异常:MALFORMED_QUERY、INVALID_QUERY、QUERY_TIMEOUT -> SalesforceAuthException(TOOLING_SOQL_002)
- 权限不足异常:INSUFFICIENT_ACCESS -> SalesforceAuthException(TOOLING_SOQL_003)
- 未登录异常:SessionManager 返回 null 或 Session 已过期 -> SalesforceLoginException(TOOLING_SOQL_004)
- 查询定位器无效异常:queryLocator 无效或已过期 -> SalesforceAuthException(TOOLING_SOQL_005)
- 查询结果超出限制异常:查询结果超过 50000 条记录 -> SalesforceAuthException(TOOLING_SOQL_006)
异步日志记录
- 使用 CompletableFuture.runAsync() 异步执行日志记录
- 使用自定义线程池,避免影响主线程池
- 日志记录失败不影响主操作结果
- 记录日志记录失败到系统日志
- 使用 @Async 注解标记异步方法
性能优化
- 记录查询执行时间,用于性能监控
- 使用连接缓存,避免重复创建连接
- 使用异步日志记录,避免影响主操作性能
- 合理设置线程池大小
安全性
- 验证 SOQL 查询字符串,防止 SQL 注入
- 限制查询结果数量,防止资源耗尽
- 记录所有查询操作,便于审计
- 使用权限注解控制接口访问
元数据
- 需求编号:004
- 子需求编号:004-08
- 子需求名称:SOQL 查询功能
- 阶段:阶段 5:提示词生成
- 创建时间:2026-02-03
- 创建人:AI Assistant
- 状态:已完成