# 牦牛存栏数据填报 — 前端技术方案

> 依据：同目录 `牦牛存栏数据填报功能需求.md`、`牦牛存栏数据填报技术方案.md`；布局对齐 `dataModel/grassland/index.vue`（双 `el-card` + 分页表格）；字段 **小驼峰**。

---

## 1. 页面与路由

| 项 | 说明 |
| --- | --- |
| **Vue 路径** | `ruoyi-ui/src/views/dataModel/yakHerdInventory/index.vue` |
| **组件名** | `YakHerdInventory` |
| **菜单配置** | 组件路径：`dataModel/yakHerdInventory/index` |
| **权限前缀** | `dataModel:yakHerdInventory:list\|query\|add\|edit\|remove\|import\|export` |

---

## 2. API 模块

| 项 | 说明 |
| --- | --- |
| **文件** | `ruoyi-ui/src/api/dataModel/yakHerdInventory.js` |
| **Base** | `/dataModel/yakHerdInventory` |

| 方法 | HTTP | 说明 |
| --- | --- | --- |
| `listYakHerdInventory` | GET | `/list` 分页列表 |
| `getYakHerdInventory` | GET | `/{id}` 详情 |
| `addYakHerdInventory` | POST | `/` 新增 |
| `updateYakHerdInventory` | PUT | `/` 修改 |
| `delYakHerdInventory` | DELETE | `/{ids}` 删除 |
| `listYakHerdInventoryYearOptions` | GET | `/yearOptions` |
| `listYakHerdInventoryMonthOptions` | GET | `/monthOptions` |
| `listYakHerdInventoryTownOptions` | GET | `/townOptions` |
| `listYakHerdInventoryVillageTree` | GET | `/villageTree` 县→乡镇→村 |
| `importYakHerdInventory` | POST | `/importData`（`file` + `statYear` + `statMonth`） |
| `exportYakHerdInventory` | GET | `/export`（`statYear` + `statMonth`，`blob`） |

模板下载：`downloadYakHerdInventoryTemplate()`（**GET** + `blob`），勿用若依全局 `this.download()`（固定 POST）。

---

## 3. 页面结构

1. **筛选区**：所属年份、所属月份、所属乡镇、所属村（Treeselect）；搜索、重置、新增、导入、导出。  
2. **列表区**：所属年份、所属月份、所属乡镇、所属村、村居数、牧户数、存栏数、公牛/母牛存栏数；空值展示 `—`。  
3. **操作列**：查看、修改、删除。  
4. **新增/编辑弹窗**：年份、月份、所属村（必填）；明细录入字段（`INPUT_COUNT_FIELDS`）；**不展示**派生合计；新增默认当前年月。  
5. **查看弹窗**：全字段只读（含派生合计、审计信息）。  
6. **导入弹窗**：选填报年月（默认当前）→ 上传 `.xlsx` → 展示 insert/fail/warn。  
7. **导出弹窗**：选所属年月（默认当前）、可选所属乡镇（与列表一致，可清空；不选则全部乡镇）→ 下载 `{年}年{月}月牦牛存栏数据.xlsx`。

---

## 4. 业务规则（前端）

| 规则 | 实现 |
| --- | --- |
| 年份 / 月份 | `/yearOptions`、`/monthOptions`；展示 `{month}月` |
| 村树 | `/villageTree`；`vue-treeselect`：`disable-branch-nodes`、`append-to-body` |
| 列表筛选 | `statYear`、`statMonth`、`townDeptId`、`villageDeptId`；进入页不默认年月 |
| 提交体 | 传 `villageDeptId` 与明细；不传乡镇（后端反推） |
| 派生字段 | 仅详情 `DERIVED_COUNT_FIELDS` 展示 |
| 唯一性 | 同年同月同村重复由后端拦截 |
| 导入 | `FormData` 含年月；成功后 `$alert` 摘要 |
| 删除 | `$modal.confirm` 后删除 |

**录入字段**（`INPUT_COUNT_FIELDS`）：`villageCount`、`herdsmanHouseholdCount`、`breedingBullCount`、`bullCastratedCount`、`cowYoungCount`、`cowAdultCount`、`milkingCowCount`、`fertileCowCount`、`sheepTotal`、`milkingSheepCount`、`insuredYakCount`。

**派生字段**（`DERIVED_COUNT_FIELDS`）：`bullTotal`、`cowTotal`、`dairyTotal`、`yakTotal`、`grandTotal`、`yakSheepTotal`。

---

## 5. 国际化

| 项 | 说明 |
| --- | --- |
| **语言包** | `dataModel.yakHerdInventory`、`dataModel.common` |
| **文件** | `lang/zh/dataModel.js`、`lang/bo/dataModel.js` |
| **Mixin** | `dataModelLocaleMixin`，`dmNs = 'yakHerdInventory'` |

---

## 6. 联调说明

1. 部署后端并执行 `sql/biz_yak_herd_inventory.sql`（或村唯一键迁移脚本）。  
2. 菜单组件 `dataModel/yakHerdInventory/index`。  
3. 验证：村树选村、CRUD、导入全量覆盖、导出合计行、详情含派生字段、双语。  

---

## 7. 文件清单

| 类型 | 路径 |
| --- | --- |
| 页面 | `ruoyi-ui/src/views/dataModel/yakHerdInventory/index.vue` |
| API | `ruoyi-ui/src/api/dataModel/yakHerdInventory.js` |
| Mixin | `ruoyi-ui/src/mixins/dataModelLocaleMixin.js` |
| i18n | `ruoyi-ui/src/lang/zh/dataModel.js`、`lang/bo/dataModel.js` |

---

## 8. 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：列表/CRUD/详情/导入；汉藏 i18n |
| 1.1 | 按年月填报：列表月份筛选；导入/导出 |
| 1.2 | 按村填报：Treeselect 村树；列表乡镇+村；表单仅明细；详情含派生合计；字段对齐新模板 |
