Ver código fonte

添加三个DRG成本明细表相关代码

JammeyJiang 2 meses atrás
pai
commit
d447ad8f94

+ 24 - 0
src/main/java/com/kcim/dao/mapper/ComputePatientCostAccountMapper.java

@@ -41,4 +41,28 @@ public interface ComputePatientCostAccountMapper extends BaseMapper<ComputePatie
      * @return
      */
     List<DiseaseCostDetailVO> getDeptDiseaseCostCompositionDetail(@Param("computeDate") String computeDate, @Param("hospId") Long hospId);
+
+    /**
+     * 获取DRG成本明细
+     * @param computeDate
+     * @param hospId
+     * @return
+     */
+    List<DiseaseCostDetailVO> getDrgCostDetailList(@Param("computeDate") String computeDate, @Param("hospId") Long hospId);
+
+    /**
+     * 获取DRG成本构成明细
+     * @param computeDate
+     * @param hospId
+     * @return
+     */
+    List<DiseaseCostDetailVO> getDrgCostCompositionDetail(@Param("computeDate") String computeDate, @Param("hospId") Long hospId);
+
+    /**
+     * 获取服务单元DRG成本构成明细
+     * @param computeDate
+     * @param hospId
+     * @return
+     */
+    List<DiseaseCostDetailVO> getDeptDrgCostCompositionDetail(@Param("computeDate") String computeDate, @Param("hospId") Long hospId);
 }

+ 12 - 0
src/main/java/com/kcim/dao/repository/ComputePatientCostAccountRepository.java

@@ -36,4 +36,16 @@ public class ComputePatientCostAccountRepository extends ServiceImpl<ComputePati
     public List<DiseaseCostDetailVO> getDeptDiseaseCostCompositionDetail(String computeDate) {
         return this.baseMapper.getDeptDiseaseCostCompositionDetail(computeDate, UserContext.getHospId());
     }
+
+    public List<DiseaseCostDetailVO> getDrgCostDetailList(String computeDate) {
+        return this.baseMapper.getDrgCostDetailList(computeDate, UserContext.getHospId());
+    }
+
+    public List<DiseaseCostDetailVO> getDrgCostCompositionDetail(String computeDate) {
+        return this.baseMapper.getDrgCostCompositionDetail(computeDate, UserContext.getHospId());
+    }
+
+    public List<DiseaseCostDetailVO> getDeptDrgCostCompositionDetail(String computeDate) {
+        return this.baseMapper.getDeptDrgCostCompositionDetail(computeDate, UserContext.getHospId());
+    }
 }

+ 22 - 1
src/main/java/com/kcim/service/StandardReportService.java

