Переглянути джерело

调整病种成本相关三个标准报表的数据生成逻辑

JammeyJiang 1 місяць тому
батько
коміт
853d551a7b

+ 103 - 48
src/main/java/com/kcim/service/impl/StandardReportServiceImpl.java

@@ -62,6 +62,8 @@ public class StandardReportServiceImpl implements StandardReportService {
     ComputeProjectCostAccountRepository computeProjectCostAccountRepository;
 
     ComputePatientCostAccountRepository computePatientCostAccountRepository;
+
+    ResponsibilityDepartmentRepository responsibilityDepartmentRepository;
     
     /**
      * 科室直接成本表(医疗成本)
@@ -642,7 +644,7 @@ public class StandardReportServiceImpl implements StandardReportService {
         reportList.sort(Comparator.comparing(HospitalVisitCostCompositionVO::getResponsibilitySort,
                 Comparator.nullsLast(Comparator.naturalOrder())));
         // 添加总计行
-//        reportList.add(NumberConstant.ZERO,grandTotal);
+        reportList.add(NumberConstant.ZERO,grandTotal);
         return reportList;
     }
 
@@ -820,11 +822,11 @@ public class StandardReportServiceImpl implements StandardReportService {
             BigDecimal respParamValue = getParamValue(respShareParamValues, visitsBedDaysParamCode[NumberConstant.ZERO]);
             item.setServiceCount(respParamValue);
             //计算每诊次的医疗成本
-            item.setMedicalCost(getPercent(item.getMedicalCost(),bedDaysParamValue));
+            item.setMedicalCost(getPercent(item.getMedicalCost(),respParamValue));
             //计算每诊次的医疗全成本
-            item.setMedicalFullCost(getPercent(item.getMedicalFullCost(),bedDaysParamValue));
+            item.setMedicalFullCost(getPercent(item.getMedicalFullCost(),respParamValue));
             //计算每诊次的医院全成本
-            item.setHospitalFullCost(getPercent(item.getHospitalFullCost(),bedDaysParamValue));
+            item.setHospitalFullCost(getPercent(item.getHospitalFullCost(),respParamValue));
             // 将各科室金额累加到总计对象
             addBigDecimalFields(item, grandTotal);
         }
@@ -852,12 +854,12 @@ public class StandardReportServiceImpl implements StandardReportService {
         if(CollectionUtils.isEmpty(itemList)){
             throw new CostException("医疗服务项目未维护,请先添加医疗服务项目");
         }
-
+        //获取项目成本数据
         List<ComputeProjectCostAccount> projectCostAccountList = computeProjectCostAccountRepository.getList(computeDate);
         if(CollectionUtils.isEmpty(projectCostAccountList)){
             throw new CostException("请先计算项目成本");
         }
-
+        //把标准服务项目字典转成Map(第一层+第二层)
         List<Map<String, StandItem>> standItemMapDict = getStandItemMapDict(standItemList);
         // 记录项目类别对象
         Map<String, HospitalServiceProjectCostVO> projectCostMap = new HashMap<>();
@@ -1018,14 +1020,14 @@ public class StandardReportServiceImpl implements StandardReportService {
         try {
             //计算单个病种的成本
             medServiceCostDetailList.forEach(vo -> {
-                vo.setMedicalCost(getPercent(vo.getServiceVolume(),vo.getMedicalCost()));
-                vo.setMedicalFullCost(getPercent(vo.getServiceVolume(),vo.getMedicalFullCost()));
-                vo.setHospitalFullCost(getPercent(vo.getServiceVolume(),vo.getHospitalFullCost()));
+                vo.setMedicalCost(getPercent(vo.getMedicalCost(),vo.getServiceVolume()));
+                vo.setMedicalFullCost(getPercent(vo.getMedicalFullCost(),vo.getServiceVolume()));
+                vo.setHospitalFullCost(getPercent(vo.getHospitalFullCost(),vo.getServiceVolume()));
             });
         }catch (Exception e){
             log.error("计算病种成本时发生异常",e);
         }
-
+        medServiceCostDetailList.sort(Comparator.comparing(DiseaseCostDetailVO::getItemCode));
         return medServiceCostDetailList;
     }
 
@@ -1081,15 +1083,34 @@ public class StandardReportServiceImpl implements StandardReportService {
         if(CollectionUtils.isEmpty(projectCostAccountList)){
             throw new CostException("请先计算患者成本");
         }
-        Map<String, List<DiseaseCostDetailVO>> deptPtAccountGroup = projectCostAccountList.stream().collect(Collectors.groupingBy(DiseaseCostDetailVO::getDepartmentCode));
+        //科室责任中心对照数据
+        List<ResponsibilityDepartIdVO> responsibilityDepartment = responsibilityDepartmentRepository.getResponsibility(UserContext.getHospId());
+        Map<String, List<ResponsibilityDepartIdVO>> deptRespMap = responsibilityDepartment.stream()
+                .filter(r -> r.getDepartmentCode() != null) // 过滤掉departmentCode为null的记录
+                .collect(Collectors.groupingBy(ResponsibilityDepartIdVO::getDepartmentCode));
+        //设置科室对应的责任中心
+        for (DiseaseCostDetailVO diseaseCostDetailVO : projectCostAccountList) {
+            List<ResponsibilityDepartIdVO> responsibilityDepartIdVOList = deptRespMap.get(diseaseCostDetailVO.getDepartmentCode());
+            if(CollectionUtils.isEmpty(responsibilityDepartIdVOList)){
+                continue;
+            }
+            ResponsibilityDepartIdVO responsibilityDepartVO = responsibilityDepartIdVOList.get(NumberConstant.ZERO);
+            diseaseCostDetailVO.setResponsibilityCode(responsibilityDepartVO.getResponsibilityCode());
+            diseaseCostDetailVO.setResponsibilityName(responsibilityDepartVO.getResponsibilityName());
+        }
+        //按责任中心分组
+        Map<String, List<DiseaseCostDetailVO>> deptPtAccountGroup = projectCostAccountList.stream()
+                .filter(d -> d.getResponsibilityCode() != null) // 过滤掉responsibilityCode为null的记录
+                .collect(Collectors.groupingBy(DiseaseCostDetailVO::getResponsibilityCode));
 
         List<CommonResponsibilityReportVo> titleList = new ArrayList<>();
         // 提取科室名称作为列标题
         deptPtAccountGroup.forEach((deptCode, deptPtAccountList) -> {
             if(!CollectionUtils.isEmpty(deptPtAccountList)){
                 CommonResponsibilityReportVo title = new CommonResponsibilityReportVo();
-                title.setResponsibilityName(deptPtAccountList.get(NumberConstant.ZERO).getDepartmentName());
-                title.setResponsibilityCode(deptCode);
+                DiseaseCostDetailVO vo = deptPtAccountList.get(NumberConstant.ZERO);
+                title.setResponsibilityName(vo.getResponsibilityName());
+                title.setResponsibilityCode(vo.getResponsibilityCode());
                 title.setSort(NumberConstant.ONE);
                 //添加子级标题
                 addCommonResponsibilityChild(title);
@@ -1114,19 +1135,28 @@ public class StandardReportServiceImpl implements StandardReportService {
                 itemVo.setTotalValue(BigDecimal.ZERO);
                 diseaseCostMap.put(costItem.getItemCode(),itemVo);
             }
-            //金额对象
-            ReportVo amountReportVo = new ReportVo();
-            amountReportVo.setCode(getResponsibilityAmountCode(costItem.getDepartmentCode()));
-            // 设置金额
-            amountReportVo.setValue(costItem.getHospitalFullCost());
-            // 添加金额
-            itemVo.getData().add(amountReportVo);
+            Optional<ReportVo> respItem = itemVo.getData().stream().filter(vo -> vo.getCode().equals(getResponsibilityAmountCode(costItem.getResponsibilityCode()))).findFirst();
+            //已包含此责任中心的项目,直接将金额加到已有的项目上
+            if(respItem.isPresent()){
+                BigDecimal value = (BigDecimal) respItem.get().getValue();
+                respItem.get().setValue(value.add(costItem.getHospitalFullCost()));
+            }else{
+                //金额对象
+                ReportVo amountReportVo = new ReportVo();
+                amountReportVo.setCode(getResponsibilityAmountCode(costItem.getResponsibilityCode()));
+                // 设置金额
+                amountReportVo.setValue(costItem.getHospitalFullCost());
+                // 添加金额
+                itemVo.getData().add(amountReportVo);
+            }
             //计算总额
             itemVo.setTotalValue(itemVo.getTotalValue().add(costItem.getHospitalFullCost()));
         }
 
         List<StandardReportFormCustomVo> diseaseCostDetailList =new ArrayList<>(diseaseCostMap.values());
 
+        diseaseCostDetailList.sort(Comparator.comparing(StandardReportFormCustomVo::getReportCode));
+
         // 遍历每个成本项目(列转行)
         for (StandardReportFormCustomVo costItem : diseaseCostDetailList) {
             if(CollectionUtils.isEmpty(costItem.getData())){
@@ -1137,7 +1167,7 @@ public class StandardReportServiceImpl implements StandardReportService {
             for (ReportVo amountReportVo : dataList) {
                 //占比对象
                 ReportVo percentReportVo = new ReportVo();
-                percentReportVo.setCode(amountReportVo.getCode());
+                percentReportVo.setCode(amountReportVo.getCode().replace(AMOUNT_FIELD, PERCENT_FIELD));
                 //计算百分比
                 BigDecimal percent = getPercent((BigDecimal)amountReportVo.getValue() , costItem.getTotalValue());
                 percentReportVo.setValue(percent);
@@ -1205,6 +1235,7 @@ public class StandardReportServiceImpl implements StandardReportService {
             vo.setMedicalFullCost(getPercent(vo.getMedicalFullCost(),vo.getServiceVolume()));
             vo.setHospitalFullCost(getPercent(vo.getHospitalFullCost(),vo.getServiceVolume()));
         });
+        drgeCostDetailList.sort(Comparator.comparing(DiseaseCostDetailVO::getItemCode));
         return drgeCostDetailList;
     }
 
@@ -1259,15 +1290,30 @@ public class StandardReportServiceImpl implements StandardReportService {
             throw new CostException("请先计算患者成本");
         }
 
-        Map<String, List<DiseaseCostDetailVO>> deptPtAccountGroup = projectCostAccountList.stream().collect(Collectors.groupingBy(DiseaseCostDetailVO::getDepartmentCode));
+        //科室责任中心对照数据
+        List<ResponsibilityDepartIdVO> responsibilityDepartment = responsibilityDepartmentRepository.getResponsibility(UserContext.getHospId());
+        Map<String, List<ResponsibilityDepartIdVO>> deptRespMap = responsibilityDepartment.stream().filter(r -> r.getDepartmentCode() != null).collect(Collectors.groupingBy(ResponsibilityDepartIdVO::getDepartmentCode));
+        //设置科室对应的责任中心
+        for (DiseaseCostDetailVO diseaseCostDetailVO : projectCostAccountList) {
+            List<ResponsibilityDepartIdVO> responsibilityDepartIdVOList = deptRespMap.get(diseaseCostDetailVO.getDepartmentCode());
+            if(CollectionUtils.isEmpty(responsibilityDepartIdVOList)){
+                continue;
+            }
+            ResponsibilityDepartIdVO responsibilityDepartVO = responsibilityDepartIdVOList.get(NumberConstant.ZERO);
+            diseaseCostDetailVO.setResponsibilityCode(responsibilityDepartVO.getResponsibilityCode());
+            diseaseCostDetailVO.setResponsibilityName(responsibilityDepartVO.getResponsibilityName());
+        }
+
+        Map<String, List<DiseaseCostDetailVO>> deptPtAccountGroup = projectCostAccountList.stream().filter(r -> r.getResponsibilityCode() != null).collect(Collectors.groupingBy(DiseaseCostDetailVO::getResponsibilityCode));
 
         List<CommonResponsibilityReportVo> titleList = new ArrayList<>();
         // 提取科室名称作为列标题
         deptPtAccountGroup.forEach((deptCode, deptPtAccountList) -> {
             if(!CollectionUtils.isEmpty(deptPtAccountList)){
                 CommonResponsibilityReportVo title = new CommonResponsibilityReportVo();
-                title.setResponsibilityName(deptPtAccountList.get(NumberConstant.ZERO).getDepartmentName());
-                title.setResponsibilityCode(deptCode);
+                DiseaseCostDetailVO vo = deptPtAccountList.get(NumberConstant.ZERO);
+                title.setResponsibilityName(vo.getDepartmentName());
+                title.setResponsibilityCode(vo.getResponsibilityCode());
                 title.setSort(NumberConstant.ONE);
                 //添加子级标题
                 addCommonResponsibilityChild(title);
@@ -1294,7 +1340,7 @@ public class StandardReportServiceImpl implements StandardReportService {
             }
             //金额对象
             ReportVo amountReportVo = new ReportVo();
-            amountReportVo.setCode(getResponsibilityAmountCode(costItem.getDepartmentCode()));
+            amountReportVo.setCode(getResponsibilityAmountCode(costItem.getResponsibilityCode()));
             // 设置金额
             amountReportVo.setValue(costItem.getHospitalFullCost());
             // 添加金额
@@ -1315,7 +1361,7 @@ public class StandardReportServiceImpl implements StandardReportService {
             for (ReportVo amountReportVo :dataList) {
                 //占比对象
                 ReportVo percentReportVo = new ReportVo();
-                percentReportVo.setCode(amountReportVo.getCode());
+                percentReportVo.setCode(amountReportVo.getCode().replace(AMOUNT_FIELD, PERCENT_FIELD));
                 //计算百分比
                 BigDecimal percent = getPercent((BigDecimal)amountReportVo.getValue() , costItem.getTotalValue());
                 percentReportVo.setValue(percent);
@@ -2234,29 +2280,38 @@ public class StandardReportServiceImpl implements StandardReportService {
                     (costAllocationVO.getDirectCost() == null ? BigDecimal.ZERO : costAllocationVO.getDirectCost())
                             .add(allocationQuery.getAmount()));
         }else{
-            switch (sourceResponsibility.getStandardShareLevel())
-            {
-                case "1":
-                    // 行政后勤类科室成本
-                    costAllocationVO.setAllocatedAdminCost(
-                            (costAllocationVO.getAllocatedAdminCost() == null ? BigDecimal.ZERO : costAllocationVO.getAllocatedAdminCost())
-                                    .add(allocationQuery.getAmount()));
-                case "2":
-                    // 辅助支持类科室成本
-                    costAllocationVO.setAllocatedSupportCost(
-                            (costAllocationVO.getAllocatedSupportCost() == null ? BigDecimal.ZERO : costAllocationVO.getAllocatedSupportCost())
-                                    .add(allocationQuery.getAmount()));
-                case "3":
-                    // 技术类科室成本
-                    costAllocationVO.setAllocatedTechCost(
-                            (costAllocationVO.getAllocatedTechCost() == null ? BigDecimal.ZERO : costAllocationVO.getAllocatedTechCost())
-                                    .add(allocationQuery.getAmount()));
-                break;
+            //如果分摊层级和目标层级一样加到直接成本
+            if(sourceResponsibility.getStandardShareLevel().equals(responsibility.getStandardShareLevel())){
+                costAllocationVO.setDirectCost(
+                        (costAllocationVO.getDirectCost() == null ? BigDecimal.ZERO : costAllocationVO.getDirectCost())
+                                .add(allocationQuery.getAmount()));
+            }else{
+                switch (sourceResponsibility.getStandardShareLevel())
+                {
+                    case "1":
+                        // 行政后勤类科室成本
+                        costAllocationVO.setAllocatedAdminCost(
+                                (costAllocationVO.getAllocatedAdminCost() == null ? BigDecimal.ZERO : costAllocationVO.getAllocatedAdminCost())
+                                        .add(allocationQuery.getAmount()));
+                        break;
+                    case "2":
+                        // 辅助支持类科室成本
+                        costAllocationVO.setAllocatedSupportCost(
+                                (costAllocationVO.getAllocatedSupportCost() == null ? BigDecimal.ZERO : costAllocationVO.getAllocatedSupportCost())
+                                        .add(allocationQuery.getAmount()));
+                        break;
+                    case "3":
+                        // 技术类科室成本
+                        costAllocationVO.setAllocatedTechCost(
+                                (costAllocationVO.getAllocatedTechCost() == null ? BigDecimal.ZERO : costAllocationVO.getAllocatedTechCost())
+                                        .add(allocationQuery.getAmount()));
+                        break;
+                }
+                //小计
+                costAllocationVO.setSubtotal(
+                        (costAllocationVO.getSubtotal() == null ? BigDecimal.ZERO : costAllocationVO.getSubtotal())
+                                .add(allocationQuery.getAmount()));
             }
-            //小计
-            costAllocationVO.setSubtotal(
-                    (costAllocationVO.getSubtotal() == null ? BigDecimal.ZERO : costAllocationVO.getSubtotal())
-                            .add(allocationQuery.getAmount()));
         }
         // 医疗类科室成本
         costAllocationVO.setMedicalCost(

+ 10 - 0
src/main/java/com/kcim/vo/DiseaseCostDetailVO.java

@@ -184,4 +184,14 @@ public class DiseaseCostDetailVO {
      * </p>
      */
     private BigDecimal otherMedicalExpensesRatio;
+
+    /**
+     * 科室对应的责任中心代码
+     */
+    private String responsibilityCode;
+
+    /**
+     * 科室对应的责任中心名称
+     */
+    private String responsibilityName;
 }

