# 大屏 — 畜牧资源统计 — 测试用例

> 依据：`大屏畜牧资源功能需求.md`（v1.3）、`大屏畜牧资源技术方案.md`（v1.3）  
> **接口 Base Path**：`/bigScreen/livestockResource`（含 `context-path`、网关前缀须补齐）。鉴权：若依 Cookie / `Authorization` Token；权限 `bigScreen:livestockResource:query`。

**通用前置（无特殊说明）**：已执行 `sql/biz_consult_session.sql`、`sql/biz_consult_message.sql`、`sql/biz_consult_user.sql`；测试账号具备大屏畜牧资源查询权限；时区 `Asia/Shanghai`。

**口径摘要**

| 域 | 规则 |
| --- | --- |
| 统计年 **Y** | 切换后年内区块一致；默认当前自然年 |
| 统计日 / 时刻 | `Y`=当前年→`statDate` 今日、`statDateTime` 请求时刻；历史年→`statDate=Y-12-31` |
| AI 会话 | `consult_type=2`；**已隐藏**（`vet_visible=0`）**计入** |
| 接诊隔离 | `consult_type=1` **不参与** |
| 提问量 | **AI 回复**（`sender_role=3`、`sender_user_id=0`）条数；界面名称仍为「提问量」 |
| 今日四项 | 仅 **Y**=当前自然年按 `statDate` 统计；历史年固定 **0** |
| 分类占比 | **AI 回复** + 提问人 `ai_category` 归因；分母=年内**全部 AI 回复**；占比之和 **100%** |
| 平均耗时 | `cost_time` 非空（**含 0**）参与平均；空值不参与；展示**秒** |
| 用户结构 | `biz_consult_user` 全表；新≤180 天、老>180 天；**不随 Y** |
| 近 7 日 | `[statDate−6, statDate]` 共 **7** 日；缺日 **0** |
| 分时热度 | **距 statDateTime 最近 24** 整点小时桶；**与 Y 无关** |
| 今日活跃 | 会话 **`update_time`** 在统计日 |
| 日新增 | **`create_time` 与 `update_time` 均在统计日**，且此前无 AI 会话 |
| 分类/模型/热点 | **AI 回复条数** + 提问人 `ai_category` 归因；占比分母=年内 AI 回复总数 |
| 关键词 | 仅 **文本**提问（`msg_type=1`） |

**本期不测**：移动端「畜牧资源」资讯 `v_livestock_resource`、AI 诊断维护接口、在线接诊数据。

**UI 测试**：**Playwright** + **Chromium**，`playwright.config` 中 `use: { channel: 'chrome' }` 调用本机 **Google Chrome**。

**自动化对照（建议）**：`com.ruoyi.web.modules.screen.**.*LivestockResource*`（JUnit5 / MockMvc / Playwright）。

---

## 测试数据样本

| 代号 | 说明 |
| --- | --- |
| **AI-Y** | **2026** AI 会话：用户 U1/U2；含提问+AI 回复；`ai_category` 含 1、2 与未分类 |
| **AI-HIDE** | **2026** `vet_visible=0` 的 AI 会话，有 AI 回复 | 须计入总览 |
| **AI-VET** | **2026** `consult_type=1` 接诊会话及消息 | 不应计入 |
| **AI-EMPTY** | **2025** 无 AI 会话 |
| **AI-HIST** | **2024** AI 会话 2 条、提问量 5 |
| **AI-TODAY** | 统计日当日新建会话、当日 AI 回复、U3 首次会话（日新增） |
| **AI-COST** | AI 回复：`cost_time=0`、正数毫秒、NULL 各至少 1 条 |
| **AI-BAND** | 年内会话 A～D 的 AI 回复数分别为 2、4、8、12 条（四档分布） |
| **AI-7D** | 近 7 日内每日各有会话创建与 AI 回复 |
| **AI-DAY-HOUR** | 统计日自然日内跨 3 个整点小时桶有会话/回复 |
| **DU-MIX** | `biz_consult_user`：新用户 3、老用户 2（间隔按 180 天规则构造） |
| **DU-EMPTY** | 无 `biz_consult_user` 行 |
| **KW-TEXT** | **2026** 文本提问含可分词关键词「牦牛」「防疫」等 |
| **KW-NONTEXT** | 仅图片/语音提问、无文本 | 关键词区块空态 |

---

