# 养殖大户数据填报 — 技术方案

## 1. 接口

Base Path：`/dataModel/largeLivestockFarmer`

| 方法 | 路径 | 权限 |
| --- | --- | --- |
| 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?statYear=&statMonth=&townDeptId=` | export |

## 2. 表结构

见 `sql/biz_large_livestock_farmer.sql`：

- `biz_large_livestock_farmer`：业务主表；唯一键 `(stat_year, stat_month, village_dept_id, enterprise_name)`
- 草畜失衡预警：**独立表** `biz_grass_livestock_imbalance_warning`
  - `data_source = large_livestock_farmer`，`source_key = LLF-{id}`
  - `data_source = large_livestock_farmer`
  - `device_no = LLF-{ranchId}`（定位/去重）
  - `pasture_name` = 企业名称；`measured_value` = 存栏绵羊单位；`reference_range` = 核定载畜量
  - 失衡 upsert；平衡或删除牧场记录时按 `data_source + device_no` 删除

## 3. Excel

| 项 | 说明 |
| --- | --- |
| 模板 | `templates/large_livestock_farmer_import_template.xlsx` |
| 表头识别 | 含「乡镇名称」「村居名称」；`HEADER_SPAN=3` |
| 列序 | 乡镇在前、村在后；企业名称第 4 列（0-based index 3） |
| 导入跳过 | 存栏小计、草场面积小计、是否草畜平衡、利润（由系统计算后导出回写） |
| 导出 | 无合计行；填表人替换模板「登录用户名称」 |

## 4. 前端

- 页面：`ruoyi-ui/src/views/dataModel/largeLivestockFarmer/index.vue`
- API：`ruoyi-ui/src/api/dataModel/largeLivestockFarmer.js`
- 菜单组件：`dataModel/largeLivestockFarmer/index`
- i18n：`dataModel.largeLivestockFarmer`（详见同目录《养殖大户数据填报前端技术方案》）
- 村选择：可搜索下拉（县→乡镇→村树展平），仅选叶子村
- **导出弹窗所属乡镇**：
  - 与列表共用 `townOptions`、文案「所属乡镇」、占位「请选择」
  - 打开导出时带入列表当前 `queryParams.townDeptId`；清空则不传 `townDeptId`（导出全部乡镇）
  - 请求：`GET /export?statYear=&statMonth=&townDeptId=`（`townDeptId` 可选）

## 5. 主要类

`BizLargeLivestockFarmer*`、`LargeLivestockFarmerExcelParser/Exporter/Validation/DerivedSupport`
