Files
his/openhis-server-new/openhis-application/src/main/resources/mapper/common/CommonAppMapper.xml
xunyu 87e6850f67 fix(#439,#452,#464): 修复领用出库库存查询和诊疗目录零售价同步问题
#439 领用出库选择药品后总库存数量列数据未显示
#452 领用出库模块选择药品时提示仓库数量为0与实际库存不符
- CommonAppMapper.xml: selectInventoryItemInfo的WHERE条件修复
  当objLocationId非空时,location_id IN应同时包含orgLocationId和objLocationId
  原代码只包含orgLocationId导致obj_quantity永远为0

#464 诊疗目录新增项目时零售价未与诊疗子项合计总价自动同步
- diagnosisTreatmentDialog.vue: submitForm中增加零售价自动同步逻辑
  当有子项时,form.retailPrice自动设置为totalPrice(子项合计总价)

Author: xunyu
2026-05-02 19:05:55 +08:00

608 lines
24 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.common.mapper.CommonAppMapper">
<resultMap id="PrescriptionPrintInfoMap" type="com.openhis.web.common.dto.AdvicePrintInfoDto">
<id property="departmentName" column="department_name"/>
<result property="patientName" column="patient_name"/>
<result property="phone" column="phone"/>
<result property="encounterNo" column="encounter_no"/>
<result property="genderEnum" column="gender_enum"/>
<result property="age" column="age"/>
<result property="birthDate" column="birth_date"/>
<result property="reqTime" column="req_time"/>
<result property="contractName" column="contract_name"/>
<result property="conditionName" column="condition_name"/>
<result property="doctorName" column="doctor_name"/>
<result property="dispenseDoctorName" column="dispense_doctor_name"/>
<result property="preparerDoctorName" column="preparer_doctor_name"/>
<result property="chargeDoctorName" column="charge_doctor_name"/>
<result property="encounterYbClass" column="encounter_yb_class"/>
<collection property="adviceItemList" ofType="com.openhis.web.common.dto.AdviceItemPrintInfoDto">
<result property="quantity" column="quantity"/>
<result property="unitPrice" column="unit_price"/>
<result property="totalPrice" column="total_price"/>
<result property="itemName" column="item_name"/>
<result property="totalVolume" column="total_volume"/>
<result property="dose" column="dose"/>
<result property="rateCode" column="rate_code"/>
<result property="methodCode" column="method_code"/>
<result property="doseUnitCode" column="dose_unit_code"/>
<result property="unitCode" column="unit_code"/>
<result property="prescriptionNo" column="prescription_no"/>
<result property="groupId" column="group_id"/>
<result property="sortNumber" column="sort_number"/>
<result property="chrgitmLv" column="chrgitm_lv"/>
<result property="chineseHerbsDoseQuantity" column="chinese_herbs_dose_quantity"/>
<result property="basicFlag" column="basic_flag"/>
</collection>
</resultMap>
<resultMap id="TreatmentPrintInfoMap" type="com.openhis.web.common.dto.AdvicePrintInfoDto">
<id property="departmentName" column="department_name"/>
<result property="patientName" column="patient_name"/>
<result property="phone" column="phone"/>
<result property="encounterNo" column="encounter_no"/>
<result property="genderEnum" column="gender_enum"/>
<result property="age" column="age"/>
<result property="birthDate" column="birth_date"/>
<result property="reqTime" column="req_time"/>
<result property="contractName" column="contract_name"/>
<result property="doctorName" column="doctor_name"/>
<result property="encounterYbClass" column="encounter_yb_class"/>
<collection property="adviceItemList" ofType="com.openhis.web.common.dto.AdviceItemPrintInfoDto">
<result property="quantity" column="quantity"/>
<result property="unitPrice" column="unit_price"/>
<result property="totalPrice" column="total_price"/>
<result property="itemName" column="item_name"/>
<result property="unitCode" column="unit_code"/>
</collection>
</resultMap>
<select id="selectInventoryItemList" resultType="com.openhis.web.common.dto.InventoryItemDto">
SELECT ii.tenant_id,
ii.item_type,
ii.category_code,
ii.part_percent,
ii.definition_id,
ii.name,
ii.item_bus_no,
ii.py_str,
ii.wb_str,
ii.yb_no,
ii.product_name,
ii.unit_code,
ii.min_unit_code,
ii.manufacturer_text,
ii.volume,
ii.supplier,
ii.item_table_name,
ii.lot_number,
ii.org_location_id,
ii.purchase_amount
FROM ( SELECT T1.tenant_id,
#{medicine} AS item_type,
T1.category_code AS category_code,
T1.part_percent AS part_percent,
T1.id AS definition_id,
T1."name" AS "name",
T1.bus_no AS item_bus_no,
T1.py_str AS py_str,
T1.wb_str AS wb_str,
T1.yb_no AS yb_no,
T1.merchandise_name AS product_name,
T1.unit_code AS unit_code,
T1.min_unit_code AS min_unit_code,
T1.manufacturer_text ,
T2.total_volume AS volume,
T3."name" AS supplier,
<choose>
<when test="purchaseFlag != 1">
T7.item_table AS item_table_name,
T7.lot_number,
T7.location_id AS org_location_id,
NULL AS purchase_amount
</when>
<otherwise>
NULL AS item_table_name,
NULL AS lot_number,
NULL AS org_location_id,
T9.amount AS purchase_amount
</otherwise>
</choose>
FROM med_medication_definition AS T1
LEFT JOIN med_medication AS T2
ON T2.medication_def_id = T1.ID
AND T2.delete_flag = '0'
LEFT JOIN adm_supplier AS T3
ON T3.ID = T1.supply_id
AND T3.delete_flag = '0'
<if test="purchaseFlag != 1">
LEFT JOIN wor_inventory_item AS T7
ON T7.item_id = T1.id
AND T7.delete_flag = '0'
</if>
<if test="purchaseFlag != 0">
LEFT JOIN adm_charge_item_definition AS T8
ON T8.instance_id = T1.id
AND T8.delete_flag = '0'
LEFT JOIN adm_charge_item_def_detail AS T9
ON T9.definition_id = T8.id
AND T9.delete_flag = '0'
</if>
WHERE T1.delete_flag = '0'
AND T2.status_enum != #{retired}
<if test="purchaseFlag != 1">
AND T7.item_id IS NOT NULL -- 确保连接有效性
AND T7.item_table = #{medicationTableName}
</if>
<if test="purchaseFlag != 0">
AND T9.condition_code = #{purchase}
</if>
UNION ALL
SELECT T1.tenant_id,
#{device} AS item_type,
T1.category_code AS category_code,
T1.part_percent AS part_percent,
T1.id AS definition_id,
T1."name" AS "name",
T1.bus_no AS item_bus_no,
T1.py_str AS py_str,
T1.wb_str AS wb_str,
T1.yb_no AS yb_no,
'' AS product_name,
T1.unit_code AS unit_code,
T1.min_unit_code AS min_unit_code,
T1.manufacturer_text ,
T1."size" AS volume,
T2."name" AS supplier,
<choose>
<when test="purchaseFlag != 1">
T7.item_table AS item_table_name,
T7.lot_number,
T7.location_id AS org_location_id,
NULL AS purchase_amount
</when>
<otherwise>
NULL AS item_table_name,
NULL AS lot_number,
NULL AS org_location_id,
T9.amount AS purchase_amount
</otherwise>
</choose>
FROM adm_device_definition AS T1
LEFT JOIN adm_supplier AS T2
ON T2.ID = T1.supply_id
AND T2.delete_flag = '0'
<if test="purchaseFlag != 1">
LEFT JOIN wor_inventory_item AS T7
ON T7.item_id = T1.id
AND T7.delete_flag = '0'
</if>
<if test="purchaseFlag != 0">
LEFT JOIN adm_charge_item_definition AS T8
ON T8.instance_id = T1.id
AND T8.delete_flag = '0'
LEFT JOIN adm_charge_item_def_detail AS T9
ON T9.definition_id = T8.id
AND T9.delete_flag = '0'
</if>
WHERE T1.delete_flag = '0'
AND T1.status_enum != #{retired}
<if test="purchaseFlag != 1">
AND T7.item_id IS NOT NULL -- 确保连接有效性
AND T7.item_table = #{deviceTableName}
</if>
<if test="purchaseFlag != 0">
AND T9.condition_code = #{purchase}
</if>
) AS ii
${ew.customSqlSegment}
</select>
<select id="selectInventoryItemInfo" resultType="com.openhis.web.common.dto.LocationInventoryDto">
SELECT T1.item_id,
T1.item_table,
T1.location_id,
SUM(CASE WHEN T1.location_id = #{objLocationId} THEN T1.quantity ELSE 0 END) AS obj_quantity,
SUM(CASE WHEN T1.location_id = #{orgLocationId} THEN T1.quantity ELSE 0 END) AS org_quantity,
T1.unit_code,
T1.production_date,
T1.lot_number,
T1.expiration_date,
MAX(T2."name") AS location_name,
MAX(T3."name") AS location_store_name,
T5.amount AS price,
T1.supplier_id,
CASE WHEN T1.item_table = #{medicationTableName}
THEN ( SELECT T7.yb_no
FROM med_medication_definition AS T7
WHERE T1.item_id = T7.id
AND T7.delete_flag = '0')
WHEN T1.item_table = #{deviceTableName}
THEN ( SELECT T8.yb_no
FROM adm_device_definition AS T8
WHERE T1.item_id = T8.id
AND T8.delete_flag = '0'
) ELSE null END AS yb_no, --医保编码
CASE WHEN T1.item_table = #{medicationTableName}
THEN ( SELECT T7.manufacturer_text
FROM med_medication_definition AS T7
WHERE T1.item_id = T7.id
AND T7.delete_flag = '0')
WHEN T1.item_table = #{deviceTableName}
THEN ( SELECT T8.manufacturer_text
FROM adm_device_definition AS T8
WHERE T1.item_id = T8.id
AND T8.delete_flag = '0')
ELSE null END AS manufacturer_text,--生产厂家
T6.name AS supplier_name
FROM wor_inventory_item AS T1
LEFT JOIN adm_location AS T2
ON T2.id = T1.location_id
AND T2.delete_flag = '0'
LEFT JOIN adm_location AS T3
ON T3.id = T1.location_store_id
AND T3.delete_flag = '0'
LEFT JOIN adm_charge_item_definition AS T4
ON T4.instance_id = T1.item_id
AND T4.delete_flag = '0'
-- 使用子查询确保T5唯一记录 --
LEFT JOIN (
SELECT * FROM (
SELECT definition_id,
amount,
ROW_NUMBER() OVER (PARTITION BY definition_id ORDER BY id DESC ) AS rn -- 按ID取最新记录按需调整排序
FROM adm_charge_item_def_detail
WHERE delete_flag = '0'
AND condition_code = '1'--1:批号进价
) AS t
WHERE rn = 1 -- 确保每个分组只取一条记录
) AS T5 ON T5.definition_id = T4.id
LEFT JOIN adm_supplier AS T6
ON T6.id = T1.supplier_id
AND T6.delete_flag = '0'
WHERE T1.item_id = #{itemId}
AND T1.inventory_status_enum != 3
AND T1.delete_flag = '0'
<choose>
<when test="lotNumber != null">
AND T1.lot_number = #{lotNumber}
</when>
</choose>
<choose>
<when test="objLocationId != null and objLocationId != ''">
AND T1.location_id IN (#{orgLocationId}, #{objLocationId})
</when>
<otherwise>
AND T1.location_id = #{orgLocationId}
</otherwise>
</choose>
GROUP BY T1.item_id,
T1.item_table,
T1.location_id,
T1.unit_code,
T1.production_date,
T1.expiration_date,
T1.lot_number,
T5.amount,
T1.supplier_id,
T6.name
ORDER BY T1.lot_number DESC
</select>
<select id="getInfoByTraceNo" resultType="com.openhis.administration.domain.TraceNoManage">
SELECT id,
item_table,
item_id,
location_type_enum,
location_id,
location_store_id,
lot_number,
trace_no,
status_enum,
unit_code,
operation_type,
create_by,
create_time,
update_by,
update_time,
tenant_id,
delete_flag
FROM adm_trace_no_manage
WHERE trace_no like #{traceNo}
AND (trace_no) IN (
SELECT trace_no
FROM adm_trace_no_manage
WHERE trace_no like #{traceNo}
AND delete_flag = '0'
GROUP BY trace_no
HAVING SUM(CASE WHEN status_enum = 1 THEN 1 ELSE 0 END) > -- 进库次数
SUM(CASE WHEN status_enum = 2 THEN 1 ELSE 0 END) -- 出库次数
)
AND delete_flag = '0'
ORDER BY create_time DESC LIMIT 1
</select>
<select id="getPractitionerList" resultType="com.openhis.web.common.dto.PractitionerInfoDto">
SELECT ap.ID AS practitioner_id,
ap.NAME AS practitioner_name,
ao.NAME AS organization_name
FROM adm_practitioner AS ap
LEFT JOIN adm_organization AS ao ON ap.org_id = ao.ID
AND ao.delete_flag = '0'
WHERE ap.delete_flag = '0'
<if test="searchKey != null and searchKey != ''">
AND (ap.py_str LIKE concat('%', #{searchKey}, '%') OR ap.NAME LIKE concat('%', #{searchKey}, '%'))
</if>
</select>
<select id="selectPrescriptionPrintInfo" resultMap="PrescriptionPrintInfoMap">
SELECT ae.yb_class_enum AS encounter_yb_class,
mmr.prescription_no ,
fc.contract_name ,
ap."name" AS patient_name,
ap.gender_enum ,
ap.birth_date ,
ae.bus_no AS encounter_no,
ao."name" AS department_name,
ccd."name" AS condition_name,
ap.phone ,
mmr.req_authored_time AS req_time,
ap2."name" AS doctor_name,
ap3."name" AS dispense_doctor_name,
ap4."name" AS charge_doctor_name,
ap5."name" AS preparer_doctor_name,
mmd2."name" AS item_name,
mm.total_volume ,
mmr.dose ,
mmr.method_code ,
aci.unit_price ,
aci.total_price ,
mmr.quantity,
mmr.rate_code ,
mmr.unit_code ,
mmr.dose_unit_code,
mmr.sort_number,
mmr.group_id,
mmd2.chrgitm_lv,
mmr.chinese_herbs_dose_quantity,
ap.address,
ae.patient_id,
mmd2.basic_flag
FROM med_medication_request mmr
LEFT JOIN med_medication_dispense mmd
ON mmd.med_req_id = mmr.id
AND mmd.delete_flag = '0'
LEFT JOIN med_medication_definition mmd2
ON mmr.medication_id = mmd2.id
AND mmd2.delete_flag = '0'
LEFT JOIN med_medication mm
ON mmd2.id = mm.medication_def_id
AND mm.delete_flag = '0'
LEFT JOIN adm_charge_item aci
ON aci.service_id = mmr.id
AND aci.delete_flag = '0'
LEFT JOIN cli_condition AS cc
ON mmr.condition_id = cc.id
AND cc.delete_flag = '0'
LEFT JOIN cli_condition_definition AS ccd
ON cc.definition_id = ccd.id
AND ccd.delete_flag = '0'
LEFT JOIN adm_encounter ae
ON mmr.encounter_id = ae.id
AND ae.delete_flag = '0'
LEFT JOIN adm_patient ap
ON ae.patient_id = ap.id
AND ap.delete_flag = '0'
LEFT JOIN adm_organization ao
ON ao.id = ae.organization_id
AND ao.delete_flag = '0'
LEFT JOIN adm_account aa
ON ae.id = aa.encounter_id
AND aa.encounter_flag = 1
AND aa.delete_flag = '0'
LEFT JOIN fin_contract fc
ON aa.contract_no = fc.bus_no
AND fc.delete_flag = '0'
LEFT JOIN adm_practitioner ap2
ON ap2.id = mmr.practitioner_id
AND ap2.delete_flag = '0'
LEFT JOIN adm_practitioner ap3
ON ap3.id = mmd.practitioner_id
AND ap3.delete_flag = '0'
LEFT JOIN adm_practitioner ap4
ON ap4.id = aci.performer_id
AND ap4.delete_flag = '0'
LEFT JOIN adm_practitioner ap5
ON ap5.id = mmd.preparer_id
AND ap5.delete_flag = '0'
WHERE mmr.delete_flag = '0'
AND mmr.id IN
<foreach collection="requestIds" item="requestId" separator="," open="(" close=")">
#{requestId}
</foreach>
</select>
<select id="selectTreatmentPrintInfo" resultMap="TreatmentPrintInfoMap">
SELECT ae.yb_class_enum AS encounter_yb_class,
fc.contract_name ,
ap."name" AS patient_name,
ap.gender_enum ,
ap.birth_date ,
ae.bus_no AS encounter_no,
ao."name" AS department_name,
ap.phone ,
ae.reception_time AS req_time,
ap2."name" AS doctor_name,
aci.unit_price ,
aci.total_price,
wdr.quantity ,
wdr.unit_code ,
add2."name" AS item_name,
ap.address,
ae.patient_id,
add2.chrgitm_lv
FROM wor_device_request wdr
LEFT JOIN adm_device_definition add2
ON wdr.device_def_id = add2.id
AND add2.delete_flag = '0'
LEFT JOIN adm_charge_item aci
ON aci.service_id = wdr.id
AND aci.delete_flag = '0'
LEFT JOIN adm_encounter ae
ON wdr.encounter_id = ae.id
AND ae.delete_flag = '0'
LEFT JOIN adm_patient ap
ON ae.patient_id = ap.id
AND ap.delete_flag = '0'
LEFT JOIN adm_organization ao
ON ao.id = ae.organization_id
AND ao.delete_flag = '0'
LEFT JOIN adm_account aa
ON ae.id = aa.encounter_id
AND aa.encounter_flag = 1
AND aa.delete_flag = '0'
LEFT JOIN fin_contract fc
ON aa.contract_no = fc.bus_no
AND fc.delete_flag = '0'
LEFT JOIN adm_practitioner ap2
ON ap2.id = wdr.requester_id
AND ap2.delete_flag = '0'
WHERE wdr.delete_flag = '0'
AND wdr.id IN
<foreach collection="requestIds" item="requestId" separator="," open="(" close=")">
#{requestId}
</foreach>
UNION
SELECT ae.yb_class_enum AS encounter_yb_class,
fc.contract_name ,
ap."name" AS patient_name,
ap.gender_enum ,
ap.birth_date ,
ae.bus_no AS encounter_no,
ao."name" AS department_name,
ap.phone ,
ae.reception_time AS req_time,
ap2."name" AS doctor_name,
aci.unit_price ,
aci.total_price,
wsr.quantity ,
wsr.unit_code ,
wad."name" AS item_name,
ap.address,
ae.patient_id,
wad.chrgitm_lv
FROM wor_service_request wsr
LEFT JOIN wor_activity_definition wad
ON wsr.activity_id = wad.id
AND wad.delete_flag = '0'
LEFT JOIN adm_charge_item aci
ON aci.service_id = wsr.id
AND aci.delete_flag = '0'
LEFT JOIN adm_encounter ae
ON wsr.encounter_id = ae.id
AND ae.delete_flag = '0'
LEFT JOIN adm_patient ap
ON ae.patient_id = ap.id
AND ap.delete_flag = '0'
LEFT JOIN adm_organization ao
ON ao.id = ae.organization_id
AND ao.delete_flag = '0'
LEFT JOIN adm_account aa
ON ae.id = aa.encounter_id
AND aa.encounter_flag = 1
AND aa.delete_flag = '0'
LEFT JOIN fin_contract fc
ON aa.contract_no = fc.bus_no
AND fc.delete_flag = '0'
LEFT JOIN adm_practitioner ap2
ON ap2.id = wsr.requester_id
AND ap2.delete_flag = '0'
WHERE wsr.delete_flag = '0'
AND wsr.id IN
<foreach collection="requestIds" item="requestId" separator="," open="(" close=")">
#{requestId}
</foreach>
</select>
<select id="getPractitionerSignature" resultType="string">
SELECT signature
FROM adm_practitioner
WHERE id = #{practitionerId}
</select>
<select id="getActivityDefinition" resultType="com.openhis.web.common.dto.ActivityDefinitionDto">
SELECT ID AS
activity_definition_id,
NAME AS activity_definition_name
FROM wor_activity_definition
WHERE delete_flag = '0'
AND status_enum = #{statusEnum}
</select>
<select id="getPractitionerSignature" resultType="string">
SELECT signature
FROM adm_practitioner
WHERE id = #{practitionerId}
</select>
<select id="getActivityDefinition" resultType="com.openhis.web.common.dto.ActivityDefinitionDto">
SELECT ID AS
activity_definition_id,
NAME AS activity_definition_name
FROM wor_activity_definition
WHERE delete_flag = '0'
AND status_enum = #{statusEnum}
</select>
<select id="selectMedicineInventoryDetail"
resultType="com.openhis.web.pharmacymanage.dto.InventoryDetailDto">
SELECT wii.expiration_date ,
wii.location_id ,
wii.item_id ,
wii.lot_number AS inventory_lot_number,
wii.unit_code AS inventory_unit_code,
wii.quantity AS inventory_quantity,
mmd.part_percent ,
mmd.unit_code AS max_unit_code
FROM wor_inventory_item wii
LEFT JOIN med_medication_definition mmd
ON wii.item_id = mmd.id
AND mmd.delete_flag = '0'
WHERE wii.delete_flag = '0'
AND wii.item_id IN
<foreach item="itemId" collection="medicationIdList" index="index"
separator="," close=")" open="(">
#{itemId}
</foreach>
AND wii.location_id IN
<foreach item="locationId" collection="locationIdList" index="index"
separator="," close=")" open="(">
#{locationId}
</foreach>
AND wii.inventory_status_enum = #{active}
</select>
<select id="selectDeviceInventoryDetail"
resultType="com.openhis.web.pharmacymanage.dto.InventoryDetailDto">
SELECT wii.expiration_date ,
wii.location_id ,
wii.item_id ,
wii.lot_number AS inventory_lot_number,
wii.unit_code AS inventory_unit_code,
wii.quantity AS inventory_quantity,
add2.part_percent ,
add2.unit_code AS max_unit_code
FROM wor_inventory_item wii
LEFT JOIN adm_device_definition add2
ON wii.item_id = add2.id
AND add2.delete_flag = '0'
WHERE wii.delete_flag = '0'
AND wii.item_id IN
<foreach item="itemId" collection="deviceIdList" index="index"
separator="," close=")" open="(">
#{itemId}
</foreach>
AND wii.location_id IN
<foreach item="locationId" collection="locationIdList" index="index"
separator="," close=")" open="(">
#{locationId}
</foreach>
AND wii.inventory_status_enum = #{active}
</select>
</mapper>