All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m27s
核心变更: - 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>
44 lines
2.9 KiB
Markdown
44 lines
2.9 KiB
Markdown
## 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)
|