# 2026-06-12 报销打款核销上线验证

更新时间：2026-06-12 18:50 CST

## 结论

报销状态机最后一段「`APPROVED` → 打款核销 → `PAID`」已部署云端并用真实接口调用验证通过。报销闭环现在完整覆盖：

```text
机器人草稿 → 系统入库 → 飞书审批 → 自动回调 APPROVED → 打款核销 → PAID
```

资金流水主账原则已落地：`fund_transaction` 记录每一笔真实打款，`reimbursement_payment` 做核销关联，报销单已付金额由核销加和派生。

## 验证步骤与结果

全部按预期，无一例外：

| # | 场景 | 预期 | 结果 |
|---|---|---|---|
| 1 | `RB20260609-97CB911E` 全额打款 0.01 | 流转 `PAID`，写 `paid_at`，创建 `FT20260612-B39EDBB4` | 通过 |
| 2 | 同一 `idempotency_key` 重放 | `idempotent_replay=true`，不重复打款 | 通过 |
| 3 | 已 `PAID` 单再付 | 409 拒绝（only APPROVED） | 通过 |
| 4 | `RB20260609-F392C5DA` 带资金账户打款 | `PAID`，流水挂 `payer_cash_account_id` | 通过 |
| 5 | 复用已核销满的流水给第三单核销 | 409 超额拒绝（unallocated=0.00） | 通过 |
| 6 | `RB20260609-CC5EAD97` 正常打款 | `PAID` | 通过 |
| 7 | `GET /api/reimbursements/:no/payments` 回查 | 流水号、付款方（万物有灵）→收款方（钱丽云）正确 | 通过 |
| 8 | 看板列表回查 | 三张测试单均显示 `PAID` | 通过 |

数据库侧复核：

```text
audit_log(action=record_reimbursement_payment) = 3 条
fund_transaction_allocation_summary：三笔流水 allocated=0.01 / unallocated=0.00
reimbursement_order_summary：三单 paid=0.01 / unpaid=0.00 / status=PAID
```

## 本次产生的测试数据清单（后续整体清理用）

用户口径：当前数据均为测试数据，验证全部做完后整体清理。本次新增：

| 类型 | 标识 |
|---|---|
| 资金账户 | `cac_1781261240741_1387d9f3`（测试-云汉打款账户） |
| 资金流水 | `FT20260612-B39EDBB4`、`FT20260612-6B892E5D`、`FT20260612-A01219E4`（各 0.01） |
| 核销记录 | `rpy_1781261240808_95346b12`、`rpy_1781261240930_93741b28`、`rpy_1781261241034_67e7074f` |
| 状态变更 | `RB20260609-97CB911E` / `RB20260609-F392C5DA` / `RB20260609-CC5EAD97` 由 `APPROVED` → `PAID` |
| 审计日志 | 3 条 `record_reimbursement_payment` |

加上 6 月 8-9 日审批验证产生的草稿、报销单、回调事件，清理时一并处理。

## 仍未覆盖

1. 真实发票 OCR/结构化解析、发票号码去重、税额校验；
2. 审批拒绝、撤回、取消等异常分支的完整回归（下一步）；
3. 部分付款 / 合并打款（一笔大流水核销多单）只过了单元测试和超额守卫，尚无真实多单合并打款用例（测试单都是 0.01，无法拆分）。