+ 9 - 6
src/main/resources/mapper/ComputePatientCostAccountMapper.xml

@@ -24,7 +24,7 @@
 
     <select id="getDiseaseCostDetailList" resultType="com.kcim.vo.DiseaseCostDetailVO">
         SELECT
-            c.`primary_diag_code` as itemCode,
+            SUBSTR(c.`primary_diag_code`,1,3) as itemCode,
             c.`primary_diag_name` as itemName ,
             b.cost_type as costTypeCode,
             COUNT(1) AS serviceVolume,
@@ -44,12 +44,13 @@
           AND a.hosp_id = #{hospId,jdbcType=BIGINT}
           AND a.compute_date = #{computeDate,jdbcType=VARCHAR}
         GROUP BY
-            c.`primary_diag_code`,
+--             c.`primary_diag_code`,
+            SUBSTR(c.`primary_diag_code`,1,3),
             b.cost_type
     </select>
     <select id="getDiseaseCostCompositionDetail" resultType="com.kcim.vo.DiseaseCostDetailVO">
         SELECT
-            c.`primary_diag_code` as itemCode,
+            SUBSTR(c.`primary_diag_code`,1,3) as itemCode,
             c.`primary_diag_name` as itemName ,
             b.account_type as costTypeCode,
             COUNT(1) AS serviceVolume,
