diff --git a/docs/evidence/rev004-automation-and-legacy-reduction-2026-04-17.md b/docs/evidence/rev004-automation-and-legacy-reduction-2026-04-17.md new file mode 100644 index 0000000..2698ab2 --- /dev/null +++ b/docs/evidence/rev004-automation-and-legacy-reduction-2026-04-17.md @@ -0,0 +1,171 @@ +# REV004 自动化回归脚本 + legacy fallback 缩减(2026-04-17) + +## 本轮目标 +1. 为 REV004 建立可重复执行的自动化回归脚本入口。 +2. 继续缩小 accountProcess 对 legacy fallback 的直接依赖面。 + +## 后端代码变更 +### 1. 新增回归脚本目录 +后端新增:`script/rev004-regression/` +- `env.sh` +- `01_prepare_env.sh` +- `02_unit_regression.sh` +- `03_live_db_smoke.sh` +- `04_summary.sh` +- `run_all.sh` + +说明: +- unit 回归默认覆盖:`AccountingAdjustQueryServiceImplTest`、`AccountingAdjustProcessServiceImplTest`、`AccountingAdjustActionServiceImplTest`、`ChargeServiceAccountingAdjustTest`、`PrestorageFormalizationServiceTest` +- live DB smoke 默认覆盖: + - `Rev004AccountProcessLiveDbReadinessTest` + - `Rev004AccountProcessCanaryQueryIntegrationTest` + - `prestoragePage_shouldReturnSuccessEnvelope` + - `prestorageSubmit_shouldChangeBalanceAndWriteOperatLog` + - `prestorageRevoke_shouldRestoreBalanceAndWriteRevokeLog` + - `prestorageSubmit_thenProcessAndAttachmentsShouldExposeReturnedAdjustmentNo` + +### 2. 缩减 legacy fallback 使用面 +#### `AccountingAdjustProcessServiceImpl` +- `getProcess(...)`:调整为 + - prestorage formal 优先 + - unified snapshot 次优先 + - synthetic snapshot 仅在 unified 缺失时兜底 +- `getAttachments(...)`:调整为 + - prestorage formal 优先 + - unified snapshot 次优先 + - synthetic snapshot 仅在 unified 缺失时兜底 + +#### `AccountingAdjustQueryServiceImpl` +- page 聚合时,先汇总 formal adjustmentNo 集合 +- legacy request log 转换出的 request record 若 adjustmentNo 已被 formal 记录覆盖,则不再进入 merged 集合 +- 保留 legacy log 的审计/兜底职责,但不再重复参与 formal 已覆盖对象的主结果聚合 + +## 新增/更新测试 +### 单测补强 +- `AccountingAdjustProcessServiceImplTest` + - `getProcess_shouldPreferUnifiedSnapshotOverSyntheticFallback` + - `getAttachments_shouldPreferUnifiedSnapshotOverSyntheticFallback` +- `AccountingAdjustQueryServiceImplTest` + - `getAccountingAdjustPage_shouldSkipLegacyRequestRecordWhenFormalRecordExists` + +## 验证结果 +### 1. unit 回归 +执行: +```bash +script/rev004-regression/02_unit_regression.sh +``` +结果: +- `Tests run: 68, Failures: 0, Errors: 0, Skipped: 0` +- `BUILD SUCCESS` + +### 2. live DB smoke +执行: +```bash +script/rev004-regression/03_live_db_smoke.sh +``` +结果: +- `Tests run: 5, Failures: 0, Errors: 0, Skipped: 0` +- `BUILD SUCCESS` + +### 3. 一键入口 +执行: +```bash +script/rev004-regression/run_all.sh +``` +结果: +- unit + live DB smoke 均通过 +- 日志目录: + - `.omx/logs/rev004-regression/20260417T110151Z` + +## 当前边界 +- 当前 live DB smoke 默认仍以 prestorage 稳定链路为主,用来验证真实数据库 + Spring + MockMvc + formal/legacy 协同路径。 +- writtenoff / price diff / redink / bad debt 在本轮主要由 targeted unit regression 覆盖;后续可继续补到 live DB fixture。 +- `Rev004AccountProcessCanaryQueryIntegrationTest` 中仍有其它更大范围场景未纳入默认 smoke 入口,本轮没有把它们全部收进默认脚本,以避免把未收敛场景误当作回归主入口。 + +## 结论 +本轮已完成: +- REV004 自动化回归脚本首版落地 +- 一键执行入口可用 +- process / attachments 的 legacy fallback 优先级继续收口 +- page 聚合中的 duplicate legacy request 参与面继续缩小 + + +## 追加收口(继续删 fallback) +### Query 层进一步收口 +- `AccountingAdjustQueryServiceImpl#getAccountingAdjustPage(...)` + - `loadLatestActionMap(...)` 改为只对 legacy request records 构建 action overlay + - formal 记录即使 chargeId 下存在 legacy approval log,也不再被 legacy 审批轨迹回填覆盖主状态 + +### 新增回归测试 +- `getAccountingAdjustPage_shouldNotLetLegacyApprovalOverrideFormalRecord` + - 验证:formal 已存在时,legacy approval log 不再覆盖 formal 的 `approvalStatus/resultStatus/writeBackStatus/message/actionAmount` + +### 本次追加验证 +执行: +```bash +mvn -pl sw-business/sw-business-server -Dtest=AccountingAdjustQueryServiceImplTest,AccountingAdjustProcessServiceImplTest test +``` +结果: +- `Tests run: 32, Failures: 0, Errors: 0, Skipped: 0` +- `BUILD SUCCESS` + + +### 统计口径锁定 +新增测试: +- `getAccountingAdjustStat_shouldIgnoreLegacyApprovalForFormalRecord` + +验证: +- formal record 已存在时,legacy approval/action 不再把统计口径从 `PENDING_APPROVAL` 误改成 `APPROVED` +- `totalActionAmount` 仍取 formal 金额 + +执行: +```bash +mvn -pl sw-business/sw-business-server -Dtest=AccountingAdjustQueryServiceImplTest test +``` +结果: +- `Tests run: 13, Failures: 0, Errors: 0, Skipped: 0` +- `BUILD SUCCESS` + +再次执行: +```bash +script/rev004-regression/run_all.sh +``` +结果: +- unit:`Tests run: 69, Failures: 0, Errors: 0, Skipped: 0` +- live smoke:`Tests run: 5, Failures: 0, Errors: 0, Skipped: 0` +- `BUILD SUCCESS` + + +### 日志查询口径锁定 +新增测试: +- `getAccountingAdjustLogs_shouldReturnSyntheticFormalLogWhenLegacyLogsMissing` + +验证: +- formal 对象即使没有 legacy operat_log,也能通过 `getAccountingAdjustLogs` 返回一条 synthetic formal log +- 前端日志页不再被 legacy log 是否存在所卡死 + +执行: +```bash +mvn -pl sw-business/sw-business-server -Dtest=AccountingAdjustQueryServiceImplTest test +``` +结果: +- `Tests run: 14, Failures: 0, Errors: 0, Skipped: 0` +- `BUILD SUCCESS` + + +### action-only 日志补齐 +新增测试: +- `getAccountingAdjustLogs_shouldPrependSyntheticFormalLogWhenOnlyActionLogExists` + +验证: +- formal 对象若只有 legacy action log、没有 legacy request log +- 日志列表会自动在前面补一条 synthetic formal log,再保留 legacy action log +- 前端日志时间线可同时看到 formal 主记录和 legacy 审批动作 + +执行: +```bash +mvn -pl sw-business/sw-business-server -Dtest=AccountingAdjustQueryServiceImplTest test +``` +结果: +- `Tests run: 15, Failures: 0, Errors: 0, Skipped: 0` +- `BUILD SUCCESS`