# 养殖产业数据 — 功能需求

## 1. 文档说明

| 项 | 说明 |
| --- | --- |
| 模块名称 | 养殖产业数据 |
| 目标 | 以**看板**形式集中展示县域（或授权范围内）牦牛养殖与草场资源的关键指标与结构，支撑产业监管、决策研判与日常巡查 |
| 关联系统 | 业务后台（单页看板，只读展示） |
| 修订依据 | 同目录 `养殖产业数据功能需求-草稿.md`、界面原型（`Snipaste_2026-05-19_12-33-09.jpg`） |

本文档仅描述**功能需求与业务规则**，不涉及库表结构、接口路径、请求参数字段命名、技术栈选型及实现方案。

---

## 2. 术语与统计口径

### 2.1 看板与数据性质

- 本模块为**只读数据看板**：不提供指标手工录入、修改、删除；所有数值由关联业务模块台账或同步数据**汇总计算**后展示。  
- 页面自上而下分为四个功能区：**产业总览**、**牦牛存栏变动**、**牦牛年龄结构**、**草场类型占比**（与原型布局一致）。  
- 指标**非最终版**：草稿说明产业数据可能随第三方对接扩展；新增指标须修订本文档并更新原型。

### 2.2 统计范围与时间

| 项 | 约定 |
| --- | --- |
| **空间范围** | 见 **§2.9 数据权限与纳入范围** |
| **「当前」时点** | 用户打开或刷新看板时的系统日期（记为 **统计日**）；各「当前存栏」类指标按统计日计算 |
| **趋势图月份** | 横轴为当前自然年 **1 月～12 月**；**未到来的月份不展示数据点**（折线止于当前月） |
| **自然年** | 公历当年 1 月 1 日 0:00～12 月 31 日 23:59:59 |

看板进入时**自动加载**最新统计结果；须提供**刷新**操作重新计算（见 **§5.1**）。页面**不**自动定时刷新（**§8** 扩展项除外）。

### 2.3 牦牛「存栏」认定

用于存栏总量、性别结构、年龄结构、存栏趋势等。

| 规则 | 说明 |
| --- | --- |
| 纳入存栏 | 「牦牛资产档案」中档案有效（未逻辑删除），且**资产状态**为 **正常** 的个体 |
| 不纳入存栏 | 资产状态为 **死淘**、**丢失**、**出栏** 的个体 |
| 性别 | 以档案「性别」为准，分为 **公**、**母**；性别为空或无法映射为公/母的个体**不计入**公、母分项，**计入**存栏总量 |
| 月龄 | 优先按档案「月龄」字段；缺失时由「出生日期」与统计日计算**整月龄**（不足 1 月记为 0 月龄） |

### 2.4 牦牛年出栏量

| 规则 | 说明 |
| --- | --- |
| 统计周期 | **当前自然年** 1 月 1 日 0:00 至统计日 24:00 |
| 计数对象 | 资产状态为 **出栏**，且 **状态变更日期** 落在上述周期内的档案（按**头**计，一头一条档案计 1） |
| 去重 | 同一牦牛编号仅计 1 次 |
| 缺失变更日期 | **状态变更日期为空**的出栏档案**不计入**年出栏量（计入数据质量风险，由档案同步维护解决） |

### 2.5 预警牦牛数量

与「牦牛疾病预警」模块对齐，本看板**只展示结果**，不维护预警。

| 规则 | 说明 |
| --- | --- |
| 统计周期 | **当前自然年** 1 月 1 日 0:00 至 **统计日** 23:59:59（与「牦牛疾病预警」**§5.6** 一致） |
| 计数方式 | 周期内存在**至少 1 条**未逻辑删除预警记录的 **去重牦牛编号** 头数 |
| 处置状态 | 本期无预警处置闭环，**不区分**是否已读/已处理，凡在周期内且未删除的预警均参与去重计数 |

### 2.6 牧场与草场（总览用）

| 指标 | 规则（默认） |
| --- | --- |
| 牧场数量 | 「牧场管理」中未逻辑删除，且**经营状态**为 **正常** 的主体条数，单位 **个** |
| 草场数量 | 「草场管理」中未逻辑删除的草场条数，单位 **个** |
| 草场面积 | 上述有效草场的**面积**字段之和，单位 **亩**；面积为空的不计入求和 |

### 2.7 草场「可用」与「使用中」

用于 **§5.5** 草场类型占比区上部数量展示。

| 分类 | 含义（默认） |
| --- | --- |
| **可用草场** | 未逻辑删除的草场中，**退化等级**为 **未退化** 或 **轻度** 的条数（视为具备利用或改良潜力的资源） |
| **使用中草场** | 未逻辑删除的草场中，**利用类型**为 **全年放牧** 或 **轮牧** 的条数；若利用类型为 **禁牧**，仅当**当前日期不在**该条记录填写的禁牧开始～结束日期闭区间内时，计入「使用中」，否则不计入 |

