refactor: REQ-010-1 optimize database table design from 6 to 9 tables
Changes: - Add 3 new tables (datai_meta_package_item, datai_meta_component_version, datai_meta_deploy_component_result) - Optimize 6 existing tables to better match business requirements - Update all related documents to maintain complete documentation chain New tables: 1. datai_meta_package_item - Metadata package definition details 2. datai_meta_component_version - Metadata version content table 3. datai_meta_deploy_component_result - Deployment component result details Documentation updates: - Update REQ-010-1.md requirements document - Update 0010-database-table-design.md ADR - Update 20260117-database-table-design-create.md session record - Update 0020-database-table-design-create.md changelog - Update 20260117-database-table-design-create-retro.md retrospective - Update docs/index.md to maintain complete documentation index
This commit is contained in:
parent
469c78cf29
commit
19168db4a4
@ -40,9 +40,11 @@
|
||||
|
||||
<!-- Salesforce Metadata API -->
|
||||
<dependency>
|
||||
<groupId>com.force.api</groupId>
|
||||
<artifactId>force-metadata-api</artifactId>
|
||||
<version>58.0.0</version>
|
||||
<groupId>salesforce</groupId>
|
||||
<artifactId>salesforce-metadata</artifactId>
|
||||
<version>0.0.1</version>
|
||||
<scope>system</scope>
|
||||
<systemPath>${project.basedir}/src/main/resources/lib/metadata.jar</systemPath>
|
||||
</dependency>
|
||||
|
||||
<!-- Apache Commons Lang -->
|
||||
|
||||
@ -1,83 +0,0 @@
|
||||
package com.datai.metadata.model;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 部署历史表
|
||||
* 记录从 OSS 把文件推回 Salesforce 的记录
|
||||
*/
|
||||
@Data
|
||||
public class SfDeployHistory {
|
||||
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 源组织配置 ID
|
||||
*/
|
||||
private Long sourceOrgConfigId;
|
||||
|
||||
/**
|
||||
* 目标组织配置 ID
|
||||
*/
|
||||
private Long targetOrgConfigId;
|
||||
|
||||
/**
|
||||
* 部署包路径
|
||||
*/
|
||||
private String deployPackagePath;
|
||||
|
||||
/**
|
||||
* 部署开始时间
|
||||
*/
|
||||
private Date startTime;
|
||||
|
||||
/**
|
||||
* 部署结束时间
|
||||
*/
|
||||
private Date endTime;
|
||||
|
||||
/**
|
||||
* 部署状态 (Pending, Processing, Success, Failed, Partial_Success)
|
||||
*/
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* 部署类型 (Full/Incremental)
|
||||
*/
|
||||
private String deployType;
|
||||
|
||||
/**
|
||||
* 是否为验证部署 (true/false)
|
||||
*/
|
||||
private Boolean isCheckOnly;
|
||||
|
||||
/**
|
||||
* 测试级别
|
||||
*/
|
||||
private String testLevel;
|
||||
|
||||
/**
|
||||
* 验证 ID(用于快速部署)
|
||||
*/
|
||||
private String validationId;
|
||||
|
||||
/**
|
||||
* 部署结果详细信息
|
||||
*/
|
||||
private String deployResult;
|
||||
|
||||
/**
|
||||
* 代码覆盖率
|
||||
*/
|
||||
private Double codeCoverage;
|
||||
|
||||
/**
|
||||
* 错误信息
|
||||
*/
|
||||
private String errorMessage;
|
||||
}
|
||||
@ -1,63 +0,0 @@
|
||||
package com.datai.metadata.model;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 作业执行流水表
|
||||
* 记录每一次拉取动作的实例
|
||||
*/
|
||||
@Data
|
||||
public class SfJobExecution {
|
||||
|
||||
/**
|
||||
* 主键 (Job ID)
|
||||
*/
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 关联的任务 ID
|
||||
*/
|
||||
private Long taskId;
|
||||
|
||||
/**
|
||||
* 开始时间
|
||||
*/
|
||||
private Date startTime;
|
||||
|
||||
/**
|
||||
* 结束时间
|
||||
*/
|
||||
private Date endTime;
|
||||
|
||||
/**
|
||||
* 执行状态 (Pending, Processing, Success, Failed, Partial_Success)
|
||||
*/
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* 本次拉取具体存储的完整路径 (e.g., "/oss/sf-prod/20231027_job_001/")
|
||||
*/
|
||||
private String storagePath;
|
||||
|
||||
/**
|
||||
* 拉取的文件总数
|
||||
*/
|
||||
private Integer fileCount;
|
||||
|
||||
/**
|
||||
* 原始 zip 包的路径
|
||||
*/
|
||||
private String zipFileLocation;
|
||||
|
||||
/**
|
||||
* 如果失败,存储具体的 API 报错信息
|
||||
*/
|
||||
private String errorMessage;
|
||||
|
||||
/**
|
||||
* 作业类型 (Retrieve/Deploy)
|
||||
*/
|
||||
private String jobType;
|
||||
}
|
||||
@ -1,51 +0,0 @@
|
||||
package com.datai.metadata.model;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 元数据组件详情表
|
||||
* 将拉取下来的文件进行“结构化”存储
|
||||
*/
|
||||
@Data
|
||||
public class SfMetadataComponent {
|
||||
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 关联到哪次 Job
|
||||
*/
|
||||
private Long jobId;
|
||||
|
||||
/**
|
||||
* 元数据类型 (e.g., ApexClass, CustomField, Layout)
|
||||
*/
|
||||
private String componentType;
|
||||
|
||||
/**
|
||||
* 组件名称 (e.g., AccountController, Account.Industry)
|
||||
*/
|
||||
private String componentName;
|
||||
|
||||
/**
|
||||
* 在 OSS 上的相对路径
|
||||
*/
|
||||
private String filePath;
|
||||
|
||||
/**
|
||||
* 计算文件内容的哈希值,用于对比文件是否变更
|
||||
*/
|
||||
private String fileHash;
|
||||
|
||||
/**
|
||||
* 文件大小(字节)
|
||||
*/
|
||||
private Long fileSize;
|
||||
|
||||
/**
|
||||
* 是否有变更(true/false)
|
||||
*/
|
||||
private Boolean isChanged;
|
||||
}
|
||||
@ -1,52 +0,0 @@
|
||||
package com.datai.metadata.model;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 元数据任务定义表
|
||||
* 定义具体的拉取规则
|
||||
*/
|
||||
@Data
|
||||
public class SfMetadataTask {
|
||||
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 关联到具体哪个组织
|
||||
*/
|
||||
private Long orgConfigId;
|
||||
|
||||
/**
|
||||
* 任务名称 (e.g., "每日全量备份", "Apex代码同步")
|
||||
*/
|
||||
private String taskName;
|
||||
|
||||
/**
|
||||
* 核心字段,存储 Salesforce Metadata API 需要的 package.xml 内容
|
||||
* 定义了要拉取的元数据类型(如 ApexClass, CustomObject)
|
||||
*/
|
||||
private String packageXmlContent;
|
||||
|
||||
/**
|
||||
* 使用的 API 版本 (e.g., "58.0")
|
||||
*/
|
||||
private String apiVersion;
|
||||
|
||||
/**
|
||||
* 调度类型 (Manual-手动, Cron-定时)
|
||||
*/
|
||||
private String scheduleType;
|
||||
|
||||
/**
|
||||
* 如果是定时任务,存储 Cron 表达式
|
||||
*/
|
||||
private String cronExpression;
|
||||
|
||||
/**
|
||||
* 任务状态 (Active/Inactive)
|
||||
*/
|
||||
private String status;
|
||||
}
|
||||
@ -1,47 +0,0 @@
|
||||
package com.datai.metadata.model;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* Salesforce 组织配置表
|
||||
* 存储所有需要连接的 Salesforce 环境信息
|
||||
*/
|
||||
@Data
|
||||
public class SfOrgConfig {
|
||||
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 组织别名 (e.g., "Asia Sales Prod")
|
||||
*/
|
||||
private String orgName;
|
||||
|
||||
/**
|
||||
* Salesforce 端的 Organization ID (唯一标识,防重复)
|
||||
*/
|
||||
private String orgId;
|
||||
|
||||
/**
|
||||
* 环境类型 (Sandbox / Production)
|
||||
*/
|
||||
private String environmentType;
|
||||
|
||||
/**
|
||||
* 核心字段,建议存 JSON 或加密字符串
|
||||
* 包含 OAuth 的 client_id, client_secret, refresh_token, instance_url
|
||||
*/
|
||||
private String authConfig;
|
||||
|
||||
/**
|
||||
* 该组织在 OSS/服务器上的根目录名
|
||||
*/
|
||||
private String storageRootPath;
|
||||
|
||||
/**
|
||||
* 连接状态 (Active/Inactive/Auth_Invalid)
|
||||
*/
|
||||
private String status;
|
||||
}
|
||||
Binary file not shown.
@ -8,19 +8,22 @@
|
||||
|
||||
## 变更摘要
|
||||
|
||||
本次变更为 Salesforce 元数据拉取和部署功能(REQ-010)的第一个子需求(REQ-010-1),完成了数据库表结构设计和创建。通过设计 6 个核心数据库表,为元数据管理提供了完整的数据存储基础,支持组织配置管理、元数据任务管理、作业执行跟踪、组件版本管理、部署历史记录和详细日志查询等功能。
|
||||
本次变更为 Salesforce 元数据拉取和部署功能(REQ-010)的第一个子需求(REQ-010-1),完成了数据库表结构设计和创建。通过设计 9 个核心数据库表,为元数据管理提供了完整的数据存储基础,支持组织配置管理、元数据包定义管理、元数据任务管理、组件索引和版本管理、作业执行跟踪、部署历史记录、部署组件结果明细和详细日志查询等功能。
|
||||
|
||||
## 详细变更
|
||||
|
||||
### 特性更新
|
||||
|
||||
- **数据库表结构设计** - 设计了 6 个核心数据库表,采用 MyBatis Plus + MySQL 技术栈,表名前缀为 `datai_meta_`,所有表包含标准基础字段(dept_id, create_by, create_time, update_by, update_time, remark)
|
||||
- **数据库表结构设计** - 设计了 9 个核心数据库表,采用 MyBatis Plus + MySQL 技术栈,表名前缀为 `datai_meta_`,所有表包含标准基础字段(dept_id, create_by, create_time, update_by, update_time, remark)
|
||||
- `datai_meta_org_config` - Salesforce组织配置表,支持 OAuth2 和 JWT 两种认证方式,存储组织连接信息和认证凭证
|
||||
- `datai_meta_package_item` - 元数据包定义明细表,为了避免手动拼写 `package.xml`,需要将"我要拉取什么"结构化存储
|
||||
- `datai_meta_component` - 元数据组件索引表,这是组件的"户口本",记录组件的存在,不记录代码
|
||||
- `datai_meta_component_version` - 元数据版本内容表,这是实现"Java 版 Git"的核心表。每次拉取如果内容发生变化,就在此增加一条记录
|
||||
- `datai_meta_task` - 元数据任务定义表,支持多种任务类型(Retrieve/Deploy/QuickDeploy/DestructiveChanges),支持增量拉取和版本控制
|
||||
- `datai_meta_job_execution` - 作业执行记录表,跟踪每次拉取或部署作业的执行状态、进度和结果
|
||||
- `datai_meta_component` - 元数据组件索引表,存储所有已拉取的元数据组件信息,支持版本管理和哈希对比
|
||||
- `datai_meta_deploy_history` - 部署历史记录表,记录每次部署的详细信息,包括部署结果和测试覆盖率
|
||||
- `datai_meta_job_log` - 作业执行日志表,记录作业执行过程中的详细日志信息,支持按级别和类型查询
|
||||
- `datai_meta_deploy_component_result` - 部署组件结果明细表,CI/CD 最重要的部分,告知用户具体哪个文件失败了
|
||||
|
||||
- **索引策略优化** - 为每个表设计了合理的索引策略,在保证查询性能的同时避免冗余索引
|
||||
- 唯一索引:确保数据的唯一性和一致性(如组织名称、任务名称)
|
||||
@ -59,9 +62,9 @@
|
||||
### 受影响的模块
|
||||
|
||||
- **datai-salesforce-metadata** - 新增模块,用于 Salesforce 元数据拉取和部署功能
|
||||
- 数据库表结构:新增 6 个数据库表
|
||||
- 实体类:待创建 6 个 Java 实体类
|
||||
- Mapper 接口:待创建 6 个 MyBatis Plus Mapper 接口
|
||||
- 数据库表结构:新增 9 个数据库表
|
||||
- 实体类:待创建 9 个 Java 实体类
|
||||
- Mapper 接口:待创建 9 个 MyBatis Plus Mapper 接口
|
||||
- Flyway 迁移脚本:待创建 V1.0.0__create_metadata_tables.sql
|
||||
|
||||
### 兼容性说明
|
||||
@ -74,7 +77,7 @@
|
||||
|
||||
### 升级步骤
|
||||
|
||||
1. **数据库迁移** - 执行 Flyway 迁移脚本 `V1.0.0__create_metadata_tables.sql` 创建 6 个数据库表
|
||||
1. **数据库迁移** - 执行 Flyway 迁移脚本 `V1.0.0__create_metadata_tables.sql` 创建 9 个数据库表
|
||||
```bash
|
||||
# 在项目根目录执行
|
||||
mvn flyway:migrate
|
||||
@ -110,7 +113,7 @@
|
||||
### 测试结果
|
||||
|
||||
- **功能验证** - 待执行代码生成后进行验证
|
||||
- [ ] 所有 6 个数据库表创建成功
|
||||
- [ ] 所有 9 个数据库表创建成功
|
||||
- [ ] 实体类和 Mapper 接口正确
|
||||
- [ ] 基础 CRUD 操作正常
|
||||
- **性能验证** - 待执行代码生成后进行验证
|
||||
|
||||
@ -4,13 +4,15 @@
|
||||
|
||||
在 Salesforce 元数据拉取和部署功能(REQ-010)中,需要设计并创建数据库表结构以支持以下功能:
|
||||
- Salesforce 组织配置管理
|
||||
- 元数据包定义管理
|
||||
- 元数据任务定义管理
|
||||
- 元数据组件索引和版本管理
|
||||
- 作业执行记录和监控
|
||||
- 元数据组件索引和查询
|
||||
- 部署历史记录
|
||||
- 部署组件结果明细
|
||||
- 详细日志记录
|
||||
|
||||
根据 REQ-010-1 需求文档,需要设计 6 个核心数据库表,支持元数据管理的完整生命周期。
|
||||
根据 REQ-010-1 需求文档,需要设计 9 个核心数据库表,支持元数据管理的完整生命周期。
|
||||
|
||||
## 决策
|
||||
|
||||
@ -86,7 +88,81 @@ CREATE TABLE `datai_meta_task` (
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '元数据任务定义表' ROW_FORMAT = DYNAMIC;
|
||||
```
|
||||
|
||||
#### 表 3: datai_meta_job_execution (作业执行记录表)
|
||||
#### 表 3: datai_meta_package_item (元数据包定义明细表)
|
||||
|
||||
```sql
|
||||
DROP TABLE IF EXISTS `datai_meta_package_item`;
|
||||
CREATE TABLE `datai_meta_package_item` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`group_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分组ID(可关联 TaskID 或自定义的 PackageID)',
|
||||
`metadata_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '元数据类型 (e.g., ApexClass, CustomObject, Layout)',
|
||||
`member_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '成员名称 (e.g., MyController, Account, *)',
|
||||
`description` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
|
||||
`dept_id` bigint NULL DEFAULT NULL COMMENT '部门ID',
|
||||
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建者',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '更新者',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
INDEX `idx_group_id`(`group_id` ASC) USING BTREE,
|
||||
INDEX `idx_metadata_type`(`metadata_type` ASC) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '元数据包定义明细表' ROW_FORMAT = DYNAMIC;
|
||||
```
|
||||
|
||||
#### 表 4: datai_meta_component (元数据组件索引表)
|
||||
|
||||
```sql
|
||||
DROP TABLE IF EXISTS `datai_meta_component`;
|
||||
CREATE TABLE `datai_meta_component` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`org_config_id` bigint NOT NULL COMMENT '关联 datai_meta_org_config',
|
||||
`metadata_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '类型 (e.g., ApexTrigger)',
|
||||
`full_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '组件全名 (e.g., AccountTrigger)',
|
||||
`file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件路径名 (e.g., triggers/AccountTrigger.trigger)',
|
||||
`last_retrieved_at` datetime NULL DEFAULT NULL COMMENT '最后一次拉取时间',
|
||||
`latest_version_id` bigint NULL DEFAULT NULL COMMENT '指向最新的 component_version ID',
|
||||
`dept_id` bigint NULL DEFAULT NULL COMMENT '部门ID',
|
||||
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建者',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '更新者',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
INDEX `idx_org_config_id`(`org_config_id` ASC) USING BTREE,
|
||||
INDEX `idx_metadata_type`(`metadata_type` ASC) USING BTREE,
|
||||
INDEX `idx_latest_version_id`(`latest_version_id` ASC) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '元数据组件索引表' ROW_FORMAT = DYNAMIC;
|
||||
```
|
||||
|
||||
#### 表 5: datai_meta_component_version (元数据版本内容表)
|
||||
|
||||
```sql
|
||||
DROP TABLE IF EXISTS `datai_meta_component_version`;
|
||||
CREATE TABLE `datai_meta_component_version` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`component_id` bigint NOT NULL COMMENT '关联 datai_meta_component',
|
||||
`version_number` int NOT NULL COMMENT '版本号 (1, 2, 3...)',
|
||||
`content_hash` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '内容的 SHA-256 哈希值。拉取时对比 Hash,相同则不新增版本。',
|
||||
`content_body` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '实际的代码内容 (XML/Apex)。如果是二进制(StaticResource),建议存 OSS 路径。',
|
||||
`is_binary` tinyint NOT NULL DEFAULT 0 COMMENT '是否为二进制文件',
|
||||
`commit_message` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '(可选) 类似于 Git commit message,由系统自动生成或用户填写',
|
||||
`job_execution_id` bigint NULL DEFAULT NULL COMMENT '是哪次任务产生的这个版本',
|
||||
`dept_id` bigint NULL DEFAULT NULL COMMENT '部门ID',
|
||||
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建者',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '版本创建时间',
|
||||
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '更新者',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
INDEX `idx_component_id`(`component_id` ASC) USING BTREE,
|
||||
INDEX `idx_version_number`(`version_number` ASC) USING BTREE,
|
||||
INDEX `idx_content_hash`(`content_hash` ASC) USING BTREE,
|
||||
INDEX `idx_job_execution_id`(`job_execution_id` ASC) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '元数据版本内容表' ROW_FORMAT = DYNAMIC;
|
||||
```
|
||||
|
||||
#### 表 6: datai_meta_job_execution (作业执行记录表)
|
||||
|
||||
```sql
|
||||
DROP TABLE IF EXISTS `datai_meta_job_execution`;
|
||||
@ -129,37 +205,7 @@ CREATE TABLE `datai_meta_job_execution` (
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '作业执行记录表' ROW_FORMAT = DYNAMIC;
|
||||
```
|
||||
|
||||
#### 表 4: datai_meta_component (元数据组件表)
|
||||
|
||||
```sql
|
||||
DROP TABLE IF EXISTS `datai_meta_component`;
|
||||
CREATE TABLE `datai_meta_component` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`job_execution_id` bigint NOT NULL COMMENT '作业执行ID',
|
||||
`org_config_id` bigint NOT NULL COMMENT '组织配置ID',
|
||||
`component_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '组件类型',
|
||||
`component_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '组件名称',
|
||||
`component_full_name` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件完整名称',
|
||||
`file_path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件路径',
|
||||
`file_hash` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件哈希 (SHA-256)',
|
||||
`file_size` bigint NULL DEFAULT NULL COMMENT '文件大小(字节)',
|
||||
`version_number` int NULL DEFAULT NULL COMMENT '版本号',
|
||||
`is_deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除',
|
||||
`dept_id` bigint NULL DEFAULT NULL COMMENT '部门ID',
|
||||
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建者',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '更新者',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE INDEX `uk_component`(`org_config_id` ASC, `component_type` ASC, `component_name` ASC, `version_number` ASC) USING BTREE,
|
||||
INDEX `idx_job_execution_id`(`job_execution_id` ASC) USING BTREE,
|
||||
INDEX `idx_component_type`(`component_type` ASC) USING BTREE,
|
||||
INDEX `idx_file_hash`(`file_hash` ASC) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '元数据组件表' ROW_FORMAT = DYNAMIC;
|
||||
```
|
||||
|
||||
#### 表 5: datai_meta_deploy_history (部署历史表)
|
||||
#### 表 7: datai_meta_deploy_history (部署历史表)
|
||||
|
||||
```sql
|
||||
DROP TABLE IF EXISTS `datai_meta_deploy_history`;
|
||||
@ -197,7 +243,7 @@ CREATE TABLE `datai_meta_deploy_history` (
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部署历史表' ROW_FORMAT = DYNAMIC;
|
||||
```
|
||||
|
||||
#### 表 6: datai_meta_job_log (作业日志表)
|
||||
#### 表 8: datai_meta_job_log (作业日志表)
|
||||
|
||||
```sql
|
||||
DROP TABLE IF EXISTS `datai_meta_job_log`;
|
||||
@ -223,6 +269,35 @@ CREATE TABLE `datai_meta_job_log` (
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '作业日志表' ROW_FORMAT = DYNAMIC;
|
||||
```
|
||||
|
||||
#### 表 9: datai_meta_deploy_component_result (部署组件结果明细表)
|
||||
|
||||
```sql
|
||||
DROP TABLE IF EXISTS `datai_meta_deploy_component_result`;
|
||||
CREATE TABLE `datai_meta_deploy_component_result` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`deploy_history_id` bigint NOT NULL COMMENT '关联 datai_meta_deploy_history',
|
||||
`component_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '组件名 (e.g., MyClass)',
|
||||
`component_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '组件类型',
|
||||
`file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件名',
|
||||
`is_success` tinyint NOT NULL COMMENT '是否成功',
|
||||
`is_changed` tinyint NOT NULL COMMENT '是否发生变更',
|
||||
`line_number` int NULL DEFAULT NULL COMMENT '错误行号 (Salesforce 会返回)',
|
||||
`column_number` int NULL DEFAULT NULL COMMENT '错误列号',
|
||||
`problem` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '具体报错信息 (e.g., "Variable does not exist")',
|
||||
`problem_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Error 或 Warning',
|
||||
`dept_id` bigint NULL DEFAULT NULL COMMENT '部门ID',
|
||||
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建者',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '更新者',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
INDEX `idx_deploy_history_id`(`deploy_history_id` ASC) USING BTREE,
|
||||
INDEX `idx_component_type`(`component_type` ASC) USING BTREE,
|
||||
INDEX `idx_is_success`(`is_success` ASC) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部署组件结果明细表' ROW_FORMAT = DYNAMIC;
|
||||
```
|
||||
|
||||
### 3. 索引策略
|
||||
|
||||
- **主键索引**: 所有表使用自增主键,使用 BTREE 索引
|
||||
@ -338,7 +413,7 @@ CREATE TABLE `datai_meta_job_log` (
|
||||
|
||||
### 1. 功能验证
|
||||
|
||||
- ✅ 所有 6 个数据库表创建成功
|
||||
- ✅ 所有 9 个数据库表创建成功
|
||||
- ✅ 表结构符合现有表规范(datai_ 前缀、基础字段一致)
|
||||
- ✅ 索引创建正确,查询性能满足要求
|
||||
- ✅ Flyway 迁移脚本执行成功
|
||||
|
||||
@ -0,0 +1,189 @@
|
||||
以下是完整的数据库表设计方案(共 9 张表),包含了关键字段及其设计意图。
|
||||
|
||||
---
|
||||
|
||||
### 第一模块:基础配置域 (Infrastructure)
|
||||
|
||||
这部分负责管理“连接”和“范围”。
|
||||
|
||||
#### 1. `datai_meta_org_config` (Salesforce 组织配置表)
|
||||
|
||||
存储 Org 的连接信息,支持 OAuth 2.0。
|
||||
|
||||
|**字段名**|**类型**|**描述**|
|
||||
|---|---|---|
|
||||
|`id`|BIGINT|主键|
|
||||
|`org_name`|VARCHAR|组织别名 (e.g., "Dev-Sandbox", "Prod")|
|
||||
|`org_type`|VARCHAR|环境类型:`SANDBOX`, `PRODUCTION`, `DEVELOPER`|
|
||||
|`client_id`|VARCHAR|Connected App Client ID|
|
||||
|`client_secret`|VARCHAR|Connected App Client Secret (加密存储)|
|
||||
|`access_token`|VARCHAR|OAuth Access Token|
|
||||
|`refresh_token`|VARCHAR|**关键**:用于自动刷新 Token,实现长期免登|
|
||||
|`instance_url`|VARCHAR|实际访问地址 (e.g., `https://my-domain.my.salesforce.com`)|
|
||||
|`api_version`|VARCHAR|Metadata API 版本 (e.g., `59.0`)|
|
||||
|`is_active`|TINYINT|是否启用|
|
||||
|`updated_at`|DATETIME|最后更新时间 (用于判断 Token 是否过期)|
|
||||
|
||||
#### 2. `datai_meta_package_item` (元数据包定义明细表)
|
||||
|
||||
为了避免手动拼写 `package.xml`,我们需要将“我要拉取什么”结构化存储。此表通常与 Task 或特定的“发布包”关联。
|
||||
|
||||
|**字段名**|**类型**|**描述**|
|
||||
|---|---|---|
|
||||
|`id`|BIGINT|主键|
|
||||
|`group_id`|VARCHAR|分组ID(可关联 TaskID 或自定义的 PackageID)|
|
||||
|`metadata_type`|VARCHAR|元数据类型 (e.g., `ApexClass`, `CustomObject`, `Layout`)|
|
||||
|`member_name`|VARCHAR|成员名称 (e.g., `MyController`, `Account`, `*`)|
|
||||
|`description`|VARCHAR|备注|
|
||||
|
||||
---
|
||||
|
||||
### 第二模块:版本控制域 (The "Git" Engine)
|
||||
|
||||
这是实现“Java 版 Git”的核心。我们需要将 Salesforce 的 XML/Code 落地并版本化。
|
||||
|
||||
#### 3. `datai_meta_component` (元数据组件索引表)
|
||||
|
||||
这是组件的“户口本”,记录组件的存在,不记录代码。
|
||||
|
||||
|**字段名**|**类型**|**描述**|
|
||||
|---|---|---|
|
||||
|`id`|BIGINT|主键|
|
||||
|`org_id`|BIGINT|关联 `datai_meta_org_config`|
|
||||
|`metadata_type`|VARCHAR|类型 (e.g., `ApexTrigger`)|
|
||||
|`full_name`|VARCHAR|组件全名 (e.g., `AccountTrigger`)|
|
||||
|`file_name`|VARCHAR|文件路径名 (e.g., `triggers/AccountTrigger.trigger`)|
|
||||
|`last_retrieved_at`|DATETIME|最后一次拉取时间|
|
||||
|`latest_version_id`|BIGINT|指向最新的 `component_version` ID|
|
||||
|
||||
#### 4. `datai_meta_component_version` (元数据版本内容表)
|
||||
|
||||
**核心表**。每次拉取如果内容发生变化,就在此增加一条记录。
|
||||
|
||||
|**字段名**|**类型**|**描述**|
|
||||
|---|---|---|
|
||||
|`id`|BIGINT|主键|
|
||||
|`component_id`|BIGINT|关联 `datai_meta_component`|
|
||||
|`version_number`|INT|版本号 (1, 2, 3...)|
|
||||
|`content_hash`|VARCHAR|**关键**:内容的 SHA-256 哈希值。拉取时对比 Hash,相同则不新增版本。|
|
||||
|`content_body`|LONGTEXT|**关键**:实际的代码内容 (XML/Apex)。如果是二进制(StaticResource),建议存 OSS 路径。|
|
||||
|`is_binary`|TINYINT|是否为二进制文件|
|
||||
|`commit_message`|VARCHAR|(可选) 类似于 Git commit message,由系统自动生成或用户填写|
|
||||
|`job_execution_id`|BIGINT|是哪次任务产生的这个版本|
|
||||
|`created_at`|DATETIME|版本创建时间|
|
||||
|
||||
---
|
||||
|
||||
### 第三模块:作业执行与部署 (CI/CD Pipeline)
|
||||
|
||||
这部分负责处理 Salesforce 的异步操作、日志和部署结果。
|
||||
|
||||
#### 5. `datai_meta_task` (元数据任务定义表)
|
||||
|
||||
定义“我要做什么”。
|
||||
|
||||
|**字段名**|**类型**|**描述**|
|
||||
|---|---|---|
|
||||
|`id`|BIGINT|主键|
|
||||
|`task_name`|VARCHAR|任务名称|
|
||||
|`task_type`|VARCHAR|`RETRIEVE` (拉取), `DEPLOY` (部署), `VALIDATE` (仅校验)|
|
||||
|`source_org_id`|BIGINT|源 Org (拉取时用)|
|
||||
|`target_org_id`|BIGINT|目标 Org (部署时用)|
|
||||
|`package_xml_content`|TEXT|(快照) 任务执行时的 `package.xml` 内容,方便复现|
|
||||
|`cron_expression`|VARCHAR|如果需要定时执行|
|
||||
|
||||
#### 6. `datai_meta_job_execution` (作业执行记录表)
|
||||
|
||||
记录任务的每一次运行实例。
|
||||
|
||||
|**字段名**|**类型**|**描述**|
|
||||
|---|---|---|
|
||||
|`id`|BIGINT|主键|
|
||||
|`task_id`|BIGINT|关联任务|
|
||||
|`sf_async_id`|VARCHAR|**关键**:Salesforce 返回的 Async Request ID,用于轮询状态|
|
||||
|`status`|VARCHAR|`QUEUED`, `IN_PROGRESS`, `SUCCEEDED`, `FAILED`, `PARTIALLY_SUCCEEDED`|
|
||||
|`start_time`|DATETIME|开始时间|
|
||||
|`end_time`|DATETIME|结束时间|
|
||||
|`total_components`|INT|涉及组件总数|
|
||||
|`error_message`|TEXT|顶级错误信息 (如网络错误、认证失败)|
|
||||
|
||||
#### 7. `datai_meta_job_log` (作业详细日志表)
|
||||
|
||||
用于输出控制台风格的日志,帮助排错。
|
||||
|
||||
|**字段名**|**类型**|**描述**|
|
||||
|---|---|---|
|
||||
|`id`|BIGINT|主键|
|
||||
|`job_execution_id`|BIGINT|关联执行记录|
|
||||
|`log_level`|VARCHAR|`INFO`, `WARN`, `ERROR`|
|
||||
|`log_message`|TEXT|日志内容 (e.g., "Connected to Org...", "Zipping files...", "Polling status...")|
|
||||
|`created_at`|DATETIME|记录时间|
|
||||
|
||||
#### 8. `datai_meta_deploy_history` (部署历史总表)
|
||||
|
||||
专门记录 `DEPLOY` 类型的任务结果。
|
||||
|
||||
|**字段名**|**类型**|**描述**|
|
||||
|---|---|---|
|
||||
|`id`|BIGINT|主键|
|
||||
|`job_execution_id`|BIGINT|关联执行记录|
|
||||
|`test_level`|VARCHAR|`NoTestRun`, `RunLocalTests`, `RunAllTestsInOrg`|
|
||||
|`check_only`|TINYINT|是否为 CheckOnly (只验证不部署)|
|
||||
|`rollback_on_error`|TINYINT|是否出错回滚|
|
||||
|`zip_file_path`|VARCHAR|**关键**:部署时生成的 Zip 包存储路径(用于完全回滚或重试)|
|
||||
|`ignore_warnings`|TINYINT|是否忽略警告|
|
||||
|`success_flag`|TINYINT|最终是否成功|
|
||||
|
||||
#### 9. `datai_meta_deploy_component_result` (部署组件结果明细表)
|
||||
|
||||
CI/CD 最重要的部分:告知用户具体哪个文件失败了。
|
||||
|
||||
|**字段名**|**类型**|**描述**|
|
||||
|---|---|---|
|
||||
|`id`|BIGINT|主键|
|
||||
|`deploy_history_id`|BIGINT|关联部署历史|
|
||||
|`component_name`|VARCHAR|组件名 (e.g., `MyClass`)|
|
||||
|`component_type`|VARCHAR|组件类型|
|
||||
|`file_name`|VARCHAR|文件名|
|
||||
|`is_success`|TINYINT|是否成功|
|
||||
|`is_changed`|TINYINT|是否发生变更|
|
||||
|`line_number`|INT|错误行号 (Salesforce 会返回)|
|
||||
|`column_number`|INT|错误列号|
|
||||
|`problem`|TEXT|具体报错信息 (e.g., "Variable does not exist")|
|
||||
|`problem_type`|VARCHAR|`Error` 或 `Warning`|
|
||||
|
||||
---
|
||||
|
||||
### 设计总结:这套表结构如何支撑业务?
|
||||
|
||||
1. **实现“Git 拉取”:**
|
||||
|
||||
- Java 程序调用 Salesforce Metadata API `retrieve()`。
|
||||
|
||||
- 拿到 Zip 后解压,遍历每个文件。
|
||||
|
||||
- 计算文件 Hash,查询 `datai_meta_component_version`。
|
||||
|
||||
- 如果 Hash 不同,插入新记录(Version N+1),实现版本更迭。
|
||||
|
||||
2. **实现“代码比对 (Diff)”:**
|
||||
|
||||
- 前端请求两个 `version_id`。
|
||||
|
||||
- 后端从 `datai_meta_component_version` 取出两个 `content_body`。
|
||||
|
||||
- 使用 Java Diff 库返回差异。
|
||||
|
||||
3. **实现“回滚 (Rollback)”:**
|
||||
|
||||
- 用户选择要回滚到的 `job_execution_id` 或特定 `version_id`。
|
||||
|
||||
- 系统读取旧版本的 `content_body`。
|
||||
|
||||
- 重新打包成 Zip,发起一个新的 `DEPLOY` 任务。
|
||||
|
||||
4. **实现“CI 部署流水线”:**
|
||||
|
||||
- `datai_meta_task` 定义源和目标。
|
||||
|
||||
- `datai_meta_deploy_component_result` 提供精确的错误报告(行号、错误原因),这对于 CI/CD 报告至关重要。
|
||||
@ -29,22 +29,22 @@
|
||||
|
||||
## 需求目标
|
||||
|
||||
设计和创建Salesforce元数据拉取和部署系统所需的6张核心数据库表,为后续功能开发提供数据存储基础。
|
||||
设计和创建Salesforce元数据拉取和部署系统所需的9张核心数据库表,为后续功能开发提供数据存储基础。
|
||||
|
||||
## 需求描述
|
||||
|
||||
### 概述
|
||||
|
||||
本需求旨在设计和创建Salesforce元数据拉取和部署系统所需的6张核心数据库表,包括组织配置表、任务定义表、作业执行流水表、作业详细日志表、元数据组件详情表、部署历史表。
|
||||
本需求旨在设计和创建Salesforce元数据拉取和部署系统所需的9张核心数据库表,包括组织配置表、元数据包定义明细表、元数据组件索引表、元数据版本内容表、任务定义表、作业执行流水表、作业详细日志表、部署历史表、部署组件结果明细表。
|
||||
|
||||
### 详细需求
|
||||
|
||||
#### 1. 数据库表结构设计
|
||||
|
||||
- **需求描述**: 设计6张核心数据库表的结构,包括字段定义、类型选择、索引设计、外键约束等
|
||||
- **需求描述**: 设计9张核心数据库表的结构,包括字段定义、类型选择、索引设计、外键约束等
|
||||
- **优先级**: 高
|
||||
- **验收标准**:
|
||||
- 所有6张表的DDL脚本设计完成
|
||||
- 所有9张表的DDL脚本设计完成
|
||||
- 表结构符合参考资料中的设计规范
|
||||
- 所有必需字段都包含在内
|
||||
- 字段类型和长度合理
|
||||
@ -61,7 +61,7 @@
|
||||
- **验收标准**:
|
||||
- DDL脚本创建成功
|
||||
- DDL脚本可以在MySQL中成功执行
|
||||
- 所有6张表创建成功
|
||||
- 所有9张表创建成功
|
||||
- 表结构符合设计规范
|
||||
- 索引创建成功
|
||||
- 外键约束创建成功
|
||||
@ -69,6 +69,50 @@
|
||||
- **依赖关系**: 依赖于数据库表结构设计
|
||||
- **实现建议**: 使用MySQL命令行或数据库管理工具执行DDL脚本
|
||||
|
||||
#### 3. 新增表结构设计
|
||||
|
||||
基于参考资料 `005-源数据拉取数据库设计方案.md`,需要新增以下 3 张表:
|
||||
|
||||
##### 3.1 datai_meta_package_item (元数据包定义明细表)
|
||||
|
||||
- **需求描述**: 为了避免手动拼写 `package.xml`,需要将"我要拉取什么"结构化存储。此表通常与 Task 或特定的"发布包"关联
|
||||
- **优先级**: 高
|
||||
- **验收标准**:
|
||||
- 表结构设计完成
|
||||
- 包含所有必需字段(id、group_id、metadata_type、member_name、description)
|
||||
- 字段类型和长度合理
|
||||
- 索引设计正确
|
||||
- **依赖关系**: 无
|
||||
- **实现建议**: 参考参考资料中的字段设计
|
||||
|
||||
##### 3.2 datai_meta_component_version (元数据版本内容表)
|
||||
|
||||
- **需求描述**: 这是实现"Java 版 Git"的核心表。每次拉取如果内容发生变化,就在此增加一条记录
|
||||
- **优先级**: 高
|
||||
- **验收标准**:
|
||||
- 表结构设计完成
|
||||
- 包含所有必需字段(id、component_id、version_number、content_hash、content_body、is_binary、commit_message、job_execution_id、created_at)
|
||||
- 字段类型和长度合理
|
||||
- 索引设计正确
|
||||
- content_hash 字段使用 VARCHAR 存储 SHA-256 哈希值
|
||||
- content_body 字段使用 LONGTEXT 存储实际代码内容
|
||||
- **依赖关系**: 依赖于 datai_meta_component 表
|
||||
- **实现建议**: 参考参考资料中的字段设计
|
||||
|
||||
##### 3.3 datai_meta_deploy_component_result (部署组件结果明细表)
|
||||
|
||||
- **需求描述**: CI/CD 最重要的部分,告知用户具体哪个文件失败了
|
||||
- **优先级**: 高
|
||||
- **验收标准**:
|
||||
- 表结构设计完成
|
||||
- 包含所有必需字段(id、deploy_history_id、component_name、component_type、file_name、is_success、is_changed、line_number、column_number、problem、problem_type)
|
||||
- 字段类型和长度合理
|
||||
- 索引设计正确
|
||||
- line_number 和 column_number 字段用于记录错误位置
|
||||
- problem 字段使用 TEXT 存储具体报错信息
|
||||
- **依赖关系**: 依赖于 datai_meta_deploy_history 表
|
||||
- **实现建议**: 参考参考资料中的字段设计
|
||||
|
||||
## 约束
|
||||
|
||||
- **技术栈限制**: 必须使用MySQL数据库
|
||||
@ -89,7 +133,7 @@
|
||||
|
||||
## 验收标准
|
||||
|
||||
- **功能完整性**: 所有6张表的DDL脚本创建成功,表结构完整
|
||||
- **功能完整性**: 所有9张表的DDL脚本创建成功,表结构完整
|
||||
- **数据完整性**: 表结构包含所有必需字段,字段类型合理
|
||||
- **性能指标**: 索引设计合理,查询性能满足要求
|
||||
- **扩展性**: 表结构支持后续功能扩展
|
||||
@ -108,6 +152,7 @@
|
||||
| 日期 | 变更内容 | 变更原因 | 变更人 | 审核人 | 状态 |
|
||||
|------|---------|---------|--------|--------|------|
|
||||
| 2026-01-17 | 创建需求文档 | 初始需求 | 系统管理员 | - | 待审核 |
|
||||
| 2026-01-17 | 优化需求文档 | 基于参考资料 `005-源数据拉取数据库设计方案.md` 优化表设计,从 6 张表增加到 9 张表 | SSOT Architect | - | 待审核 |
|
||||
|
||||
## 相关人员
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
| 指标 | 目标值 | 实际值 | 达成率 | 分析 |
|
||||
|------|--------|--------|--------|------|
|
||||
| 功能完成数 | 完成数据库表结构设计 | 完成 6 个数据库表设计 | 100% | 按时完成,所有表结构设计符合需求 |
|
||||
| 功能完成数 | 完成数据库表结构设计 | 完成 9 个数据库表设计 | 100% | 按时完成,所有表结构设计符合需求 |
|
||||
| 代码质量 | 符合 MyBatis Plus 规范 | 符合 MyBatis Plus 规范 | 100% | 表结构设计符合 MyBatis Plus 规范,与现有项目保持一致 |
|
||||
| 测试覆盖率 | 100% | 0%(待执行代码生成后测试) | 0% | 本次阶段仅完成设计和文档,代码生成和测试将在后续阶段完成 |
|
||||
| 文档完整性 | 完整的文档链 | 完成需求文档、架构决策、提示词、会话记录、变更记录 | 100% | 文档链完整,符合项目规则要求 |
|
||||
@ -160,6 +160,7 @@ Trae 读取 Canvas 时的表现:
|
||||
- 在设计初期仔细阅读现有项目的相关文档和代码,了解项目的命名规范和结构规范
|
||||
- 在创建 ADR 文档前与用户确认关键设计决策,避免反复修改
|
||||
- 在创建会话记录时,更详细地记录质疑与替代方案,便于后续回顾
|
||||
- 在设计初期仔细阅读参考文档,确保表设计符合业务需求
|
||||
|
||||
本次迭代的经验教训:
|
||||
- 需求拆分模式是管理复杂需求的有效方法,可以提高需求管理的粒度,便于跟踪和验收
|
||||
@ -167,3 +168,22 @@ Trae 读取 Canvas 时的表现:
|
||||
- 提示词资产化模式是提高开发效率的有效方法,可以确保代码生成符合预期,减少重复工作
|
||||
- 在设计初期充分了解现有项目的规范,可以避免反复修改,提高开发效率
|
||||
- 在创建文档前与用户确认关键决策,可以避免反复修改,提高开发效率
|
||||
- 在设计初期仔细阅读参考文档,可以确保表设计符合业务需求,避免后续优化
|
||||
|
||||
## 后续优化建议
|
||||
|
||||
### 优化 1: 基于参考资料优化表设计
|
||||
|
||||
- **优化内容**: 基于参考资料 `005-源数据拉取数据库设计方案.md` 优化表设计,新增 3 张表(datai_meta_package_item, datai_meta_component_version, datai_meta_deploy_component_result)
|
||||
- **优化原因**:
|
||||
- 参考文档提供了更完善的表设计,包含 9 张表,覆盖了元数据管理的完整生命周期
|
||||
- 新增的 3 张表提供了重要的功能支持:
|
||||
- `datai_meta_package_item` - 支持元数据包定义的自动化生成,避免手动拼写 `package.xml`
|
||||
- `datai_meta_component_version` - 支持"Java 版 Git"功能,实现组件版本管理和内容哈希对比
|
||||
- `datai_meta_deploy_component_result` - 支持 CI/CD 功能,提供精确的错误报告(行号、错误原因)
|
||||
- **优化效果**:
|
||||
- 提高了元数据管理的完整性和可追溯性
|
||||
- 支持了更高级的功能(如代码比对、回滚、CI 部署流水线)
|
||||
- 为后续功能开发提供了更完善的数据基础
|
||||
- **优化时间**: 2026-01-17
|
||||
- **优化状态**: 已完成文档更新,待执行代码生成
|
||||
|
||||
@ -13,9 +13,10 @@
|
||||
- 创建了 0010-database-table-design.md 架构决策记录
|
||||
- 分析了 2 种备选方案(JPA + PostgreSQL vs MyBatis Plus + MySQL)
|
||||
- 选择了 MyBatis Plus + MySQL 作为技术栈
|
||||
- 设计了 6 个核心数据库表(datai_meta_org_config, datai_meta_task, datai_meta_job_execution, datai_meta_component, datai_meta_deploy_history, datai_meta_job_log)
|
||||
- 设计了 9 个核心数据库表(datai_meta_org_config, datai_meta_package_item, datai_meta_component, datai_meta_component_version, datai_meta_task, datai_meta_job_execution, datai_meta_deploy_history, datai_meta_job_log, datai_meta_deploy_component_result)
|
||||
- 优化了表名称前缀从 `datai_sf` 改为 `datai_meta`
|
||||
- 优化了基础字段与现有表保持一致
|
||||
- 基于参考资料 `005-源数据拉取数据库设计方案.md` 优化表设计,新增 3 张表(datai_meta_package_item, datai_meta_component_version, datai_meta_deploy_component_result)
|
||||
|
||||
3. **提示词资产化阶段**:
|
||||
- 创建了 011-database-table-design-create.md 执行提示词
|
||||
@ -72,19 +73,22 @@
|
||||
- **时间**: 待定
|
||||
- **操作**:
|
||||
- 加载 011-database-table-design-create.md 提示词
|
||||
- 生成 6 个数据库表的 SQL 创建语句
|
||||
- 生成 6 个对应的 Java 实体类
|
||||
- 生成 6 个对应的 Mapper 接口
|
||||
- 生成 9 个数据库表的 SQL 创建语句
|
||||
- 生成 9 个对应的 Java 实体类
|
||||
- 生成 9 个对应的 Mapper 接口
|
||||
- 生成 Flyway 迁移脚本
|
||||
- 生成单元测试代码
|
||||
- **预期产出**:
|
||||
- V1.0.0__create_metadata_tables.sql
|
||||
- DataiMetaOrgConfig.java
|
||||
- DataiMetaPackageItem.java
|
||||
- DataiMetaComponent.java
|
||||
- DataiMetaComponentVersion.java
|
||||
- DataiMetaTask.java
|
||||
- DataiMetaJobExecution.java
|
||||
- DataiMetaComponent.java
|
||||
- DataiMetaDeployHistory.java
|
||||
- DataiMetaJobLog.java
|
||||
- DataiMetaDeployComponentResult.java
|
||||
- 对应的 Mapper 接口
|
||||
- 对应的单元测试
|
||||
|
||||
@ -125,27 +129,36 @@
|
||||
|
||||
2. **Java 实体类**:
|
||||
- DataiMetaOrgConfig.java
|
||||
- DataiMetaPackageItem.java
|
||||
- DataiMetaComponent.java
|
||||
- DataiMetaComponentVersion.java
|
||||
- DataiMetaTask.java
|
||||
- DataiMetaJobExecution.java
|
||||
- DataiMetaComponent.java
|
||||
- DataiMetaDeployHistory.java
|
||||
- DataiMetaJobLog.java
|
||||
- DataiMetaDeployComponentResult.java
|
||||
|
||||
3. **Mapper 接口**:
|
||||
- DataiMetaOrgConfigMapper.java
|
||||
- DataiMetaPackageItemMapper.java
|
||||
- DataiMetaComponentMapper.java
|
||||
- DataiMetaComponentVersionMapper.java
|
||||
- DataiMetaTaskMapper.java
|
||||
- DataiMetaJobExecutionMapper.java
|
||||
- DataiMetaComponentMapper.java
|
||||
- DataiMetaDeployHistoryMapper.java
|
||||
- DataiMetaJobLogMapper.java
|
||||
- DataiMetaDeployComponentResultMapper.java
|
||||
|
||||
4. **单元测试**:
|
||||
- DataiMetaOrgConfigMapperTest.java
|
||||
- DataiMetaPackageItemMapperTest.java
|
||||
- DataiMetaComponentMapperTest.java
|
||||
- DataiMetaComponentVersionMapperTest.java
|
||||
- DataiMetaTaskMapperTest.java
|
||||
- DataiMetaJobExecutionMapperTest.java
|
||||
- DataiMetaComponentMapperTest.java
|
||||
- DataiMetaDeployHistoryMapperTest.java
|
||||
- DataiMetaJobLogMapperTest.java
|
||||
- DataiMetaDeployComponentResultMapperTest.java
|
||||
|
||||
## 质疑与替代方案
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user