# ERD｜一期业务事实模型关系图

更新时间：2026-06-03  
核心口径：`fund_transaction` 作为真实资金流水主表；应收、应付、报销的实收/实付通过关联表汇总得到。

---

## 1. 总体关系图

```mermaid
erDiagram
    SUBJECT_TYPE ||--o{ SUBJECT : defines
    SUBJECT ||--o{ CASH_ACCOUNT : owns
    SUBJECT ||--o{ PROJECT : owns
    PROJECT ||--o{ COMMERCIAL_ORDER : has
    PROJECT ||--o{ RECEIVABLE : has
    PROJECT ||--o{ PAYABLE : has
    PROJECT ||--o{ REIMBURSEMENT_ITEM : allocates

    SUBJECT ||--o{ FUND_TRANSACTION : pays
    SUBJECT ||--o{ FUND_TRANSACTION : receives
    CASH_ACCOUNT ||--o{ FUND_TRANSACTION : payer_account
    CASH_ACCOUNT ||--o{ FUND_TRANSACTION : receiver_account

    COMMERCIAL_ORDER ||--o{ RECEIVABLE : creates
    RECEIVABLE ||--o{ RECEIVABLE_SETTLEMENT : settled_by
    FUND_TRANSACTION ||--o{ RECEIVABLE_SETTLEMENT : allocates_to_receivable

    PAYABLE ||--o{ PAYABLE_SETTLEMENT : paid_by
    FUND_TRANSACTION ||--o{ PAYABLE_SETTLEMENT : allocates_to_payable

    REIMBURSEMENT_ORDER ||--o{ REIMBURSEMENT_ITEM : contains
    REIMBURSEMENT_ORDER ||--o{ REIMBURSEMENT_PAYMENT : paid_by
    FUND_TRANSACTION ||--o{ REIMBURSEMENT_PAYMENT : pays_reimbursement
    PAYABLE ||--o{ REIMBURSEMENT_ITEM : optional_generated_payable

    EXPENSE_CATEGORY ||--o{ PAYABLE : classifies
    EXPENSE_CATEGORY ||--o{ REIMBURSEMENT_ITEM : classifies
    SOURCE_CATEGORY ||--o{ RECEIVABLE : source
    SOURCE_CATEGORY ||--o{ PAYABLE : source
    SOURCE_CATEGORY ||--o{ FUND_TRANSACTION : source
    SOURCE_CATEGORY ||--o{ REIMBURSEMENT_ITEM : source

    INVOICE ||--o{ INVOICE_LINK : links
    ATTACHMENT ||--o{ FUND_TRANSACTION : proof
    SUBJECT ||--o{ INTAKE_DRAFT : operator
    APPROVAL_INSTANCE ||--o{ INTAKE_DRAFT : controls
    APPROVAL_INSTANCE ||--o{ APPROVAL_LINK : links
    SUBJECT ||--o{ APPROVAL_INSTANCE : applicant
    SUBJECT ||--o{ AUDIT_LOG : operator
```

---

## 2. 核心表职责

| 层级 | 表 | 作用 |
|---|---|---|
| 主体层 | `subject_type` | 主体类型配置：公司、个体户、个人等 |
| 主体层 | `subject` | 通用主体表，不写死公司名称 |
| 账户层 | `cash_account` | 某主体名下的资金账户 |
| 资金事实层 | `fund_transaction` | 每一次真实资金进出，一笔一行，是现金事实主账 |
| 项目层 | `project` | 项目归属主体，含业务项目和基础经营/公共项目 |
| 订单层 | `commercial_order` | 合同/订单/口头合作的一期统一表 |
| 应收层 | `receivable` | 应该收多少钱、何时收、向谁收 |
| 应收核销 | `receivable_settlement` | 某笔资金流水分配给某个应收多少 |
| 应付层 | `payable` | 应该付多少钱、何时付、付给谁 |
| 应付核销 | `payable_settlement` | 某笔资金流水分配给某个应付多少 |
| 报销层 | `reimbursement_order` | 报销单主表 |
| 报销层 | `reimbursement_item` | 报销明细，必须挂项目；无业务项目则挂基础经营项目 |
| 报销核销 | `reimbursement_payment` | 某笔资金流水还了哪张报销单多少 |
| 发票/附件 | `invoice` / `invoice_link` / `attachment` | 发票和凭证证据，不作为现金事实 |
| 机器人草稿 | `intake_draft` | 机器人整理出的结构化入库草稿；审批/确认前不写正式事实 |
| 审批审计 | `approval_instance` / `approval_link` / `audit_log` | 审批来源和修改追踪 |

---

## 3. 资金流水主表关系

