# LSFX Mock Server `ccdi_account_info` 异常账户字段补迁移后端实施文档

## 背景

- `lsfx-mock-server` 上传接口 `/watson/api/project/remoteUploadSplitFile` 在写入 `ccdi_account_info` 时使用了 `is_self_account`、`trans_risk_level` 字段。
- 当前开发库中的 `ccdi_account_info` 为历史表结构，不包含这两列，导致 `AbnormalAccountBaselineService.apply(...)` 执行 upsert 时依次抛出 `Unknown column 'is_self_account' in 'field list'`、`Unknown column 'trans_risk_level' in 'field list'`，上传接口直接返回 500。

## 本次修改

- 新增增量脚本 `sql/migration/2026-04-15-sync-ccdi-account-info-abnormal-account-columns.sql`。
- 脚本以最短路径为已有 `ccdi_account_info` 表补齐异常账户同步当前必需的字段，并保持可重复执行：
  - 使用 `information_schema.columns` 判断字段是否已存在
  - 通过 `PREPARE / EXECUTE` 仅在缺列时执行 `ALTER TABLE`
  - 补齐 `is_self_account` 与 `trans_risk_level`
  - 列位置与当前写库 SQL 保持一致
- 新增回归测试 `lsfx-mock-server/tests/test_schema_migration_scripts.py`，锁定该增量脚本必须存在且包含两条补列语句。

## 验证

- `python3 -m pytest /Users/wkc/Desktop/ccdi/ccdi/lsfx-mock-server/tests/test_schema_migration_scripts.py -q`
- 使用 `bin/mysql_utf8_exec.sh` 执行增量脚本后，复查 `SHOW COLUMNS FROM ccdi_account_info`，确认存在 `is_self_account`、`trans_risk_level` 字段。

## 影响范围

- 仅影响 `lsfx-mock-server` 依赖的 `ccdi_account_info` 历史表结构补齐。
- 不修改接口协议，不改动前端。
