# 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`