# 畜牧资源 — 接口说明

> 数据视图：`v_livestock_resource`（DDL 见 `sql/biz_v_livestock_resource.sql`）。  
> 后端包：`com.ruoyi.web.modules.news`；接口：`BizAppLivestockResourceController`。  
> 医疗资源类型编码与 `biz_medical_resource.resource_type`（资讯类别 `parentCode=004`、`categoryType=6`）；科技资源与 `biz_tech_resource.resource_type`（`categoryType=7`）一致。

---

## 1. 视图 `v_livestock_resource`

仅聚合 **`publish_status = 1`（已发布）** 记录，字段统一如下：

| 视图列 | 说明 |
| --- | --- |
| `id` | 源表主键（`biz_medical_resource.id` 或 `biz_tech_resource.id`） |
| `source_type` | 来源表：`1` = 医疗资源，`2` = 科技资源 |
| `title` | 资源名称 |
| `introduction` | 简介 |
| `type` | 资源类型编码（`resource_type`） |
| `cover_file_url` | 封面/主图访问 URL |
| `content_file_url` | 视频/附件访问 URL（可为 `null`） |
| `publish_time` | 发布时间 |

**唯一标识**：列表项以 **`source_type` + `id`** 组合区分（两源表主键可能重复）。

### 1.1 数据来源（UNION）

| 来源表 | `source_type` | `type` | 说明 |
| --- | --- | --- | --- |
| `biz_medical_resource` | `1` | `004002` | 专家团队 |
| `biz_tech_resource` | `2` | `004006` | 技术成果 |
| `biz_tech_resource` | `2` | `004008` | 视频课程 |
| `biz_tech_resource` | `2` | `004007` | 共享仪器 |

### 1.2 移动端 Tab 与 `type`

畜牧资源页 4 个 Tab 与类型编码一一对应：

| Tab | `type` |
| --- | --- |
| 专家团队 | `004002` |
| 技术成果 | `004006` |
| 共享仪器 | `004007` |
| 视频课程 | `004008` |

---

## 2. 列表接口

### 2.1 请求

| 项 | 值 |
| --- | --- |
| **Method** | `GET` |
| **URI** | `/app/livestockResource/list` |
| **鉴权** | 移动端登录态（与 `/app/*` 其它接口一致） |

**Query 参数**

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `type` | string | **是** | 资源类型编码，须为 **§1.2** 中四种之一 |
| `title` | string | 否 | 标题关键字，对 `title` 列模糊匹配 |
| `pageNum` | int | 否 | 页码，默认 **1**；小于 1 时按 1 处理 |
| `pageSize` | int | 否 | 每页条数，默认 **10**；小于 1 时按 10 处理；**最大 50** |

示例：

```http
GET /app/livestockResource/list?type=004006&pageNum=1&pageSize=10
GET /app/livestockResource/list?type=004008&title=养殖
```

### 2.2 响应

RuoYi 分页 `TableDataInfo`：`code`、`msg`、`rows`（当前页数据）、`total`（符合条件的总条数）。排序固定为 `publish_time` 降序。

**`rows[]` 单条字段（驼峰）**

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `id` | long | 源表主键 |
| `sourceType` | int | `1` 医疗 / `2` 科技 |
| `title` | string | 标题 |
| `introduction` | string | 简介 |
| `type` | string | 资源类型编码 |
| `coverFileUrl` | string | 封面 URL，可空 |
| `contentFileUrl` | string | 视频/附件 URL，可空 |
| `publishTime` | string | 发布日期，`yyyy-MM-dd` |

**示例**

```json
{
  "code": 200,
  "msg": "查询成功",
  "total": 1,
  "rows": [
    {
      "id": 101,
      "sourceType": 2,
      "title": "高原牦牛繁育技术成果",
      "introduction": "成果简介示例",
      "type": "004006",
      "coverFileUrl": "/profile/upload/cover.png",
      "contentFileUrl": "/profile/upload/demo.mp4",
      "publishTime": "2026-05-10"
    }
  ]
}
```

### 2.3 业务校验

| 场景 | 结果 |
| --- | --- |
| `type` 为空 | 「资源类型不能为空」 |
| `type` 非视图涵盖的四种编码 | 「资源类型无效，请选择畜牧资源支持的类型」 |

