Files
junhong_cmp_fiber/internal/task/polling_utils.go
huang c7f486ae09 feat: 新增 PollingCardStatusHandler 及工具函数卡状态支持
polling_cardstatus_handler.go: 新文件,实现卡开停机状态轮询
  - Gateway QueryCardStatus → 停机/0,其他/1
  - 状态变化时写 DB + 更新缓存 + 触发 EvaluateAndAct
  - verbose log 位于 gateway 块内
polling_utils.go: getIntervalByTaskType 新增 TaskTypePollingCardStatus case

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

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

93 lines
2.6 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 task
import (
"strconv"
"time"
"github.com/bytedance/sonic"
"go.uber.org/zap"
"gorm.io/gorm"
"github.com/break/junhong_cmp_fiber/internal/model"
"github.com/break/junhong_cmp_fiber/pkg/constants"
)
// getIntervalByTaskType 从配置中提取指定任务类型的轮询间隔(秒)
func getIntervalByTaskType(cfg *model.PollingConfig, taskType string) int {
switch taskType {
case constants.TaskTypePollingRealname:
if cfg.RealnameCheckInterval != nil && *cfg.RealnameCheckInterval > 0 {
return *cfg.RealnameCheckInterval
}
case constants.TaskTypePollingCarddata:
if cfg.CarddataCheckInterval != nil && *cfg.CarddataCheckInterval > 0 {
return *cfg.CarddataCheckInterval
}
case constants.TaskTypePollingPackage:
if cfg.PackageCheckInterval != nil && *cfg.PackageCheckInterval > 0 {
return *cfg.PackageCheckInterval
}
case constants.TaskTypePollingProtect:
if cfg.ProtectCheckInterval != nil && *cfg.ProtectCheckInterval > 0 {
return *cfg.ProtectCheckInterval
}
case constants.TaskTypePollingCardStatus:
if cfg.CardStatusCheckInterval != nil && *cfg.CardStatusCheckInterval > 0 {
return *cfg.CardStatusCheckInterval
}
}
return 0
}
// shortTaskType 从完整任务类型中提取简短名称(如 polling:carddata → carddata
func shortTaskType(fullTaskType string) string {
for i := len(fullTaskType) - 1; i >= 0; i-- {
if fullTaskType[i] == ':' {
return fullTaskType[i+1:]
}
}
return fullTaskType
}
// parseTaskPayload 解析轮询任务载荷,返回 cardID
func parseTaskPayload(payload []byte, logger *zap.Logger) (uint, bool) {
var p struct {
CardID string `json:"card_id"`
}
if err := sonic.Unmarshal(payload, &p); err != nil {
logger.Error("解析任务载荷失败", zap.Error(err))
return 0, false
}
id, parseErr := strconv.ParseUint(p.CardID, 10, 64)
if parseErr != nil {
logger.Error("解析卡ID失败", zap.String("card_id", p.CardID), zap.Error(parseErr))
return 0, false
}
return uint(id), true
}
// boolToStr 布尔值转字符串Redis hash 存储用)
func boolToStr(b bool) string {
if b {
return "1"
}
return "0"
}
// isNotFound 判断是否为 GORM 记录不存在错误
func isNotFound(err error) bool {
return err == gorm.ErrRecordNotFound
}
// isResetWindow 判断今天是否在运营商流量重置日窗口内
// 窗口 = 重置日当天 + 前一天(容错网关数据延迟上报)
func isResetWindow(now time.Time, resetDay int) bool {
today := now.Day()
if today == resetDay {
return true
}
resetDate := time.Date(now.Year(), now.Month(), resetDay, 0, 0, 0, 0, now.Location())
prevDay := resetDate.AddDate(0, 0, -1).Day()
return today == prevDay
}