## ADDED Requirements ### Requirement: targets 表分组列 系统 SHALL 在 targets 表中新增 `grp` 列存储分组信息。 #### Scenario: 新增 grp 列 - **WHEN** 数据库初始化 - **THEN** targets 表 SHALL 包含 `grp TEXT NOT NULL DEFAULT 'default'` 列 #### Scenario: 同步分组信息 - **WHEN** 系统同步 targets 到数据库 - **THEN** 每个 target 的 grp 列 SHALL 存储其 group 配置值,未配置的存储 'default' ### Requirement: 结构化采样数据查询 系统 SHALL 提供 `getRecentSamples` 方法替代 `getSparkline`,返回包含状态信息的结构化采样数据。 #### Scenario: 获取最近采样数据 - **WHEN** 调用 `getRecentSamples(targetId, 30)` - **THEN** 系统 SHALL 返回最多 30 条记录,每条包含 timestamp、duration_ms、success、matched #### Scenario: 采样数据排序 - **WHEN** 获取采样数据 - **THEN** 记录 SHALL 按 timestamp 降序排列(最新在前) ### Requirement: 趋势数据时间范围查询 系统 SHALL 支持按任意时间范围查询趋势聚合数据,替代固定 hours 参数。 #### Scenario: 按时间范围查询趋势 - **WHEN** 查询指定 target 在 from 到 to 时间范围内的趋势数据 - **THEN** 系统 SHALL 返回按小时分组的聚合数据,包括每小时的 avgDurationMs、availability 和 totalChecks ### Requirement: 历史记录时间范围和分页查询 系统 SHALL 支持按时间范围筛选并分页查询历史记录。 #### Scenario: 按时间范围筛选历史记录 - **WHEN** 查询指定 target 在 from 到 to 时间范围内的历史记录 - **THEN** 系统 SHALL 返回该时间范围内的记录,按 timestamp 降序排列 #### Scenario: 分页查询历史记录 - **WHEN** 查询指定 page 和 pageSize 的历史记录 - **THEN** 系统 SHALL 返回对应页的数据和总记录数 ### Requirement: 目标列表按分组排序 系统 SHALL 保证 targets 查询结果按分组排序返回。 #### Scenario: 分组排序查询 - **WHEN** 查询所有 targets - **THEN** 结果 SHALL 将 "default" 分组目标排在首位,其余分组按分组名称和目标插入顺序排列 ## MODIFIED Requirements ### Requirement: targets 表同步 系统 SHALL 在启动时将 YAML 配置中的目标列表同步到 SQLite targets 表,并持久化 target 类型、展示摘要、领域配置、调度配置、expect 配置和分组信息。 #### Scenario: 首次同步目标 - **WHEN** 数据库为空且 YAML 中定义了 N 个 typed target - **THEN** 系统 SHALL 将所有目标插入 targets 表,包含 name、type、target、config、interval_ms、timeout_ms、expect 和 grp #### Scenario: 配置变更后重新同步 - **WHEN** YAML 配置发生变更(新增、删除或修改目标)后重启 - **THEN** 系统 SHALL 根据 name 字段匹配:新增的插入、删除的移除、修改的更新(含 grp 字段) ## REMOVED Requirements ### Requirement: sparkline 查询 **Reason**: 替换为结构化 getRecentSamples 方法 **Migration**: 使用 getRecentSamples 替代 getSparkline,新方法返回更丰富的结构化数据