# 疫苗接种数据填报 — 技术方案

## 1. 概述

对齐牦牛出栏数据填报骨架：村 × 年月唯一键、导入 upsert、导出按官方模板填充。

| 项 | 值 |
| --- | --- |
| 表 | `biz_vaccination_data`（DDL：`sql/biz_vaccination_data.sql`） |
| Base URL | `/dataModel/vaccinationData` |
| 模板 classpath | `templates/vaccination_data_import_template.xlsx` |
| 唯一键 | `(stat_year, stat_month, village_dept_id)` |

---

## 2. 数据模型

| 字段 | 说明 |
| --- | --- |
| should_vaccinate_count | 应免数（头） |
| actual_vaccinate_count | 实免数（头） |
| immunity_rate | 派生：(实免/应免)×100，保留 2 位小数，`decimal(8,2)` |

Excel 列：0 序号、1 乡镇、2 村、3 应免数、4 实免数、5 免疫率（导入跳过）。

---

## 3. 后端结构

| 类 | 职责 |
| --- | --- |
| `BizVaccinationDataController` | REST |
| `BizVaccinationDataServiceImpl` | CRUD、导入 upsert、导出 |
| `VaccinationDataExcelParser` | 识别主表头，跳过子表头/空白/合计 |
| `VaccinationDataExcelExporter` | 基于模板写数据 |
| `VaccinationDataDerivedSupport` | 免疫率计算与百分比格式化 |
| `VaccinationDataValidation` | 年月/村校验、非负整数、实免≤应免硬校验 |

---

## 4. 接口一览

| 方法 | 路径 | 权限 |
| --- | --- | --- |
| GET | `/list` | list |
| GET | `/{id}` | query |
| POST | `/` | add |
| PUT | `/` | edit |
| DELETE | `/{ids}` | remove |
| GET | `/yearOptions` `/monthOptions` `/townOptions` `/villageTree` | list |
| POST | `/importData` | import |
| GET | `/importTemplate` | import |
| GET | `/export` | export |

---

## 5. 前端

详见同目录 **[疫苗接种数据填报前端技术方案.md](./疫苗接种数据填报前端技术方案.md)**。

- 页面：`ruoyi-ui/src/views/dataModel/vaccinationData/index.vue`
- API：`ruoyi-ui/src/api/dataModel/vaccinationData.js`
- i18n：`dataModel.vaccinationData`（zh/bo）
