# 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 主链路再次通过,且回写结果与预期一致。