# 财务ERP - 进销存模块（采购与台账）开发纲要

## 文档说明
本文档为20260618进销存模块梳理后的开发纲要，简明列出业务目标、核心功能、数据库设计及开发优先级，便于开发团队快速把握全貌。


## 版本历史
| 版本 | 日期 | 修改内容 | 作者 |
|------|------|---------|------|
| v1.0 | 2026-06-25 | 初稿 | 架构组 |


## 1. 业务目标

打通采购业务与财务核算的闭环，实现：
- 采购订单 → 付款 → 入库 → 发票 全流程自动记账
- 多维度台账查询（采购账户、供应商、发票、库存）
- 移动加权平均成本核算
- 账期采购的批量结算与对账


## 2. 核心功能模块

### 2.1 功能模块总览

| 序号 | 模块 | 核心功能 | 优先级 |
|------|------|---------|--------|
| 1 | 基础配置 | 采购账户配置、供应商收款账户、进销存全局配置 | P0 |
| 2 | 采购订单（会计版） | 订单创建、付款、退款、入库、退货、状态管理 | P0 |
| 3 | 采购账户台账 | 台账列表查询、台账付款、批量对账单上传、图表统计 | P0 |
| 4 | 供应商台账 | 供应商汇总查询、未开票明细导出 | P0 |
| 5 | 发票台账 | 发票同步（税局API）、发票入账、发票查询 | P0 |
| 6 | 本地仓库台账 | 移动加权平均计算、汇总账、明细账、勾稽校验 | P1 |

### 2.2 业务流程图

**核心流程：采购 → 财务全链路**

```
┌─────────────────────────────────────────────────────────────────────────────┐
│                           采购全流程业务图                                  │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ┌─────────┐     ┌─────────┐     ┌─────────┐     ┌─────────┐                │
│  │ 创建订单 │────▶│ 确认订单 │───▶│ 采购付款 │────▶│ 采购入库 │                 │
│  └─────────┘     └─────────┘     └────┬────┘     └────┬────┘                │
│                                       │               │                    │
│                                       ▼               ▼                    │
│                                 ┌─────────────────────────────┐             │
│                                 │        自动生成凭证           │             │
│                                 │  付款凭证 / 在途库存凭证       │             │
│                                 └─────────────────────────────┘             │
│                                                  │                         │
│                                                  ▼                         │
│  ┌─────────┐     ┌─────────┐     ┌─────────────────────────────┐           │
│  │ 发票入账 │◀────│ 发票同步 │◀────│       发票台账               │           │
│  └────┬────┘     └─────────┘     └─────────────────────────────┘           │
│       │                                                                     │
│       ▼                                                                     │
│  ┌─────────────────────────────────────────────────────────────┐            │
│  │                    台账管理                                  │            │
│  │  采购账户台账  │  供应商台账  │  本地仓库台账  │  FBA仓库台账│     │            │
│  └─────────────────────────────────────────────────────────────┘            │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘
```

**账期付款流程：**

```
采购订单(账期付款) ──▶ 生成凭证(应付账款) ──▶ 进入采购账户台账
                              │
                              ▼
                    台账付款(批量勾选)
                              │
                              ▼
              选择现金账户实际支付 ──▶ 生成凭证(还款)
                              │
                              ▼
                    更新订单付款状态
```

**发票入账流程：**

```
税局API ──▶ 发票同步 ──▶ 发票台账(未入账)
                              │
                              ▼
                    匹配采购订单(供应商)
                              │
                              ▼
                    发票入账(勾选确认)
                              │
                              ▼
                    生成凭证 ──▶ 更新订单开票状态
```


## 3. 状态机设计

### 3.1 采购订单状态（四维状态）

