## 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`