diff --git a/apps/web/src/pages/health/components/DoctorSelect.tsx b/apps/web/src/pages/health/components/DoctorSelect.tsx index 9fd2f0f..18bc8b5 100644 --- a/apps/web/src/pages/health/components/DoctorSelect.tsx +++ b/apps/web/src/pages/health/components/DoctorSelect.tsx @@ -1,5 +1,5 @@ import { Select } from 'antd'; -import { useState, useCallback } from 'react'; +import { useState, useCallback, useEffect } from 'react'; import { doctorApi } from '../../../api/health/doctors'; interface Props { @@ -14,9 +14,23 @@ export function DoctorSelect({ value, onChange, placeholder }: Props) { >([]); const [fetching, setFetching] = useState(false); + useEffect(() => { + let cancelled = false; + doctorApi.list({ page_size: 50 }).then((result) => { + if (!cancelled) { + setOptions( + result.data.map((d) => ({ + value: d.id, + label: `${d.name}${d.department ? ` - ${d.department}` : ''}`, + })), + ); + } + }).catch(() => {}); + return () => { cancelled = true; }; + }, []); + const handleSearch = useCallback(async (search: string) => { if (!search || search.length < 1) { - setOptions([]); return; } setFetching(true); @@ -31,6 +45,8 @@ export function DoctorSelect({ value, onChange, placeholder }: Props) { label: `${d.name}${d.department ? ` - ${d.department}` : ''}`, })), ); + } catch { + // 搜索失败时保留初始列表 } finally { setFetching(false); } diff --git a/docs/qa/quality-verification-summary.md b/docs/qa/quality-verification-summary.md index 0b46849..0293cab 100644 --- a/docs/qa/quality-verification-summary.md +++ b/docs/qa/quality-verification-summary.md @@ -9,8 +9,7 @@ | 冒烟场景 | 6 (S1-S6) | | 总体判定 | **PASS_WITH_ISSUES** | | 发现 BUG | CRITICAL ×1, HIGH ×2, MEDIUM ×2 | -| 已修复 | CRITICAL ×1, HIGH ×2, MEDIUM ×1 | -| 未修复 | MEDIUM ×1 (排班搜索 UI) | +| 已修复 | CRITICAL ×1, HIGH ×2, MEDIUM ×2 | | 回归验证 | S2 告警全链路 ✅ | ## 发现与修复清单 @@ -44,9 +43,11 @@ - **修复:** SQL INSERT 为 doctor 角色(019dd238)添加 9 项权限 - **验证:** S3/S6 场景中 doctor1 可正常访问 care-plans、dialysis-records、ai/analysis 端点 -### MEDIUM-003 (未修复): 排班管理医护搜索下拉框 +### MEDIUM-003: 排班管理医护搜索下拉框 - **症状:** 排班管理页面的医护选择器搜索无结果 -- **状态:** UI 问题,需要后续排查前端组件或 API 联动 +- **根因:** DoctorSelect 组件初始不加载任何数据,搜索失败时静默吞掉错误 +- **修复:** 组件挂载时预加载医生列表(最多 50 条),搜索清空时保留已有列表,添加 catch 错误处理 +- **文件:** `apps/web/src/pages/health/components/DoctorSelect.tsx` ## S2 回归验证结果 @@ -85,9 +86,10 @@ | `crates/erp-health/src/service/critical_alert_service.rs` | 修复 | 添加 severity 参数 | | `crates/erp-dialysis/src/service/dialysis_service.rs` | 修复 | 患者存在性校验 | | `apps/web/src/pages/health/CriticalValueThresholdList.tsx` | 修复 | 自动加载阈值数据 | +| `apps/web/src/pages/health/components/DoctorSelect.tsx` | 修复 | 预加载医生列表 + 错误处理 | ## 遗留事项 -1. **MEDIUM-003:** 排班管理医护搜索 UI 问题需后续排查 -2. **前端 DTO 不匹配:** 前端 vital-signs 提交使用 `records[]` + `indicator_type` 格式,后端期望平面字段格式(`systolic_bp_morning` 等),需统一 +1. ~~**MEDIUM-003:**~~ 排班管理医护搜索 UI 已修复(预加载 + 错误处理) +2. ~~**前端 DTO 不匹配:**~~ 前端 vital-signs API 层实际使用正确的平面字段格式,与后端 DTO 完全一致,无需修复 3. **测试覆盖:** 前端单元测试和 AI 集成测试覆盖率偏低(已知问题)