Browse Source

Merge remote-tracking branch 'origin/test' into dev/20200923_1.5.0

chengyao 4 years atrás
parent
commit
cbbdaae3ce
31 changed files with 3234 additions and 328 deletions
  1. 5 0
      doc/023.20200923v5.4.0云后台自用/qc_initv5.4.0.sql
  2. 26 0
      doc/024.20200923v1.4.6/qc_initv1.4.6.sql
  3. 2 0
      doc/025.20201021v1.4.7/qc_initv1.4.7.sql
  4. 2 2
      pom.xml
  5. 22 3
      src/main/java/com/diagbot/aggregate/AverageStatisticsAggregate.java
  6. 4 0
      src/main/java/com/diagbot/config/ResourceServerConfigurer.java
  7. 4 0
      src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java
  8. 4 2
      src/main/java/com/diagbot/dto/AverageStatisticsDTO.java
  9. 6 1
      src/main/java/com/diagbot/dto/BehospitalInfoDTO.java
  10. 3 1
      src/main/java/com/diagbot/dto/ExportExcelBehospitalDTO.java
  11. 1 1
      src/main/java/com/diagbot/dto/ExportExcelDTO.java
  12. 13 11
      src/main/java/com/diagbot/dto/HomePageNumDTO.java
  13. 215 21
      src/main/java/com/diagbot/dto/LevelStatisticsDTO.java
  14. 3 1
      src/main/java/com/diagbot/dto/QcResultShortDTO.java
  15. 5 0
      src/main/java/com/diagbot/entity/HomeOperationInfo.java
  16. 41 3
      src/main/java/com/diagbot/facade/ConsoleExportFacade.java
  17. 778 4
      src/main/java/com/diagbot/facade/ConsoleFacade.java
  18. 149 0
      src/main/java/com/diagbot/facade/FilterFacade.java
  19. 20 1
      src/main/java/com/diagbot/mapper/BehospitalInfoMapper.java
  20. 15 0
      src/main/java/com/diagbot/service/BehospitalInfoService.java
  21. 23 0
      src/main/java/com/diagbot/service/impl/BehospitalInfoServiceImpl.java
  22. 17 0
      src/main/java/com/diagbot/vo/Drug.java
  23. 9 1
      src/main/java/com/diagbot/vo/FilterOrderVO.java
  24. 13 1
      src/main/java/com/diagbot/vo/FilterVO.java
  25. 138 0
      src/main/java/com/diagbot/vo/QcResultPageVO.java
  26. 7 1
      src/main/java/com/diagbot/vo/QcResultShortPageVO.java
  27. 10 4
      src/main/java/com/diagbot/vo/SearchData.java
  28. 33 0
      src/main/java/com/diagbot/web/ConsoleController.java
  29. 30 0
      src/main/java/com/diagbot/web/ConsoleExportController.java
  30. 1515 268
      src/main/resources/mapper/BehospitalInfoMapper.xml
  31. 121 2
      src/main/resources/mapper/QcresultInfoMapper.xml

+ 5 - 0
doc/023.20200923v5.4.0云后台自用/qc_initv5.4.0.sql

@@ -0,0 +1,5 @@
+use `qc`;
+ALTER TABLE `qc_module_info` ADD `default_module` int(3) DEFAULT NULL COMMENT '默认模版是否开启(0-否 1-是)' AFTER `name`;
+UPDATE  `qc_module_info` set default_module = 0
+ALTER TABLE `qc_type` ADD `default_module` int(3) DEFAULT NULL COMMENT '默认模版是否开启(0-否 1-是 -1病历不质控)' AFTER `name`;
+UPDATE  `qc_type` set default_module = 0

+ 26 - 0
doc/024.20200923v1.4.6/qc_initv1.4.6.sql

