Files
his/openhis-server-new/openhis-application/src/main/resources/mapper/clinicalmanage/SurgeryMapper.xml
chenqi b497eb853c fix(surgery): 解决手术申请中的数据绑定和字段映射问题
- 修复了手术申请组件中 userStore 初始化问题,确保 applyDoctorName 和 applyDeptName 正确赋值
- 添加了 surgeryApplication 组件的 saved 事件发射,用于通知父组件刷新医嘱列表
- 修复了手术项目选择变更时 surgeryName 的正确设置和空值处理
- 添加了手术名称和编码的验证逻辑,防止提交时出现空值错误
- 修复了手术排班页面中就诊卡号字段的属性映射(visitId 改为 patientCardNo)
- 在后端 DTO 中添加了 patientCardNo 字段支持
- 修复了数据库查询中就诊卡号的关联查询逻辑,通过患者标识表获取正确的就诊卡号
- 优化了手术医嘱的 contentJson 设置,确保手术名称和编码正确存储
2026-04-02 17:54:07 +08:00

349 lines
16 KiB
XML
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
<where>
s.delete_flag = '0'
<if test="ew.sqlSegment != null and ew.sqlSegment != ''">
<![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')}
]]>
</if>
</where>
</select>
<select id="getSurgeryDetail" parameterType="Long" resultMap="SurgeryResult">
<include refid="selectSurgeryVo"/>
WHERE s.id = #{id} AND s.delete_flag = '0'
</select>
</mapper>