Files
junhong_cmp_fiber/pkg/constants/iot.go
huang 434a8b0349
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m46s
feat: 轮询系统重构(分片队列 + 停复机统一 + Handler 拆分)
【核心变更】

1. 停复机逻辑统一(StopResumeService)
   - 新增 EvaluateAndAct 统一入口,封装三条件停复机判断
   - 停机条件:无套餐(no_package) / 流量耗尽(traffic_exhausted) / 未实名(not_realname)
   - 复机条件:stop_reason 合规 + 有套餐且未耗尽 + 已实名或行业卡
   - 修复设备套餐 Bug:hasValidPackage 按 device_id 查套餐,而非仅 iot_card_id
   - 设备维度停复机加幂等锁(Redis SetNX,TTL 30s),防止多卡并发重复调 Gateway

2. Redis 分片队列(PollingQueueManager)
   - 新建 queue_manager.go,封装所有轮询 Redis 操作
   - 16 分片 Sorted Set,Key 格式:polling:shard:{shardID}:queue:{taskType}
   - Lua 脚本原子出队(ZRANGEBYSCORE + 分批 ZREM),消除竞态窗口
   - 新增背压检测:队列深度超 50 万时 Scheduler 跳过该分片
   - RemoveFromAllQueues 覆盖 4 种任务类型(含 protect)

3. Handler 拆分(polling_handler.go 1360行 → 5个专注文件)
   - polling_base.go:共享基类(并发控制/卡缓存/重入队)
   - polling_realname_handler.go:实名采集,实名 0→1 时立即触发复机
   - polling_carddata_handler.go:流量采集,保留跨月边界检测逻辑
   - polling_package_handler.go:套餐采集,委托 EvaluateAndAct 决策
   - polling_protect_handler.go:保护期一致性检查,保护期内强制修正

4. 配置管理(PollingConfigManager)
   - 新建 config_manager.go,从 scheduler.go 提取配置职责
   - 内存缓存 + 5 分钟定时刷新,刷新失败保留原缓存
   - 修复 getCardCondition:停机卡返回 suspended,不再错配 activated 配置

5. 渐进式初始化(CardInitializer)
   - 新建 initializer.go,分批加载(每批 10 万),批次间 sleep 500ms
   - 过滤 enable_polling=false 的卡,初始化完成前 Scheduler 不出队

6. 卡生命周期服务(PollingLifecycleService)
   - 新建 lifecycle_service.go,替代已删除的 callbacks.go 和 api_callback.go
   - OnCardCreated/OnCardEnabled/OnCardStatusChanged 入队前检查 enable_polling

7. Scheduler 精简(1000+行 → 227行)
   - 保留纯调度循环:scheduleLoop + processShardSchedule + enqueueBatch
   - 保留每 10 秒触发套餐过期检测和流量重置
   - 移除所有 DB 操作、配置加载、卡初始化逻辑

8. 轮询管控 API(enable_polling)
   - 新增 PUT /api/admin/assets/:id/polling-status 接口
   - 支持对设备/卡维度开关轮询,关闭后从所有分片队列移除

9. 数据库迁移
   - 000103:tb_device 新增 enable_polling 字段(boolean, NOT NULL, DEFAULT true)
   - 000104:新增 suspended 轮询配置,为 activated 配置补全 protect_check_interval

【文件统计】
- 新增:19 个文件(handler × 5、polling 组件 × 4、迁移 × 3 等)
- 修改:20 个文件(bootstrap 注入、store 接口、monitoring 适配分片等)
- 删除:3 个文件(polling_handler.go、callbacks.go、api_callback.go)

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-04-07 12:27:04 +08:00