## 一、单元测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| DP-XM-UT-001 | 参数校验 | statYear 合法 | 单元测试 | JUnit5 | 年份解析 | 无 | 传入 `2026`、`2000` | 解析为整数通过 |
| DP-XM-UT-002 | 参数校验 | statYear 非法 | 单元测试 | JUnit5 | 异常入参 | 无 | 空、`26`、`abcd`、`1899` | 抛 `ServiceException` 或等价失败 |
| DP-XM-UT-003 | 统计日 | 当前年 statDate | 单元测试 | JUnit5 | SY-XM-01 | Mock 当前日 2026-05-20 | `resolveStatDate(2026)` | 返回 `2026-05-20` |
| DP-XM-UT-004 | 统计日 | 历史年 statDate | 单元测试 | JUnit5 | §2.2 | 无 | `resolveStatDate(2024)` | 返回 `2024-12-31` |
| DP-XM-UT-005 | 口径 | 排除接诊会话 | 单元测试 | JUnit5 | SY-XM-13 | `AI-Y`+`AI-VET` | `countAiSessions(2026)` | 仅 `AI-Y` |
| DP-XM-UT-006 | 口径 | 隐藏会话计入 | 单元测试 | JUnit5 | §2.18#2 | `AI-Y`+`AI-HIDE` | `countAiSessions(2026)` | 含 `AI-HIDE` |
| DP-XM-UT-007 | 提问量 | AI 回复计数 | 单元测试 | JUnit5 | §2.6 | `AI-Y` 已知 AI 条数 | `countAiReplies(year)` | 等于 `sender_role=3` 条数；不含提问人消息 |
| DP-XM-UT-008 | 今日指标 | 历史年为 0 | 单元测试 | JUnit5 | §2.4 | `AI-TODAY` 有当日数据 | `buildOverview(2024)` | `todayActiveUsers` 等四项为 **0** |
| DP-XM-UT-009 | 今日指标 | 当前年今日 | 单元测试 | JUnit5 | §2.8 | `AI-TODAY`；statDate=今日 | `buildOverview(2026)` | 今日四项与样本一致 |
| DP-XM-UT-010 | 平均耗时 | 含 0 不排除 | 单元测试 | JUnit5 | §2.18#5 | `AI-COST`：0ms、3000ms、NULL | `avgResponseSeconds` | 平均=(0+3)/2 秒；NULL 不入分母 |
| DP-XM-UT-011 | 7 日序列 | 补零 7 点 | 单元测试 | JUnit5 | §2.11 | 仅首尾 2 日有数据 | `buildDailySeries(statDate)` | `length=7`；中间日 `sessionCount=questionCount=0` |
| DP-XM-UT-012 | 分时 | 最近 24 整点小时桶 | 单元测试 | JUnit5 | §2.12、SY-XM-07 | `anchor=2026-05-20 10:30` | `buildHourlyHeat` | `hourlySeries.length=24`；`windowEnd=2026-05-20 10:00`；末桶 `10:00` 有数据；含 `bucketDateTime` |
| DP-XM-UT-013 | 用户结构 | 180 天分界 | 单元测试 | JUnit5 | §2.9 | `DU-MIX` | `buildUserStructure` | 新/老人数与 `DATEDIFF` 规则一致 |
| DP-XM-UT-014 | 用户结构 | 不随 Y 变 | 单元测试 | JUnit5 | SY-XM-05 | 固定 `DU-MIX` | `loadDashboard(2025)` 与 `2026` | `userStructure` 相同 |
| DP-XM-UT-015 | 分类占比 | 分母全量 | 单元测试 | JUnit5 | §2.18#3 | 5 类 AI 回复已知 | `buildCategoryShare` | 各 `ratio` 之和≈100（1 位小数）；分母=年内 AI 回复总数 |
| DP-XM-UT-016 | 分类映射 | 编码转中文 | 单元测试 | JUnit5 | §2.10 | `ai_category` 为 `1`～`4`、空 | `normalizeCategory` | 养殖技巧…设备操作；空→未分类 |
| DP-XM-UT-017 | 会话分档 | 四档固定 | 单元测试 | JUnit5 | §2.13 | `AI-BAND` | `buildSessionReplyDistribution` | 4 项 LIGHT～DEEP；`sum(sessionCount)`=年内会话数 |
| DP-XM-UT-018 | 状态分布 | 正常/失败 | 单元测试 | JUnit5 | §2.14 | `AI-COST` | `buildReplyStatus` | OK+FAIL=`totalAiReplies`；NULL→FAIL |
| DP-XM-UT-019 | 热点榜 | Top5 分类 | 单元测试 | JUnit5 | SY-XM-09 | 多分类条数 | `buildHotTopics` | ≤5 条；按 count/ratio 降序；无单条消息序 |
| DP-XM-UT-020 | 关键词 | 仅文本 Top30 | 单元测试 | JUnit5 | §2.16 | `KW-TEXT`+`KW-NONTEXT` | `extractTopKeywords(30)` | 来自文本语料；≤30；不含媒体 |
| DP-XM-UT-021 | 7 日窗口 | 与 Y 无关 | 单元测试 | JUnit5 | SY-XM-02 | 固定 `AI-7D` | `activityTrend` 2025 vs 2026 | 相同 `statDate` 下 `dailySeries` 一致 |
| DP-XM-UT-022 | 一致性 | 总览与状态总量 | 单元测试 | JUnit5 | §6 | `AI-Y` | 对比 `totalQuestionCount` 与 `replyStatus.total` | 一致 |
| DP-XM-UT-023 | 约束 | 只读无写 | 单元测试 | JUnit5 | SY-XM-12 | 检查 Controller | 无 insert/update/delete | 仅 `dashboard` |
| DP-XM-UT-024 | 缓存 | forceRefresh | 单元测试 | JUnit5 | 技术§2.3 | 启用缓存 | `loadDashboard(2026,true)` | 跳过缓存重算 |

