- 新增手术室类型字段支持急诊、择期、日间、复合手术室四种类型 - 添加所属科室字段实现科室级别资源管理 - 前端列表页面新增类型和所属科室显示列 - 新增类型选择器和科室选择器组件 - 后端实体类和服务类添加对应字段处理逻辑 - 数据库添加room_type_enum字段和相关索引 - 创建手术室类型字典数据和字典项配置 - 生成手术室管理功能说明文档
6.4 KiB
6.4 KiB
手术申请医生科室字段保存问题解决方案
问题确认
数据库中只保存了 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:
-- 方法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:新增手术并查看日志
- 打开后端控制台或日志文件
- 在前端新增一条手术记录
- 查看后端日志,应该能看到:
设置申请医生信息 - 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 查询最新插入的记录:
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:执行 SQL 后报错 "column does not exist"
原因:数据库表结构可能不同,或者表名不是 cli_surgery
解决:先执行以下 SQL 检查表名:
SELECT table_name
FROM information_schema.tables
WHERE table_name LIKE '%surgery%'
AND table_schema = 'public';
问题 2:执行 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 配置问题
解决:
- 检查实体类字段是否有
@TableField注解 - 检查字段名是否与数据库列名一致
- 查看后端日志中的
插入后查询结果
问题 4:后端日志显示字段为 null
原因:后端代码中 applyDoctorName 或 applyDeptName 被设置为 null
解决:
- 检查
SecurityUtils.getLoginUser().getUser().getNickName()是否返回 null - 检查
SecurityUtils.getLoginUser().getOrgId()是否返回 null - 检查
organizationService.getById(orgId)是否返回 null
验证清单
- 数据库迁移脚本已执行
- 数据库字段已添加(步骤 1 验证 SQL 有结果)
- 后端服务已重启
- 后端日志显示
准备插入手术记录且字段有值 - 后端日志显示
插入后查询结果且字段有值 - 数据库查询显示字段有值(步骤 4)
- 前端列表正确显示
- 前端详情正确显示
调试 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';
联系支持
如果以上步骤都无法解决问题,请提供:
-
数据库表结构查询结果:
\d public.cli_surgery -
后端日志:特别是
准备插入手术记录和插入后查询结果这两行 -
数据库查询结果:执行步骤 4 中的 SQL,告诉我结果
-
错误信息:如果有任何错误提示