## 1. 配置与文档

- [x] 1.1 更新 `scripts/migration/config/mapping.yaml.example`，新增 `ownership_rules`、`package_rules`、`overrides` 示例
- [x] 1.2 更新 `scripts/migration/resources/README.md`，说明 `current_slot`、`package_source_slot`、批量默认槽位和覆盖优先级
- [x] 1.3 更新 `scripts/migration/README.md`，说明新执行流程、审核 CSV、错误阻断规则和手动验证方法
- [x] 1.4 更新 `docs/脚本/奇成数据迁移方案.md`，将范围改为当前生效 + 未生效待生效套餐，并说明 mapping.yaml 是决策源

## 2. 配置加载与输入解析

- [x] 2.1 扩展 `lib/mapping_loader.py`，新增归属规则、套餐规则、覆盖规则的数据结构
- [x] 2.2 在 `mapping_loader` 中实现配置校验：店铺码格式、槽位范围、套餐规则、覆盖项唯一性
- [x] 2.3 扩展 `lib/csv_loader.py`，支持读取设备行级 `current_slot` 和 `package_source_slot`
- [x] 2.4 实现设备槽位解析优先级：设备行配置 > `overrides.devices` > `ownership_rules.device` 默认值
- [x] 2.5 保留或显式拒绝旧配置结构，输出中文错误提示和升级指引

## 3. 奇成套餐生命周期查询

- [x] 3.1 在 `lib/legacy_query.py` 新增正式套餐生命周期查询函数，读取当前生效和未生效待生效套餐所需字段
- [x] 3.2 查询结果保留 legacy 套餐 ID、套餐名、类型、状态、开始时间、到期时间和稳定排序键
- [x] 3.3 排除加油包和已过期套餐，并在审核产物中记录跳过原因
- [x] 3.4 处理同一资产多个 active 主套餐的冲突：无法唯一裁决时写入错误并阻断该资产套餐生成

## 4. 归属决策与资产 SQL

- [x] 4.1 新增归属解析模块或函数，统一输出资产目标店铺、决策来源和错误
- [x] 4.2 修改卡资产生成逻辑：独立卡按 `ownership_rules.standalone_card` 和覆盖项确定店铺
- [x] 4.3 修改设备资产生成逻辑：设备按 `ownership_rules.device`、槽位配置和覆盖项确定店铺
- [x] 4.4 修改设备绑定逻辑：`is_current` 使用解析后的 `current_slot`，不再固定默认 slot1
- [x] 4.5 修改分配记录生成逻辑：只按归属解析结果生成，不再依赖奇成 `agent_id`

## 5. 套餐队列 SQL

- [x] 5.1 拆分独立卡套餐生成路径，生成 `single_card` 订单和套餐使用记录
- [x] 5.2 拆分设备套餐生成路径，按 `package_source_slot` 生成 `device` 订单和套餐使用记录
- [x] 5.3 为 active 套餐写入 `status=1`、生效/到期时间和用量快照
- [x] 5.4 为 pending 套餐写入 `status=0`、稳定 `priority`、到期时间和 0 用量
- [x] 5.5 设备和卡的 `series_id` 从目标套餐 `tb_package.series_id` 回填，并覆盖已有资产漏写场景
- [x] 5.6 目标套餐不存在、已删除或不是 formal 时生成 SQL 前置校验或错误阻断

## 6. 审核产物与错误输出

- [x] 6.1 生成 `output/ownership_resolution.csv`
- [x] 6.2 生成 `output/package_resolution.csv`
- [x] 6.3 更新 `output/summary.txt`，展示分配数、active/pending 套餐数、跳过数和错误数
- [x] 6.4 更新 `errors.csv` / `warnings.csv` 结构或内容，覆盖店铺缺失、槽位缺失、套餐映射缺失、目标套餐无效等关键错误
- [x] 6.5 确保关键错误阻断对应资产或套餐 SQL，不再静默进入平台库存

## 7. 手动验证

- [x] 7.1 使用当前 120 台设备样例生成 SQL，确认 `ownership_resolution.csv` 显示 120 台设备归属到预期店铺
- [x] 7.2 使用包含 current + pending 套餐的小样例生成 SQL，确认 `package_resolution.csv` 显示 active 和 pending 队列
- [x] 7.3 检查 `step2_02_package_usages.sql`，确认 active 写 `status=1`，pending 写 `status=0` 且 priority 稳定递增
- [x] 7.4 检查设备套餐 SQL，确认只为 `package_source_slot` 生成 device 级套餐，非来源槽位不重复生成主套餐
- [ ] 7.5 在测试库手动执行生成 SQL，查询 `tb_device.shop_id`、`tb_iot_card.shop_id`、`tb_package_usage.status`、`tb_package_usage.priority` 和资产 `series_id`
- [x] 7.6 记录未验证项和已知限制，不新增自动化测试或 `_test.go`
