## 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=0(suspended) - **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 type(realname、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)