diff --git a/docs/evidence/rev004-redink-formal-table-dev-db-apply-2026-04-17.md b/docs/evidence/rev004-redink-formal-table-dev-db-apply-2026-04-17.md new file mode 100644 index 0000000..795f649 --- /dev/null +++ b/docs/evidence/rev004-redink-formal-table-dev-db-apply-2026-04-17.md @@ -0,0 +1,140 @@ +# REV004 redink formal-table 已应用到 application-dev 测试库(2026-04-17) + +## 目标库 +依据: +- `sw-business/sw-business-server/src/main/resources/application-dev.yaml` + +解析结果: +- Host:`192.168.10.130` +- Port:`5436` +- DB:`sw_system` +- User:`sw_system` + +## 已执行脚本 +- `sql/rev004/REV004_redink_formal_tables_deploy.sql` + +## DDL 执行结果 +结果:**PASS** + +已确认存在: +- `biz_redink_record` +- `biz_redink_record_detail` +- `biz_redink_record_seq` +- `biz_redink_record_detail_seq` + +已确认幂等重放通过: +- second apply 输出 existing/skip 结果 +- 本轮顺手把 sequence 创建方式从 `CREATE SEQUENCE IF NOT EXISTS` 收口为显式 `pg_class` 检查,规避 replay 时 sequence 级重复键异常 + +## 代码验证 +### compile +```bash +mvn -pl sw-business/sw-business-server -DskipTests compile +``` +结果:**PASS** + +### targeted tests +```bash +mvn -pl sw-business/sw-business-server -Dtest=ChargeServiceAccountingAdjustTest,AccountingAdjustQueryServiceImplTest,RedinkFormalizationServiceTest test +``` +结果:**PASS** +- Tests run: 34 +- Failures: 0 +- Errors: 0 + +## fresh query smoke(fresh jar, port 48096) +### health +- `GET /actuator/health` -> `{"status":"UP"}` + +### smoke 方式说明 +REDINK_RECORD 当前依赖原交易定位 / bank follow-up 逻辑;本轮先采用: +1. application-dev 手工 seed 一条 redink formal 主表/明细表记录; +2. fresh jar 验证 `get/page` 是否已 formal-first 命中; +3. 不在本轮直接伪造 live bank follow-up 交易。 + +### seed 记录 +- `adjustmentNo = REV004-RI-992305-SEED` +- `chargeId = 992305` +- formal 主表状态: + - `approvalStatus = NOT_REQUIRED` + - `executeStatus = UPDATED` + - `resultStatus = SUCCESS` +- bank follow-up 样例:`BK-992305` + +### get / page +- `GET /admin-api/business/accounting-adjust/get?adjustmentNo=REV004-RI-992305-SEED` + - 返回: + - `objectType = REDINK_RECORD` + - `resultStatus = SUCCESS` + - `approvalStatus = NOT_REQUIRED` + - `writeBackStatus = UPDATED` + - `originalTranSeq = T-992305` + - `originalSysTranSeq = SYS-992305` + - detail 中包含: + - `bankTranSeq` + - `redinkAmount` + - `payStateBefore` + - `payStateAfter` +- `GET /admin-api/business/accounting-adjust/page?...objectType=REDINK_RECORD` + - 返回 1 条 formal-first 记录 + - `reasonCodeLabel` 已能解析为字典文本(如 `收费错误`) + +## 当前结论 +本轮 redink formal-table 已达到: +1. DDL 可落库且可幂等重放; +2. 结果型 formal-table 主从表已建模; +3. query detail/page 对 `REDINK_RECORD` 已能返回 formal-first; +4. compile / targeted tests 通过; +5. fresh jar query smoke 已验证 formal-first 查询链路可用。 + +## 当前仍未完全覆盖 +- 尚未完成“真实 redink 执行成功后自动落 formal 结果”的 live HTTP smoke; +- 原因是当前红冲依赖原交易与 bank follow-up 外部链路,需要在下一轮补真实可复现数据后再做完整 execute smoke。 + +## 测试数据清理 +已删除: +- `biz_redink_record / detail` +- `biz_charge` +- `biz_cust` + +回读结果: +- `redink_main_left=0` +- `redink_detail_left=0` +- `charge_left=0` +- `cust_left=0` + +## 运行态清理 +用于 fresh-jar query smoke 的临时实例: +- port `48096` + +已停止,当前无残留 LISTEN 进程。 + +## live execute smoke 阻塞证据(2026-04-17 16:50 +08:00) +本轮额外尝试了真实 redink 执行链路: +- fresh jar:`48097` +- 请求:`POST /admin-api/business/charge/accounting-adjust` +- `objectType = REDINK_RECORD` +- `chargeId = 992306` +- `originalTranSeq = T-REDINK-NOPE` + +接口响应: +```json +{"code":500,"data":null,"msg":"系统异常"} +``` + +从应用日志定位到的精确异常: +- `FeignException$ServiceUnavailable: [503]` +- `Load balancer does not contain an instance for the service business-bank-server` +- 失败位置:`TransactionApi#getTransactionByTranSeq(...)` + +结论: +- 当前 live execute smoke 未能完成的直接原因是 **外部依赖 `business-bank-server` 在当前环境无可用实例**; +- 这不是 redink formal-table 本身的 DDL / 查询接线问题。 + +因此本批已完成: +- compile +- targeted tests +- DDL apply / replay +- fresh query smoke + +但“真实 redink 执行成功后自动落 formal”的端到端 smoke 仍需在 `business-bank-server` 可用时补跑。