## Why 当前奇成迁移脚本把奇成 `agent_id`、默认 `sim_iccid_1`、单一当前套餐查询结果当成迁移决策来源,导致批量设备店铺归属、设备主卡、套餐系列和套餐队列迁移不可控。随着单批上万到几万张卡迁移成为常态,脚本需要改为由 `mapping.yaml` 的批量规则驱动,奇成只提供历史事实,生成可审核的中间产物后再输出 SQL。 功能 ID:`feature-qicheng-migration-control` ## What Changes - **重构迁移决策来源**:`mapping.yaml` 成为资产归属、设备当前槽位、套餐来源槽位、套餐迁移范围的唯一决策入口;奇成只用于读取运营商、套餐生命周期、流量和佣金等历史事实。 - **新增批量归属规则**:支持默认店铺、按设备/独立卡分支配置、按槽位配置和少量资产级覆盖,避免万级迁移逐卡配置。 - **拆分单卡迁移与设备迁移分支**:独立卡生成 `single_card` 套餐使用记录;设备绑定卡按设备维度生成 `device` 套餐使用记录,设备内卡不重复生成主套餐。 - **支持当前生效 + 未生效待生效套餐迁移**:完整读取奇成正式套餐生命周期,当前生效套餐写为 `status=1`,后续待生效套餐写为 `status=0` 并按优先级排队。 - **新增审核产物**:生成 `package_resolution.csv`、`ownership_resolution.csv` 和摘要文件,明确每个资产/套餐的决策、映射、跳过原因和缺失项。 - **增强阻断规则**:关键映射缺失、目标店铺不存在、目标套餐无效、设备主卡槽位缺失等必须进入错误清单并阻断对应资产,不再静默进入平台库存或漏写系列。 - **更新脚本文档**:同步更新 `scripts/migration/README.md`、`resources/README.md` 和奇成迁移方案文档,说明新配置模型、执行顺序和人工审核点。 ## Capabilities ### New Capabilities - `qicheng-migration-control`:定义奇成迁移脚本的批量归属决策、设备/单卡分支、套餐队列迁移、审核产物和阻断规则。 ### Modified Capabilities 无。 ## Impact **脚本与配置**: - `scripts/migration/config/mapping.yaml.example`:新增批量归属、槽位、套餐迁移范围和覆盖配置示例。 - `scripts/migration/lib/mapping_loader.py`:加载并校验新的配置结构,保留旧配置兼容或提供明确升级错误。 - `scripts/migration/lib/csv_loader.py`:支持设备 `current_slot`、`package_source_slot` 或由批量规则填充默认槽位。 - `scripts/migration/lib/legacy_query.py`:新增读取完整正式套餐生命周期的查询。 - `scripts/migration/lib/sql_builder.py`:拆分单卡/设备套餐生成逻辑,生成审核 CSV 和阻断错误。 - `scripts/migration/scan_legacy.py`、`migrate_assets.py`、`migrate_runtime.py`:按新规则消费配置并输出 SQL。 **数据库与业务系统**: - 不新增业务表,不修改 API,不引入外部依赖。 - 继续输出人工执行 SQL,保持只读访问奇成、幂等插入和线上手动执行模式。 **验证**: - 不新增自动化测试或 `_test.go`。 - 通过样例 CSV、生成的 `errors.csv` / `warnings.csv` / 审核 CSV、SQL 内容核对和测试库手动 SQL 查询验证。