# 大屏 — 畜牧资源统计 — 测试用例 > 依据:`大屏畜牧资源功能需求.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 | `AI-Y`+`AI-TODAY` | `GET dashboard` 2026 | 8 字段与 SQL/手工抽样一致;提问量为 AI 回复数 | | DP-XM-API-003 | 看板 | 隐藏会话计入 | 接口测试 | Postman | §2.18#2 | `AI-Y`+`AI-HIDE` | 对比计入前后 `totalSessions` | 含隐藏会话 | | DP-XM-API-004 | 看板 | 排除接诊 | 接口测试 | Postman | SY-XM-13 | `AI-Y`+`AI-VET` | `GET dashboard` 2026 | 指标不含接诊会话/消息 | | DP-XM-API-005 | 看板 | 历史年今日为 0 | 接口测试 | Postman | §2.4 | `AI-TODAY` 有当日数据 | `statYear=2024` | `todayActiveUsers` 等四项=**0** | | 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 | `AI-Y`+`AI-TODAY` | 查看「核心数据总览」 | 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、009;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`;悬停显完整时刻 |