# 大屏 — 共同富裕统计 — 技术方案

> 依据：同目录 `大屏共同富裕功能需求.md`；数据源为《共同富裕成果技术方案》《共同富裕项目技术方案》既有表。本模块为**大屏只读看板**，无业务台账 CRUD。

---

## 1. 技术架构

| 项 | 说明 |
| --- | --- |
| **后端** | RuoYi **v3.9.2**（**springboot2** 分支）：JDK 8、Spring Boot 2.x、Spring MVC、MyBatis、Druid |
| **数据库** | MySQL **5.7.39**，InnoDB，`utf8mb4` |
| **前端** | 大屏独立页面（Vue2 + ECharts 或大屏框架）；**一次切换年份**拉取看板主数据，项目列表**分页**单独请求 |
| **代码包** | `com.ruoyi.web.modules.prosperity`（建议新增 `screen` 子包：`controller` / `service` / `vo`） |

**分层**：`CommonProsperityScreenController` → `ICommonProsperityScreenService`（口径编排）→ 复用 `IAchievementReportService` + `BizCommonProsperityProjectMapper` / `BizCommonProsperityProjectOpImageMapper`。

| 场景 | 行为 |
| --- | --- |
| 进入 / 切换统计年份 | 调用 **§3.1** 返回成果总览、按月序列、数字赋能汇总、项目分类占比、可选年份 |
| 项目列表翻页 | 仅调用 **§3.2**，不改变成果区块 |
| 数据权限 | 全县共富数据，**不按**部门/用户过滤（与成果台账、项目维护范围一致） |
| 汇总口径 | 与《共同富裕成果年度报告技术方案》**§2.3** 一致；`hasAchievementData=false` 时 `summary=null` |
| 性能 | 单年成果 ≤12 行、项目量级有限，默认**实时查询**；可选 **§2.3** 缓存表 |

**依赖表（只读）**

| 表 | 用途 |
| --- | --- |
| `biz_common_prosperity_achievement` | 月度成果 → 总览、图表、数字赋能 |
| `biz_common_prosperity_project` | 已发布项目 → 分类饼图、列表 |
| `biz_common_prosperity_project_op_image` | 列表运营图片（1～3 张） |

---

## 2. 数据库设计

### 2.1 本模块业务表

**无新增业务台账表。** DDL 以 `sql/biz_common_prosperity_achievement.sql`、`sql/biz_common_prosperity_project.sql` 为准。

### 2.2 查询口径（SQL 条件）

#### 成果（按统计年份 `Y`）

| 项 | 条件 |
| --- | --- |
| 按年取数 | `stat_period LIKE CONCAT(#{statYear}, '-%')`，`ORDER BY stat_period ASC` |
| 缺月补 0 / 年度汇总 | 服务端 `AchievementReportAggregator`（已实现，直接复用） |
| `hasAchievementData` | 该年 `COUNT(*) > 0` |

#### 项目（按统计年份 `Y`）

| 项 | 条件 |
| --- | --- |
| 发布状态 | `publish_status = 1` |
| 实施周期与 **Y** 有交集 | `impl_start_date <= CONCAT(#{statYear}, '-12-31')` AND `impl_end_date >= CONCAT(#{statYear}, '-01-01')` |
| 列表默认排序 | `publish_time DESC, id DESC`（与功能需求 §5.11.1 一致；若产品改按 `impl_start_date` 倒序，仅改 `ORDER BY`） |
| 分类统计 | 在上述集合上 `GROUP BY project_type`，得各类型 `count`、`ratio`（`ratio = count / total`，`total=0` 时占比均为 0） |
| 运营图 | `biz_common_prosperity_project_op_image` 按 `project_id IN (...)`，`sort_order ASC` |

**`project_type` 枚举**：`1` 合作共赢 → 展示「共富项目」；`2` 农文旅融合；`3` 认养农业。

### 2.3 可选表 `biz_common_prosperity_screen_cache`（性能优化）

