Files
junhong_cmp_fiber/openspec/changes/refactor-migration-ownership-package-flow/tasks.md
Break 1f634eb465
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m3s
init
2026-06-16 15:15:50 +08:00

56 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 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`