| 状态维度 | 编码 | 说明 | 流转条件 |
|---------|------|------|---------|
| **订单状态** | 1-草稿 | 初始状态 | 创建时 |
| | 2-已确认 | 订单生效 | 用户确认 |
| | 3-已完成 | 全部完成 | 付款+入库完成 |
| | 4-已取消 | 订单取消 | 仅草稿可取消 |
| **付款状态** | 1-未付款 | 初始 | 创建时 |
| | 2-部分付款 | 已付>0且<总额 | 付款操作 |
| | 3-已付款 | 已付=总额 | 付款完成 |
| | 4-退款中 | 已发起退款 | 退款操作 |
| | 5-已退款 | 退款完成 | 退款完成 |
| **库存状态** | 1-未收货 | 初始 | 创建时 |
| | 2-部分收货 | 已收>0且<数量 | 入库操作 |
| | 3-已收货 | 已收=数量 | 入库完成 |
| **发票状态** | 1-未开票 | 初始 | 创建时 |
| | 2-部分开票 | 已开>0且<总额 | 发票入账 |
| | 3-已开票 | 已开=总额 | 开票完成 |

### 3.2 付款状态流转图

```
                    ┌──────────────────────────────────────┐
                    │                                      │
                    ▼                                      │
   ┌─────────┐     ┌─────────┐     ┌─────────┐             │
   │ 未付款  │────▶│ 部分付款 │────▶│ 已付款   │             │
   └─────────┘     └─────────┘     └────┬────┘             │
        │                                │                 │
        │                                ▼                 │
        │                         ┌──────────┐             │
        │                         │ 退款中    │             │
        │                         └────┬─────┘             │
        │                              │                   │
        │                              ▼                   │
        │                         ┌──────────┐             │
        └────────────────────────▶│ 已退款   │─────────────┘
                                  └──────────┘
```


## 4. 核心业务规则

### 4.1 凭证生成规则

| 业务场景 | 借方科目 | 贷方科目 | 辅助核算 |
|---------|---------|---------|---------|
| 现金付款 | 预付账款-ERP采购供应商 | 银行存款/其他货币资金 | 供应商 |
| 账期付款 | 预付账款-ERP采购供应商 | 应付账款-XXX（账期户） | 供应商 |
| 在途库存确认 | 在途库存_XX仓库 | 预付账款-ERP在途发票 | 存货(SKU) |
| 采购入库 | 库存商品_XX仓库 | 在途库存_XX仓库 | 存货(SKU) |
| 发票入账 | 预付账款-ERP在途发票 | 预付账款-ERP采购供应商 | 供应商 |
| 账期还款 | 应付账款-XXX（账期户） | 银行存款/其他货币资金 | 供应商 |
| 退款（反向） | 对应贷方科目 | 对应借方科目 | 供应商/存货 |

### 4.2 成本核算规则

| 规则项 | 说明 |
|--------|------|
| 核算方法 | 移动加权平均法 |
| 单价精度 | 保留4位小数 |
| 金额精度 | 保留2位小数 |
| 入库影响 | 每笔采购入库重新计算单价 |
| 出库影响 | 使用当前单价计算成本，不改变单价 |
| 余额计算 | 滚动加减，不反算 |
| 尾差处理 | 出库时先乘后减，差额归入最后一条 |
| 核算周期 | 按月汇总，逐笔明细 |

### 4.3 台账核算规则

| 规则项 | 说明 |
|--------|------|
| 请款金额 | 仅统计"归属供应商款项"的费用类型 |
| 待付金额 | 请款金额 - 已付金额 |
| 待入库金额 | 库存价值 - 已入库价值 |
| 待开票金额 | 应开票金额 - 已开票金额 |
| 应开票金额 | 归属供应商的请款金额（即待开票订单总额） |
| 分摊方式 | 按比例分摊，尾差归最后一条 |
| 退款处理 | 红字冲销，减少请款/已付/库存/开票金额 |


## 5. 数据库设计

### 5.1 ER图（核心表关系）

