# 大屏 — 共同富裕统计 — 测试用例

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

**通用前置（无特殊说明）**：已执行 `sql/biz_common_prosperity_achievement.sql`、`sql/biz_common_prosperity_project.sql`；测试账号具备大屏查询权限。**成果口径**：缺月指标 **0**；全年无成果 `achievement.hasData=false`、`summary=null`；加总类 **SUM(12 月)**；比率类 **(SUM 12 月)/12**。**项目口径**：`publish_status=1`；实施周期与统计年 **Y** 交集（`impl_start_date ≤ Y-12-31` 且 `impl_end_date ≥ Y-01-01`）。

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

---

## 测试数据样本

| 代号 | 说明 |
| --- | --- |
| **ACH-Y** | 统计年 **Y** 成果台账；如 `ACH-2026` 仅 `2026-03`、`2026-08` 各 1 条 |
| **ACH-EMPTY** | 某年无任何成果记录 |
| **PRJ-PUB-A** | 已发布；实施 `2025-01-01`～`2027-12-31`；`project_type=1`；含 2 张运营图 |
| **PRJ-PUB-B** | 已发布；实施 `2026-06-01`～`2026-12-31`；`project_type=2`；含视频+封面 |
| **PRJ-UNPUB** | `publish_status=0` |
| **PRJ-OFF** | 曾发布已下架 `publish_status=0` 且 `offline_time` 非空 |
| **PRJ-OUT** | 已发布；实施 `2024-01-01`～`2024-12-31`（与 **2026** 无交集） |
| **PRJ-EDGE** | 已发布；实施 `2026-01-01`～`2026-12-31`（边界交集） |

---

## 一、单元测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| DP-GTFY-UT-001 | 参数校验 | statYear 合法 | 单元测试 | JUnit5 | 复用年度报告校验 | 无 | 传入 `2026`、`2000` | 解析通过 |
| DP-GTFY-UT-002 | 参数校验 | statYear 非法 | 单元测试 | JUnit5 | 异常入参 | 无 | 空、`26`、`abcd`、`1899` | 抛 `ServiceException` 或等价失败 |
| DP-GTFY-UT-003 | 成果聚合 | 复用 Aggregator 缺月 | 单元测试 | JUnit5 | 禁止大屏另写汇总 | Mock 2026 仅 3 月 1 条 | 调 `getAnnualReport(2026)` | `monthly` 长度 12；非 3 月指标为 0 |
| DP-GTFY-UT-004 | 成果聚合 | hasData 与 summary | 单元测试 | JUnit5 | §7.1 | Mock 空列表 | `buildReport(2026,[])` | `hasData=false`；`summary=null` |
| DP-GTFY-UT-005 | 成果聚合 | 比率十二月均 | 单元测试 | JUnit5 | §2.4 | 仅 6 月使用率 0.6 | `calcSummary` | `digitalPlatformUsageRate=0.05` |
| DP-GTFY-UT-006 | 项目筛选 | 实施周期交集 | 单元测试 | JUnit5 | §2.6 | 造 PRJ-PUB-A、PRJ-OUT、PRJ-EDGE | `filterByStatYear(2026)` | 含 A、EDGE；不含 OUT |
| DP-GTFY-UT-007 | 项目筛选 | 未发布/已下架排除 | 单元测试 | JUnit5 | §2.6、DP-10 | 含 PRJ-UNPUB、PRJ-OFF、PRJ-PUB-B | `filterByStatYear(2026)` | 仅 PUB-B（及满足交集的其他已发布项） |
| DP-GTFY-UT-008 | 项目筛选 | 边界日期含端点 | 单元测试 | JUnit5 | 交集边界 | `impl_start=2026-12-31`、`impl_end=2026-01-01` 各 1 条已发布 | `filterByStatYear(2026)` | 两条均纳入 |
| DP-GTFY-UT-009 | 分类统计 | 占比计算 | 单元测试 | JUnit5 | §5.10 | 类型 1×2、2×1、3×0 | `buildTypeStats` | count 2/1/0；ratio 2/3、1/3、0；合计 ratio≈1 |
| DP-GTFY-UT-010 | 分类统计 | 无项目固定三类 | 单元测试 | JUnit5 | §7.2 | 筛选结果空 | `buildTypeStats` | 返回 3 项；`count=0`、`ratio=0` |
| DP-GTFY-UT-011 | 可选年份 | 并集含当前年 | 单元测试 | JUnit5 | 年份下拉 | Mock 成果年 `[2025]`、项目年 `[]`；当前年 2026 | `buildAvailableYears` | 列表含 `2026`（当前年） |
| DP-GTFY-UT-012 | 列表排序 | 发布时间倒序 | 单元测试 | JUnit5 | §5.11.1 | 同类型两条 `publish_time` 不同 | `sortProjects` | 时间晚者在前 |
| DP-GTFY-UT-013 | 运营图 | 按 sort_order 组装 | 单元测试 | JUnit5 | §3.2.1 | 项目 2 张图 order 2、1 | `attachOpImages` | 输出顺序 1→2 |
| DP-GTFY-UT-014 | 看板编排 | 仅项目无成果 | 单元测试 | JUnit5 | §7.2 | Mock 成果空、项目 1 条 | `loadDashboard(2026)` | `achievement.hasData=false`；`hasProjectData=true` |
| DP-GTFY-UT-015 | 看板编排 | 仅成果无项目 | 单元测试 | JUnit5 | §7.2 | Mock 成果 1 条、项目空 | `loadDashboard(2026)` | `achievement.hasData=true`；`hasProjectData=false` |
| DP-GTFY-UT-016 | 约束 | 无写接口 | 单元测试 | JUnit5 | 只读 | 检查 ScreenService/Controller | 无 insert/update/delete | 仅查询与组装 |
| DP-GTFY-UT-017 | 约束 | 无详情接口定义 | 单元测试 | JUnit5 | §5.11 | 检查 Controller 映射 | 无 `GET .../{id}` 大屏详情 | 仅 dashboard、projects |
| DP-GTFY-UT-018 | 缓存 | forceRefresh 跳过 | 单元测试 | JUnit5 | 技术§2.3 可选 | 启用缓存且未过期 | `loadDashboard(2026,true)` | 不走缓存、重新查库 |

