# 草场管理 — 技术方案

> 依据：同目录 `草场管理功能需求.md`。草场台账 **CRUD** + **逻辑删除**；**不含**地图标点、附件上传。

---

## 1. 技术架构

| 项 | 说明 |
| --- | --- |
| **后端** | RuoYi **v3.9.2**（**springboot2** 分支）：JDK 8、Spring Boot 2.x、Spring MVC、MyBatis、Druid |
| **数据库** | MySQL **5.7.39**，InnoDB，`utf8mb4` |
| **前端** | 若依 Vue2（本方案不展开页面实现） |

**分层**：`Controller`（`@PreAuthorize`、`AjaxResult` / `TableDataInfo`）→ `Service`（`GrasslandValidation` 业务校验）→ `Mapper`/XML → `domain`。

**代码位置（建议）**：`baqing-admin` → `com.ruoyi.web.modules.industryservice`（与「牧场管理」同模块：`BizGrassland`、Mapper、Service、Controller）。

**业务摘要**

| 场景 | 行为 |
| --- | --- |
| 新增 | 校验 **§3.5**；`del_flag='0'` |
| 修改 | 全字段可改；重新校验；`update` 带 `del_flag='0'` 条件 |
| 列表/详情 | 仅 `del_flag='0'`；排序 `create_time DESC, id DESC` |
| 删除 | **逻辑删除**：`del_flag` 置 `'2'`（若依惯例） |

---

## 2. 数据库设计

### 2.1 表 `biz_grassland`（草场）

| 字段 | 类型 | 非空 | 默认值 | 说明 |
| --- | --- | --- | --- | --- |
| `id` | `bigint(20)` | Y | 自增 | 主键 |
| `grassland_name` | `varchar(32)` | Y | — | 草场名称（需求 **1～10** 字） |
| `area_mu` | `decimal(12,2)` | Y | — | 面积（**亩**），> 0 |
| `degradation_level` | `tinyint(4)` | Y | — | 退化等级 **§2.2** |
| `utilization_type` | `tinyint(4)` | Y | — | 利用类型 **§2.2** |
| `grass_yield_per_mu` | `decimal(12,2)` | Y | — | 亩产草量（**kg/亩**），> 0 |
| `utilization_rate` | `decimal(5,4)` | Y | — | 利用率 **0～1**（闭区间） |
| `grazing_ban_start_date` | `date` | Y | — | 禁牧开始日期 |
| `grazing_ban_end_date` | `date` | Y | — | 禁牧结束日期；≥ 开始日 |
| `rotation_plot_count` | `int(11)` | Y | — | 轮牧小区数量（**块**），≥ 1 |
| `rotation_grazing_days` | `int(11)` | Y | — | 小区放牧天数（**天**），≥ 1 |
| `rotation_cycle_days` | `int(11)` | Y | — | 轮牧周期（**天**），≥ 1 |
| `del_flag` | `char(1)` | Y | `'0'` | `0` 存在 `2` 删除 |
| `create_by` / `create_time` / `update_by` / `update_time` | 若依惯例 | — | — | 审计 |
| `remark` | `varchar(200)` | N | NULL | 备注（≤100 字） |

**索引**：`PRIMARY KEY (id)`；`KEY idx_grassland_name (grassland_name)`；`KEY idx_utilization_type (utilization_type)`；`KEY idx_degradation_level (degradation_level)`；`KEY idx_create_time (create_time)`；`KEY idx_del_flag (del_flag)`。

**DDL（MySQL 5.7）**

