# 疫情上报 — 技术方案

> 依据：同目录 `疫情上报功能需求.md`。本模块为疫情台账 **CRUD + 解除**；处置状态由 `release_date` 是否为空推导。

---

## 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-DD`；枚举用字典或固定选项（与需求 §2 一致） |
| **代码包** | `com.ruoyi.web.modules.diseasedetection`（建议） |

**分层**：`Controller`（权限、`AjaxResult` / `TableDataInfo`）→ `Service`（枚举/日期校验、**未解除**才可改/解除）→ `Mapper`/XML → `domain`。

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

- `release_date` **为空** → 未解除：可改、可解除、可删。  
- `release_date` **非空** → 已解除：禁止改、禁止再次解除；可删。  
- 列表默认 `report_date DESC, create_time DESC, id DESC`。  
- 筛选：`transmission_route`、`risk_level` 精确匹配（可空）。

---

## 2. 数据库设计

### 2.1 表 `biz_epidemic_report`（疫情上报）

| 字段 | 类型 | 非空 | 说明 |
| --- | --- | --- | --- |
| `id` | `bigint(20)` | Y | 主键 |
| `report_date` | `date` | Y | 上报日期 |
| `transmission_route` | `tinyint(2)` | Y | 传播途径，见 **§2.3** |
| `affected_location_track` | `varchar(500)` | Y | 涉疫点位/轨迹 |
| `epidemic_type` | `tinyint(2)` | Y | 疫病类型，见 **§2.3** |
| `epidemic_name` | `varchar(50)` | Y | 疫病名称 |
| `risk_level` | `tinyint(2)` | Y | 风险等级，见 **§2.3** |
| `release_date` | `date` | N | 解除日期；**NULL=未解除** |
| `create_by` / `create_time` / `update_by` / `update_time` | 若依惯例 | — | 审计 |
| `remark` | `varchar(500)` | N | 备注（选填，扩展用） |

**索引**：`PRIMARY KEY (id)`；`KEY idx_report_date (report_date)`；`KEY idx_transmission_route (transmission_route)`；`KEY idx_risk_level (risk_level)`；`KEY idx_release_date (release_date)`。

**处置状态（不落库）**：`release_date IS NULL` → 未解除；否则已解除。列表/详情可冗余返回 `relieveStatus`：`0` 未解除 / `1` 已解除。

### 2.2 DDL（MySQL 5.7）

```sql
CREATE TABLE `biz_epidemic_report` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `report_date` date NOT NULL COMMENT '上报日期',
  `transmission_route` tinyint(2) NOT NULL COMMENT '传播途径1调运2本地3环境4其他',
  `affected_location_track` varchar(500) NOT NULL COMMENT '涉疫点位轨迹',
  `epidemic_type` tinyint(2) NOT NULL COMMENT '疫病类型1病毒2细菌3寄生虫4其他',
  `epidemic_name` varchar(50) NOT NULL COMMENT '疫病名称',
  `risk_level` tinyint(2) NOT NULL COMMENT '风险等级1高2中3低',
  `release_date` date DEFAULT NULL COMMENT '解除日期NULL未解除',
  `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`),
  KEY `idx_report_date` (`report_date`),
  KEY `idx_transmission_route` (`transmission_route`),
  KEY `idx_risk_level` (`risk_level`),
  KEY `idx_release_date` (`release_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='疫情上报';