```mermaid
flowchart TD
    FT[fund_transaction\n真实资金流水主表]

    FT -->|direction=in| InView[cash_inflow_view\n实际收款视图]
    FT -->|direction=out| OutView[cash_outflow_view\n实际付款视图]

    FT --> RS[receivable_settlement\n应收-资金流水核销]
    RS --> R[receivable\n应收/收入计划]

    FT --> PS[payable_settlement\n应付-资金流水核销]
    PS --> P[payable\n应付/费用义务]

    FT --> RP[reimbursement_payment\n报销-资金流水关联]
    RP --> RO[reimbursement_order\n报销单]

    R -->|sum settlement.amount| RcvAmt[已收金额]
    P -->|sum settlement.amount| PayAmt[已付金额]
    RO -->|sum payment.amount| ReimPaid[报销已付款]
```

关键结论：

```text
receivable.received_amount = sum(receivable_settlement.amount)
payable.paid_amount = sum(payable_settlement.amount)
reimbursement_order.paid_amount = sum(reimbursement_payment.amount)
```

所以“实收/实付”是**关联汇总结果**，不是手工维护的原始事实。

---

## 4. 收入闭环

```mermaid
flowchart LR
    S[subject\n项目归属主体] --> P[project\n业务项目]
    P --> O[commercial_order\n订单/合同]
    O --> R[receivable\n应收计划]
    FT[fund_transaction\n真实收款流水] --> RS[receivable_settlement\n核销分配]
    R --> RS
    RS --> Calc[已收/未收/部分收/逾期]
```

支持场景：

1. 一个合同拆多期应收；
2. 一个应收分多次收款；
3. 一笔到账拆给多个应收/多个项目；
4. 收款先到、项目归属后补；
5. 退款/冲销通过 `fund_transaction.original_transaction_id` 追溯。

---

## 5. 支出闭环

```mermaid
flowchart LR
    S[subject\n项目归属主体] --> P[project\n业务项目或基础经营项目]
    P --> PY[payable\n应付/费用义务]
    FT[fund_transaction\n真实付款流水] --> PS[payable_settlement\n核销分配]
    PY --> PS
    PS --> Calc[已付/未付/部分付/待补票]
    INV[invoice\n发票] -.-> PY
    ATT[attachment\n凭证] -.-> FT
```

支持场景：

1. 已签约但未付款；
2. 一个应付分多次付款；
3. 一笔付款核销多个应付；
4. 供应商合并打款；
5. 支出无法归属业务项目时，落到主体基础经营项目。

---

## 6. 报销闭环

```mermaid
flowchart TD
    RO[reimbursement_order\n报销单] --> RI[reimbursement_item\n报销明细]
    RI --> P[project\n具体业务项目或基础经营项目]
    RI --> INVSTATE[有票/无票/待补票]
    RI --> PERSON[advancer_subject\n垫付人]

    FT[fund_transaction\n真实付款给个人] --> RP[reimbursement_payment\n报销付款关联]
    RP --> RO

    RI --> PLV[personal_ledger_view\n个人账派生]
    RP --> PLV
```

关键规则：

1. 报销明细必须挂项目；
2. 不能挂业务项目时，挂对应主体的基础经营项目；
3. 有票/无票是发票状态，不决定是否能入项目；
4. 是否进入个人账派生由来源分类、发票状态、垫付人、付款状态共同决定。

---

## 7. 个人账派生关系

```mermaid
flowchart LR
    RI[reimbursement_item\n无票/垫付/有票未付] --> PL[personal_ledger_view]
    RP[reimbursement_payment\n公司还个人] --> PL
    FT1[fund_transaction\n个人注资 direction=in] --> PL
    FT2[fund_transaction\n公司还款 direction=out] --> PL
    FT3[fund_transaction\n个人代公司付款] --> PL
    ADJ[internal_adjustment\n内部调整/冲销] --> PL

    PL --> ByPerson[按个人]
    PL --> BySubject[按主体]
    PL --> ByProject[按项目]
    PL --> ByMonth[按月份]
```

个人账不是第一层事实表，而是计算层视图。

---

## 8. 最小闭环录入顺序建议

### 收入录入

```text
1. 维护主体 subject
2. 建项目 project
3. 建订单/合同 commercial_order
4. 建应收 receivable
5. 录入真实收款 fund_transaction(direction=in)
6. 用 receivable_settlement 分配到应收
7. 系统汇总已收/未收状态
```

### 支出录入

```text
1. 确定项目；无法确定项目时选主体基础经营项目
2. 建应付 payable
3. 录入真实付款 fund_transaction(direction=out)
4. 用 payable_settlement 分配到应付
5. 系统汇总已付/未付状态
```

### 报销录入

```text
1. 建报销单 reimbursement_order
2. 建报销明细 reimbursement_item，并挂项目/基础经营项目
3. 记录有票/无票/待补票
4. 实际付款给个人时录入 fund_transaction(direction=out)
5. 用 reimbursement_payment 关联报销单
6. 系统汇总报销已付/未付，并派生个人账
```
