# 2026-03-19 LSFX Mock 数据库身份绑定修复记录

## 背景

- 调整目标：一个 `logId` 需要从员工信息库随机选取一个员工身份证号，并且该员工的亲属证件号也必须从数据库读取。
- 业务口径：同一个 `logId` 的流水证件号范围仅允许使用“该员工本人 + 该员工亲属”。

## 根因

- `lsfx-mock-server` 之前使用内置固定身份证池生成 `cretNo`，没有接入 `ccdi_base_staff` 和 `ccdi_staff_fmy_relation`。
- 即使前一版已经收敛到单员工域，身份来源仍然是 mock 常量，不满足“从数据库读取员工及亲属”的要求。

## 修改内容

### 1. 新增只读员工身份仓储

- 新增 `lsfx-mock-server/services/staff_identity_repository.py`
- 仓储使用 `PyMySQL` 只读查询：
  - 从 `ccdi_base_staff` 随机选取一个有身份证号的在职员工
  - 优先选择存在有效亲属记录的员工
  - 从 `ccdi_staff_fmy_relation` 读取该员工的有效亲属证件号

### 2. FileRecord 绑定数据库身份

- `lsfx-mock-server/services/file_service.py`
  - `FileService` 支持注入身份仓储
  - `FileRecord` 新增：
    - `staff_name`
    - `staff_id_card`
    - `family_id_cards`
  - 上传文件与拉取行内流水时，创建 `logId` 的同时写入该员工及亲属身份

### 3. 流水生成只复用绑定身份

- `lsfx-mock-server/services/statement_service.py`
  - 若 `logId` 已存在真实 `FileRecord`，则流水生成阶段只使用该记录中的 `staff_id_card` 与 `family_id_cards`
- `lsfx-mock-server/services/statement_rule_samples.py`
  - 固定命中样本支持接收外部传入的员工/亲属证件号，避免继续依赖内置固定身份证

### 4. 配置与测试

- `lsfx-mock-server/config/settings.py`
  - 从主项目 `ruoyi-admin/src/main/resources/application-dev.yml` 提取数据库连接默认值
- `lsfx-mock-server/requirements.txt`
  - 新增 `PyMySQL`
- 测试层新增假仓储，避免单元/集成测试访问真实数据库

## 验证结果

- 执行：
  - `cd lsfx-mock-server && python3 -m pytest tests/test_file_service.py tests/test_statement_service.py tests/integration/test_full_workflow.py -q`
- 结果：
  - `17 passed`

## 影响说明

- 本次变更仅作用于 `lsfx-mock-server`。
- 真实运行时会按数据库随机绑定员工与亲属；测试环境仍通过假仓储保持可控与稳定。
