# 元数据任务定义管理 - 实现提示词 ## 提示词信息 - **提示词编号**: Prompt-014 - **创建日期**: 2026-01-18 - **相关需求**: [REQ-010-4](../requirements/REQ-010-4.md) - 元数据任务定义管理 - **相关决策**: [ADR-0013](../decisions/adr/0013-task-definition-management.md) - 元数据任务定义管理架构决策 ## 输入引用 ### 真源文档 - [REQ-010-4.md](../requirements/REQ-010-4.md) - 元数据任务定义管理需求文档 - [ADR-0013.md](../decisions/adr/0013-task-definition-management.md) - 元数据任务定义管理架构决策 - [metadata-module.md](../reference-code/com/docs/metadata-module.md) - Salesforce Metadata API 模块说明 - [file/index.md](../api-docs/file/index.md) - 文件模块 API 文档索引 ### 技术规范 - Spring Boot 3 + Vue 3 技术栈 - MyBatis Plus 持久层框架 - RESTful API 设计规范 - 项目编码规范 ## 提示词内容 ### 角色设定 你是一个经验丰富的 Spring Boot 全栈开发工程师,专注于 Salesforce 元数据管理系统的开发。你熟悉以下技术栈: - **后端**: Spring Boot 3, MyBatis Plus, MySQL - **前端**: Vue 3, Element Plus - **Salesforce API**: Metadata API, Partner API - **工具**: Maven, Git, Postman ### 任务目标 实现元数据任务定义管理功能,包括: 1. **任务定义 CRUD 功能** - 创建元数据任务 - 编辑元数据任务 - 删除元数据任务 - 查询元数据任务列表(支持分页和条件查询) 2. **package.xml 内容配置** - 可视化编辑 package.xml 内容 - package.xml 格式验证 - 支持多种元数据类型配置 - 支持通配符配置 3. **API 版本选择** - API 版本列表展示 - API 版本验证 - API 版本友好显示 4. **调度类型选择** - 支持 Manual 和 Cron 两种调度类型 - 调度类型验证 - 调度类型友好显示 5. **Cron 表达式配置** - Cron 表达式编辑 - Cron 表达式验证 - Cron 表达式预览 6. **任务验证功能** - package.xml 格式验证 - Cron 表达式验证 - 验证失败返回详细错误信息 ### 实现要求 #### 1. 数据模型 根据 ADR-0013 中定义的数据模型,创建以下实体类: ```java @Data @TableName("datai_meta_task") public class DataiMetaTask { @TableId(type = IdType.AUTO) private Long id; private String taskName; private String taskType; private Long orgConfigId; @TableField(type = DbType.TEXT) private String packageXml; private String apiVersion; private String scheduleType; private String cronExpression; private String status; private String description; private String createdBy; private LocalDateTime createdTime; private String updatedBy; private LocalDateTime updatedTime; } ``` #### 2. Mapper 接口 ```java @Mapper public interface DataiMetaTaskMapper extends BaseMapper { /** * 查询任务列表 */ IPage selectTaskPage(Page page, @Param("taskName") String taskName, @Param("taskType") String taskType, @Param("status") String status); /** * 根据组织配置ID查询任务 */ List selectByOrgConfigId(@Param("orgConfigId") Long orgConfigId); } ``` #### 3. Service 层 ```java @Service public class DataiMetaTaskServiceImpl implements IDataiMetaTaskService { @Autowired private DataiMetaTaskMapper taskMapper; @Autowired private PackageXmlValidator packageXmlValidator; @Autowired private CronExpressionValidator cronValidator; /** * 创建任务 */ @Override @Transactional public Long createTask(DataiMetaTask task) { // 验证 package.xml ValidationResult xmlValidation = packageXmlValidator.validate(task.getPackageXml()); if (!xmlValidation.isSuccess()) { throw new BusinessException(xmlValidation.getErrorMessage()); } // 验证 Cron 表达式(如果是 Cron 调度) if ("Cron".equals(task.getScheduleType())) { ValidationResult cronValidation = cronValidator.validate(task.getCronExpression()); if (!cronValidation.isSuccess()) { throw new BusinessException(cronValidation.getErrorMessage()); } } // 设置默认状态 task.setStatus("Active"); task.setCreatedTime(LocalDateTime.now()); task.setUpdatedTime(LocalDateTime.now()); // 保存任务 taskMapper.insert(task); return task.getId(); } /** * 更新任务 */ @Override @Transactional public void updateTask(DataiMetaTask task) { // 验证 package.xml ValidationResult xmlValidation = packageXmlValidator.validate(task.getPackageXml()); if (!xmlValidation.isSuccess()) { throw new BusinessException(xmlValidation.getErrorMessage()); } // 验证 Cron 表达式(如果是 Cron 调度) if ("Cron".equals(task.getScheduleType())) { ValidationResult cronValidation = cronValidator.validate(task.getCronExpression()); if (!cronValidation.isSuccess()) { throw new BusinessException(cronValidation.getErrorMessage()); } } // 更新任务 task.setUpdatedTime(LocalDateTime.now()); taskMapper.updateById(task); } /** * 删除任务 */ @Override @Transactional public void deleteTask(Long id) { taskMapper.deleteById(id); } /** * 查询任务列表 */ @Override public IPage selectTaskPage(Integer pageNum, Integer pageSize, String taskName, String taskType, String status) { Page page = new Page<>(pageNum, pageSize); QueryWrapper wrapper = new QueryWrapper<>(); if (StringUtils.isNotBlank(taskName)) { wrapper.like("taskName", taskName); } if (StringUtils.isNotBlank(taskType)) { wrapper.eq("taskType", taskType); } if (StringUtils.isNotBlank(status)) { wrapper.eq("status", status); } wrapper.orderByDesc("createdTime"); return taskMapper.selectTaskPage(page, taskName, taskType, status); } /** * 验证任务 */ @Override public ValidationResult validateTask(DataiMetaTask task) { // 验证 package.xml ValidationResult xmlValidation = packageXmlValidator.validate(task.getPackageXml()); if (!xmlValidation.isSuccess()) { return xmlValidation; } // 验证 Cron 表达式(如果是 Cron 调度) if ("Cron".equals(task.getScheduleType())) { ValidationResult cronValidation = cronValidator.validate(task.getCronExpression()); if (!cronValidation.isSuccess()) { return cronValidation; } } return ValidationResult.success(); } } ``` #### 4. Controller 层 ```java @RestController @RequestMapping("/metadata/task") public class DataiMetaTaskController { @Autowired private IDataiMetaTaskService taskService; /** * 创建任务 */ @PostMapping public Result createTask(@Valid @RequestBody DataiMetaTask task) { Long taskId = taskService.createTask(task); return Result.success(taskId); } /** * 更新任务 */ @PutMapping("/{id}") public Result updateTask(@PathVariable Long id, @Valid @RequestBody DataiMetaTask task) { task.setId(id); taskService.updateTask(task); return Result.success(); } /** * 删除任务 */ @DeleteMapping("/{id}") public Result deleteTask(@PathVariable Long id) { taskService.deleteTask(id); return Result.success(); } /** * 查询任务列表 */ @GetMapping("/list") public Result> list( @RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize, @RequestParam(required = false) String taskName, @RequestParam(required = false) String taskType, @RequestParam(required = false) String status) { IPage page = taskService.selectTaskPage(pageNum, pageSize, taskName, taskType, status); return Result.success(page); } /** * 查询任务详情 */ @GetMapping("/{id}") public Result getTask(@PathVariable Long id) { DataiMetaTask task = taskService.getById(id); return Result.success(task); } /** * 验证任务 */ @PostMapping("/{id}/validate") public Result validateTask(@PathVariable Long id) { DataiMetaTask task = taskService.getById(id); ValidationResult result = taskService.validateTask(task); return Result.success(result); } } ``` #### 5. package.xml 验证器 ```java @Component public class PackageXmlValidator { private static final List SUPPORTED_METADATA_TYPES = Arrays.asList( "CustomObject", "CustomField", "ApexClass", "ApexTrigger", "Layout", "Workflow", "ValidationRule", "Flow" ); public ValidationResult validate(String packageXml) { try { // 解析 XML DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new InputSource(new StringReader(packageXml))); // 验证根元素 NodeList types = doc.getElementsByTagName("types"); if (types.getLength() == 0) { return ValidationResult.error("package.xml 必须包含 types 元素"); } // 验证元数据类型 for (int i = 0; i < types.getLength(); i++) { Element type = (Element) types.item(i); String typeName = type.getTextContent(); if (!isSupportedMetadataType(typeName)) { return ValidationResult.error("不支持的元数据类型: " + typeName); } } return ValidationResult.success(); } catch (Exception e) { return ValidationResult.error("package.xml 格式错误: " + e.getMessage()); } } private boolean isSupportedMetadataType(String typeName) { return SUPPORTED_METADATA_TYPES.contains(typeName); } } ``` #### 6. Cron 表达式验证器 ```java @Component public class CronExpressionValidator { public ValidationResult validate(String cronExpression) { try { // 使用 Quartz 的 CronExpression 验证 CronExpression cron = new CronExpression(cronExpression); // 验证是否有效 if (!cron.isValid()) { return ValidationResult.error("Cron 表达式格式错误"); } // 验证是否能够计算下次执行时间 Date nextValidTime = cron.getNextValidTimeAfter(new Date()); if (nextValidTime == null) { return ValidationResult.error("Cron 表达式无法计算下次执行时间"); } return ValidationResult.success(nextValidTime); } catch (Exception e) { return ValidationResult.error("Cron 表达式解析错误: " + e.getMessage()); } } } ``` #### 7. 前端组件 ```vue ``` ### 输出格式 #### 1. 代码结构 ``` datai-salesforce-metadata/ ├── src/main/java/com/datai/metadata/ │ ├── controller/ │ │ └── DataiMetaTaskController.java │ ├── service/ │ │ ├── IDataiMetaTaskService.java │ │ └── impl/ │ │ └── DataiMetaTaskServiceImpl.java │ ├── mapper/ │ │ └── DataiMetaTaskMapper.java │ ├── entity/ │ │ └── DataiMetaTask.java │ └── validator/ │ ├── PackageXmlValidator.java │ └── CronExpressionValidator.java └── src/main/resources/ └── mapper/ └── DataiMetaTaskMapper.xml ``` #### 2. 单元测试 必须为以下类编写单元测试: - DataiMetaTaskServiceImpl - PackageXmlValidator - CronExpressionValidator - DataiMetaTaskController #### 3. 集成测试 必须编写以下集成测试: - 任务 CRUD 操作 - package.xml 验证 - Cron 表达式验证 - API 接口测试 #### 4. API 文档 必须为以下接口编写 API 文档: - POST /metadata/task - 创建任务 - PUT /metadata/task/{id} - 更新任务 - DELETE /metadata/task/{id} - 删除任务 - GET /metadata/task/list - 查询任务列表 - GET /metadata/task/{id} - 查询任务详情 - POST /metadata/task/{id}/validate - 验证任务 ### 注意事项 1. **package.xml 存储**: 使用 TEXT 类型存储,避免 VARCHAR 长度限制 2. **Cron 表达式**: 使用 Quartz 库进行验证,确保格式正确 3. **事务管理**: 创建、更新、删除操作必须使用 @Transactional 注解 4. **参数验证**: 使用 @Valid 注解进行参数验证 5. **异常处理**: 使用统一的异常处理机制,返回友好的错误信息 6. **日志记录**: 记录关键操作的日志,便于问题排查 7. **权限控制**: 根据用户权限控制任务的访问和操作 ### 参考资料 - [REQ-010-4.md](../requirements/REQ-010-4.md) - 元数据任务定义管理需求 - [ADR-0013.md](../decisions/adr/0013-task-definition-management.md) - 元数据任务定义管理架构决策 - [metadata-module.md](../reference-code/com/docs/metadata-module.md) - Salesforce Metadata API 模块说明 - [Authentication.canvas](../Authentication.canvas) - 项目架构视觉化展示