datai/datai-scenes/datai-scene-salesforce/docs/prompts/2026-01-28-004-05-prompt-动作和自动化功能.md

17 KiB
Raw Permalink Blame History

动作和自动化功能提示词

元数据

  • 需求编号004
  • 子需求编号004-05
  • 子需求名称:动作和自动化
  • 阶段:阶段 5提示词生成
  • 创建时间2026-01-28
  • 创建人AI Assistant
  • 状态:已完成

相关文档


提示词内容

角色设定

你是一个经验丰富的 Java 开发工程师,精通 Spring Boot、MyBatis Plus、Lombok、Jakarta Validation 等技术栈,熟悉 Salesforce Tooling API 的使用。

任务目标

根据需求文档、设计文档和决策记录,生成 Tooling API 动作和自动化功能的完整代码实现。

真源引用

  1. 需求文档动作和自动化需求

    • 核心功能:动作覆盖管理(创建、查询、更新、删除)、可操作列表查询、各种枚举类型查询
    • 入参/出参定义:详细的 API 接口定义
    • 实现要点Service 层实现、异常处理、数据库设计
  2. 设计文档动作和自动化功能设计

    • 架构设计:系统架构图、数据流图、模块依赖关系
    • 技术方案核心组件、设计模式、连接管理方案、异常处理方案、SOQL 查询方案
    • 数据模型数据库表设计、实体类设计、DTO 设计、VO 设计
    • 接口设计Service 接口、Controller 接口、Mapper 接口
    • 错误码定义ToolingActionErrorCode 枚举
    • 代码规范:命名规范、注释规范、导入规范、包结构
    • 测试要求:单元测试、集成测试
  3. 决策记录动作和自动化功能技术选型 ADR

    • 选定方案Service + ToolingConnectionFactory + 异步日志记录
    • 决策理由复用现有基础设施、异步日志记录不影响性能、统一异常处理、SOQL 查询支持、开发效率高、维护成本低、性能优秀、审计追溯完善、可扩展性强、符合团队习惯

需求描述

  1. 创建动作覆盖:创建新的动作覆盖,支持设置动作名称、内容、表单因子、页面或对象类型、记录类型、类型
  2. 更新动作覆盖:更新现有动作覆盖的内容、表单因子等属性
  3. 删除动作覆盖:删除指定的动作覆盖
  4. 查询动作覆盖:查询动作覆盖列表,支持按页面或对象类型、动作名称过滤
  5. 查询可操作列表:查询可操作列表,支持按列表类型过滤
  6. 获取动作覆盖类型:获取所有动作覆盖类型
  7. 获取动作子类型:获取所有动作子类型
  8. 获取可操作列表类型:获取所有可操作列表类型
  9. 获取可操作列表源类型:获取所有可操作列表源类型
  10. 获取动作任务分配类型:获取所有动作任务分配类型
  11. 获取动作 HTTP 方法:获取所有动作 HTTP 方法
  12. 获取动作邮件发送者类型:获取所有动作邮件发送者类型
  13. 获取操作日志:查询动作和自动化操作日志,支持按操作类型、元数据类型、时间范围过滤

设计方案

  1. 连接管理:复用 ToolingConnectionFactory 获取连接,使用 getConnection("source")
  2. 异步日志记录:使用 CompletableFuture 异步记录操作日志到数据库
  3. 异常处理:使用 datai-salesforce-common 模块的异常体系,统一处理各种异常
  4. SOQL 查询:使用 SoqlBuilder 构建 SOQL 查询语句
  5. 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 注解
  • 注入 ToolingConnectionFactoryToolingActionAutomationLogMapper
  • 使用 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

测试场景

  1. 创建动作覆盖成功
  2. 创建动作覆盖失败(参数校验失败)
  3. 创建动作覆盖失败Session 无效)
  4. 更新动作覆盖成功
  5. 更新动作覆盖失败(记录不存在)
  6. 删除动作覆盖成功
  7. 删除动作覆盖失败(记录不存在)
  8. 查询动作覆盖成功
  9. 查询动作覆盖成功(按页面或对象类型过滤)
  10. 查询动作覆盖成功(按动作名称过滤)
  11. 查询可操作列表成功
  12. 查询可操作列表成功(按列表类型过滤)
  13. 获取动作覆盖类型成功
  14. 获取动作子类型成功
  15. 获取可操作列表类型成功
  16. 获取可操作列表源类型成功
  17. 获取动作任务分配类型成功
  18. 获取动作 HTTP 方法成功
  19. 获取动作邮件发送者类型成功
  20. 查询操作日志成功
  21. 查询操作日志成功(按操作类型过滤)
  22. 查询操作日志成功(按元数据类型过滤)
  23. 查询操作日志成功(按时间范围过滤)

