# 疫苗接种数据填报 — 功能需求

## 1. 文档说明

| 项 | 说明 |
| --- | --- |
| 模块名称 | 疫苗接种数据填报 |
| 目标 | 按**村 × 所属年月**填报应免数、实免数；导入 upsert；导出按模板填充 |
| 关联系统 | 业务后台；`sys_dept`（乡镇、村） |
| 修订依据 | 交接表 `疫苗接种数据填报.xlsx`；运行模板 `vaccination_data_import_template.xlsx` |

---

## 2. 填报粒度

- 一条记录：某一自然年、某一自然月、某一行政村的疫苗接种汇总。
- 保存时由所选村反推所属乡镇。
- 唯一键：所属年份 + 所属月份 + 所属村。
- 导入：存在则更新、不存在则插入（不按年月先删后插）。
- 派生（保存时计算并落库）：**免疫率 = (实免数 / 应免数) × 100**，保留 2 位小数（应免数 &gt; 0 且实免数非空；如 98.33；界面/导出展示为 `98.33%`）。

- **约束：实免数 ≤ 应免数**（两者均填写时；保存与导入均硬拦截，不允许超过）。

---

## 3. 功能范围

| 能力 | 说明 |
| --- | --- |
| 分页列表 | 筛选：年、月、乡镇、村；列：年、月、乡镇、村、应免数、实免数、免疫率 |
| 新增 / 修改 | 选村；新增默认本年本月；免疫率只读预览 |
| 详情 | 全部字段含免疫率 |
| 删除 | 物理删除 |
| Excel 导入 | 表头约 1～4 行；另选年月；免疫率列导入跳过；按唯一键 upsert |
| Excel 导出 | 另选年月；乡镇可选（不选则全部）；填表人=登录用户；无合计行 |

---

## 4. 权限

`dataModel:vaccinationData:list|query|add|edit|remove|import|export`

菜单组件路径：`dataModel/vaccinationData/index`

---

## 5. 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 首版：CRUD + upsert 导入 + 导出 |
| 1.1 | 免疫率改为 (实免数/应免数)×100，保留 2 位小数落库 |
<<<<<<< HEAD
| 1.2 | 页面填报约束实免数 ≤ 应免数（前端校验） |
=======
| 1.2 | 约束：实免数 ≤ 应免数（硬校验） |
>>>>>>> ef65fad8763e393adf8cf1e918e4eec407e1b967
