# 检疫站管理 — 技术方案

> 依据：同目录 `检疫站管理功能需求.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；照片上传复用 `POST /common/upload`（本方案不展开页面） |

**分层**：`Controller` → `Service`（`QuarantineStationValidation`、删旧照片）→ `Mapper`/XML → `domain`。

**代码包（建议）**：`com.ruoyi.web.modules.livestock`

**业务摘要**

| 场景 | 行为 |
| --- | --- |
| 新增 | 校验必填；`operate_status` 缺省 `1`（正常）；`del_flag=0` |
| 修改 | 全字段可改；换照片删旧 `photo_file_path` |
| 列表/详情 | 仅 `del_flag=0`；排序 `create_time DESC, id DESC` |
| 列表筛选 | `station_name` 模糊；`operate_status` 精确 |
| 删除 | `del_flag=2`；删照片文件；有关联时 `ServiceException` |

---

## 2. 数据库设计

### 2.1 表 `biz_quarantine_station`（检疫站）

| 字段 | 类型 | 非空 | 默认值 | 说明 |
| --- | --- | --- | --- | --- |
| `id` | `bigint(20)` | Y | 自增 | 主键 |
| `station_name` | `varchar(32)` | Y | — | 检疫站名称（**1～10** 字） |
| `detail_address` | `varchar(200)` | Y | — | 详细地址（**1～200** 字） |
| `person_in_charge` | `varchar(32)` | Y | — | 负责人（**1～10** 字） |
| `contact_phone` | `varchar(20)` | Y | — | 联系方式（手机号） |
| `operate_status` | `tinyint(4)` | Y | `1` | `1` 正常 `2` 停业 `3` 注销 |
| `photo_file_url` | `varchar(512)` | N | NULL | 照片访问 URL |
| `photo_file_path` | `varchar(512)` | N | NULL | 照片存储路径（`/profile/...`） |
| `del_flag` | `char(1)` | Y | `'0'` | `0` 存在 `2` 删除 |
| `create_by` / `create_time` / `update_by` / `update_time` | 若依惯例 | — | — | 审计 |

**索引**：`PRIMARY KEY (id)`；`KEY idx_station_name (station_name)`；`KEY idx_operate_status (operate_status)`；`KEY idx_create_time (create_time)`；`KEY idx_del_flag (del_flag)`。

> **名称唯一**：`station_name` 在 `del_flag=0` 范围内由 Service 校验唯一（不设库级唯一索引，避免逻辑删除后无法复用名称；若产品要求物理唯一可另议）。

### 2.2 DDL（MySQL 5.7）

```sql
CREATE TABLE `biz_quarantine_station` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `station_name` varchar(32) NOT NULL COMMENT '检疫站名称',
  `detail_address` varchar(200) NOT NULL COMMENT '详细地址',
  `person_in_charge` varchar(32) NOT NULL COMMENT '负责人',
  `contact_phone` varchar(20) NOT NULL COMMENT '联系方式',
  `operate_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '1正常 2停业 3注销',
  `photo_file_url` varchar(512) DEFAULT NULL COMMENT '照片URL',
  `photo_file_path` varchar(512) DEFAULT 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 '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_station_name` (`station_name`),
  KEY `idx_operate_status` (`operate_status`),
  KEY `idx_create_time` (`create_time`),
  KEY `idx_del_flag` (`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='检疫站';
```

### 2.3 枚举

**运营状态 `operate_status`**

| 值 | 标签 |
| --- | --- |
| 1 | 正常 |
| 2 | 停业 |
| 3 | 注销 |

**删除标记 `del_flag`**

| 值 | 含义 |
| --- | --- |
| 0 | 正常 |
| 2 | 已逻辑删除 |

---

## 3. 接口设计

**统一响应**：`AjaxResult` / `TableDataInfo`。

**权限标识**：`livestock:quarantineStation:list|query|add|edit|remove`

**Base Path**：`/livestock/quarantineStation`

| # | 说明 | Method | URI | 权限 |
| --- | --- | --- | --- | --- |
| 3.1 | 分页列表 | GET | `/livestock/quarantineStation/list` | `list` |
| 3.2 | 详情 | GET | `/livestock/quarantineStation/{id}` | `query` |
| 3.3 | 新增 | POST | `/livestock/quarantineStation` | `add` |
| 3.4 | 修改 | PUT | `/livestock/quarantineStation` | `edit` |
| 3.5 | 删除 | DELETE | `/livestock/quarantineStation/{ids}` | `remove` |

#### 3.1.1 列表 Query

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `pageNum` / `pageSize` | int | N | 默认 `1` / `20` |
| `stationName` | string | N | 名称**模糊**：`station_name LIKE %value%` |
| `operateStatus` | int | N | **精确**：`1` / `2` / `3` |

**列表行扩展（驼峰）**：`operateStatusName`（字典或 Service 填充）。

**排序**：`create_time DESC, id DESC`。

#### 3.2.1 详情 `data`

`id`、`stationName`、`detailAddress`、`personInCharge`、`contactPhone`、`operateStatus`、`operateStatusName`、`photoFileUrl`、`photoFilePath`、审计字段。

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

| 字段 | 新增 | 修改 | 说明 |
| --- | --- | --- | --- |
| `id` | — | Y | 主键 |
| `stationName` | Y | Y | 1～10 字，trim |
| `detailAddress` | Y | Y | 1～200 字 |
| `personInCharge` | Y | Y | 1～10 字 |
| `contactPhone` | Y | Y | 大陆手机号 |
| `operateStatus` | Y | Y | `1` / `2` / `3`；新增缺省 `1` |
| `photoFileUrl` / `photoFilePath` | N | N | 成对；可空表示无图 |

#### 3.4 照片约定

1. 前端先调 `POST /common/upload`，将返回的 `url`、`fileName` 写入 `photoFileUrl`、`photoFilePath`。  
2. 修改替换或逻辑删除时，Service 删除旧 `photo_file_path` 物理文件（路径校验与项目一致）。

#### 3.5 服务端校验（`QuarantineStationValidation`）

| 项 | 规则 |
| --- | --- |
| 名称 | trim 后 1～10 字；未删除记录内**名称唯一** |
| 详细地址 | trim 后 1～200 字 |
| 负责人 | trim 后 1～10 字 |
| 手机 | 项目统一手机号规则 |
| 运营状态 | ∈ {1, 2, 3} |
| 照片 | 可空；后缀 `jpg`/`jpeg`/`png`；≤10MB；url/path 成对 |
| 删除 | 未删；`QuarantineStationReferenceChecker.hasReference(id)` 为 false（本期可占位 `false`） |

#### 3.6 Mapper 约定

- 条件均带 `del_flag='0'`。  
- 模糊：`AND station_name LIKE CONCAT('%', #{stationName}, '%')`  
- 精确：`AND operate_status = #{operateStatus}`（非空时）  
- 逻辑删除：`UPDATE … SET del_flag='2' WHERE id=? AND del_flag='0'`。

---

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

| 类型 | 名称 | 权限标识 |
| --- | --- | --- |
| 菜单 | 检疫站管理 | `livestock:quarantineStation:list` |
| 按钮 | 查询 | `livestock:quarantineStation:query` |
| 按钮 | 新增 | `livestock:quarantineStation:add` |
| 按钮 | 修改 | `livestock:quarantineStation:edit` |
| 按钮 | 删除 | `livestock:quarantineStation:remove` |

组件路径：`livestock/quarantineStation/index`（「畜牧流通资源管理」目录下）。

---

## 5. 与牧场管理对照

| 项 | 牧场 `biz_pasture` | 检疫站 `biz_quarantine_station` |
| --- | --- | --- |
| Base Path | `/dataModel/pasture` | `/livestock/quarantineStation` |
| 状态字段 | `biz_status` | `operate_status` |
| 列表筛选 | 名称模糊 + 性质/状态 | 名称模糊 + 运营状态 |
| 区划/证件 | 有 | **无** |
| 地图 | 本期无 | 本期无 |

---

## 6. 交付清单

- [ ] `sql/biz_quarantine_station.sql`、菜单权限 SQL  
- [ ] `BizQuarantineStation`、Mapper/XML、Service、Controller  
- [ ] `QuarantineStationValidation`、照片文件清理  
- [ ] 单元测试（校验、名称唯一、模糊 SQL）  
- [ ] MockMvc（list、CRUD、删除有关联）

---

## 7. 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初稿：`biz_quarantine_station`；CRUD+逻辑删除+单图；`/livestock/quarantineStation`；名称模糊+运营状态精确 |
