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

7.3 KiB
Raw Blame History

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_RENDERDB_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_RENDERDB_APPLY
  • ENTERPRISE + TLQINDIRECT + RABBITMQINDIRECT + 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_RENDERDB_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.cfgsql_script/CMEP-DML.sqlsql_script/CMEP.sqlsql_script/SCHEMA-DDL.sqlsql_script/UP-ORG-INFO.sqlsql_script/sql_script_tmp/CMTP-01-raq.sql
    • 执行 internal::db_render
    • 断言 staging 下存在 db/sql/CMTP-01.sqlCMEP-DML.sqlCMEP.sql 等文件
    • 断言 AAAABBBBXXX01tlq.ip02tlq.ipsptp.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.sqlCMTP-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