feat: 合并 upstream/v1.3 新增功能模块(安全合并策略)

新增功能模块:
- 药房管理:住院退药、处方审核功能
- 报表管理:门诊管理报表、药房结算报表、医嘱统计报表
- 支付管理:三方对账功能
- 新增枚举类:电子处方类型、频次类型、病历状态等10个
- 新增实体类:处方审核记录、第三方支付请求、中医结算目录
- 工具类增强:年龄计算、Excel工具

合并策略:仅合并低风险新增文件,保留现有业务功能
上游版本:v1.3 (2025-03-06发版)
合并分支:merge-upstream-v1.3-0310

🤖 Auto-generated by Claude Code
This commit is contained in:
2026-03-10 18:16:23 +08:00
parent 39b608dfd0
commit fe07cee58c
116 changed files with 5406 additions and 330 deletions

View File

@@ -0,0 +1,43 @@
<?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.paymentmanage.mapper.ThreePartPayMapper">
<select id="getThreePartComparePaymentDtoList"
resultType="com.openhis.web.paymentmanage.dto.ThreePartComparePaymentDto">
SELECT
fin.ID AS payment_id,
fin.payment_no AS payment_no,
fin.tendered_amount AS tendered_amount,
del.amount AS paid_amount,
fin.bill_date AS bill_date,
pat."name" AS patient_name
FROM
fin_payment_reconciliation fin
LEFT JOIN fin_payment_rec_detail del ON fin."id" = del.reconciliation_id
AND del.pay_enum = 500000
LEFT JOIN adm_patient pat ON fin.patient_id = pat."id"
WHERE
fin.delete_flag = '0' AND fin.status_enum != 0 AND
fin.bill_date BETWEEN
to_timestamp(#{startTime}, 'YYYY-MM-DD HH24:MI:SS')::timestamptz
AND
to_timestamp(#{endTime}, 'YYYY-MM-DD HH24:MI:SS')::timestamptz
</select>
<select id="getThreePartCompareRequestDtoList"
resultType="com.openhis.web.paymentmanage.dto.ThreePartCompareRequestDto">
SELECT
req.ID AS request_id,
req.payment_id,
req.amount,
req.request_type
FROM
fin_three_part_pay_request req
LEFT JOIN fin_payment_reconciliation fin ON fin."id" = req.payment_id
WHERE
req.payment_id IN
<foreach item="paymentId" collection="paymentIds" separator="," close=")" open="(" index="">
#{paymentId}
</foreach>
</select>
</mapper>

View File

@@ -0,0 +1,165 @@
<?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.pharmacymanage.mapper.InHospitalReturnMedicineAppMapper">
<select id="selectEncounterInfoListPage" resultType="com.openhis.web.pharmacymanage.dto.EncounterInfoDto">
SELECT ii.reception_time,
ii.start_time,
ii.encounter_id,
ii.encounter_no,
ii.refund_enum,
ii.patient_name,
ii.patient_wb_str,
ii.patient_py_str,
ii.id_card,
ii.gender_enum,
ii.birth_date,
ii.department_name
FROM (
SELECT ae.reception_time,
ae.id AS encounter_id,
ae.bus_no AS encounter_no,
ae.tenant_id,
ae.start_time,
ae.class_enum,
mmd.status_enum AS refund_enum,
ap."name" AS patient_name,
ap.wb_str AS patient_wb_str,
ap.py_str AS patient_py_str,
ap.id_card,
ap.gender_enum,
ap.birth_date,
ao."name" AS department_name,
#{medMedicationDefinition} AS item_table
FROM adm_encounter ae
LEFT JOIN med_medication_request mmr
ON mmr.encounter_id = ae.id
AND mmr.delete_flag = '0'
LEFT JOIN med_medication_dispense mmd
ON mmd.med_req_id = mmr.id
AND mmd.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'
WHERE ae.delete_flag = '0'
AND ae.class_enum = #{imp}
<if test="refundStatus == null">
AND mmd.status_enum IN (#{refunded},#{pendingRefund})
</if>
<if test="refundStatus != null">
AND mmd.status_enum = #{refundStatus}
</if>
UNION
SELECT ae.reception_time,
ae.id AS encounter_id,
ae.bus_no AS encounter_no,
ae.tenant_id,
ae.start_time,
ae.class_enum,
wdd.status_enum AS refund_enum,
ap."name" AS patient_name,
ap.wb_str AS patient_wb_str,
ap.py_str AS patient_py_str,
ap.id_card,
ap.gender_enum,
ap.birth_date,
ao."name" AS department_name,
#{admDeviceDefinition} AS item_table
FROM adm_encounter ae
LEFT JOIN wor_device_request wdr
ON wdr.encounter_id = ae.id
AND wdr.delete_flag = '0'
LEFT JOIN wor_device_dispense wdd
ON wdd.device_req_id = wdr.id
AND wdd.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'
WHERE ae.delete_flag = '0'
AND ae.class_enum = #{imp}
<if test="refundStatus == null">
AND wdd.status_enum IN (#{refunded},#{pendingRefund})
</if>
<if test="refundStatus != null">
AND wdd.status_enum = #{refundStatus}
</if>
) AS ii
${ew.customSqlSegment}
ORDER BY ii.reception_time DESC
</select>
<select id="selectReturnMedicineInfo"
resultType="com.openhis.web.pharmacymanage.dto.ReturnMedicineInfoDto">
<if test="itemTable == null or itemTable == medMedicationDefinition">
SELECT mmd.status_enum AS refund_enum,
mmd.quantity,
mmd.unit_code,
mmd.lot_number,
mmd.dispense_quantity,
mmd.id AS dispense_id,
mmr.id AS request_id,
med."name" AS item_name,
med.id AS item_id,
doc."name" AS doctor_name,
mmd.trace_no,
#{medMedicationRequest} AS service_table
FROM med_medication_dispense mmd
INNER JOIN med_medication_request mmr
ON mmr.id = mmd.med_req_id
AND mmr.delete_flag = '0'
INNER JOIN med_medication_definition med
ON mmr.medication_id = med.id
AND med.delete_flag = '0'
LEFT JOIN adm_practitioner doc
ON mmr.practitioner_id = doc.id
AND doc.delete_flag = '0'
WHERE mmd.delete_flag = '0'
AND mmd.encounter_id = #{encounterId}
<if test="refundStatus == null">
AND mmd.status_enum IN (#{refunded},#{pendingRefund})
</if>
<if test="refundStatus != null">
AND mmd.status_enum = #{refundStatus}
</if>
</if>
<if test="itemTable == null">
UNION
</if>
<if test="itemTable == null or itemTable == admDeviceDefinition">
SELECT wdd.status_enum AS refund_enum,
wdd.quantity,
wdd.unit_code,
wdd.lot_number,
wdd.dispense_quantity,
wdd.id AS dispense_id,
wdr.id AS request_id,
dev."name" AS item_name,
dev.id AS item_id,
doc."name" AS doctor_name,
wdd.trace_no,
#{worDeviceRequest} AS service_table
FROM wor_device_dispense wdd
INNER JOIN wor_device_request wdr
ON wdr.id = wdd.device_req_id
AND wdr.delete_flag = '0'
INNER JOIN adm_device_definition dev
ON wdr.device_def_id = dev.id
AND dev.delete_flag = '0'
LEFT JOIN adm_practitioner doc
ON wdr.requester_id = doc.id
AND doc.delete_flag = '0'
WHERE wdd.delete_flag = '0'
AND wdd.encounter_id = #{encounterId}
<if test="refundStatus == null">
AND wdd.status_enum IN (#{refunded},#{pendingRefund})
</if>
<if test="refundStatus != null">
AND wdd.status_enum = #{refundStatus}
</if>
</if>
</select>
</mapper>

View File

@@ -0,0 +1,100 @@
<?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.reportmanage.mapper.AmbAdviceStatisticsAppMapper">
<select id="getMedStatistics" resultType="com.openhis.web.reportmanage.dto.AmbMedAdviceStatisticsDto">
SELECT mmr.prescription_no,
mmr.req_authored_time,
ap.name AS patient_name,
fc.bus_no AS contract_no,
fc.contract_name,
ccd.name AS condition_name,
ccd.yb_no AS condition_yb_no,
mmd.name AS advice_name,
mmr.quantity,
sdd.dict_label AS unit_code_text,
aci.total_price,
aper.name AS doctor_name,
ao.id AS open_org_id,
ao.name AS open_org_name
FROM med_medication_request AS mmr
LEFT JOIN adm_patient AS ap ON ap.id = mmr.patient_id AND ap.delete_flag = '0'
LEFT JOIN adm_charge_item AS aci ON aci.service_id = mmr.id AND aci.delete_flag = '0'
LEFT JOIN adm_account AS aa ON aa.id = aci.account_id AND aa.delete_flag = '0'
LEFT JOIN fin_contract AS fc ON fc.bus_no = aa.contract_no AND fc.delete_flag = '0'
LEFT JOIN adm_encounter_diagnosis AS aed
ON aed.id = mmr.encounter_diagnosis_id AND aed.delete_flag = '0'
LEFT JOIN cli_condition AS cc ON cc.id = aed.condition_id AND cc.delete_flag = '0'
LEFT JOIN cli_condition_definition AS ccd ON ccd.id = cc.definition_id AND ccd.delete_flag = '0'
LEFT JOIN med_medication_definition AS mmd ON mmd.id = mmr.medication_id AND mmd.delete_flag = '0'
LEFT JOIN sys_dict_data AS sdd ON mmr.unit_code = sdd.dict_value AND sdd.dict_type = 'unit_code'
LEFT JOIN adm_practitioner AS aper ON aper.id = mmr.practitioner_id AND aper.delete_flag = '0'
LEFT JOIN adm_organization AS ao ON ao.id = mmr.org_id AND ao.delete_flag = '0'
WHERE mmr.delete_flag = '0'
AND mmr.status_enum = #{statusEnum}
<if test="contractNo != null and contractNo != ''">
AND fc.bus_no = #{contractNo}
</if>
<if test="patientName != null and patientName != ''">
AND ap.name like concat('%', #{patientName}, '%')
</if>
<if test="openOrgId != null">
AND ao.id = #{openOrgId}
</if>
AND mmr.req_authored_time >= #{startTime} ::timestamp
AND mmr.req_authored_time &lt;= #{endTime} :: timestamp
AND EXISTS (SELECT 1
FROM adm_encounter AS ae
WHERE ae.ID = mmr.encounter_id
AND ae.delete_flag = '0'
AND ae.class_enum = #{classEnum})
ORDER BY mmr.req_authored_time DESC
</select>
<select id="getActStatistics" resultType="com.openhis.web.reportmanage.dto.AmbActAdviceStatisticsDto">
SELECT wsr.authored_time AS req_authored_time,
ap.name AS patient_name,
fc.bus_no AS contract_no,
fc.contract_name,
ccd.name AS condition_name,
ccd.yb_no AS condition_yb_no,
wad.name AS advice_name,
wsr.quantity,
aci.total_price,
aper.name AS doctor_name,
ao.id AS open_org_id,
ao.name AS open_org_name
FROM wor_service_request AS wsr
LEFT JOIN adm_patient AS ap ON ap.id = wsr.patient_id AND ap.delete_flag = '0'
LEFT JOIN adm_charge_item AS aci ON aci.service_id = wsr.id AND aci.delete_flag = '0'
LEFT JOIN adm_account AS aa ON aa.id = aci.account_id AND aa.delete_flag = '0'
LEFT JOIN fin_contract AS fc ON fc.bus_no = aa.contract_no AND fc.delete_flag = '0'
LEFT JOIN adm_encounter_diagnosis AS aed
ON aed.id = wsr.encounter_diagnosis_id AND aed.delete_flag = '0'
LEFT JOIN cli_condition AS cc ON cc.id = aed.condition_id AND cc.delete_flag = '0'
LEFT JOIN cli_condition_definition AS ccd ON ccd.id = cc.definition_id AND ccd.delete_flag = '0'
LEFT JOIN wor_activity_definition AS wad ON wad.id = wsr.activity_id AND wad.delete_flag = '0'
LEFT JOIN adm_practitioner AS aper ON aper.id = wsr.requester_id AND aper.delete_flag = '0'
LEFT JOIN adm_organization AS ao ON ao.id = wsr.org_id AND ao.delete_flag = '0'
WHERE wsr.delete_flag = '0'
AND wsr.status_enum = #{statusEnum}
<if test="contractNo != null and contractNo != ''">
AND fc.bus_no = #{contractNo}
</if>
<if test="patientName != null and patientName != ''">
AND ap.name like concat('%', #{patientName}, '%')
</if>
<if test="openOrgId != null">
AND ao.id = #{openOrgId}
</if>
AND wsr.authored_time >= #{startTime} ::timestamp
AND wsr.authored_time &lt;= #{endTime} :: timestamp
AND EXISTS ( SELECT 1
FROM adm_encounter AS ae
WHERE ae.ID = wsr.encounter_id
AND ae.delete_flag = '0'
AND ae.class_enum = #{classEnum} )
ORDER BY wsr.authored_time DESC
</select>
</mapper>

View File

@@ -0,0 +1,123 @@
<?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.reportmanage.mapper.PharmacySettlementReportAppMapper">
<select id="getListInfo" resultType="com.openhis.web.reportmanage.dto.PharmacySettlementReportDto">
SELECT sdd.dict_label AS category_code_text,
mmd.bus_no AS item_no,
mmd.ID AS item_id,
mmd.NAME AS item_name,
mm.total_volume,
mmd.unit_code,
sdd1.dict_label AS unit_code_text,
mmd.min_unit_code,
sdd2.dict_label AS min_unit_code_text,
mmd.part_percent
FROM med_medication_definition AS mmd
LEFT JOIN med_medication AS mm ON mmd.ID = mm.medication_def_id
AND mm.delete_flag = '0'
LEFT JOIN sys_dict_data AS sdd ON sdd.dict_value = mmd.category_code
AND sdd.status = '0'
AND sdd.dict_type = 'med_category_code'
LEFT JOIN sys_dict_data AS sdd1 ON sdd1.dict_value = mmd.unit_code
AND sdd1.status = '0'
AND sdd1.dict_type = 'unit_code'
LEFT JOIN sys_dict_data AS sdd2 ON sdd2.dict_value = mmd.min_unit_code
AND sdd2.status = '0'
AND sdd2.dict_type = 'unit_code'
WHERE mmd.delete_flag = '0'
<if test="searchKey != null and searchKey != ''">
AND (mmd.py_str LIKE concat('%', #{searchKey}, '%') OR mmd.NAME LIKE concat('%', #{searchKey}, '%'))
</if>
order by mmd.category_code
</select>
<select id="getDispenseInfo" resultType="com.openhis.web.reportmanage.dto.PharmacySettlementMedDto">
SELECT medication_id,
min_unit_code,
COALESCE(SUM(CASE WHEN status = 'dispense' THEN quantity END), 0) -
COALESCE(SUM(CASE WHEN status = 'return' THEN quantity END), 0) AS actual_quantity,
sum(total_price) AS dispense_price
FROM (
SELECT mmdis.medication_id,
CASE
WHEN mmdis.unit_code = mmd.min_unit_code THEN
mmdis.unit_code
ELSE mmd.min_unit_code
END AS min_unit_code,
CASE
WHEN mmdis.unit_code = mmd.min_unit_code THEN
mmdis.quantity
ELSE mmdis.quantity * mmd.part_percent
END AS quantity,
CASE
WHEN mmdis.status_enum = #{completed} THEN
'dispense'
WHEN mmdis.status_enum = #{refunded} THEN
'return'
END AS status,
aci.total_price AS total_price
FROM med_medication_dispense AS mmdis
LEFT JOIN med_medication_definition AS mmd ON mmd.ID = mmdis.medication_id
AND mmd.delete_flag = '0'
LEFT JOIN med_medication_request AS mmr ON mmr.id = mmdis.med_req_id
AND mmr.delete_flag = '0'
LEFT JOIN adm_charge_item AS aci ON aci.service_id = mmr.id
AND mmr.delete_flag = '0'
WHERE mmdis.delete_flag = '0'
AND mmdis.location_id = #{locationId}
AND mmdis.dispense_time &gt;= #{startTime} ::timestamp
AND mmdis.dispense_time &lt;= #{endTime} :: timestamp
AND mmdis.status_enum IN ( #{completed}
, #{refunded} )
) AS subquery
GROUP BY medication_id,
min_unit_code
</select>
<select id="getSupplyRequestInfo" resultType="com.openhis.web.reportmanage.dto.PharmacySettlementMedDto">
SELECT wsr.item_id AS medication_id,
mmd.min_unit_code AS min_unit_code,
wsr.item_quantity AS supply_request_quantity,
wsr.total_price,
wsr.profit_loss_price,
wsr.type_enum,
wsr.source_location_id,
wsr.purpose_location_id
FROM wor_supply_request AS wsr
LEFT JOIN wor_supply_delivery AS wsd ON wsr.ID = wsd.request_id
AND wsd.delete_flag = '0'
LEFT JOIN med_medication_definition AS mmd ON mmd.ID = wsr.item_id
AND mmd.delete_flag = '0'
WHERE wsr.delete_flag = '0'
AND wsr.item_table = #{medTableName}
AND wsd.status_enum = #{completed}
AND wsr.approval_time &gt;= #{startTime} ::timestamp
AND wsr.approval_time &lt;= #{endTime} :: timestamp
AND (wsr.source_location_id = #{locationId}
OR wsr.purpose_location_id = #{locationId})
AND wsr.type_enum IN (#{productBatchStocktaking}
, #{productStocktaking}
, #{productTransfer}
, #{productBatchTransfer}
, #{lossReportForm}
, #{issueInventory}
, #{returnIssue})
</select>
<select id="getInventoryInfo" resultType="com.openhis.web.reportmanage.dto.PharmacySettlementMedDto">
SELECT wii.item_id AS medication_id,
wii.quantity AS inventory_quantity,
wii.lot_number,
acidd.amount
FROM wor_inventory_item AS wii
LEFT JOIN adm_charge_item_def_detail AS acidd ON acidd.condition_value = wii.lot_number
AND acidd.delete_flag = '0'
AND acidd.condition_code = #{conditionCode}
WHERE wii.delete_flag = '0'
AND wii.item_table = #{medTableName}
AND wii.location_id = #{locationId}
</select>
</mapper>