```sql
CREATE TABLE `biz_grassland` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `grassland_name` varchar(32) NOT NULL COMMENT '草场名称',
  `area_mu` decimal(12,2) NOT NULL COMMENT '面积(亩)',
  `degradation_level` tinyint(4) NOT NULL COMMENT '退化等级1-5',
  `utilization_type` tinyint(4) NOT NULL COMMENT '利用类型1禁牧2轮牧3全年放牧',
  `grass_yield_per_mu` decimal(12,2) NOT NULL COMMENT '亩产草量kg/亩',
  `utilization_rate` decimal(5,4) NOT NULL COMMENT '利用率0-1',
  `grazing_ban_start_date` date NOT NULL COMMENT '禁牧开始日期',
  `grazing_ban_end_date` date NOT NULL COMMENT '禁牧结束日期',
  `rotation_plot_count` int(11) NOT NULL COMMENT '轮牧小区数量(块)',
  `rotation_grazing_days` int(11) NOT NULL COMMENT '小区放牧天数(天)',
  `rotation_cycle_days` int(11) NOT NULL COMMENT '轮牧周期(天)',
  `del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '0存在 2删除',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(200) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `idx_grassland_name` (`grassland_name`),
  KEY `idx_utilization_type` (`utilization_type`),
  KEY `idx_degradation_level` (`degradation_level`),
  KEY `idx_create_time` (`create_time`),
  KEY `idx_del_flag` (`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='草场管理';
```

### 2.2 枚举常量

| 字段 | 值 | 含义 |
| --- | --- | --- |
| `degradation_level` | `1` | 未退化 |
| | `2` | 轻度 |
| | `3` | 中度 |
| | `4` | 重度 |
| | `5` | 极重度 |
| `utilization_type` | `1` | 禁牧 |
| | `2` | 轮牧 |
| | `3` | 全年放牧 |
| `del_flag` | `0` | 正常 |
| | `2` | 已逻辑删除 |

---

## 3. 接口设计

**统一响应**：`AjaxResult`（`code` / `msg` / `data`）或分页 `TableDataInfo`（`rows`、`total`）。

**权限标识**：`dataModel:grassland:list|query|add|edit|remove|export`

**Base Path**：`/dataModel/grassland`

| # | 说明 | Method | URI | 权限 | 要点 |
| --- | --- | --- | --- | --- | --- |
| 3.1 | 分页列表 | GET | `/dataModel/grassland/list` | `dataModel:grassland:list` | Query **3.1.1**；`del_flag='0'`；`create_time DESC, id DESC` |
| 3.2 | 详情 | GET | `/dataModel/grassland/{id}` | `dataModel:grassland:query` | 全字段；`del_flag='0'`，否则无数据 |
| 3.3 | 新增 | POST | `/dataModel/grassland` | `dataModel:grassland:add` | Body **3.3.1**；`del_flag='0'` |
| 3.4 | 修改 | PUT | `/dataModel/grassland` | `dataModel:grassland:edit` | Body 含 `id`；全量校验 |
| 3.5 | 删除 | DELETE | `/dataModel/grassland/{ids}` | `dataModel:grassland:remove` | 逻辑删除；`ids` 逗号分隔批量 |

#### 3.1.1 列表 Query

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `pageNum` / `pageSize` | int | N | 默认 `1` / `20` |
| `keyword` | string | N | 草场名称**模糊**；空不过滤 |
| `utilizationType` | int | N | `1`～`3` **精确**；空不过滤 |
| `degradationLevel` | int | N | `1`～`5` **精确**（可选扩展筛选项）；空不过滤 |

#### 3.3.1 新增 / 修改 Body（驼峰）

| 字段 | 必填 | 说明 |
| --- | --- | --- |
| `id` | 修改 Y | 主键 |
| `grasslandName` | Y | 1～10 字符 |
| `areaMu` | Y | 正数（亩） |
| `degradationLevel` | Y | `1`～`5` |
| `utilizationType` | Y | `1`～`3` |
| `grassYieldPerMu` | Y | 正数（kg/亩） |
| `utilizationRate` | Y | `0`～`1`（含端点） |
| `grazingBanStartDate` | Y | `yyyy-MM-dd` |
| `grazingBanEndDate` | Y | `yyyy-MM-dd`；≥ `grazingBanStartDate` |
| `rotationPlotCount` | Y | 正整数（块） |
| `rotationGrazingDays` | Y | 正整数（天） |
| `rotationCycleDays` | Y | 正整数（天） |
| `remark` | N | ≤100 字 |

**列表行字段（示例）**：`id`、`grasslandName`、`areaMu`、`degradationLevel`、`utilizationType`、`grassYieldPerMu`、`utilizationRate`、`grazingBanStartDate`、`grazingBanEndDate`、`rotationPlotCount`、`rotationGrazingDays`、`rotationCycleDays`、`createTime`。

**日期序列化**：JSON 使用 `yyyy-MM-dd`；与若依 `JsonFormat` / 全局 Jackson 配置一致。

### 3.4 Mapper 约定

- 列表、详情、更新：`and del_flag = '0'`。  
- 逻辑删除：`update biz_grassland set del_flag='2', update_by=?, update_time=now() where del_flag='0' and id in (...)`。  
- 删除前查询可用 `selectByIdAny`（不过滤 `del_flag`），用于审计或幂等。

### 3.5 服务端校验（摘要）

| 项 | 规则 |
| --- | --- |
| 草场名称 | 非空，1～10 字符 |
| 面积 | > 0；`decimal` 合法 |
| 退化等级 | ∈ {1, 2, 3, 4, 5} |
| 利用类型 | ∈ {1, 2, 3} |
| 亩产草量 | > 0 |
| 利用率 | 0 ≤ x ≤ 1 |
| 禁牧日期 | 起止非空；`start ≤ end` |
| 轮牧三项 | 均为 ≥ 1 的整数 |
| 备注 | 可空；有值 ≤100 字 |

校验类建议：`GrasslandRules`（枚举常量）、`GrasslandValidation`（`validateRowForSave`）。

---

## 4. 菜单与权限（示例）

| 类型 | 名称 | 权限标识 |
| --- | --- | --- |
| 菜单 | 草场管理 | `dataModel:grassland:list` |
| 按钮 | 查询 | `dataModel:grassland:query` |
| 按钮 | 新增 | `dataModel:grassland:add` |
| 按钮 | 修改 | `dataModel:grassland:edit` |
| 按钮 | 删除 | `dataModel:grassland:remove` |
| 按钮 | 导出 | `dataModel:grassland:export` |

组件路径建议：`dataModel/grassland/index`（菜单挂载在「产业数据模型及体系」下）。

---

## 5. 交付清单

- [ ] `sql/biz_grassland.sql`、菜单与按钮权限 SQL  
- [ ] `BizGrassland` Domain / Mapper / XML / Service / Controller  
- [ ] `GrasslandRules`、`GrasslandValidation`  
- [ ] 逻辑删除  
- [ ] 单元测试 / 接口测试（MockMvc）  

---

## 6. 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初稿：对齐功能需求；`biz_grassland`；逻辑删除 `del_flag`；无地图与附件接口 |