数据量大或刷新慢时启用；**非本期必建**。

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `id` | `bigint(20)` | 主键 |
| `stat_year` | `int(11)` | 统计年份 |
| `payload_json` | `mediumtext` | **§3.1** 响应 JSON（不含分页列表） |
| `expire_time` | `datetime` | 过期时间 |
| `create_time` | `datetime` | 写入时间 |

**索引**：`UNIQUE uk_stat_year (stat_year)`。TTL 建议 **1～5 分钟**（与功能需求 §7.4 一致）。

### 2.4 索引建议（既有表）

| 表 | 建议 |
| --- | --- |
| `biz_common_prosperity_achievement` | 沿用 `uk_stat_period` / `idx_stat_period` |
| `biz_common_prosperity_project` | 沿用 `idx_publish`、`idx_impl_start`；可选复合 `idx_screen (publish_status, impl_start_date, impl_end_date)` |

### 2.5 Mapper 扩展（建议方法名）

| Mapper | 方法 | 说明 |
| --- | --- | --- |
| `BizCommonProsperityProjectMapper` | `selectPublishedForScreen(statYear)` | 分类统计用，返回 `project_type` 列表或 `GROUP BY` 结果 |
| 同上 | `selectPublishedListForScreen(statYear)` | 列表分页（配合 PageHelper） |
| `BizCommonProsperityProjectOpImageMapper` | `selectByProjectIds(ids)` | 批量加载运营图 |

---

## 3. 接口设计

**统一响应**：`AjaxResult`（`code` / `msg` / `data`）；项目分页列表使用 `TableDataInfo`（`rows` / `total`）。

**权限标识（示例）**：`bigScreen:commonProsperity:query`（仅查询；与成果/项目 CRUD 分离）

**Base Path**：`/bigScreen/commonProsperity`

> 大屏若部署为**免登录展示**，在 `SecurityConfig` 对白名单路径放行，**不在** Controller 使用 `@Anonymous` 写死；生产环境默认仍走若依 Token + 上表权限。

| # | 说明 | Method | URI | 权限 |
| --- | --- | --- | --- | --- |
| 3.1 | 看板主数据（成果 + 分类） | GET | `/bigScreen/commonProsperity/dashboard` | `bigScreen:commonProsperity:query` |
| 3.2 | 共富项目分页列表 | GET | `/bigScreen/commonProsperity/projects` | 同上 |

前端：切换 `statYear` → 调 **3.1** + **3.2**（`pageNum=1`）；仅翻页 → 调 **3.2**。

---

### 3.1 看板主数据

#### Query

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `statYear` | string | Y | 四位年份，如 `2026`；非法 → 业务异常（复用 `AchievementReportValidation`） |
| `forceRefresh` | boolean | N | 默认 `false`；`true` 时跳过 **§2.3** 缓存 |

#### 响应 `data`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `statYear` | int | 回显 |
| `availableYears` | int[] | 成果表与项目表出现过的年份并集，降序；供年份选择器 |
| `achievement` | object | 成果区块，结构同 `AchievementAnnualReportVo`（见下） |
| `projectTypeStats` | array | 项目分类饼图，见 **§3.1.1** |
| `hasProjectData` | boolean | 该年是否存在 ≥1 条符合 **§2.2** 的已发布项目 |

**`achievement` 节点**（复用年度报告 VO，勿改口径）：

| 字段 | 说明 |
| --- | --- |
| `hasData` | 即 `hasAchievementData`；全年无成果台账为 `false` |
| `summary` | 年度总览；`hasData=false` 时为 **`null`** |
| `monthly` | 固定 **12** 条，`month` 1～12；缺月指标为 **0** |

**图表字段映射**（与功能需求 §5、年度报告一致）

| 大屏区块 | 取用 |
| --- | --- |
| 总览卡片 / 数字赋能 | `achievement.summary.*` |
| 集体经济收入（横向柱） | `achievement.monthly[].collectiveEconomyIncome` |
| 就业带动（双折线） | `employmentDrivenCount`、`newJobPositions` |
| 环境治理 / 文化传承（柱） | `envProjectCount` / `culturalHeritageCount` |
| 绿化建设（折线） | `newGreenArea` |
| 民族团结（堆叠柱） | `ethnicIntegrationProjectCount`、`ethnicUnityActivityCount` |

