## 严格去重（精确匹配）

- **DDS-Section**: 7.2 严格去重（基础去重 — 精确匹配）
- **DDS-Lines**: L697-L753

### Extract

#### 三级唯一性判定键（按优先级）

| 优先级 | 判定键 | 适用场景 |
|--------|--------|----------|
| 1 | `source_platform` + `source_record_id` | 同一平台重复导入 |
| 2 | `source_file_hash` + `row_fingerprint` | 同一文件重复上传 |
| 3 | `order_id`（若可信） | 跨批次订单号匹配 |

#### 执行流程

```go
func (s *StrictDedup) Execute(ctx context.Context, txns []*Transaction) ([]*Transaction, error) {
    var result []*Transaction
    for _, txn := range txns {
        // 判定键 1: platform + record_id
        exists, existingID := s.repo.FindByPlatformAndRecordID(
            ctx, txn.SourcePlatform, txn.SourceRecordID)
        if exists {
            s.createDedupRelation(ctx, txn.ID, existingID, "strict", 100)
            txn.Status = "DUPLICATE"
            continue
        }
        // 判定键 2: file_hash + fingerprint
        exists, existingID = s.repo.FindByFingerprint(ctx, txn.RowFingerprint)
        if exists {
            s.createDedupRelation(ctx, txn.ID, existingID, "strict", 100)
            txn.Status = "DUPLICATE"
            continue
        }
        result = append(result, txn)
    }
    return result, nil
}
```

#### 实现要点

- 命中时创建 `dedup_relation`（relation_type=`strict`, confidence=100）
- 被判重的交易 status 设为 `DUPLICATE`
- 只返回未命中的交易进入下一阶段
- 使用数据库索引 `idx_txn_platform_record` 和 `idx_txn_fingerprint` 加速查询
