# 设备实施作业标准管理 — 技术方案

> 依据：`设备实施作业标准管理功能需求.md`（同目录）。状态机、知识库语义与《养殖标准管理技术方案》对齐；本文仅给出**设备实施作业标准管理**本模块的库表与接口约定，与其它业务模块实现相互独立。

---

## 1. 技术架构

| 项 | 说明 |
| --- | --- |
| **后端** | RuoYi **v3.9.2**（**springboot2** 分支）：JDK 8、Spring Boot 2.x、Spring MVC、MyBatis、Druid |
| **数据库** | MySQL **5.7.39**，InnoDB，`utf8mb4` |
| **前端** | 若依 Vue2（与分支配套，路由与权限按项目惯例配置） |
| **文件** | 复用 RuoYi 上传（`/common/upload` 等）；表内存 URL、存储路径、正文原始文件名；**不入库**文件大小 |
| **知识库** | HTTP 调用知识库后台管理服务；URL、鉴权、路径见《知识库接口对接说明》；调用时机与操作类型语义与养殖标准方案 **§4.2** 一致 |

**分层**：`Controller` → `Service`（状态机、事务、知识库编排、删文件）→ `Mapper`/XML → `domain`。

**一致性（摘要）**

- 修改且 `kb_sync_status=1`：**同一事务**内「更新本地 → 调知识库更新」；知识库失败则回滚本地更新（推荐）。  
- **下架**：`publish_status=0`，`kb_sync_status=1`，保留 `kb_doc_id`；知识库侧不删条目，仅结束对外可见/检索。  
- **移出**：通知知识库删除后，`kb_sync_status=0`，清空 `kb_doc_id`。  
- **删除**：`kb_sync_status=0` 可直接删；`publish_status=0` 且 `kb_sync_status=1` 须先移出或接口内联动删库条目后再删本地。

---

## 2. 数据库设计

### 2.1 表 `biz_equipment_work_standard`

业务含义：**设备实施作业标准**主表（命名缩写 `work_standard` = 作业标准）。

| 字段 | 类型 | 非空 | 默认值 | 说明 |
| --- | --- | --- | --- | --- |
| `id` | `bigint(20)` | Y | 自增 | 主键 |
| `standard_name` | `varchar(64)` | Y | — | 标准名称（需求 1～20 字符） |
| `standard_type` | `varchar(32)` | Y | — | 资讯类别编码，见 **2.2** |
| `introduction` | `varchar(200)` | N | NULL | 简介，选填 |
| `content_file_url` | `varchar(512)` | Y | — | 正文附件访问 URL |
| `content_file_path` | `varchar(512)` | Y | — | 正文存储路径 |
| `content_file_name` | `varchar(256)` | Y | — | 正文原始文件名 |
| `cover_file_url` | `varchar(512)` | N | NULL | 封面 URL，选填 |
| `cover_file_path` | `varchar(512)` | N | NULL | 封面存储路径，选填 |
| `publish_status` | `tinyint(4)` | Y | `0` | `0` 未发布，`1` 已发布 |
| `kb_sync_status` | `tinyint(4)` | Y | `0` | `0` 未同步，`1` 已同步 |
| `kb_doc_id` | `varchar(128)` | N | NULL | 知识库文档 ID |
| `publish_time` | `datetime` | N | NULL | 发布时间 |
| `offline_time` | `datetime` | N | NULL | 下架时间 |
| `create_by` / `create_time` / `update_by` / `update_time` | 若依惯例 | — | — | — |
| `remark` | `varchar(500)` | N | NULL | 备注 |

**索引**：`PRIMARY KEY (id)`；`KEY idx_create_time (create_time)`；`KEY idx_type (standard_type)`；`KEY idx_pub_kb (publish_status, kb_sync_status)`。

**合法组合（应用层强校验）**：仅 `(publish_status, kb_sync_status) ∈ {(0,0),(0,1),(1,1)}`。

**DDL 示例**

