Files
his/手术申请医生科室字段保存问题解决方案.md
chenqi b0850257c8 feat(surgery): 完善手术管理功能模块
- 添加手术申请相关API接口,包括根据患者ID查询就诊列表功能
- 在医生工作站界面集成手术申请功能选项卡
- 实现手术管理页面的完整功能,包括手术申请的增删改查
- 添加手术排期、开始、完成等状态流转功能
- 优化手术管理页面表格展示,增加手术类型、等级、计划时间等字段
- 实现手术申请表单的完整编辑和查看模式
- 集成患者信息和就诊记录关联功能
- 添加手术室、医生、护士等资源选择功能
- 更新系统依赖配置,添加core-common模块
- 优化图标资源和manifest配置文件
- 调整患者档案和门诊记录相关状态枚举
2026-01-06 16:23:15 +08:00

216 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 手术申请医生科室字段保存问题解决方案
## 问题确认
数据库中只保存了 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. **错误信息**:如果有任何错误提示