# 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//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//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