# 疫病诊疗标准管理 — 前端技术方案

> 依据：`疫病诊疗标准管理技术方案.md`（同目录，下称**总方案**）、`疫病诊疗标准管理功能需求.md`。页面布局对齐 `ruoyi-ui/src/views/breedingStandards/breedingManage/index.vue`；请求与表单字段统一 **小驼峰**，与后端 `BizEpidemicTreatmentStandard` 及 Jackson 序列化一致。

---

## 1. 页面与路由

| 项 | 说明 |
| --- | --- |
| **Vue 路径** | `ruoyi-ui/src/views/breedingStandards/diseaseTreatment/epidemicTreatment/index.vue` |
| **组件名** | `EpidemicTreatmentStandard` |
| **菜单配置** | 若依「菜单管理」组件路径：`breedingStandards/diseaseTreatment/epidemicTreatment/index` |
| **Mixin** | `breedingStdLocaleMixin`（`stdNs = "ep"` → `breedingStd.ep.*`） |
| **权限前缀** | `epidemicTreatment:standard:list|query|add|edit|remove|syncKb|removeKb|publish|offline` |

---

## 2. API 模块

| 文件 | Base Path |
| --- | --- |
| `ruoyi-ui/src/api/breedingStandards/epidemicTreatment.js` | `/epidemicTreatment/standard` |
| `ruoyi-ui/src/api/category/informationCategory.js` | `/category/informationCategory/children` |

| 方法 | HTTP | URI | 说明 |
| --- | --- | --- | --- |
| `listEpidemicTreatmentStandard` | GET | `/list` | 分页列表 |
| `getEpidemicTreatmentStandard` | GET | `/{id}` | 详情 |
| `addEpidemicTreatmentStandard` | POST | `/` | 新增 |
| `updateEpidemicTreatmentStandard` | PUT | `/` | 修改（仅未发布+未同步） |
| `delEpidemicTreatmentStandard` | DELETE | `/{ids}` | 删除 |
| `syncKbEpidemicTreatmentStandard` | POST | `/syncKb/{id}` | 同步知识库 |
| `removeKbEpidemicTreatmentStandard` | POST | `/removeKb/{id}` | 移出知识库 |
| `publishEpidemicTreatmentStandard` | POST | `/publish/{id}` | 发布 |
| `offlineEpidemicTreatmentStandard` | POST | `/offline/{id}` | 下架 |

**标准类型下拉**：`listInformationCategoryChildren('001', '5')`，与后端 `EpidemicTreatmentStandardTypeValidator` 一致。

**上传**：`POST /common/upload` → 正文 `contentFileUrl` / `contentFilePath` / `contentFileName`；封面 `coverFileUrl` / `coverFilePath`。

---

## 3. 页面结构

布局为双 `el-card`（筛选 + 列表），中间 `<br />` 分隔。

### 3.1 筛选区

| 绑定字段 | 说明 |
| --- | --- |
| `queryParams.keyword` | 名称/简介模糊（总方案 **§3.1**） |
| `queryParams.standardType` | 资讯类别编码精确匹配，可清空 |
| `queryParams.pageNum` / `pageSize` | 默认 1 / 20 |

### 3.2 列表列

| 列 | 字段 / 展示 |
| --- | --- |
| 标准名称 | `standardName` |
| 标准类型 | `typeLabel(standardType)`，列宽 112 |
| 简介 | `introduction` |
| 正文附件 | `contentFileName` 链至 `contentFileUrl` |
| 上架状态 | `publishStatusText(publishStatus)` |
| 知识库同步 | `kbSyncStatusText(kbSyncStatus)` |
| 发布日期 | `publishTime`（`yyyy-MM-dd`） |
| 创建时间 | `createTime` |
| 操作 | 见 **§5** |

### 3.3 新增/编辑弹窗

- 标题：`dialogAdd` / `dialogEdit`；`:key="formKey"` 重置表单。
- 字段：`standardName`（1～20）、`standardType`、`introduction`（≤50）、正文上传、封面上传。
- 编辑时 `canEditFormRow`：仅 `publishStatus=0` 且 `kbSyncStatus=0` 可改字段及换附件；已发布/已同步点编辑分别提示 `rulePublishedNoEdit` / `ruleSyncedNoEdit`。
- 提交 Body 不含 `publishStatus`、`kbSyncStatus`、`kbDocId`；编辑带 `id`。

### 3.4 查看弹窗

只读展示主字段、封面（`image-preview`）、上架/同步状态、发布时间、下架时间。

---

## 4. 标准类型

`created` 调用 `loadStandardTypeOptions()`；失败时 `errStdTypeLoad` 提示。

`mapCategoryItem` 将接口项映射为 `{ value: code, label: name }`。

`typeLabel` 优先匹配 `standardTypeOptions`；存量值 `1` 回退 `stdT('type1')`（疾病决策）；仍无则回显编码。

| 编码（示例） | 界面文案 |
| --- | --- |
| `001013` | 疾病决策（资讯类别，总方案 **§2.2**） |

