Files
junhong_cmp_fiber/internal/task/polling_utils.go
huang 5d9be1d7e4
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m27s
fix: 修正轮询配置多匹配逻辑,支持同卡匹配多个配置并按 priority 合并 interval
核心变更:
- MatchConfig 改为 MatchConfigs,返回所有匹配配置
- MergedTaskIntervals 按 task type 合并各配置,选取最高优先级(非 nil 且最小 priority 值)
- hasAnyEnabledInterval 过滤所有 interval 均为 NULL 的配置
- calcInitialDelay 重构为纯函数,接收 interval 参数
- 移除 getEnabledTaskTypes 和 getIntervalByTaskType(被 MergedTaskIntervals 替代)
- scheduler.go 新增心跳 key + 顶层 panic recovery + Init 完成守卫
- initializer.go 批量失败日志升级为 Error,逐条检查 Pipeline 命令错误
- 数据迁移:禁用 id=29 的轮询配置(所有 interval 均为 NULL)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 14:27:47 +08:00

63 lines
1.6 KiB
Go
Raw Permalink 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"
)
// 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
}