## 性能设计

- **DDS-Section**: 13.1 性能设计 + 13.3 可维护性设计
- **DDS-Lines**: L1632-L1681

### Extract

#### 性能目标

单次导入 1 万条记录在主流程内完成解析与清洗，去重计算应在 30 秒内完成。

#### 优化策略

| 策略 | 说明 |
|------|------|
| 批量插入 | `raw_records` 和 `transactions` 使用 GORM `CreateInBatches`，每批 500 条 |
| 关键索引 | `source_platform + source_record_id`、`batch_id`、`trade_time`、`order_id` |
| 模糊去重分桶 | 按 `trade_time` 时间分桶，避免全表扫描 |
| 规则预筛选 | 按平台和启用状态预加载规则，减少无效匹配 |
| 异步处理 | ETL Pipeline 使用 goroutine 异步执行，前端轮询状态 |
| 连接池 | SQLite 使用 WAL 模式提升并发读写性能 |

#### SQLite 性能配置

```go
func initDB(dbPath string) *gorm.DB {
    db, _ := gorm.Open(sqlite.Open(dbPath), &gorm.Config{})
    sqlDB, _ := db.DB()
    sqlDB.SetMaxOpenConns(1)    // SQLite 单写
    sqlDB.SetMaxIdleConns(10)
    db.Exec("PRAGMA journal_mode=WAL")
    db.Exec("PRAGMA synchronous=NORMAL")
    db.Exec("PRAGMA cache_size=-64000") // 64MB cache
    return db
}
```

#### 可维护性设计

| 原则 | 说明 |
|------|------|
| 解析器插件化 | 新增平台只需实现 `BillParser` 接口并注册 |
| 规则条件 JSON 化 | 规则存储为 JSON，灵活扩展匹配条件 |
| 导入器解耦 | Export 层独立，可替换下游目标 |
| 分层 DTO/VO/Entity | Handler → DTO → Service → Entity → DAO |
| 事务分阶段 | 每个 ETL 阶段独立事务，避免超长事务 |

#### 可追溯性设计

| 追溯能力 | 实现方式 |
|----------|----------|
| 任一导入结果 → 原始文件 | `transaction.raw_record_id → raw_record.source_file_id → source_file` |
| 任一规则命中 → 解释说明 | `rule_hits` 表记录命中条件和前后字段值对比 |
| 任一合并操作 → 判定依据 | `dedup_relations.reason_json` 和 `link_relations.reason_json` |
| 任一操作 → 操作日志 | `audit_logs` 表记录实体变更和操作者信息 |
