Browse Source

增加住院工作量统计报表

hsh 1 year ago
parent
commit
f1b855b47b

+ 10 - 0
src/main/java/thyyxxk/webserver/controller/highreport/AllStatisticsController.java

@@ -52,4 +52,14 @@ public class AllStatisticsController {
         service.exportInpatientDeptAccountingReport(response, dto);
     }
 
+    @PostMapping("/selectWorkFeeStatistics")
+    public ResultVo<Map<String, Object>> selectWorkFeeStatistics(@RequestBody @Validated HighReportDto dto){
+        return service.selectWorkFeeStatistics(dto);
+    }
+
+    @PostMapping("/exportWorkFeeStatisticsInfo")
+    public ResultVo<Map<String, Object>> exportWorkFeeStatisticsInfo(HttpServletResponse response, @RequestBody @Validated HighReportDto dto){
+        return service.exportWorkFeeStatisticsInfo(response, dto);
+    }
+
 }

+ 18 - 0
src/main/java/thyyxxk/webserver/dao/his/highreport/AllStatisticsDao.java

@@ -188,4 +188,22 @@ public interface AllStatisticsDao {
     List<Map<String, Object>> selectInpatientDeptAccountingReportMzWardDept(
             @Param("startTime") String startTime, @Param("endTime") String endTime);
 
+    @Select("<script> ${sql} </script>")
+    List<Map<String, Object>> executeSqlByZb(String sql);
+
+    @Select("<script> " +
+            "select " +
+            "(select rtrim(name) from a_employee_mi where code=a.refer_physician) doctorName,count(*) day from " +
+            "(select inpatient_no,admiss_times,convert(varchar(8),charge_date,112) date,refer_physician " +
+            "from zy_detail_charge " +
+            "where charge_date &gt;= #{startTime} " +
+            "and charge_date &lt;= #{endTime} " +
+            "<if test=\"dept != null and dept != '' \">" +
+            " and ward_code = #{dept} " +
+            "</if>" +
+            "group by inpatient_no,admiss_times,convert(varchar(8),charge_date,112),refer_physician) a " +
+            "group by a.refer_physician " +
+            "</script>")
+    List<Map<String, Object>> selectZyInDays(@Param("startTime") String startTime, @Param("endTime") String endTime, @Param("dept") String dept);
+
 }

+ 6 - 1
src/main/java/thyyxxk/webserver/entity/highreport/HighReportDto.java

@@ -2,6 +2,8 @@ package thyyxxk.webserver.entity.highreport;
 
 import lombok.Data;
 
+import java.util.Map;
+
 /**
  * @Description: 报表查询dto
  * @Author: hsh
@@ -62,6 +64,9 @@ public class HighReportDto {
      **/
     private String mzFlag;
 
-
+    /**
+     * 合计数据
+     **/
+    private Map<String, Object> total;
 
 }

+ 119 - 0
src/main/java/thyyxxk/webserver/service/highreport/AllStatisticsService.java

@@ -3,6 +3,7 @@ package thyyxxk.webserver.service.highreport;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import thyyxxk.webserver.config.exception.ExceptionEnum;
 import thyyxxk.webserver.dao.his.highreport.AllStatisticsDao;
 import thyyxxk.webserver.dao.his.highreport.HighReportDao;
 import thyyxxk.webserver.entity.HeadInfo;
@@ -13,6 +14,7 @@ import thyyxxk.webserver.utils.DecimalUtil;
 import thyyxxk.webserver.utils.ExcelUtil;
 import thyyxxk.webserver.utils.ReportUtil;
 import thyyxxk.webserver.utils.ResultVoUtil;
+import thyyxxk.webserver.utils.StringUtil;
 
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
@@ -517,4 +519,121 @@ public class AllStatisticsService {
         ExcelUtil.exportExcelReport(response, list, sortHeadInfo, exportName);
     }
 
