Explorar o código

docs: 建议诊断(suggestDiag)下拉限制为后端返回值 设计文档

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
张田田 hai 1 semana
pai
achega
a388eea441

+ 76 - 0
docs/superpowers/specs/2026-06-18-建议诊断下拉限制-design.md

@@ -0,0 +1,76 @@
+# 建议诊断(suggestDiag)下拉限制为后端返回值
+
+- 日期:2026-06-18
+- 关联文件:`src/views/diagnosis/Prescribing.vue`
+- 范围:适宜技术 tab 的「建议诊断」交互
+
+## 1. 背景
+
+适宜技术 tab 的「建议诊断」(`suggestDiag`)目前是 **el-tag 多选 + autocomplete 搜全库**西医诊断:用户能搜全库任意西医诊断加进 `suggestDiag`。
+
+需求:限制为**只能从后端返回的 `suggestDiag` 候选里选**,默认选中第一个,保持多选,后端无值时展示空。
+
+## 2. 目标
+
+- 后端返回的 `suggestDiag`(全部)作为**候选**
+- **默认选中第一个**(初始只显示 1 个 tag)
+- autocomplete 下拉**只显示候选里的值**(不再搜全库),用户可多选,**只能选候选内的**
+- 候选为空 → 展示空
+- 保持 el-tag 多选(可删)
+
+## 3. 现状(代码位置)
+
+| 项 | 位置 | 说明 |
+|---|---|---|
+| `suggestDiag` | `:1343` data | 西医诊断 code 数组,已选 |
+| 赋值 | `:2556` | 后端 `techData.suggestDiag`(字符串/数组)→ 数组 |
+| 渲染 | `:299-330` | el-tag 多选(closable)+ el-autocomplete |
+| `searchWesternDisease` | `:2865` | 调接口搜全库西医诊断 |
+| `queryWesternDisease` | `:2969` | autocomplete 的 fetch-suggestions,调 searchWesternDisease |
+| `onWesternDiseaseSelect` | `:2982` | 选中 push 进 suggestDiag |
+| `removeWesternDisease` | `:2999` | 从 suggestDiag 移除 |
+| 缓存 | `:1577` | `_setDataToStorage` 缓存 suggestDiag |
+| 恢复 | `:1651` | `_showDataFromStorage` 恢复 suggestDiag |
+| 提交 | `:2132` | `suggestDiag.join(',')` |
+
+## 4. 新逻辑
+
+### 4.1 数据结构:拆分「候选」与「已选」
+
+- `suggestDiagAll`(data 新增):后端返回的**全部候选** = `techData.suggestDiag` 全部
+- `suggestDiag`(**已选**,沿用):初始 = `[suggestDiagAll[0]]`(默认第一个);用户多选可加;提交/缓存用
+
+### 4.2 行为
+
+| 场景 | 行为 |
+|---|---|
+| 候选非空 | `suggestDiag` 默认 = `[候选第1个]`;autocomplete 下拉选项 = `suggestDiagAll`(过滤已选);用户多选只能选候选内;el-tag 多选可删 |
+| 候选空 | `suggestDiag = []`,展示空,下拉无项 |
+
+### 4.3 改动点(`Prescribing.vue`)
+
+1. **data**(`:1343` 附近):新增 `suggestDiagAll: []`
+2. **赋值**(`:2556`):后端 `techData.suggestDiag` 全部 → `suggestDiagAll`;`suggestDiag = suggestDiagAll.length ? [suggestDiagAll[0]] : []`
+3. **queryWesternDisease**(`:2969`):不再调 `searchWesternDisease` 搜全库;改为返回 `suggestDiagAll`(过滤掉已选的)
+4. **onWesternDiseaseSelect**(`:2982`):来源已限定为 `suggestDiagAll`,天然只能选候选内(可加防御性校验)
+5. **el-tag**(`:304`)/ **removeWesternDisease**(`:2999`):不变,基于已选 `suggestDiag`
+6. **提交**(`:2132`):`suggestDiag`(已选).join(',') 照旧
+7. **缓存/恢复**(`:1577`/`:1651`):需同步处理 `suggestDiagAll`(见 §5)
+
+### 4.4 不变项
+
+- `searchWesternDisease` 全库搜索代码:保留不动(不删不注释),只是 `queryWesternDisease` 不再调用它
+- TCMDiagnosis 病名/证型/治法:不变
+- 西医主诊断 `westernDiag`:不变
+
+## 5. 边界与风险
+
+- **候选只有 1 个**:默认选它,下拉只有它
+- **候选为空**:展示空,下拉无项
+- **已选删光**:可重新下拉选(候选还在)
+- **缓存恢复**:`_setDataToStorage`(`:1577`)目前只缓存 `suggestDiag`(已选)。新增 `suggestDiagAll`(候选)后,需决定:① 缓存 `suggestDiagAll` 一起恢复;② 或恢复后只保留已选、候选清空(用户不能再加新项)。**实现时确认**(倾向 ①,保持体验一致)
+
+## 6. 不在范围
+
+- 后端接口/字段调整(假设后端已在 `techData.suggestDiag` 返回全部候选)
+- 其他 tab 的诊断逻辑