From 88131781bb99068db5a298412bb9892aa41fb895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A4=A9=E9=AA=84?= <5307576@qq.com> Date: Thu, 18 Jun 2026 11:12:41 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=A7=91=E5=AE=A4=E5=8F=98=E6=88=90?= =?UTF-8?q?=E4=B8=8B=E6=8B=89=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/AiCaseGenerateView.vue | 130 ++++++++++++++++++++++++++++++- 1 file changed, 126 insertions(+), 4 deletions(-) diff --git a/src/views/AiCaseGenerateView.vue b/src/views/AiCaseGenerateView.vue index eb67a7eb..247da853 100644 --- a/src/views/AiCaseGenerateView.vue +++ b/src/views/AiCaseGenerateView.vue @@ -98,13 +98,44 @@ - - + + + + - - + + + + @@ -245,6 +276,7 @@ import { type CreateCaseDraftPayload, type DraftCaseType } from '@/api/cases' +import { fetchInstitutionList, fetchMyDepartments, type DepartmentOption, type InstitutionOption } from '@/api/users' import { useAppStore } from '@/stores/app' interface ScoringRuleForm { @@ -272,6 +304,7 @@ interface CaseDraftForm { title: string case_type: DraftCaseType institution_id?: number + department_id?: number department_name: string difficulty: string chief_complaint: string @@ -299,6 +332,10 @@ const draftFormRef = ref() const generating = ref(false) const savingDraft = ref(false) const result = ref(null) +const institutionOptions = ref([]) +const departmentOptions = ref([]) +const loadingInstitutions = ref(false) +const loadingDepartments = ref(false) const form = reactive({ case_type: 'traditional' as DraftCaseType, @@ -309,6 +346,7 @@ const draftForm = reactive({ title: '', case_type: 'traditional', institution_id: undefined, + department_id: undefined, department_name: '', difficulty: '', chief_complaint: '', @@ -449,6 +487,7 @@ function resetDraftForm() { draftForm.title = '' draftForm.case_type = 'traditional' draftForm.institution_id = undefined + draftForm.department_id = undefined draftForm.department_name = '' draftForm.difficulty = '' draftForm.chief_complaint = '' @@ -478,6 +517,85 @@ function removeExamItem(index: number) { draftForm.exam_items.splice(index, 1) } +async function loadInstitutionOptions() { + if (!appStore.token || !canManageInstitution.value || loadingInstitutions.value || institutionOptions.value.length) { + return + } + + try { + loadingInstitutions.value = true + institutionOptions.value = await fetchInstitutionList(appStore.token) + } catch (error) { + ElMessage.error(error instanceof Error ? error.message : '获取机构列表失败') + } finally { + loadingInstitutions.value = false + } +} + +async function loadDepartmentOptions(institutionId?: number) { + if (!appStore.token || loadingDepartments.value) { + return + } + if (canManageInstitution.value && !institutionId) { + departmentOptions.value = [] + return + } + + try { + loadingDepartments.value = true + departmentOptions.value = await fetchMyDepartments(appStore.token, institutionId) + } catch (error) { + ElMessage.error(error instanceof Error ? error.message : '获取科室列表失败') + } finally { + loadingDepartments.value = false + } +} + +function handleInstitutionVisibleChange(visible: boolean) { + if (visible) { + loadInstitutionOptions() + } +} + +function handleDepartmentVisibleChange(visible: boolean) { + if (visible) { + loadDepartmentOptions(draftForm.institution_id) + } +} + +function handleInstitutionChange() { + draftForm.department_id = undefined + draftForm.department_name = '' + loadDepartmentOptions(draftForm.institution_id) +} + +function handleDepartmentChange(value?: number) { + draftForm.department_name = getDepartmentName(value) +} + +function syncDepartmentSelectionByName() { + if (draftForm.department_id || !draftForm.department_name.trim()) { + return + } + + const matched = departmentOptions.value.find(item => item.name === draftForm.department_name.trim()) + if (matched) { + draftForm.department_id = matched.id + } +} + +function getDepartmentName(value?: number) { + if (!value) { + return '' + } + + return departmentOptions.value.find(item => item.id === value)?.name || '' +} + +function institutionOptionLabel(item: InstitutionOption) { + return item.code ? `${item.name} (${item.code})` : item.name +} + function buildDraftPayload(): CreateCaseDraftPayload { const structure = buildCaseStructure() const scoringRules = normalizeScoringRules() @@ -490,6 +608,7 @@ function buildDraftPayload(): CreateCaseDraftPayload { payload[draftForm.case_type] = structure if (canManageInstitution.value && draftForm.institution_id) payload.institution_id = draftForm.institution_id + if (draftForm.department_id) payload.department_id = draftForm.department_id if (draftForm.department_name.trim()) payload.department_name = draftForm.department_name.trim() if (draftForm.difficulty.trim()) payload.difficulty = draftForm.difficulty.trim() if (draftForm.chief_complaint.trim()) payload.chief_complaint = draftForm.chief_complaint.trim() @@ -609,6 +728,8 @@ function fillDraftFormFromGenerated(generatedResult: AiGenerateCaseResult) { draftForm.case_type = caseType draftForm.title = getGeneratedString(record, ['title', 'name', 'case_title', 'caseTitle']) + draftForm.institution_id = getGeneratedNumber(record, ['institution_id', 'institutionId']) ?? undefined + draftForm.department_id = getGeneratedNumber(record, ['department_id', 'departmentId']) ?? undefined draftForm.department_name = getGeneratedString(record, ['department_name', 'departmentName']) draftForm.difficulty = getGeneratedString(record, ['difficulty']) draftForm.chief_complaint = getGeneratedString(record, ['chief_complaint', 'chiefComplaint']) @@ -646,6 +767,7 @@ function fillDraftFormFromGenerated(generatedResult: AiGenerateCaseResult) { : [{ dimension: '', score_weight: 1, ai_auto_score: true, scoring_standard: '' }] draftForm.exam_items = examItems draftFormRef.value?.clearValidate() + loadDepartmentOptions(draftForm.institution_id).then(syncDepartmentSelectionByName) } function parseTextList(value: string): string[] {