```
┌─────────────────────────┐
│  fin_purchase_account   │
│  (采购账户)              │
└───────────┬─────────────┘
            │ 1
            │
            │ N
┌───────────▼─────────────┐          ┌─────────────────────────┐
│   fin_purchase_order    │──────────│   t_erp_supplier        │
│   (采购订单-会计版)       │ N       1│   (供应商-ERP)           │
└───────────┬─────────────┘          └─────────────────────────┘
            │ 1                              │
            │                                │ 1
            │ N                              │
┌───────────▼─────────────┐          ┌───────▼─────────────────┐
│  fin_purchase_payment   │          │   fin_supplier_bank     │
│  (采购付款明细)           │          │   (供应商收款账户)        │
└───────────┬─────────────┘          └─────────────────────────┘
            │
            │ N:1
┌───────────▼─────────────┐          ┌─────────────────────────┐
│    fin_vouchers         │          │   fin_invoice           │
│    (凭证-现有表)         │◀─────────│   (发票台账)             │
└─────────────────────────┘          └─────────────────────────┘
                                                │
┌─────────────────────────┐          ┌───────────▼─────────────┐
│  fin_warehouse_stock    │          │ fin_inventory_transaction│
│  (库存余额)              │          │ (库存变动明细)            │
└───────────┬─────────────┘          └───────────┬─────────────┘
            │                                    │
            └───────────────────┬────────────────┘
                                │
                    ┌───────────▼─────────────┐
                    │      fin_vouchers        │
                    │      (凭证-关联)          │
                    └─────────────────────────┘
```

### 5.2 新增表清单

| 序号 | 表名 | 说明 | 关联模块 |
|------|------|------|---------|
| 1 | `fin_purchase_account` | 采购账户配置表 | 基础配置 |
| 2 | `fin_supplier_bank` | 供应商收款账户表 | 基础配置 |
| 3 | `fin_purchase_order` | 采购订单表（会计版） | 采购订单 |
| 4 | `fin_purchase_payment` | 采购付款明细表 | 采购订单/台账 |
| 5 | `fin_invoice` | 发票台账表 | 发票台账 |
| 6 | `fin_warehouse_stock` | 库存余额表 | 库存台账 |
| 7 | `fin_inventory_transaction` | 库存变动明细表 | 库存台账 |

### 5.3 表结构详情

#### 5.3.1 采购账户表 `fin_purchase_account`

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `id` | bigint unsigned | ✅ | 主键，自增 |
| `groupid` | bigint unsigned | ✅ | 租户ID（账套），索引 |
| `account_name` | varchar(100) | ✅ | 账户名称，同租户唯一 |
| `account_type` | tinyint | ✅ | 1-现金，2-账期，默认1 |
| `related_subject_id` | bigint unsigned | ✅ | 对应会计科目ID |
| `config_json` | json | ✅ | 完整配置JSON |
| `is_enabled` | tinyint | | 是否启用，默认1 |
| `created_time` | datetime | | 创建时间，自动 |
| `updated_time` | datetime | | 更新时间，自动 |

**config_json 结构：**
```json
{
  "feeTypes": [
    { "code": "GOODS", "name": "货款", "isSupplierRelated": true },
    { "code": "FREIGHT", "name": "运费", "isSupplierRelated": true },
    { "code": "SERVICE", "name": "跨境直采手续费", "isSupplierRelated": false }
  ],
  "paySubjectMapping": {
    "GOODS": { "debitSubjectId": 101, "creditSubjectId": 201 }
  },
  "refundMapping": {
    "GOODS": { "debitSubjectId": 201, "creditSubjectId": 101 }
  },
  "creditPayAccounts": [
    { "cashAccountId": 1, "subjectMapping": { "debit": 301, "credit": 201 } }
  ]
}
```

#### 5.3.2 供应商收款账户表 `fin_supplier_bank`

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `id` | bigint unsigned | ✅ | 主键，自增 |
| `groupid` | bigint unsigned | ✅ | 租户ID |
| `supplier_id` | bigint unsigned | ✅ | 供应商ID，索引 |
| `bank_name` | varchar(100) | | 开户银行 |
| `account_name` | varchar(100) | ✅ | 收款账户名称 |
| `account_no` | varchar(50) | ✅ | 收款账号 |
| `is_default` | tinyint | | 是否默认，默认0 |
| `is_enabled` | tinyint | | 是否启用，默认1 |
| `created_time` | datetime | | 创建时间，自动 |

