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[] {