---

## 二、接口测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| DP-XM-API-001 | 看板 | 满数据正常 | 接口测试 | Postman/curl | SY-XM-01 | 已登录；`AI-Y`+`DU-MIX` | `GET .../dashboard?statYear=2026` | `code` 成功；含 `overview`～`topKeywords` 十区块；`statDate` 为今日 |
| DP-XM-API-002 | 看板 | 核心总览 8 项 | 接口测试 | Postman | SY-XM-03 | 有三资/产量/接种/人员造数 | `GET dashboard` 2026 | 含 `operatingFixedAssets`～`agriUnitCount` 共 8 字段与 SQL 一致 |
| DP-XM-API-003 | 看板 | 隐藏会话计入 | 接口测试 | Postman | §2.18#2 | `AI-Y`+`AI-HIDE` | 对比计入前后会话相关区块 | 含隐藏会话 |
| DP-XM-API-004 | 看板 | 排除接诊 | 接口测试 | Postman | SY-XM-13 | `AI-Y`+`AI-VET` | `GET dashboard` 2026 | AI 区块指标不含接诊会话/消息 |
| DP-XM-API-005 | 看板 | 历史年产量/免疫按该年最大月 | 接口测试 | Postman | §5.2 | 2024 有产量与接种 | `statYear=2024` | 肉/奶/免疫率为 2024 最大月口径；固定资产与人员不随年变 |
| DP-XM-API-006 | 看板 | 历史年 statDate | 接口测试 | Postman | §2.2 | `AI-HIST` | `statYear=2024` | `statDate=2024-12-31`；年内指标仅 2024 |
| DP-XM-API-007 | 看板 | 活跃度 7 日 | 接口测试 | Postman | SY-XM-04 | `AI-7D` | `GET dashboard` | `activityTrend.dailySeries.length=7`；含 `sessionCount`、`questionCount` |
| DP-XM-API-008 | 看板 | 7 日与 Y 无关 | 接口测试 | Postman | SY-XM-02 | 固定 `AI-7D` | `statYear=2025` 与 `2026`（同日请求） | `activityTrend` 一致 |
| DP-XM-API-009 | 看板 | 用户结构 | 接口测试 | Postman | SY-XM-05 | `DU-MIX` | `GET dashboard` | `newUserCount`/`oldUserCount` 正确；`newUserRatio+oldUserRatio≈100` |
| DP-XM-API-010 | 看板 | 用户结构切年不变 | 接口测试 | Postman | §2.9 | `DU-MIX` 固定 | `statYear=2025` 与 `2026` | `userStructure` 相同 |
| DP-XM-API-011 | 看板 | 分类占比 100% | 接口测试 | Postman | SY-XM-06 | `AI-Y` 多分类 | `categoryShare.items` | `sum(ratio)≈100`；分母=年内 **AI 回复** 总数（`totalAskerMessages` 字段名沿用） |
| DP-XM-API-012 | 看板 | 模型调用同源 | 接口测试 | Postman | §5.6 | `AI-Y` | 对比 `modelCallAnalysis` 与 `categoryShare` | 分类条数一致 |
| DP-XM-API-013 | 看板 | 分时使用热度 | 接口测试 | Postman | SY-XM-07 | 24h 窗口有跨小时数据 | `GET dashboard` | `hourlyHeat.hourlySeries.length=24`；`windowEnd` 为整点 `yyyy-MM-dd HH:mm`；点含 `bucketDateTime` |
| DP-XM-API-014 | 看板 | 会话分档四档 | 接口测试 | Postman | SY-XM-08 | `AI-BAND` | `sessionReplyDistribution` | 4 条；`sum(ratio)≈100` |
| DP-XM-API-015 | 看板 | 应答状态 | 接口测试 | Postman | SY-XM-08 | `AI-COST` | `replyStatusDistribution` | OK+FAIL=`totalAiReplies` |
| DP-XM-API-016 | 看板 | 热点 Top5 | 接口测试 | Postman | SY-XM-09 | `AI-Y` | `hotTopics` | ≤5；为分类非单条消息 |
| DP-XM-API-017 | 看板 | 关键词 Top30 | 接口测试 | Postman | SY-XM-10 | `KW-TEXT` | `topKeywords` | ≤30；含 `keyword`、`count` |
| DP-XM-API-018 | 看板 | 无数据空态 | 接口测试 | Postman | §7.1 | `AI-EMPTY` 2025 | `GET dashboard` | 总览累计为 0；图表空态或全 0 |
| DP-XM-API-019 | 看板 | 无用户台账 | 接口测试 | Postman | §7.1 | `DU-EMPTY` | `userStructure` | 人数 0 或空态标记 |
| DP-XM-API-020 | 看板 | 无文本关键词 | 接口测试 | Postman | §7.1 | `KW-NONTEXT` | `topKeywords` | `[]` 或空态 |
| DP-XM-API-021 | 看板 | 平均耗时含 0 | 接口测试 | Postman | §2.18#5 | `AI-COST` 仅 0 与 3000ms | `avgResponseSeconds` | 为 1.5 秒（实现四舍五入一致即可） |
| DP-XM-API-022 | 看板 | 缺 statYear | 接口测试 | Postman | 异常 | 已登录 | 不传 `statYear` | 失败或默认当前年（与实现一致） |
| DP-XM-API-023 | 看板 | 非法 statYear | 接口测试 | Postman | 异常 | 已登录 | `statYear=abc` | 失败；参数错误 |
| DP-XM-API-024 | 看板 | statYear 回显 | 接口测试 | Postman | 一致性 | 已登录 | `statYear=2025` | `data.statYear=2025` |
| DP-XM-API-025 | 看板 | availableYears | 接口测试 | Postman | §2.1 | 会话年 2024、2026 | `GET dashboard` | 含各年+当前年；降序 |
| DP-XM-API-026 | 看板 | 切年不串 | 接口测试 | Postman | SY-XM-02 | `AI-HIST` 与 `AI-Y` | 分别 `2024`、`2026` | 年内指标互不混入 |
| DP-XM-API-027 | 看板 | forceRefresh | 接口测试 | Postman | 技术§2.3 | 已启用缓存 | `?statYear=2026&forceRefresh=true` | 成功；与库最新一致 |
| DP-XM-API-028 | 范围 | 无维护接口 | 接口测试 | Postman | SY-XM-12 | 已登录 | `POST/PUT/DELETE .../bigScreen/livestockResource/**` | 404/405 或无权限 |
| DP-XM-API-029 | 范围 | 无资讯接口 | 接口测试 | Postman | §3.2 | 已登录 | 探测 `/app/livestockResource/list` 等 | 大屏**无**资讯列表接口；与看板分离 |
| DP-XM-API-030 | 联动 | AI 新会话后 | 接口测试 | Postman | SY-XM-11 | 2026 原计数 N | 后台/移动端新建 AI 会话→`GET dashboard` | `totalSessions` 等增加 |
| DP-XM-API-031 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET dashboard` | 401 或统一未登录 |
| DP-XM-API-032 | 权限 | 无大屏权限 | 接口测试 | Postman | 越权 | 无 `bigScreen:livestockResource:query` | `GET dashboard` | 403 或无权限 |

---

## 三、界面测试用例（UI）

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| DP-XM-UI-001 | 页面 | 默认当前年加载 | UI 测试 | Playwright+Chrome | SY-XM-01 | 已登录有权限；2026 有 `AI-Y` | 打开 `#/livestock-resources` | 默认当前年；请求 `dashboard`；十区块展示 |
| DP-XM-UI-002 | 筛选 | 切换年份刷新 | UI 测试 | Playwright+Chrome | SY-XM-02 | 含 2025、2026 数据 | 切换统计年份 2025→2026 | 总览/分类/分档等随 Y 更新；**7 日/24h** 仍按当前统计日/时刻 |
| DP-XM-UI-003 | 筛选 | 加载中防残留 | UI 测试 | Playwright+Chrome | §7.2 | 已登录 | 切年（可 `route` 延迟 `dashboard`） | Loading；完成后无上年残留 |
| DP-XM-UI-004 | 总览 | 八项指标卡 | UI 测试 | Playwright+Chrome | SY-XM-03 | 有三资/产量/接种/人员造数 | 查看「核心数据总览」 | 8 卡：固定资产、肉/奶、免疫率%、兽医/特派员/事业单位 |
| DP-XM-UI-005 | 总览 | 提问量文案 | UI 测试 | Playwright+Chrome | §2.18#1 | 有 AI 回复 | 查看总览与趋势文案 | 显示「提问量」；数值为 AI 回复规模 |
| DP-XM-UI-006 | 图表 | 活跃度 7 日 | UI 测试 | Playwright+Chrome | SY-XM-04 | `AI-7D` | 查看「活跃度趋势」；切换会话数/提问量 | 7 个日期点；双维度可切换或双系列 |
| DP-XM-UI-007 | 图表 | 用户结构 | UI 测试 | Playwright+Chrome | SY-XM-05 | `DU-MIX` | 查看「用户结构分析」 | 新/老用户人数与占比；切年不变 |
| DP-XM-UI-008 | 图表 | 提问分类占比 | UI 测试 | Playwright+Chrome | SY-XM-06 | `AI-Y` | 查看饼图 | 含 1～4 类及未分类；占比之和 100% |
| DP-XM-UI-009 | 图表 | 模型调用分析 | UI 测试 | Playwright+Chrome | §5.6 | `AI-Y` | 查看柱状/条形区 | 各分类条数与占比区一致 |
| DP-XM-UI-010 | 图表 | 分时使用热度 | UI 测试 | Playwright+Chrome | SY-XM-07 | 24h 有数据 | 查看「分时使用热度」 | 24 整点；横轴 `HH:mm`；悬停显完整时刻+会话/提问量 |
| DP-XM-UI-011 | 图表 | 会话提问分布 | UI 测试 | Playwright+Chrome | SY-XM-08 | `AI-BAND` | 查看「会话提问数量分布」 | 四档轻度～深度；占比展示 |
| DP-XM-UI-012 | 图表 | 会话状态分布 | UI 测试 | Playwright+Chrome | SY-XM-08 | `AI-COST` | 查看「会话状态分布」 | 正常应答/调用失败两档 |
| DP-XM-UI-013 | 榜单 | 热点问题 Top5 | UI 测试 | Playwright+Chrome | SY-XM-09 | `AI-Y` | 查看「热点问题榜单」 | ≤5 条分类排行 |
| DP-XM-UI-014 | 榜单 | 高频关键词 | UI 测试 | Playwright+Chrome | SY-XM-10 | `KW-TEXT` | 查看「高频关键词」 | 词云或列表；≤30 |
| DP-XM-UI-015 | 空态 | 无 AI 数据年 | UI 测试 | Playwright+Chrome | §7.1 | `AI-EMPTY` | 切换 2025 | 总览累计 0；图表空态或全 0 |
| DP-XM-UI-016 | 空态 | 无关键词 | UI 测试 | Playwright+Chrome | §7.1 | `KW-NONTEXT` | 查看关键词区 | 空态；不报错 |
| DP-XM-UI-017 | 约束 | 历史年今日为 0 | UI 测试 | Playwright+Chrome | §2.4 | `AI-TODAY`；切 2024 | 查看今日四项卡 | 均为 0 |
| DP-XM-UI-018 | 只读 | 无维护按钮 | UI 测试 | Playwright+Chrome | SY-XM-12 | 已登录 | 扫描全页 | 无新建会话/发消息/隐藏；可有刷新 |
| DP-XM-UI-019 | 错误 | 接口失败重试 | UI 测试 | Playwright+Chrome | §7.2 | Mock `dashboard` 500 | 进入或切年 | 失败提示；支持重试 |
| DP-XM-UI-020 | 权限 | 无入口 | UI 测试 | Playwright+Chrome | 安全 | 无大屏权限账号 | 登录/直链 | 无菜单或 403 |
| DP-XM-UI-021 | 联动 | AI 使用后刷新 | UI 集成 | Playwright+Chrome | SY-XM-11 | 原计数已知 | 业务端发 AI 问答→F5/刷新 | 总览/趋势等更新 |
| DP-XM-UI-022 | 端到端 | 全流程查阅 | UI 集成 | Playwright+Chrome | §4、SY-XM-01～13 | 2026 完整样本 | 登录→进页→默认年→切年→浏览十区块 | 数据合理；无控制台报错 |