#### 5.3.3 采购订单表 `fin_purchase_order`

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `id` | bigint unsigned | ✅ | 主键，自增 |
| `groupid` | bigint unsigned | ✅ | 租户ID，索引 |
| `supplier_id` | bigint unsigned | ✅ | 供应商ID |
| `purchase_account_id` | bigint unsigned | ✅ | 采购账户ID |
| `sku` | varchar(50) | ✅ | SKU编码 |
| `warehouse_code` | varchar(50) | ✅ | 入库仓库编码 |
| `order_qty` | decimal(12,2) | ✅ | 订单数量，>0 |
| `unit_price` | decimal(18,4) | | 采购单价，≥0 |
| `total_amount` | decimal(18,2) | ✅ | 订单金额 |
| `paid_amount` | decimal(18,2) | | 累计已付，默认0 |
| `inventory_value` | decimal(18,2) | | 库存价值，默认0 |
| `invoiced_amount` | decimal(18,2) | | 已开票金额，默认0 |
| `status_order` | tinyint | | 1-草稿，2-已确认，3-已完成，4-已取消 |
| `status_pay` | tinyint | | 1-未付款，2-部分付款，3-已付款，4-退款中，5-已退款 |
| `status_inv` | tinyint | | 1-未开票，2-部分开票，3-已开票 |
| `status_stock` | tinyint | | 1-未收货，2-部分收货，3-已收货 |
| `created_time` | datetime | | 创建时间，自动 |
| `updated_time` | datetime | | 更新时间，自动 |

**索引建议**：`(groupid, supplier_id)`, `(groupid, status_pay)`, `(groupid, status_inv)`, `(groupid, status_stock)`

#### 5.3.4 采购付款明细表 `fin_purchase_payment`

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `id` | bigint unsigned | ✅ | 主键，自增 |
| `purchase_order_id` | bigint unsigned | ✅ | 采购订单ID，索引 |
| `purchase_account_id` | bigint unsigned | ✅ | 采购账户ID |
| `voucher_id` | bigint unsigned | | 关联凭证ID，索引 |
| `fee_type` | varchar(50) | ✅ | 费用类型 |
| `is_supplier_related` | tinyint | | 是否归属供应商，默认1 |
| `amount` | decimal(18,2) | ✅ | 支付金额 |
| `payment_date` | date | ✅ | 付款日期 |
| `is_refund` | tinyint | | 是否退款，默认0 |
| `refund_original_id` | bigint unsigned | | 退款对应的原付款明细ID |
| `status` | tinyint | | 0-正常，1-已退款，默认0 |
| `created_time` | datetime | | 创建时间，自动 |

#### 5.3.5 发票台账表 `fin_invoice`

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `id` | bigint unsigned | ✅ | 主键，自增 |
| `invoice_no` | varchar(100) | ✅ | 数电发票号码，唯一 |
| `invoice_type` | varchar(20) | ✅ | 数电专票/普票/传统 |
| `groupid` | bigint unsigned | | 入账账套ID，索引 |
| `supplier_id` | bigint unsigned | | 匹配的供应商ID |
| `seller_name` | varchar(200) | ✅ | 销方名称 |
| `seller_tax_no` | varchar(50) | | 销方税号 |
| `invoice_date` | date | ✅ | 开票日期 |
| `amount_with_tax` | decimal(18,2) | ✅ | 价税合计 |
| `amount_without_tax` | decimal(18,2) | ✅ | 不含税金额 |
| `tax_amount` | decimal(18,2) | ✅ | 税额 |
| `status` | varchar(20) | | NORMAL/CANCELLED/RED_ALL/RED_PART/ABNORMAL |
| `posting_status` | tinyint | | 0-未入账，1-已入账，默认0 |
| `voucher_id` | bigint unsigned | | 入账凭证ID |
| `sync_time` | datetime | | 同步时间 |
| `created_time` | datetime | | 创建时间，自动 |

