cisd/docs/plans/2026-03-09-standard-db-render-apply-plan.md
2026-03-11 14:23:11 +08:00

176 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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