---

## 二、接口测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| DP-GTFY-API-001 | 看板 | 满年成果+项目 | 接口测试 | Postman/curl | 正常流程 DP-01 | 已登录；2026 成果多月+已发布项目 | `GET .../dashboard?statYear=2026` | `code` 成功；`achievement.hasData=true`；`monthly.length=12`；`hasProjectData=true`；`projectTypeStats` 有数据 |
| DP-GTFY-API-002 | 看板 | 缺月补零 | 接口测试 | Postman | DP-03 | ACH-2026 仅 3、8 月 | `statYear=2026` | 缺月 `monthly` 指标为 0；横轴逻辑由前端；汇总符合 §2.4 |
| DP-GTFY-API-003 | 看板 | 全年无成果 | 接口测试 | Postman | DP-04 | 2026 ACH-EMPTY | `GET dashboard` | `achievement.hasData=false`；`summary=null`；`monthly` 仍 12 条全 0 |
| DP-GTFY-API-004 | 看板 | 仅项目无成果 | 接口测试 | Postman | §7.2 | 2026 无成果；有 PRJ-PUB-B | `GET dashboard` | `achievement.hasData=false`；`hasProjectData=true`；饼图 stats 正常 |
| DP-GTFY-API-005 | 看板 | 仅成果无项目 | 接口测试 | Postman | §7.2 | 2026 有 ACH；无符合交集项目 | `GET dashboard` | `achievement.hasData=true`；`hasProjectData=false`；`projectTypeStats` 三项 count=0 |
| DP-GTFY-API-006 | 看板 | 比率汇总 | 接口测试 | Postman | DP-05 | 2026 全年使用率均为 0.12 | `GET dashboard` | `summary.digitalPlatformUsageRate`≈0.12；`brandPremiumRate` 同理 |
| DP-GTFY-API-007 | 看板 | 缺 statYear | 接口测试 | Postman | 异常 | 已登录 | 不传 `statYear` | 失败；`msg` 提示参数错误 |
| DP-GTFY-API-008 | 看板 | 非法 statYear | 接口测试 | Postman | 异常 | 已登录 | `statYear=abc` | 失败 |
| DP-GTFY-API-009 | 看板 | statYear 回显 | 接口测试 | Postman | 一致性 | 已登录 | `statYear=2025` | `data.statYear=2025` |
| DP-GTFY-API-010 | 看板 | availableYears | 接口测试 | Postman | §5.1 | 成果 2025、项目交集 2026 | `GET dashboard` | `availableYears` 含 2025、2026、当前年；降序 |
| DP-GTFY-API-011 | 看板 | 分类占比之和 | 接口测试 | Postman | DP-07 | 2026 三类项目共 6 个 | `GET dashboard` | `sum(ratio)`≈1（±0.01）；count 之和=6 |
| DP-GTFY-API-012 | 看板 | 未发布项目不计 | 接口测试 | Postman | 业务约束 | 仅 PRJ-UNPUB | `GET dashboard` 2026 | `hasProjectData=false` 或 stats 全 0 |
| DP-GTFY-API-013 | 看板 | 下架项目不计 | 接口测试 | Postman | DP-10 | PRJ-OFF 曾计入、下架后 | 下架→`GET dashboard` | 分类与列表均不含该项目 |
| DP-GTFY-API-014 | 看板 | 实施年无交集排除 | 接口测试 | Postman | §2.6 | PRJ-OUT + PRJ-PUB-B | `statYear=2026` | stats/list 不含 OUT；含 B |
| DP-GTFY-API-015 | 看板 | forceRefresh | 接口测试 | Postman | 技术§3.1 | 已启用缓存 | `?statYear=2026&forceRefresh=true` | 成功；数据与库一致 |
| DP-GTFY-API-016 | 项目列表 | 分页首页 | 接口测试 | Postman | DP-08 | 2026 ≥9 条已发布项目 | `GET .../projects?statYear=2026&pageNum=1&pageSize=8` | `rows.length≤8`；`total` 正确 |
| DP-GTFY-API-017 | 项目列表 | 第二页 | 接口测试 | Postman | 分页 | 同上 | `pageNum=2` | 与第一页 `id` 不重复；顺序 `publish_time` 倒序 |
| DP-GTFY-API-018 | 项目列表 | 行内字段齐全 | 接口测试 | Postman | §5.11.2 | PRJ-PUB-B 有图视封面 | `GET projects` | 每条含 type、name、intro、content、周期、cover、video、operationImages |
| DP-GTFY-API-019 | 项目列表 | 全年无项目 | 接口测试 | Postman | §5.11.3 | 2026 无符合项目 | `GET projects` | `rows=[]`；`total=0` |
| DP-GTFY-API-020 | 项目列表 | 缺 statYear | 接口测试 | Postman | 异常 | 已登录 | 不传 `statYear` | 失败 |
| DP-GTFY-API-021 | 范围 | 无大屏详情接口 | 接口测试 | Postman | §5.11 | 已登录 | `GET .../bigScreen/commonProsperity/1` 或 `/project/1` | 404/405 |
| DP-GTFY-API-022 | 范围 | 无维护接口 | 接口测试 | Postman | §3.2 | 已登录 | `POST/PUT/DELETE .../bigScreen/commonProsperity/**` | 404/405 或无权限 |
| DP-GTFY-API-023 | 联动 | 成果补录后 | 接口测试 | Postman | DP-09 | 2026 原 ACH-EMPTY | 后台新增 `2026-01` 成果→`GET dashboard` | `hasData=true`；1 月有值 |
| DP-GTFY-API-024 | 联动 | 项目发布后 | 接口测试 | Postman | DP-09 | 2026 原无项目 | 后台发布 PRJ-EDGE→`GET dashboard`+`projects` | `hasProjectData=true`；列表可见 |
| DP-GTFY-API-025 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET dashboard` | 401 或统一未登录 |
| DP-GTFY-API-026 | 权限 | 无大屏权限 | 接口测试 | Postman | 越权 | 无 `bigScreen:commonProsperity:query` | `GET dashboard`、`GET projects` | 403 或无权限 |
| DP-GTFY-API-027 | 权限 | 有大屏无成果写 | 接口测试 | Postman | 只读 | 仅有 query | `GET` 成功；`POST /commonProsperity/achievement` 失败 | 大屏可读；台账不可写 |
| DP-GTFY-API-028 | 一致性 | 切年数据不串 | 接口测试 | Postman | DP-02 | 2025、2026 各不同数据 | 分别 `statYear=2025/2026` | 各年 `monthly`/项目集合互不混入 |

---

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

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| DP-GTFY-UI-001 | 页面 | 默认当前年加载 | UI 测试 | Playwright+Chrome | DP-01 | 已登录；有权限；有当前年数据 | 打开「大屏共同富裕」路由 | 年份为当前自然年；自动请求 dashboard+projects；各区块同年 |
| DP-GTFY-UI-002 | 筛选 | 切换年份整页刷新 | UI 测试 | Playwright+Chrome | DP-02、§5.1 | 含 2025、2026 数据 | 年份 2025→2026 | 成果区、图表、饼图、列表同步更新；无 2025 残留数字 |
| DP-GTFY-UI-003 | 筛选 | 加载中防残留 | UI 测试 | Playwright+Chrome | §7.3 | 已登录 | 切换年份（可 `route.fulfill` 延迟） | 出现 Loading/遮罩；完成后仅新年数据 |
| DP-GTFY-UI-004 | 空态 | 全年无成果 | UI 测试 | Playwright+Chrome | DP-04、§7.1 | 选 ACH-EMPTY 年 | 进入或切换该年 | 总览/图表/数字赋能空态文案；**不**显示全 0 汇总卡片 |
| DP-GTFY-UI-005 | 空态 | 无项目有成果 | UI 测试 | Playwright+Chrome | §7.2 | 2026 有成果无项目 | 打开 2026 | 图表正常；饼图空态；列表「本年度暂无共富项目」 |
| DP-GTFY-UI-006 | 总览 | 指标与单位 | UI 测试 | Playwright+Chrome | §5.2 | 2026 有成果 | 查看共富成果卡片区 | 名称/数值/单位正确（万元、人、个、亩）；比率显示 **%** |
| DP-GTFY-UI-007 | 图表 | 集体经济横向柱 12 月 | UI 测试 | Playwright+Chrome | §5.3、DP-03 | ACH-2026 缺月 | 查看该图+悬停 | 12 刻度；缺月高度 0；Tooltip 含月份+万元 |
| DP-GTFY-UI-008 | 图表 | 就业双系列 | UI 测试 | Playwright+Chrome | DP-06、§5.4 | 2026 有数据 | 查看就业带动图 | 两图例/两色系；Tooltip 区分人数与岗位 |
| DP-GTFY-UI-009 | 图表 | 环境治理/文化传承柱图 | UI 测试 | Playwright+Chrome | §5.5、§5.8 | 2026 有数据 | 查看两图 | 12 月；缺月为 0 |
| DP-GTFY-UI-010 | 图表 | 绿化折线 | UI 测试 | Playwright+Chrome | §5.6 | 2026 有数据 | 查看绿化建设 | 12 落点；缺月 0 不断线 |
| DP-GTFY-UI-011 | 图表 | 民族团结堆叠 | UI 测试 | Playwright+Chrome | DP-06、§5.9 | 2026 有数据 | 悬停某月 | 堆叠柱；Tooltip **分别**显示融合项目数、活动数 |
| DP-GTFY-UI-012 | 数字赋能 | 三指标展示 | UI 测试 | Playwright+Chrome | §5.7、DP-05 | 2026 有成果 | 查看数字赋能区 | 品牌数（加总）、溢价率/使用率（%）；与 API `summary` 一致 |
| DP-GTFY-UI-013 | 数字赋能 | 无成果空态 | UI 测试 | Playwright+Chrome | §5.7 | ACH-EMPTY 年 | 切换至该年 | 不展示 0% / 0 品牌误导数据 |
| DP-GTFY-UI-014 | 项目分类 | 饼图与图例 | UI 测试 | Playwright+Chrome | §5.10、DP-07 | 三类均有项目 | 查看饼图 | 三类名称与列表标签色一致；占比之和 100% |
| DP-GTFY-UI-015 | 项目分类 | 无项目空态 | UI 测试 | Playwright+Chrome | §7.2 | 2026 无符合项目 | 查看饼图区 | 空态；**无**单类 100% 假象 |
| DP-GTFY-UI-016 | 项目列表 | 行内信息完整 | UI 测试 | Playwright+Chrome | DP-08、§5.11.2 | PRJ-PUB-B 在列 | 查看列表行 | 类型、名称、简介、内容、周期、封面、视频、运营图可见 |
| DP-GTFY-UI-017 | 项目列表 | 无二级详情页 | UI 测试 | Playwright+Chrome | §5.11 | 列表有「详情」文案（若有） | 点击详情/名称 | **不**跳转路由/新 Tab；仅行内展开或浮层 |
| DP-GTFY-UI-018 | 项目列表 | 分页翻页 | UI 测试 | Playwright+Chrome | §5.11.1 | ≥9 条项目；pageSize=8 | 点下一页 | 仅列表区刷新；`waitForResponse('**/projects**')`；成果区不变 |
| DP-GTFY-UI-019 | 只读 | 无维护按钮 | UI 测试 | Playwright+Chrome | §3.2 | 已登录 | 扫描页面 | 无新增/编辑/删除/发布；可有刷新 |
| DP-GTFY-UI-020 | 错误 | 接口失败可重试 | UI 测试 | Playwright+Chrome | §7.3 | Mock dashboard 500 | 进入或切年 | 失败提示；可点重试；不长期半屏旧数据 |
| DP-GTFY-UI-021 | 联动 | 后台发布后刷新 | UI 集成 | Playwright+Chrome | DP-09 | 2026 列表原空 | 后台发布项目→大屏 F5 或重进 | 饼图与列表出现新项目 |
| DP-GTFY-UI-022 | 联动 | 下架后不可见 | UI 集成 | Playwright+Chrome | DP-10 | 列表曾显示某项目 | 后台下架→刷新大屏 | 饼图与列表均移除 |
| DP-GTFY-UI-023 | 权限 | 无菜单不可进 | UI 测试 | Playwright+Chrome | 安全 | 账号无大屏菜单 | 登录查侧栏 | 无「大屏共同富裕」；直链路由 403/无权限页 |
| DP-GTFY-UI-024 | 端到端 | 按年查阅全流程 | UI 集成 | Playwright+Chrome | §4、DP-01～08 | 2026 完整样本 | 登录→进大屏→默认年→改年→悬停图表→翻页 | 十区块数据正确；无控制台报错 |
| DP-GTFY-UI-025 | 刷新 | 手动/定时刷新 | UI 测试 | Playwright+Chrome | §7.4 | 已打开页；后台改成果 | 点击刷新或等待轮播周期 | 数据更新为最新（允许 1～5 分钟延迟配置） |

---

## Playwright 实施提示

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

// 登录后 storageState
await page.goto('/#/bigScreen/commonProsperity/index'); // 以实际路由为准

// 切年：监听双请求同成败
const [dash, proj] = await Promise.all([
  page.waitForResponse('**/bigScreen/commonProsperity/dashboard**'),
  page.waitForResponse('**/bigScreen/commonProsperity/projects**'),
  yearPicker.selectOption('2026'),
]);

// 空态
await expect(page.getByText(/暂无.*成果|请.*共同富裕成果/)).toBeVisible();

// 图表容器数量（按页面实现调整）
await expect(page.locator('[data-chart]')).toHaveCount(6); // 集体经济/就业/环境/绿化/文化/民族团结
```

