# project_id=42 大额交易无命中修复记录

## 问题现象

- `project_id=42` 的银行流水共 4133 条。
- 项目配置为 `config_type=default`，当前大额交易默认参数已降到：
  - `SINGLE_TRANSACTION_AMOUNT=100`
  - `CUMULATIVE_TRANSACTION_AMOUNT=1000`
  - `ANNUAL_TURNOVER=5000`
  - `LARGE_CASH_DEPOSIT=5000`
  - `FREQUENT_CASH_DEPOSIT=2`
  - `FREQUENT_TRANSFER=100`
- 但自动打标任务 `id=11/12/13` 均为 `SUCCESS` 且 `hit_count=0`。

## 根因定位

### 1. 项目 42 现有流水使用了库中不存在的身份证号

- `ccdi_bank_statement` 中 `project_id=42` 的全部 4133 条流水都使用同一个 `cret_no=230902199012261247`。
- 该证件号在 `ccdi_base_staff.id_card` 与 `ccdi_staff_fmy_relation.relation_cert_no` 中均不存在。
- 当前大额交易模型多条 SQL 都依赖：
  - `staff.id_card = bs.cret_no`
  - 或 `relation.relation_cert_no = bs.cret_no`
- 因此即使金额超过阈值，也会在身份关联层被整体过滤掉。

### 2. Mock 流水服务与既有设计不一致

- `lsfx-mock-server/services/statement_service.py` 原先仍以随机流水为主，并固定输出不存在于当前库的 `cretNo`。
- 仓库内已有大额交易样本设计与对应测试口径，但运行链路没有稳定复用可识别身份池。

## 本次处理

### 代码修复

- 校准 `lsfx-mock-server` 的大额交易样本生成与 `StatementService` 集成。
- 保持主体名称 / 本方账号绑定逻辑不变，继续复用同一 `logId` 的主绑定。
- 补充并校准 `lsfx-mock-server/tests/test_statement_service.py` 断言，使其与现有样本口径一致。

### 数据修正

- 将 `project_id=42` 现有流水中的旧证件号批量修正为当前库真实存在的员工身份证：
  - `230902199012261247 -> 330101198802020033`
- 影响行数：`4133`

### 触发重算

- 通过后端接口 `/ccdi/project/tags/rebuild` 手动提交重算。
- 最新任务：
  - `id=14`
  - `trigger_type=MANUAL`
  - `status=SUCCESS`
  - `hit_count=2559`

## 验证结果

### Mock 测试

- 命令：
  - `PYTHONPATH=. python3 -m pytest tests -q`
- 结果：
  - `31 passed`

### 项目 42 命中结果

- `SINGLE_LARGE_INCOME`：2029
- `LARGE_TRANSFER`：521
- `ANNUAL_TURNOVER`：1
- `CUMULATIVE_INCOME`：1

## 结论

- 本次 `project_id=42` 无命中的直接原因，是流水中的 `cret_no` 无法关联到员工/家属身份。
- 修正为现库存在的身份证后，按当前默认系统参数可立即命中规则。
- Mock 流水层也已同步校准，后续新生成数据不再继续复用这组无效证件号。