@@ -0,0 +1,26 @@
+use `qc`;
+UPDATE `sys_user_pageset` SET  `order_no` = 0  WHERE user_id = -1 and name = '病历等级';
+UPDATE `sys_user_pageset` SET  `order_no` = 1  WHERE user_id = -1 and name = '病历得分';
+INSERT INTO `qc`.`sys_user_pageset`(`is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `user_id`, `page_type`, `name`, `val`, `status`, `order_no`, `remark`) VALUES ( 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', -1, 1, '病案首页得分', 'scoreBn', 0, 2, NULL);
+UPDATE `sys_user_pageset` SET  `order_no` = 3  WHERE user_id = -1 and name = '病人住院序号';
+UPDATE `sys_user_pageset` SET  `order_no` = 4  WHERE user_id = -1 and name = '病案首页核查状态';
+UPDATE `sys_user_pageset` SET  `order_no` = 5  WHERE user_id = -1 and name = '病案首页核查人';
+UPDATE `sys_user_pageset` SET  `order_no` = 6  WHERE user_id = -1 and name = '病案首页核查时间';
+UPDATE `sys_user_pageset` SET  `order_no` = 7  WHERE user_id = -1 and name = '病历核查状态';
+UPDATE `sys_user_pageset` SET  `order_no` = 8  WHERE user_id = -1 and name = '病历核查人';
+UPDATE `sys_user_pageset` SET  `order_no` = 9  WHERE user_id = -1 and name = '病历核查时间';
+UPDATE `sys_user_pageset` SET  `order_no` = 10  WHERE user_id = -1 and name = '病案号';
+UPDATE `sys_user_pageset` SET  `order_no` = 11  WHERE user_id = -1 and name = '病人姓名';
+UPDATE `sys_user_pageset` SET  `order_no` = 12  WHERE user_id = -1 and name = '性别';
+UPDATE `sys_user_pageset` SET  `order_no` = 13  WHERE user_id = -1 and name = '年龄';
+UPDATE `sys_user_pageset` SET  `order_no` = 14  WHERE user_id = -1 and name = '床号';
+UPDATE `sys_user_pageset` SET  `order_no` = 15  WHERE user_id = -1 and name = '入院日期';
+UPDATE `sys_user_pageset` SET  `order_no` = 16  WHERE user_id = -1 and name = '出院日期';
+UPDATE `sys_user_pageset` SET  `order_no` = 17  WHERE user_id = -1 and name = '归档日期';
+UPDATE `sys_user_pageset` SET  `order_no` = 18  WHERE user_id = -1 and name = '主诊断';
+UPDATE `sys_user_pageset` SET  `order_no` = 19  WHERE user_id = -1 and name = '住院医生';
+UPDATE `sys_user_pageset` SET  `order_no` = 20  WHERE user_id = -1 and name = '主管医生';
+UPDATE `sys_user_pageset` SET  `order_no` = 21  WHERE user_id = -1 and name = '主任医生';
+UPDATE `sys_user_pageset` SET  `order_no` = 22  WHERE user_id = -1 and name = '科室';
+UPDATE `sys_user_pageset` SET  `order_no` = 23  WHERE user_id = -1 and name = '评分时间';
+

+ 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, '病案首页手术信息');

+ 2 - 2
pom.xml

@@ -37,8 +37,8 @@
         <okhttp.version>4.2.2</okhttp.version>
         <easypoi.version>4.2.0</easypoi.version>
         <docker-maven-plugin.version>1.2.1</docker-maven-plugin.version>
-        <docker.image.prefix>192.168.2.236:5000/diagbotcloud</docker.image.prefix>
-        <registryUrl>http://192.168.2.236:5000/repository/diagbotcloud/</registryUrl>
+        <docker.image.prefix>192.168.2.241:5000/diagbotcloud</docker.image.prefix>
+        <registryUrl>http://192.168.2.241:5000/repository/diagbotcloud/</registryUrl>
     </properties>
 
     <dependencyManagement>

+ 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 - 0
src/main/java/com/diagbot/config/ResourceServerConfigurer.java

@@ -169,9 +169,13 @@ public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
                 .antMatchers("/qc/medLisInfo/getExaminePage").permitAll()
                 .antMatchers("/qc/medLisInfo/getExamineSonPage").permitAll()
                 .antMatchers("/console/medicalCheckForm").permitAll()
+                .antMatchers("/qc/behospitalInfo/analyzeCds").permitAll()
                 .antMatchers("/console/medicalCheckTitle").permitAll()
                 .antMatchers("/console/export/medicalCheckExport").permitAll()
+                .antMatchers("/qc/behospitalInfo/analyzeCds").permitAll()
                 .antMatchers("/console/export/medicalCheckInnerExport").permitAll()
+                .antMatchers("/console/badLevelPage").permitAll()
+                .antMatchers("/console/export/badLevelPagePageExport").permitAll()
                 .antMatchers("/**").authenticated();
         //                .antMatchers("/**").permitAll();
     }

+ 4 - 0
src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java

@@ -211,11 +211,15 @@ public class UrlAccessDecisionManager implements AccessDecisionManager {
                 || matchers("/qc/doctoradvice/getPage", request)
                 || matchers("/qc/medPacsInfo/getCheckPage", request)
                 || matchers("/qc/medLisInfo/getExaminePage", request)
+                || matchers("/qc/behospitalInfo/analyzeCds", request)
                 || matchers("/qc/medLisInfo/getExamineSonPage", request)
                 || matchers("/console/medicalCheckForm", request)
                 || matchers("/console/medicalCheckTitle", request)
                 || matchers("/console/export/medicalCheckExport", request)
+                || matchers("/qc/behospitalInfo/analyzeCds", request)
                 || matchers("/console/export/medicalCheckInnerExport", request)
+                || matchers("/console/badLevelPage", request)
+                || matchers("/console/export/badLevelPagePageExport", request)
                 || matchers("/", request)) {
             return true;
         }

+ 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;
-}
+}

+ 6 - 1
src/main/java/com/diagbot/dto/BehospitalInfoDTO.java

@@ -95,7 +95,12 @@ public class BehospitalInfoDTO implements Serializable {
     /**
      * 最后得分
      */
-    private String scoreRes;
+    private Double scoreRes;
+
+    /**
+     * 病案首页得分
+     */
+    private Double scoreBn;
 
     /**
      * 评分类型(1:机器,2:人工)

+ 3 - 1
src/main/java/com/diagbot/dto/ExportExcelBehospitalDTO.java

@@ -27,7 +27,9 @@ public class ExportExcelBehospitalDTO {
     @Excel(name = "出院时间", needMerge = true, exportFormat = "yyyy/MM/dd")
     private Date leaveHospitalDate;
     @Excel(name = "分数", needMerge = true)
-    private String score;
+    private Double score;
+    @Excel(name = "病案首页分数", needMerge = true)
+    private Double scoreBn;
     @ExcelCollection(name = "")
     private List<ExportExcelCaseDTO> exportExcelCaseDTOS;
 

+ 1 - 1
src/main/java/com/diagbot/dto/ExportExcelDTO.java

@@ -18,7 +18,7 @@ public class ExportExcelDTO {
     @Excel(name = "科室", needMerge = true)
     private String behDeptName;
     @Excel(name = "平均分数", needMerge = true)
-    private String avgScore;
+    private Double avgScore;
     @ExcelCollection(name = "")
     private List<ExportExcelBehospitalDTO> excelBehospitalDTOS;
 

+ 13 - 11
src/main/java/com/diagbot/dto/HomePageNumDTO.java

@@ -34,10 +34,15 @@ public class HomePageNumDTO {
      */
     @Excel(name = "缺陷总数", orderNum = "2")
     private Integer entryNum = 0;
+    /**
+     * 病案首页不合格病历数
+     */
+    @Excel(name = "不合格数", orderNum = "3")
+    private Integer secondLevelNum = 0;
     /**
      * 质控病历数
      */
-    @Excel(name = "质控病历数", orderNum = "9")
+    @Excel(name = "质控病历数", orderNum = "11")
     private Integer mrNum = 0;
     /**
      * 质控评分(总分)
@@ -46,16 +51,13 @@ public class HomePageNumDTO {
     /**
      * 质控评分(平均分)
      */
-    @Excel(name = "质控平均分", orderNum = "8")
+    @Excel(name = "质控平均分", orderNum = "10")
     private Double averageValue = 0d;
     /**
      * 病案首页合格病历数
      */
+    @Excel(name = "合格数", orderNum = "4")
     private Integer firstLevelNum = 0;
-    /**
-     * 病案首页不合格病历数
-     */
-    private Integer secondLevelNum = 0;
     /**
      * 病案首页合格病历占比
      */
@@ -67,7 +69,7 @@ public class HomePageNumDTO {
     /**
      * 病案首页合格病历占比(百分比)
      */
-    @Excel(name = "合格率", orderNum = "3")
+    @Excel(name = "合格率", orderNum = "5")
     private String firstLevelPercentStr = "0.00%";
     /**
      * 病案首页不合格病历占比(百分比)
@@ -84,12 +86,12 @@ public class HomePageNumDTO {
     /**
      * 空项数
      */
-    @Excel(name = "空项数", orderNum = "4")
+    @Excel(name = "空项数", orderNum = "6")
     private Integer emptyNum = 0;
     /**
      * 错误数
      */
-    @Excel(name = "错误数", orderNum = "6")
+    @Excel(name = "错误数", orderNum = "8")
     private Integer errorNum = 0;
     /**
      * 完整率、完善率分母(质控病历数*病案首页条目数)
@@ -106,11 +108,11 @@ public class HomePageNumDTO {
     /**
      * 完整率(百分比)
      */
-    @Excel(name = "完整率", orderNum = "5")
+    @Excel(name = "完整率", orderNum = "7")
     private String emptyPercentStr = "0.00%";
     /**
      * 完善率(百分比)
      */
-    @Excel(name = "完善率", orderNum = "7")
+    @Excel(name = "完善率", orderNum = "9")
     private String errorPercentStr = "0.00%";
 }

+ 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%";
+
 }

+ 3 - 1
src/main/java/com/diagbot/dto/QcResultShortDTO.java

@@ -30,6 +30,8 @@ public class QcResultShortDTO {
      */
     @Excel(name = "病历得分", width = 30, orderNum = "2")
     private Double scoreRes;
+    @Excel(name = "病案首页得分", width = 30, orderNum = "2.5")
+    private Double scoreBn;
     @Excel(name = "病人住院序号", width = 40, orderNum = "3")
     private String behospitalCode;
     @Excel(name = "病案号", width = 30, orderNum = "5")
@@ -119,4 +121,4 @@ public class QcResultShortDTO {
      */
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date mrTime;
-}
+}

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

@@ -108,6 +108,11 @@ public class HomeOperationInfo implements Serializable {
      */
     private Date gmtModified;
 
+    /**
+     * 麻醉医师
+     */
+    private String anaesthesiaDoctor;
+
     /**
      * 创建人,0表示无创建人值
      */

+ 41 - 3
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);
     }
@@ -321,6 +321,44 @@ public class ConsoleExportFacade {
         ExcelUtils.exportExcelUser(records, null, "sheet1", ExportExcelDTO.class, fileName, response);
     }
 
+    /**
+     * 病案首页不合格/合格数
+     *
+     * @param qcResultShortPageVO
+     * @return
+     */
+    public void badLevelPagePageExport(HttpServletResponse response, QcResultShortPageVO qcResultShortPageVO) {
+        String hospitalId = SysUserUtils.getCurrentHospitalID();
+        qcResultShortPageVO.setHospitalId(hospitalId);
+        if (StringUtil.isNotBlank(qcResultShortPageVO.getBehDeptName())
+                && qcResultShortPageVO.getBehDeptName().equals("全部")) {
+            qcResultShortPageVO.setBehDeptName("");
+        }
+        Date startDate = qcResultShortPageVO.getStartDate();
+        Date endDate = qcResultShortPageVO.getEndDate();
+        //时间间隔7天
+        long interval = 90l * 24l * 60l * 60l * 1000l;
+        if (endDate.getTime() < startDate.getTime()) {
+            throw new CommonException(CommonErrorCode.PARAM_ERROR, "截止时间不能小于起始时间");
+        }
+        if (endDate.getTime() - startDate.getTime() > interval) {
+            throw new CommonException(CommonErrorCode.PARAM_ERROR, "统计区间不能大于90天");
+        }
+
+        qcResultShortPageVO.setCurrent(1L);
+        qcResultShortPageVO.setSize(Long.MAX_VALUE);
+        qcResultShortPageVO.setSearchCount(false);
+        List<ExportExcelDTO> records = behospitalInfoFacade.badLevelPagePageExport(qcResultShortPageVO);
+        String fileName = null;
+        if("不合格数".equals(qcResultShortPageVO.getTitleName())){
+             fileName = "病案首页不合格数病历详情页.xls";
+        }else{
+             fileName = "病案首页合格数病历详情页.xls";
+        }
+
+        ExcelUtils.exportExcelUser(records, null, "sheet1", ExportExcelDTO.class, fileName, response);
+    }
+
     /**
      * 未整改病历统计导出
      *

+ 778 - 4
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,254 @@ 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);
+        if( StringUtil.isBlank(filterOrderVO.getName())){
+            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 +839,393 @@ public class ConsoleFacade {
      * @return
      */
     public List<LevelStatisticsTZDTO> levelStatisticsByDeptClass_TZ(FilterOrderVO filterOrderVO) {
-        filterFacade.filterOrderVOSet(filterOrderVO);
+        filterFacade.filterOrderVOSame(filterOrderVO);
         List<LevelStatisticsTZDTO> records = behospitalInfoFacade.levelStatisticsByDeptClass_TZ(filterOrderVO);
+            if( StringUtil.isBlank(filterOrderVO.getName())){
+                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.setDeptClassId("01");
+            item.setDeptClass("内科");
+            item.setDeptName("全部科室");
+        }else if("外科".equals(filterOrderVO.getDeptClass())){
+            item.setDeptClassId("1030000");
+            item.setDeptClass("外科");
+            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;
+    }
+
     /**
      * 病案首页合格率占比
      *
@@ -1174,6 +1937,17 @@ public class ConsoleFacade {
         return behospitalInfoFacade.unModifyMRPage(qcResultShortPageVO);
     }
 
+    /**
+     * 不合格/合格数病历号(内页)
+     *
+     * @param qcResultPageVO
+     * @return
+     */
+    public IPage<QcResultShortDTO> badLevelPage(QcResultPageVO qcResultPageVO) {
+        filterFacade.badLevelPageVOSet(qcResultPageVO);
+        return behospitalInfoFacade.badLevelPage(qcResultPageVO);
+    }
+
     /**
      * 31天再入院详情页
      *

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

@@ -5,8 +5,12 @@ import com.diagbot.util.DateUtil;
 import com.diagbot.util.StringUtil;
 import com.diagbot.util.SysUserUtils;
 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;
 
 /**
@@ -85,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;
+    }
+
     /**
      * 获取上一统计周期(上月/去年)的起始时间
      *
@@ -96,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);
+        }
+    }
+
     /**
      * 入参拼接
      *
@@ -192,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) {
@@ -245,6 +377,23 @@ public class FilterFacade {
         qcResultShortPageVO.setEndDate(new Date(Long.valueOf(interval)));*/
     }
 
+    /**
+     * 不合格数病历号入参拼接
+     *
+     * @param qcResultPageVO
+     */
+    public void badLevelPageVOSet(QcResultPageVO qcResultPageVO) {
+        String hospitalId = SysUserUtils.getCurrentHospitalID();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        qcResultPageVO.setHospitalId(hospitalId);
+        qcResultPageVO.setUserId(Long.valueOf(userId));
+        if (qcResultPageVO.getBehDeptName().equals("全院")|| StringUtils.isEmpty(qcResultPageVO.getBehDeptName())) {
+            qcResultPageVO.setBehDeptName("");
+        }
+        /*long interval = qcResultShortPageVO.getEndDate().getTime() + 1000;
+        qcResultShortPageVO.setEndDate(new Date(Long.valueOf(interval)));*/
+    }
+
     /**
      * 关键条目缺陷占比入参拼接
      *

+ 20 - 1
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();
 
     /**
@@ -351,6 +350,15 @@ public interface BehospitalInfoMapper extends BaseMapper<BehospitalInfo> {
      */
     public IPage<QcResultShortDTO> unModifyMRPage(@Param("qcResultShortPageVO") QcResultShortPageVO qcResultShortPageVO);
 
+    /**
+     * 不合格/合格数病历号(内页)
+     *
+     * @param qcResultPageVO
+     * @return
+     */
+    public IPage<QcResultShortDTO> badLevelPage(@Param("qcResultPageVO") QcResultPageVO qcResultPageVO);
+
+
     /**
      * 未整改病历缺陷评分详情页导出
      *
@@ -360,6 +368,17 @@ public interface BehospitalInfoMapper extends BaseMapper<BehospitalInfo> {
 
     public List<ExportExcelDTO> unModifyMRPageExport(@Param("qcResultShortPageVO") QcResultShortPageVO qcResultShortPageVO);
 
+
+    /**
+     * 病案首页不合格/合格数病历详情页导出
+     *
+     * @param qcResultShortPageVO
+     * @return
+     */
+
+    public List<ExportExcelDTO> badLevelPagePageExport(@Param("qcResultShortPageVO") QcResultShortPageVO qcResultShortPageVO);
+
+
     /**
      * 31天再入院详情页
      *

+ 15 - 0
src/main/java/com/diagbot/service/BehospitalInfoService.java

@@ -330,6 +330,13 @@ public interface BehospitalInfoService extends IService<BehospitalInfo> {
      */
     public IPage<QcResultShortDTO> unModifyMRPage(@Param("qcResultShortPageVO") QcResultShortPageVO qcResultShortPageVO);
 
+    /**
+     * 不合格数病历号(内页)
+     * @param qcResultPageVO
+     * @return
+     */
+    public IPage<QcResultShortDTO> badLevelPage(@Param("qcResultPageVO") QcResultPageVO qcResultPageVO);
+
     /**
      * 未整改病历缺陷评分详情页导出
      *
@@ -338,6 +345,14 @@ public interface BehospitalInfoService extends IService<BehospitalInfo> {
      */
     public List<ExportExcelDTO> unModifyMRPageExport(@Param("qcResultShortPageVO") QcResultShortPageVO qcResultShortPageVO);
 
+    /**
+     * 病案首页不合格/合格数病历详情页导出
+     *
+     * @param qcResultShortPageVO
+     * @return
+     */
+    public List<ExportExcelDTO> badLevelPagePageExport(@Param("qcResultShortPageVO") QcResultShortPageVO qcResultShortPageVO);
+
     /**
      * 31天再入院详情页
      *

+ 23 - 0
src/main/java/com/diagbot/service/impl/BehospitalInfoServiceImpl.java

@@ -251,6 +251,7 @@ public class BehospitalInfoServiceImpl extends ServiceImpl<BehospitalInfoMapper,
         return baseMapper.levelStatisticsByDeptClass_TZ(filterOrderVO);
     }
 
+
     @Override
     public List<ExportExcelDTO> exportExcel() {
         return baseMapper.exportExcel();
@@ -584,6 +585,17 @@ public class BehospitalInfoServiceImpl extends ServiceImpl<BehospitalInfoMapper,
         return baseMapper.unModifyMRPage(qcResultShortPageVO);
     }
 
+    /**
+     * 不合格/合格数病历号(内页)
+     *
+     * @param qcResultPageVO
+     * @return
+     */
+    @Override
+    public IPage<QcResultShortDTO> badLevelPage(@Param("qcResultPageVO") QcResultPageVO qcResultPageVO) {
+        return baseMapper.badLevelPage(qcResultPageVO);
+    }
+
     /**
      * 未整改病历缺陷评分详情页导出
      *
@@ -595,6 +607,17 @@ public class BehospitalInfoServiceImpl extends ServiceImpl<BehospitalInfoMapper,
         return baseMapper.unModifyMRPageExport((qcResultShortPageVO));
     }
 
+    /**
+     * 病案首页不合格/合格数病历详情页导出
+     *
+     * @param qcResultShortPageVO
+     * @return
+     */
+    @Override
+    public List<ExportExcelDTO> badLevelPagePageExport(@Param("qcResultShortPageVO") QcResultShortPageVO qcResultShortPageVO) {
+        return baseMapper.badLevelPagePageExport((qcResultShortPageVO));
+    }
+
     /**
      * 31天再入院详情页
      *

+ 17 - 0
src/main/java/com/diagbot/vo/Drug.java

@@ -0,0 +1,17 @@
+package com.diagbot.vo;
+
+import com.diagbot.biz.push.entity.Item;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/9/7 20:09
+ */
+@Getter
+@Setter
+public class Drug extends Item {
+    // 剂型
+    private String form;
+}

+ 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";
-}
+}

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

@@ -0,0 +1,138 @@
+package com.diagbot.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/6/16 17:00
+ */
+@Getter
+@Setter
+public class QcResultPageVO extends Page {
+    @ApiModelProperty(hidden = true)
+    private Long userId;
+    @ApiModelProperty(hidden = true)
+    private String hospitalId;
+    /**
+     * 病历号
+     */
+    private String behospitalCode;
+    /**
+     * 病人姓名
+     */
+    private String patName;
+
+    /**
+     * title名称
+     */
+    private String titleName;
+
+    /**
+     * 条目名称
+     */
+    private String casesEntryName;
+    /**
+     * 条目id
+     */
+    private Long casesEntryId;
+    /**
+     * 模块名称
+     */
+    private String casesName;
+    /**
+     * 模块id
+     */
+    private Long casesId;
+    /**
+     * 科室名称
+     */
+    private String behDeptName;
+    /**
+     * 医生姓名
+     */
+    private String doctorName;
+    /**
+     * 医生编号
+     */
+    private String doctorId;
+    /**
+     * 病历等级
+     */
+    private String level;
+    @NotNull(message = "请输入起始时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd  HH:mm:ss")
+    private String startDate;
+    @DateTimeFormat(pattern = "yyyy-MM-dd  HH:mm:ss")
+    @NotNull(message = "请输入截止时间")
+    private String endDate;
+
+    /**
+     * 单项否决
+     */
+    private Integer isReject;
+
+    /**
+     * 规则类型(0:无,1:空项,2:错误)
+     */
+    private Integer ruleType;
+
+    /**
+     * 离院人员类型(0/null:总人数,1:死亡人数,2:新生儿,3:手术病人数,4:非医嘱离院病人,5:31日再入院病人)
+     */
+    private Integer leaveHosType;
+
+    /**
+     * 核查状态(1:已核查,0:未核查)
+     */
+    private Integer checkStatus;
+    /**
+     * 首页核查状态(1:已核查,0:未核查)
+     */
+    private Integer mrStatus;
+    /**
+     * 病历核查人员
+     */
+    private String chName;
+    /**
+     * 首页核查人员
+     */
+    private String mrName;
+    /**
+     * 病历核查起始时间
+     */
+    private Date chTimeStart;
+    /**
+     * 病历核查截止时间
+     */
+    private Date chTimeEnd;
+    /**
+     * 首页核查起始时间
+     */
+    private Date mrTimeStart;
+    /**
+     * 首页核查截止时间
+     */
+    private Date mrTimeEnd;
+    /**
+     * 是否归档(0:未归档,1:已归档)
+     */
+    private String isPlacefile = "1";
+
+    /**
+     * 住院超过31日标志
+     */
+    private Integer beHosGT31Days;
+
+    /**
+     * 改善标志(1:病案首页改善病历,2:病案首页改善至合格病历,3:病案首页改善至满分病历)
+     */
+    private Integer improveType;
+}

+ 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;
-}
+}

+ 10 - 4
src/main/java/com/diagbot/vo/SearchData.java

@@ -3,6 +3,7 @@ package com.diagbot.vo;
 import com.diagbot.biz.push.entity.Item;
 import com.diagbot.biz.push.entity.Lis;
 import com.diagbot.biz.push.entity.Pacs;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -22,9 +23,14 @@ public class SearchData extends HospitalBaseVO {
      */
     private Integer length = 10;
     /**
-     * 年龄
+     * 年龄文本数据
      */
-    private Integer age;
+    private String age;
+    /**
+     * 年龄数字数据
+     */
+    @ApiModelProperty(hidden = true)
+    private Double ageNum;
     /**
      * 性别(1:男,2:女,3:通用)
      */
@@ -120,7 +126,7 @@ public class SearchData extends HospitalBaseVO {
     /**
      * 药品
      */
-    private List<Item> drug = new ArrayList<>();
+    private List<Drug> drug = new ArrayList<>();
     /**
      * 手术及操作
      */
@@ -144,7 +150,7 @@ public class SearchData extends HospitalBaseVO {
     /**
      * 当前药品开单项
      */
-    private List<Item> drugOrder = new ArrayList<>();
+    private List<Drug> drugOrder = new ArrayList<>();
     /**
      * 当前手术开单项
      */

+ 33 - 0
src/main/java/com/diagbot/web/ConsoleController.java

@@ -442,6 +442,39 @@ public class ConsoleController {
         return RespDTO.onSuc(consoleFacade.homePageLevelStatistics(filterOrderVO));
     }
 
+    /**
+     * 病案首页不合格数病历详情(内页)
+     * @param qcResultPageVO
+     * @return
+     */
+    @ApiOperation(value = "病案首页不合格/合格数病历详情(内页)[by:cy]",
+            notes = "behospitalCode: 病历号<br>" +
+                    "patName: 病人姓名 <br>" +
+                    "casesEntryName: 条目名称 <br>" +
+                    "titleName: 标题名称 <br>" +
+                    "casesEntryId: 条目id <br>" +
+                    "behDeptName:科室名称 <br>" +
+                    "doctorId:医生工号 <br>" +
+                    "doctorName:医生姓名 <br>" +
+                    "level: 病历等级 <br>" +
+                    "checkStatus: 核查状态(1:已核查,0:未核查) <br>" +
+                    "mrStatus: 首页核查状态(1:已核查,0:未核查) <br>" +
+                    "chName: 病历核查人员 <br>" +
+                    "mrName: 首页核查人员 <br>" +
+                    "chTimeStart: 病历核查起始时间 <br>" +
+                    "chTimeEnd: 病历核查截止时间 <br>" +
+                    "mrTimeStart: 首页核查起始时间 <br>" +
+                    "mrTimeEnd: 首页核查截止时间 <br>" +
+                    "startDate: 起始时间 <br>" +
+                    "endDate: 截止时间 <br>" +
+                    "isPlacefile: 是否归档(0:未归档,1:已归档) <br>")
+    @PostMapping("/badLevelPage")
+    @SysLogger("badLevelPage")
+    public RespDTO<IPage<QcResultShortDTO>> badLevelPage(@RequestBody @Valid QcResultPageVO qcResultPageVO) {
+        return RespDTO.onSuc(consoleFacade.badLevelPage(qcResultPageVO));
+    }
+
+
     /**
      * 病案首页合格率占比(首页)
      *

+ 30 - 0
src/main/java/com/diagbot/web/ConsoleExportController.java

@@ -335,6 +335,36 @@ public class ConsoleExportController {
         consoleExportFacade.unModifyMRPageExport(response, qcResultShortPageVO);
     }
 
+    /**
+     * 病案首页不合格/合格数病历详情页导出
+     *
+     * @param qcResultShortPageVO
+     * @return
+     */
+    @ApiOperation(value = "病案首页不合格/合格数病历详情页导出[by:cy]",
+            notes = "behospitalCode: 病历号<br>" +
+                    "patName: 病人姓名 <br>" +
+                    "behDeptName:科室名称 <br>" +
+                    "doctorId:医生工号 <br>" +
+                    "doctorName:医生姓名 <br>" +
+                    "level: 病历等级 <br>" +
+                    "checkStatus: 核查状态(1:已核查,0:未核查) <br>" +
+                    "mrStatus: 首页核查状态(1:已核查,0:未核查) <br>" +
+                    "chName: 病历核查人员 <br>" +
+                    "mrName: 首页核查人员 <br>" +
+                    "chTimeStart: 病历核查起始时间 <br>" +
+                    "chTimeEnd: 病历核查截止时间 <br>" +
+                    "mrTimeStart: 首页核查起始时间 <br>" +
+                    "mrTimeEnd: 首页核查截止时间 <br>" +
+                    "startDate: 起始时间 <br>" +
+                    "endDate: 截止时间 <br>" +
+                    "isPlacefile: 是否归档(0:未归档,1:已归档) <br>")
+    @PostMapping("/badLevelPagePageExport")
+    @SysLogger("badLevelPagePageExport")
+    public void badLevelPagePageExport(HttpServletResponse response, @RequestBody @Valid QcResultShortPageVO qcResultShortPageVO) {
+        consoleExportFacade.badLevelPagePageExport(response, qcResultShortPageVO);
+    }
+
 
     /**
      * 稽查病历详情页导出

File diff suppressed because it is too large
+ 1515 - 268
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>
 
     <!-- 按科室统计质控病历数 -->