---

## 覆盖对照

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

---

## 功能需求追溯（DP / 章节）

| 追溯 | 要点 | 主要用例 |
| --- | --- | --- |
| DP-01 | 默认当前年 | UI-001；API-001 |
| DP-02 | 切年一致 | API-028；UI-002～003 |
| DP-03 | 缺月=0、12 月 | UT-003；API-002；UI-007～011 |
| DP-04 | 无成果空态 | UT-004；API-003；UI-004、013 |
| DP-05 | 比率 % | UT-005；API-006；UI-006、012 |
| DP-06 | 双系列图 | UI-008、011 |
| DP-07 | 项目分类 | UT-009～010；API-011～014；UI-014～015 |
| DP-08 | 列表分页行内 | API-016～018；UI-016～018 |
| DP-09 | 后台变更刷新 | API-023～024；UI-021、025 |
| DP-10 | 下架不展示 | UT-007；API-013；UI-022 |
| §2.6 | 项目交集 | UT-006、008；API-014 |
| §3.2 | 只读 | UT-016～017；API-021～022；UI-019 |
| §5.11 | 无详情页 | UT-017；API-021；UI-017 |
| §7.3 | 加载失败 | UI-003、020 |

---

## 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：单元 18、接口 28、UI 25；覆盖 DP-01～10 与正常/异常/约束；Playwright+Chrome；Base `/bigScreen/commonProsperity` |
