Files
his/md/手术人员字段不显示问题解决方案.md
chenqi cb268fe26d feat(operating-room): 添加手术室类型和所属科室字段
- 新增手术室类型字段支持急诊、择期、日间、复合手术室四种类型
- 添加所属科室字段实现科室级别资源管理
- 前端列表页面新增类型和所属科室显示列
- 新增类型选择器和科室选择器组件
- 后端实体类和服务类添加对应字段处理逻辑
- 数据库添加room_type_enum字段和相关索引
- 创建手术室类型字典数据和字典项配置
- 生成手术室管理功能说明文档
2026-01-13 10:03:57 +08:00

255 lines
6.7 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.

# 手术人员字段不显示问题解决方案
## 问题描述
主刀医生、麻醉医生、助手1、助手2、执行科这些字段在手术查看页面中没有显示数据。
## 问题原因
这些字段在数据库中可能为 **null 或空值**,虽然保存了 ID`main_surgeon_id`),但没有保存对应的姓名(如 `main_surgeon_name`)。
## 解决步骤
### 步骤 1检查数据库中字段的实际值
执行以下 SQL 查看当前数据:
```sql
SELECT
id,
surgery_no,
main_surgeon_id,
main_surgeon_name,
anesthetist_id,
anesthetist_name,
assistant_1_id,
assistant_1_name,
assistant_2_id,
assistant_2_name,
operating_room_id,
operating_room_name,
org_id,
org_name
FROM public.cli_surgery
WHERE delete_flag = '0'
ORDER BY create_time DESC
LIMIT 5;
```
**请告诉我结果**:特别是 `main_surgeon_name``anesthetist_name``assistant_1_name``assistant_2_name``operating_room_name``org_name` 这些字段的值。
### 步骤 2检查用户表结构
执行以下 SQL 查看用户表的结构:
```sql
SELECT
column_name,
data_type
FROM information_schema.columns
WHERE table_name = 'sys_user'
AND column_name IN ('user_id', 'nick_name', 'user_name', 'practitioner_id')
ORDER BY column_name;
```
**目的**确定人员ID和姓名的对应关系。
### 步骤 3填充人员姓名字段推荐方法
使用以下 SQL 脚本填充人员姓名:
```sql
-- 填充主刀医生姓名
UPDATE public.cli_surgery s
SET main_surgeon_name = u.nick_name
FROM public.sys_user u
WHERE s.main_surgeon_id = u.user_id
AND s.main_surgeon_name IS NULL
AND s.delete_flag = '0';
-- 填充麻醉医生姓名
UPDATE public.cli_surgery s
SET anesthetist_name = u.nick_name
FROM public.sys_user u
WHERE s.anesthetist_id = u.user_id
AND s.anesthetist_name IS NULL
AND s.delete_flag = '0';
-- 填充助手1姓名
UPDATE public.cli_surgery s
SET assistant_1_name = u.nick_name
FROM public.sys_user u
WHERE s.assistant_1_id = u.user_id
AND s.assistant_1_name IS NULL
AND s.delete_flag = '0';
-- 填充助手2姓名
UPDATE public.cli_surgery s
SET assistant_2_name = u.nick_name
FROM public.sys_user u
WHERE s.assistant_2_id = u.user_id
AND s.assistant_2_name IS NULL
AND s.delete_flag = '0';
-- 填充手术室名称
UPDATE public.cli_surgery s
SET operating_room_name = r.name
FROM public.cli_operating_room r
WHERE s.operating_room_id = r.id
AND s.operating_room_name IS NULL
AND s.delete_flag = '0';
-- 填充执行科室名称
UPDATE public.cli_surgery s
SET org_name = o.name
FROM public.adm_organization o
WHERE s.org_id = o.id
AND s.org_name IS NULL
AND s.delete_flag = '0';
```
### 步骤 4验证更新结果
执行以下 SQL 验证是否更新成功:
```sql
SELECT
id,
surgery_no,
main_surgeon_id,
main_surgeon_name,
anesthetist_id,
anesthetist_name,
assistant_1_id,
assistant_1_name,
assistant_2_id,
assistant_2_name,
operating_room_id,
operating_room_name,
org_id,
org_name
FROM public.cli_surgery
WHERE delete_flag = '0'
ORDER BY create_time DESC
LIMIT 5;
```
**预期结果**:所有 `*_name` 字段都应该有值。
### 步骤 5刷新前端页面
1. 刷新手术管理页面
2. 点击某个手术记录的"查看"按钮
3. 检查详情对话框中是否显示这些字段
## 前端代码检查
### 1. 检查详情对话框显示
打开 `surgerymanage/index.vue` 文件,查看详情对话框部分:
```vue
<el-descriptions-item label="主刀医生">{{ viewData.mainSurgeonName }}</el-descriptions-item>
<el-descriptions-item label="麻醉医生">{{ viewData.anesthetistName }}</el-descriptions-item>
<el-descriptions-item label="助手1">{{ viewData.assistant1Name }}</el-descriptions-item>
<el-descriptions-item label="助手2">{{ viewData.assistant2Name }}</el-descriptions-item>
<el-descriptions-item label="手术室">{{ viewData.operatingRoomName }}</el-descriptions-item>
<el-descriptions-item label="执行科室">{{ viewData.orgName }}</el-descriptions-item>
```
**确认**:这些字段名是否正确(注意驼峰命名)。
### 2. 检查浏览器控制台
1. 打开浏览器开发者工具F12
2. 切换到 Console 标签
3. 点击"查看"按钮
4. 查看是否有 JavaScript 错误
### 3. 检查 Network 响应
1. 切换到 Network 标签
2. 点击"查看"按钮
3. 找到 `/clinical-manage/surgery/surgery-detail` 请求
4. 查看响应内容
**检查**:响应数据中是否包含这些字段,值是什么。
## 常见问题
### 问题 1UPDATE SQL 执行失败
**症状**:报错 "relation does not exist" 或 "column does not exist"
**解决**
1. 检查表名是否正确sys_user 或 adm_practitioner
2. 检查字段名是否正确user_id 或 practitioner_id
### 问题 2UPDATE 后字段仍为 null
**症状**UPDATE 执行成功,但字段仍为 null
**原因**:关联表中没有对应的记录
**解决**检查人员ID是否存在于人员表中
```sql
-- 检查主刀医生ID是否存在
SELECT s.main_surgeon_id, u.nick_name
FROM public.cli_surgery s
LEFT JOIN public.sys_user u ON s.main_surgeon_id = u.user_id
WHERE s.main_surgeon_id IS NOT NULL
AND u.user_id IS NULL
LIMIT 5;
```
### 问题 3前端仍然不显示
**症状**:数据库中有值,但前端不显示
**原因**
1. 前端字段名不匹配
2. 前端数据绑定有问题
**解决**
1. 检查 MyBatis XML 映射是否正确
2. 检查后端返回的 JSON 数据结构
3. 检查前端变量名是否正确
## 后续改进建议
### 1. 保存时自动填充姓名
在前端或后端保存手术信息时根据选择的医生ID自动查询并填充姓名字段。
### 2. 提供人员选择功能
在前端提供医生、科室等选择下拉框而不是手动输入ID。
### 3. 添加数据完整性校验
在保存前检查如果选择了人员ID必须填充对应的姓名字段。
## 相关文件
1. **检查和填充脚本**`e:/his/检查和填充手术人员字段.sql`
2. **填充脚本**`e:/his/填充手术人员字段姓名.sql`
3. **MyBatis 映射**`e:/his/openhis-server-new/openhis-application/src/main/resources/mapper/clinicalmanage/SurgeryMapper.xml`
## 验证清单
- [ ] 数据库查询显示字段为 null
- [ ] 执行了填充 SQL 脚本
- [ ] 验证更新后字段有值
- [ ] 刷新前端页面
- [ ] 详情对话框中正确显示
## 联系支持
如果以上步骤都无法解决问题,请提供:
1. **步骤 1 的查询结果**:当前数据库中这些字段的值
2. **步骤 2 的查询结果**sys_user 表的结构
3. **UPDATE SQL 执行结果**:是否有错误,更新了多少条记录
4. **步骤 4 的验证结果**:更新后的字段值
5. **浏览器控制台错误**:是否有 JavaScript 错误
6. **Network 响应数据**:后端返回的完整数据