---

## Playwright 实施提示

```javascript
// playwright.config.ts 片段
use: { channel: 'chrome', headless: false }

await page.goto('/#/livestock-resources');

await Promise.all([
  page.waitForResponse('**/bigScreen/livestockResource/dashboard**'),
  page.getByRole('combobox', { name: /统计年份|年份/ }).selectOption('2026'),
]);

await expect(page.getByText(/核心数据总览/)).toBeVisible();
await expect(page.getByText(/经营性固定资产|免疫率|科技特派员/)).toBeVisible();
await expect(page.getByText(/活跃度趋势|用户结构分析/)).toBeVisible();

// 7 日 / 24h 切年后仍应请求 dashboard（观察 network）
await page.route('**/bigScreen/livestockResource/dashboard**', route =>
  route.fulfill({ status: 500, body: '{}' })
);
```

---

## 覆盖对照

| 类别 | 单元 UT | 接口 API | 界面 UI |
| --- | --- | --- | --- |
| 正常流程 | UT-003～007、009～017、019～022 | API-001～017、030 | UI-001～014、021～022 |
| 异常流程 | UT-002、008 | API-018～020、022～023、031～032 | UI-015～016、019～020 |
| 业务约束 | UT-005～006、010～014、018、023～024 | API-003～006、010～011、021、028～029 | UI-005、007、017～018 |

