Files
junhong_cmp_fiber/openspec/specs/polling-config-manager/spec.md
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

2.9 KiB
Raw Blame History

MODIFIED Requirements

Requirement: 按优先级顺序返回所有匹配配置(多匹配 + interval 过滤)

原描述:

MatchConfig(card):按优先级顺序返回第一个匹配的配置

修改为:

MatchConfigs(card) []*model.PollingConfig 按 priority ASC 遍历所有启用的配置,返回所有满足匹配条件且至少有一个非 NULL interval的配置。无匹配时返回空切片。

matchConfigConditions(config, card) 判断卡是否满足配置条件时,额外过滤所有 polling interval 均为 NULL 的配置(RealnameCheckIntervalCarddataCheckIntervalPackageCheckIntervalProtectCheckIntervalCardStatusCheckInterval 均无有效值)。

Scenario: 多配置同时匹配一张卡

  • GIVEN 配置 A (priority=5, card_condition="", card_status_check_interval=600, protect_check_interval=nil) 和配置 B (priority=10, card_condition="suspended", card_status_check_interval=nil, package_check_interval=60) 均处于启用状态
  • WHEN 调用 MatchConfigs(card),其中 card.network_status=0suspended
  • THEN 返回 [配置 A, 配置 B],按 priority ASC 排序;配置 B 的 package_check_interval=60 来自配置 A 不覆盖的 task type

Scenario: 所有 interval 均为 NULL 的配置被过滤

  • GIVEN 配置 C (priority=1, card_condition="", 所有 interval 全为 NULL) 和配置 D (priority=25, card_condition="suspended", card_status_check_interval=600) 均处于启用状态
  • WHEN 调用 MatchConfigs(card) 对任意卡
  • THEN 返回结果不包含配置 C因为没有任何有效 interval配置 D 正常返回

Scenario: 无任何配置匹配

  • GIVEN 没有任何启用的配置,或所有配置的条件都不满足卡属性
  • WHEN 调用 MatchConfigs(card)
  • THEN 返回空切片 []

Requirement: 多配置 Interval 合并选取

新增 MergedTaskIntervals(card) map[string]TaskTypeInterval 方法。

MatchConfigs(card) 返回的所有配置,按 priority ASC 遍历,对每种 task typerealname、carddata、package、protect、card_status选取最高优先级priority 数值最小)的那个 config 的 interval

Scenario: 相同 task type 不同 interval 按优先级选取

  • GIVEN 配置 A (priority=5, card_status_check_interval=300) 和配置 B (priority=10, card_status_check_interval=600) 同时匹配某张停机卡
  • WHEN 调用 MergedTaskIntervals(card)
  • THEN 结果中 card_status 的 interval 为 300来自 priority=5 的配置 A

Scenario: 不同 task type 来自不同配置

  • GIVEN 配置 A (priority=5, card_status_check_interval=300, package_check_interval=nil) 和配置 B (priority=10, card_status_check_interval=nil, package_check_interval=60) 同时匹配某张停机卡
  • WHEN 调用 MergedTaskIntervals(card)
  • THEN 结果中 card_status interval=300来自配置 Apackage interval=60来自配置 B