Files
his/openhis-server-new/openhis-application/src/main/resources/mapper/clinicalmanage/SurgeryMapper.xml
赵云 98e5a0b984 Fix Bug #509: [门诊医生站-手术申请] 提交申请后列表未实时刷新展示数据,且提示语需优化
1. 修复列表不显示问题:SurgeryMapper.xml 中 sr.id IS NULL 条件导致已生成医嘱的手术被过滤,
   提交手术时 addSurgery() 会创建 category_enum=4 的 ServiceRequest,导致查询立即被排除。
   移除 sr.id IS NULL 过滤条件,使手术申请列表正常展示所有手术记录。

2. 修复提示语问题:将后端 addSurgery 返回消息从"手术信息添加成功"改为"手术申请提交成功!",
   updateSurgery 改为"手术申请修改成功!",前端直接使用后端返回消息。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 11:24:06 +08:00

352 lines
16 KiB
XML
Executable File
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.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.openhis.web.clinicalmanage.mapper.SurgeryAppMapper">
<resultMap type="com.openhis.web.clinicalmanage.dto.SurgeryDto" id="SurgeryResult">
<result property="id" column="id" />
<result property="surgeryNo" column="surgery_no" />
<result property="patientId" column="patient_id" />
<result property="patientName" column="patient_name" />
<result property="patientGender" column="patient_gender" />
<result property="patientAge" column="patient_age" />
<result property="encounterId" column="encounter_id" />
<result property="encounterNo" column="encounter_no" />
<result property="patientCardNo" column="patient_card_no" />
<result property="applyDoctorId" column="apply_doctor_id" />
<result property="applyDoctorName" column="apply_doctor_name" />
<result property="applyDeptId" column="apply_dept_id" />
<result property="applyDeptName" column="apply_dept_name" />
<result property="surgeryIndication" column="surgery_indication" />
<result property="surgeryName" column="surgery_name" />
<result property="surgeryCode" column="surgery_code" />
<result property="surgeryTypeEnum" column="surgery_type_enum" />
<result property="surgeryTypeEnum_dictText" column="surgery_type_enum_dictText" />
<result property="surgeryLevel" column="surgery_level" />
<result property="surgeryLevel_dictText" column="surgery_level_dictText" />
<result property="statusEnum" column="status_enum" />
<result property="statusEnum_dictText" column="status_enum_dictText" />
<result property="plannedTime" column="planned_time" />
<result property="actualStartTime" column="actual_start_time" />
<result property="actualEndTime" column="actual_end_time" />
<result property="mainSurgeonId" column="main_surgeon_id" />
<result property="mainSurgeonName" column="main_surgeon_name" />
<result property="assistant1Id" column="assistant_1_id" />
<result property="assistant1Name" column="assistant_1_name" />
<result property="assistant2Id" column="assistant_2_id" />
<result property="assistant2Name" column="assistant_2_name" />
<result property="anesthetistId" column="anesthetist_id" />
<result property="anesthetistName" column="anesthetist_name" />
<result property="scrubNurseId" column="scrub_nurse_id" />
<result property="scrubNurseName" column="scrub_nurse_name" />
<result property="anesthesiaTypeEnum" column="anesthesia_type_enum" />
<result property="anesthesiaTypeEnum_dictText" column="anesthesia_type_enum_dictText" />
<result property="bodySite" column="body_site" />
<result property="incisionLevel" column="incision_level" />
<result property="incisionLevel_dictText" column="incision_level_dictText" />
<result property="healingLevel" column="healing_level" />
<result property="healingLevel_dictText" column="healing_level_dictText" />
<result property="operatingRoomId" column="operating_room_id" />
<result property="operatingRoomName" column="operating_room_name" />
<result property="operatingRoomOrgId" column="operating_room_org_id" />
<result property="operatingRoomOrgName" column="operating_room_org_name" />
<result property="orgId" column="org_id" />
<result property="orgName" column="org_name" />
<result property="preoperativeDiagnosis" column="preoperative_diagnosis" />
<result property="postoperativeDiagnosis" column="postoperative_diagnosis" />
<result property="surgeryDescription" column="surgery_description" />
<result property="postoperativeAdvice" column="postoperative_advice" />
<result property="complications" column="complications" />
<result property="surgeryFee" column="surgery_fee" />
<result property="anesthesiaFee" column="anesthesia_fee" />
<result property="totalFee" column="total_fee" />
<result property="remark" column="remark" />
<result property="createTime" column="create_time" />
<result property="updateTime" column="update_time" />
<result property="emergencyFlag" column="emergency_flag" />
<result property="implantFlag" column="implant_flag" />
<result property="operatingRoomConfirmTime" column="operating_room_confirm_time" />
<result property="operatingRoomConfirmUser" column="operating_room_confirm_user" />
</resultMap>
<sql id="selectSurgeryVo">
SELECT
s.id,
s.surgery_no,
s.patient_id,
p.name as patient_name,
CASE p.gender_enum WHEN 0 THEN '男' WHEN 1 THEN '女' ELSE '未知' END as patient_gender,
EXTRACT(YEAR FROM AGE(p.birth_date)) as patient_age,
s.encounter_id,
e.bus_no as encounter_no,
pi.identifier_no as patient_card_no,
s.apply_doctor_id,
COALESCE(s.apply_doctor_name, apply_doc.name) as apply_doctor_name,
s.apply_dept_id,
COALESCE(s.apply_dept_name, apply_dept.name) as apply_dept_name,
s.surgery_name,
s.surgery_code,
s.surgery_type_enum,
CASE s.surgery_type_enum
WHEN 1 THEN '门诊手术'
WHEN 2 THEN '住院手术'
WHEN 3 THEN '急诊手术'
WHEN 4 THEN '择期手术'
ELSE '未知'
END as surgery_type_enum_dictText,
s.surgery_level,
CASE s.surgery_level
WHEN 1 THEN '一级手术'
WHEN 2 THEN '二级手术'
WHEN 3 THEN '三级手术'
WHEN 4 THEN '四级手术'
WHEN 5 THEN '特级手术'
ELSE '未知'
END as surgery_level_dictText,
s.status_enum,
CASE s.status_enum
WHEN 0 THEN '待排期'
WHEN 1 THEN '已排期'
WHEN 2 THEN '手术中'
WHEN 3 THEN '已完成'
WHEN 4 THEN '已取消'
WHEN 5 THEN '暂停'
ELSE '未知'
END as status_enum_dictText,
s.planned_time,
s.actual_start_time,
s.actual_end_time,
s.main_surgeon_id,
COALESCE(s.main_surgeon_name, main_surgeon.name) as main_surgeon_name,
s.assistant_1_id,
COALESCE(s.assistant_1_name, assistant1.name) as assistant_1_name,
s.assistant_2_id,
COALESCE(s.assistant_2_name, assistant2.name) as assistant_2_name,
s.anesthetist_id,
COALESCE(s.anesthetist_name, anesthetist.name) as anesthetist_name,
s.scrub_nurse_id,
COALESCE(s.scrub_nurse_name, scrub_nurse.name) as scrub_nurse_name,
s.anesthesia_type_enum,
CASE s.anesthesia_type_enum
WHEN 0 THEN '无麻醉'
WHEN 1 THEN '局部麻醉'
WHEN 2 THEN '区域麻醉'
WHEN 3 THEN '全身麻醉'
WHEN 4 THEN '脊椎麻醉'
WHEN 5 THEN '硬膜外麻醉'
WHEN 6 THEN '表面麻醉'
ELSE '未知'
END as anesthesia_type_enum_dictText,
s.body_site,
s.incision_level,
CASE s.incision_level
WHEN 1 THEN 'I级切口'
WHEN 2 THEN 'II级切口'
WHEN 3 THEN 'III级切口'
WHEN 4 THEN 'IV级切口'
ELSE '未知'
END as incision_level_dictText,
s.healing_level,
CASE s.healing_level
WHEN 1 THEN '甲级愈合'
WHEN 2 THEN '乙级愈合'
WHEN 3 THEN '丙级愈合'
ELSE '未知'
END as healing_level_dictText,
s.operating_room_id,
COALESCE(s.operating_room_name, r.name) as operating_room_name,
r.organization_id as operating_room_org_id,
ro.name as operating_room_org_name,
s.org_id,
COALESCE(s.org_name, o.name) as org_name,
s.surgery_indication,
s.preoperative_diagnosis,
s.postoperative_diagnosis,
s.surgery_description,
s.postoperative_advice,
s.complications,
s.surgery_fee,
s.anesthesia_fee,
s.total_fee,
s.remark,
s.create_time,
s.update_time,
s.emergency_flag,
s.implant_flag,
s.operating_room_confirm_time,
s.operating_room_confirm_user
FROM cli_surgery s
LEFT JOIN adm_patient p ON s.patient_id = p.id
LEFT JOIN adm_encounter e ON s.encounter_id = e.id
LEFT JOIN (
SELECT patient_id, identifier_no
FROM (
SELECT patient_id, identifier_no,
ROW_NUMBER() OVER (PARTITION BY patient_id ORDER BY create_time ASC) AS rn
FROM adm_patient_identifier
WHERE delete_flag = '0'
AND identifier_no IS NOT NULL
AND identifier_no != ''
) t
WHERE rn = 1
) pi ON s.patient_id = pi.patient_id
LEFT JOIN adm_operating_room r ON s.operating_room_id = r.id
LEFT JOIN adm_organization ro ON r.organization_id = ro.id
LEFT JOIN adm_organization o ON s.org_id = o.id
LEFT JOIN adm_practitioner main_surgeon ON s.main_surgeon_id = main_surgeon.id
LEFT JOIN adm_practitioner anesthetist ON s.anesthetist_id = anesthetist.id
LEFT JOIN adm_practitioner assistant1 ON s.assistant_1_id = assistant1.id
LEFT JOIN adm_practitioner assistant2 ON s.assistant_2_id = assistant2.id
LEFT JOIN adm_practitioner scrub_nurse ON s.scrub_nurse_id = scrub_nurse.id
LEFT JOIN adm_practitioner apply_doc ON s.apply_doctor_id = apply_doc.id
LEFT JOIN adm_organization apply_dept ON s.apply_dept_id = apply_dept.id
</sql>
<!-- 优化版分页查询减少JOIN使用子查询预加载关联数据 -->
<select id="getSurgeryPage" parameterType="com.baomidou.mybatisplus.core.conditions.query.QueryWrapper" resultMap="SurgeryResult">
SELECT
s.id,
s.surgery_no,
s.patient_id,
s.patient_name,
s.encounter_id,
s.apply_doctor_id,
s.apply_doctor_name,
s.apply_dept_id,
s.apply_dept_name,
s.surgery_name,
s.surgery_code,
s.surgery_type_enum,
s.surgery_level,
s.status_enum,
s.planned_time,
s.actual_start_time,
s.actual_end_time,
s.main_surgeon_id,
s.main_surgeon_name,
s.assistant_1_id,
s.assistant_1_name,
s.assistant_2_id,
s.assistant_2_name,
s.anesthetist_id,
s.anesthetist_name,
s.scrub_nurse_id,
s.scrub_nurse_name,
s.anesthesia_type_enum,
s.body_site,
s.incision_level,
s.healing_level,
s.operating_room_id,
s.operating_room_name,
s.org_id,
s.org_name,
s.surgery_indication,
s.preoperative_diagnosis,
s.postoperative_diagnosis,
s.surgery_description,
s.postoperative_advice,
s.complications,
s.surgery_fee,
s.anesthesia_fee,
s.total_fee,
s.remark,
s.create_time,
s.update_time,
s.emergency_flag,
s.implant_flag,
s.operating_room_confirm_time,
s.operating_room_confirm_user,
<!-- 患者信息:只查询必要字段 -->
p.gender_enum as patient_gender,
p.birth_date,
<!-- 就诊编号 -->
e.bus_no as encounter_no,
<!-- 就诊卡号 -->
pi.identifier_no as patient_card_no,
<!-- 字典文本使用CASE WHEN避免额外JOIN -->
CASE s.surgery_type_enum
WHEN 1 THEN '门诊手术'
WHEN 2 THEN '住院手术'
WHEN 3 THEN '急诊手术'
WHEN 4 THEN '择期手术'
ELSE '未知'
END as surgery_type_enum_dictText,
CASE s.surgery_level
WHEN 1 THEN '一级手术'
WHEN 2 THEN '二级手术'
WHEN 3 THEN '三级手术'
WHEN 4 THEN '四级手术'
WHEN 5 THEN '特级手术'
ELSE '未知'
END as surgery_level_dictText,
CASE s.status_enum
WHEN 0 THEN '待排期'
WHEN 1 THEN '已排期'
WHEN 2 THEN '手术中'
WHEN 3 THEN '已完成'
WHEN 4 THEN '已取消'
WHEN 5 THEN '暂停'
ELSE '未知'
END as status_enum_dictText,
CASE s.anesthesia_type_enum
WHEN 0 THEN '无麻醉'
WHEN 1 THEN '局部麻醉'
WHEN 2 THEN '区域麻醉'
WHEN 3 THEN '全身麻醉'
WHEN 4 THEN '脊椎麻醉'
WHEN 5 THEN '硬膜外麻醉'
WHEN 6 THEN '表面麻醉'
ELSE '未知'
END as anesthesia_type_enum_dictText,
CASE s.incision_level
WHEN 1 THEN 'I级切口'
WHEN 2 THEN 'II级切口'
WHEN 3 THEN 'III级切口'
WHEN 4 THEN 'IV级切口'
ELSE '未知'
END as incision_level_dictText,
CASE s.healing_level
WHEN 1 THEN '甲级愈合'
WHEN 2 THEN '乙级愈合'
WHEN 3 THEN '丙级愈合'
ELSE '未知'
END as healing_level_dictText,
<!-- 计算年龄 -->
EXTRACT(YEAR FROM AGE(p.birth_date)) as patient_age
FROM cli_surgery s
<!-- 只JOIN必要的表患者和就诊 -->
LEFT JOIN adm_patient p ON s.patient_id = p.id
LEFT JOIN adm_encounter e ON s.encounter_id = e.id
<!-- 关联患者标识表获取就诊卡号 -->
LEFT JOIN (
SELECT patient_id, identifier_no
FROM (
SELECT patient_id, identifier_no,
ROW_NUMBER() OVER (PARTITION BY patient_id ORDER BY create_time ASC) AS rn
FROM adm_patient_identifier
WHERE delete_flag = '0'
AND identifier_no IS NOT NULL
AND identifier_no != ''
) t
WHERE rn = 1
) pi ON s.patient_id = pi.patient_id
<!-- 关联服务请求表(仅用于数据关联,不再过滤) -->
LEFT JOIN wor_service_request sr ON sr.activity_id = s.id AND sr.delete_flag = '0' AND sr.category_enum = 4
<where>
s.delete_flag = '0'
<if test="ew.sqlSegment != null and ew.sqlSegment != ''">
<!-- 补充 encounter_id 替换,修复多表关联时字段歧义。注释不能放进 OGNL 表达式内部。 -->
<![CDATA[
AND ${ew.sqlSegment.replace('tenant_id', 's.tenant_id').replace('create_time', 's.create_time').replace('surgery_no', 's.surgery_no').replace('surgery_name', 's.surgery_name').replace('patient_name', 's.patient_name').replace('main_surgeon_name', 's.main_surgeon_name').replace('anesthetist_name', 's.anesthetist_name').replace('org_name', 's.org_name').replace('status_enum', 's.status_enum').replace('planned_time', 's.planned_time').replace('encounter_id', 's.encounter_id')}
]]>
</if>
</where>
</select>
<select id="getSurgeryDetail" parameterType="Long" resultMap="SurgeryResult">
<include refid="selectSurgeryVo"/>
WHERE s.id = #{id} AND s.delete_flag = '0'
</select>
</mapper>