17 KiB
17 KiB
动作和自动化功能提示词
元数据
- 需求编号:004
- 子需求编号:004-05
- 子需求名称:动作和自动化
- 阶段:阶段 5:提示词生成
- 创建时间:2026-01-28
- 创建人:AI Assistant
- 状态:已完成
相关文档
提示词内容
角色设定
你是一个经验丰富的 Java 开发工程师,精通 Spring Boot、MyBatis Plus、Lombok、Jakarta Validation 等技术栈,熟悉 Salesforce Tooling API 的使用。
任务目标
根据需求文档、设计文档和决策记录,生成 Tooling API 动作和自动化功能的完整代码实现。
真源引用
-
需求文档:动作和自动化需求
- 核心功能:动作覆盖管理(创建、查询、更新、删除)、可操作列表查询、各种枚举类型查询
- 入参/出参定义:详细的 API 接口定义
- 实现要点:Service 层实现、异常处理、数据库设计
-
设计文档:动作和自动化功能设计
- 架构设计:系统架构图、数据流图、模块依赖关系
- 技术方案:核心组件、设计模式、连接管理方案、异常处理方案、SOQL 查询方案
- 数据模型:数据库表设计、实体类设计、DTO 设计、VO 设计
- 接口设计:Service 接口、Controller 接口、Mapper 接口
- 错误码定义:ToolingActionErrorCode 枚举
- 代码规范:命名规范、注释规范、导入规范、包结构
- 测试要求:单元测试、集成测试
-
决策记录:动作和自动化功能技术选型 ADR
- 选定方案:Service + ToolingConnectionFactory + 异步日志记录
- 决策理由:复用现有基础设施、异步日志记录不影响性能、统一异常处理、SOQL 查询支持、开发效率高、维护成本低、性能优秀、审计追溯完善、可扩展性强、符合团队习惯
需求描述
- 创建动作覆盖:创建新的动作覆盖,支持设置动作名称、内容、表单因子、页面或对象类型、记录类型、类型
- 更新动作覆盖:更新现有动作覆盖的内容、表单因子等属性
- 删除动作覆盖:删除指定的动作覆盖
- 查询动作覆盖:查询动作覆盖列表,支持按页面或对象类型、动作名称过滤
- 查询可操作列表:查询可操作列表,支持按列表类型过滤
- 获取动作覆盖类型:获取所有动作覆盖类型
- 获取动作子类型:获取所有动作子类型
- 获取可操作列表类型:获取所有可操作列表类型
- 获取可操作列表源类型:获取所有可操作列表源类型
- 获取动作任务分配类型:获取所有动作任务分配类型
- 获取动作 HTTP 方法:获取所有动作 HTTP 方法
- 获取动作邮件发送者类型:获取所有动作邮件发送者类型
- 获取操作日志:查询动作和自动化操作日志,支持按操作类型、元数据类型、时间范围过滤
设计方案
- 连接管理:复用 ToolingConnectionFactory 获取连接,使用
getConnection("source") - 异步日志记录:使用 CompletableFuture 异步记录操作日志到数据库
- 异常处理:使用 datai-salesforce-common 模块的异常体系,统一处理各种异常
- SOQL 查询:使用 SoqlBuilder 构建 SOQL 查询语句
- RESTful API:提供完整的 REST API 接口
输出格式
1. Service 接口
包路径:com.datai.tooling.service.IToolingActionAutomationService
方法列表:
ToolingActionResult createActionOverride(ActionOverrideRequest request);
ToolingActionResult updateActionOverride(ActionOverrideRequest request);
ToolingActionResult deleteActionOverride(String id);
List<ActionOverrideVO> queryActionOverrides(String pageOrSobjectType, String actionName);
List<ActionableListVO> queryActionableLists(String listType);
List<?> getActionOverrideTypes();
List<?> getActionSubtypes();
List<?> getActionableListTypes();
List<?> getActionableListSourceTypes();
List<?> getActionTaskAssignedToTypes();
List<?> getActionHttpMethods();
List<?> getActionEmailSenderTypes();
List<ActionAutomationOperationLogVO> queryOperationLogs(String operationType, String metadataType,
String startTime, String endTime,
Integer pageNum, Integer pageSize);
2. Service 实现
包路径:com.datai.tooling.service.impl.ToolingActionAutomationServiceImpl
实现要点:
- 使用
@Service注解 - 注入
ToolingConnectionFactory和ToolingActionAutomationLogMapper - 使用
CompletableFuture异步记录操作日志 - 使用
SoqlBuilder构建 SOQL 查询 - 统一异常处理,使用
ToolingActionErrorCode枚举定义错误码
3. Controller
包路径:com.datai.tooling.controller.ToolingActionAutomationController
接口列表:
- POST
/salesforce/tooling/action-automation/action-override- 创建动作覆盖 - PUT
/salesforce/tooling/action-automation/action-override- 更新动作覆盖 - DELETE
/salesforce/tooling/action-automation/action-override- 删除动作覆盖 - GET
/salesforce/tooling/action-automation/action-overrides- 查询动作覆盖 - GET
/salesforce/tooling/action-automation/actionable-lists- 查询可操作列表 - GET
/salesforce/tooling/action-automation/action-override-types- 获取动作覆盖类型 - GET
/salesforce/tooling/action-automation/action-subtypes- 获取动作子类型 - GET
/salesforce/tooling/action-automation/actionable-list-types- 获取可操作列表类型 - GET
/salesforce/tooling/action-automation/actionable-list-source-types- 获取可操作列表源类型 - GET
/salesforce/tooling/action-automation/action-task-assigned-to-types- 获取动作任务分配类型 - GET
/salesforce/tooling/action-automation/action-http-methods- 获取动作 HTTP 方法 - GET
/salesforce/tooling/action-automation/action-email-sender-types- 获取动作邮件发送者类型 - GET
/salesforce/tooling/action-automation/operation-logs- 获取操作日志
4. DTO
包路径:com.datai.tooling.domain.dto
类列表:
ActionOverrideRequest- 动作覆盖请求ActionAutomationOperationLogQueryRequest- 操作日志查询请求
5. VO
包路径:com.datai.tooling.domain.vo
类列表:
ToolingActionResult- Tooling 操作结果ActionOverrideVO- 动作覆盖视图对象ActionableListVO- 可操作列表视图对象ActionAutomationOperationLogVO- 操作日志视图对象
6. Entity
包路径:com.datai.tooling.domain.entity
类列表:
ToolingActionAutomationLog- 动作和自动化操作日志实体
7. Mapper
包路径:com.datai.tooling.mapper
接口列表:
ToolingActionAutomationLogMapper- 动作和自动化操作日志 Mapper
8. Enums
包路径:com.datai.tooling.enums
类列表:
ToolingActionErrorCode- 动作和自动化功能错误码枚举
9. 单元测试
包路径:com.datai.tooling.service.impl.ToolingActionAutomationServiceImplTest
测试场景:
- 创建动作覆盖成功
- 创建动作覆盖失败(参数校验失败)
- 创建动作覆盖失败(Session 无效)
- 更新动作覆盖成功
- 更新动作覆盖失败(记录不存在)
- 删除动作覆盖成功
- 删除动作覆盖失败(记录不存在)
- 查询动作覆盖成功
- 查询动作覆盖成功(按页面或对象类型过滤)
- 查询动作覆盖成功(按动作名称过滤)
- 查询可操作列表成功
- 查询可操作列表成功(按列表类型过滤)
- 获取动作覆盖类型成功
- 获取动作子类型成功
- 获取可操作列表类型成功
- 获取可操作列表源类型成功
- 获取动作任务分配类型成功
- 获取动作 HTTP 方法成功
- 获取动作邮件发送者类型成功
- 查询操作日志成功
- 查询操作日志成功(按操作类型过滤)
- 查询操作日志成功(按元数据类型过滤)
- 查询操作日志成功(按时间范围过滤)
代码规范
1. 命名规范
| 类型 | 命名规范 | 示例 |
|---|---|---|
| 类名 | 大驼峰 | ToolingActionAutomationServiceImpl |
| 方法名 | 小驼峰 | createActionOverride |
| 变量名 | 小驼峰 | actionOverride |
| 常量名 | 全大写下划线分隔 | OPERATION_TYPE_CREATE |
| 包名 | 全小写 | com.datai.tooling.service |
2. 注释规范
- 类注释:包含类功能描述、作者、创建时间
- 方法注释:包含功能描述、参数说明、返回值说明、异常说明
- 字段注释:包含字段用途说明
3. 导入规范
按照以下顺序导入:
- Java 标准库
- Jakarta 注解
- 第三方库
- 项目内部类
4. 包结构
com.datai.tooling
├── controller # Controller 层
├── service # Service 层
│ └── impl # Service 实现层
├── domain # 领域对象
│ ├── dto # 数据传输对象
│ ├── vo # 视图对象
│ └── entity # 实体类
├── mapper # Mapper 层
├── enums # 枚举类
├── factory # 工厂类
└── exception # 异常类
测试要求
- 覆盖率要求:≥ 80%
- 测试框架:JUnit 5 + Mockito
- 测试场景:
- 正常场景测试
- 异常场景测试
- 边界条件测试
- 并发场景测试
注意事项
- 连接复用:必须使用 ToolingConnectionFactory 获取连接,避免重复创建
- 异步日志:操作日志必须异步记录,不影响主流程性能
- 异常处理:必须统一使用 datai-salesforce-common 模块的异常体系
- 参数校验:所有入参必须使用 Jakarta Validation 进行校验
- 事务管理:数据库操作必须使用 Spring 事务管理
- 日志记录:关键操作必须记录应用日志
- 错误码:所有错误必须使用 ToolingActionErrorCode 枚举定义
- RESTful 规范:API 接口必须符合 RESTful 规范
- 文档同步:代码变更后必须同步更新相关文档
- 测试覆盖:代码变更后必须运行测试并确保通过
- 代码审查:代码提交前必须经过代码审查
- 版本控制:使用 Git 进行版本控制,遵循分支管理策略
- 性能监控:关键接口必须进行性能监控
- 安全审计:定期进行安全审计,及时修复安全漏洞
- 数据备份:定期备份操作日志数据
- SOQL 查询优化:只查询需要的字段,避免
SELECT * - 过滤条件:在 WHERE 子句中添加过滤条件,减少返回数据量
- 分页查询:支持分页查询,避免一次性返回大量数据
- 异步线程池配置:合理配置异步线程池参数
- 监控异步任务:监控异步日志记录的任务状态
- 定期清理历史数据:定期清理历史日志数据
- 数据库索引优化:设计合理的索引,优化查询性能
- 预留扩展点:预留扩展点,支持未来新增动作和自动化功能
- 插件化设计:支持通过插件方式扩展动作和自动化功能
- 统一返回格式:使用 AjaxResult 统一返回格式
- 分页支持:使用 TableDataInfo 支持分页
- Swagger 注解:使用 @Api 和 @ApiOperation 注解
- Lombok 注解:使用 @Data、@Slf4j 等 Lombok 注解
- MyBatis Plus 注解:使用 @TableName、@TableId 等 MyBatis Plus 注解
- Jakarta Validation 注解:使用 @NotBlank、@NotNull 等 Jakarta Validation 注解
输出要求
- 生成完整的代码文件,包括 Service 接口、Service 实现、Controller、DTO、VO、Entity、Mapper、Enums、单元测试
- 代码必须符合项目代码规范
- 代码必须包含完整的注释
- 代码必须通过编译
- 单元测试覆盖率必须 ≥ 80%
示例代码
Service 实现示例
@Service
@Slf4j
public class ToolingActionAutomationServiceImpl implements IToolingActionAutomationService {
@Autowired
private ToolingConnectionFactory connectionFactory;
@Autowired
private ToolingActionAutomationLogMapper logMapper;
@Autowired
private ThreadPoolTaskExecutor asyncExecutor;
@Override
public ToolingActionResult createActionOverride(ActionOverrideRequest request) {
try {
ToolingConnection connection = connectionFactory.getConnection("source");
ActionOverride actionOverride = new ActionOverride();
actionOverride.setActionName(request.getActionName());
actionOverride.setContent(request.getContent());
actionOverride.setFormFactor(request.getFormFactor());
actionOverride.setPageOrSobjectType(request.getPageOrSobjectType());
actionOverride.setRecordType(request.getRecordType());
actionOverride.setType(request.getType());
SaveResult[] results = connection.create(new SObject[]{actionOverride});
ToolingActionResult result = convertToToolingActionResult(results[0]);
logOperation("create_action_override", "ActionOverride",
result.getId(), request.getActionName(),
JsonUtils.toJson(request), JsonUtils.toJson(result),
result.isSuccess() ? 1 : 0,
result.isSuccess(),
result.isSuccess() ? null : "TOOLING_ACTION_002",
result.isSuccess() ? null : "创建失败");
return result;
} catch (ConnectionException e) {
log.error("创建动作覆盖失败", e);
throw new SalesforceAuthException("TOOLING_ACTION_002", "创建动作覆盖失败: " + e.getMessage());
}
}
private void logOperation(String operationType, String metadataType,
String metadataId, String metadataName,
String requestData, String responseData,
int resultCount, boolean success,
String errorCode, String errorMessage) {
CompletableFuture.runAsync(() -> {
try {
ToolingActionAutomationLog log = new ToolingActionAutomationLog();
log.setOperationType(operationType);
log.setMetadataType(metadataType);
log.setMetadataId(metadataId);
log.setMetadataName(metadataName);
log.setRequestData(requestData);
log.setResponseData(responseData);
log.setResultCount(resultCount);
log.setStatus(success ? "success" : "failed");
log.setErrorCode(errorCode);
log.setErrorMessage(errorMessage);
log.setOperationTime(LocalDateTime.now());
log.setUserId(SecurityUtils.getUserId());
logMapper.insert(log);
} catch (Exception e) {
log.error("记录操作日志失败", e);
}
}, asyncExecutor);
}
}
Controller 示例
@Api(tags = "Tooling API - 动作和自动化")
@RestController
@RequestMapping("/salesforce/tooling/action-automation")
public class ToolingActionAutomationController {
@Autowired
private IToolingActionAutomationService toolingActionAutomationService;
@ApiOperation("创建动作覆盖")
@PostMapping("/action-override")
public AjaxResult createActionOverride(@RequestBody @Valid ActionOverrideRequest request) {
return AjaxResult.success(toolingActionAutomationService.createActionOverride(request));
}
@ApiOperation("查询动作覆盖")
@GetMapping("/action-overrides")
public TableDataInfo queryActionOverrides(@RequestParam(required = false) String pageOrSobjectType,
@RequestParam(required = false) String actionName) {
List<ActionOverrideVO> list = toolingActionAutomationService.queryActionOverrides(pageOrSobjectType, actionName);
return getDataTable(list);
}
}
验证标准
- 代码是否完整生成
- 代码是否符合项目代码规范
- 代码是否包含完整注释
- 代码是否能通过编译
- 单元测试覆盖率是否 ≥ 80%
- 是否实现了所有需求功能
- 是否正确使用 ToolingConnectionFactory
- 是否正确实现异步日志记录
- 是否正确处理异常
- 是否正确使用 SoqlBuilder 构建 SOQL 查询