Files
his/openhis-server-new/openhis-application/src/main/resources/mapper/clinicalmanage/SurgeryMapper.xml
zhangfei 9c3e603b94 Fix Bug #443: 手术计费:点击签发耗材时异常报错
当手术计费弹窗中点击"签发"耗材时,因耗材的locationId(发放库房)为空导致后端异常。
在DoctorStationAdviceAppServiceImpl.handDevice方法中,当locationId为null时,使用登录用户的科室ID作为默认值,
与NurseBillingAppService中的处理方式保持一致。
2026-05-08 09:14:18 +08:00

354 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'
<!-- 只显示未生成医嘱的手术 -->
AND sr.id IS NULL
<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>