277 lines
6.8 KiB
Go
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.
package constants
// ========================================
// IoT SIM 管理系统常量定义
// ========================================
// ========================================
// 1. 核心业务常量
// ========================================
// IoT 卡状态
const (
IotCardStatusInStock = 1 // 在库
IotCardStatusDistributed = 2 // 已分销
IotCardStatusActivated = 3 // 已激活
IotCardStatusSuspended = 4 // 已停用
)
// IoT 卡业务类型
const (
CardCategoryNormal = "normal" // 普通卡(需要实名认证)
CardCategoryIndustry = "industry" // 行业卡(无需实名认证)
)
// 设备状态
const (
DeviceStatusInStock = 1 // 在库
DeviceStatusDistributed = 2 // 已分销
DeviceStatusActivated = 3 // 已激活
DeviceStatusSuspended = 4 // 已停用
)
// 号卡状态
const (
NumberCardStatusOnSale = 1 // 在售
NumberCardStatusOffSale = 2 // 下架
)
// IoT 卡激活状态
const (
ActivationStatusInactive = 0 // 未激活
ActivationStatusActive = 1 // 已激活
)
// IoT 卡实名状态
const (
RealNameStatusNotVerified = 0 // 未实名
RealNameStatusVerified = 1 // 已实名
)
// IoT 卡网络状态
const (
NetworkStatusOffline = 0 // 停机
NetworkStatusOnline = 1 // 开机
)
// IoT 卡停机原因
const (
StopReasonTrafficExhausted = "traffic_exhausted" // 流量耗尽
StopReasonManual = "manual" // 手动停机
StopReasonArrears = "arrears" // 欠费
StopReasonProtectPeriod = "protect_period" // 保护期一致性检查自动停机
StopReasonNoPackage = "no_package" // 停机原因:无有效套餐
StopReasonNotRealname = "not_realname" // 停机原因:非行业卡且未完成实名认证
)
// 套餐流量类型
const (
DataTypeReal = "real" // 真流量
DataTypeVirtual = "virtual" // 虚流量
)
// 套餐类型
const (
PackageTypeFormal = "formal" // 正式套餐
PackageTypeAddon = "addon" // 附加套餐
)
// 订单类型
const (
OrderTypePackage = 1 // 套餐订单
OrderTypeNumberCard = 2 // 号卡订单
)
// 订单状态 (IoT 模块)
const (
IotOrderStatusPending = 1 // 待支付
IotOrderStatusPaid = 2 // 已支付
IotOrderStatusCompleted = 3 // 已完成
IotOrderStatusCancelled = 4 // 已取消
IotOrderStatusRefunded = 5 // 已退款
)
// 支付方式
const (
PaymentMethodWallet = "wallet" // 钱包
PaymentMethodOnline = "online" // 在线支付
PaymentMethodCarrier = "carrier" // 运营商支付
)
// 所有者类型(统一枚举,仅支持 platform 和 shop
const (
OwnerTypePlatform = "platform" // 平台
OwnerTypeShop = "shop" // 店铺(代理商)
)
// 企业卡授权状态
const (
EnterpriseCardAuthStatusValid = 1 // 有效
EnterpriseCardAuthStatusRevoked = 0 // 已回收
)
// 资产分配类型
const (
AssetAllocationTypeAllocate = "allocate" // 分配
AssetAllocationTypeRecall = "recall" // 回收
)
// 资产类型
const (
AssetTypeIotCard = "iot_card" // 物联网卡
AssetTypeDevice = "device" // 设备
)
// 放款类型
const (
PaymentTypeManual = "manual" // 人工打款
)
// 绑定状态
const (
BindStatusBound = 1 // 已绑定
BindStatusUnbound = 2 // 已解绑
)
// ========================================
// 2. 套餐和轮询相关常量
// ========================================
// 套餐使用类型
const (
PackageUsageTypeSingleCard = "single_card" // 单卡套餐
PackageUsageTypeDevice = "device" // 设备级套餐
)
// 注意:套餐使用状态常量已迁移至 constants.go扩展为 5 个状态0-4
// 轮询配置卡条件
const (
CardConditionNotRealName = "not_real_name" // 未实名
CardConditionRealName = "real_name" // 已实名
CardConditionActivated = "activated" // 已激活
CardConditionSuspended = "suspended" // 已停用
)
// 流量使用记录来源
const (
DataUsageSourcePolling = "polling" // 轮询
DataUsageSourceManual = "manual" // 手动
DataUsageSourceGateway = "gateway" // Gateway回调
)
// ========================================
// 3. 分佣相关常量
// ========================================
// 分佣类型
const (
CommissionTypeOneTime = "one_time" // 一次性分佣
CommissionTypeLongTerm = "long_term" // 长期分佣
CommissionTypeCombined = "combined" // 组合分佣
)
// 分佣模式
const (
CommissionModeFixed = "fixed" // 固定金额
CommissionModePercent = "percent" // 百分比
)
// 分佣状态
const (
CommissionStatusFrozen = 1 // 已冻结
CommissionStatusUnfreezing = 2 // 解冻中
CommissionStatusReleased = 3 // 已发放
CommissionStatusInvalid = 4 // 已失效
CommissionStatusPendingReview = 99 // 待人工修正(链路断裂,需平台处理)
)
// 阶梯类型
const (
LadderTypeActivation = "activation" // 激活量
LadderTypePickup = "pickup" // 提货量
LadderTypeDeposit = "deposit" // 充值量
)
// 卡类型
const (
CardTypeNumberCard = "number_card" // 号卡
CardTypeIotCard = "iot_card" // IoT卡
)
// 审批类型
const (
ApprovalTypeAuto = "auto" // 自动
ApprovalTypeManual = "manual" // 人工
)
// 审批状态
const (
ApprovalStatusPending = 1 // 待审批
ApprovalStatusApproved = 2 // 已通过
ApprovalStatusRejected = 3 // 已拒绝
)
// ========================================
// 4. 财务管理常量
// ========================================
// 提现状态
const (
WithdrawalStatusPending = 1 // 待审核
WithdrawalStatusApproved = 2 // 已通过
WithdrawalStatusRejected = 3 // 已拒绝
WithdrawalStatusPaid = 4 // 已到账
)
// 提现方式
const (
WithdrawalMethodAlipay = "alipay" // 支付宝
WithdrawalMethodWechat = "wechat" // 微信
WithdrawalMethodBank = "bank" // 银行卡
)
// 商户类型
const (
MerchantTypeAlipay = "alipay" // 支付宝
MerchantTypeWechat = "wechat" // 微信
MerchantTypeBank = "bank" // 银行卡
)
// ========================================
// 5. 系统管理常量
// ========================================
// 换卡申请状态
const (
ReplacementStatusPending = 1 // 待处理
ReplacementStatusApproved = 2 // 已通过
ReplacementStatusRejected = 3 // 已拒绝
ReplacementStatusCompleted = 4 // 已完成
)
// 开发能力配置状态
const (
DevCapabilityStatusEnabled = 1 // 启用
DevCapabilityStatusDisabled = 2 // 禁用
)
// ========================================
// 运营商编码
// ========================================
const (
CarrierCodeCMCC = "CMCC" // 中国移动
CarrierCodeCUCC = "CUCC" // 中国联通
CarrierCodeCTCC = "CTCC" // 中国电信
CarrierCodeCBN = "CBN" // 广电
)
const (
ReplacementReasonDamaged = "damaged"
ReplacementReasonLost = "lost"
ReplacementReasonMalfunction = "malfunction"
ReplacementReasonUpgrade = "upgrade"
ReplacementReasonOther = "other"
)