# 家庭牧场数据填报 — 测试用例

> **接口 Base Path**：`/dataModel/familyRanch`  
> **建表**：执行 `sql/biz_family_ranch.sql`  
> **模板**：`family_ranch_import_template.xlsx`

| 编号 | 场景 | 期望 |
| --- | --- | --- |
| UT-001 | 解析运行模板样例 | 2 行；企业名/乡镇村/成立日期（序列号→日期）正确 |
| UT-002 | 派生计算 | 存栏小计、草场面积、利润、是否草畜平衡正确 |
| API-001 | 新增 | 选村+企业名+年月成功；乡镇回填 |
| API-002 | 唯一键 | 同年同月同村同企业名再增失败 |
| API-003 | 导入 upsert | 已有更新、新建插入；不删同月其他记录 |
| API-004 | 导入失败 | 乡镇/村无法识别 → 整批不写 |
| API-005 | 导出 | 选年月导出；可选乡镇；无合计行；填表人为当前用户 |
| API-005a | 列表已选乡镇后导出 | 导出弹窗所属乡镇与列表一致；传 `townDeptId` 仅该乡镇 |
| API-005b | 导出弹窗清空乡镇 | 不传 `townDeptId`，导出全部乡镇 |
| API-006 | 草畜失衡 | 载畜量&lt;存栏绵羊单位 → `biz_yak_disease_warning` 有 `warning_type=6` 记录；改平衡后该预警消失 |
| UI-001 | 列表筛选 | 年/月/乡镇/企业名 |
| UI-002 | 表单村级联 | 只选村；新增默认本年本月 |
| UI-003 | 列表选某乡镇后打开导出 | 标签/占位/选项与列表相同，且已选中该乡镇 |

对应单测：`FamilyRanchExcelParserTest`