代码规范

1. 命名规范

类型 命名规范 示例
类名 大驼峰 ToolingActionAutomationServiceImpl
方法名 小驼峰 createActionOverride
变量名 小驼峰 actionOverride
常量名 全大写下划线分隔 OPERATION_TYPE_CREATE
包名 全小写 com.datai.tooling.service

2. 注释规范

  • 类注释:包含类功能描述、作者、创建时间
  • 方法注释:包含功能描述、参数说明、返回值说明、异常说明
  • 字段注释:包含字段用途说明

3. 导入规范

按照以下顺序导入:

  1. Java 标准库
  2. Jakarta 注解
  3. 第三方库
  4. 项目内部类

4. 包结构

com.datai.tooling
├── controller          # Controller 层
├── service            # Service 层
│   └── impl           # Service 实现层
├── domain             # 领域对象
│   ├── dto            # 数据传输对象
│   ├── vo             # 视图对象
│   └── entity         # 实体类
├── mapper             # Mapper 层
├── enums              # 枚举类
├── factory            # 工厂类
└── exception          # 异常类

测试要求

  1. 覆盖率要求:≥ 80%
  2. 测试框架JUnit 5 + Mockito
  3. 测试场景
    • 正常场景测试
    • 异常场景测试
    • 边界条件测试
    • 并发场景测试

注意事项

  1. 连接复用:必须使用 ToolingConnectionFactory 获取连接,避免重复创建
  2. 异步日志:操作日志必须异步记录,不影响主流程性能
  3. 异常处理:必须统一使用 datai-salesforce-common 模块的异常体系
  4. 参数校验:所有入参必须使用 Jakarta Validation 进行校验
  5. 事务管理:数据库操作必须使用 Spring 事务管理
  6. 日志记录:关键操作必须记录应用日志
  7. 错误码:所有错误必须使用 ToolingActionErrorCode 枚举定义
  8. RESTful 规范API 接口必须符合 RESTful 规范
  9. 文档同步:代码变更后必须同步更新相关文档
  10. 测试覆盖:代码变更后必须运行测试并确保通过
  11. 代码审查:代码提交前必须经过代码审查
  12. 版本控制:使用 Git 进行版本控制,遵循分支管理策略
  13. 性能监控:关键接口必须进行性能监控
  14. 安全审计:定期进行安全审计,及时修复安全漏洞
  15. 数据备份:定期备份操作日志数据
  16. SOQL 查询优化:只查询需要的字段,避免 SELECT *
  17. 过滤条件:在 WHERE 子句中添加过滤条件,减少返回数据量
  18. 分页查询:支持分页查询,避免一次性返回大量数据
  19. 异步线程池配置:合理配置异步线程池参数
  20. 监控异步任务:监控异步日志记录的任务状态
  21. 定期清理历史数据:定期清理历史日志数据
  22. 数据库索引优化:设计合理的索引,优化查询性能
  23. 预留扩展点:预留扩展点,支持未来新增动作和自动化功能
  24. 插件化设计:支持通过插件方式扩展动作和自动化功能
  25. 统一返回格式:使用 AjaxResult 统一返回格式
  26. 分页支持:使用 TableDataInfo 支持分页
  27. Swagger 注解:使用 @Api 和 @ApiOperation 注解
  28. Lombok 注解:使用 @Data、@Slf4j 等 Lombok 注解
  29. MyBatis Plus 注解:使用 @TableName、@TableId 等 MyBatis Plus 注解
  30. Jakarta Validation 注解:使用 @NotBlank、@NotNull 等 Jakarta Validation 注解

输出要求

  1. 生成完整的代码文件,包括 Service 接口、Service 实现、Controller、DTO、VO、Entity、Mapper、Enums、单元测试
  2. 代码必须符合项目代码规范
  3. 代码必须包含完整的注释
  4. 代码必须通过编译
  5. 单元测试覆盖率必须 ≥ 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);
    }
}

验证标准

  1. 代码是否完整生成
  2. 代码是否符合项目代码规范
  3. 代码是否包含完整注释
  4. 代码是否能通过编译
  5. 单元测试覆盖率是否 ≥ 80%
  6. 是否实现了所有需求功能
  7. 是否正确使用 ToolingConnectionFactory
  8. 是否正确实现异步日志记录
  9. 是否正确处理异常
  10. 是否正确使用 SoqlBuilder 构建 SOQL 查询