#### 5.3.6 库存余额表 `fin_warehouse_stock`

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `id` | bigint unsigned | ✅ | 主键，自增 |
| `groupid` | bigint unsigned | ✅ | 租户ID |
| `sku` | varchar(50) | ✅ | SKU编码 |
| `warehouse_code` | varchar(50) | ✅ | 仓库编码 |
| `warehouse_type` | tinyint | | 1-本地，2-FBA，默认1 |
| `current_qty` | decimal(12,2) | | 当前数量，默认0 |
| `current_amount` | decimal(18,2) | | 当前金额，默认0 |
| `unit_cost` | decimal(18,4) | | 移动平均单价，默认0 |
| `period` | varchar(6) | ✅ | 会计期间（YYYYMM） |
| `updated_time` | datetime | | 更新时间，自动 |

**唯一索引**：`(groupid, sku, warehouse_code, warehouse_type, period)`

#### 5.3.7 库存变动明细表 `fin_inventory_transaction`

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `id` | bigint unsigned | ✅ | 主键，自增 |
| `groupid` | bigint unsigned | ✅ | 租户ID |
| `sku` | varchar(50) | ✅ | SKU编码 |
| `warehouse_code` | varchar(50) | ✅ | 仓库编码 |
| `trans_date` | date | ✅ | 变动日期 |
| `trans_type` | varchar(50) | ✅ | PURCHASE_IN/SALE_OUT/TRANSFER_IN/ADJUST |
| `source_doc_id` | varchar(100) | | 来源单据号 |
| `qty_change` | decimal(12,2) | ✅ | 正为入库，负为出库 |
| `amount_change` | decimal(18,2) | ✅ | 金额变动 |
| `unit_cost` | decimal(18,4) | | 发生时单价 |
| `voucher_id` | bigint unsigned | | 关联凭证ID，索引 |
| `created_time` | datetime | | 创建时间，自动 |

### 5.4 与现有表的关系

| 现有表 | 关联方式 | 说明 |
|--------|---------|------|
| `fin_accounting_subjects` | `subject_id` | 采购账户关联科目，凭证分录使用 |
| `fin_vouchers` | `voucher_id` | 付款、入库、发票入账生成的凭证 |
| `fin_voucher_entries` | `voucher_id` | 凭证分录明细 |
| `fin_voucher_entries_auxiliary` | `entry_id` | 供应商/存货辅助核算 |
| `t_erp_supplier` | `supplier_id` | 供应商主数据（跨模块） |
| `t_erp_sku` | `sku` | SKU主数据（跨模块） |
| `t_erp_warehouse` | `warehouse_code` | 仓库主数据（跨模块） |

### 5.5 索引清单

| 表 | 索引字段 | 类型 | 用途 |
|----|---------|------|------|
| `fin_purchase_account` | `groupid` | 普通 | 租户隔离 |
| `fin_supplier_bank` | `supplier_id` | 普通 | 按供应商查询 |
| `fin_supplier_bank` | `(groupid, supplier_id)` | 复合 | 租户+供应商查询 |
| `fin_purchase_order` | `groupid` | 普通 | 租户隔离 |
| `fin_purchase_order` | `(groupid, supplier_id)` | 复合 | 供应商台账查询 |
| `fin_purchase_order` | `(groupid, status_pay)` | 复合 | 付款状态筛选 |
| `fin_purchase_order` | `(groupid, status_inv)` | 复合 | 发票状态筛选 |
| `fin_purchase_order` | `(groupid, status_stock)` | 复合 | 库存状态筛选 |
| `fin_purchase_payment` | `purchase_order_id` | 普通 | 订单关联查询 |
| `fin_purchase_payment` | `voucher_id` | 普通 | 凭证关联查询 |
| `fin_invoice` | `invoice_no` | 唯一 | 发票去重 |
| `fin_invoice` | `groupid` | 普通 | 租户隔离 |
| `fin_invoice` | `(groupid, posting_status)` | 复合 | 入账状态筛选 |
| `fin_warehouse_stock` | `(groupid, sku, warehouse_code, warehouse_type, period)` | 唯一 | 期间库存查询 |
| `fin_inventory_transaction` | `(groupid, sku)` | 复合 | SKU明细查询 |
| `fin_inventory_transaction` | `voucher_id` | 普通 | 凭证关联查询 |