#### 3.1.1 `projectTypeStats[]`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `projectType` | int | `1` / `2` / `3` |
| `projectTypeName` | string | 共富项目 / 农文旅项目 / 认养项目 |
| `count` | int | 数量 |
| `ratio` | decimal | 占比 0～1；`hasProjectData=false` 时三项 `count=0`、`ratio=0` |

#### 响应示例（节选）

```json
{
  "statYear": 2026,
  "availableYears": [2026, 2025],
  "hasProjectData": true,
  "achievement": {
    "statYear": 2026,
    "hasData": true,
    "summary": { "collectiveEconomyIncome": 120.50, "digitalPlatformUsageRate": 0.7250 },
    "monthly": [{ "month": 1, "collectiveEconomyIncome": 10.00 }]
  },
  "projectTypeStats": [
    { "projectType": 1, "projectTypeName": "共富项目", "count": 5, "ratio": 0.50 }
  ]
}
```

#### 服务端逻辑（摘要）

```
1. year = parseStatYear(statYear)
2. achievement = achievementReportService.getAnnualReport(String.valueOf(year))
3. projects = mapper.selectPublishedForScreen(year)
4. projectTypeStats = groupByType(projects); hasProjectData = total > 0
5. availableYears = union(achievementMapper.selectDistinctStatYears(), projectYears)
6. return AjaxResult.success(vo)
```

---

### 3.2 共富项目分页列表

#### Query

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `statYear` | string | Y | 同 **3.1** |
| `pageNum` | int | N | 默认 `1` |
| `pageSize` | int | N | 默认 `8`；建议 **5～10** |

#### 响应

`TableDataInfo`：`rows` 为 **§3.2.1** 结构数组，`total` 为符合条件的项目总数。

**不提供** `GET /project/{id}` 大屏专用详情接口；列表行内字段一次返回（对齐功能需求 §5.11）。

#### 3.2.1 `rows[]` 单条

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `id` | long | 项目 ID |
| `projectType` / `projectTypeName` | int / string | 类型枚举与展示名 |
| `projectName` | string | 项目名称 |
| `introduction` | string | 简介 |
| `projectContent` | string | 内容 |
| `implStartDate` / `implEndDate` | string | `yyyy-MM-dd` |
| `coverFileUrl` | string | 封面 URL，可空 |
| `videoFileUrl` | string | 运营视频 URL，可空 |
| `publishTime` | string | 发布时间 |
| `operationImages` | array | `{ fileUrl, sortOrder }`，1～3 条，按 `sortOrder` 升序 |

---

## 4. 菜单与权限（示例）

| 类型 | 名称 | 权限标识 | 说明 |
| --- | --- | --- | --- |
| 菜单 | 大屏共同富裕 | `bigScreen:commonProsperity:query` | 路由指向大屏页面组件 |
| 按钮 | 查看 | `bigScreen:commonProsperity:query` | 与菜单共用 |

SQL 示例：`sql/big_screen_common_prosperity_perm.sql`（挂载「大屏」父菜单下）。

---

## 5. 交付清单

- [ ] `CommonProsperityScreenController` + `ICommonProsperityScreenService` + VO
- [ ] `BizCommonProsperityProjectMapper` 大屏查询 SQL（**§2.2** 条件）
- [ ] 复用 `IAchievementReportService` / `AchievementReportAggregator`（禁止大屏单独写一套汇总）
- [ ] 单元测试：全年无成果（`summary=null`）、缺月补 0、项目年份交集、仅项目无成果、分类占比、分页列表含运营图
- [ ] 接口测试：`/bigScreen/commonProsperity/dashboard`、`/projects`
- [ ] 菜单权限 SQL；依赖成果/项目表 DDL 已执行
- [ ] 大屏前端页面（另见前端技术方案，本期可后补）

---

## 6. 修订记录

| 版本 | 日期 | 说明 |
| --- | --- | --- |
| 1.0 | 2026-05-20 | 初稿：无新业务表；复用成果年度报告聚合；双接口（看板 + 项目分页）；对齐功能需求 v1.0 |
