# 共同富裕成果 — 技术方案

> 依据：同目录 `共同富裕成果功能需求.md`。本模块为**月度成果台账 CRUD**，无发布/下架；本文给出库表与 HTTP 接口约定。

---

## 1. 技术架构

| 项 | 说明 |
| --- | --- |
| **后端** | RuoYi **v3.9.2**（**springboot2** 分支）：JDK 8、Spring Boot 2.x、Spring MVC、MyBatis、Druid |
| **数据库** | MySQL **5.7.39**，InnoDB，`utf8mb4` |
| **前端** | 若依 Vue2；统计范围用 **月份**选择器，提交 `YYYY-MM` |
| **代码包** | `com.ruoyi.web.modules.commonprosperity`（建议，与「共同富裕项目」同包） |

**分层**：`Controller`（校验、权限、`AjaxResult` / `TableDataInfo`）→ `Service`（字段校验、统计范围唯一性）→ `Mapper`/XML → `domain`。

**业务特征（摘要）**

- 新增 / 修改 / 删除 / 查询**无发布状态**前置。
- 列表默认按 **`stat_period` 倒序**，其次 `create_time` 倒序。
- **`stat_period`（YYYY-MM）** 在适用范围（如租户）内**唯一**；新增/修改冲突时业务失败。

---

## 2. 数据库设计

### 2.1 表 `biz_common_prosperity_achievement`（共同富裕成果）

| 字段 | 类型 | 非空 | 默认值 | 说明 |
| --- | --- | --- | --- | --- |
| `id` | `bigint(20)` | Y | 自增 | 主键 |
| `stat_period` | `char(7)` | Y | — | 统计范围，`YYYY-MM` |
| `collective_economy_income` | `decimal(14,2)` | Y | — | 集体经济收入（**万元**，≥0） |
| `employment_driven_count` | `int(11)` | Y | `0` | 带动就业人数（人，≥0 整数） |
| `new_job_positions` | `int(11)` | Y | `0` | 新增就业岗位（个，≥0 整数） |
| `env_project_count` | `int(11)` | Y | `0` | 环境治理项目数（个） |
| `new_green_area` | `decimal(12,2)` | Y | — | 新增绿化面积（亩，≥0） |
| `cultural_heritage_count` | `int(11)` | Y | `0` | 文化传承人数（人） |
| `ethnic_integration_project_count` | `int(11)` | Y | `0` | 民族融合项目数（个） |
| `ethnic_unity_activity_count` | `int(11)` | Y | `0` | 民族团结活动数（个） |
| `digital_platform_usage_rate` | `decimal(8,4)` | Y | — | 数字平台使用率（0～1） |
| `regional_public_brand_count` | `int(11)` | Y | `0` | 区域公共品牌数（个） |
| `brand_premium_rate` | `decimal(8,4)` | Y | — | 品牌产品溢价率（0～1） |
| `create_by` / `create_time` / `update_by` / `update_time` | 若依惯例 | — | — | 审计 |
| `remark` | `varchar(500)` | N | NULL | 备注 |

**索引**：`PRIMARY KEY (id)`；`UNIQUE KEY uk_stat_period (stat_period)`；`KEY idx_stat_period (stat_period)`（列表排序/按年筛选）。

> 若后续多租户：将唯一约束改为 `UNIQUE (tenant_id, stat_period)`，并增加 `tenant_id` 字段。

### 2.2 DDL（MySQL 5.7）

