- 未开始的主套餐(无生效、到期时间且无用量)迁移为待生效,新资产不满足实名条件(行业卡/已实名/无需实名)时标记等实名激活 - 已开始的主套餐在新资产无当前主套餐时原样迁移;新资产已有当前主套餐时改为待生效排队、清空周期与用量 - 迁移后重排新资产主套餐优先级,保证同一载体只有一个当前主套餐 - 换货审计记录套餐状态、优先级、用量的前后值 OpenSpec: fix-exchange-migration-package-state Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3.7 KiB
3.7 KiB
Why
换货迁移套餐时(internal/service/exchange/migration.go 的 migratePackageUsageWithTx),系统只把套餐使用记录的载体改成新资产,状态、优先级、用量、有效期原样保留,不看套餐是否真正开始过,也不看新资产上已有的套餐。生产已出现后果:
- 2026-11-03 换货单 EXC20261103174239616885:新卡 89860624630055040571 自己有生效主套餐,迁过来的主套餐也是生效中,一张卡两个生效主套餐,流量重复扣减,预计到期时间显示"数据异常"(已手工修正,见
docs/data-fix/2026-11-04-换货迁移套餐双生效数据修正.md)。
业务原则:换货只是换载体,不改变套餐所处的阶段;同一载体同时只能有一个生效主套餐(《八月迭代后端修正技术方案汇总》3.15 M15);新资产已有生效套餐时换货不拦截、叠加数据(同文 3.12)。
What Changes
- 换货迁移主套餐时,按以下顺序决定迁移后的状态:
- 套餐是否已开始:有生效时间、或有到期时间、或有用量、或有日流量记录、或状态为已用完,视为已开始;否则视为未开始。老系统迁移数据中"生效中、无生效时间、有固定到期日"的套餐按已开始处理,保留原到期日。
- 未开始的主套餐:一律以待生效迁移,清空生效时间、到期时间与重置时间;新资产不满足实名条件时标记为等实名激活。实名条件与停复机口径一致:行业卡、已实名、或实名策略为无需实名,任一满足即视为满足。
- 已开始的主套餐:新资产上没有当前主套餐(生效中或已用完、且未到期)时,原样迁移、继续生效;新资产已有当前主套餐时,改为待生效排在后面,清空生效时间、到期时间与重置时间,已用量清零,等轮到时从激活当天起重新计算完整周期。
- 迁移后新资产上全部未结束主套餐按"当前主套餐 → 新资产原有待生效 → 迁入的主套餐(按原顺序)"统一重排优先级,不再出现优先级重复或待生效排在当前套餐之前。
- 加油包仍原样迁移,继续挂在原主套餐下。
- 未开始或排队的主套餐迁移后不在换货事务内激活;新资产无占位主套餐且满足激活条件时,由现有孤儿套餐扫描或实名激活流程接续生效。
- 换货迁移导致状态、优先级或用量变化的套餐记录写审计,保留前后值。
- 不拦截换货,不改换货接口入参与出参。
Capabilities
New Capabilities
无。
Modified Capabilities
order-refund-exchange:新增"换货迁移后的主套餐状态"要求,规定迁移主套餐时按"是否已开始、新资产实名条件、新资产是否已有当前主套餐"决定状态与排队顺序。
Impact
- 代码:
internal/service/exchange/migration.go(migratePackageUsageWithTx改为按规则逐条处理主套餐、重排优先级);新增换货侧的实名条件判断(行业卡、已实名、无需实名,口径同internal/service/iot_card/stop_resume_service.go的isRealnameOK);当前主套餐判断沿用internal/service/package的FindCurrentMainPackageForQueue口径。 - 接口:无变化。
- 数据库:无迁移。
- 存量数据:不修正。2026-11-04 换货单 1095–1104、1108 迁入的 11 条主套餐有固定到期日,按本规则属于已开始、新卡无当前主套餐时原样迁移,与现状一致;新卡未实名且已停机,未产生用量。
- 不涉及:其他入口"等实名激活"判断不认行业卡与无需实名的问题(订单、自动续费、自动购包、实名激活),另开 Change 处理。