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

44 lines
2.9 KiB
Markdown
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.
## MODIFIED Requirements
### Requirement: 按优先级顺序返回所有匹配配置(多匹配 + interval 过滤)
原描述:
> `MatchConfig(card)`:按优先级顺序返回第一个匹配的配置
修改为:
`MatchConfigs(card) []*model.PollingConfig` 按 priority ASC 遍历所有启用的配置,返回**所有满足匹配条件且至少有一个非 NULL interval**的配置。无匹配时返回空切片。
`matchConfigConditions(config, card)` 判断卡是否满足配置条件时,**额外过滤**所有 polling interval 均为 NULL 的配置(`RealnameCheckInterval``CarddataCheckInterval``PackageCheckInterval``ProtectCheckInterval``CardStatusCheckInterval` 均无有效值)。
#### 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来自配置 A`package` interval=60来自配置 B