```

### 2.3 枚举编码（与功能需求 §2 对应）

**传播途径 `transmission_route`**

| 值 | 标签 |
| --- | --- |
| 1 | 调运传入 |
| 2 | 本地扩散 |
| 3 | 环境感染 |
| 4 | 其他未知 |

**疫病类型 `epidemic_type`**

| 值 | 标签 |
| --- | --- |
| 1 | 病毒性疫病 |
| 2 | 细菌性疫病 |
| 3 | 寄生虫疫病 |
| 4 | 其他类疫病 |

**风险等级 `risk_level`**

| 值 | 标签 |
| --- | --- |
| 1 | 高危 |
| 2 | 中危 |
| 3 | 低危 |

> 前后端展示走数据字典（`sys_dict`）或前端 i18n 均可；**入库必须为上表编码**，非法值拒绝。

### 2.4 字段与 API 驼峰对照

| 需求名称 | 库字段 | API 驼峰 |
| --- | --- | --- |
| 上报日期 | `report_date` | `reportDate` |
| 传播途径 | `transmission_route` | `transmissionRoute` |
| 涉疫点位/轨迹 | `affected_location_track` | `affectedLocationTrack` |
| 疫病类型 | `epidemic_type` | `epidemicType` |
| 疫病名称 | `epidemic_name` | `epidemicName` |
| 风险等级 | `risk_level` | `riskLevel` |
| 解除日期 | `release_date` | `releaseDate` |
| 处置状态（派生） | — | `relieveStatus`（0 未解除 / 1 已解除） |

---

## 3. 接口设计

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

**权限标识（示例）**：`diseaseDetection:epidemicReport:list|query|add|edit|remove|relieve`

**Base Path（示例）**：`/diseaseDetection/epidemicReport`

| # | 说明 | Method | URI | 权限 | 要点 |
| --- | --- | --- | --- | --- | --- |
| 3.1 | 分页列表 | GET | `/diseaseDetection/epidemicReport/list` | `...:list` | Query **§3.1.1**；排序见 §1 |
| 3.2 | 详情 | GET | `/diseaseDetection/epidemicReport/{id}` | `...:query` | 含 `relieveStatus` |
| 3.3 | 新增 | POST | `/diseaseDetection/epidemicReport` | `...:add` | Body **§3.3.1**；`releaseDate` 忽略 |
| 3.4 | 修改 | PUT | `/diseaseDetection/epidemicReport` | `...:edit` | Body 含 `id`；**仅** `release_date IS NULL` |
| 3.5 | 删除 | DELETE | `/diseaseDetection/epidemicReport/{ids}` | `...:remove` | 逗号分隔；已/未解除均可 |
| 3.6 | 解除 | PUT | `/diseaseDetection/epidemicReport/relieve` | `...:relieve` | Body：**§3.6.1**；**仅**未解除 |

#### 3.1.1 列表 Query

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `pageNum` / `pageSize` | int | N | 默认 `1` / `20` |
| `transmissionRoute` | int | N | 传播途径编码，精确匹配 |
| `riskLevel` | int | N | 风险等级编码，精确匹配 |
| `relieveStatus` | int | N | 可选：`0` 未解除（`release_date IS NULL`），`1` 已解除 |

**列表行（示例）**：`id`、`reportDate`、`transmissionRoute`、`epidemicType`、`epidemicName`、`riskLevel`、`affectedLocationTrack`（可截断）、`relieveStatus`、`releaseDate`、`createTime`。

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

| 字段 | 新增 | 修改 | 说明 |
| --- | --- | --- | --- |
| `id` | — | Y | 主键 |
| `reportDate` | Y | Y | `YYYY-MM-DD` |
| `transmissionRoute` | Y | Y | 1～4 |
| `affectedLocationTrack` | Y | Y | 1～500 字 |
| `epidemicType` | Y | Y | 1～4 |
| `epidemicName` | Y | Y | 1～50 字 |
| `riskLevel` | Y | Y | 1～3 |
| `releaseDate` | — | — | **不得**经新增/修改写入；仅 **§3.6** |

#### 3.6.1 解除 Body

| 字段 | 必填 | 说明 |
| --- | --- | --- |
| `id` | Y | 疫情上报主键 |
| `releaseDate` | Y | `YYYY-MM-DD`；≥ `report_date`；默认不允许未来日期（与需求一致） |

**解除逻辑**：校验未解除 → 更新 `release_date`、`update_by/time` → 返回成功。

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

| 项 | 规则 |
| --- | --- |
| 枚举 | `transmissionRoute`、`epidemicType`、`riskLevel` 须在 **§2.3** 范围内 |
| 日期 | `reportDate` 合法；解除时 `releaseDate >= reportDate` |
| 修改 | 若 `release_date` 非空 → 业务失败（已解除不可修改） |
| 解除 | 若 `release_date` 非空 → 业务失败（不可重复解除） |
| 删除 | 无状态限制 |

---

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

| 类型 | 名称 | 权限标识 |
| --- | --- | --- |
| 目录/菜单 | 疫情上报 | `diseaseDetection:epidemicReport:list` |
| 按钮 | 查询 | `diseaseDetection:epidemicReport:query` |
| 按钮 | 新增 | `diseaseDetection:epidemicReport:add` |
| 按钮 | 修改 | `diseaseDetection:epidemicReport:edit` |
| 按钮 | 删除 | `diseaseDetection:epidemicReport:remove` |
| 按钮 | 解除 | `diseaseDetection:epidemicReport:relieve` |

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

---

## 5. 交付清单

- [ ] `sql/biz_epidemic_report.sql`、字典数据（三类枚举）、菜单权限 SQL  
- [ ] `BizEpidemicReport` Domain / Mapper / Service / Controller  
- [ ] 前端：列表筛选、新增/编辑表单、解除弹窗（仅未解除行展示）  
- [ ] 用例：已解除不可改/不可再解除、解除日期早于上报日、筛选与删除  

---

## 6. 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初稿：单表；`release_date` 驱动处置状态；CRUD + relieve 接口 |