**逻辑关系**：「使用中」为「可用」资源的子集场景之一；**可用 + 使用中** 不宜简单相加为总量（二者有交叉）。界面分别展示两个数字即可（与原型一致）。  
**退化等级**取值与「草场管理」**§2.1** 一致：未退化、轻度、中度、重度、极重度。

### 2.8 草场退化结构占比

对**未逻辑删除**的全部草场，按**退化等级**分组：

- 统计各等级的**条数**；  
- 计算各等级条数占草场总条数的**百分比**（保留 1 位小数或整数百分比，与界面一致）；  
- 五类等级均需展示；某等级为 0 时显示 0 及 0%。

### 2.9 数据权限与纳入范围

| 对象 | 纳入规则 |
| --- | --- |
| **牧场** | 未逻辑删除，且经营状态为 **正常**；且落在当前用户**可见牧场**集合内（与项目全局数据权限一致） |
| **牦牛** | 未逻辑删除；档案 **pasture_id** 非空且对应牧场在用户可见牧场集合内；**pasture_id 为空**的档案**不参与**看板任何牦牛类统计 |
| **草场** | 未逻辑删除；本期按用户**全县（或授权区域）草场台账**统计，**不按**牧场拆分校准（与草场管理台账一致） |
| **预警** | 仅统计牦牛编号落在上述「纳入统计的牦牛」集合内的预警记录 |

县级管理员可见全部主体时，等价于全量有效台账统计。

### 2.10 历史月末存栏还原（趋势图）

折线图各月数值须在**该月最后一日**还原「当日应计入存栏」的个体数（应用 **§2.3** 的存栏语义，按**时点**而非仅看当前状态）。

记 **月末日** 为自然月最后一天。**非正常资产状态**指：死淘（2）、丢失（3）、出栏（4）。

在 **月末日** 时点，档案**计入**当月存栏，当且仅当同时满足：

1. 档案未逻辑删除，且符合 **§2.9** 纳入范围；  
2. **不**满足：当前 `asset_status` 为非正常状态 **且** `status_change_date` 不为空 **且** `status_change_date` ≤ 月末日（表示该日或之前已变为死淘/丢失/出栏）；  
3. `asset_status` 为 **正常（1）**，或虽当前为非正常但 `status_change_date` **晚于** 月末日（月末时尚未发生该次状态变更）；  
4. `asset_status` 无法识别时，**不计入**。

**当前月**折线点：月末日尚未结束时，以 **统计日** 代替月末日执行上式。  

**状态变更日期为空**且当前为非正常状态：该个体在**所有历史月末**均**不计入**存栏趋势。

---

## 3. 功能范围

**本期实现：**

| 能力 | 说明 |
| --- | --- |
| 产业总览 | 六项指标卡片展示，见 **§5.2** |
| 牦牛存栏变动 | 当前公、母牛数量 + 按月存栏趋势图，见 **§5.3** |
| 牦牛年龄结构 | 三档月龄占比图，见 **§5.4** |
| 草场类型占比 | 可用/使用中数量 + 退化等级数量与占比，见 **§5.5** |
| 刷新 | 重新拉取并计算全页指标，见 **§5.1** |

**本期不实现：**

- 看板内指标的手工维护、阈值配置、报表导出、打印  
- 点击指标跳转明细列表（若需下钻，另立需求）  
- 按牧场、区域、自定义时间段的筛选（见 **§8**）  
- 与第三方平台的独立同步入口（数据由各业务模块维护/同步后汇总）  
- 移动端独立看板（若需，另立需求）  

---

## 4. 业务流程

### 4.1 数据汇聚关系

```mermaid
flowchart TB
    subgraph sources [数据来源模块]
        A[牧场管理]
        G[草场管理]
        Y[牦牛资产档案管理]
        W[牦牛疾病预警]
    end
    subgraph board [养殖产业数据看板]
        O[产业总览]
        I[牦牛存栏变动]
        Age[牦牛年龄结构]
        Grass[草场类型占比]
    end
    A --> O
    G --> O
    G --> Grass
    Y --> O
    Y --> I
    Y --> Age
    W --> O
```

各业务模块按各自需求维护台账或同步数据；本看板**不写入**业务库，仅读取汇总。

### 4.2 用户使用路径

```mermaid
flowchart LR
    Enter[进入菜单] --> Load[自动加载全页指标]
    Load --> View[浏览四个功能区]
    View --> Refresh{需要最新数据?}
    Refresh -->|是| Reload[点击刷新]
    Reload --> View
    Refresh -->|否| Exit[离开页面]
    View --> Exit
```

