All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m37s
- 轮询配置新增套餐状态、资产状态、重置日前窗口与窗口内流量间隔(迁移 248),间隔三态:正数按间隔、0 不检查、空继承 - 配置按 priority, id 排序合并;在库与已销售无套餐未匹配时告警不入队 - 新增优先级整体重排、匹配预览、立即重算到期时间(异步只提前)、分层统计与重置日前加密统计接口 - 已切换日快照计量的卡流量按观测时间归属,激活前用量只记已结算 - 订单购买与实名激活补齐资产级激活锁,激活前对已切换卡结算一次流量,失败只告警不阻塞,结算不触发通道阈值判定
103 lines
3.9 KiB
Go
103 lines
3.9 KiB
Go
package constants
|
||
|
||
// 分层轮询的套餐状态匹配维度(tb_polling_config.package_state)。
|
||
const (
|
||
// PollingPackageStateActive 有生效套餐。
|
||
PollingPackageStateActive = "active"
|
||
// PollingPackageStateDepleted 套餐已用完(无生效套餐,存在已用完套餐)。
|
||
PollingPackageStateDepleted = "depleted"
|
||
// PollingPackageStatePending 只有待生效套餐。
|
||
PollingPackageStatePending = "pending"
|
||
// PollingPackageStateNone 无套餐。
|
||
PollingPackageStateNone = "none"
|
||
)
|
||
|
||
// PollingPackageStates 是套餐状态匹配维度全集。
|
||
var PollingPackageStates = []string{PollingPackageStateActive, PollingPackageStateDepleted, PollingPackageStatePending, PollingPackageStateNone}
|
||
|
||
// PollingPackageStateName 返回套餐状态中文名称。
|
||
func PollingPackageStateName(state string) string {
|
||
switch state {
|
||
case PollingPackageStateActive:
|
||
return "有生效套餐"
|
||
case PollingPackageStateDepleted:
|
||
return "套餐已用完"
|
||
case PollingPackageStatePending:
|
||
return "只有待生效套餐"
|
||
case PollingPackageStateNone:
|
||
return "无套餐"
|
||
default:
|
||
return "未知"
|
||
}
|
||
}
|
||
|
||
const (
|
||
// PollingPreResetTailMinutes 重置日前加密时最后一次流量查询相对重置时刻的提前量(分钟)。
|
||
PollingPreResetTailMinutes = 5
|
||
// PollingTierFactsCacheSeconds 卡分层事实(套餐状态)在进程内缓存的秒数,避免同一卡短时间内重复查库。
|
||
PollingTierFactsCacheSeconds = 60
|
||
)
|
||
|
||
// TaskTypePollingRecalculateDue 轮询配置调整后"立即重算到期时间"的异步任务(使用数据清理队列)。
|
||
const TaskTypePollingRecalculateDue = "polling:recalculate_due"
|
||
|
||
// 重算到期时间任务状态。
|
||
const (
|
||
// PollingRecalcStatusPending 已入队。
|
||
PollingRecalcStatusPending = "pending"
|
||
// PollingRecalcStatusRunning 执行中。
|
||
PollingRecalcStatusRunning = "running"
|
||
// PollingRecalcStatusCompleted 已完成。
|
||
PollingRecalcStatusCompleted = "completed"
|
||
// PollingRecalcStatusFailed 失败。
|
||
PollingRecalcStatusFailed = "failed"
|
||
)
|
||
|
||
// PollingRecalcProgressTTLSeconds 重算任务进度在 Redis 中的保留时长(7 天)。
|
||
const PollingRecalcProgressTTLSeconds = 7 * 24 * 3600
|
||
|
||
// RedisPollingRecalcProgressKey 返回重算到期时间任务的进度 Key(Hash)。
|
||
func RedisPollingRecalcProgressKey(taskID string) string {
|
||
return "polling:recalc_due:" + taskID
|
||
}
|
||
|
||
// PollingPreResetStatTTLSeconds 重置日前加密效果统计在 Redis 中的保留时长(40 天,覆盖上一个重置周期)。
|
||
const PollingPreResetStatTTLSeconds = 40 * 24 * 3600
|
||
|
||
// RedisPollingPreResetCheckedKey 返回某账户某重置日窗口内已查到流量的卡集合(HyperLogLog)。
|
||
func RedisPollingPreResetCheckedKey(carrierID uint, resetDate string) string {
|
||
return "polling:pre_reset:" + uintKey(carrierID) + ":" + resetDate + ":checked"
|
||
}
|
||
|
||
// RedisPollingPreResetOffsetKey 返回某账户某重置日窗口内每张卡最后一次查询距重置时刻的分钟数(Hash)。
|
||
func RedisPollingPreResetOffsetKey(carrierID uint, resetDate string) string {
|
||
return "polling:pre_reset:" + uintKey(carrierID) + ":" + resetDate + ":offset"
|
||
}
|
||
|
||
func uintKey(v uint) string {
|
||
const digits = "0123456789"
|
||
if v == 0 {
|
||
return "0"
|
||
}
|
||
var buf [20]byte
|
||
i := len(buf)
|
||
for v > 0 {
|
||
i--
|
||
buf[i] = digits[v%10]
|
||
v /= 10
|
||
}
|
||
return string(buf[i:])
|
||
}
|
||
|
||
// CardObservationScenePreActivationSettlement 激活前流量结算观测场景。
|
||
const CardObservationScenePreActivationSettlement = "pre_activation_settlement"
|
||
|
||
const (
|
||
// PreActivationSettlementTotalTimeoutSeconds 一次激活前流量结算的总超时(秒);处于支付、实名回调等同步链路,超时即跳过剩余卡。
|
||
PreActivationSettlementTotalTimeoutSeconds = 8
|
||
// PreActivationSettlementStepTimeoutSeconds 单卡结算查询超时(秒)。
|
||
PreActivationSettlementStepTimeoutSeconds = 4
|
||
// PackageActivationLockSeconds 资产级激活锁 TTL(秒),须大于结算总超时与激活事务耗时之和。
|
||
PackageActivationLockSeconds = 60
|
||
)
|