176 lines
7.3 KiB
Markdown
176 lines
7.3 KiB
Markdown
# Standard DB Render Apply Implementation Plan
|
||
|
||
> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
|
||
|
||
**Goal:** 将标准版初始化中的数据库步骤从黑盒 `DB_INIT` 拆分为 `DB_RENDER` 和 `DB_APPLY`,生成可审计的 SQL 输出物,并保留数据库凭据在预制层处理。
|
||
|
||
**Architecture:** 标准版步骤编排改为先在 task staging 目录生成渲染后的 SQL 包,再由单独的 `DB_APPLY` 步骤将 SQL 包落位到标准收发器数据库加载目录,并按预置命令执行导库。渲染逻辑直接基于 `sql_script_tmp` 模板和 `CMEP-DML.sql/CMEP.sql`,不依赖 vendor 脚本副作用,也不修改 vendor 原始介质。
|
||
|
||
**Tech Stack:** Java 17, Spring Boot 3.5, Jackson, JUnit 5, Maven
|
||
|
||
---
|
||
|
||
### Task 1: 固化步骤编排与计划文档
|
||
|
||
**Files:**
|
||
- Create: `/Users/waner/Work/CISD/文档/tms-framework/docs/plans/2026-03-09-standard-db-render-apply-plan.md`
|
||
- Modify: `/Users/waner/Work/CISD/文档/tms-framework/src/main/java/com/cisd/tms/modules/init/service/InitService.java`
|
||
- Modify: `/Users/waner/Work/CISD/文档/tms-framework/src/main/resources/initplan/step-command-profiles.json`
|
||
- Test: `/Users/waner/Work/CISD/文档/tms-framework/src/test/java/com/cisd/tms/modules/init/service/InitServiceTest.java`
|
||
|
||
**Step 1: Write the failing test**
|
||
|
||
在 `InitServiceTest` 增加标准版断言:
|
||
- `ENTERPRISE + RABBITMQ` 不再包含 `DB_INIT`
|
||
- 改为包含 `DB_RENDER` 和 `DB_APPLY`
|
||
- `ENTERPRISE + TLQ`、`INDIRECT + RABBITMQ`、`INDIRECT + RABBITMQ_TLQ` 同样断言
|
||
|
||
**Step 2: Run test to verify it fails**
|
||
|
||
Run: `mvn -q -Dtest=InitServiceTest test`
|
||
Expected: FAIL,提示仍存在 `DB_INIT` 或缺少 `DB_RENDER/DB_APPLY`
|
||
|
||
**Step 3: Write minimal implementation**
|
||
|
||
修改 `InitService.defaultSteps()` 与 `step-command-profiles.json`:
|
||
- 标准版统一把 `DB_INIT` 替换成 `DB_RENDER`、`DB_APPLY`
|
||
- 直参版保持 `DB_INIT`
|
||
- 标准版 `DB_RENDER` 使用 `internal::db_render`
|
||
- 标准版 `DB_APPLY` 使用 `internal::db_apply`
|
||
|
||
**Step 4: Run test to verify it passes**
|
||
|
||
Run: `mvn -q -Dtest=InitServiceTest test`
|
||
Expected: PASS
|
||
|
||
### Task 2: 先写标准版 SQL 渲染失败用例
|
||
|
||
**Files:**
|
||
- Modify: `/Users/waner/Work/CISD/文档/tms-framework/src/test/java/com/cisd/tms/modules/init/executor/ConfigurableInitStepExecutorTest.java`
|
||
- Modify: `/Users/waner/Work/CISD/文档/tms-framework/src/main/java/com/cisd/tms/modules/init/config/InitExecutorProperties.java`
|
||
- Modify: `/Users/waner/Work/CISD/文档/tms-framework/src/main/resources/application.yml`
|
||
- Modify: `/Users/waner/Work/CISD/文档/tms-framework/config/application.yml.example`
|
||
|
||
**Step 1: Write the failing test**
|
||
|
||
新增两个执行器测试:
|
||
- `shouldRenderStandardDatabaseSqlPackageForEnterpriseRabbitmq`
|
||
- 在临时目录准备 `cpconfig.cfg`、`sql_script/CMEP-DML.sql`、`sql_script/CMEP.sql`、`sql_script/SCHEMA-DDL.sql`、`sql_script/UP-ORG-INFO.sql`、`sql_script/sql_script_tmp/CMTP-01-raq.sql`
|
||
- 执行 `internal::db_render`
|
||
- 断言 staging 下存在 `db/sql/CMTP-01.sql`、`CMEP-DML.sql`、`CMEP.sql` 等文件
|
||
- 断言 `AAAABBBBXXX`、`01tlq.ip`、`02tlq.ip`、`sptp.01app.ip` 被替换
|
||
- `shouldApplyStandardDatabaseSqlPackageToLoadDir`
|
||
- 基于上一步产物执行 `internal::db_apply`
|
||
- 断言 SQL 被复制到 configured load dir
|
||
|
||
**Step 2: Run test to verify it fails**
|
||
|
||
Run: `mvn -q -Dtest=ConfigurableInitStepExecutorTest test`
|
||
Expected: FAIL,提示不支持 `db_render/db_apply` 或目标文件不存在
|
||
|
||
**Step 3: Define minimal config surface**
|
||
|
||
为标准版数据库处理增加配置项:
|
||
- `standard-db-script-base-dir`
|
||
- `standard-db-load-dir`
|
||
- `standard-db-apply-command`
|
||
- `standard-db-entry-sql-file-name`
|
||
|
||
并在两个 `application.yml` 中补注释和默认值。
|
||
|
||
**Step 4: Re-run focused test**
|
||
|
||
Run: `mvn -q -Dtest=ConfigurableInitStepExecutorTest test`
|
||
Expected: 仍失败,但失败点只剩未实现逻辑
|
||
|
||
### Task 3: 实现标准版 DB_RENDER
|
||
|
||
**Files:**
|
||
- Modify: `/Users/waner/Work/CISD/文档/tms-framework/src/main/java/com/cisd/tms/modules/init/executor/ConfigurableInitStepExecutor.java`
|
||
- Test: `/Users/waner/Work/CISD/文档/tms-framework/src/test/java/com/cisd/tms/modules/init/executor/ConfigurableInitStepExecutorTest.java`
|
||
|
||
**Step 1: Add internal step dispatch**
|
||
|
||
在 `executeInternal()` 新增:
|
||
- `case "db_render" -> executeStandardDbRender(task, step)`
|
||
|
||
**Step 2: Implement render behavior**
|
||
|
||
新增最小实现:
|
||
- 仅对标准版生效;直参版返回 skipped
|
||
- 从 `standard-db-script-base-dir` 读取:
|
||
- `sql_script/CMEP-DML.sql`
|
||
- `sql_script/CMEP.sql`
|
||
- `sql_script/SCHEMA-DDL.sql`
|
||
- `sql_script/UP-ORG-INFO.sql`
|
||
- `sql_script/sql_script_tmp/CMTP-01-raq.sql` 或 `CMTP-01-tlq.sql`
|
||
- 渲染输出到 `staging/<taskId>/db/sql/`
|
||
- 输出文件名固定为:
|
||
- `CMEP-DML.sql`
|
||
- `CMEP.sql`
|
||
- `SCHEMA-DDL.sql`
|
||
- `UP-ORG-INFO.sql`
|
||
- `CMTP-01.sql`
|
||
- 渲染规则复用 `buildStandardReplacements()`,并补充 SQL 占位映射:
|
||
- `AAAABBBBXXX -> orgCode`
|
||
- `01tlq.ip -> mq_01_ip`
|
||
- `02tlq.ip -> mq_02_ip`
|
||
- `sptp.01app.ip -> sptp_01app_ip`
|
||
- `sptp.02app.ip -> sptp_02app_ip`
|
||
- `mybiccode/mycipsid/myleicode -> 对应机构号映射`
|
||
- `CMEP.sql` 里的 `source /home/cmep4i/mysql/loadfilepath/...` 保持不变,不在渲染阶段改路径
|
||
|
||
**Step 3: Run render test**
|
||
|
||
Run: `mvn -q -Dtest=ConfigurableInitStepExecutorTest#shouldRenderStandardDatabaseSqlPackageForEnterpriseRabbitmq test`
|
||
Expected: PASS
|
||
|
||
### Task 4: 实现标准版 DB_APPLY
|
||
|
||
**Files:**
|
||
- Modify: `/Users/waner/Work/CISD/文档/tms-framework/src/main/java/com/cisd/tms/modules/init/executor/ConfigurableInitStepExecutor.java`
|
||
- Test: `/Users/waner/Work/CISD/文档/tms-framework/src/test/java/com/cisd/tms/modules/init/executor/ConfigurableInitStepExecutorTest.java`
|
||
|
||
**Step 1: Add internal step dispatch**
|
||
|
||
在 `executeInternal()` 新增:
|
||
- `case "db_apply" -> executeStandardDbApply(task, step)`
|
||
|
||
**Step 2: Implement apply behavior**
|
||
|
||
最小实现:
|
||
- 仅对标准版生效;直参版返回 skipped
|
||
- 从 `staging/<taskId>/db/sql/` 读取渲染后 SQL 包
|
||
- 复制到 `standard-db-load-dir`
|
||
- `SIMULATE` 模式只校验 staging 产物存在并返回 success
|
||
- `LOCAL` 模式:
|
||
- 若 `standard-db-apply-command` 为空,只做落位并返回 success
|
||
- 若不为空,则以该命令执行导库,工作目录指向 `standard-db-load-dir`
|
||
- 成功日志中明确输出 staging 路径、load dir、是否执行导库命令
|
||
|
||
**Step 3: Run apply test**
|
||
|
||
Run: `mvn -q -Dtest=ConfigurableInitStepExecutorTest#shouldApplyStandardDatabaseSqlPackageToLoadDir test`
|
||
Expected: PASS
|
||
|
||
### Task 5: 全量回归与最小文档同步
|
||
|
||
**Files:**
|
||
- Modify: `/Users/waner/Work/CISD/文档/tms-framework/docs/plans/2026-03-09-auto-deploy-refactor.md`
|
||
- Test: `/Users/waner/Work/CISD/文档/tms-framework/src/test/java/com/cisd/tms/modules/init/service/InitServiceTest.java`
|
||
- Test: `/Users/waner/Work/CISD/文档/tms-framework/src/test/java/com/cisd/tms/modules/init/executor/ConfigurableInitStepExecutorTest.java`
|
||
|
||
**Step 1: Sync plan wording**
|
||
|
||
在重构计划中把 Task 3 结果更新为已实现方向:标准版数据库改为 `DB_RENDER / DB_APPLY`。
|
||
|
||
**Step 2: Run targeted tests**
|
||
|
||
Run: `mvn -q -Dtest=InitServiceTest,ConfigurableInitStepExecutorTest test`
|
||
Expected: PASS
|
||
|
||
**Step 3: Run compile verification**
|
||
|
||
Run: `mvn -q -DskipTests compile`
|
||
Expected: PASS
|