@@ -69,12 +70,13 @@
           AND a.hosp_id = #{hospId,jdbcType=BIGINT}
           AND a.compute_date = #{computeDate,jdbcType=VARCHAR}
         GROUP BY
-            c.`primary_diag_code`,
+--             c.`primary_diag_code`,
+            SUBSTR(c.`primary_diag_code`,1,3),
             b.account_type
     </select>
     <select id="getDeptDiseaseCostCompositionDetail" resultType="com.kcim.vo.DiseaseCostDetailVO">
         SELECT
-            c.`primary_diag_code` as itemCode,
+            SUBSTR(c.`primary_diag_code`,1,3) as itemCode,
             c.`primary_diag_name` as itemName ,
             a.department_code as departmentCode,
             a.department_name as departmentName,
@@ -95,7 +97,8 @@
           AND a.hosp_id = #{hospId,jdbcType=BIGINT}
           AND a.compute_date = #{computeDate,jdbcType=VARCHAR}
         GROUP BY
-            c.`primary_diag_code`,
+--             c.`primary_diag_code`,
+            SUBSTR(c.`primary_diag_code`,1,3),
             a.department_code
     </select>
     <select id="getDrgCostDetailList" resultType="com.kcim.vo.DiseaseCostDetailVO">

+ 1 - 0
src/main/resources/mapper/ResponsibilityDepartmentMapper.xml

@@ -22,6 +22,7 @@
     <select id="getResponsibility" resultType="com.kcim.vo.ResponsibilityDepartIdVO">
         SELECT
             b.department_id,
+            b.department_code,
             b.responsibility_id,
             a.responsibility_code,
             a.responsibility_name,