```sql
CREATE TABLE `biz_equipment_work_standard` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `standard_name` varchar(64) NOT NULL COMMENT '标准名称（业务1～20字符）',
  `standard_type` varchar(32) NOT NULL COMMENT '标准类型编码，对应资讯类别 parentCode=001&categoryType=3',
  `introduction` varchar(200) DEFAULT NULL COMMENT '简介',
  `content_file_url` varchar(512) NOT NULL COMMENT '正文附件URL',
  `content_file_path` varchar(512) NOT NULL COMMENT '正文存储路径',
  `content_file_name` varchar(256) NOT NULL COMMENT '正文原始文件名',
  `cover_file_url` varchar(512) DEFAULT NULL COMMENT '封面URL',
  `cover_file_path` varchar(512) DEFAULT NULL COMMENT '封面存储路径',
  `publish_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0未发布 1已发布',
  `kb_sync_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0未同步 1已同步',
  `kb_doc_id` varchar(128) DEFAULT NULL COMMENT '知识库文档ID',
  `publish_time` datetime DEFAULT NULL COMMENT '发布时间',
  `offline_time` datetime DEFAULT NULL COMMENT '下架时间',
  `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(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `idx_create_time` (`create_time`),
  KEY `idx_type` (`standard_type`),
  KEY `idx_pub_kb` (`publish_status`,`kb_sync_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='设备实施作业标准';
```

### 2.2 标准类型与资讯类别

- **数据来源**：`biz_information_category`，查询子节点接口 `GET /category/informationCategory/children?parentCode=001&categoryType=3`；响应项字段 `code`（编码）、`name`（展示名）。
- **落库值**：`standard_type` 存 **编码**（如 `001007`），非数字序号。
- **校验**：`EquipmentWorkStandardTypeValidator` 在保存/修改时校验编码属于上述接口返回集合；非法编码返回「标准类型无效，请选择资讯类别中的类型」。

| 编码（示例） | 名称（与种子数据一致） |
| --- | --- |
| `001007` | 设备操作 |
| `001008` | 设备保养 |
| `001009` | 设备排障 |
| `001010` | 设备维修 |

**存量库迁移**：执行 `sql/biz_equipment_work_standard_alter_standard_type.sql`（`1`→`001007` … `4`→`001010`）。

### 2.3 其它枚举常量（后端建议）

| 字段 | 值 | 含义 |
| --- | --- | --- |
| `publish_status` | `0` | 未发布 |
| | `1` | 已发布 |
| `kb_sync_status` | `0` | 未同步 |
| | `1` | 已同步 |

---

## 3. 接口设计

统一响应：RuoYi `AjaxResult`（`code` / `msg` / `data`）或分页 `TableDataInfo`。

**权限标识（示例）**：`equipment:workStandard:list|query|add|edit|remove|syncKb|removeKb|publish|offline`

**Base Path（示例）**：`/equipment/workStandard`（与项目 `context-path`、模块前缀对齐）

| # | 说明 | Method | URI | 权限 | 要点 |
| --- | --- | --- | --- | --- | --- |
| 3.1 | 分页列表 | GET | `/equipment/workStandard/list` | `equipment:workStandard:list` | Query：`pageNum`（默认 1）、`pageSize`（默认 **20**）、`keyword`、`standardType`（精确可空）；排序 `create_time DESC, id DESC` |
| 3.2 | 详情 | GET | `/equipment/workStandard/{id}` | `equipment:workStandard:query` | 全字段；下载 `/common/download` 或鉴权直链 |
| 3.3 | 新增 | POST | `/equipment/workStandard` | `equipment:workStandard:add` | Body：`standardName`、`standardType`、`introduction`（可空）、`contentFileUrl`、`contentFilePath`、`contentFileName`、`coverFileUrl`、`coverFilePath`（可空）；落库 `publish_status=0`，`kb_sync_status=0` |
| 3.4 | 修改 | PUT | `/equipment/workStandard` | `equipment:workStandard:edit` | Body 含 `id`；**仅** `publish_status=0`；若 `kb_sync_status=1` 则保存后自动推库，失败建议整单失败 |
| 3.5 | 删除 | DELETE | `/equipment/workStandard/{ids}` | `equipment:workStandard:remove` | `publish_status=1` 禁止；`kb_sync_status=0` 允许；`0+1` 须先移出或联动删库；删文件 + 通知知识库删除 |
| 3.6 | 同步知识库 | POST | `/equipment/workStandard/syncKb/{id}` | `equipment:workStandard:syncKb` | 前置 `publish_status=0` 且 `kb_sync_status=0` |
| 3.7 | 移出知识库 | POST | `/equipment/workStandard/removeKb/{id}` | `equipment:workStandard:removeKb` | 前置 `publish_status=0` 且 `kb_sync_status=1` |
| 3.8 | 发布 | POST | `/equipment/workStandard/publish/{id}` | `equipment:workStandard:publish` | 前置 `publish_status=0` 且 `kb_sync_status=1` |
| 3.9 | 下架 | POST | `/equipment/workStandard/offline/{id}` | `equipment:workStandard:offline` | 前置 `publish_status=1`；本地回流 `publish_status=0`，`kb_sync_status=1`，`offline_time=now()` |

**校验（摘要）**：名称 1～20；`standard_type` 非空且为资讯类别有效编码（**2.2**）；简介 ≤50 字；正文白名单与 ≤30MB；封面白名单与 ≤10MB。

---

## 4. 知识库交互与附件（摘录）

- 变更通知（同步、保存推库、移出、发布、下架、删除联动）：语义与《养殖标准管理技术方案》**§4.2** 一致；扩展字段中区分 **设备实施作业标准** 业务类型，以对端约定为准。  
- **上传**：先 `/common/upload`；替换附件成功后删除旧 `content_file_path` / `cover_file_path` 对应物理文件。

---

## 5. 交付清单（勾选）

- [ ] `biz_equipment_work_standard` DDL；存量环境执行 `biz_equipment_work_standard_alter_standard_type.sql` / 菜单按钮权限 SQL  
- [ ] Domain / Mapper / Service / Controller  
- [ ] 知识库 Client 复用或按本模块扩展配置  
- [ ] 集成测试：同步、推库、发布、下架、移出、删除及非法状态拦截  
