docs(P20T2-5): 差旅对公支付边界事件矩阵收口

这个提交包含在:
2026-03-11 06:41:11 +08:00
父节点 2553955f28
当前提交 b089a65fa9
共修改 5 个文件,包含 43 行新增和 8 行删除
+7
查看文件
@@ -58,3 +58,10 @@
2. 停止交易导入任务与对外同步。
3. 预算恢复到“报销提交时校验”模式。
4. 历史交易只读归档,不做数据删除。
## TRAVEL-2 实施化决议(2026-03-10)
- 在保留本 ADR 原有“企业卡授权 + 交易导入”为主轴的前提下,`P20+TRAVEL-2` 正式采用**混合双轨**:`CardAuthorization / CardTransaction` 承载内部支付账轨,同时新增 `POST /api/travel-orders/:id/mark-paid` 作为运营结算入口。
- 发票绑定采取最小增量实现:仅在 `invoice_pool` 新增 `travel_order_id`,继续复用现有发票池绑定入口;不在本期把发票绑定抽象重构为全域多态模型。
- ERP payment journal 前移到 `TRAVEL-2`:`travel_order.paid` 会直接复用 `erp.journal.export` 出站 `travel_order_payment` journal,但 AP 摘要、核销批次、requeue / dead-letter 运营能力仍明确留在 `TRAVEL-3`。
- 预算语义固定双账轨并存:`travel_request` 继续保留 `reserve / confirm / release` 申请预算;企业卡/支付轨道单独使用 `authorize / settle / reverse`,两条账轨互不回写。
- `freeze-suggestion` 仅记录内部建议与审计摘要,不触发任何真实拒付、冻结或外部清结算动作。
+8 -1
查看文件
@@ -1,4 +1,4 @@
# 领域事件清单(P19 / P19+IM-1 / P19+ERP-3 / P19+AI-1 / P20+TRAVEL-1)
# 领域事件清单(P19 / P19+IM-1 / P19+ERP-3 / P19+AI-1 / P20+TRAVEL-1 / P20+TRAVEL-2)
**快照日期**:2026-03-10
**目标**:冻结 `hyb-oa` 当前采购、资产与差旅域的标准领域事件名,并补充 `P19+IM-1` 已实际消费的 IM 通知类型清单,以及 `P19+ERP-1 / ERP-3 / AI-1 / TRAVEL-1` 已实际落地的消费映射,作为后续 ERP / IM / AI / TRAVEL 适配的事实源。
@@ -22,6 +22,7 @@
| `travel_request.approved` | 差旅申请审批通过后 | `travel_request` | `travelRequestId`, `requestNo`, `approvedBy`, `legalEntityId`, `costCenterId`, `budgetPoolId`, `estimatedAmount`, `tripType`, `status` | IM、Budget、TRAVEL-2/3 | 对应预算 `confirm` 已完成;TRAVEL-1 不做 ERP 出站 |
| `travel_request.rejected` | 差旅申请审批驳回后 | `travel_request` | `travelRequestId`, `requestNo`, `actorId`, `reason`, `status` | IM、Budget、AI | 若存在预算预留,应已释放 |
| `travel_request.withdrawn` | 申请人撤回差旅申请后 | `travel_request` | `travelRequestId`, `requestNo`, `actorId`, `status` | Budget、AI、TRAVEL-2/3 | 动作结果固定回到 `draft`,不是持久状态 |
| `travel_order.paid` | 差旅订单被财务/行政标记为已支付后 | `travel_order` | `travelOrderId`, `travelRequestId`, `externalOrderNo`, `paymentVoucherNo`, `paymentDate`, `paymentChannel`, `amount`, `currency`, `status` | ERP、TRAVEL-3、AI | `TRAVEL-2` 起稳定承诺,用于支付 journal 出站 |
| `purchase_order.archived` | PO/合同归档保存成功后 | `purchase_order_archive` | `purchaseOrderArchiveId`, `purchaseRequestId`, `requestNo`, `poNo`, `contractNo`, `archivedAt`, `totalAmount` | ERP、AI | ERP-2 以此驱动 accrual journal 与 archive summary |
| `asset.card.created` | 资产卡片创建成功后 | `asset_card` | `assetId`, `assetNo`, `name`, `categoryId`, `legalEntityId`, `costCenterId`, `purchaseRequestId`, `status` | ERP、IM、AI | 资产域不接 workflow |
| `asset.assigned` | 资产领用成功后 | `asset_card` | `assetId`, `assetNo`, `employeeId`, `assignedAt`, `location`, `status` | IM、AI | 对应新增 open assignment |
@@ -126,3 +127,9 @@
- 差旅一期运行时会在 `travel_request.submitted` 时创建 workflow 实例、分派 `workflow.task_assigned` 待办,并按预算池解析结果尝试 `reserve`;`travel_request.approved` / `travel_request.rejected` 则分别驱动预算 `confirm` / `release`。
- 当前 IM 已实际消费差旅审批结果通知 `travel_request.approved` 与 `travel_request.rejected`;`travel_request.submitted` 与 `travel_request.withdrawn` 仍作为稳定领域事实保留,不额外新增结果类通知。
- `travel_order.imported` 在 `TRAVEL-1` 当前仍只作为内部集成事实和入站表更新使用,不提升为稳定公共事件,也不在本表作为长期承诺事件名登记。
## 13. P20+TRAVEL-2 已实现消费说明
- `P20+TRAVEL-2` 新增稳定事件名 `travel_order.paid`,并明确 `card_authorization.imported`、`card_transaction.imported`、`card_transaction.reversed` 当前都只保留为内部支付轨道事实,不进入稳定公共事件表。
- `CardAuthorization` 导入成功后写支付预算 `authorize`;`CardTransaction` 的 `charge + settled` 写 `settle`,`refund / reversal` 写 `reverse`,且这些支付账轨不回改 `travel_request` 在 `TRAVEL-1` 已冻结的申请预算确认点。
- 差旅订单只有在已结算交易与订单金额/币种完全匹配时才会从 `imported` 推进到 `confirmed`;之后由 `mark-paid` 手工结算动作把订单推进到 `paid`,形成运营闭环。
- `travel_order.paid` 的固定消费路径为:`travel_order.paid` → `TravelOrderPaymentJournalSlice` → `erp.journal.export`;若 `erp_sync` feature flag 未开启,仅记录审计摘要,不进入 Outbox。
+10 -3
查看文件
@@ -1,8 +1,8 @@
# hyb-oa 实现状态矩阵(P5-P19+IM-1+ERP-3+R10+MCP-1+AI-1+TRAVEL-1)
# hyb-oa 实现状态矩阵(P5-P19+IM-1+ERP-3+R10+MCP-1+AI-1+TRAVEL-1+TRAVEL-2)
**快照日期**:2026-03-10
**范围**:`F1-F42`(含 `F19b/F19c/F19d`)+ `R1-S2` + `P9A1-P9D1` + `P10E1-P10G1` + `G0-G6` + `H1` + `M1-M4` + `P13-0-P13-8` + `P14-0-P14-8` + `P15A-0-P15A-5` + `P15B-0-P15B-6` + `P16A-0-P16A-6` + `P16B-0-P16B-6` + `P16C-0-P16C-6` + `R9-0-R9-3` + `G2-0-G2-6` + `P17A-0-P17A-6` + `P17B-0-P17B-6` + `P18A-0-P18A-6` + `P18B-0-P18B-6` + `P19-0-P19-6` + `P19IM1-0-P19IM1-6` + `P19ERP1-0-P19ERP1-6` + `P19ERP2-0-P19ERP2-6` + `P19ERP3-0-P19ERP3-6` + `R10-0-R10-4` + `P19MCP1-0-P19MCP1-4` + `P19AI1-0-P19AI1-5` + `P20TRAVEL1-0-P20TRAVEL1-5`,共 242 项。
**事实源**:`issues/2026-02-09_13-39-02-p5-blueprint-v3.csv` + `issues/2026-02-09_23-30-00-p6-p8-remaining-work-master.csv` + `issues/2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv` + `issues/2026-02-10_10-35-30-p10-production-hardening.csv` + `issues/2026-02-11-p11-p12-governance-mobile.csv` + `issues/2026-02-12_01-09-41-p13-l5-governance.csv` + `issues/2026-02-13_00-11-56-p14-l5-operationalization.csv` + `issues/2026-03-06_14-30-00-p15a-l5-permission-decouple.csv` + `issues/2026-03-06_14-30-00-p15b-l5-leave-v1.csv` + `issues/2026-03-07_13-47-05-p16a-l5-master-data-core.csv` + `issues/2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv` + `issues/2026-03-07_17-14-39-p16c-l5-suppliers.csv` + `issues/2026-03-07_18-15-03-r9-g2-p19-roadmap-refresh.csv` + `issues/2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv` + `issues/2026-03-07_19-33-09-p17a-l5-procurement-core.csv` + `issues/2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv` + `issues/2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv` + `issues/2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv` + `issues/2026-03-07_23-22-00-p19-l4-integration-readiness.csv` + `issues/2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv` + `issues/2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv` + `issues/2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv` + `issues/2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv` + `issues/2026-03-09_10-15-00-r10-post-erp3-roadmap-refresh.csv` + `issues/2026-03-09_10-25-00-p19-mcp-1-l4-readonly-tools-baseline.csv` + `issues/2026-03-10_12-54-30-p19-ai-1-l5-suggestion-workbench-refresh.csv` + `issues/2026-03-10_17-32-21-p20-travel-1-l5-request-intake-refresh.csv`(执行合同)
**范围**:`F1-F42`(含 `F19b/F19c/F19d`)+ `R1-S2` + `P9A1-P9D1` + `P10E1-P10G1` + `G0-G6` + `H1` + `M1-M4` + `P13-0-P13-8` + `P14-0-P14-8` + `P15A-0-P15A-5` + `P15B-0-P15B-6` + `P16A-0-P16A-6` + `P16B-0-P16B-6` + `P16C-0-P16C-6` + `R9-0-R9-3` + `G2-0-G2-6` + `P17A-0-P17A-6` + `P17B-0-P17B-6` + `P18A-0-P18A-6` + `P18B-0-P18B-6` + `P19-0-P19-6` + `P19IM1-0-P19IM1-6` + `P19ERP1-0-P19ERP1-6` + `P19ERP2-0-P19ERP2-6` + `P19ERP3-0-P19ERP3-6` + `R10-0-R10-4` + `P19MCP1-0-P19MCP1-4` + `P19AI1-0-P19AI1-5` + `P20TRAVEL1-0-P20TRAVEL1-5` + `P20TRAVEL2-0-P20TRAVEL2-5`,共 248 项。
**事实源**:`issues/2026-02-09_13-39-02-p5-blueprint-v3.csv` + `issues/2026-02-09_23-30-00-p6-p8-remaining-work-master.csv` + `issues/2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv` + `issues/2026-02-10_10-35-30-p10-production-hardening.csv` + `issues/2026-02-11-p11-p12-governance-mobile.csv` + `issues/2026-02-12_01-09-41-p13-l5-governance.csv` + `issues/2026-02-13_00-11-56-p14-l5-operationalization.csv` + `issues/2026-03-06_14-30-00-p15a-l5-permission-decouple.csv` + `issues/2026-03-06_14-30-00-p15b-l5-leave-v1.csv` + `issues/2026-03-07_13-47-05-p16a-l5-master-data-core.csv` + `issues/2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv` + `issues/2026-03-07_17-14-39-p16c-l5-suppliers.csv` + `issues/2026-03-07_18-15-03-r9-g2-p19-roadmap-refresh.csv` + `issues/2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv` + `issues/2026-03-07_19-33-09-p17a-l5-procurement-core.csv` + `issues/2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv` + `issues/2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv` + `issues/2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv` + `issues/2026-03-07_23-22-00-p19-l4-integration-readiness.csv` + `issues/2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv` + `issues/2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv` + `issues/2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv` + `issues/2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv` + `issues/2026-03-09_10-15-00-r10-post-erp3-roadmap-refresh.csv` + `issues/2026-03-09_10-25-00-p19-mcp-1-l4-readonly-tools-baseline.csv` + `issues/2026-03-10_12-54-30-p19-ai-1-l5-suggestion-workbench-refresh.csv` + `issues/2026-03-10_17-32-21-p20-travel-1-l5-request-intake-refresh.csv` + `issues/2026-03-10_21-05-59-p20-travel-2-l5-corporate-payments-refresh.csv`(执行合同)
**说明**:
- 本矩阵用于全局读图(审计/交接/回归覆盖追踪),不替代 `issues/*.csv` 的执行合同职责。
@@ -281,3 +281,10 @@
| P20TRAVEL1-3 | 差旅前端入口详情与待办联动 | N/A | 2026-03-09_10-45-00-p20-travel-1-l5-request-intake.csv | 2026-03-10_17-32-21-p20-travel-1-l5-request-intake-refresh.csv | 2026-03-10 | DONE | client:typecheck/build | 新增 `/travel-requests` 列表+详情页,支持创建 / 编辑 / 提交 / 撤回,并打通待办、移动审批、导航与通知深链 |
| P20TRAVEL1-4 | 差旅事件边界与矩阵同步 | N/A | 2026-03-09_10-45-00-p20-travel-1-l5-request-intake.csv | 2026-03-10_17-32-21-p20-travel-1-l5-request-intake-refresh.csv | 2026-03-10 | DONE | validate-feature-matrix | 集成边界、领域事件、Feature Matrix 与事实源校验器同步收口,明确 `TRAVEL-1` 不做 ERP / 供应商 API / 对公支付 |
| P20TRAVEL1-5 | P20TRAVEL1回归与验收收口 | N/A | 2026-03-09_10-45-00-p20-travel-1-l5-request-intake.csv | 2026-03-10_17-32-21-p20-travel-1-l5-request-intake-refresh.csv | 2026-03-10 | DONE | server:test + client:typecheck/build + validate-feature-matrix | 差旅 happy path、权限边界、预算释放、订单关联与既有 IM / ERP / AI / 采购 / 资产主流程回归全部通过 |
| P20TRAVEL2-0 | P20TRAVEL2执行合同刷新建档 | N/A | 2026-03-09_10-55-00-p20-travel-2-l5-corporate-payments.csv | 2026-03-10_21-05-59-p20-travel-2-l5-corporate-payments-refresh.csv | 2026-03-10 | DONE | CSV 校验 | 以 superseding CSV 刷新 TRAVEL-2 执行合同,冻结混合双轨、发票绑定与 ERP payment journal 前移边界 |
| P20TRAVEL2-1 | 统付模型支付权限与双账轨基线 | N/A | 2026-03-09_10-55-00-p20-travel-2-l5-corporate-payments.csv | 2026-03-10_21-05-59-p20-travel-2-l5-corporate-payments-refresh.csv | 2026-03-10 | DONE | server:prisma-validate + server:test | 新增 `CardAuthorization`、`CardTransaction`、`travel_order` 支付字段、`invoice_pool.travel_order_id` 与 `travel.payment.manage`,并冻结 authorize/settle/reverse 支付账轨 |
| P20TRAVEL2-2 | 授权交易导入与订单确认语义 | N/A | 2026-03-09_10-55-00-p20-travel-2-l5-corporate-payments.csv | 2026-03-10_21-05-59-p20-travel-2-l5-corporate-payments-refresh.csv | 2026-03-10 | DONE | server:test | 授权/交易导入具备幂等与清晰 skip reason,精确匹配的 settled charge 可把 `TravelOrder` 从 `imported` 推进到 `confirmed` |
| P20TRAVEL2-3 | 发票绑定标记已支付与ERP journal出站 | N/A | 2026-03-09_10-55-00-p20-travel-2-l5-corporate-payments.csv | 2026-03-10_21-05-59-p20-travel-2-l5-corporate-payments-refresh.csv | 2026-03-10 | DONE | server:test | 发票池支持 `travelOrderId` 排他绑定,`mark-paid` 支持幂等支付确认,并按 `travel_order.paid` 复用 `erp.journal.export` 出站 |
| P20TRAVEL2-4 | 差旅前端支付轨道与发票绑定交互 | N/A | 2026-03-09_10-55-00-p20-travel-2-l5-corporate-payments.csv | 2026-03-10_21-05-59-p20-travel-2-l5-corporate-payments-refresh.csv | 2026-03-10 | DONE | client:typecheck/build | 差旅详情新增对公支付轨道卡片,支持只读摘要、标记已支付、发票绑定与冻结建议交互,失败仅卡片内降级 |
| P20TRAVEL2-5 | P20TRAVEL2文档矩阵同步与回归收口 | N/A | 2026-03-09_10-55-00-p20-travel-2-l5-corporate-payments.csv | 2026-03-10_21-05-59-p20-travel-2-l5-corporate-payments-refresh.csv | 2026-03-10 | DONE | server:test + client:typecheck/build + validate-feature-matrix | ADR、边界文档、领域事件、Feature Matrix 与全量回归同步收口,主线里程碑推进到 248 |
+17 -4
查看文件
@@ -1,7 +1,7 @@
# 集成边界冻结(P19 / P19+IM-1 / P19+ERP-3 / R10 / P19+MCP-1 / P19+AI-1 / P20+TRAVEL-1)
# 集成边界冻结(P19 / P19+IM-1 / P19+ERP-3 / R10 / P19+MCP-1 / P19+AI-1 / P20+TRAVEL-1 / P20+TRAVEL-2)
**快照日期**:2026-03-10
**当前基线**:`P19+IM-1`、`P19+ERP-1`、`P19+ERP-2`、`P19+ERP-3`、`P19+MCP-1`、`P19+AI-1` 与 `P20+TRAVEL-1` 已完成;当前运行时已落地企微群机器人 + 深链 + Outbox 异步派发的一期协同适配,以及 ERP 主数据 Pull、报销付款凭证切片、采购双阶段 journal / 归档摘要出站、资产台账摘要出站、Postgres MCP 只读工具基线、报销 / 采购 / 资产详情页 AI 只读建议挂件,以及差旅申请主单 / 行程段 / 审批预算锁定 / `travel_orders` 关联入站的一期差旅基线。
**当前基线**:`P19+IM-1`、`P19+ERP-1`、`P19+ERP-2`、`P19+ERP-3`、`P19+MCP-1`、`P19+AI-1` 与 `P20+TRAVEL-1`、`P20+TRAVEL-2` 已完成;当前运行时已落地企微群机器人 + 深链 + Outbox 异步派发的一期协同适配,以及 ERP 主数据 Pull、报销付款凭证切片、采购双阶段 journal / 归档摘要出站、资产台账摘要出站、Postgres MCP 只读工具基线、报销 / 采购 / 资产详情页 AI 只读建议挂件,以及差旅申请主单 / 行程段 / 审批预算锁定 / `travel_orders` 关联入站与混合双轨对公支付闭环的两期差旅基线。
**目标**:在保持核心域稳定的前提下,冻结 ERP / IM / AI / MCP / TRAVEL 的长期边界,并记录 IM 一期、ERP 三期、AI 一期与差旅一期的已实现范围、禁入规则以及 R10 之后的固定主线顺序。
## 1. 总体原则
@@ -142,7 +142,7 @@
- 已在报销详情、采购详情、资产详情挂载 AI 建议卡片;当权限不足、总闸关闭、feature flag 未命中、上游超时或响应非法时,仅在卡片内降级展示,不影响主体页面渲染与业务动作。
- 已固定审计动作 `AI_SUGGESTION_REQUESTED`,仅记录 `targetType / targetId / provider / model / promptHash / tokenUsage / featureFlag`,不记录原始 prompt、脱敏前 payload 或上游全文。
## 5. 差旅一期边界
## 5. 差旅边界
### 5.1 P20+TRAVEL-1 已实现范围
- 已新增 `TravelRequest`、`TravelRequestSegment` 与 `travel_orders.travel_request_id`,形成“差旅申请主单 + 行程段明细 + 外部订单事实关联”的一期差旅模型。
@@ -157,6 +157,19 @@
- 不做企业卡授权、交易导入、对公支付与清结算,这些能力继续固定在 `P20+TRAVEL-2` / `P20+TRAVEL-3`。
- `travel_order.imported` 当前仍只是内部集成事实与入站表更新,不提升为稳定公共事件名。
### 5.3 P20+TRAVEL-2 已实现范围
- 已新增 `CardAuthorization`、`CardTransaction`、`travel_orders` 支付字段与 `invoice_pool.travel_order_id`,形成“申请预算轨 + 企业卡支付轨 + 手工结算入口”的混合双轨模型。
- 已新增 `travel.payment.manage` 权限,以及 `GET /api/travel/authorizations`、`POST /api/travel/authorizations/import`、`GET /api/travel/transactions`、`POST /api/travel/transactions/import`、`POST /api/travel/transactions/:id/freeze-suggestion`、`POST /api/travel-orders/:id/mark-paid`、`GET /api/travel-requests/:id/payment-track`。
- 已固定 `travel_request` 申请预算语义继续停留在 `reserve / confirm / release`;`TRAVEL-2` 新增支付预算语义 `authorize / settle / reverse`,实体维度分别落在 `card_authorization` 与 `card_transaction`。
- 已固定 `charge + settled + 金额币种精确匹配` 才能把 `TravelOrder` 从 `imported` 推进到 `confirmed`;`mark-paid` 只允许 `confirmed -> paid` 或同 payload 幂等重放,不回改差旅申请审批状态。
- 已固定 `travel_order.paid` 为本期唯一新增稳定公共事件名,并在 `erp_sync` 总闸开启时直接复用 `erp.journal.export` 出站 `travel_order_payment` journal;发票仅绑定到订单,默认不自动归档,AP 摘要与核销仍留给 `TRAVEL-3`。
### 5.4 差旅二期明确不做
- 不接真实商旅供应商 API,不做出票、改签、退票、拒付、退款回调或银行清结算。
- 不把 `travel_request.approved -> budget confirm` 的申请预算语义后移到支付阶段。
- 不在 `TRAVEL-2` 提前实现 AP 摘要桥接、核销批次、requeue / dead-letter 运营面板;这些能力继续固定在 `P20+TRAVEL-3`。
- `card_authorization.imported`、`card_transaction.imported`、`card_transaction.reversed` 当前仍只作为内部导入事实与支付轨道明细,不提升为稳定公共事件名。
## 6. 事件与通知交付规范
### 6.1 事件最小结构
@@ -215,7 +228,7 @@
## 9. R10 后续路线冻结
### 9.1 固定主线顺序
- `P20+TRAVEL-1` 已完成后,当前固定后续主线顺序为:`P20+TRAVEL-2 -> P20+TRAVEL-3 -> P21+PWA-1 -> P21+PWA-2`。
- `P20+TRAVEL-2` 已完成后,当前固定后续主线顺序为:`P20+TRAVEL-3 -> P21+PWA-1 -> P21+PWA-2`。
- 历史主线顺序仍保持:`P19+MCP-1 -> P19+AI-1 -> P20+TRAVEL-1 -> P20+TRAVEL-2 -> P20+TRAVEL-3 -> P21+PWA-1 -> P21+PWA-2`。
- 后续阶段继续遵循“先治理,再工具,再建议,再业务,再移动”的总顺序,不并行开启两个重业务 phase。
- 每个 phase 固定遵循:`执行合同 CSV -> 方案批准 -> 开发 -> 测试 -> 文档矩阵收口 -> 合并 main`。