1. 授权用户从菜单进入「养殖产业数据」。  
2. 系统按 **§2** 口径计算并展示四块内容；加载中显示统一加载态。  
3. 用户阅读总览卡片与图表；必要时点击**刷新**更新。  
4. 离开页面不保留编辑状态（无表单）。

---

## 5. 详细功能需求

### 5.1 页面通用规则

| 项 | 要求 |
| --- | --- |
| 布局 | 单页纵向滚动；四块标题与原型一致：产业总览、牦牛存栏变动、牦牛年龄结构、草场类型占比 |
| 加载 | 首次进入全页加载；失败时给出明确提示，**不得**展示上一用户缓存数据冒充成功 |
| 刷新 | 页面提供「刷新」按钮（位置与全局规范一致，如右上角工具栏）；刷新中防重复点击；成功后更新全部指标与图表 |
| 空数据 | 某模块无数据时，数字显示 **0** 或「—」，图表展示空态说明，不报错崩溃 |
| 单位 | 界面须标注单位：头、个、亩、% 等，与 **§5.2～§5.5** 一致 |
| 权限 | 仅**查询/查看**权限；无新增、编辑、删除操作 |

### 5.2 产业总览

以**指标卡片**形式横向排列六项（与原型一致），每项包含指标名称、数值、单位（名称旁或数值旁标注）。

| 序号 | 指标名称 | 单位 | 统计口径 |
| --- | --- | --- | --- |
| 1 | 牦牛存栏总量 | 头 | **§2.3** 当前存栏头数 |
| 2 | 牦牛年出栏量 | 头 | **§2.4** |
| 3 | 预警牦牛数量 | 头 | **§2.5** |
| 4 | 牧场数量 | 个 | **§2.6** |
| 5 | 草场数量 | 个 | **§2.6** |
| 6 | 草场面积 | 亩 | **§2.6** |

**展示规则：**

- 数值为非负整数（面积可为小数，保留位数与「草场管理」录入一致，默认最多 2 位小数）。  
- 卡片仅展示，**本期**不提供点击跳转。  
- 六项宜在同一屏首屏可见或略经滚动可见（以实现为准）。

### 5.3 牦牛存栏变动

#### 5.3.1 当前性别结构（数字）

在趋势图上方或侧栏展示两个指标（与原型一致）：

| 指标 | 单位 | 口径 |
| --- | --- | --- |
| 公牛数量 | 头 | 当前存栏中性别为「公」的头数 |
| 母牛数量 | 头 | 当前存栏中性别为「母」的头数 |

**数量关系：** 公牛数量 + 母牛数量 + 未标注性别数量 = 牦牛存栏总量（**§5.2** 第 1 项）。当未标注性别数量 > 0 时，在公、母牛数量旁展示 **「未标注性别：N 头」**（N 为整数）。

#### 5.3.2 存栏趋势（折线图）

| 项 | 要求 |
| --- | --- |
| 图表类型 | 折线图 |
| 横轴 | 当前自然年 1 月～12 月（标签：1月…12月） |
| 纵轴 | 存栏数量，单位 **头** |
| 序列 | **存栏总量**一条折线 |
| 各月数值 | 按 **§2.10** 计算；仅绘制 **1 月～当前月** 有定义的月份点，**未来月份不绘制** |
| 当前月 | 以 **统计日** 作为时点代入 **§2.10**（代替月末日） |
| 图例 | 「存栏数量」（或与原型一致） |

**与总览联动：** 当前月折线点宜与 **§5.2**「牦牛存栏总量」一致（同一统计日、同一纳入范围）；已结束月份各点可小于或等于总览值。

### 5.4 牦牛年龄结构

| 项 | 要求 |
| --- | --- |
| 图表类型 | 饼图（或环形图，与原型一致） |
| 统计对象 | **§2.3** 当前存栏个体 |
| 分档 | 三档，互斥且穷尽（月龄按 **§2.3**）： |

| 档位 | 月龄区间 |
| --- | --- |
| 1-6月龄 | 0 ≤ 月龄 ≤ 6 |
| 7-12月龄 | 7 ≤ 月龄 ≤ 12（**含**整 12 月龄） |
| 12月龄以上 | 月龄 ≥ 13 |

| 展示 | 每档展示**占比（%）**；图例或标签含档位名称与百分比；各档占比之和为 **100%**（四舍五入导致 ±1% 须在界面容忍） |
| 数量为 0 | 该档占比 0%，饼图仍保留图例项 |

### 5.5 草场类型占比

本区上下两部分（与原型一致）。