@@ -88,7 +88,7 @@ public interface StandardReportService {
     List<HospitalServiceProjectCostVO> getMedicalServiceCostDetail(String computeDate);
 
     /**
-     * 获取病成本明细表数据
+     * 获取病成本明细表数据
      * @return
      */
     List<DiseaseCostDetailVO> getDiseaseCostDetail(String computeDate);
@@ -106,4 +106,25 @@ public interface StandardReportService {
      * @return
      */
     ComputeProfitCollectResponse getDeptDiseaseCostCompositionDetail(String computeDate);
+
+    /**
+     * 获取DRG成本明细表数据
+     * @param computeDate
+     * @return
+     */
+    List<DiseaseCostDetailVO> getDrgCostDetail(String computeDate);
+
+    /**
+     * 获取DRG成本构成明细表数据
+     * @param computeDate
+     * @return
+     */
+    List<DiseaseCostDetailVO> getDrgCostCompositionDetail(String computeDate);
+
+    /**
+     * 获取服务单元DRG成本构成明细表数据
+     * @param computeDate
+     * @return
+     */
+    ComputeProfitCollectResponse getDeptDrgCostCompositionDetail(String computeDate);
 }

+ 172 - 11
src/main/java/com/kcim/service/impl/StandardReportServiceImpl.java

@@ -922,11 +922,11 @@ public class StandardReportServiceImpl implements StandardReportService {
             DictDataVo costType = standCostDictMaps.getCostTypeMap().get(projectCostAccount.getCostTypeCode());
             DiseaseCostDetailVO vo = new DiseaseCostDetailVO();
             //已有的项目类别
-            if (diseaseCostMap.containsKey(projectCostAccount.getDiseaseCode())) {
-                vo = diseaseCostMap.get(projectCostAccount.getDiseaseCode());
+            if (diseaseCostMap.containsKey(projectCostAccount.getItemCode())) {
+                vo = diseaseCostMap.get(projectCostAccount.getItemCode());
             } else {
                 //新建一个项目类别对象
-                diseaseCostMap.put(projectCostAccount.getDiseaseCode(), projectCostAccount);
+                diseaseCostMap.put(projectCostAccount.getItemCode(), projectCostAccount);
             }
             // 医疗成本
             if ("1".equals(costType.getExpandOne())) {
@@ -973,13 +973,13 @@ public class StandardReportServiceImpl implements StandardReportService {
             DictDataVo accountType = standCostDictMaps.getAccountingTypeMap().get(projectCostAccount.getCostTypeCode());
             DiseaseCostDetailVO vo = new DiseaseCostDetailVO();
             //已有的项目类别
-            if (diseaseCostMap.containsKey(projectCostAccount.getDiseaseCode())) {
-                vo = diseaseCostMap.get(projectCostAccount.getDiseaseCode());
+            if (diseaseCostMap.containsKey(projectCostAccount.getItemCode())) {
+                vo = diseaseCostMap.get(projectCostAccount.getItemCode());
             } else {
-                vo.setDiseaseCode(projectCostAccount.getDiseaseCode());
-                vo.setDiseaseName(projectCostAccount.getDiseaseName());
+                vo.setItemCode(projectCostAccount.getItemCode());
+                vo.setItemName(projectCostAccount.getItemName());
                 //新建一个项目类别对象
-                diseaseCostMap.put(projectCostAccount.getDiseaseCode(), vo);
+                diseaseCostMap.put(projectCostAccount.getItemCode(), vo);
             }
             //按会计科目类型累加费用
             addAccountTypeExpense(accountType.getExpandOne(), projectCostAccount.getHospitalFullCost(), vo);
@@ -1021,10 +1021,171 @@ public class StandardReportServiceImpl implements StandardReportService {
         // 遍历每个项目生成科室金额
         for (DiseaseCostDetailVO costItem : projectCostAccountList) {
             ReportFormCustomVo itemVo = new ReportFormCustomVo();
-            if(diseaseCostMap.containsKey(costItem.getDiseaseCode())){
-                itemVo=diseaseCostMap.get(costItem.getDiseaseCode());
+            if(diseaseCostMap.containsKey(costItem.getItemCode())){
+                itemVo=diseaseCostMap.get(costItem.getItemCode());
             }else{
-                itemVo.setReportName(costItem.getDiseaseName());
+                itemVo.setReportName(costItem.getItemName());
+                itemVo.setData(new ArrayList<>());
+                itemVo.setTotalValue(BigDecimal.ZERO);
+            }
+            //金额对象
+            ReportVo amountReportVo = new ReportVo();
+            amountReportVo.setCode(getResponsibilityAmountCode(costItem.getDepartmentCode()));
+            // 设置金额
+            amountReportVo.setValue(costItem.getHospitalFullCost());
+            // 添加金额
+            itemVo.getData().add(amountReportVo);
+            //计算总额
+            itemVo.setTotalValue(itemVo.getTotalValue().add(costItem.getHospitalFullCost()));
+        }
+
+        List<ReportFormCustomVo> diseaseCostDetailList =new ArrayList<>(diseaseCostMap.values());
+
+        // 遍历每个成本项目(列转行)
+        for (ReportFormCustomVo costItem : diseaseCostDetailList) {
+            if(CollectionUtils.isEmpty(costItem.getData())){
+                continue;
+            }
+            for (ReportVo amountReportVo : costItem.getData()) {
+                //占比对象
+                ReportVo percentReportVo = new ReportVo();
+                percentReportVo.setCode(amountReportVo.getCode());
+                //计算百分比
+                BigDecimal percent = getPercent((BigDecimal)amountReportVo.getValue() , costItem.getTotalValue());
+                percentReportVo.setValue(percent);
+                // 添加百分比
+                costItem.getData().add(percentReportVo);
+            }
+        }
+        ComputeProfitCollectResponse response = new ComputeProfitCollectResponse();
+        response.setTitle(titleList);
+        response.setData(diseaseCostDetailList);
+
+        return response;
+    }
+
+    /**
+     * 获取医院DRG成本明细表数据
+     *
+     * @param computeDate 核算年月
+     * @return DRG成本明细列表
+     */
+    @Override
+    public List<DiseaseCostDetailVO> getDrgCostDetail(String computeDate) {
+        List<DiseaseCostDetailVO> projectCostAccountList = computePatientCostAccountRepository.getDrgCostDetailList(computeDate);
+        if(CollectionUtils.isEmpty(projectCostAccountList)){
+            throw new CostException("请先计算患者成本");
+        }
+        // 获取所有的标准字典数据
+        StandCostDictMapVO standCostDictMaps = getStandCostDictMaps();
+        // 记录项目类别对象
+        Map<String, DiseaseCostDetailVO> drgeCostMap = new HashMap<>();
+        for (DiseaseCostDetailVO projectCostAccount : projectCostAccountList) {
+            //按项目类型累加数据
+            DictDataVo costType = standCostDictMaps.getCostTypeMap().get(projectCostAccount.getCostTypeCode());
+            DiseaseCostDetailVO vo = new DiseaseCostDetailVO();
+            //已有的项目类别
+            if (drgeCostMap.containsKey(projectCostAccount.getItemCode())) {
+                vo = drgeCostMap.get(projectCostAccount.getItemCode());
+            } else {
+                //新建一个项目类别对象
+                drgeCostMap.put(projectCostAccount.getItemCode(), projectCostAccount);
+            }
+            // 医疗成本
+            if ("1".equals(costType.getExpandOne())) {
+                vo.setMedicalCost(vo.getMedicalCost().add(projectCostAccount.getHospitalFullCost()));
+            }
+            // 医疗全成本
+            if (!"3".equals(costType.getExpandOne())) {
+                vo.setMedicalFullCost(vo.getMedicalFullCost().add(projectCostAccount.getHospitalFullCost()));
+            }
+            // 医院全成本
+            vo.setHospitalFullCost(vo.getHospitalFullCost().add(projectCostAccount.getHospitalFullCost()));
+            // 服务量
+            vo.setServiceVolume(projectCostAccount.getServiceVolume());
+        }
+        List<DiseaseCostDetailVO> drgeCostDetailList = new ArrayList<>(drgeCostMap.values());
+        //计算单个DRG的成本
+        drgeCostDetailList.forEach(vo -> {
+            vo.setMedicalCost(getPercent(vo.getServiceVolume(), vo.getMedicalCost()));
+            vo.setMedicalFullCost(getPercent(vo.getServiceVolume(), vo.getMedicalFullCost()));
+            vo.setHospitalFullCost(getPercent(vo.getServiceVolume(), vo.getHospitalFullCost()));
+        });
+        return drgeCostDetailList;
+    }
+
+    /**
+     * 获取DRG成本构成明细表数据
+     * @param computeDate
+     * @return
+     */
+    @Override
+    public List<DiseaseCostDetailVO> getDrgCostCompositionDetail(String computeDate) {
+        List<DiseaseCostDetailVO> projectCostAccountList = computePatientCostAccountRepository.getDrgCostCompositionDetail(computeDate);
+        if(CollectionUtils.isEmpty(projectCostAccountList)){
+            throw new CostException("请先计算患者成本");
+        }
+        // 获取所有的标准字典数据
+        StandCostDictMapVO standCostDictMaps = getStandCostDictMaps();
+        // 记录项目类别对象
+        Map<String, DiseaseCostDetailVO> diseaseCostMap = new HashMap<>();
+        for (DiseaseCostDetailVO projectCostAccount : projectCostAccountList) {
+            //按项目类型累加数据
+            DictDataVo accountType = standCostDictMaps.getAccountingTypeMap().get(projectCostAccount.getCostTypeCode());
+            DiseaseCostDetailVO vo = new DiseaseCostDetailVO();
+            //已有的项目类别
+            if (diseaseCostMap.containsKey(projectCostAccount.getItemCode())) {
+                vo = diseaseCostMap.get(projectCostAccount.getItemCode());
+            } else {
+                vo.setItemCode(projectCostAccount.getItemCode());
+                vo.setItemName(projectCostAccount.getItemName());
+                //新建一个项目类别对象
+                diseaseCostMap.put(projectCostAccount.getItemCode(), vo);
+            }
+            //按会计科目类型累加费用
+            addAccountTypeExpense(accountType.getExpandOne(), projectCostAccount.getHospitalFullCost(), vo);
+            //累加数量
+            vo.setServiceVolume(vo.getServiceVolume().add(projectCostAccount.getServiceVolume()));
+        }
+        List<DiseaseCostDetailVO> diseaseCostDetailList =new ArrayList<>(diseaseCostMap.values());
+        //按会计科目类型计算占比
+        diseaseCostDetailList.forEach(vo -> setAccountTypeExpenseRatio(vo));
+        return diseaseCostDetailList;
+    }
+
+    /**
+     * 获取科室DRG成本构成明细表数据
+     * @param computeDate
+     * @return
+     */
+    @Override
+    public ComputeProfitCollectResponse getDeptDrgCostCompositionDetail(String computeDate) {
+        List<DiseaseCostDetailVO> projectCostAccountList = computePatientCostAccountRepository.getDeptDrgCostCompositionDetail(computeDate);
+        if(CollectionUtils.isEmpty(projectCostAccountList)){
+            throw new CostException("请先计算患者成本");
+        }
+        // 获取所有的标准字典数据
+        StandCostDictMapVO standCostDictMaps = getStandCostDictMaps();
+        List<CommonResponsibilityReportVo> titleList = new ArrayList<>();
+        // 提取科室名称作为列标题
+        for (Responsibility dept : standCostDictMaps.getResponsibilityDict()) {
+            CommonResponsibilityReportVo title = new CommonResponsibilityReportVo();
+            title.setResponsibilityName(dept.getResponsibilityName());
+            title.setResponsibilityCode(dept.getResponsibilityCode());
+            title.setSort(dept.getSort());
+            //添加子级标题
+            addCommonResponsibilityChild(title);
+            titleList.add(title);
+        }
+        // 记录项目类别对象
+        Map<String, ReportFormCustomVo> diseaseCostMap = new HashMap<>();
+        // 遍历每个项目生成科室金额
+        for (DiseaseCostDetailVO costItem : projectCostAccountList) {
+            ReportFormCustomVo itemVo = new ReportFormCustomVo();
+            if(diseaseCostMap.containsKey(costItem.getItemCode())){
+                itemVo=diseaseCostMap.get(costItem.getItemCode());
+            }else{
+                itemVo.setReportName(costItem.getItemName());
                 itemVo.setData(new ArrayList<>());
                 itemVo.setTotalValue(BigDecimal.ZERO);
             }

+ 2 - 2
src/main/java/com/kcim/vo/DiseaseCostDetailVO.java

@@ -22,7 +22,7 @@ public class DiseaseCostDetailVO {
      * 病种的唯一标识编码,用于区分不同的病种类型
      * </p>
      */
-    private String diseaseCode;
+    private String itemCode;
 
     /**
      * 病种名称
@@ -30,7 +30,7 @@ public class DiseaseCostDetailVO {
      * 病种的中文名称描述
      * </p>
      */
-    private String diseaseName;
+    private String itemName;
 
     /**
      * 科室代码

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

@@ -24,8 +24,8 @@
 
     <select id="getDiseaseCostDetailList" resultType="com.kcim.vo.DiseaseCostDetailVO">
         SELECT
-            a.`primary_diag_code` as diseaseCode,
-            a.`primary_diag_name` as diseaseName ,
+            a.`primary_diag_code` as itemCode,
+            a.`primary_diag_name` as itemName ,
             b.cost_type as costTypeCode,
             SUM( b.quantity ) AS serviceVolume,
             SUM( b.compute_result ) AS hospitalTotalCost
@@ -48,8 +48,8 @@
     </select>
     <select id="getDiseaseCostCompositionDetail" resultType="com.kcim.vo.DiseaseCostDetailVO">
         SELECT
-            a.`primary_diag_code` as diseaseCode,
-            a.`primary_diag_name` as diseaseName ,
+            a.`primary_diag_code` as itemCode,
+            a.`primary_diag_name` as itemName ,
             b.account_type as costTypeCode,
             SUM( b.quantity ) AS serviceVolume,
             SUM( b.compute_result ) AS hospitalTotalCost
@@ -72,8 +72,8 @@
     </select>
     <select id="getDeptDiseaseCostCompositionDetail" resultType="com.kcim.vo.DiseaseCostDetailVO">
         SELECT
-            a.`primary_diag_code` as diseaseCode,
-            a.`primary_diag_name` as diseaseName ,
+            a.`primary_diag_code` as itemCode,
+            a.`primary_diag_name` as itemName ,
             a.department_code as departmentCode,
             a.department_name as departmentName,
             SUM( b.quantity ) AS serviceVolume,
@@ -95,4 +95,77 @@
             c.`primary_diag_code`,
             a.department_code
     </select>
+    <select id="getDrgCostDetailList" resultType="com.kcim.vo.DiseaseCostDetailVO">
+        SELECT
+            a.`group_code` as itemCode,
+            a.`group_name` as itemName ,
+            b.cost_type as costTypeCode,
+            SUM( b.quantity ) AS serviceVolume,
+            SUM( b.compute_result ) AS hospitalTotalCost
+        FROM
+            compute_patient_cost a
+                INNER JOIN compute_patient_cost_account b ON a.id = b.patient_cost_id
+                AND b.del_flag = 0
+                AND b.hosp_id = #{hospId,jdbcType=BIGINT}
+                INNER JOIN import_patient_info c on a.visit_no=c.visit_no
+                AND c.hosp_id = #{hospId,jdbcType=BIGINT}
+                AND c.del_flag = 0
+                AND c.compute_date = #{computeDate,jdbcType=VARCHAR}
+        WHERE
+            a.del_flag = 0
+          AND a.hosp_id = #{hospId,jdbcType=BIGINT}
+          AND a.compute_date = #{computeDate,jdbcType=VARCHAR}
+        GROUP BY
+            c.`group_code`,
+            b.cost_type
+    </select>
+    <select id="getDrgCostCompositionDetail" resultType="com.kcim.vo.DiseaseCostDetailVO">
+        SELECT
+            a.`group_code` as itemCode,
+            a.`group_name` as itemName ,
+            b.account_type as costTypeCode,
+            SUM( b.quantity ) AS serviceVolume,
+            SUM( b.compute_result ) AS hospitalTotalCost
+        FROM
+            compute_patient_cost a
+                INNER JOIN compute_patient_cost_account b ON a.id = b.patient_cost_id
+                AND b.del_flag = 0
+                AND b.hosp_id = #{hospId,jdbcType=BIGINT}
+                INNER JOIN import_patient_info c on a.visit_no=c.visit_no
+                AND c.hosp_id = #{hospId,jdbcType=BIGINT}
+                AND c.del_flag = 0
+                AND c.compute_date = #{computeDate,jdbcType=VARCHAR}
+        WHERE
+            a.del_flag = 0
+          AND a.hosp_id = #{hospId,jdbcType=BIGINT}
+          AND a.compute_date = #{computeDate,jdbcType=VARCHAR}
+        GROUP BY
+            c.`group_code`,
+            b.account_type
+    </select>
+    <select id="getDeptDrgCostCompositionDetail" resultType="com.kcim.vo.DiseaseCostDetailVO">
+        SELECT
+            a.`group_code` as itemCode,
+            a.`group_name` as itemName ,
+            a.department_code as departmentCode,
+            a.department_name as departmentName,
+            SUM( b.quantity ) AS serviceVolume,
+            SUM( b.compute_result ) AS hospitalTotalCost
+        FROM
+            compute_patient_cost a
+                INNER JOIN compute_patient_cost_account b ON a.id = b.patient_cost_id
+                AND b.del_flag = 0
+                AND b.hosp_id = #{hospId,jdbcType=BIGINT}
+                INNER JOIN import_patient_info c on a.visit_no=c.visit_no
+                AND c.hosp_id = #{hospId,jdbcType=BIGINT}
+                AND c.del_flag = 0
+                AND c.compute_date = #{computeDate,jdbcType=VARCHAR}
+        WHERE
+            a.del_flag = 0
+          AND a.hosp_id = #{hospId,jdbcType=BIGINT}
+          AND a.compute_date = #{computeDate,jdbcType=VARCHAR}
+        GROUP BY
+            c.`group_code`,
+            a.department_code
+    </select>
 </mapper>