## Why 停复机与套餐生命周期引擎存在多处系统性缺陷:停机时 `stop_reason` 字段写入不一致导致自动复机链路断裂;已耗尽(Depleted)套餐在到期时无法触发下一个排队套餐激活;流量重置后停机卡不自动复机;设备类型载体完全缺失复机逻辑;`ResumeCardIfStopped` 未检查实名状态。这些问题直接影响用户续费后无法正常上网的核心业务场景。 ## What Changes - **停机原因标准化**:`stopCards`(套餐超额停机)补写 `stop_reason=traffic_exhausted` + `stopped_at`,与其他停机路径对齐 - **购买套餐后自动复机**:`order/service.go` 支付回调激活套餐后,调用复机回调 - **Depleted 套餐到期处理**:`findExpiredMainPackages` 扩展为同时查 `status IN (1,2)`,使已耗尽套餐在到期日触发下一个 Pending 套餐激活与复机 - **流量重置后自动复机**:`reset_service` 注入复机回调,重置后对满足条件的卡自动复机 - **设备类型复机覆盖**:`ResumeCardIfStopped` 扩展签名支持 `carrierType`,设备类型时遍历绑定的已实名卡逐一复机 - **未实名不自动复机**:`ResumeCardIfStopped` 内部统一检查 `real_name_status`,未实名卡静默跳过 - **并发保护**:`ResumeCardIfStopped` 加 Redis 分布式锁,防止同一张卡并发触发多次 `gateway.StartCard` - **告警日志**:Gateway 成功但 DB 更新失败时记录 ERROR 日志便于人工排查 - **常量化**:`HandleProtectConsistencyCheck` 停机原因提取为 `constants.StopReasonProtectPeriod` 常量 ## Capabilities ### New Capabilities - `auto-resume-on-purchase`:购买套餐(支付回调激活)后触发停机卡自动复机的能力 - `auto-resume-on-reset`:流量周期重置(日/月/年)后触发停机卡自动复机的能力 ### Modified Capabilities - `auto-stop-resume`:扩展复机前置条件(未实名不复机)、添加设备类型支持、添加并发保护 - `package-queue-activation`:扩展过期套餐检测逻辑,将 Depleted 套餐纳入到期检测范围 ## Impact **修改文件:** - `internal/task/polling_handler.go`:`stopCards` 补写 `stop_reason` + `stopped_at`;`HandleProtectConsistencyCheck` 使用 `StopReasonProtectPeriod` 常量 - `internal/service/package/activation_service.go`:更新 `ResumeCallback` 接口签名(增加 `carrierType` 参数);两处调用点更新传参 - `internal/service/iot_card/stop_resume_service.go`:`ResumeCardIfStopped` 扩展支持 `carrierType`;内部加未实名检查;加 Redis 分布式锁;设备类型时遍历复机绑定卡 - `internal/service/order/service.go`:注入 `ResumeCallback`;`HandlePaymentCallback` 事务后调用复机 - `internal/service/package/reset_service.go`:注入 `ResumeCallback`;三个重置方法结束后异步调用复机 - `internal/polling/package_activation_handler.go`:`findExpiredMainPackages` 查询改为 `status IN (1,2)` - `pkg/constants/iot.go`:新增 `StopReasonProtectPeriod` 常量 - `pkg/constants/redis.go`:新增 `RedisCardResumeLockKey(cardID)` Key 生成函数 - `internal/bootstrap/worker_services.go`:为 `orderService`、`resetService` 注入 `stopResumeService` **不在本次范围:** - `enterprise_device/service.go`:SuspendCard/ResumeCard 缺失 Gateway 调用(单独立 Issue 跟踪) - Gateway + DB 双阶段补偿机制(后期迭代)