## 6. 接口清单

### 6.1 基础配置接口

| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/api/finance/purchase/account/create` | 创建采购账户 |
| PUT | `/api/finance/purchase/account/update` | 更新采购账户 |
| GET | `/api/finance/purchase/account/list` | 查询采购账户列表 |
| GET | `/api/finance/purchase/account/detail/{id}` | 查询采购账户详情 |
| POST | `/api/finance/supplier/bank/save` | 保存供应商收款账户 |
| GET | `/api/finance/supplier/bank/list` | 查询供应商收款账户列表 |

### 6.2 采购订单接口

| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/api/finance/purchase/order/create` | 创建采购订单 |
| POST | `/api/finance/purchase/order/confirm` | 确认订单 |
| POST | `/api/finance/purchase/order/pay` | 采购付款 |
| POST | `/api/finance/purchase/order/refund` | 采购退款 |
| POST | `/api/finance/purchase/order/receive` | 采购入库 |
| POST | `/api/finance/purchase/order/return` | 采购退货 |
| GET | `/api/finance/purchase/order/page` | 订单列表查询 |
| GET | `/api/finance/purchase/order/detail/{id}` | 订单详情查询 |

### 6.3 台账接口

| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/finance/ledger/purchase/page` | 采购账户台账列表 |
| POST | `/api/finance/ledger/purchase/ledger-pay` | 台账付款 |
| POST | `/api/finance/ledger/purchase/upload-pay` | 上传对账单批量付款 |
| GET | `/api/finance/ledger/purchase/statistics` | 台账图表统计 |
| GET | `/api/finance/ledger/supplier/page` | 供应商台账列表 |
| GET | `/api/finance/ledger/supplier/export-uninvoiced` | 导出未开票明细 |

### 6.4 发票接口

| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/api/finance/ledger/invoice/sync` | 手动同步发票 |
| GET | `/api/finance/ledger/invoice/page` | 发票台账列表 |
| POST | `/api/finance/ledger/invoice/post` | 发票入账 |
| GET | `/api/finance/ledger/invoice/statistics` | 发票统计 |

### 6.5 库存接口

| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/finance/ledger/stock/summary` | 库存汇总账 |
| GET | `/api/finance/ledger/stock/detail` | 库存明细账 |
| GET | `/api/finance/ledger/stock/check` | 勾稽校验 |


## 7. 开发优先级与排期

### 7.1 优先级定义

| 等级 | 说明 | 必须完成时间 |
|------|------|-------------|
| **P0** | 核心功能，必须上线 | 第4周末 |
| **P1** | 重要功能，上线后尽快完成 | 第6周末 |
| **P2** | 增强功能，后续迭代 | 后续版本 |

### 7.2 排期总览

| 阶段 | 周期 | 模块 | 任务数 | 优先级 |
|------|------|------|--------|--------|
| 阶段一 | 第1周 | 基础配置 | 4 | P0 |
| 阶段二 | 第2-3周 | 采购订单（会计版） | 7 | P0 |
| 阶段三 | 第3-4周 | 采购账户台账 | 5 | P0 |
| 阶段四 | 第4-5周 | 发票台账与供应商台账 | 5 | P0 |
| 阶段五 | 第5-6周 | 库存台账 | 6 | P1 |
| 阶段六 | 第6周 | 联调与测试 | - | P0/P1 |

### 7.3 里程碑

| 里程碑 | 时间 | 交付物 | 验收标准 |
|--------|------|--------|---------|
| M1 | 第1周末 | 基础配置上线 | 采购账户CRUD、供应商收款账户管理可用 |
| M2 | 第3周末 | 采购订单上线 | 订单创建、付款、退款、入库、凭证生成可用 |
| M3 | 第4周末 | 台账模块上线 | 采购账户台账、台账付款、批量对账单可用 |
| M4 | 第5周末 | 发票模块上线 | 发票同步、发票入账、供应商台账可用 |
| M5 | 第6周中 | 库存模块上线 | 汇总账、明细账、勾稽校验可用 |
| M6 | 第6周末 | 全量联调上线 | 端到端流程测试通过，数据迁移完成 |

### 7.4 任务依赖关系

```
基础配置 (P0)
    │
    ├── 采购订单 (P0)
    │       │
    │       ├── 采购账户台账 (P0)
    │       │       │
    │       │       └── 批量对账单上传 (P0)
    │       │
    │       ├── 发票台账 (P0)
    │       │       │
    │       │       └── 供应商台账 (P0)
    │       │
    │       └── 库存台账 (P1)
    │               │
    │               ├── 移动加权平均 (P1)
    │               │
    │               └── 勾稽校验 (P1)
    │
    └── 供应商收款账户 (P0) ──▶ 采购订单付款
