前言阶段七把住院桥接与智能辅助 UI 收成可演示闭环。阶段八转向门诊侧数据可信度与档案治理开放医疗数据导入后医生/患者分布失衡、演示账号缺少实习 、 假期 、 停职等真实场景删除医生档案时患者病历里的接诊医生会消失列表默认排序把停职案例 but 案例挤到末页看不见删除接口还因 Pydantic 字段别名报 ValidationError。本阶段做四件事演示数据管线与再平衡、在班状态与预约门控、档案列表体验与锁定规则、删除拦截 病历医生姓名快照。不新增菜单核心是工具脚本、服务层校验、ORM/SQL 增量与前端表格/抽屉微调。下文按「问题—根因—改法—联调与踩坑」写并标注建议配图位置。目录仅供提示背景与阶段八目标开放数据导入与门诊再平衡特殊医师种子实习 / 假期 / 停职在班状态与患者预约门控档案列表默认排序与停职可见性档案修改权限谁可以改、谁只读删除医生档案ValidationError 与临床引用拦截病历接诊医生追溯姓名快照与多级回退增量 SQL 与脚本清单本地验证与踩坑结语与下阶段排期1. 背景与阶段八目标业务上 带教演示需要实习跟师、假期不可约、停职冻结档案、患者病历永远能查到接诊医生。若停职账号藏在列表最后一页、或删档案后病历医生列空白演示说服力会大打折扣。工程上模块关键路径数据导入scripts/clinical_import/pipeline.py医生再平衡scripts/rebalance_clinic_doctors.py时间线美化scripts/realistic_case_timeline.py特殊医师种子scripts/seed_intern_doctors.py在班工具module_clinic/utils/doctor_duty_util.py列表排序module_clinic/utils/list_sort_util.py姓名解析module_clinic/utils/doctor_display_util.py删除拦截med_clinic_doctor_service.py病历快照med_case_service.pymed_case_do.py增量 SQLupgrade_doctor_clinic_status.sql、upgrade_med_case_doctor_name_snapshot.sql本阶段交付项验收方式开放数据导入pipeline.py import-clinical可写入病历/知识库医生患者均衡再平衡脚本后各科室医生均有病例、患者特殊账号6 实习 2 假期 2 停职密码admin123在班门控停职/假期/离院不可预约实习默认可约列表排序医生在班→状态→科室→专家→姓名患者最近就诊→更新时间停职可见末页自动滚动 「仅看停用」快捷筛选档案锁定停用/离院/暂停执业只读假期/实习可改删除拦截有病历/处方/预约则拒绝删除提示改用停用医生追溯病历doctor_name快照 列表/导出/抽屉展示2. 开放数据导入与门诊再平衡2.1 现象a. 导入开放数据集后病历集中在少数账号如doctor_wang其他科室医生列表空荡。b. 就诊时间扎堆同一天现病史像模板填空不像真实门诊节奏。c. 演示时切换医生账号候诊/我的患者对不上。2.2 根因CPMI / 天池等开放数据未与本地med_clinic_doctor映射缺少分科室建号与病例再分配脚本就诊日未打散。2.3 改法导入流水线scripts/clinical_import/命令说明pipeline.py verify检查数据源与 DB 连通import-kb知识库 QA 入库import-clinical --limit N病历导入支持 cpmi / tianchi / autopurge清除带 SEED 标签的导入数据再平衡rebalance_clinic_doctors.py按科室批量创建doctor_{dept}{nn}账号将病历、患者归属从 admin/legacy 账号迁出支持--dry-run、--max-per-doctor控制每医生病例上限时间线realistic_case_timeline.py就诊日分散到近 4 个月工作日补全现病史问诊叙述normalize.enrich_consultation_narrative上图仅作部分展示。3. 特殊医师种子实习 / 假期 / 停职3.1 现象需要演示「实习跟师可接诊」「假期不可约」「停职档案冻结」但不想改动原有 40 名正常医生。3.2 改法scripts/seed_intern_doctors.py独立新增 10 个账号不改旧数据类型登录名示例status说明实习doctor_sx_nk01…26 人多科室假期doctor_hj_fk01…32 人停职doctor_ty_wk01…12 人人事状态employment_status保持0在职仅用出诊状态区分场景脚本可 补建曾被误删的档案并恢复误改为停用的旧账号RESTORE_NORMAL_USER_IDS统一密码admin1234. 在班状态与患者预约门控4.1 现象a. 停职/假期医生仍出现在患者端可预约列表。b. 患者选到「石停」医生后挂号成功与业务规则矛盾。c. 列表「在班」列含义不清。4.2 根因仅有med_clinic_doctor.status未统一「当日是否在班」预约/挂号入口未校验。4.3 改法doctor_duty_util.py编码约定字段值含义onDutyStatus0在班默认onDutyStatus1不在班status0/1/2/3正常 / 停用 / 实习 / 假期resolve_doctor_duty规则停用、离院、暂停执业、假期 →1不在班实习 → 默认0在班跟师独立出诊以后续排班为准当日排班stop_flag1→ 不在班排班未完善时正常在职默认在班预约门控assert_doctor_bookable接入入口文件患者选医生patient_service.py患者 DAO 列表过滤patient_dao.pyis_doctor_permanently_unavailable长期不可约门诊预约med_clinic_appointment_service.py现场挂号med_outpatient_registration_service.py不在班时统一ServiceException(该医生当前不可预约假期中/档案已停用/…)图中可以看出来不在班和实习的不会被列为可被挂号的医生5. 档案列表默认排序与停职可见性5.1 现象停职演示账号在默认排序下排在最后一页表格max-height固定不滚动以为「种子没生效」。5.2 改法后端list_sort_util.py医生列表不在班靠后正常 → 实习 → 停用 → 假期停用排在假期前便于演示科室 → 专家号 → sort_num → 姓名SQL 粗排 enrich后sort_doctor_rows按onDutyStatus精排当前页。患者列表医生「我的患者」最近就诊日 ↓ → 档案更新时间 ↓ → 姓名 ↑管理员全院正常档案优先 → 同上前端clinic/doctor/index.vue元素行为el-alert提示停职在末页需滚动快捷链接「仅看停用/停职」「仅看假期」「仅看实习」el-scrollbar max-height62vh表单区加高scrollTableIfLastPage()末页加载后scrollTop scrollHeight6. 档案修改权限谁可以改、谁只读6.1 现象停职医生仍能提交档案变更申请假期医生却被误锁无法改联系电话。6.2 改法is_doctor_profile_locked仅在以下情况锁定条件锁定status 1停用✅employment_status 1离院✅employment_status 2暂停执业✅status 3假期❌ 可改status 2实习❌ 可改前端myProfile.vueprofileLocked时隐藏「提交变更」、展示el-alertdoctor/index.vue管理端编辑锁定档案表单项disabled描述「停用/离院/暂停执业不可修改档案…」这个不好做展示就不贴图了。7. 删除医生档案ValidationError 与临床引用拦截7.1 现象a. 批量删除医生报ValidationError: doctorProfileIds field required。b. 删除有 hundreds 条病历的医生后患者档案抽屉「接诊医生」列空白。c. 用户以为「删档案 离职」实际应「停用」。7.2 根因DeleteMedClinicDoctorModel未开populate_by_name前端 camelCase 无法反序列化病历存doctor_id用户 ID展示 joinmed_clinic_doctor取姓名档案删则 join 失败删除前未统计临床引用7.3 改法VO 修复class DeleteMedClinicDoctorModel(BaseModel):model_config ConfigDict(alias_generatorto_camel, populate_by_nameTrue)doctor_profile_ids: str # 逗号分隔删除前校验delete_services统计 user_id 关联 → 病历 处方 预约若 total 0 → ServiceException「该医生存在临床业务记录病历 N 条、…不可删除…请改用停用或离院」前端确认文案若该医生存在病历/处方/预约记录系统将拒绝删除并提示改用「停用」。8. 病历接诊医生追溯姓名快照与多级回退8.1 设计原则层级策略预防有临床记录禁止物理删档案落库病历写入时冻结doctor_name展示快照 → 档案 → 用户 →历史医生(uid)8.2 表结构与 ORMmed_case新增doctor_name VARCHAR(64) NULL COMMENT 接诊医生姓名快照落库时冻结档案删除后仍可追溯ORMmed_case_do.py、med_case_vo.py同步字段。回填脚本mysql ... sql/patient/upgrade_med_case_doctor_name_snapshot.sql# 或python scripts/apply_med_case_doctor_name.py本地验证回填 280 条历史病历。8.3 服务层时机逻辑新建/编辑病历_apply_doctor_snapshot写当前医生姓名列表/分页_enrich_case_list_rows批量解析doctorName详情无快照时resolve_doctor_display_name回退快照与档案不一致附加doctorNameHint「姓名以病历快照为准…」doctor_display_util.py解析顺序med_clinic_doctor.doctor_namesys_user.nick_name/user_name历史医生({uid})8.4 前端与导出位置变更PatientCaseHistory.vue新增列「接诊医生」med_case_export_service.pyWord/PDF 元数据增加「接诊医生」「接诊医生用户ID」9. 增量 SQL 与脚本清单cd ruoyi-fastapi-backend# 出诊状态字段注释0正常 1停用 2实习 3假期mysql -u root -p ry-fastapi sql/patient/upgrade_doctor_clinic_status.sql# 病历医生姓名快照 历史回填mysql -u root -p ry-fastapi sql/patient/upgrade_med_case_doctor_name_snapshot.sql# 特殊医师不改原医生python scripts/seed_intern_doctors.py# 可选数据再平衡与时间线python scripts/rebalance_clinic_doctors.pypython scripts/realistic_case_timeline.py脚本用途clinical_import/pipeline.py开放数据导入主入口rebalance_clinic_doctors.py分科建号 病例均衡realistic_case_timeline.py就诊日打散 叙述补全seed_intern_doctors.py实习/假期/停职种子apply_med_case_doctor_name.py幂等加列 回填audit_clinic_data.py导入后数据审计可选演示账号速查密码admin123账号场景doctor_sx_*实习可预约doctor_hj_*假期不可预约doctor_ty_*停职档案锁定不可预约10. 本地验证与踩坑10.1 推荐验证顺序跑upgrade_doctor_clinic_status.sqlupgrade_med_case_doctor_name_snapshot.sqlseed_intern_doctors.py→ 医生列表应 ≥ 50 条「仅看停用」→ 见 2 条停职账号患者端预约选正常医生成功选停职/假期失败患者档案抽屉 → 就诊记录有「接诊医生」删除有病历医生 → 业务拦截改 status停用 → 成功导出病历 → 含接诊医生字段重启后端使 ORM 新列doctor_name生效10.2 踩坑现象原因处理删除报 ValidationErrorVO 未populate_by_name已修复强刷前端1054 Unknown columndoctor_name未跑快照 SQL跑迁移或apply_med_case_doctor_name.py停职账号「找不到」默认排序在末页点「仅看停用」或滚到底删档案后医生列空白旧数据无快照跑回填新病历自动写快照PowerShell 内联 Python 引号错转义问题用独立.py脚本执行 SQL假期账号不能改档案误用旧锁定逻辑确认仅停用/离院/暂停执业锁定列表在班与预约不一致SQL 粗排不含当日排班以assert_doctor_bookable为准11. 结语与下阶段规划阶段八在不加菜单的前提下把门诊演示数据和档案治理规则补全导入与再平衡让.wh 让多科室有料可讲实习/假期/停职种子 在班门控让预约规则可演示列表排序与快捷筛选让特殊账号不再「隐身」删除拦截 病历doctor_name快照让患者历史永远能追到接诊医生。本篇未做 处方表doctor_name快照、排班表驱动工作台候诊、全量ry_fastapi.sql合并新列、删除 sys_user 级联策略。下阶段计划1.处方/预约展示层同样落姓名快照2.排班写入工作台「按日候诊」Tab3.智能辅助流式输出阶段七遗留4.全量 SQL 与 ORM 扫描脚本纳入 CI