- 新增手术室类型字段支持急诊、择期、日间、复合手术室四种类型 - 添加所属科室字段实现科室级别资源管理 - 前端列表页面新增类型和所属科室显示列 - 新增类型选择器和科室选择器组件 - 后端实体类和服务类添加对应字段处理逻辑 - 数据库添加room_type_enum字段和相关索引 - 创建手术室类型字典数据和字典项配置 - 生成手术室管理功能说明文档
216 lines
6.4 KiB
Markdown
216 lines
6.4 KiB
Markdown
# 手术申请医生科室字段保存问题解决方案
|
||
|
||
## 问题确认
|
||
数据库中只保存了 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. **错误信息**:如果有任何错误提示
|