fujian_water_biz_doc/docs/evidence/rev004-redink-formal-table-dev-db-apply-2026-04-17.md

213 lines
6.5 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.

# 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 smokefresh 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` 可用时补跑。
## live execute smoke 成功补证2026-04-17 17:51 +08:00
在本轮额外启动本地 `business-bank-server`dev profile, port `48092`)并向测试库预置原交易后,重新完成了 REDINK_RECORD 的真实端到端执行 smoke。
### 前置
- 本地启动 `business-bank-server`,并成功注册到 Nacos dev`business-bank-server 192.168.9.109:48092 register finished`
-`bk_transaction` seed 原交易:
- `tran_seq = T-REDINK-NOPE`
- `sys_tran_seq = SYS-REDINK-NOPE`
- `tran_type = PAY`
- `status = SUCCESS`
- `contract_no = 992306`
- `amount = 12000`
- 准备已收费营业账:`chargeId = 992306`
### execute 请求
`POST /admin-api/business/charge/accounting-adjust`
```json
{
"chargeId": 992306,
"objectType": "REDINK_RECORD",
"reasonCode": "1",
"reason": "redink execute smoke",
"originalTranSeq": "T-REDINK-NOPE"
}
```
### execute 响应
结果:**PASS**
返回:
- `adjustmentNo = REV004-992306-20260417175109`
- `objectType = REDINK_RECORD`
- `resultStatus = SUCCESS`
- `approvalStatus = NOT_REQUIRED`
- `writeBackStatus = UPDATED`
- `message = 冲正处理成功bank流水号=RV9923062026041717511073C805`
### DB 回读
`biz_redink_record`
- `adjustment_no = REV004-992306-20260417175109`
- `approval_status = NOT_REQUIRED`
- `execute_status = UPDATED`
- `result_status = SUCCESS`
- `bank_tran_seq = RV9923062026041717511073C805`
- `original_tran_seq = T-REDINK-NOPE`
`biz_redink_record_detail`
- `detail_status = SUCCESS`
- `proc_type = EXECUTE`
- `pay_state_before = 1`
- `pay_state_after = 0`
- `redink_amount = 120.00`
`biz_charge`
- `pay_state = 0`
- 支付信息已清空为红冲后的未收费态
`bk_transaction`
- 原交易 `T-REDINK-NOPE` 状态变为 `REVERSED`
- 新增 follow-up
- `tran_seq = RV9923062026041717511073C805`
- `tran_type = PAY_INVALID`
- `status = SUCCESS`
- `original_tran_seq = T-REDINK-NOPE`
### 查询回读
- `GET /admin-api/business/accounting-adjust/get?adjustmentNo=REV004-992306-20260417175109` -> formal-first 返回成功
- `GET /admin-api/business/accounting-adjust/page?...objectType=REDINK_RECORD` -> formal-first 返回成功
说明至此REDINK_RECORD 已补齐“真实执行 -> 自动落 formal -> formal-first 查询”的完整闭环证据。