# REV004 prestorage formal-table 已应用到 application-dev 测试库(2026-04-16) ## 目标库 依据: - `sw-business/sw-business-server/src/main/resources/application-dev.yaml` 解析结果: - Host:`192.168.10.130` - Port:`5436` - DB:`sw_system` - User:`sw_system` 即当前 `application-dev` 指向的测试数据库为: `jdbc:postgresql://192.168.10.130:5436/sw_system` ## 已执行脚本 - `sql/rev004/REV004_prestorage_formal_tables_deploy.sql` 执行命令: ```bash PGPASSWORD='Em@123456' \ psql -h 192.168.10.130 -p 5436 -U sw_system -d sw_system \ -v ON_ERROR_STOP=1 \ -f sql/rev004/REV004_prestorage_formal_tables_deploy.sql ``` ## 执行结果 结果:**PASS** 执行输出显示: - `biz_prestorage_adjust_seq` 创建成功 - `biz_prestorage_adjust_detail_seq` 创建成功 - `biz_prestorage_adjust` 创建成功 - `biz_prestorage_adjust_detail` 创建成功 - 主表索引、明细表索引创建成功 - 外键 `fk_biz_prestorage_adjust_detail_main` 创建成功 ## 回读校验 ### 表 已确认存在: - `biz_prestorage_adjust` - `biz_prestorage_adjust_detail` ### 序列 已确认存在: - `biz_prestorage_adjust_seq` - `biz_prestorage_adjust_detail_seq` ### 关键索引 已确认存在: - `uk_biz_prestorage_adjust_no` - `idx_biz_prestorage_adjust_source` - `idx_biz_prestorage_adjust_target` - `idx_biz_prestorage_adjust_type` - `idx_biz_prestorage_adjust_status` - `idx_biz_prestorage_adjust_executed_at` - `idx_biz_prestorage_adjust_detail_main` - `idx_biz_prestorage_adjust_detail_type` - `idx_biz_prestorage_adjust_detail_charge` - `idx_biz_prestorage_adjust_detail_bill_month` ### 外键 已确认存在: - `fk_biz_prestorage_adjust_detail_main` - `biz_prestorage_adjust_detail(prestorage_adjust_id) -> biz_prestorage_adjust(id)` ## Smoke 验证 ### 1. 代码层最小验证 执行: ```bash mvn -pl sw-business/sw-business-server -DskipTests compile mvn -pl sw-business/sw-business-server -Dtest=AccountingAdjustProcessServiceImplTest,AccountingAdjustPrestorageProcessServiceImplTest test ``` 结果:**PASS** 说明: - prestorage submit / revoke 接线后的 Java 编译通过 - `AccountingAdjustProcessServiceImplTest` 通过(13/13) - `AccountingAdjustPrestorageProcessServiceImplTest` 通过(4/4) - 合计目标测试:`17/17` 通过 ### 2. 数据库 transactional smoke 执行:在测试库开启事务后,插入一笔 `biz_prestorage_adjust` 主表记录 + 一笔 `biz_prestorage_adjust_detail` 明细记录,随后回读计数,再 `ROLLBACK`。 验证点: - 主表可写 - 明细表可写 - 外键约束正常 - 回读可见 - 回滚后不污染测试库 实际结果: - `main_count=1` - `detail_count=1` - 回滚后再次检查 `adjustment_no='SMOKE-REV004-PRE-001'` 计数为 `0` 结果:**PASS** ## 当前结论 `application-dev` 指向的测试数据库现在已经具备 REV004 prestorage formal-table 结构,可直接用于: 1. 预存退款 / 预存转账 formal-table 双写 2. prestorage page/detail/stat formal-table 优先投影联调 3. 后续真实接口 smoke / canary 验证 ## 真实 HTTP smoke(补充于 2026-04-16 18:00 +08:00) 为了避免命中本地旧 jar 进程,额外完成了以下动作: 1. 使用最新代码重新执行 `mvn -pl sw-business/sw-business-server -DskipTests package` 2. 以 `java -jar ... --server.port=48091` 启动一份隔离的新实例 3. 通过 `login-user` 头模拟管理员上下文,直连 `/admin-api/business/accounting-adjust/*` 接口做 smoke ### smoke 前置数据 向测试库临时插入: - 源客户:`REV004_PRE_SMOKE_SRC` - 目标客户:`REV004_PRE_SMOKE_TGT` - 源账户余额:`100.00` - 目标账户余额:`5.00` ### 1. prestorage-submit(refund) 请求成功,返回: - `adjustmentNo = REV004-PRF-990001-20260416180029` - `resultStatus = SUCCESS` DB 回读确认: - `biz_prestorage_adjust` 新增 1 条 `REFUND` - `biz_prestorage_adjust_detail` 新增 1 条 `REFUND_RESULT` - 源账户余额由 `100.00 -> 90.00` ### 2. prestorage-submit(transfer) 请求成功,返回: - `adjustmentNo = REV004-PTR-990001-20260416180029` - `resultStatus = SUCCESS` DB 回读确认: - `biz_prestorage_adjust` 新增 1 条 `TRANSFER` - `biz_prestorage_adjust_detail` 新增 2 条: - `SOURCE_ACCOUNT` - `TARGET_ACCOUNT` - 源账户余额由 `90.00 -> 70.00` - 目标账户余额由 `5.00 -> 25.00` ### 3. prestorage-page / prestorage-detail 在 48091 新实例上验证: - `prestorage-page` 返回 2 条 smoke 数据 - `prestorage-detail?id=3` 可正常返回 transfer formal 详情 - transfer 记录状态为: - `workOrderStatus = 2` - `resultStatus = SUCCESS` - `writeBackStatus = UPDATED` ### 4. prestorage-process / prestorage-attachments 在 48091 新实例上验证: - `prestorage-process?adjustmentNo=REV004-PTR-990001-20260416180029` 返回成功 - `prestorage-attachments?...` 返回空数组 `[]` 说明: - 当前 `process/attachments` 仍主要经 unified/legacy 查询口径返回,但因为 submit 继续写 `operat_log`,链路可正常工作 - 这两条在本轮已不构成阻塞性故障 ### 5. prestorage-revoke 调用: - `prestorage-revoke adjustmentNo=REV004-PTR-990001-20260416180029` 返回: - `message = 预存转账撤销成功` - `resultStatus = SUCCESS` DB 回读确认: - `biz_prestorage_adjust` 中该 transfer 主记录状态变为: - `result_status = REVOKED` - `execute_status = REVOKED` - 对应 detail 状态均变为: - `detail_status = REVOKED` - `proc_type = REVOKE` - 账户余额恢复为: - 源账户 `90.00` - 目标账户 `5.00` - `prestorage-page` 再查可见该 transfer 记录: - `workOrderStatus = 3` - `canRevoke = false` ## 测试数据清理 为避免污染测试库,smoke 完成后已执行清理: - 删除临时 `biz_operat_log / detail` - 删除临时 `biz_prestorage_adjust / detail` - 删除临时 `biz_account` - 删除临时 `biz_cust` 回读结果: - `formal_main_left = 0` - `operat_log_left = 0` - `cust_left = 0` ## 当前仍未完全覆盖的点 1. 本轮已经证明 HTTP submit/query/revoke 主链路可工作; 2. 但 `prestorage-process / prestorage-attachments` 目前仍不是 strict formal-first,而是依赖 unified/legacy 口径兜底; 3. 如果后续目标是“彻底以 formal-table 为唯一真值”,还需要继续收口这两条查询路径。 ## 建议后续 1. backend PR 可以先按 prestorage formal-table 独立批次提交; 2. PR 描述中明确: - `process/attachments` 当前可用,但仍保留 legacy/unified 查询兜底; - 后续可再开一批做 strict formal-first 收口; 3. 保留 `REV004_prestorage_formal_tables_deploy.sql` 作为测试库 / 联调库初始化脚本。 ## 补充复核(2026-04-16 17:36 +08:00) ### 1. 部署脚本幂等重放 再次执行: ```bash PGPASSWORD='Em@123456' psql -h 192.168.10.130 -p 5436 -U sw_system -d sw_system -v ON_ERROR_STOP=1 -f sql/rev004/REV004_prestorage_formal_tables_deploy.sql ``` 结果:**PASS** 关键输出: - existing sequence/table/index 均以 `already exists, skipping` 形式跳过 - 没有出现失败或约束重复异常 说明: - `REV004_prestorage_formal_tables_deploy.sql` 具备测试库重放幂等性 - 适合作为联调库/测试库初始化脚本继续使用 ### 2. 本地服务存活验证 执行: ```bash curl -sS http://127.0.0.1:48090/actuator/health ``` 返回: ```json {"status":"UP"} ``` 说明: - 当前本地 `sw-business-server` 进程存活 - 后续若补真实 HTTP 接口 smoke,可直接基于该运行实例继续