Merge branch 'develop' of http://192.168.110.253:3000/wangyizhe/his into develop
This commit is contained in:
@@ -665,7 +665,7 @@ public class NurseBillingAppService implements INurseBillingAppService {
|
||||
// 1. 校验:待删除项是否已收费,已收费则抛出异常阻止删除
|
||||
checkDeletedDeviceChargeStatus(requestIds);
|
||||
// 软删除执行记录
|
||||
List<Procedure> procedureList = iProcedureService.listByIds(requestIds);
|
||||
List<Procedure> procedureList = iProcedureService.getProcedureRecords(requestIds, serviceTable);
|
||||
List<Long> procedureIds = procedureList.stream().filter(Objects::nonNull) // 过滤掉null的Procedure对象
|
||||
.map(Procedure::getId).filter(Objects::nonNull) // 过滤掉id为null的记录(按需添加)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
@@ -331,8 +331,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
) 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 != ''">
|
||||
<![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')}
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
-- Bug #437 数据排查:查询手术计费中的重复收费项
|
||||
-- 用法:在生产环境执行前先在测试环境验证
|
||||
-- 作者:荀彧
|
||||
|
||||
-- 1. 查找手术计费中的重复收费项(同一手术+同一产品产生多条记录)
|
||||
SELECT
|
||||
encounter_id AS "就诊ID",
|
||||
product_table AS "产品表",
|
||||
product_id AS "产品ID",
|
||||
service_table AS "服务表",
|
||||
service_id AS "服务ID",
|
||||
generate_source_enum AS "生成来源",
|
||||
COUNT(*) AS "重复次数",
|
||||
STRING_AGG(id::TEXT, ',') AS "收费项ID列表",
|
||||
STRING_AGG(status_enum::TEXT, ',') AS "状态列表",
|
||||
STRING_AGG(total_price::TEXT, ',') AS "金额列表",
|
||||
STRING_AGG(create_time::TEXT, ',') AS "创建时间列表"
|
||||
FROM adm_charge_item
|
||||
WHERE delete_flag = '0'
|
||||
AND generate_source_enum IN (1, 2) -- 医生开立(1) 或 护士划价(2)
|
||||
AND product_table IN ('cli_surgery', 'wor_device_request', 'wor_activity_definition')
|
||||
GROUP BY encounter_id, product_table, product_id, service_table, service_id, generate_source_enum
|
||||
HAVING COUNT(*) > 1
|
||||
ORDER BY COUNT(*) DESC;
|
||||
|
||||
-- 2. 查找同一手术单号下是否有重复的收费项
|
||||
SELECT
|
||||
ci.product_id AS "手术ID",
|
||||
cs.surgery_no AS "手术单号",
|
||||
cs.surgery_name AS "手术名称",
|
||||
COUNT(ci.id) AS "收费项数量",
|
||||
STRING_AGG(ci.id::TEXT || '(' || ci.status_enum || ')' || '=' || ci.total_price, '; ') AS "收费项详情"
|
||||
FROM adm_charge_item ci
|
||||
LEFT JOIN cli_surgery cs ON ci.product_id = cs.id
|
||||
WHERE ci.delete_flag = '0'
|
||||
AND ci.product_table = 'cli_surgery'
|
||||
AND ci.generate_source_enum = 1
|
||||
GROUP BY ci.product_id, cs.surgery_no, cs.surgery_name
|
||||
HAVING COUNT(ci.id) > 1
|
||||
ORDER BY COUNT(ci.id) DESC;
|
||||
|
||||
-- 3. 统计重复数据量(用于评估影响范围)
|
||||
SELECT
|
||||
generate_source_enum AS "生成来源(1=医生开立,2=护士划价)",
|
||||
product_table AS "产品表",
|
||||
COUNT(*) AS "重复组数",
|
||||
SUM(cnt - 1) AS "多余记录数"
|
||||
FROM (
|
||||
SELECT
|
||||
generate_source_enum,
|
||||
product_table,
|
||||
COUNT(*) AS cnt
|
||||
FROM adm_charge_item
|
||||
WHERE delete_flag = '0'
|
||||
GROUP BY encounter_id, product_table, product_id, service_table, service_id, generate_source_enum
|
||||
HAVING COUNT(*) > 1
|
||||
) sub
|
||||
GROUP BY generate_source_enum, product_table
|
||||
ORDER BY SUM(cnt - 1) DESC;
|
||||
@@ -0,0 +1,28 @@
|
||||
-- Bug #437 修复:手术计费重复生成三条收费记录
|
||||
-- 根因:adm_charge_item 表缺少唯一约束,同一手术/耗材的收费项可被重复插入
|
||||
-- 影响范围:手术计费、护士划价等所有生成收费项的场景
|
||||
-- 作者:荀彧
|
||||
-- 日期:2026-04-25
|
||||
|
||||
-- 1. 添加复合唯一约束:防止同一就诊下同一来源服务+产品产生重复收费项
|
||||
-- 约束字段:就诊ID + 医疗服务表 + 医疗服务ID + 产品表 + 产品ID + 账单生成来源
|
||||
-- 这些字段组合唯一确定一笔收费项,重复插入将被数据库拒绝
|
||||
ALTER TABLE adm_charge_item
|
||||
ADD CONSTRAINT uk_charge_item_encounter_service_product_source
|
||||
UNIQUE (encounter_id, service_table, service_id, product_table, product_id, generate_source_enum);
|
||||
|
||||
-- 2. 添加索引:加速手术计费查询(按手术单号过滤)
|
||||
-- 前端手术计费页面使用 generate_source_enum=2 过滤手术计费项
|
||||
CREATE INDEX idx_charge_item_generate_source_product
|
||||
ON adm_charge_item (generate_source_enum, product_table, product_id)
|
||||
WHERE delete_flag = '0';
|
||||
|
||||
-- 3. 添加索引:加速按就诊ID+状态查询收费项
|
||||
CREATE INDEX idx_charge_item_encounter_status
|
||||
ON adm_charge_item (encounter_id, status_enum)
|
||||
WHERE delete_flag = '0';
|
||||
|
||||
-- DOWN 迁移(回滚脚本)
|
||||
-- ALTER TABLE adm_charge_item DROP CONSTRAINT IF EXISTS uk_charge_item_encounter_service_product_source;
|
||||
-- DROP INDEX IF EXISTS idx_charge_item_generate_source_product;
|
||||
-- DROP INDEX IF EXISTS idx_charge_item_encounter_status;
|
||||
Reference in New Issue
Block a user