```sql
CREATE TABLE `biz_common_prosperity_achievement` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `stat_period` char(7) NOT NULL COMMENT '统计范围YYYY-MM',
  `collective_economy_income` decimal(14,2) NOT NULL COMMENT '集体经济收入(万元)',
  `employment_driven_count` int(11) NOT NULL DEFAULT '0' COMMENT '带动就业人数',
  `new_job_positions` int(11) NOT NULL DEFAULT '0' COMMENT '新增就业岗位',
  `env_project_count` int(11) NOT NULL DEFAULT '0' COMMENT '环境治理项目数',
  `new_green_area` decimal(12,2) NOT NULL COMMENT '新增绿化面积(亩)',
  `cultural_heritage_count` int(11) NOT NULL DEFAULT '0' COMMENT '文化传承人数',
  `ethnic_integration_project_count` int(11) NOT NULL DEFAULT '0' COMMENT '民族融合项目数',
  `ethnic_unity_activity_count` int(11) NOT NULL DEFAULT '0' COMMENT '民族团结活动数',
  `digital_platform_usage_rate` decimal(8,4) NOT NULL COMMENT '数字平台使用率0-1',
  `regional_public_brand_count` int(11) NOT NULL DEFAULT '0' COMMENT '区域公共品牌数',
  `brand_premium_rate` decimal(8,4) NOT NULL COMMENT '品牌产品溢价率0-1',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_stat_period` (`stat_period`),
  KEY `idx_stat_period` (`stat_period`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='共同富裕成果';
```

### 2.3 字段与需求对照

| 需求名称 | 库字段 | API 驼峰 |
| --- | --- | --- |
| 统计范围 | `stat_period` | `statPeriod` |
| 集体经济收入 | `collective_economy_income` | `collectiveEconomyIncome` |
| 带动就业人数 | `employment_driven_count` | `employmentDrivenCount` |
| 新增就业岗位 | `new_job_positions` | `newJobPositions` |
| 环境治理项目数 | `env_project_count` | `envProjectCount` |
| 新增绿化面积 | `new_green_area` | `newGreenArea` |
| 文化传承人数 | `cultural_heritage_count` | `culturalHeritageCount` |
| 民族融合项目数 | `ethnic_integration_project_count` | `ethnicIntegrationProjectCount` |
| 民族团结活动数 | `ethnic_unity_activity_count` | `ethnicUnityActivityCount` |
| 数字平台使用率 | `digital_platform_usage_rate` | `digitalPlatformUsageRate` |
| 区域公共品牌数 | `regional_public_brand_count` | `regionalPublicBrandCount` |
| 品牌产品溢价率 | `brand_premium_rate` | `brandPremiumRate` |

---

## 3. 接口设计

**统一响应**：`AjaxResult`（`code` / `msg` / `data`）或分页 `TableDataInfo`（`rows`、`total`）。

**权限标识（示例）**：`commonProsperity:achievement:list|query|add|edit|remove|export`

**Base Path（示例）**：`/commonProsperity/achievement`

| # | 说明 | Method | URI | 权限 | 要点 |
| --- | --- | --- | --- | --- | --- |
| 3.1 | 分页列表 | GET | `/commonProsperity/achievement/list` | `commonProsperity:achievement:list` | Query **3.1.1**；排序 `stat_period DESC, create_time DESC, id DESC` |
| 3.2 | 详情 | GET | `/commonProsperity/achievement/{id}` | `commonProsperity:achievement:query` | 全字段 |
| 3.3 | 新增 | POST | `/commonProsperity/achievement` | `commonProsperity:achievement:add` | Body **3.3.1**；校验 `stat_period` 唯一 |
| 3.4 | 修改 | PUT | `/commonProsperity/achievement` | `commonProsperity:achievement:edit` | Body 含 `id`；改 `statPeriod` 时排除自身后查重 |
| 3.5 | 删除 | DELETE | `/commonProsperity/achievement/{ids}` | `commonProsperity:achievement:remove` | 支持逗号分隔批量 id |
| 3.6 | 导出（可选） | POST | `/commonProsperity/achievement/export` | `commonProsperity:achievement:export` | 与列表同筛选条件 |

#### 3.1.1 列表 Query 参数

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `pageNum` / `pageSize` | int | N | 默认 `1` / `20` |
| `statYear` | int / string | N | 统计年份，如 `2026`；匹配 `stat_period` 以该年开头（`2026-01`～`2026-12`）；空则不过滤 |

**按年筛选（SQL 示例）**：`stat_period LIKE CONCAT(#{statYear}, '-%')` 或 `LEFT(stat_period, 4) = #{statYear}`。

#### 3.3.1 新增 / 修改 Body（JSON，驼峰）

| 字段 | 必填 | 说明 |
| --- | --- | --- |
| `id` | 修改 Y | 主键 |
| `statPeriod` | Y | `YYYY-MM`，正则 `^\d{4}-(0[1-9]|1[0-2])$` |
| `collectiveEconomyIncome` | Y | ≥0，最多 2 位小数 |
| `employmentDrivenCount` | Y | ≥0 整数 |
| `newJobPositions` | Y | ≥0 整数 |
| `envProjectCount` | Y | ≥0 整数 |
| `newGreenArea` | Y | ≥0，最多 2 位小数 |
| `culturalHeritageCount` | Y | ≥0 整数 |
| `ethnicIntegrationProjectCount` | Y | ≥0 整数 |
| `ethnicUnityActivityCount` | Y | ≥0 整数 |
| `digitalPlatformUsageRate` | Y | ≥0 且 ≤1 |
| `regionalPublicBrandCount` | Y | ≥0 整数 |
| `brandPremiumRate` | Y | ≥0 且 ≤1 |
| `remark` | N | 备注 |

**列表行字段（示例）**：`id`、`statPeriod`、`collectiveEconomyIncome`、`employmentDrivenCount`、`newJobPositions`、`envProjectCount`、`newGreenArea`、`digitalPlatformUsageRate`、`regionalPublicBrandCount`、`createTime`。

### 3.4 服务端校验（摘要）

| 项 | 规则 |
| --- | --- |
| `statPeriod` | 非空；格式 `YYYY-MM`；唯一（新增 / 修改排除当前 id） |
| 金额、面积 | ≥0；小数位与库表一致 |
| 整数项 | ≥0；无小数部分 |
| 比率项 | `digitalPlatformUsageRate`、`brandPremiumRate` ∈ [0, 1] |
| 删除 | 无状态限制；物理删或逻辑删按项目惯例 |

---

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

| 类型 | 名称 | 权限标识 |
| --- | --- | --- |
| 目录 | 共同富裕 | — |
| 菜单 | 共同富裕成果 | `commonProsperity:achievement:list` |
| 按钮 | 查询 | `commonProsperity:achievement:query` |
| 按钮 | 新增 | `commonProsperity:achievement:add` |
| 按钮 | 修改 | `commonProsperity:achievement:edit` |
| 按钮 | 删除 | `commonProsperity:achievement:remove` |
| 按钮 | 导出 | `commonProsperity:achievement:export` |

组件路径建议：`commonProsperity/achievement/index`；API 文件 `ruoyi-ui/src/api/commonProsperity/achievement.js`。

---

## 5. 交付清单

- [ ] `biz_common_prosperity_achievement` DDL、菜单权限 SQL（`sql/biz_common_prosperity_achievement.sql`）
- [ ] `BizCommonProsperityAchievement` Domain / Mapper / Service / Controller
- [ ] 前端：按 `statYear` 筛选、月份选择 `statPeriod`、比率 0～1 校验
- [ ] 用例：同月重复、比率越界、整数含小数、按年筛选、CRUD

---

## 6. 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初稿：对齐功能需求；单表台账；`stat_period` 唯一；Base Path `/commonProsperity/achievement` |
