## 平台字段映射规则

- **DDS-Section**: 6.3 支付宝解析规则 + 6.4 微信解析规则 + 6.5 统一交易模型
- **DDS-Lines**: L500-L668

### Extract

#### 支付宝原始字段

```
交易时间 | 交易分类 | 交易对方 | 对方账号 | 商品说明 | 收/支 | 金额 | 收/付款方式 | 交易状态 | 交易订单号 | 商家订单号 | 备注
```

#### 支付宝字段映射表

| 原字段 | 目标字段 | 映射说明 |
|--------|----------|----------|
| 交易时间 | `trade_time` | 解析为 `time.Time`，统一 UTC+8 |
| 交易分类 | `category_raw` | 直接作为原始分类（22 种标准分类） |
| 交易对方 | `counterparty` | 交易对手名称 |
| 对方账号 | `counterparty_account` | 存入扩展字段 |
| 商品说明 | `merchant_name` / `note` | 优先作为商户名，辅助作为备注 |
| 收/支 | `direction` | "收入" → income, "支出" → expense, "其他" → other |
| 金额 | `amount` | 去除 ¥ 符号，解析为 Decimal 正数 |
| 收/付款方式 | `payment_method` | 存入扩展字段，可用于账户映射 |
| 交易状态 | `trade_status` | "交易成功" / "退款成功" 等 |
| 交易订单号 | `source_record_id` / `order_id` | 去除空格，作为唯一标识 |
| 商家订单号 | `merchant_order_id` / `parent_order_id` | 可用于链路关联 |
| 备注 | `note` | 补充备注 |

#### 支付宝标准分类枚举（22 类）— 全局统一基准

| 编号 | 分类名称 | 编号 | 分类名称 |
|------|----------|------|----------|
| 1 | 餐饮美食 | 12 | 退款 |
| 2 | 投资理财 | 13 | 教育培训 |
| 3 | 日用百货 | 14 | 住房物业 |
| 4 | 数码电器 | 15 | 酒店旅游 |
| 5 | 交通出行 | 16 | 文化休闲 |
| 6 | 充值缴费 | 17 | 运动户外 |
| 7 | 信用借还 | 18 | 爱车养车 |
| 8 | 转账红包 | 19 | 商业服务 |
| 9 | 生活服务 | 20 | 母婴亲子 |
| 10 | 家居家装 | 21 | 收入 |
| 11 | 医疗健康 | 22 | 其他 |

> **关键设计决策**：支付宝拥有最丰富的 22 种交易分类，系统将其作为**全局统一分类基准字典**。所有其他平台的交易分类最终都应映射到此套分类枚举。

#### 微信原始字段

```
交易时间 | 交易类型 | 交易对方 | 商品 | 收/支 | 金额(元) | 支付方式 | 当前状态 | 交易单号 | 商户单号 | 备注
```

#### 微信字段映射表

| 原字段 | 目标字段 | 映射说明 |
|--------|----------|----------|
| 交易时间 | `trade_time` | 解析为 `time.Time`，统一 UTC+8 |
| 交易类型 | `category_raw` | 存储原始类型，需通过推断映射到标准分类 |
| 交易对方 | `counterparty` | 交易对手名称 |
| 商品 | `merchant_name` / `product_desc` | **关键字段**，用于推断实际消费分类 |
| 收/支 | `direction` | "收入" → income, "支出" → expense |
| 金额(元) | `amount` | 去除 ¥ 符号，解析为 Decimal 正数 |
| 支付方式 | `payment_method` | 存入扩展字段 |
| 当前状态 | `trade_status` | "支付成功" / "已退款" 等 |
| 交易单号 | `source_record_id` / `order_id` | 去除空格 |
| 商户单号 | `merchant_order_id` / `parent_order_id` | 链路关联 |
| 备注 | `note` | 补充备注 |

#### 微信分类推断规则

微信"交易类型"多为支付动作（商户消费、扫二维码付款、转账、红包等），无实际消费语义。推断流程：

1. **交易类型 = 转账** → 转账红包
2. **交易类型 = 微信红包** → 转账红包
3. **交易类型含 "退款"** → 退款
4. **交易类型 = 商户消费/扫二维码付款** → 基于"商品"字段关键词推断：

| 微信交易类型 | 商品关键词 | 推断标准分类 |
|-------------|-----------|-------------|
| 商户消费 | 美团 / 外卖 / 餐厅 / 咖啡 / 面包 | 餐饮美食 |
| 商户消费 | 滴滴 / 打车 / 地铁 / 高铁 / 加油 | 交通出行 |
| 商户消费 | 京东 / 超市 / 便利店 / 百货 | 日用百货 |
| 商户消费 | 电费 / 水费 / 话费 / 燃气 | 充值缴费 |
| 商户消费 | 医院 / 药店 / 体检 | 医疗健康 |
| 商户消费 | 电影 / 游戏 / 书籍 | 文化休闲 |
| 商户消费 | 酒店 / 景点 / 旅行 | 酒店旅游 |
| 商户消费 | 无法识别 | 其他（待人工补充） |

> **设计原则**：若商品内容无法识别关键词，先落入"其他"分类，并允许用户通过规则管理补充映射。系统应记录未命中规则的记录，便于后续规则完善。

#### 统一交易模型 (Transaction)

```go
type Transaction struct {
    ID               string
    TransactionID    string          // 业务唯一 ID
    BatchID          string
    SourcePlatform   string
    SourceRecordID   string
    TradeTime        time.Time
    Amount           decimal.Decimal // 正数，方向独立表达
    Currency         string          // 默认 CNY
    Direction        string          // income/expense/transfer/refund/fee/other
    Counterparty     string
    MerchantName     string
    CategoryRaw      string          // 原始分类（来自平台）
    CategoryMapped   string          // 映射后分类（规则引擎填充）
    AccountMapped    string          // 映射账户
    Tags             string          // 逗号分隔
    OrderID          string
    ParentOrderID    string
    PaymentMethod    string
    Note             string
    RawPayload       string          // 原始记录完整 JSON 快照
    RowFingerprint   string
    Status           string          // PENDING_CLEAN → CLEANED → ... → IMPORTED
    FireflyTxnID     string
}
```

#### 标准化规则

| 规则项 | 说明 |
|--------|------|
| 时间 | 统一存储为 `Asia/Shanghai (UTC+8)` |
| 金额 | 统一使用正数（`decimal(18,6)`），方向独立用 `direction` 表达 |
| 币种 | 默认 `CNY` |
| 状态 | 初始为 `PENDING_CLEAN` |
| 原始快照 | 完整写入 `raw_payload`（JSON），确保审计可追溯 |
| 指纹 | 对关键字段做 SHA256，用于严格去重 |

#### Direction 枚举

| 值 | 说明 |
|----|------|
| `INCOME` | 收入 |
| `EXPENSE` | 支出 |
| `TRANSFER` | 内部转账 |
| `REFUND` | 退款 |
| `FEE` | 手续费 |
| `OTHER` | 其他 |

#### TransactionStatus 枚举

| 值 | 说明 |
|----|------|
| `PENDING_CLEAN` | 待清洗（标准化完成） |
| `CLEANED` | 已清洗 |
| `PENDING_REVIEW` | 待人工确认（模糊去重疑似） |
| `READY_TO_IMPORT` | 可导入 |
| `IMPORTING` | 导入中 |
| `IMPORTED` | 已导入 |
| `FAILED` | 导入失败 |
| `DUPLICATE` | 重复记录 |
