# 牦牛出栏数据填报 — 技术方案

> 依据：同目录功能需求；模板 `baqing-admin/src/main/resources/templates/yak_outbound_report_import_template.xlsx`。

## 1. 架构

Controller `/dataModel/yakOutboundReport` → Service → Mapper；Excel：`YakOutboundReportExcelParser` / `YakOutboundReportExcelExporter`；校验：`YakOutboundReportValidation`（村反推乡镇）。

## 2. 表 `biz_yak_outbound_report`

唯一键 `uk_year_month_village (stat_year, stat_month, village_dept_id)`；含 `town_*`、`village_*` 及出栏/自食明细字段。DDL：`sql/biz_yak_outbound_report.sql`（`DROP` 全量重建）。

## 3. 接口

| URI | 说明 |
| --- | --- |
| CRUD `/list` `/{id}` POST/PUT/DELETE | 同常规 |
| `/villageTree` | 县→乡镇→村 |
| `/importData` | 年月全量覆盖 |
| `/export` | 按年月导出已填报村数据 |

### Excel 列（0-based）

| 列 | 字段 |
| --- | --- |
| 1～2 | 乡镇、村 |
| 3～4 | 户数、人数 |
| 5～10 | 六类出栏 |
| 11 | 出栏合计（导出算） |
| 12～14 | 自食牛/绵羊/山羊 |
| 15 | 自食合计（导出算） |

数据起始行：`headerRow + 1`（表头为含「乡镇」「村」「户数」「牦牛」的行）。

## 4. 导入 / 导出

- 导入：校验全部成功 → `deleteByYearMonth` → 批量 insert。  
- 导出：写村行 + 行内小计；合计行合并 0～2 列；自户数起求和；标题年/月与填表人/填表时间更新。

## 5. 大屏

地图乡镇标注对 `biz_yak_outbound_report` / `biz_yak_herd_inventory` 按 `town_dept_id` **聚合 sum** 后再关联。

## 8. 修订记录

| 版本 | 说明 |
| --- | --- |
| 2.0 | 村粒度全量覆盖；列映射对齐交接模板；大屏按乡镇聚合 |