---

## 功能需求追溯（SY-XM / 章节）

| 追溯 | 要点 | 主要用例 |
| --- | --- | --- |
| SY-XM-01 | 默认当前年 | UI-001；API-001 |
| SY-XM-02 | 切年；7 日/24h 不按 Y | UT-021；API-008、026；UI-002 |
| SY-XM-03 | 核心总览 8 项 | UT-007～008、010；API-002；UI-004 |
| SY-XM-04 | 活跃度 7 日 | UT-011；API-007；UI-006 |
| SY-XM-05 | 用户结构 | UT-013～014；API-009～010；UI-007 |
| SY-XM-06 | 分类 100% | UT-015；API-011～012；UI-008～009 |
| SY-XM-07 | 最近 24h 整点热度 | UT-012；API-013；UI-010 |
| SY-XM-08 | 分档与状态 | UT-017～018；API-014～015；UI-011～012 |
| SY-XM-09 | 热点 Top5 | UT-019；API-016；UI-013 |
| SY-XM-10 | 关键词 | UT-020；API-017；UI-014 |
| SY-XM-11 | 刷新联动 | API-030；UI-021 |
| SY-XM-12 | 只读 | UT-023；API-028；UI-018 |
| SY-XM-13 | 接诊隔离 | UT-005；API-004 | — |
| §2.18#1～6 | 产品确认 | UT-006～007、010、015；API-003、011、021；UI-005 |
| §7.1 | 空态 | API-018～020；UI-015～016 |
| §7.2 | 加载失败 | UI-003、019 |

---

## 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：单元 24、接口 32、UI 22；覆盖 SY-XM-01～13 与正常/异常/约束；Playwright+Chrome；Base `/bigScreen/livestockResource` |
| 1.1 | 对齐功能需求 v1.1（提问量、滑动 24h 等） |
| 1.3 | 2026-07-04 | 分时热度改为最近 24 整点小时；VO 增 `bucketDateTime`；悬停显完整时刻 |
