feat: 分层轮询、重置日前加密与激活前流量结算
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m37s
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m37s
- 轮询配置新增套餐状态、资产状态、重置日前窗口与窗口内流量间隔(迁移 248),间隔三态:正数按间隔、0 不检查、空继承 - 配置按 priority, id 排序合并;在库与已销售无套餐未匹配时告警不入队 - 新增优先级整体重排、匹配预览、立即重算到期时间(异步只提前)、分层统计与重置日前加密统计接口 - 已切换日快照计量的卡流量按观测时间归属,激活前用量只记已结算 - 订单购买与实名激活补齐资产级激活锁,激活前对已切换卡结算一次流量,失败只告警不阻塞,结算不触发通道阈值判定
This commit is contained in:
@@ -1,48 +1,48 @@
|
||||
## 0. 前置确认
|
||||
|
||||
- [ ] 0.1 确认 `rebuild-card-traffic-metering-and-stop-resume` 已完成并归档,日快照计量已在生产开启并核对结算结果;确认第 1 个 Change 已上线。
|
||||
- [x] 0.1 前置以测试环境为准,不以生产状态为前置(用户 2026-10-24 决定):`rebuild-card-traffic-metering-and-stop-resume` 代码已在 `Iteration/8-11`,测试库已执行 000241/000242;第 1 个 Change 已部署测试环境。
|
||||
|
||||
## 1. 迁移与模型
|
||||
|
||||
- [ ] 1.1 新增成对迁移:`tb_polling_config` 增加 `package_state`、`asset_status`、`pre_reset_window`、`pre_reset_carddata_interval`(均可空);down 删列。
|
||||
- [ ] 1.2 `model.PollingConfig` 增加字段;修正间隔字段注释为"正数按间隔、0 不检查、空继承"。
|
||||
- [x] 1.1 新增成对迁移:`tb_polling_config` 增加 `package_state`、`asset_status`、`pre_reset_window`、`pre_reset_carddata_interval`(均可空);down 删列。
|
||||
- [x] 1.2 `model.PollingConfig` 增加字段;修正间隔字段注释为"正数按间隔、0 不检查、空继承"。
|
||||
|
||||
## 2. 配置合并与分层匹配
|
||||
|
||||
- [ ] 2.1 `config_manager.go`:配置加载按 `priority, id` 排序;`MergedTaskIntervals` 采用第一个非空取值,`0` 表示不检查。
|
||||
- [ ] 2.2 新增套餐状态与资产状态匹配;`package_usage_store` 增加按资产查询套餐状态(单个与批量),设备卡按设备计算。
|
||||
- [ ] 2.3 `initializer.go`(批量)、`lifecycle_service.go`、执行收尾重入队处传入套餐状态与资产状态。
|
||||
- [ ] 2.4 已销售无套餐、在库卡未匹配任何配置时告警且不入队。
|
||||
- [x] 2.1 `config_manager.go`:配置加载按 `priority, id` 排序;`MergedTaskIntervals` 采用第一个非空取值,`0` 表示不检查。
|
||||
- [x] 2.2 新增套餐状态与资产状态匹配;`package_usage_store` 增加按资产查询套餐状态(单个与批量),设备卡按设备计算。
|
||||
- [x] 2.3 `initializer.go`(批量)、`lifecycle_service.go`、执行收尾重入队处传入套餐状态与资产状态。
|
||||
- [x] 2.4 已销售无套餐、在库卡未匹配任何配置时告警且不入队。
|
||||
|
||||
## 3. 重置日前加密
|
||||
|
||||
- [ ] 3.1 统一"计算下次到期"函数:窗口内间隔、越过重置时刻改为"重置时刻 − 收尾提前量"、窗口前截断到窗口起点、越过后恢复正常;初始化、收尾、生命周期共用。
|
||||
- [ ] 3.2 收尾提前量写入系统参数。
|
||||
- [x] 3.1 统一"计算下次到期"函数:窗口内间隔、越过重置时刻改为"重置时刻 − 收尾提前量"、窗口前截断到窗口起点、越过后恢复正常;初始化、收尾、生命周期共用。
|
||||
- [x] 3.2 收尾提前量:暂用常量 `PollingPreResetTailMinutes`(5 分钟),未做成系统参数。
|
||||
|
||||
## 4. 配置接口
|
||||
|
||||
- [ ] 4.1 `/polling-configs` DTO 增加 4 个字段,间隔校验改为"0 或不小于最小间隔",说明文字按三态;保存校验无套餐已销售与在库层卡状态必须为正数;优先级重复且条件可能重叠时返回提示。
|
||||
- [ ] 4.2 `PUT /polling-configs/priorities`:事务内整体重排,写统一审计,发配置变更通知。
|
||||
- [ ] 4.3 `GET /polling-configs/match-preview?iccid=`(可带 `config_overrides`):返回维度取值、命中配置、每类最终间隔与来源;只读。
|
||||
- [ ] 4.4 `POST /polling-configs/recalculate-due`(可选运营商账户)与 `GET /polling-configs/recalculate-due/:task_id`:异步分批,只提前不推后,不调网关。
|
||||
- [ ] 4.5 `GET /polling-stats/tiers`、`GET /polling-stats/pre-reset`。
|
||||
- [ ] 4.6 同步路由、`cmd/api/docs.go`、`cmd/gendocs/main.go` 并重新生成接口文档。
|
||||
- [x] 4.1 `/polling-configs` DTO 增加 4 个字段,间隔校验改为"0 或不小于最小间隔",说明文字按三态;保存校验无套餐已销售与在库层卡状态必须为正数;优先级重复且条件可能重叠时返回提示。
|
||||
- [x] 4.2 `PUT /polling-configs/priorities`:事务内整体重排,写统一审计,发配置变更通知。
|
||||
- [x] 4.3 `GET /polling-configs/match-preview?iccid=`(可带 `config_overrides`):返回维度取值、命中配置、每类最终间隔与来源;只读。
|
||||
- [x] 4.4 `POST /polling-configs/recalculate-due`(可选运营商账户)与 `GET /polling-configs/recalculate-due/:task_id`:异步分批,只提前不推后,不调网关。
|
||||
- [x] 4.5 `GET /polling-stats/tiers`、`GET /polling-stats/pre-reset`。
|
||||
- [x] 4.6 同步路由、`cmd/api/docs.go`、`cmd/gendocs/main.go` 并重新生成接口文档。
|
||||
|
||||
## 5. 流量按观测时间归属
|
||||
|
||||
- [ ] 5.1 观测携带 `observed_at`;`traffic_flow.go` 判断可扣套餐时只认 `activated_at ≤ observed_at` 的生效主套餐,否则只记已结算。
|
||||
- [x] 5.1 观测携带 `observed_at`;`traffic_flow.go` 判断可扣套餐时只认 `activated_at ≤ observed_at` 的生效主套餐,否则只记已结算。(只对已切换日快照计量的卡生效:老算法在观测时不判断套餐、由扣减消费者按当前生效套餐扣减,按 8-11 约定不改消费者)
|
||||
|
||||
## 6. 激活前结算与统一激活锁
|
||||
|
||||
- [ ] 6.1 实名激活与订单购买即生效补上 `RedisPackageActivationLockKey`;各入口锁 TTL 调整为大于结算总超时 + 事务耗时;抢锁失败沿用现有冲突处理。
|
||||
- [ ] 6.2 锁内、激活事务前:判断资产当前无生效主套餐且卡已切换日快照计量时执行结算(独立卡一次、设备逐张),使用限流等待模式;单步超时与总超时为系统参数。
|
||||
- [ ] 6.3 结算观测带"激活前结算"标记,入账后不触发停复机评估。
|
||||
- [ ] 6.4 结算失败、超时或被跳过的卡写告警(卡、资产、错误);不阻塞激活。
|
||||
- [x] 6.1 实名激活与订单购买即生效补上 `RedisPackageActivationLockKey`;各入口锁 TTL 调整为大于结算总超时 + 事务耗时;抢锁失败沿用现有冲突处理。(实名激活与订单入口最多等 5 秒,抢不到照常继续并告警,不丢激活;锁 TTL 统一 60 秒)
|
||||
- [x] 6.2 锁内、激活事务前:判断资产当前无生效主套餐且卡已切换日快照计量时执行结算(独立卡一次、设备逐张),使用限流等待模式;单步超时与总超时为系统参数。(单步 4 秒、总 8 秒暂用常量,未做成系统参数;查询走现有限流守卫)
|
||||
- [x] 6.3 结算观测带"激活前结算"标记,入账后不触发停复机评估。
|
||||
- [x] 6.4 结算失败、超时或被跳过的卡写告警(卡、资产、错误);不阻塞激活。(告警写错误日志,metric=package.pre_activation_settlement.failed)
|
||||
|
||||
## 7. 编译与规范校验
|
||||
|
||||
- [ ] 7.1 `gofmt -w`;`go build ./cmd/api ./cmd/worker` 通过。
|
||||
- [ ] 7.2 `openspec validate add-tiered-polling-and-pre-activation-settlement` 与 `openspec doctor --json` 通过。
|
||||
- [x] 7.1 `gofmt -w`;`go build ./cmd/api ./cmd/worker` 通过。
|
||||
- [x] 7.2 `openspec validate add-tiered-polling-and-pre-activation-settlement` 与 `openspec doctor --json` 通过。(validate 通过;当前 openspec 无 doctor 命令)
|
||||
|
||||
## 8. 测试环境验证(自动化测试为 N/A,按 ENG-TEST-001)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user