+    /**
+     * @Description 查询住院工作量统计
+     * @Author hsh
+     * @param dto 查询条件
+     * @return map 住院工作量统计
+     * @Date 2024/8/20 11:26
+     */
+    public ResultVo<Map<String, Object>> selectWorkFeeStatistics(HighReportDto dto) {
+        Map<String, Object> results = new HashMap<>();
+        if(StringUtil.isBlank(dto.getReportId())){
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "没有配置报表id,请检查!");
+        }
+        // 查询费用相关信息
+        ReportBaseInfo report = highReportDao.selectReportPortalMenu(dto.getReportId(), null, null);
+        String sql = ReportUtil.sqlFormat(dto, report.getBaseSql());
+        List<Map<String, Object>> list = dao.executeSqlByZb(sql);
+        if(list.isEmpty()){
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "查询不到相应的报表数据,请检查!");
+        }
+        List<Map<String, Object>> zyInDaysList = dao.selectZyInDays(dto.getStartTime(), dto.getEndTime(), dto.getDept());
+        Map<String, List<Map<String, Object>>> doctorNameMap = list.stream().collect(Collectors.groupingBy(f->String.valueOf(f.get("doctorName"))));
+        Map<String, List<Map<String, Object>>> inDaysMap = zyInDaysList.stream().collect(Collectors.groupingBy(f->String.valueOf(f.get("doctorName"))));
+        // 拼接数据展示内容
+        List<HeadInfo> headList = new ArrayList<>();
+        List<Map<String, Object>> resultList = new ArrayList<>();
+
+        List<Map<String, Object>> listHead = list.stream().sorted(Comparator.comparing(e -> String.valueOf(e.get("code")))).collect(Collectors.toList());
+        Map<String, List<Map<String, Object>>> mapHead = listHead.stream().collect(Collectors.groupingBy(m -> (String) m.get("code")));
+        // 拼接列表表头
+        HeadInfo info = new HeadInfo();
+        info.setName("doctorName");
+        info.setDisplay("医生姓名");
+        info.setSort(1);
+        headList.add(info);
+        int index = 2;
+        for (Map.Entry<String, List<Map<String, Object>>> entryHead : mapHead.entrySet()) {
+            HeadInfo info1 = new HeadInfo();
+            String o = entryHead.getKey();
+            List<Map<String, Object>> l = entryHead.getValue();
+            info1.setName(o);
+            info1.setDisplay((String) l.get(0).get("name"));
+            info1.setSort(index);
+            headList.add(info1);
+            index++;
+        }
+        info = new HeadInfo();
+        info.setName("inDays");
+        info.setDisplay("管床天数");
+        info.setSort(index + 1);
+        headList.add(info);
+        // 拼接列表数据
+        for(Map.Entry<String, List<Map<String, Object>>> entry : doctorNameMap.entrySet()){
+            String key = entry.getKey();
+            List<Map<String, Object>> dataList = entry.getValue();
+            Map<String, Object> m1 = new HashMap<>();
+            if(StringUtil.notBlank(key) && !"null".equals(key)){
+                m1.put("doctorName", key);
+            } else {
+                m1.put("doctorName", "其他");
+            }
+            for(Map<String, Object> m : dataList){
+                m1.put(String.valueOf(m.get("code")), m.get("fee"));
+            }
+            //拼接医生的管床天数
+            if(!inDaysMap.isEmpty()){
+                if(StringUtil.isBlank(key) || "null".equals(key)){
+                    if(null != inDaysMap.get(key)){
+                        List<Map<String, Object>> inDays = inDaysMap.get(key);
+                        int day = 0;
+                        for (Map<String, Object> m2 : inDays) {
+                            String d = String.valueOf(m2.get("day"));
+                            day = day + Integer.parseInt(d);
+                        }
+                        m1.put("inDays", day);
+                    }
+                } else if(null != inDaysMap.get(key)){
+                    List<Map<String, Object>> inDays = inDaysMap.get(key);
+                    m1.put("inDays", inDays.get(0).get("day"));
+                }
+            }
+            resultList.add(m1);
+        }
+
+        results.put("headList", headList);
+        results.put("resultList", resultList);
+        return ResultVoUtil.success(results);
+    }
+
+    /**
+     * @Description 住院工作量统计导出
+     * @Author hsh
+     * @param dto 导出条件
+     * @return map
+     * @Date 2024/8/20 11:27
+     */
+    public ResultVo<Map<String, Object>> exportWorkFeeStatisticsInfo(HttpServletResponse response, HighReportDto dto) {
+        Map<String, Object> map = new HashMap<>();
+        ResultVo<Map<String, Object>> resultVo = selectWorkFeeStatistics(dto);
+        Map<String, Object> data = resultVo.getData();
+        // 数据
+        List<Map<String, Object>> list = (List<Map<String, Object>>) data.get("resultList");
+        list.add(dto.getTotal());
+
+        // 导出标题
+        String exportName = dto.getExportName();
+
+        // 组装表头
+        List<HeadInfo> headInfoList = (List<HeadInfo>) data.get("headList");
+        List<HeadInfo> sortHeadInfo = headInfoList.stream().sorted(Comparator.comparing(HeadInfo::getSort)).collect(Collectors.toList());
+
+        // 导出
+        ExcelUtil.exportExcelReport(response, list, sortHeadInfo, exportName);
+
+        map.put("code", 0);
+        map.put("massage", "导出成功!");
+        return ResultVoUtil.success(map);
+    }
 }

