# LSFX Mock 第二期稳定随机命中后端实施记录

## 修改范围

- `lsfx-mock-server/services/file_service.py`
- `lsfx-mock-server/services/statement_rule_samples.py`
- `lsfx-mock-server/services/statement_service.py`
- `lsfx-mock-server/services/phase2_baseline_service.py`
- `lsfx-mock-server/tests/test_file_service.py`
- `lsfx-mock-server/tests/test_statement_service.py`
- `lsfx-mock-server/tests/test_phase2_baseline_service.py`
- `lsfx-mock-server/tests/integration/test_full_workflow.py`
- `sql/migration/2026-03-20-lsfx-mock-phase2-hit-baseline.sql`

## 第二期规则分层

- 流水样本驱动规则：
  - `LOW_INCOME_RELATIVE_LARGE_TRANSACTION`
  - `MULTI_PARTY_GAMBLING_TRANSFER`
  - `MONTHLY_FIXED_INCOME`
  - `FIXED_COUNTERPARTY_TRANSFER`
  - `SALARY_QUICK_TRANSFER`
  - `SALARY_UNUSED`
- 数据库基线驱动规则：
  - `HOUSE_REGISTRATION_MISMATCH`
  - `PROPERTY_FEE_REGISTRATION_MISMATCH`
  - `TAX_ASSET_REGISTRATION_MISMATCH`
  - `SUPPLIER_CONCENTRATION`

## 职责边界

- `FileService`
  - 为同一 `logId` 稳定生成并持久化第二期规则命中计划。
  - 在 `upload_file()` 与 `fetch_inner_flow()` 链路中写入 `phase2_statement_hit_rules` 与 `phase2_baseline_hit_rules`。
  - 在记录创建后立即调用第二期基线服务，避免出现“流水已返回但基线未写”的假成功状态。
- `StatementService`
  - 从 `FileRecord` 读取第二期流水规则子集。
  - 继续保持 `FIXED_TOTAL_COUNT = 200`、稳定 ID 分配与缓存分页语义。
- `Phase2BaselineService`
  - 复用项目数据库配置生成并执行第二期幂等 SQL 计划。
  - 采购基线通过 `ccdi_base_staff.id_card -> staff_id` 映射到真实员工工号。
  - 资产基线使用固定 `asset_name` 先删后插，并保持“故意不匹配”的资产枚举口径。

## 第二期流水样本策略

- `MULTI_PARTY_GAMBLING_TRANSFER`
  - 为同一证件号生成同日多对手方、多笔区间金额转出。
- `MONTHLY_FIXED_INCOME`
  - 生成连续 4 个月的稳定非工资转入。
- `FIXED_COUNTERPARTY_TRANSFER`
  - 为固定对手方生成跨季度稳定转入样本。
- `SALARY_QUICK_TRANSFER`
  - 生成工资入账后 6 小时内的大额转出。
- `SALARY_UNUSED`
  - 生成独立证件号的工资入账与代扣样本，不与 `SALARY_QUICK_TRANSFER` 共用同一对象。

## 幂等 SQL 基线方案

- `SUPPLIER_CONCENTRATION`
  - 固定采购主键 `LSFXMOCKP2PUR001`，先删后插。
  - 插入 SQL 通过 `ccdi_base_staff` 按身份证反查真实 `staff_id` 与姓名，确保可被真实规则 SQL 关联。
- 三条资产不匹配规则
  - 固定资产名称前缀 `LSFX Mock P2 ...`，先删后插。
  - 统一使用当前项目真实口径中的 `asset_main_type = '房产'`、`asset_status = '正常'`。
  - `asset_sub_type` 故意使用非 `住宅` 的值，维持“存在资产事实但不满足房产登记匹配”的状态。
  - 亲属资产记录遵循 `family_id = 员工身份证号`、`person_id = 亲属身份证号`。

## 实施结果

- 第二期规则命中计划已接入 `FileService -> StatementService -> 缓存分页` 主链路。
- 第二期数据库基线已在拉取链路内接通，并支持通过独立 SQL 脚本重复重放。
- 单元测试、集成测试和全量 `lsfx-mock-server` 回归均已通过。
