fix: 解决bug

This commit is contained in:
王天骄
2026-06-18 17:36:17 +08:00
parent bc324a4163
commit e80a0b5365
16 changed files with 46 additions and 27 deletions
+3 -2
View File
@@ -275,6 +275,7 @@ function normalizeUser(item: unknown, index: number): UserListItem {
const name = getString(record, ['name', 'real_name', 'realName', 'nickname', 'username'], `用户${index + 1}`)
const roleType = getString(record, ['role_type', 'roleType', 'role'], '')
const status = getStatus(record)
const institutionId = getString(record, ['institution', 'institution_id', 'institutionId'], '')
return {
id: getString(record, ['id', 'uuid', 'user_id', 'userId'], `${index}`),
@@ -282,7 +283,7 @@ function normalizeUser(item: unknown, index: number): UserListItem {
account: getString(record, ['account', 'username', 'phone', 'mobile', 'email'], name),
role: getString(record, ['role_name', 'roleName', 'role', 'role_type', 'roleType']),
roleType,
org: getString(record, ['org', 'organization', 'organization_name', 'organizationName', 'hospital', 'hospital_name', 'hospitalName']),
org: getString(record, ['org', 'organization', 'organization_name', 'organizationName', 'institution_name', 'institutionName', 'hospital', 'hospital_name', 'hospitalName'], institutionId || '-'),
lastLogin: getString(record, ['last_login', 'lastLogin', 'login_time', 'loginTime']),
enabled: getBoolean(record, ['enabled', 'is_active', 'isActive', 'status']),
phone: getString(record, ['phone', 'mobile', 'account', 'username'], ''),
@@ -292,7 +293,7 @@ function normalizeUser(item: unknown, index: number): UserListItem {
major: getString(record, ['major']),
trainingStage: getString(record, ['training_stage', 'trainingStage']),
status,
institutionId: getString(record, ['institution', 'institution_id', 'institutionId'])
institutionId
}
}
+2 -2
View File
@@ -58,7 +58,7 @@ export const platformDashboard = {
activeUserTrend: [6420, 7310, 8160, 8940, 10320, 11860],
userComposition: [
{ name: '学生', value: 38260 },
{ name: '带教老师', value: 7240 },
{ name: '带教医生', value: 7240 },
{ name: '医院管理员', value: 2760 }
],
hourlyTrainingAverage: {
@@ -154,7 +154,7 @@ export const hospitalDashboard = {
},
kpis: [
{ label: '本院科室数', value: '18', change: '+2 较上月', tone: 'blue' },
{ label: '带教老师数', value: '86', change: '+6', tone: 'green' },
{ label: '带教医生数', value: '86', change: '+6', tone: 'green' },
{ label: '本院学员数', value: '1,260', change: '+84', tone: 'purple' },
{ label: '训练完成率', value: '89.6%', change: '+3.2%', tone: 'orange' },
{ label: '平均训练得分', value: '84.8', change: '+1.6 分', tone: 'green' },
+1 -1
View File
@@ -88,7 +88,7 @@ export const roleMenus: Record<RoleKey, MenuSection[]> = {
{
title: '人员管理',
items: [
{ page: 'doctor-list', icon: DoctorIcon, title: '医生管理' },
{ page: 'doctor-list', icon: DoctorIcon, title: '带教医生管理' },
{ page: 'student-list', icon: School, title: '医学生管理' },
{ page: 'teacher-list', icon: Reading, title: '师生关系管理' }
]
+1 -1
View File
@@ -27,7 +27,7 @@ const routes: RouteRecordRaw[] = [
{ path: 'users', name: 'Users', component: () => import('@/views/UsersView.vue'), meta: { title: '用户列表' } },
{ path: 'cases/ai-generate', name: 'AiCaseGenerate', component: () => import('@/views/AiCaseGenerateView.vue'), meta: { title: 'AI病例生成' } },
{ path: 'cases/review', name: 'CaseReview', component: () => import('@/views/CaseReviewView.vue'), meta: { title: '病例审核' } },
{ path: 'users/doctors', name: 'DoctorUsers', component: () => import('@/views/RoleUsersView.vue'), meta: { title: '医生管理', roleType: 'doctor' } },
{ path: 'users/doctors', name: 'DoctorUsers', component: () => import('@/views/RoleUsersView.vue'), meta: { title: '带教医生管理', roleType: 'doctor' } },
{ path: 'users/students', name: 'StudentUsers', component: () => import('@/views/RoleUsersView.vue'), meta: { title: '医学生管理', roleType: 'student' } },
{ path: 'users/content-admins', name: 'ContentAdminUsers', component: () => import('@/views/RoleUsersView.vue'), meta: { title: '内容管理员', roleType: 'content_admin' } },
{ path: 'my-students', name: 'MyStudents', component: () => import('@/views/MyStudentsView.vue'), meta: { title: '我的学生' } },
+1 -1
View File
@@ -8,7 +8,7 @@ const roleProfiles: Record<RoleKey, Pick<UserProfile, 'name' | 'avatarText'>> =
'super-admin': { name: '张管理员', avatarText: '张' },
'hospital-admin': { name: '李院管', avatarText: '李' },
'content-admin': { name: '王内容', avatarText: '王' },
teacher: { name: '陈医生', avatarText: '陈' }
teacher: { name: '陈带教', avatarText: '陈' }
}
const loginRoleMap: Record<LoginRole, RoleKey> = {
+4 -1
View File
@@ -592,7 +592,7 @@
</template>
</div>
<div v-if="visibleScoringRules.length" class="case-form-section">
<div v-if="showScoringRulesSection" class="case-form-section">
<div class="case-section-title">
<h3>评分规则</h3>
</div>
@@ -847,6 +847,9 @@ const canEditDetailCase = computed(() => detailCase.value?.publishStatus === 0)
const visibleScoringRules = computed(() =>
detailForm.scoring_rules.filter(rule => rule.dimension.trim() || rule.scoring_standard.trim())
)
const showScoringRulesSection = computed(() =>
detailCase.value?.publishStatus === 2 && visibleScoringRules.value.length > 0
)
const relationsCurrentTitle = computed(() => {
if (!relationsCase.value) {
return ''
+3 -3
View File
@@ -21,7 +21,7 @@
<section class="overview-grid">
<ChartPanel class="wide-chart" title="近6个月训练次数与活跃用户" subtitle="柱状图为训练次数,折线图为月活跃用户数" :option="trainingActiveOption" />
<ChartPanel title="用户构成" subtitle="学生、带教老师、医院管理员分布" :option="userCompositionOption" />
<ChartPanel title="用户构成" subtitle="学生、带教医生、医院管理员分布" :option="userCompositionOption" />
<ChartPanel title="近7天平均训练量" subtitle="按小时聚合的平均训练量" :option="hourlyAverageOption" />
<ChartPanel class="wide-chart" title="各机构用户人数与活跃人数" subtitle="累计注册用户与近30天活跃用户对比" :option="institutionUsersOption" />
</section>
@@ -339,9 +339,9 @@ function ratioText(part: number | null | undefined, total: number | null | undef
function roleLabel(role: string) {
const labels: Record<string, string> = {
super_admin: '超级管理员',
doctor: '医生',
doctor: '带教医生',
student: '学生',
teacher: '带教老师',
teacher: '带教医生',
content_admin: '内容管理员',
hospital_admin: '医院管理员'
}
+1 -1
View File
@@ -120,7 +120,7 @@ const dashboard = computed(() => {
},
kpis: [
stat('本院科室数', numberText(summary.dept_count), '当前机构', 'blue'),
stat('带教老师数', numberText(summary.doctor_count), '医生用户', 'green'),
stat('带教医生数', numberText(summary.doctor_count), '带教医生用户', 'green'),
stat('本院学员数', numberText(summary.student_count), '学生用户', 'purple'),
stat('累计训练次数', numberText(summary.train_total), '本院训练', 'blue'),
stat('训练完成率', percentText(summary.complete_rate), '完成训练占比', 'orange'),
+1 -1
View File
@@ -289,7 +289,7 @@ const pageKpis = computed<StatCard[]>(() => {
return [
stat('本院科室数', numberText(summary.dept_count), '当前机构', 'blue'),
stat('带教老师数', numberText(summary.doctor_count), '医生用户', 'green'),
stat('带教医生数', numberText(summary.doctor_count), '带教医生用户', 'green'),
stat('本院学员数', numberText(summary.student_count), '学生用户', 'purple'),
stat('累计训练次数', numberText(summary.train_total), '本院训练', 'blue'),
stat('训练完成率', percentText(summary.complete_rate), '完成训练占比', 'orange'),
+17 -2
View File
@@ -76,7 +76,7 @@
<el-row :gutter="14">
<el-col :span="12">
<el-form-item label="机构编码" prop="code">
<el-input v-model="institutionForm.code" placeholder="请输入机构编码" />
<el-input v-model="institutionForm.code" placeholder="例如:BJXH2026" />
</el-form-item>
</el-col>
<el-col :span="12">
@@ -86,7 +86,9 @@
</el-col>
<el-col :span="12">
<el-form-item label="等级" prop="level">
<el-input v-model="institutionForm.level" placeholder="例如:三甲、二甲" />
<el-select v-model="institutionForm.level" clearable filterable placeholder="请选择医院等级">
<el-option v-for="item in hospitalLevelOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
@@ -239,6 +241,19 @@ const institutionForm = reactive({
bannerUrl: ''
})
const hospitalLevelOptions = [
'三级甲等',
'三级乙等',
'三级丙等',
'二级甲等',
'二级乙等',
'二级丙等',
'一级甲等',
'一级乙等',
'一级丙等',
'未定级'
]
const provinceOptions = [
{ name: '北京市', cities: ['北京市'] },
{ name: '天津市', cities: ['天津市'] },
+2 -2
View File
@@ -124,8 +124,8 @@ const form = reactive({
const rows = ref<KnowledgeBaseItem[]>([
{ id: 'KB-202606-001', name: '胸痛中心诊疗指南库', category: '临床指南', owner: '王内容', fileCount: 8, updatedAt: '2026-06-05', status: '已发布' },
{ id: 'KB-202606-002', name: '儿科发热问诊课件', category: '教学课件', owner: '李医生', fileCount: 5, updatedAt: '2026-06-03', status: '整理中' },
{ id: 'KB-202605-029', name: '糖尿病慢病随访规范', category: '诊疗规范', owner: '陈医生', fileCount: 12, updatedAt: '2026-05-28', status: '已发布' },
{ id: 'KB-202606-002', name: '儿科发热问诊课件', category: '教学课件', owner: '李带教', fileCount: 5, updatedAt: '2026-06-03', status: '整理中' },
{ id: 'KB-202605-029', name: '糖尿病慢病随访规范', category: '诊疗规范', owner: '陈带教', fileCount: 12, updatedAt: '2026-05-28', status: '已发布' },
{ id: 'KB-202605-017', name: '神经内科病例资料包', category: '病例资料', owner: '王内容', fileCount: 3, updatedAt: '2026-05-21', status: '草稿' }
])
+1 -1
View File
@@ -79,7 +79,7 @@ const loginRoleOptions: Array<{ label: string; value: LoginRole }> = [
{ label: '超级管理员', value: 'super_admin' },
{ label: '医院管理员', value: 'hospital_admin' },
{ label: '内容管理员', value: 'content_admin' },
{ label: '医生', value: 'doctor' }
{ label: '带教医生', value: 'doctor' }
]
const features = [
+4 -4
View File
@@ -194,7 +194,7 @@ const aiRows = [
const auditRows = [
{ time: '06-03 13:42', user: '张管理员', action: '更新 AI 评分策略', result: '成功' },
{ time: '06-03 11:08', user: '王内容', action: '提交病例审核', result: '成功' },
{ time: '06-02 19:26', user: '李医生', action: '导出训练报告', result: '成功' }
{ time: '06-02 19:26', user: '李带教', action: '导出训练报告', result: '成功' }
]
const lineOption = computed<EChartsOption>(() => ({
@@ -291,7 +291,7 @@ function inferTableTitle(currentPage: string) {
if (currentPage.includes('department') || currentPage.includes('dept')) return '科室名称'
if (currentPage.includes('training')) return '训练任务'
if (currentPage.includes('student')) return '学生姓名'
if (currentPage.includes('doctor') || currentPage.includes('teacher')) return '医生姓名'
if (currentPage.includes('doctor') || currentPage.includes('teacher')) return '带教医生姓名'
return '名称'
}
@@ -306,9 +306,9 @@ function inferPrimaryAction(currentPage: string) {
function createRows(title: string) {
return [
{ id: 'M-202606-001', name: `${title}核心数据维护`, category: '方正中心医院', owner: '张管理员', metric: '1,286', status: '正常' },
{ id: 'M-202606-002', name: `${title}待审核任务`, category: '心内科', owner: '李医生', metric: '86%', status: '待审核' },
{ id: 'M-202606-002', name: `${title}待审核任务`, category: '心内科', owner: '李带教', metric: '86%', status: '待审核' },
{ id: 'M-202606-003', name: `${title}专题内容包`, category: '教学运营部', owner: '王内容', metric: '342', status: '已发布' },
{ id: 'M-202606-004', name: `${title}试点项目`, category: '南城社区医院', owner: '陈医生', metric: '73%', status: '正常' }
{ id: 'M-202606-004', name: `${title}试点项目`, category: '南城社区医院', owner: '陈带教', metric: '73%', status: '正常' }
]
}
+2 -2
View File
@@ -254,9 +254,9 @@ function bounded(value: number | null | undefined) {
function roleLabel(role: string) {
const labels: Record<string, string> = {
super_admin: '超级管理员',
doctor: '医生',
doctor: '带教医生',
student: '学生',
teacher: '带教老师',
teacher: '带教医生',
content_admin: '内容管理员',
hospital_admin: '医院管理员'
}
+2 -2
View File
@@ -244,12 +244,12 @@ const resetPasswordForm = reactive({
})
const roleOptions: Array<{ label: string; value: ManagedRoleType }> = [
{ label: '医生', value: 'doctor' },
{ label: '带教医生', value: 'doctor' },
{ label: '医学生', value: 'student' },
{ label: '内容管理员', value: 'content_admin' }
]
const pageConfigs: Record<ManagedRoleType, { title: string; description: string }> = {
doctor: { title: '医生管理', description: '维护本院医生和内容管理员账号,支持查询、导入导出、启停和密码重置。' },
doctor: { title: '带教医生管理', description: '维护本院带教医生和内容管理员账号,支持查询、导入导出、启停和密码重置。' },
student: { title: '医学生管理', description: '维护本院医学生账号,支持查询、导入导出、启停和密码重置。' },
content_admin: { title: '内容管理员', description: '维护本院内容管理员账号,支持查询、导入导出、启停和密码重置。' }
}
+1 -1
View File
@@ -283,7 +283,7 @@ const resetPasswordForm = reactive({
})
const roleTypeOptions = [
{ label: '医生 doctor', value: 'doctor' },
{ label: '带教医生 doctor', value: 'doctor' },
{ label: '医学生 student', value: 'student' },
{ label: '超级管理员 super_admin', value: 'super_admin' },
{ label: '医院管理员 hospital_admin', value: 'hospital_admin' },