迁移脚本：`biz_epidemic_treatment_standard_alter_standard_type.sql`（`1` → `001013`）。

---

## 5. 状态常量与操作矩阵

**脚本常量**

| 常量 | 值 | 含义 |
| --- | --- | --- |
| `PUBLISH_STATUS.UNPUBLISHED` | 0 | 未发布（含下架回流） |
| `PUBLISH_STATUS.PUBLISHED` | 1 | 已发布 |
| `KB_SYNC_STATUS.UNSYNCED` | 0 | 未同步 |
| `KB_SYNC_STATUS.SYNCED` | 1 | 已同步 |

合法稳态：`(0,0)`、`(0,1)`、`(1,1)`。下架成功后为 **未发布 + 已同步**（知识库保留副本，≠ 移出）。

| 组合 | 编辑 | 同步 | 移出 | 发布 | 下架 | 删除 |
| --- | --- | --- | --- | --- | --- | --- |
| 未发布 + 未同步 | ✓ | ✓ | — | — | — | ✓ |
| 未发布 + 已同步 | ✗ | — | ✓ | ✓ | — | ✗ |
| 已发布 + 已同步 | ✗ | — | — | — | ✓ | ✗ |

**`can*` 方法**（均 `Number()` 比较）+ **`v-hasPermi`** + **`v-if`** 控制按钮。

| 方法 | 条件 |
| --- | --- |
| `canEdit` | `publishStatus === 0` 且 `kbSyncStatus === 0` |
| `canSyncKb` | 未发布且未同步 |
| `canRemoveKb` | 未发布且已同步 |
| `canPublish` | 未发布且已同步 |
| `canOffline` | 已发布 |
| `canDelete` | 未发布且未同步 |

**交互提示**

- 已发布点编辑：`rulePublishedNoEdit`
- 已同步点编辑：`ruleSyncedNoEdit`
- 已同步点删除：`ruleDeleteNeedRemoveKb`
- 标准类型加载失败：`errStdTypeLoad`
- 同步/移出/发布/下架/删除：二次确认后调接口，成功 `getList()` 刷新

---

## 6. 表单与上传校验

| 项 | 前端规则 |
| --- | --- |
| 标准名称 | 必填，1～20 字 |
| 标准类型 | 必选（资讯类别编码） |
| 简介 | 选填，≤50 字 |
| 正文 | 必填；后缀 **`pdf`/`md`/`doc`/`docx`/`xls`/`xlsx`/`pptx`**（服务端 `EpidemicTreatmentStandardRules`）；≤30MB；文件名不含英文逗号。**说明**：页面 `contentFileExts` 本次未同步，**保存以服务端校验为准** |
| 封面 | 选填；`jpg/jpeg/png`；≤10MB |

已同步记录为只读；改内容须先移出知识库后再编辑、同步。

---

## 7. 国际化

| 命名空间 | 路径 |
| --- | --- |
| 模块文案 | `breedingStd.ep.*`（`lang/zh/breedingStd.js`、`lang/bo/breedingStd.js`） |
| 公共文案 | `breedingStd.common.*`、`breedingStd.status.*` |

---

## 8. 依赖组件与工具

| 项 | 说明 |
| --- | --- |
| `pagination` | 分页 |
| `parseTime` | 时间格式化 |
| `image-preview` | 查看弹窗封面预览 |
| `resetForm` | 重置查询表单 |
| `$modal` | confirm / msgSuccess / msgWarning / msgError / loading |

---

## 9. 联调检查项

1. 标准类型下拉与保存编码（如 `001013`）一致。
2. 未发布+未同步：可新增、同步、编辑、删除。
3. 未发布+已同步：不可编辑（前端拦截），可移出、发布；不可删。
4. 已发布：仅查看、下架；下架后回到未发布+已同步。
5. 正文 `contentFileName` 在列表与详情正确展示；双语切换正常。

---

## 10. 文件清单

| 类型 | 路径 |
| --- | --- |
| 页面 | `ruoyi-ui/src/views/breedingStandards/diseaseTreatment/epidemicTreatment/index.vue` |
| 业务 API | `ruoyi-ui/src/api/breedingStandards/epidemicTreatment.js` |
| 类别 API | `ruoyi-ui/src/api/category/informationCategory.js` |
| Mixin | `ruoyi-ui/src/mixins/breedingStdLocaleMixin.js` |
| i18n | `ruoyi-ui/src/lang/zh/breedingStd.js`、`lang/bo/breedingStd.js` |

---

## 11. 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初稿：双卡片 CRUD、资讯类别编码、双维状态机、附件上传、知识库与发布/下架 |
| **1.1** | **2026-06-01**：标准类型改资讯类别编码（`parentCode=001&categoryType=5`）；存量 `1` 回退展示；编辑/上传仅 **未发布+未同步**；类型加载失败与已同步编辑提示；下架回流 **(0,1)** 操作矩阵修正 |
| **1.2** | **2026-05-20**：正文服务端白名单：`pdf`、`md`、`doc`、`docx`、`xls`、`xlsx`、`pptx`（移除 `ppt`）；前端 `contentFileExts` 本次不改 |