```


## 8. 测试验收要点

### 8.1 核心流程测试

| 测试场景 | 验证点 |
|---------|--------|
| 现金采购完整流程 | 订单创建→付款→入库→发票入账，凭证正确，状态流转正确 |
| 账期采购完整流程 | 订单创建→账期付款→台账付款→入库→发票入账，凭证正确 |
| 部分付款+部分入库 | 状态正确（部分付款/部分收货），金额正确 |
| 退款（已付款未入库） | 红字凭证，状态变为已退款 |
| 退款（已付款已入库） | 退货凭证，库存回退，状态正确 |
| 批量对账单上传 | Excel解析→预览→确认→批量生成凭证 |

### 8.2 台账查询测试

| 测试场景 | 验证点 |
|---------|--------|
| 采购账户台账列表 | 各金额字段正确，汇总行准确 |
| 供应商台账 | 按供应商汇总数据正确 |
| 发票台账 | 同步数据完整，入账状态正确 |
| 库存汇总账 | 期初/入库/出库/期末数据正确 |
| 库存明细账 | 逐笔变动可追溯，联查凭证 |

### 8.3 数据一致性测试

| 测试项 | 验证方法 |
|--------|---------|
| 订单金额 = 付款明细合计 | 查询统计对比 |
| 库存价值 = 入库明细合计 | 查询统计对比 |
| 已开票金额 = 发票入账金额合计 | 查询统计对比 |
| 库存余额 = 期初 + 入库 - 出库 | 滚动计算校验 |
| 库存余额 = 总账科目余额 | 勾稽校验接口 |


## 9. 风险与应对

| 风险 | 影响 | 应对措施 |
|------|------|---------|
| 税局API不稳定 | 发票同步失败 | 支持手动导入Excel，保留重试机制 |
| 历史数据量大 | 迁移耗时长 | 分批迁移，错峰执行 |
| 科目配置复杂 | 凭证生成错误 | 提供配置校验工具，预置常用模板 |
| 移动加权精度 | 尾差累积 | 保留4位小数，定期勾稽校验 |
| 多账套权限 | 数据隔离混乱 | 所有查询强制带groupid，使用多租户拦截器 |
| 与现有代码冲突 | 系统不稳定 | 新表独立，Service独立，不修改现有代码 |


## 10. 附录

### 10.1 术语表

| 术语 | 说明 |
|------|------|
| 账期账户 | 采购时先挂账，后续通过台账付款实际支付的账户 |
| 现金账户 | 采购时直接扣款的账户 |
| 台账付款 | 账期账户的还款操作，在台账页面批量处理 |
| 归属供应商款项 | 计入供应商应付/已付的金额（货款、运费） |
| 非供应商款项 | 不计入供应商应付的金额（手续费） |
| 移动加权平均 | 每笔入库后重新计算库存单价的核算方法 |
| 在途库存 | 已付款但尚未入库的存货 |
| P0/P1/P2 | 优先级：P0最高，P2最低 |

### 10.2 参考文档

- 20260618 进销存模块梳理（采购模块、台账）需求文档
- 财务ERP会计模块详细开发文档
- 财务ERP - 进销存模块详细开发流程文档