校验实现：`LivestockResourceTypeValidator`（`LivestockResourceRules`：`004002`、`004006`、`004007`、`004008`）。

---

## 3. 详情接口

### 3.1 请求

| 项 | 值 |
| --- | --- |
| **Method** | `GET` |
| **URI** | `/app/livestockResource/{id}` |
| **鉴权** | 移动端登录态 |

**路径 / Query 参数**

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `id` | long | **是** | 源表主键（与列表项 `id` 一致） |
| `type` | int | **是** | 来源表：`1` = `biz_medical_resource`，`2` = `biz_tech_resource`（与列表项 `sourceType` 一致） |

> **注意**：详情接口的 `type` 表示**来源表**（1/2）；列表接口的 `type` 表示**资源类型编码**（如 `004006`），二者含义不同。

示例：

```http
GET /app/livestockResource/101?type=2
GET /app/livestockResource/11?type=1
```

### 3.2 响应

标准 `AjaxResult`：`code`、`msg`、`data`。

| `type` | `data` 类型 | 说明 |
| --- | --- | --- |
| `1` | `BizMedicalResource` | `biz_medical_resource` **全部字段**（驼峰 JSON） |
| `2` | `BizTechResource` | `biz_tech_resource` **全部字段**（驼峰 JSON；不含 `expertRating`） |

仅返回 **已发布**（`publish_status=1`）、**未删除**且纳入 `v_livestock_resource` 的资源：

- 医疗：`resource_type = 004002`
- 科技：`resource_type ∈ {004006, 004007, 004008}`

医疗实体含 `consultModes` / `consultModesList`、`serviceWeekdays` / `serviceWeekdaysList` 等；科技实体含 `serviceWeekdays` / `serviceWeekdaysList` 等，字段定义见管理端「畜牧医疗资源」「畜牧科技资源」模块。

**示例（type=2，节选）**

```json
{
  "code": 200,
  "msg": "操作成功",
  "data": {
    "id": 101,
    "resourceType": "004006",
    "resourceName": "高原牦牛繁育技术成果",
    "introduction": "成果简介示例",
    "coverFileUrl": "/profile/upload/cover.png",
    "videoFileUrl": "/profile/upload/demo.mp4",
    "publishStatus": 1,
    "publishTime": "2026-05-10 08:00:00"
  }
}
```

### 3.3 业务校验

| 场景 | 结果 |
| --- | --- |
| `type` 为空 | 「来源类型不能为空」 |
| `type` 非 1/2 | 「来源类型无效，请使用 1（医疗）或 2（科技）」 |
| 记录不存在 / 未发布 / 非视图范围 | 「该资源已下线或不存在」 |

---

## 4. 前端（小程序）对接要点

| 能力 | 说明 |
| --- | --- |
| 列表唯一键 | 优先 `sourceType + '-' + id`；虚拟列表 `key-field="id"` 使用合成键 |
| 列表缩略图 | `coverFileUrl` |
| 视频/附件 | `contentFileUrl`（为空则不展示；专家团队 `004002` 视图侧 `content_file_url` 为 `null`） |
| 分类筛选 | 请求参数 `type` = Tab 对应编码 |
| 分类名称展示 | 医疗：`GET /category/informationCategory/children?parentCode=004&categoryType=6`（`004001`～`004004`）；科技：`categoryType=7`（`004005`～`004008`）取 `name` |
| 分页 / 上拉加载 | 首屏 `pageNum=1`；加载更多时 `pageNum++`，当 `rows.length < pageSize` 或已加载条数 ≥ `total` 时无更多数据 |
| 详情跳转 | `GET /app/livestockResource/{id}?type={sourceType}` 拉取源表全字段；列表项 `sourceType`+`id` 传参 |

页面参考：`ruoyi-ui-app/package-a/livestock-resources/index.vue`。

---

## 5. 修订记录

| 日期 | 说明 |
| --- | --- |
| 2026-05-20 | 初版：`GET /app/livestockResource/list`；视图 `v_livestock_resource` 与四类 Tab |
| 2026-06-09 | 视图新增 `id`、`source_type`；列表响应增加 `id`、`sourceType` |
| 2026-06-09 | 新增 `GET /app/livestockResource/{id}?type=1\|2` 详情，按源表返回全字段 |
