# 手术申请医生科室数据保存问题排查指南
## 问题现象
新增手术后,列表页面和编辑查看页面没有显示申请医生名称和科室名称。
## 排查步骤
### 步骤1:检查数据库字段是否存在
执行以下 SQL 检查字段是否已添加:
```sql
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = 'cli_surgery'
AND column_name IN ('apply_doctor_name', 'apply_dept_name');
```
**预期结果**:应该返回两条记录
```
apply_doctor_name | character varying
apply_dept_name | character varying
```
**如果结果为空**:说明字段未添加,需要执行迁移脚本。
### 步骤2:检查数据库迁移脚本是否执行
执行迁移脚本(如果未执行):
```sql
-- 检查并添加申请医生姓名字段
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_name = 'cli_surgery'
AND column_name = 'apply_doctor_name'
) THEN
ALTER TABLE public.cli_surgery ADD COLUMN apply_doctor_name VARCHAR(100);
COMMENT ON COLUMN public.cli_surgery.apply_doctor_name IS '申请医生姓名';
END IF;
END $$;
-- 检查并添加申请科室名称字段
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_name = 'cli_surgery'
AND column_name = 'apply_dept_name'
) THEN
ALTER TABLE public.cli_surgery ADD COLUMN apply_dept_name VARCHAR(100);
COMMENT ON COLUMN public.cli_surgery.apply_dept_name IS '申请科室名称';
END IF;
END $$;
```
### 步骤3:重启后端服务
执行数据库迁移后,必须重启后端服务。
### 步骤4:新增手术并查看后端日志
1. 打开后端控制台或日志文件
2. 在前端新增一条手术记录
3. 查看后端日志,应该能看到以下信息:
```
设置申请医生信息 - doctorId: 123, doctorName: 张医生, deptId: 456, deptName: 普外科
前端提交的数据 - applyDoctorId: 123, applyDoctorName: 张医生, applyDeptId: 456, applyDeptName: 普外科
准备插入手术记录 - applyDoctorId: 123, applyDoctorName: 张医生, applyDeptId: 456, deptName: 普外科
手术记录插入成功 - surgeryId: 1234567890123456789, surgeryNo: OP202501051234
```
**如果看不到这些日志**:说明代码没有执行到这里,检查是否有异常抛出。
**如果看到 "前端提交的数据 - applyDoctorName: null"**:说明前端提交的数据为空,需要检查前端代码。
### 步骤5:检查数据库中是否保存成功
执行以下 SQL 查询最新插入的记录:
```sql
SELECT
id,
surgery_no,
patient_id,
apply_doctor_id,
apply_doctor_name,
apply_dept_id,
apply_dept_name,
surgery_name,
status_enum,
create_time
FROM public.cli_surgery
WHERE delete_flag = '0'
ORDER BY create_time DESC
LIMIT 5;
```
**如果 apply_doctor_name 和 apply_dept_name 字段为空**:说明数据没有保存成功。
**如果字段有值**:说明保存成功,问题出在前端显示。
### 步骤6:检查前端 API 响应
1. 打开浏览器开发者工具(F12)
2. 切换到 Network 标签
3. 新增手术
4. 找到 `/clinical-manage/surgery/surgery-page` 请求
5. 点击查看响应内容
检查响应数据中是否包含 `applyDoctorName` 和 `applyDeptName` 字段。
**如果响应中没有这些字段**:说明 MyBatis 映射有问题,检查 XML 配置。
**如果响应中有这些字段但值为 null**:说明数据库中为空,回到步骤5。
### 步骤7:检查前端表格显示
查看前端代码中的表格列配置:
```vue
```
确保 `prop` 属性与后端返回的字段名一致(注意大小写)。
## 常见问题和解决方案
### 问题1:数据库字段未添加
**症状**:后端报错 "column apply_doctor_name does not exist"
**解决**:执行数据库迁移脚本
### 问题2:后端日志显示 applyDoctorName 为 null
**症状**:日志中 "前端提交的数据 - applyDoctorName: null"
**原因**:前端提交数据时,disabled 字段没有被包含
**解决**:检查前端 submitForm 函数,确保手动设置了这些字段
### 问题3:数据库中有值,但前端不显示
**症状**:数据库查询有值,前端响应也有值,但表格不显示
**原因**:
1. 前端 prop 属性名与后端字段名不一致(大小写问题)
2. 前端数据未正确绑定
**解决**:
1. 检查 prop 属性名,确保与后端返回的 JSON 字段名一致
2. 检查浏览器控制台是否有 JavaScript 错误
### 问题4:MyBatis 映射未生效
**症状**:后端保存成功,但查询时字段为 null
**原因**:XML 映射文件未正确配置
**解决**:
1. 检查 SurgeryMapper.xml 中的 resultMap 配置
2. 检查 SQL 查询中是否包含这些字段
3. 重启后端服务
## 验证清单
- [ ] 数据库迁移脚本已执行
- [ ] 数据库字段已添加(步骤1)
- [ ] 后端服务已重启
- [ ] 后端日志显示申请医生信息(步骤4)
- [ ] 数据库中已保存数据(步骤5)
- [ ] 前端 API 响应包含这些字段(步骤6)
- [ ] 前端表格正确显示(步骤7)
## 附加 SQL 脚本
### 查看统计信息
```sql
SELECT
COUNT(*) as total_count,
COUNT(apply_doctor_name) as has_doctor_name_count,
COUNT(apply_dept_name) as has_dept_name_count
FROM public.cli_surgery
WHERE delete_flag = '0';
```
### 手动更新测试数据
如果需要手动更新已有的测试数据:
```sql
UPDATE public.cli_surgery
SET apply_doctor_name = '测试医生',
apply_dept_name = '测试科室'
WHERE apply_doctor_name IS NULL
AND delete_flag = '0';
```
## 联系支持
如果以上步骤都无法解决问题,请提供以下信息:
1. 数据库字段查询结果(步骤1)
2. 后端日志截图(步骤4)
3. 数据库查询结果(步骤5)
4. 浏览器 Network 响应截图(步骤6)
5. 浏览器 Console 错误信息