# 手术申请医生科室字段保存问题解决方案 ## 问题确认 数据库中只保存了 ID 字段(`apply_doctor_id`、`apply_dept_id`),但没有保存名称字段(`apply_doctor_name`、`apply_dept_name`)。 ## 根本原因 **数据库表中缺少 `apply_doctor_name` 和 `apply_dept_name` 这两个字段!** 虽然 MyBatis 映射文件和实体类都配置了这些字段,但如果数据库表中不存在这些列,MyBatis 在插入时会静默忽略这些字段(不会报错),导致只有 ID 被保存。 ## 解决步骤 ### 步骤 1:执行数据库迁移脚本(必须!) 使用 Navicat Premium 17 执行以下 SQL: ```sql -- 方法1:使用 IF NOT EXISTS 语法(推荐) ALTER TABLE public.cli_surgery ADD COLUMN IF NOT EXISTS apply_doctor_name VARCHAR(100); COMMENT ON COLUMN public.cli_surgery.apply_doctor_name IS '申请医生姓名'; ALTER TABLE public.cli_surgery ADD COLUMN IF NOT EXISTS apply_dept_name VARCHAR(100); COMMENT ON COLUMN public.cli_surgery.apply_dept_name IS '申请科室名称'; -- 验证字段是否添加成功 SELECT column_name, data_type, character_maximum_length FROM information_schema.columns WHERE table_name = 'cli_surgery' AND column_name IN ('apply_doctor_name', 'apply_dept_name'); ``` **预期结果**: ``` apply_doctor_name | character varying | 100 apply_dept_name | character varying | 100 ``` ### 步骤 2:重启后端服务 执行数据库迁移后,必须重启后端服务以重新加载表结构。 ### 步骤 3:新增手术并查看日志 1. 打开后端控制台或日志文件 2. 在前端新增一条手术记录 3. 查看后端日志,应该能看到: ``` 设置申请医生信息 - doctorId: 123, doctorName: 张医生, deptId: 456, deptName: 普外科 前端提交的数据 - applyDoctorId: 123, applyDoctorName: 张医生, applyDeptId: 456, applyDeptName: 普外科 准备插入手术记录 - applyDoctorId: 123, applyDoctorName: 张医生, applyDeptId: 456, deptName: 普外科 准备插入手术记录 - applyDoctorId: 123, applyDoctorName: 张医生, applyDeptId: 456, deptName: 普外科 插入后查询结果 - applyDoctorId: 123, applyDoctorName: 张医生, applyDeptId: 456, deptName: 普外科 手术记录插入成功 - surgeryId: 1234567890123456789, surgeryNo: OP202501051234 ``` **关键检查点**: - `准备插入手术记录` 这行日志中,`applyDoctorName` 和 `applyDeptName` 必须有值(不能为 null) - `插入后查询结果` 这行日志中,这两个字段也必须有值 ### 步骤 4:验证数据库 执行以下 SQL 查询最新插入的记录: ```sql SELECT id, surgery_no, apply_doctor_id, apply_doctor_name, apply_dept_id, apply_dept_name, surgery_name, create_time FROM public.cli_surgery WHERE delete_flag = '0' ORDER BY create_time DESC LIMIT 1; ``` **预期结果**: - `apply_doctor_id`:有值(例如:123) - `apply_doctor_name`:有值(例如:张医生) - `apply_dept_id`:有值(例如:456) - `apply_dept_name`:有值(例如:普外科) ### 步骤 5:测试前端显示 1. 刷新手术管理页面 2. 查看列表中是否显示申请医生和申请科室列 3. 点击"查看"或"编辑"按钮,检查详情对话框是否显示这些信息 ## 常见问题和解决 ### 问题 1:执行 SQL 后报错 "column does not exist" **原因**:数据库表结构可能不同,或者表名不是 `cli_surgery` **解决**:先执行以下 SQL 检查表名: ```sql SELECT table_name FROM information_schema.tables WHERE table_name LIKE '%surgery%' AND table_schema = 'public'; ``` ### 问题 2:执行 SQL 后字段仍然不存在 **原因**:可能是权限问题或 SQL 语法问题 **解决**:尝试使用更简单的方式: ```sql -- 先检查表结构 \d public.cli_surgery -- 手动添加字段(如果不存在) -- 注意:如果字段已存在,这个语句会报错,这是正常的 ALTER TABLE public.cli_surgery ADD COLUMN apply_doctor_name VARCHAR(100); ALTER TABLE public.cli_surgery ADD COLUMN apply_dept_name VARCHAR(100); ``` ### 问题 3:字段添加成功,但插入时仍然为空 **原因**:MyBatis 或 MyBatis-Plus 配置问题 **解决**: 1. 检查实体类字段是否有 `@TableField` 注解 2. 检查字段名是否与数据库列名一致 3. 查看后端日志中的 `插入后查询结果` ### 问题 4:后端日志显示字段为 null **原因**:后端代码中 `applyDoctorName` 或 `applyDeptName` 被设置为 null **解决**: 1. 检查 `SecurityUtils.getLoginUser().getUser().getNickName()` 是否返回 null 2. 检查 `SecurityUtils.getLoginUser().getOrgId()` 是否返回 null 3. 检查 `organizationService.getById(orgId)` 是否返回 null ## 验证清单 - [ ] 数据库迁移脚本已执行 - [ ] 数据库字段已添加(步骤 1 验证 SQL 有结果) - [ ] 后端服务已重启 - [ ] 后端日志显示 `准备插入手术记录` 且字段有值 - [ ] 后端日志显示 `插入后查询结果` 且字段有值 - [ ] 数据库查询显示字段有值(步骤 4) - [ ] 前端列表正确显示 - [ ] 前端详情正确显示 ## 调试 SQL 脚本 如果需要手动测试插入功能,可以执行: ```sql -- 测试插入(确保字段存在) INSERT INTO public.cli_surgery ( surgery_no, patient_id, encounter_id, apply_doctor_id, apply_doctor_name, apply_dept_id, apply_dept_name, surgery_name, status_enum, delete_flag, create_time, update_time ) VALUES ( 'TEST202501050002', (SELECT id FROM public.adm_patient WHERE delete_flag = '0' LIMIT 1), (SELECT id FROM public.adm_encounter WHERE delete_flag = '0' LIMIT 1), 999, '手动测试医生', 999, '手动测试科室', '手动测试手术', 0, '0', NOW(), NOW() ); -- 查询刚才插入的数据 SELECT surgery_no, apply_doctor_id, apply_doctor_name, apply_dept_id, apply_dept_name, surgery_name FROM public.cli_surgery WHERE surgery_no = 'TEST202501050002'; -- 清理测试数据 -- DELETE FROM public.cli_surgery WHERE surgery_no = 'TEST202501050002'; ``` ## 联系支持 如果以上步骤都无法解决问题,请提供: 1. **数据库表结构查询结果**: ```sql \d public.cli_surgery ``` 2. **后端日志**:特别是 `准备插入手术记录` 和 `插入后查询结果` 这两行 3. **数据库查询结果**:执行步骤 4 中的 SQL,告诉我结果 4. **错误信息**:如果有任何错误提示