Selaa lähdekoodia

Merge remote-tracking branch 'origin/dev/20201021_1.4.7' into test

chengyao 4 vuotta sitten
vanhempi
commit
517539c5fb

+ 2 - 0
doc/025.20201021v1.4.7/qc_initv1.4.7.sql

@@ -0,0 +1,2 @@
+use `qc`;
+INSERT INTO `qc`.`sys_dictionary_info`( `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `group_type`, `name`, `val`, `return_type`, `order_no`, `remark`) VALUES ( 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', 3, 'anaesthesiaDoctor', '麻醉医师', 2, 0, '病案首页手术信息');

+ 22 - 3
src/main/java/com/diagbot/aggregate/AverageStatisticsAggregate.java

@@ -274,26 +274,45 @@ public class AverageStatisticsAggregate {
         if (averageList.size() <= limitCount) {
             retAverageList = BeanUtil.listCopyTo(averageList, AverageStatisticsDTO.class);
         } else {
-            retAverageList = averageList.subList(0, limitCount - 1);
-            List<AverageStatisticsDTO> otherList = averageList.subList(limitCount - 1, averageList.size());
+            retAverageList = averageList.subList(0, limitCount - 2);
+            List<AverageStatisticsDTO> otherList = averageList.subList(limitCount - 2, averageList.size());
             Double totleValue = otherList
                     .stream()
                     .map(i -> BigDecimal.valueOf(i.getTotleValue()))
                     .reduce(BigDecimal.ZERO, BigDecimal::add).doubleValue();
+            Double sameTotleValue = otherList
+                    .stream()
+                    .map(i -> BigDecimal.valueOf(i.getSameTotleValue()))
+                    .reduce(BigDecimal.ZERO, BigDecimal::add).doubleValue();
             Integer num = otherList
                     .stream()
                     .map(AverageStatisticsDTO::getNum)
                     .reduce(0, Integer::sum);
+            Integer sameNum = otherList
+                    .stream()
+                    .map(AverageStatisticsDTO::getSameNum)
+                    .reduce(0, Integer::sum);
             Double averageValue = BigDecimal.valueOf(totleValue)
                     .divide(BigDecimal.valueOf(num), 2, RoundingMode.HALF_UP)
                     .doubleValue();
+            Double lastYearAverageValue = 0d;
+            if(0 != sameNum){
+                 lastYearAverageValue = BigDecimal.valueOf(sameTotleValue)
+                        .divide(BigDecimal.valueOf(sameNum), 2, RoundingMode.HALF_UP)
+                        .doubleValue();
+            }
+
+
             AverageStatisticsDTO retAverageStatistics = new AverageStatisticsDTO();
             retAverageStatistics.setName("其他");
             retAverageStatistics.setNum(num);
+            retAverageStatistics.setSameNum(sameNum);
+            retAverageStatistics.setSameTotleValue(sameTotleValue);
+            retAverageStatistics.setLastYearAverageValue(lastYearAverageValue);
             retAverageStatistics.setAverageValue(averageValue);
             retAverageStatistics.setTotleValue(totleValue);
             retAverageList.add(retAverageStatistics);
         }
         return retAverageList;
     }
-}
+}

+ 4 - 2
src/main/java/com/diagbot/dto/AverageStatisticsDTO.java

@@ -15,10 +15,12 @@ public class AverageStatisticsDTO {
     private String id;
     @Excel(name = "科室名称", width = 30, orderNum = "1")
     private String name;
-    private Integer num;
+    private Integer num = 0;
+    private Integer sameNum = 0; //同期num
     @Excel(name = "本年平均住院天数(天)", width = 15, orderNum = "2")
     private Double averageValue = 0d;
     private Double totleValue = 0d;
+    private Double sameTotleValue = 0d;
     //环比平均值
     @Excel(name = "去年平均住院天数(天)", width = 15, orderNum = "3")
     private Double lastAverageValue = 0d;
@@ -26,4 +28,4 @@ public class AverageStatisticsDTO {
     private Double lastYearAverageValue = 0d;
     //科室分类
     private String deptClass;
-}
+}

+ 215 - 21
src/main/java/com/diagbot/dto/LevelStatisticsDTO.java

@@ -33,62 +33,256 @@ public class LevelStatisticsDTO {
     /**
      * 缺陷条目数
      */
+    private Integer entryNum = 0;
+
+    /**
+     * 缺陷条目数-带升降标示
+     */
     @Excel(name = "缺陷总数", orderNum = "3")
-    private Integer entryNum;
+    private String entryStrNum = "0";
+
+    /**
+     * 同比总数
+     */
+    private Integer sameNum = 0;
+
+    /**
+     * 同比总数-带升降标示
+     */
+    @Excel(name = "同比总数", orderNum = "4")
+    private String sameStrNum = "0";
+
+    /**
+     * 缺陷条目数现有数据与同期数据对比(-1-降 0-持平 1-升)
+     */
+    private Integer entrySameNum = 0;
+
     /**
      * 质控病历数
      */
-    @Excel(name = "质控病历数", orderNum = "5")
-    private Integer mrNum;
+    private Integer mrNum = 0;
+
+    /**
+     * 质控病历数-带升降标示
+     */
+    @Excel(name = "质控病历数", orderNum = "7")
+    private String mrStrNum = "0";
+
+    /**
+     * 同比病历数
+     */
+    private Integer sameMrNum= 0;
+
+    /**
+     * 同比病历数-带升降标示
+     */
+    @Excel(name = "同比质控数", orderNum = "8")
+    private String sameMrStrNum = "0";
+
+    /**
+     * 质控病历数现有数据与同期数据对比(-1-降 0-持平 1-升)
+     */
+    private Integer mrSameNum = 0;
+
     /**
      * 质控评分(总分)
      */
-    private Double totleValue;
+    private Double totleValue = 0d;
+
+    /**
+     * 同比质控评分(总分)
+     */
+    private Double sameTotleValue= 0d;
+
+
     /**
      * 质控评分(平均分)
      */
-    @Excel(name = "质控平均分", orderNum = "4")
-    private Double averageValue;
+    private Double averageValue = 0d;
+
+    /**
+     * 质控评分(平均分)-带升降标示
+     */
+    @Excel(name = "质控平均分", orderNum = "5")
+    private String averageStrValue = "0";
+
+    /**
+     * 同比评分(平均分)
+     */
+    private Double sameAvgValue = 0d;
+
+    /**
+     * 同比评分(平均分)-带升降标示
+     */
+    @Excel(name = "同比平均分", orderNum = "6")
+    private String sameAvgStrValue = "0";
+
+    /**
+     * 质控评分现有数据与同期数据对比(-1-降 0-持平 1-升)
+     */
+    private Integer avSameValue = 0;
+
     /**
      * 甲级病历数/病案首页合格病历数
      */
-    @Excel(name = "甲级病历数", orderNum = "6")
-    private Integer firstLevelNum;
+    private Integer firstLevelNum = 0;
+
+    /**
+     * 甲级病历数/病案首页合格病历数-带升降标示
+     */
+    @Excel(name = "甲级病历数", orderNum = "9")
+    private String firstLevelStrNum = "0";
+
+    /**
+     * 同比甲级病历数/病案首页合格病历数
+     */
+    private Integer sameFirstLevelNum = 0;
+
+    /**
+     * 同比甲级病历数/病案首页合格病历数-带升降标示
+     */
+    @Excel(name = "同比甲级数", orderNum = "10")
+    private String sameFirstLevelStrNum = "0";
+
+    /**
+     * 甲级病历数现有数据与同期数据对比(-1-降 0-持平 1-升)
+     */
+    private Integer firSameLevelNum = 0;
+
     /**
      * 乙级病历数/病案首页不合格病历数
      */
-    @Excel(name = "乙级病历数", orderNum = "7")
-    private Integer secondLevelNum;
+    private Integer secondLevelNum = 0;
+
+    /**
+     * 乙级病历数/病案首页不合格病历数-带升降标示
+     */
+    @Excel(name = "乙级病历数", orderNum = "11")
+    private String secondLevelStrNum = "0";
+
+    /**
+     * 同比乙级病历数/病案首页不合格病历数
+     */
+    private Integer sameSecondLevelNum = 0;
+
+    /**
+     * 同比乙级病历数/病案首页不合格病历数-带升降标示
+     */
+    @Excel(name = "同比乙级数", orderNum = "12")
+    private String sameSecondLevelStrNum = "0";
+
+
+    /**
+     * 乙级病历数现有数据与同期数据对比(-1-降 0-持平 1-升)
+     */
+    private Integer secSameLevelNum = 0;
+
     /**
      * 丙级病历数
      */
-    @Excel(name = "丙级病历数", orderNum = "8")
-    private Integer thirdLevelNum;
+    private Integer thirdLevelNum = 0;
+
+    /**
+     * 丙级病历数-带升降标示
+     */
+    @Excel(name = "丙级病历数", orderNum = "13")
+    private String thirdLevelStrNum = "0";
+
+    /**
+     * 同比丙级病历数
+     */
+    private Integer sameThirdLevelNum = 0;
+
+    /**
+     * 同比丙级病历数-带升降标示
+     */
+    @Excel(name = "同比丙级数", orderNum = "14")
+    private String sameThirdLevelStrNum = "0";
+
+    /**
+     * 丙级病历数现有数据与同期数据对比(-1-降 0-持平 1-升)
+     */
+    private Integer thiSameLevelNum = 0;
+
     /**
      * 甲级病历占比/病案首页合格病历占比
      */
-    private Double firstLevelPercent;
+    private Double firstLevelPercent = 0d;
+
+    /**
+     * 同比甲级病历占比/病案首页合格病历占比
+     */
+    private Double sameFirstLevelPercent = 0d;
+
+    /**
+     * 甲级病历占比现有数据与同期数据对比(-1-降 0-持平 1-升)
+     */
+    private Integer firSameLevelPercent = 0;
+
     /**
      * 乙级病历占比/病案首页不合格病历占比
      */
-    private Double secondLevelPercent;
+    private Double secondLevelPercent= 0d;
+
+    /**
+     * 同比乙级病历占比/病案首页不合格病历占比
+     */
+    private Double sameSecondLevelPercent = 0d;
+
+    /**
+     * 乙级病历占比现有数据与同期数据对比(-1-降 0-持平 1-升)
+     */
+    private Integer secSameLevelPercent = 0;
+
     /**
      * 丙级病历占比
      */
-    private Double thirdLevelPercent;
+    private Double thirdLevelPercent= 0d;
+
+    /**
+     * 同比丙级病历占比
+     */
+    private Double sameThirdLevelPercent = 0d;
+
+    /**
+     * 丙级病历占比现有数据与同期数据对比(-1-降 0-持平 1-升)
+     */
+    private Integer thiSameLevelPercent = 0;
+
     /**
      * 甲级病历占比(百分比)/病案首页合格病历占比(百分比)
      */
-    @Excel(name = "甲级率", orderNum = "9")
-    private String firstLevelPercentStr;
+    @Excel(name = "甲级率", orderNum = "15")
+    private String firstLevelPercentStr = "0.00%";
+
+    /**
+     * 同比甲级病历占比(百分比)/病案首页合格病历占比(百分比)
+     */
+    @Excel(name = "同比甲级率", orderNum = "16")
+    private String sameFirstLevelPercentStr = "0.00%";
+
     /**
      * 乙级病历占比(百分比)/病案首页不合格病历占比(百分比)
      */
-    @Excel(name = "乙级率", orderNum = "10")
-    private String secondLevelPercentStr;
+    @Excel(name = "乙级率", orderNum = "17")
+    private String secondLevelPercentStr = "0.00%";
+
+    /**
+     * 同比乙级病历占比(百分比)/病案首页不合格病历占比(百分比)
+     */
+    @Excel(name = "同比乙级率", orderNum = "18")
+    private String sameSecondLevelPercentStr = "0.00%";
+
     /**
      * 丙级病历占比(百分比)
      */
-    @Excel(name = "丙级率", orderNum = "11")
-    private String thirdLevelPercentStr;
+    @Excel(name = "丙级率", orderNum = "19")
+    private String thirdLevelPercentStr = "0.00%";
+
+    /**
+     * 同比丙级病历占比(百分比)
+     */
+    @Excel(name = "同比丙级率", orderNum = "20")
+    private String sameThirdLevelPercentStr = "0.00%";
+
 }

+ 5 - 0
src/main/java/com/diagbot/entity/HomeOperationInfo.java

@@ -93,6 +93,11 @@ public class HomeOperationInfo implements Serializable {
      */
     private String shamOperationName;
 
+    /**
+     * 麻醉医师
+     */
+    private String anaesthesiaDoctor;
+
     /**
      * 是否删除,N:未删除,Y:删除
      */

+ 11 - 5
src/main/java/com/diagbot/facade/ConsoleExportFacade.java

@@ -93,19 +93,19 @@ public class ConsoleExportFacade {
      * @return
      */
     public void levelExport(HttpServletResponse response, FilterOrderVO filterOrderVO) {
-        List<LevelStatisticsDTO> records = consoleFacade.levelStatistics(filterOrderVO);
+        List<LevelStatisticsDTO> records = consoleFacade.levelStatisticsStr(filterOrderVO);
         String fileName = "各科室缺陷占比.xls";
         ExcelUtils.exportExcel(records, null, "sheet1", LevelStatisticsDTO.class, fileName, response, 12.8f);
     }
 
     /**
-     * 各科室缺陷占比(组合)-台州
+     * 各科室缺陷占比(组合)-台州-导出
      *
      * @param filterOrderVO
      * @return
      */
     public void levelExport_TZ(HttpServletResponse response, FilterOrderVO filterOrderVO) {
-        List<LevelStatisticsTZDTO> records = consoleFacade.levelStatisticsByDeptClass_TZ(filterOrderVO);
+        List<LevelStatisticsTZDTO> records = consoleFacade.levelStatisticsByDeptStr_TZ(filterOrderVO);
         String fileName = "各科室缺陷占比-台州.xls";
         ExcelUtils.exportExcel(records, null, "sheet1", LevelStatisticsTZDTO.class, fileName, response, 12.8f);
     }
@@ -322,7 +322,7 @@ public class ConsoleExportFacade {
     }
 
     /**
-     * 病案首页不合格数
+     * 病案首页不合格/合格
      *
      * @param qcResultShortPageVO
      * @return
@@ -349,7 +349,13 @@ public class ConsoleExportFacade {
         qcResultShortPageVO.setSize(Long.MAX_VALUE);
         qcResultShortPageVO.setSearchCount(false);
         List<ExportExcelDTO> records = behospitalInfoFacade.badLevelPagePageExport(qcResultShortPageVO);
-        String fileName = "病案首页不合格数病历详情页.xls";
+        String fileName = null;
+        if("不合格数".equals(qcResultShortPageVO.getTitleName())){
+             fileName = "病案首页不合格数病历详情页.xls";
+        }else{
+             fileName = "病案首页合格数病历详情页.xls";
+        }
+
         ExcelUtils.exportExcelUser(records, null, "sheet1", ExportExcelDTO.class, fileName, response);
     }
 

+ 761 - 5
src/main/java/com/diagbot/facade/ConsoleFacade.java

@@ -160,14 +160,81 @@ public class ConsoleFacade {
      */
     public Map<String, Object> getAverageScore(FilterVO filterVO) {
         Map<String, Object> retMap = new HashMap<>();
-        filterFacade.filterVOSet(filterVO);
+        filterFacade.filterVOSame(filterVO);
         List<AverageStatisticsDTO> averageScoreList = averageStatisticsAggregate.getAverageScore(filterVO);
+
+        AverageStatisticsDTO item = getGlobleAverageTitle(averageScoreList);
+            if (item != null) {
+                averageScoreList.add(0, item);
+            }
+
         if (ListUtil.isNotEmpty(averageScoreList)) {
             retMap.put("各科室质控平均分", averageScoreList);
         }
         return retMap;
     }
 
+    /**
+     * 增加全院记录
+     *
+     * @param records
+     * @return
+     */
+    public AverageStatisticsDTO getGlobleAverageTitle(List<AverageStatisticsDTO> records) {
+        DecimalFormat df = new DecimalFormat("#0.00");
+        AverageStatisticsDTO item = new AverageStatisticsDTO();
+        if (ListUtil.isEmpty(records)) {
+            return null;
+        }
+
+        //数量
+        Integer num = records
+                .stream()
+                .map(AverageStatisticsDTO::getNum)
+                .reduce(0, Integer::sum);
+
+        //同期数量
+        Integer sameNum = records
+                .stream()
+                .map(AverageStatisticsDTO::getSameNum)
+                .reduce(0, Integer::sum);
+
+        Double totleValue = records
+                .stream()
+                .map(i -> BigDecimal.valueOf(i.getTotleValue()))
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .doubleValue();
+
+        Double sameTotleValue = records
+                .stream()
+                .map(i -> BigDecimal.valueOf(i.getSameTotleValue()))
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .doubleValue();
+
+        Double averageValue = 0d;
+        if(0 != num){
+             averageValue = BigDecimal.valueOf(totleValue)
+                    .divide(BigDecimal.valueOf(num), 2, RoundingMode.HALF_UP)
+                    .doubleValue();
+        }
+        Double lastYearAverageValue = 0d;
+        if(0 != sameNum) {
+            lastYearAverageValue = BigDecimal.valueOf(sameTotleValue)
+                    .divide(BigDecimal.valueOf(sameNum), 2, RoundingMode.HALF_UP)
+                    .doubleValue();
+        }
+
+        item.setName("全院");
+        item.setNum(num);
+        item.setSameNum(sameNum);
+        item.setAverageValue(averageValue);
+        item.setTotleValue(totleValue);
+        item.setSameTotleValue(sameTotleValue);
+        item.setLastYearAverageValue(lastYearAverageValue);
+        return item;
+    }
+
+
     /**
      * 各科室质控平均分(首页)-根据内外科系统统计
      *
@@ -175,7 +242,7 @@ public class ConsoleFacade {
      * @return
      */
     public List<AverageStatisticsDTO> getAverageScoreByDeptClass(FilterVO filterVO) {
-        filterFacade.filterVOSet(filterVO);
+        filterFacade.filterVOSame(filterVO);
         List<AverageStatisticsDTO> retAverageScoreList = Lists.newLinkedList();
         List<AverageStatisticsDTO> averageScoreList = qcresultInfoFacade.getAverageScoreByDeptClass(filterVO);
         Integer limitCount = filterVO.getLimitCount();
@@ -183,9 +250,77 @@ public class ConsoleFacade {
         if (ListUtil.isNotEmpty(averageScoreList)) {
             retAverageScoreList = averageStatisticsAggregate.getLimitAverageList(averageScoreList, limitCount);
         }
+        AverageStatisticsDTO item = getGlobleInOutTitle(retAverageScoreList,filterVO);
+        if (item != null) {
+            retAverageScoreList.add(0, item);
+        }
         return retAverageScoreList;
     }
 
+    /**
+     * 增加内外科记录
+     *
+     * @param records
+     * @return
+     */
+    public AverageStatisticsDTO getGlobleInOutTitle(List<AverageStatisticsDTO> records,FilterVO filterVO) {
+        DecimalFormat df = new DecimalFormat("#0.00");
+        AverageStatisticsDTO item = new AverageStatisticsDTO();
+        if (ListUtil.isEmpty(records)) {
+            return null;
+        }
+
+        //数量
+        Integer num = records
+                .stream()
+                .map(AverageStatisticsDTO::getNum)
+                .reduce(0, Integer::sum);
+
+        //同期数量
+        Integer sameNum = records
+                .stream()
+                .map(AverageStatisticsDTO::getSameNum)
+                .reduce(0, Integer::sum);
+
+        Double totleValue = records
+                .stream()
+                .map(i -> BigDecimal.valueOf(i.getTotleValue()))
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .doubleValue();
+
+        Double sameTotleValue = records
+                .stream()
+                .map(i -> BigDecimal.valueOf(i.getSameTotleValue()))
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .doubleValue();
+
+        Double averageValue = 0d;
+        if(0 != num){
+            averageValue = BigDecimal.valueOf(totleValue)
+                    .divide(BigDecimal.valueOf(num), 2, RoundingMode.HALF_UP)
+                    .doubleValue();
+        }
+        Double lastYearAverageValue = 0d;
+        if(0 != sameNum) {
+            lastYearAverageValue = BigDecimal.valueOf(sameTotleValue)
+                    .divide(BigDecimal.valueOf(sameNum), 2, RoundingMode.HALF_UP)
+                    .doubleValue();
+        }
+
+    if("内科".equals(filterVO.getDeptClass())){
+        item.setName("内科系统");
+    }else{
+        item.setName("外科系统");
+    }
+        item.setNum(num);
+        item.setSameNum(sameNum);
+        item.setAverageValue(averageValue);
+        item.setTotleValue(totleValue);
+        item.setSameTotleValue(sameTotleValue);
+        item.setLastYearAverageValue(lastYearAverageValue);
+        return item;
+    }
+
     /**
      * 各科室甲级病历占比
      *
@@ -446,8 +581,252 @@ public class ConsoleFacade {
      * @return
      */
     public List<LevelStatisticsDTO> levelStatistics(FilterOrderVO filterOrderVO) {
-        filterFacade.filterOrderVOSet(filterOrderVO);
+        filterFacade.filterOrderVOSame(filterOrderVO);
         List<LevelStatisticsDTO> records = behospitalInfoFacade.levelStatistics(filterOrderVO);
+        //没有科室过滤时增加全院数据
+        if (StringUtil.isBlank(filterOrderVO.getName()) || filterOrderVO.getName().equals("全院")) {
+            LevelStatisticsDTO item = getGlobleTitle(records);
+            if (item != null) {
+                records.add(0, item);
+            }
+        }
+        if(ListUtil.isNotEmpty(records)){
+            for (LevelStatisticsDTO record : records) {
+                BigDecimalMethod(record);
+            }
+        }
+        return records;
+    }
+
+    /**
+     * 各科室缺陷占比(组合)-导出
+     *
+     * @param filterOrderVO
+     * @return
+     */
+    public List<LevelStatisticsDTO> levelStatisticsStr(FilterOrderVO filterOrderVO) {
+        filterFacade.filterOrderVOSame(filterOrderVO);
+        List<LevelStatisticsDTO> records = behospitalInfoFacade.levelStatistics(filterOrderVO);
+        //没有科室过滤时增加全院数据
+        if (StringUtil.isBlank(filterOrderVO.getName()) || filterOrderVO.getName().equals("全院")) {
+            LevelStatisticsDTO item = getGlobleTitle(records);
+            if (item != null) {
+                records.add(0, item);
+            }
+        }
+        if(ListUtil.isNotEmpty(records)){
+            for (LevelStatisticsDTO record : records) {
+                BigDecimalStrExport(record);
+            }
+        }
+        return records;
+    }
+
+    /**
+     * 增加全院记录
+     *
+     * @param records
+     * @return
+     */
+    public LevelStatisticsDTO getGlobleTitle(List<LevelStatisticsDTO> records) {
+        DecimalFormat df = new DecimalFormat("#0.00");
+        LevelStatisticsDTO item = new LevelStatisticsDTO();
+        if (ListUtil.isEmpty(records)) {
+            return null;
+        }
+
+        //缺陷总数
+        Integer entryNum = records
+                .stream()
+                .map(LevelStatisticsDTO::getEntryNum)
+                .reduce(0, Integer::sum);
+        if (entryNum == null || entryNum == 0) {
+            return null;
+        }
+        //同比总数
+        Integer sameNum = records
+                .stream()
+                .map(LevelStatisticsDTO::getSameNum)
+                .reduce(0, Integer::sum);
+
+        //质控病历数
+        Integer mrNum = records
+                .stream()
+                .map(LevelStatisticsDTO::getMrNum)
+                .reduce(0, Integer::sum);
+        //同比病历数
+        Integer sameMrNum = records
+                .stream()
+                .map(LevelStatisticsDTO::getSameMrNum)
+                .reduce(0, Integer::sum);
+
+        //质控评分
+        Double totleValue = records
+                .stream()
+                .map(i -> BigDecimal.valueOf(i.getTotleValue()))
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .doubleValue();
+        //同比质控评分
+        Double sameTotleValue = records
+                .stream()
+                .map(i -> BigDecimal.valueOf(i.getSameTotleValue()))
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .doubleValue();
+
+        //质控平均分
+        Double averageValue = BigDecimal.valueOf(totleValue)
+                .divide(BigDecimal.valueOf(mrNum), 2, RoundingMode.HALF_UP)
+                .doubleValue();
+
+        Double sameAvgValue = 0d;
+        //同比平均分
+        if(0d != sameTotleValue){
+            sameAvgValue = BigDecimal.valueOf(sameTotleValue)
+                    .divide(BigDecimal.valueOf(sameMrNum), 2, RoundingMode.HALF_UP)
+                    .doubleValue();
+        }
+
+
+        //甲级病历数
+        Integer firstLevelNum = records
+                .stream()
+                .map(LevelStatisticsDTO::getFirstLevelNum)
+                .reduce(0, Integer::sum);
+
+        //同比甲级病历数
+        Integer sameFirstLevelNum = records
+                .stream()
+                .map(LevelStatisticsDTO::getSameFirstLevelNum)
+                .reduce(0, Integer::sum);
+
+
+        //乙级病历数
+        Integer secondLevelNum = records
+                .stream()
+                .map(LevelStatisticsDTO::getSecondLevelNum)
+                .reduce(0, Integer::sum);
+
+        //同比乙级病历数
+        Integer sameSecondLevelNum = records
+                .stream()
+                .map(LevelStatisticsDTO::getSameSecondLevelNum)
+                .reduce(0, Integer::sum);
+
+
+        //丙级病历数
+        Integer thirdLevelNum = records
+                .stream()
+                .map(LevelStatisticsDTO::getThirdLevelNum)
+                .reduce(0, Integer::sum);
+
+        //同比丙级病历数
+        Integer sameThirdLevelNum = records
+                .stream()
+                .map(LevelStatisticsDTO::getSameThirdLevelNum)
+                .reduce(0, Integer::sum);
+
+
+        //甲级病历占比
+        Double firstLevelPercent = BigDecimal.valueOf(firstLevelNum)
+                .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
+                .doubleValue();
+        String firstLevelPercentStr
+                = df.format(BigDecimal.valueOf(firstLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
+        //同比甲级病历占比
+        Double sameFirstLevelPercent = 0d;
+        String sameFirstLevelPercentStr = "0.00%";
+        if(0 != sameFirstLevelNum ){
+            sameFirstLevelPercent = BigDecimal.valueOf(sameFirstLevelNum)
+                    .divide(BigDecimal.valueOf(sameMrNum), 4, RoundingMode.HALF_UP)
+                    .doubleValue();
+            sameFirstLevelPercentStr
+                    = df.format(BigDecimal.valueOf(sameFirstLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
+        }
+
+
+        //乙级病历占比
+        Double secondLevelPercent = BigDecimal.valueOf(secondLevelNum)
+                .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
+                .doubleValue();
+        String secondLevelPercentStr
+                = df.format(BigDecimal.valueOf(secondLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
+
+        //同比乙级病历占比
+        Double sameSecondLevelPercent = 0d;
+        String sameSecondLevelPercentStr = "0.00%";
+        if(0 != sameFirstLevelNum ){
+            sameSecondLevelPercent = BigDecimal.valueOf(sameSecondLevelNum)
+                    .divide(BigDecimal.valueOf(sameMrNum), 4, RoundingMode.HALF_UP)
+                    .doubleValue();
+            sameSecondLevelPercentStr
+                    = df.format(BigDecimal.valueOf(sameSecondLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
+        }
+        //丙级病历占比
+        Double thirdLevelPercent = BigDecimal.valueOf(thirdLevelNum)
+                .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
+                .doubleValue();
+        String thirdLevelPercentStr
+                = df.format(BigDecimal.valueOf(thirdLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
+
+        //同比丙级病历占比
+        Double sameThirdLevelPercent = 0d;
+        String sameThirdLevelPercentStr = "0.00%";
+        if(0 != sameFirstLevelNum ) {
+            sameThirdLevelPercent = BigDecimal.valueOf(sameThirdLevelNum)
+                    .divide(BigDecimal.valueOf(sameMrNum), 4, RoundingMode.HALF_UP)
+                    .doubleValue();
+            sameThirdLevelPercentStr
+                    = df.format(BigDecimal.valueOf(sameThirdLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
+        }
+        item.setDeptName("全院");
+        item.setEntryNum(entryNum);
+        item.setSameNum(sameNum);
+        item.setMrNum(mrNum);
+        item.setSameMrNum(sameMrNum);
+        item.setTotleValue(totleValue);
+        item.setSameTotleValue(sameTotleValue);
+        item.setAverageValue(averageValue);
+        item.setSameAvgValue(sameAvgValue);
+        item.setFirstLevelNum(firstLevelNum);
+        item.setSameFirstLevelNum(sameFirstLevelNum);
+        item.setFirstLevelPercent(firstLevelPercent);
+        item.setSameFirstLevelPercent(sameFirstLevelPercent);
+        item.setFirstLevelPercentStr(firstLevelPercentStr);
+        item.setSameFirstLevelPercentStr(sameFirstLevelPercentStr);
+        item.setSecondLevelNum(secondLevelNum);
+        item.setSameSecondLevelNum(sameSecondLevelNum);
+        item.setSecondLevelPercent(secondLevelPercent);
+        item.setSameSecondLevelPercent(sameSecondLevelPercent);
+        item.setSecondLevelPercentStr(secondLevelPercentStr);
+        item.setSameSecondLevelPercentStr(sameSecondLevelPercentStr);
+        item.setThirdLevelNum(thirdLevelNum);
+        item.setSameThirdLevelNum(sameThirdLevelNum);
+        item.setThirdLevelPercent(thirdLevelPercent);
+        item.setSameThirdLevelPercent(sameThirdLevelPercent);
+        item.setThirdLevelPercentStr(thirdLevelPercentStr);
+        item.setSameThirdLevelPercentStr(sameThirdLevelPercentStr);
+        return item;
+    }
+
+    /**
+     * 各科室缺陷占比(组合)-全院-根据内外科系统统计(台州)-导出
+     *
+     * @param filterOrderVO
+     * @return
+     */
+    public List<LevelStatisticsTZDTO> levelStatisticsByDeptStr_TZ(FilterOrderVO filterOrderVO) {
+        filterFacade.filterOrderVOSame(filterOrderVO);
+        List<LevelStatisticsTZDTO> records = behospitalInfoFacade.levelStatisticsByDeptClass_TZ(filterOrderVO);
+            LevelStatisticsTZDTO item = getGlobleRecords(records,filterOrderVO);
+            if (item != null) {
+                records.add(0, item);
+            }
+        if(ListUtil.isNotEmpty(records)){
+           for (LevelStatisticsTZDTO record : records) {
+               BigDecimalStrExport(record);
+           }
+       }
+
         return records;
     }
 
@@ -458,11 +837,388 @@ public class ConsoleFacade {
      * @return
      */
     public List<LevelStatisticsTZDTO> levelStatisticsByDeptClass_TZ(FilterOrderVO filterOrderVO) {
-        filterFacade.filterOrderVOSet(filterOrderVO);
+        filterFacade.filterOrderVOSame(filterOrderVO);
         List<LevelStatisticsTZDTO> records = behospitalInfoFacade.levelStatisticsByDeptClass_TZ(filterOrderVO);
+            LevelStatisticsTZDTO item = getGlobleRecords(records,filterOrderVO);
+            if (item != null) {
+                records.add(0, item);
+            }
+
+        if(ListUtil.isNotEmpty(records)){
+            for (LevelStatisticsTZDTO record : records) {
+                BigDecimalMethod(record);
+            }
+        }
+
         return records;
     }
 
+    /**
+     * 增加全院记录
+     *
+     * @param records
+     * @return
+     */
+    public LevelStatisticsTZDTO getGlobleRecords(List<LevelStatisticsTZDTO> records,FilterOrderVO filterOrderVO) {
+        DecimalFormat df = new DecimalFormat("#0.00");
+        LevelStatisticsTZDTO item = new LevelStatisticsTZDTO();
+        if (ListUtil.isEmpty(records)) {
+            return null;
+        }
+
+        //缺陷总数
+        Integer entryNum = records
+                .stream()
+                .map(LevelStatisticsTZDTO::getEntryNum)
+                .reduce(0, Integer::sum);
+        if (entryNum == null || entryNum == 0) {
+            return null;
+        }
+        //同比总数
+        Integer sameNum = records
+                .stream()
+                .map(LevelStatisticsTZDTO::getSameNum)
+                .reduce(0, Integer::sum);
+
+        //质控病历数
+        Integer mrNum = records
+                .stream()
+                .map(LevelStatisticsTZDTO::getMrNum)
+                .reduce(0, Integer::sum);
+        //同比病历数
+        Integer sameMrNum = records
+                .stream()
+                .map(LevelStatisticsTZDTO::getSameMrNum)
+                .reduce(0, Integer::sum);
+
+        //质控评分
+        Double totleValue = records
+                .stream()
+                .map(i -> BigDecimal.valueOf(i.getTotleValue()))
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .doubleValue();
+        //同比质控评分
+        Double sameTotleValue = records
+                .stream()
+                .map(i -> BigDecimal.valueOf(i.getSameTotleValue()))
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .doubleValue();
+
+        //质控平均分
+        Double averageValue = BigDecimal.valueOf(totleValue)
+                .divide(BigDecimal.valueOf(mrNum), 2, RoundingMode.HALF_UP)
+                .doubleValue();
+
+        Double sameAvgValue = 0d;
+        //同比平均分
+        if(0d != sameTotleValue){
+             sameAvgValue = BigDecimal.valueOf(sameTotleValue)
+                .divide(BigDecimal.valueOf(sameMrNum), 2, RoundingMode.HALF_UP)
+                .doubleValue();
+        }
+
+
+        //甲级病历数
+        Integer firstLevelNum = records
+                .stream()
+                .map(LevelStatisticsTZDTO::getFirstLevelNum)
+                .reduce(0, Integer::sum);
+
+        //同比甲级病历数
+        Integer sameFirstLevelNum = records
+                .stream()
+                .map(LevelStatisticsTZDTO::getSameFirstLevelNum)
+                .reduce(0, Integer::sum);
+
+
+        //乙级病历数
+        Integer secondLevelNum = records
+                .stream()
+                .map(LevelStatisticsTZDTO::getSecondLevelNum)
+                .reduce(0, Integer::sum);
+
+        //同比乙级病历数
+        Integer sameSecondLevelNum = records
+                .stream()
+                .map(LevelStatisticsTZDTO::getSameSecondLevelNum)
+                .reduce(0, Integer::sum);
+
+
+        //丙级病历数
+        Integer thirdLevelNum = records
+                .stream()
+                .map(LevelStatisticsTZDTO::getThirdLevelNum)
+                .reduce(0, Integer::sum);
+
+        //同比丙级病历数
+        Integer sameThirdLevelNum = records
+                .stream()
+                .map(LevelStatisticsTZDTO::getSameThirdLevelNum)
+                .reduce(0, Integer::sum);
+
+
+        //甲级病历占比
+        Double firstLevelPercent = BigDecimal.valueOf(firstLevelNum)
+                .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
+                .doubleValue();
+        String firstLevelPercentStr
+                = df.format(BigDecimal.valueOf(firstLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
+        //同比甲级病历占比
+        Double sameFirstLevelPercent = 0d;
+        String sameFirstLevelPercentStr = "0.00%";
+        if(0 != sameFirstLevelNum ){
+             sameFirstLevelPercent = BigDecimal.valueOf(sameFirstLevelNum)
+                    .divide(BigDecimal.valueOf(sameMrNum), 4, RoundingMode.HALF_UP)
+                    .doubleValue();
+             sameFirstLevelPercentStr
+                    = df.format(BigDecimal.valueOf(sameFirstLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
+        }
+
+
+        //乙级病历占比
+        Double secondLevelPercent = BigDecimal.valueOf(secondLevelNum)
+                .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
+                .doubleValue();
+        String secondLevelPercentStr
+                = df.format(BigDecimal.valueOf(secondLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
+
+        //同比乙级病历占比
+        Double sameSecondLevelPercent = 0d;
+        String sameSecondLevelPercentStr = "0.00%";
+        if(0 != sameFirstLevelNum ){
+         sameSecondLevelPercent = BigDecimal.valueOf(sameSecondLevelNum)
+                .divide(BigDecimal.valueOf(sameMrNum), 4, RoundingMode.HALF_UP)
+                .doubleValue();
+         sameSecondLevelPercentStr
+                = df.format(BigDecimal.valueOf(sameSecondLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
+        }
+        //丙级病历占比
+        Double thirdLevelPercent = BigDecimal.valueOf(thirdLevelNum)
+                .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
+                .doubleValue();
+        String thirdLevelPercentStr
+                = df.format(BigDecimal.valueOf(thirdLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
+
+        //同比丙级病历占比
+        Double sameThirdLevelPercent = 0d;
+        String sameThirdLevelPercentStr = "0.00%";
+        if(0 != sameFirstLevelNum ) {
+             sameThirdLevelPercent = BigDecimal.valueOf(sameThirdLevelNum)
+                    .divide(BigDecimal.valueOf(sameMrNum), 4, RoundingMode.HALF_UP)
+                    .doubleValue();
+             sameThirdLevelPercentStr
+                    = df.format(BigDecimal.valueOf(sameThirdLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
+        }
+
+        if (StringUtil.isBlank(filterOrderVO.getDeptClass()) || filterOrderVO.getDeptClass().equals("全院")) {
+        item.setDeptName("全院");
+         }else if("内科".equals(filterOrderVO.getDeptClass())){
+        item.setDeptName("内科系统");
+        }else if("外科".equals(filterOrderVO.getDeptClass())){
+        item.setDeptName("外科系统");
+     }
+
+        item.setEntryNum(entryNum);
+        item.setSameNum(sameNum);
+        item.setMrNum(mrNum);
+        item.setSameMrNum(sameMrNum);
+        item.setTotleValue(totleValue);
+        item.setSameTotleValue(sameTotleValue);
+        item.setAverageValue(averageValue);
+        item.setSameAvgValue(sameAvgValue);
+        item.setFirstLevelNum(firstLevelNum);
+        item.setSameFirstLevelNum(sameFirstLevelNum);
+        item.setFirstLevelPercent(firstLevelPercent);
+        item.setSameFirstLevelPercent(sameFirstLevelPercent);
+        item.setFirstLevelPercentStr(firstLevelPercentStr);
+        item.setSameFirstLevelPercentStr(sameFirstLevelPercentStr);
+        item.setSecondLevelNum(secondLevelNum);
+        item.setSameSecondLevelNum(sameSecondLevelNum);
+        item.setSecondLevelPercent(secondLevelPercent);
+        item.setSameSecondLevelPercent(sameSecondLevelPercent);
+        item.setSecondLevelPercentStr(secondLevelPercentStr);
+        item.setSameSecondLevelPercentStr(sameSecondLevelPercentStr);
+        item.setThirdLevelNum(thirdLevelNum);
+        item.setSameThirdLevelNum(sameThirdLevelNum);
+        item.setThirdLevelPercent(thirdLevelPercent);
+        item.setSameThirdLevelPercent(sameThirdLevelPercent);
+        item.setThirdLevelPercentStr(thirdLevelPercentStr);
+        item.setSameThirdLevelPercentStr(sameThirdLevelPercentStr);
+        return item;
+    }
+
+
+    public void BigDecimalStrExport(LevelStatisticsDTO record){
+
+        BigDecimal entrySameBigDecimal = getSubtract(new BigDecimal(record.getEntryNum()), new BigDecimal(record.getSameNum()  == null? 0:record.getSameNum()));
+
+        if(entrySameBigDecimal.compareTo(BigDecimal.ZERO)>0){
+            record.setEntryStrNum(record.getEntryNum()+"↑");
+        }else if(entrySameBigDecimal.compareTo(BigDecimal.ZERO) <0){
+            record.setEntryStrNum(record.getEntryNum()+"↓");
+        }
+
+        BigDecimal sameMrNumBigDecimal = getSubtract(new BigDecimal(record.getMrNum()), new BigDecimal(record.getSameMrNum()  == null? 0:record.getSameMrNum()));
+        if(sameMrNumBigDecimal.compareTo(BigDecimal.ZERO)>0){
+            record.setMrStrNum(record.getMrNum()+"↑");
+        }else if(sameMrNumBigDecimal.compareTo(BigDecimal.ZERO) <0){
+            record.setMrStrNum(record.getMrNum()+"↓");
+        }
+
+        BigDecimal sameAvgValueDecimal = getSubtract(new BigDecimal(record.getAverageValue()), new BigDecimal(record.getSameAvgValue() == null? 0:record.getSameAvgValue()));
+        if(sameAvgValueDecimal.compareTo(BigDecimal.ZERO)>0){
+            record.setAverageStrValue(record.getAverageValue()+"↑");
+        }else if(sameAvgValueDecimal.compareTo(BigDecimal.ZERO) <0){
+            record.setAverageStrValue(record.getAverageValue()+"↓");
+        }
+
+        BigDecimal SameFirstLevelBigDecimal = getSubtract(new BigDecimal(record.getFirstLevelNum()), new BigDecimal(record.getSameFirstLevelNum() == null? 0:record.getSameFirstLevelNum()));
+        if(SameFirstLevelBigDecimal.compareTo(BigDecimal.ZERO)>0){
+            record.setFirstLevelStrNum(record.getFirstLevelNum()+"↑");
+        }else if(SameFirstLevelBigDecimal.compareTo(BigDecimal.ZERO) <0){
+            record.setFirstLevelStrNum(record.getFirstLevelNum()+"↓");
+        }
+
+        BigDecimal SameSecondLevelBigDecimal = getSubtract(new BigDecimal(record.getSecondLevelNum()), new BigDecimal(record.getSameSecondLevelNum() == null? 0:record.getSameSecondLevelNum()));
+        if(SameSecondLevelBigDecimal.compareTo(BigDecimal.ZERO)>0){
+            record.setSecondLevelStrNum(record.getSecondLevelNum()+"↑");
+        }else if(SameSecondLevelBigDecimal.compareTo(BigDecimal.ZERO) <0){
+            record.setSecondLevelStrNum(record.getSecondLevelNum()+"↓");
+        }
+
+        BigDecimal SameThirdLevelBigDecimal = getSubtract(new BigDecimal(record.getThirdLevelNum()), new BigDecimal(record.getSameThirdLevelNum() == null? 0:record.getSameThirdLevelNum()));
+        if(SameThirdLevelBigDecimal.compareTo(BigDecimal.ZERO)>0){
+            record.setThirdLevelStrNum(record.getThirdLevelNum()+"↑");
+        }else if(SameThirdLevelBigDecimal.compareTo(BigDecimal.ZERO) <0){
+            record.setThirdLevelStrNum(record.getThirdLevelNum()+"↓");
+        }
+
+        BigDecimal SameFirstLevelPeDecimal = getSubtract(new BigDecimal(record.getFirstLevelPercent()), new BigDecimal(record.getSameFirstLevelPercent() == null? 0:record.getSameFirstLevelPercent()));
+        if(SameFirstLevelPeDecimal.compareTo(BigDecimal.ZERO)>0){
+            record.setFirstLevelPercentStr(record.getFirstLevelPercentStr()+"↑");
+        }else if(SameFirstLevelPeDecimal.compareTo(BigDecimal.ZERO) <0){
+          record.setFirstLevelPercentStr(record.getFirstLevelPercentStr()+"↓");
+        }
+
+        BigDecimal SameSecondLevelPeDecimal = getSubtract(new BigDecimal(record.getSecondLevelPercent()), new BigDecimal(record.getSameSecondLevelPercent() == null? 0:record.getSameSecondLevelPercent()));
+      if(SameSecondLevelPeDecimal.compareTo(BigDecimal.ZERO)>0){
+            record.setSecondLevelPercentStr(record.getSecondLevelPercentStr()+"↑");
+        }else if(SameSecondLevelPeDecimal.compareTo(BigDecimal.ZERO)<0){
+          record.setSecondLevelPercentStr(record.getSecondLevelPercentStr()+"↓");
+        }
+
+        BigDecimal SameThirdLevelPeDecimal = getSubtract(new BigDecimal(record.getThirdLevelPercent()), new BigDecimal(record.getSameThirdLevelPercent() == null? 0:record.getSameThirdLevelPercent()));
+      if(SameThirdLevelPeDecimal.compareTo(BigDecimal.ZERO)>0){
+            record.setThirdLevelPercentStr(record.getThirdLevelPercentStr()+"↑");
+        }else if(SameThirdLevelPeDecimal.compareTo(BigDecimal.ZERO) <0){
+            record.setThirdLevelPercentStr(record.getThirdLevelPercentStr()+"↓");
+        }
+    };
+
+    public void BigDecimalMethod(LevelStatisticsDTO record){
+        BigDecimal entrySameBigDecimal = getSubtract(new BigDecimal(record.getEntryNum()), new BigDecimal(record.getSameNum() == null? 0:record.getSameNum()));
+
+        if(entrySameBigDecimal.compareTo(BigDecimal.ZERO)>0){
+            record.setEntrySameNum(1);
+        }else if(entrySameBigDecimal.compareTo(BigDecimal.ZERO) == 0){
+            record.setEntrySameNum(0);
+        }else{
+            record.setEntrySameNum(-1);
+        }
+
+        BigDecimal sameMrNumBigDecimal = getSubtract(new BigDecimal(record.getMrNum()), new BigDecimal(record.getSameMrNum()  == null? 0:record.getSameMrNum()));
+        if(sameMrNumBigDecimal.compareTo(BigDecimal.ZERO)>0){
+            record.setMrSameNum(1);
+        }else if(sameMrNumBigDecimal.compareTo(BigDecimal.ZERO) == 0){
+            record.setMrSameNum(0);
+        }else{
+            record.setMrSameNum(-1);
+        }
+
+        BigDecimal sameAvgValueDecimal = getSubtract(new BigDecimal(record.getAverageValue()), new BigDecimal(record.getSameAvgValue() == null? 0:record.getSameAvgValue()));
+        if(sameAvgValueDecimal.compareTo(BigDecimal.ZERO)>0){
+            record.setAvSameValue(1);
+        }else if(sameAvgValueDecimal.compareTo(BigDecimal.ZERO) == 0){
+            record.setAvSameValue(0);
+        }else{
+            record.setAvSameValue(-1);
+        }
+
+        BigDecimal SameFirstLevelBigDecimal = getSubtract(new BigDecimal(record.getFirstLevelNum()), new BigDecimal(record.getSameFirstLevelNum() == null? 0:record.getSameFirstLevelNum()));
+        if(SameFirstLevelBigDecimal.compareTo(BigDecimal.ZERO)>0){
+            record.setFirSameLevelNum(1);
+        }else if(SameFirstLevelBigDecimal.compareTo(BigDecimal.ZERO) == 0){
+            record.setFirSameLevelNum(0);
+        }else{
+            record.setFirSameLevelNum(-1);
+        }
+
+        BigDecimal SameSecondLevelBigDecimal = getSubtract(new BigDecimal(record.getSecondLevelNum()), new BigDecimal(record.getSameSecondLevelNum() == null? 0:record.getSameSecondLevelNum()));
+        if(SameSecondLevelBigDecimal.compareTo(BigDecimal.ZERO)>0){
+            record.setSecSameLevelNum(1);
+        }else if(SameSecondLevelBigDecimal.compareTo(BigDecimal.ZERO) == 0){
+            record.setSecSameLevelNum(0);
+        }else{
+            record.setSecSameLevelNum(-1);
+        }
+
+        BigDecimal SameThirdLevelBigDecimal = getSubtract(new BigDecimal(record.getThirdLevelNum()), new BigDecimal(record.getSameThirdLevelNum() == null? 0:record.getSameThirdLevelNum()));
+        if(SameThirdLevelBigDecimal.compareTo(BigDecimal.ZERO)>0){
+            record.setThiSameLevelNum(1);
+        }else if(SameThirdLevelBigDecimal.compareTo(BigDecimal.ZERO) == 0){
+            record.setThiSameLevelNum(0);
+        }else{
+            record.setThiSameLevelNum(-1);
+        }
+
+        BigDecimal SameFirstLevelPeDecimal = getSubtract(new BigDecimal(record.getFirstLevelPercent()), new BigDecimal(record.getSameFirstLevelPercent() == null? 0:record.getSameFirstLevelPercent()));
+        if(SameFirstLevelPeDecimal.compareTo(BigDecimal.ZERO)>0){
+            record.setFirSameLevelPercent(1);
+        }else if(SameFirstLevelPeDecimal.compareTo(BigDecimal.ZERO) == 0){
+            record.setFirSameLevelPercent(0);
+        }else{
+            record.setFirSameLevelPercent(-1);
+        }
+
+        BigDecimal SameSecondLevelPeDecimal = getSubtract(new BigDecimal(record.getSecondLevelPercent()), new BigDecimal(record.getSameSecondLevelPercent() == null? 0:record.getSameSecondLevelPercent()));
+        if(SameSecondLevelPeDecimal.compareTo(BigDecimal.ZERO)>0){
+            record.setSecSameLevelPercent(1);
+        }else if(SameSecondLevelPeDecimal.compareTo(BigDecimal.ZERO) == 0){
+            record.setSecSameLevelPercent(0);
+        }else{
+            record.setSecSameLevelPercent(-1);
+        }
+
+        BigDecimal SameThirdLevelPeDecimal = getSubtract(new BigDecimal(record.getThirdLevelPercent()), new BigDecimal(record.getSameThirdLevelPercent() == null? 0:record.getSameThirdLevelPercent()));
+        if(SameThirdLevelPeDecimal.compareTo(BigDecimal.ZERO)>0){
+            record.setThiSameLevelPercent(1);
+        }else if(SameThirdLevelPeDecimal.compareTo(BigDecimal.ZERO) == 0){
+            record.setThiSameLevelPercent(0);
+        }else{
+            record.setThiSameLevelPercent(-1);
+        }
+    };
+
+
+    /**
+     * 差值计算
+     *
+     * @param bigDecimalOne
+     * @param bigDecimalTwo
+     * @return
+     */
+    private BigDecimal getSubtract(BigDecimal bigDecimalOne, BigDecimal bigDecimalTwo) {
+        BigDecimal newBigDecimal = new BigDecimal(0);
+        if (null == bigDecimalOne && null != bigDecimalTwo) {
+            newBigDecimal = newBigDecimal.subtract(bigDecimalTwo);
+        } else if (null != bigDecimalOne && null == bigDecimalTwo) {
+            newBigDecimal = bigDecimalOne.subtract(newBigDecimal);
+        } else if (null != bigDecimalOne && null != bigDecimalTwo) {
+            newBigDecimal = bigDecimalOne.subtract(bigDecimalTwo);
+        }
+        return newBigDecimal;
+    }
+
     /**
      * 病案首页合格率占比
      *
@@ -1175,7 +1931,7 @@ public class ConsoleFacade {
     }
 
     /**
-     * 不合格数病历号(内页)
+     * 不合格/合格数病历号(内页)
      *
      * @param qcResultPageVO
      * @return

+ 131 - 0
src/main/java/com/diagbot/facade/FilterFacade.java

@@ -8,6 +8,9 @@ import com.diagbot.vo.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
 import java.util.Date;
 
 /**
@@ -86,6 +89,50 @@ public class FilterFacade {
         return dateStr;
     }
 
+    /**
+     * 获取上一年同期开始结束时间
+     *
+     * @param date
+     * @return
+     */
+    public String getStaEndDate(String date) {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date dateStart = new Date();
+        try {
+             dateStart = formatter.parse(date);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        Calendar c = Calendar.getInstance();
+        c.setTime(dateStart);
+        c.add(Calendar.YEAR, -1);
+        Date y = c.getTime();
+        String newDate = formatter.format(y);
+        return newDate;
+    }
+
+    /**
+     * 获取上一年同期开始结束时间
+     *
+     * @param date
+     * @return
+     */
+    public String getLastStartEndDate(String date) {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+        Date dateStart = new Date();
+        try {
+            dateStart = formatter.parse(date);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        Calendar c = Calendar.getInstance();
+        c.setTime(dateStart);
+        c.add(Calendar.YEAR, -1);
+        Date y = c.getTime();
+        String newDate = formatter.format(y);
+        return newDate;
+    }
+
     /**
      * 获取上一统计周期(上月/去年)的起始时间
      *
@@ -97,6 +144,39 @@ public class FilterFacade {
         return getStartDateStr(type, null);
     }
 
+    /**
+     * 入参拼接-同比
+     *
+     * @param filterVO
+     */
+    public void filterVOSetSame(FilterVO filterVO) {
+        String hospitalId = SysUserUtils.getCurrentHospitalID();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        filterVO.setHospitalId(hospitalId);
+        filterVO.setUserId(Long.valueOf(userId));
+        if (filterVO.getLimitCount() == null || filterVO.getLimitCount().equals(0)) {
+            filterVO.setLimitCount(10);
+        }
+        if (StringUtil.isBlank(filterVO.getStartDate())) {
+            String startDate = getStartDateStr(filterVO.getType(), null);
+            filterVO.setStartDate(startDate);
+            String lastStartDate = getLastStartEndDate(startDate);
+            filterVO.setLastStartDate(lastStartDate);
+        }else{
+            String lastStartDate = getLastStartEndDate(filterVO.getStartDate());
+            filterVO.setLastStartDate(lastStartDate);
+        }
+        if (StringUtil.isBlank(filterVO.getEndDate())) {
+            String endDate = getEndDateStr(filterVO.getType(), null);
+            filterVO.setEndDate(endDate);
+            String lastEndDate = getLastStartEndDate(endDate);
+            filterVO.setLastEndDate(lastEndDate);
+        }else{
+            String lastEndDate = getLastStartEndDate(filterVO.getEndDate());
+            filterVO.setLastEndDate(lastEndDate);
+        }
+    }
+
     /**
      * 入参拼接
      *
@@ -193,6 +273,57 @@ public class FilterFacade {
     /**
      * 过滤条件设置
      *
+     * @param filterVO
+     */
+    public void filterVOSame(FilterVO filterVO) {
+        String hospitalId = SysUserUtils.getCurrentHospitalID();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        filterVO.setHospitalId(hospitalId);
+        filterVO.setUserId(Long.valueOf(userId));
+        if (filterVO.getLimitCount() == null || filterVO.getLimitCount().equals(0)) {
+            filterVO.setLimitCount(10);
+        }
+        if (StringUtil.isBlank(filterVO.getStartDate())) {
+            String startDate = getStartDateStr(filterVO.getType(), null);
+            filterVO.setStartDate(startDate);
+            String lastStartDate = getStaEndDate(startDate);
+            filterVO.setLastStartDate(lastStartDate);
+        }else{
+            String lastStartDate = getStaEndDate(filterVO.getStartDate());
+            filterVO.setLastStartDate(lastStartDate);
+        }
+        if (StringUtil.isBlank(filterVO.getEndDate())) {
+            String endDate = getEndDateStr(filterVO.getType(), null);
+            filterVO.setEndDate(endDate);
+            String lastEndDate = getStaEndDate(endDate);
+            filterVO.setLastEndDate(lastEndDate);
+        }else{
+            String lastEndDate = getStaEndDate(filterVO.getEndDate());
+            filterVO.setLastEndDate(lastEndDate);
+        }
+    }
+
+    /**
+     * 过滤条件设置
+     *
+     * @param filterOrderVO
+     */
+    public void filterOrderVOSame(FilterOrderVO filterOrderVO) {
+        FilterVO filterVO = new FilterVO();
+        BeanUtil.copyProperties(filterOrderVO, filterVO);
+        filterVOSetSame(filterVO);
+        filterOrderVO.setHospitalId(filterVO.getHospitalId());
+        filterOrderVO.setUserId(filterVO.getUserId());
+        filterOrderVO.setStartDate(filterVO.getStartDate());
+        filterOrderVO.setEndDate(filterVO.getEndDate());
+        filterOrderVO.setLastStartDate(filterVO.getLastStartDate());
+        filterOrderVO.setLastEndDate(filterVO.getLastEndDate());
+        filterOrderVO.setLimitCount(filterVO.getLimitCount());
+    }
+
+    /**
+     * 过滤条件设置-同比
+     *
      * @param filterOrderByDeptVO
      */
     public void filterOrderByDeptVOSet(FilterOrderByDeptVO filterOrderByDeptVO) {

+ 2 - 3
src/main/java/com/diagbot/mapper/BehospitalInfoMapper.java

@@ -179,7 +179,6 @@ public interface BehospitalInfoMapper extends BaseMapper<BehospitalInfo> {
      */
     public List<LevelStatisticsTZDTO> levelStatisticsByDeptClass_TZ(FilterOrderVO filterOrderVO);
 
-
     List<ExportExcelDTO> exportExcel();
 
     /**
@@ -350,7 +349,7 @@ public interface BehospitalInfoMapper extends BaseMapper<BehospitalInfo> {
     public IPage<QcResultShortDTO> unModifyMRPage(@Param("qcResultShortPageVO") QcResultShortPageVO qcResultShortPageVO);
 
     /**
-     * 不合格数病历号(内页)
+     * 不合格/合格数病历号(内页)
      *
      * @param qcResultPageVO
      * @return
@@ -369,7 +368,7 @@ public interface BehospitalInfoMapper extends BaseMapper<BehospitalInfo> {
 
 
     /**
-     * 病案首页不合格数病历详情页导出
+     * 病案首页不合格/合格数病历详情页导出
      *
      * @param qcResultShortPageVO
      * @return

+ 1 - 1
src/main/java/com/diagbot/service/BehospitalInfoService.java

@@ -346,7 +346,7 @@ public interface BehospitalInfoService extends IService<BehospitalInfo> {
     public List<ExportExcelDTO> unModifyMRPageExport(@Param("qcResultShortPageVO") QcResultShortPageVO qcResultShortPageVO);
 
     /**
-     * 病案首页不合格数病历详情页导出
+     * 病案首页不合格/合格数病历详情页导出
      *
      * @param qcResultShortPageVO
      * @return

+ 3 - 2
src/main/java/com/diagbot/service/impl/BehospitalInfoServiceImpl.java

@@ -249,6 +249,7 @@ public class BehospitalInfoServiceImpl extends ServiceImpl<BehospitalInfoMapper,
         return baseMapper.levelStatisticsByDeptClass_TZ(filterOrderVO);
     }
 
+
     @Override
     public List<ExportExcelDTO> exportExcel() {
         return baseMapper.exportExcel();
@@ -495,7 +496,7 @@ public class BehospitalInfoServiceImpl extends ServiceImpl<BehospitalInfoMapper,
     }
 
     /**
-     * 不合格数病历号(内页)
+     * 不合格/合格数病历号(内页)
      *
      * @param qcResultPageVO
      * @return
@@ -517,7 +518,7 @@ public class BehospitalInfoServiceImpl extends ServiceImpl<BehospitalInfoMapper,
     }
 
     /**
-     * 病案首页不合格数病历详情页导出
+     * 病案首页不合格/合格数病历详情页导出
      *
      * @param qcResultShortPageVO
      * @return

+ 9 - 1
src/main/java/com/diagbot/vo/FilterOrderVO.java

@@ -30,4 +30,12 @@ public class FilterOrderVO extends FilterVO {
      * 科室名称/主管医生名称
      */
     private String name;
-}
+    /**
+     * 去年同期起始时间
+     */
+    private String lastStartDate;
+    /**
+     * 去年同期结束时间
+     */
+    private String lastEndDate;
+}

+ 13 - 1
src/main/java/com/diagbot/vo/FilterVO.java

@@ -29,6 +29,18 @@ public class FilterVO {
      */
     @NotBlank(message = "请输入结束时间")
     private String endDate;
+
+    /**
+     * 去年同期起始时间
+     */
+    @ApiModelProperty(hidden = true)
+    private String lastStartDate;
+    /**
+     * 去年同期结束时间
+     */
+    @ApiModelProperty(hidden = true)
+    private String lastEndDate;
+
     /**
      * 医院id
      */
@@ -54,4 +66,4 @@ public class FilterVO {
      * 是否归档(0:未归档,1:已归档)
      */
     private String isPlacefile = "1";
-}
+}

+ 6 - 0
src/main/java/com/diagbot/vo/QcResultPageVO.java

@@ -29,6 +29,12 @@ public class QcResultPageVO extends Page {
      * 病人姓名
      */
     private String patName;
+
+    /**
+     * title名称
+     */
+    private String titleName;
+
     /**
      * 条目名称
      */

+ 7 - 1
src/main/java/com/diagbot/vo/QcResultShortPageVO.java

@@ -32,6 +32,12 @@ public class QcResultShortPageVO extends Page {
      * 条目名称
      */
     private String casesEntryName;
+
+    /**
+     * title名称
+     */
+    private String titleName;
+
     /**
      * 条目id
      */
@@ -126,4 +132,4 @@ public class QcResultShortPageVO extends Page {
      * 改善标志(1:病案首页改善病历,2:病案首页改善至合格病历,3:病案首页改善至满分病历)
      */
     private Integer improveType;
-}
+}

+ 2 - 1
src/main/java/com/diagbot/web/ConsoleController.java

@@ -447,10 +447,11 @@ public class ConsoleController {
      * @param qcResultPageVO
      * @return
      */
-    @ApiOperation(value = "病案首页不合格数病历详情(内页)[by:cy]",
+    @ApiOperation(value = "病案首页不合格/合格数病历详情(内页)[by:cy]",
             notes = "behospitalCode: 病历号<br>" +
                     "patName: 病人姓名 <br>" +
                     "casesEntryName: 条目名称 <br>" +
+                    "titleName: 标题名称 <br>" +
                     "casesEntryId: 条目id <br>" +
                     "behDeptName:科室名称 <br>" +
                     "doctorId:医生工号 <br>" +

+ 2 - 2
src/main/java/com/diagbot/web/ConsoleExportController.java

@@ -336,12 +336,12 @@ public class ConsoleExportController {
     }
 
     /**
-     * 病案首页不合格数病历详情页导出
+     * 病案首页不合格/合格数病历详情页导出
      *
      * @param qcResultShortPageVO
      * @return
      */
-    @ApiOperation(value = "病案首页不合格数病历详情页导出[by:cy]",
+    @ApiOperation(value = "病案首页不合格/合格数病历详情页导出[by:cy]",
             notes = "behospitalCode: 病历号<br>" +
                     "patName: 病人姓名 <br>" +
                     "behDeptName:科室名称 <br>" +

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 663 - 129
src/main/resources/mapper/BehospitalInfoMapper.xml


+ 121 - 2
src/main/resources/mapper/QcresultInfoMapper.xml

@@ -818,6 +818,16 @@
     </select>
     <!-- 各科室质控平均分(首页) -->
     <select id="getAverageScore" parameterType="com.diagbot.vo.FilterVO" resultType="com.diagbot.dto.AverageStatisticsDTO">
+        select
+        m1.id,
+        m1.name,
+        m1.totleValue,
+        m2.sameTotleValue,
+        m1.averageValue,
+        m2.lastYearAverageValue,
+        m1.num,
+        m2.sameNum
+        from(
         SELECT
         a.beh_dept_id AS id,
         a.beh_dept_name AS name,
@@ -857,11 +867,65 @@
         </if>
         GROUP BY
         a.beh_dept_id,
-        a.beh_dept_name
+        a.beh_dept_name)m1 left join
+        ( SELECT
+        a.beh_dept_id AS id,
+        a.beh_dept_name AS name,
+        ROUND( sum( CAST( c.score_res AS DECIMAL ( 18, 2 ) )), 2 ) AS sameTotleValue,
+        ROUND( sum( CAST( c.score_res AS DECIMAL ( 18, 2 ) ))/ count(*), 2 ) AS lastYearAverageValue,
+        count(*) AS sameNum
+        FROM
+        med_behospital_info a,
+        med_qcresult_info c
+        WHERE
+        a.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND a.hospital_id = c.hospital_id
+        AND a.behospital_code = c.behospital_code
+        <if test="isPlacefile != null and isPlacefile != ''">
+            and a.is_placefile = #{isPlacefile}
+        </if>
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="hospitalId != null and hospitalId != ''">
+            AND a.hospital_id = #{hospitalId}
+        </if>
+        <if test="isPlacefile != null and isPlacefile == 0">
+            <if test="lastStartDate != null and lastStartDate != ''">
+                <![CDATA[ AND a.behospital_date >= #{lastStartDate}]]>
+            </if>
+            <if test="lastEndDate != null and lastEndDate != ''">
+                <![CDATA[ AND a.behospital_date <= #{lastEndDate}]]>
+            </if>
+        </if>
+        <if test="isPlacefile != null and isPlacefile == 1">
+            <if test="lastStartDate != null and lastStartDate != ''">
+                <![CDATA[ AND a.leave_hospital_date >= #{lastStartDate}]]>
+            </if>
+            <if test="lastEndDate != null and lastEndDate != ''">
+                <![CDATA[ AND a.leave_hospital_date <= #{lastEndDate}]]>
+            </if>
+        </if>
+        GROUP BY
+        a.beh_dept_id,
+        a.beh_dept_name)m2
+        on
+        m1.id = m2.id
+        and m1.name = m2.name
     </select>
 
     <!-- 各科室质控平均分(首页)-根据内外科系统统计 -->
     <select id="getAverageScoreByDeptClass" parameterType="com.diagbot.vo.FilterVO" resultType="com.diagbot.dto.AverageStatisticsDTO">
+        select
+        m1.id,
+        m1.name,
+        m1.totleValue,
+        m2.sameTotleValue,
+        m1.averageValue,
+        m2.lastYearAverageValue,
+        m1.num,
+        m2.sameNum,
+        m1.deptClass
+        from(
         SELECT
         a.beh_dept_id AS id,
         a.beh_dept_name AS NAME,
@@ -913,7 +977,62 @@
         </if>
         GROUP BY
         a.beh_dept_id,
-        a.beh_dept_name
+        a.beh_dept_name) m1 left join
+        (SELECT
+        a.beh_dept_id AS id,
+        a.beh_dept_name AS NAME,
+        ROUND( sum( CAST( c.score_res AS DECIMAL ( 18, 2 ) )), 2 ) AS sameTotleValue,
+        ROUND( sum( CAST( c.score_res AS DECIMAL ( 18, 2 ) ))/ count(*), 2 ) AS lastYearAverageValue,
+        count(*) AS sameNum ,
+        e.dept_name as deptClass
+        FROM
+        med_behospital_info a,
+        med_qcresult_info c,
+        bas_dept_info d,
+        bas_dept_info e
+        WHERE
+        a.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        AND e.is_deleted = 'N'
+        AND a.hospital_id = c.hospital_id
+        AND a.hospital_id = d.hospital_id
+        AND a.hospital_id = e.hospital_id
+        AND a.behospital_code = c.behospital_code
+        AND a.beh_dept_id = d.dept_id
+        AND d.parent_dept_id = e.dept_id
+        <if test="isPlacefile != null and isPlacefile != ''">
+            and a.is_placefile = #{isPlacefile}
+        </if>
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="hospitalId != null and hospitalId != ''">
+            AND a.hospital_id = #{hospitalId}
+        </if>
+        <if test="isPlacefile != null and isPlacefile == 0">
+            <if test="lastStartDate != null and lastStartDate != ''">
+                <![CDATA[ AND a.behospital_date >= #{lastStartDate}]]>
+            </if>
+            <if test="lastEndDate != null and lastEndDate != ''">
+                <![CDATA[ AND a.behospital_date <= #{lastEndDate}]]>
+            </if>
+        </if>
+        <if test="isPlacefile != null and isPlacefile == 1">
+            <if test="lastStartDate != null and lastStartDate != ''">
+                <![CDATA[ AND a.leave_hospital_date >= #{lastStartDate}]]>
+            </if>
+            <if test="lastEndDate != null and lastEndDate != ''">
+                <![CDATA[ AND a.leave_hospital_date <= #{lastEndDate}]]>
+            </if>
+        </if>
+        <if test="deptClass != null and deptClass != ''">
+            AND e.dept_name = #{deptClass}
+        </if>
+        GROUP BY
+        a.beh_dept_id,
+        a.beh_dept_name)m2
+        on
+        m1.id = m2.id
+        and m1.name = m2.name
     </select>
 
     <!-- 按科室统计质控病历数 -->