This updates the REV004 writtenoff evidence with a fresh post-patch smoke run covering submit, detail/page query, approve/reject, DB writeback, cleanup, and runtime shutdown on port 48094. Constraint: Evidence must reflect the final backend patch set actually pushed for PR #77 Rejected: Leave the earlier pre-patch smoke as the last evidence point | weaker proof for the final transaction/fail-fast tightening Confidence: high Scope-risk: narrow Reversibility: clean Directive: If writtenoff smoke is rerun again, append a new dated subsection instead of overwriting this verification trail Tested: Fresh jar smoke on 48094 plus direct psql cleanup/readback verification on 2026-04-17 Not-tested: No separate document export/render pipeline run for this evidence refresh
143 lines
5.0 KiB
Markdown
143 lines
5.0 KiB
Markdown
# REV004 writtenoff 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_writtenoff_formal_tables_deploy.sql`
|
||
|
||
## DDL 执行结果
|
||
结果:**PASS**
|
||
|
||
已确认存在:
|
||
- `biz_writtenoff_adjust`
|
||
- `biz_writtenoff_adjust_detail`
|
||
- `biz_writtenoff_adjust_seq`
|
||
- `biz_writtenoff_adjust_detail_seq`
|
||
|
||
已确认幂等重放通过:
|
||
- second apply 输出 `already exists, skipping`
|
||
- 无重复约束/重复索引异常
|
||
|
||
## 代码验证
|
||
### compile
|
||
```bash
|
||
mvn -pl sw-business/sw-business-server -DskipTests compile
|
||
```
|
||
结果:**PASS**
|
||
|
||
### targeted tests
|
||
```bash
|
||
mvn -pl sw-business/sw-business-server \
|
||
-Dtest=AccountingAdjustSoldProcessServiceImplTest,AccountingAdjustActionServiceImplTest,AccountingAdjustProcessServiceImplTest,AccountingAdjustQueryServiceImplTest,WrittenoffFormalizationServiceTest test
|
||
```
|
||
结果:**PASS**
|
||
- Tests run: 41
|
||
- Failures: 0
|
||
- Errors: 0
|
||
|
||
## HTTP smoke(fresh jar, port 48093)
|
||
### submit
|
||
- `sold-submit` on charge `992005` → `REV004-SLD-992005-20260417143622`
|
||
- `sold-submit` on charge `992006` → `REV004-SLD-992006-20260417143623`
|
||
- 返回统一为:
|
||
- `objectType = WRITTENOFF_ADJUST`
|
||
- `approvalStatus = PENDING_APPROVAL`
|
||
- `resultStatus = PENDING_APPROVAL`
|
||
- `writeBackStatus = PENDING`
|
||
|
||
### DB 回读
|
||
`biz_writtenoff_adjust_detail`:
|
||
- submit 后 detail 进入 `PENDING_APPROVAL / SUBMIT`
|
||
|
||
### query
|
||
- `GET /admin-api/business/accounting-adjust/get?adjustmentNo=...` 对 writtenoff 已返回 formal detail
|
||
- `GET /admin-api/business/accounting-adjust/page?...objectType=WRITTENOFF_ADJUST` 已返回 formal-first 列表
|
||
|
||
### approve / reject
|
||
- approve:`/admin-api/business/accounting-adjust/approve`
|
||
- 返回 `APPROVED/SUCCESS/UPDATED`
|
||
- 账单 `extended_amount` 归零、`discount_money` 累加、`pay_state=SETTLED(2)`
|
||
- reject:`/admin-api/business/accounting-adjust/reject`
|
||
- 返回 `REJECTED/FAIL/SKIPPED`
|
||
- 账单保持原值,不执行核销回写
|
||
|
||
## 测试数据清理
|
||
smoke 完成后已删除:
|
||
- `biz_operat_log / detail`(identify_value = `992005`, `992006`)
|
||
- `biz_writtenoff_adjust / detail`
|
||
- `biz_charge`(`992005`, `992006`)
|
||
- `biz_cust`(`REV004_WO_SMOKE_A`, `REV004_WO_SMOKE_B`)
|
||
|
||
回读结果:
|
||
- `writtenoff_main_left=0`
|
||
- `operat_log_left=0`
|
||
- `charge_left=0`
|
||
- `cust_left=0`
|
||
|
||
## 运行态清理
|
||
用于 fresh-jar HTTP smoke 的临时实例:
|
||
- port `48093`
|
||
|
||
已停止,当前无残留 LISTEN 进程。
|
||
|
||
## 当前结论
|
||
本轮 writtenoff formal-table 已达到:
|
||
1. DDL 可落库且可幂等重放;
|
||
2. sold submit 能落 pending formal main/detail;
|
||
3. approve/reject 会同步 formal 状态;
|
||
4. detail/page 对 `WRITTENOFF_ADJUST` 已能返回 formal-first 结果;
|
||
5. sold submit 已补事务边界,避免 operat_log 与 formal-table 半成功;
|
||
6. 审批/驳回缺失 formal 主记录时将显式报错,避免静默漏更新。
|
||
|
||
## 当前未完成
|
||
- writtenoff formal-first 目前仍是最小实现,后续仍可优化 page 查询性能(避免 listAll + getView N+1);
|
||
- 若需要更细的 charge_detail 差异映射到 formal 明细,可在后续补强。
|
||
|
||
|
||
## 最终补丁后复核(2026-04-17 14:57 +08:00)
|
||
针对本轮补加的两个可靠性修正再次执行 fresh-jar smoke:
|
||
1. `createSoldAction(...)` 补 `@Transactional`,确保 synthetic `operat_log` 与 formal pending 记录同事务提交;
|
||
2. writtenoff approve/reject 缺失 formal 主记录时改为显式报错,避免静默跳过 formal 状态更新。
|
||
|
||
### fresh jar
|
||
- 端口:`48094`
|
||
- 启动方式:`/usr/bin/java -jar sw-business/sw-business-server/target/sw-business-server.jar --spring.profiles.active=dev --server.port=48094`
|
||
- `GET /actuator/health` 返回:`{"status":"UP"}`
|
||
|
||
### smoke 数据
|
||
- charge `992105`(approve)
|
||
- charge `992106`(reject)
|
||
- submit 返回调整单:
|
||
- `REV004-SLD-992105-20260417145725`
|
||
- `REV004-SLD-992106-20260417145726`
|
||
|
||
### HTTP 结果
|
||
- `sold-submit`:两笔均返回 `PENDING_APPROVAL / PENDING`
|
||
- `get?adjustmentNo=REV004-SLD-992105-20260417145725`:可返回 formal detail(核销金额、账务年月等)
|
||
- `page?objectType=WRITTENOFF_ADJUST`:可返回两笔 fresh smoke formal 记录
|
||
- `approve`:返回 `APPROVED / SUCCESS / UPDATED`
|
||
- `reject`:返回 `REJECTED / FAIL / SKIPPED`
|
||
|
||
### DB 回读
|
||
`biz_writtenoff_adjust`:
|
||
- `REV004-SLD-992105-20260417145725 -> APPROVED | UPDATED | SUCCESS`
|
||
- `REV004-SLD-992106-20260417145726 -> REJECTED | SKIPPED | FAIL`
|
||
|
||
`biz_writtenoff_adjust_detail`:
|
||
- approve 明细:`SUCCESS | APPROVE_EXECUTE | approve final smoke`
|
||
- reject 明细:`REJECTED | REJECT | reject final smoke`
|
||
|
||
`biz_charge`:
|
||
- `992105 -> pay_state=2, extended_amount=0, discount_money=120, original_money=120`
|
||
- `992106 -> pay_state=1, extended_amount=88, discount_money=0, original_money=88`
|
||
|
||
说明:最终补丁后,writtenoff submit / get / page / approve / reject 主链路再次通过,且回写结果与预期一致。
|