#### 5.5.1 利用状态数量

| 指标 | 单位 | 口径 |
| --- | --- | --- |
| 可用草场 | 个 | **§2.7** |
| 使用中草场 | 个 | **§2.7** |

#### 5.5.2 退化等级分布

| 项 | 要求 |
| --- | --- |
| 图表 | 环形图 + 列表（或表格）并列展示，与原型一致 |
| 维度 | 未退化、轻度、中度、重度、极重度 |
| 列表列 | 至少包含：**退化等级名称**、**数量（个）**、**占比（%）** |
| 占比 | **§2.8**；列表与图表数据一致 |
| 合计 | 五档数量之和 = **§5.2** 草场数量（在统计范围一致的前提下） |

---

## 6. 与其他模块的关系

| 模块 | 关系 |
| --- | --- |
| 牧场管理 | 提供牧场数量；经营状态、逻辑删除规则影响是否计入 |
| 草场管理 | 提供草场数量、面积、退化等级、利用类型、禁牧日期；驱动可用/使用中及退化占比 |
| 牦牛资产档案管理 | 提供存栏、性别、月龄、出栏量；资产状态与变更日期为核心字段 |
| 牦牛疾病预警 | 提供预警牦牛数量；周期与去重规则见 **§2.5**、该模块 **§5.6** |
| 草畜平衡计算 | 本期看板**不展示**平衡指数；若后续纳入须修订本文档 |

**依赖顺序（业务理解）：** 看板数据正确性依赖各台账模块数据完整；档案未同步、草场未录入会导致对应指标偏低或为 0，界面**不**区分「真零」与「未录入」，必要时在 **§7** 用加载失败或运维提示说明。

---

## 7. 权限与提示

### 7.1 权限

| 操作 | 要求 |
| --- | --- |
| 查看看板 | 具备本模块菜单及查询权限 |
| 刷新 | 与查看一致，或单独「刷新」权限（默认与查看合并） |
| 维护业务数据 | 在各自业务模块进行，本模块无维护入口 |

数据权限规则见 **§2.9**；过滤后各指标仅统计纳入范围内的牧场、牦牛、草场与预警。

### 7.2 提示场景

采用项目统一提示方式，**不约定**技术字段形态。

| 场景 | 提示方向（示例） |
| --- | --- |
| 加载成功 | 无打扰式展示数据；可选轻提示「数据已更新」 |
| 加载失败 | 加载失败，请稍后重试 |
| 刷新中 | 正在刷新… |
| 无权限 | 无权限访问 |
| 部分模块无数据 | 不单独弹窗；对应区域空态或 0 |

---

## 8. 非功能需求（建议）

| 类别 | 建议 |
| --- | --- |
| 性能 | 全页汇总宜在可接受时间内完成（如 ≤5 秒，视数据量评审）；大数据量时可分批渲染四块 |
| 一致性 | 刷新后四块数据同一统计时点 |
| 扩展 | 支持按牧场、乡镇、自定义年份筛选；支持导出 PNG/PDF |
| 下钻 | 点击「预警牦牛数量」跳转预警列表并带筛选条件 |
| 历史趋势 | 支持选择历年对比存栏曲线 |
| 双语 | 界面 i18n（汉语 + 藏文） |

---

## 9. 相对草稿的修订说明

| 草稿问题 | 处理 |
| --- | --- |
| 缺页面结构、刷新与加载 | **§5.1**、**§4.2** |
| 指标无统计口径 | **§2** 分节定义；**§5.2～§5.5** 引用 |
| 存栏趋势「按月」未说明横轴与序列 | **§5.3.2**、**§2.10** 月末还原与仅画至当前月 |
| 年龄分档边界 | **§5.4**（12 月龄归入 7～12 档） |
| 草场可用/使用中含义模糊 | **§2.7** 与草场管理字段挂钩 |
| 退化占比分母 | **§2.8** 有效草场总条数 |
| 技术栈、code/msg/data | 已移除 |
| 未写数据来源 | **§4.1**、**§6** |
| 预警/出栏/性别等待定口径 | **§2.4～§2.5**、**§2.9**、**§5.3.1** 已固化为唯一约定 |

---

## 10. 需求追溯

| 能力 | 章节 |
| --- | --- |
| 产业总览六项 | §5.2、§2.3～§2.6 |
| 公母牛数量 + 月趋势 | §5.3 |
| 年龄三档占比 | §5.4 |
| 草场可用/使用中 + 退化占比 | §5.5、§2.7、§2.8 |
| 只读看板 | §3、§5.1 |
| 模块依赖 | §4.1、§6 |
| 数据权限 | §2.9 |
| 月趋势还原 | §2.10 |