+ 45 - 14
src/main/java/thyyxxk/webserver/utils/ReportUtil.java

@@ -63,20 +63,7 @@ public class ReportUtil {
      **/
     public static @NotNull String callSqlFormat(HighReportDto dto, @NotNull String baseSql, String gatherSql, String groupColumn, String dropSql, String sortSql){
         // 查询必填字段(包括开始时间,结束时间,钻取科室,医生等sql用:拼接的字符)替换
-        if(baseSql.contains(START_TIME)){
-            if(StringUtil.notBlank(dto.getStartTime())){
-                baseSql = baseSql.replaceAll(START_TIME, "'" + dto.getStartTime() + "'");
-            } else {
-                baseSql = baseSql.replaceAll(START_TIME,"'2012-01-01 00:00:00'");
-            }
-        }
-        if(baseSql.contains(END_TIME)){
-            if(StringUtil.notBlank(dto.getEndTime())){
-                baseSql = baseSql.replaceAll(END_TIME, "'" + dto.getEndTime() + "'");
-            } else {
-                baseSql = baseSql.replaceAll(END_TIME, DateUtil.getDayEndTime(new Date()));
-            }
-        }
+        baseSql = getTimeString(dto, baseSql);
         // 查询非必填字段(一般是下拉选险种,模糊查询科室、诊断等sql用_拼接的字符)
         StringBuilder sql = new StringBuilder();
         sql.append(" select ").append(gatherSql).append(" from (").append(baseSql).append(") t where 1 = 1 ");
@@ -310,4 +297,48 @@ public class ReportUtil {
         return "";
     }
 
+    /**
+     * @Description 报表sql中关键字替换
+     * @Author hsh
+     * @param dto 查询条件
+     * @param sql 统计sql
+     * @return sql 统计sql
+     * @Date 2024/8/19 14:46
+     */
+    public static String sqlFormat(HighReportDto dto, String sql){
+        // 查询必填字段(包括开始时间,结束时间)替换
+        sql = getTimeString(dto, sql);
+        // 存在dept的查询条件
+        if(StringUtil.notBlank(dto.getDept())){
+            sql = sql.replaceAll("::ward_code", "and t.ward_code = '" + dto.getDept() + "' ");
+            sql = sql.replaceAll("::exec_unit", "and t.exec_unit = '" + dto.getDept() + "' ");
+            sql = sql.replaceAll("::dept", "and t.dept = '" + dto.getDept() + "' ");
+        } else {
+            sql = sql.replaceAll("::ward_code", "");
+            sql = sql.replaceAll("::exec_unit", "");
+            sql = sql.replaceAll("::dept", "");
+        }
+        return sql;
+    }
+
+    @NotNull
+    private static String getTimeString(HighReportDto dto, String sql) {
+        if(sql.contains(START_TIME)){
+            if(StringUtil.notBlank(dto.getStartTime())){
+                sql = sql.replaceAll(START_TIME, "'" + dto.getStartTime() + "'");
+            } else {
+                sql = sql.replaceAll(START_TIME,"'2012-01-01 00:00:00'");
+            }
+        }
+        if(sql.contains(END_TIME)){
+            if(StringUtil.notBlank(dto.getEndTime())){
+                sql = sql.replaceAll(END_TIME, "'" + dto.getEndTime() + "'");
+            } else {
+                sql = sql.replaceAll(END_TIME, DateUtil.getDayEndTime(new Date()));
+            }
+        }
+        return sql;
+    }
+
+
 }