瀏覽代碼

Merge branch 'dev/20200513end_1.2.0' into test

gaodm 5 年之前
父節點
當前提交
9610053743
共有 80 個文件被更改,包括 5516 次插入351 次删除
  1. 0 2
      doc/003.20200513运行质控1.0.0/qc_init.sql
  2. 539 0
      doc/003.20200515第3期/qc_init.sql
  3. 31 31
      src/main/java/com/diagbot/aggregate/ResultStatisticsAggregate.java
  4. 29 0
      src/main/java/com/diagbot/config/CacheDeleteInit.java
  5. 1 0
      src/main/java/com/diagbot/config/ResourceServerConfigurer.java
  6. 1 0
      src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java
  7. 31 0
      src/main/java/com/diagbot/dto/LevelStatisticsDTO.java
  8. 50 0
      src/main/java/com/diagbot/dto/ModelHospitalAllDTO.java
  9. 95 0
      src/main/java/com/diagbot/dto/QcAbnormalDTO.java
  10. 2 1
      src/main/java/com/diagbot/dto/QcCasesDTO.java
  11. 25 0
      src/main/java/com/diagbot/dto/QcModeAllDTO.java
  12. 193 0
      src/main/java/com/diagbot/entity/MedQcresultCases.java
  13. 158 0
      src/main/java/com/diagbot/entity/ModelHospital.java
  14. 195 0
      src/main/java/com/diagbot/entity/QcAbnormal.java
  15. 50 0
      src/main/java/com/diagbot/enums/AbnormalStatusEnum.java
  16. 51 0
      src/main/java/com/diagbot/enums/AbnormalTypeEnum.java
  17. 91 1
      src/main/java/com/diagbot/facade/AlgorithmFacade.java
  18. 22 1
      src/main/java/com/diagbot/facade/BehospitalInfoFacade.java
  19. 395 109
      src/main/java/com/diagbot/facade/ConsoleByDeptFacade.java
  20. 283 5
      src/main/java/com/diagbot/facade/ConsoleFacade.java
  21. 13 0
      src/main/java/com/diagbot/facade/MedQcresultCasesFacade.java
  22. 131 0
      src/main/java/com/diagbot/facade/ModelHospitalFacade.java
  23. 76 0
      src/main/java/com/diagbot/facade/QcAbnormalFacade.java
  24. 16 0
      src/main/java/com/diagbot/facade/QcModeFacade.java
  25. 2 1
      src/main/java/com/diagbot/facade/QcModuleInfoFacade.java
  26. 35 0
      src/main/java/com/diagbot/facade/QcresultInfoFacade.java
  27. 1 1
      src/main/java/com/diagbot/facade/SysUserFacade.java
  28. 3 3
      src/main/java/com/diagbot/mapper/BasDeptInfoMapper.java
  29. 61 8
      src/main/java/com/diagbot/mapper/BehospitalInfoMapper.java
  30. 18 0
      src/main/java/com/diagbot/mapper/HomePageMapper.java
  31. 16 0
      src/main/java/com/diagbot/mapper/MedQcresultCasesMapper.java
  32. 22 0
      src/main/java/com/diagbot/mapper/ModelHospitalMapper.java
  33. 19 0
      src/main/java/com/diagbot/mapper/QcAbnormalMapper.java
  34. 56 8
      src/main/java/com/diagbot/mapper/QcresultInfoMapper.java
  35. 4 4
      src/main/java/com/diagbot/service/BasDeptInfoService.java
  36. 61 7
      src/main/java/com/diagbot/service/BehospitalInfoService.java
  37. 19 0
      src/main/java/com/diagbot/service/HomePageService.java
  38. 16 0
      src/main/java/com/diagbot/service/MedQcresultCasesService.java
  39. 22 0
      src/main/java/com/diagbot/service/ModelHospitalService.java
  40. 19 0
      src/main/java/com/diagbot/service/QcAbnormalService.java
  41. 56 8
      src/main/java/com/diagbot/service/QcresultInfoService.java
  42. 4 4
      src/main/java/com/diagbot/service/impl/BasDeptInfoServiceImpl.java
  43. 81 10
      src/main/java/com/diagbot/service/impl/BehospitalInfoServiceImpl.java
  44. 24 0
      src/main/java/com/diagbot/service/impl/HomePageServiceImpl.java
  45. 20 0
      src/main/java/com/diagbot/service/impl/MedQcresultCasesServiceImpl.java
  46. 29 0
      src/main/java/com/diagbot/service/impl/ModelHospitalServiceImpl.java
  47. 25 0
      src/main/java/com/diagbot/service/impl/QcAbnormalServiceImpl.java
  48. 79 11
      src/main/java/com/diagbot/service/impl/QcresultInfoServiceImpl.java
  49. 72 0
      src/main/java/com/diagbot/task/TASK_CX.java
  50. 11 0
      src/main/java/com/diagbot/vo/AlgorithmVO.java
  51. 0 17
      src/main/java/com/diagbot/vo/FilterByDeptVO.java
  52. 15 0
      src/main/java/com/diagbot/vo/FilterOrderByDeptVO.java
  53. 29 0
      src/main/java/com/diagbot/vo/FilterOrderVO.java
  54. 23 0
      src/main/java/com/diagbot/vo/FilterPageByDeptVO.java
  55. 45 0
      src/main/java/com/diagbot/vo/FilterPageVO.java
  56. 3 0
      src/main/java/com/diagbot/vo/FilterVO.java
  57. 0 18
      src/main/java/com/diagbot/vo/HPFilterByDeptVO.java
  58. 40 0
      src/main/java/com/diagbot/vo/MedQcresultCasesVO.java
  59. 23 0
      src/main/java/com/diagbot/vo/ModelHospitalAllVO.java
  60. 18 0
      src/main/java/com/diagbot/vo/ModelHospitalIdVO.java
  61. 29 0
      src/main/java/com/diagbot/vo/ModelHospitalUpdataVO.java
  62. 21 0
      src/main/java/com/diagbot/vo/QcAbnormalDelVO.java
  63. 32 0
      src/main/java/com/diagbot/vo/QcAbnormalSaveVO.java
  64. 49 0
      src/main/java/com/diagbot/vo/QcAbnormalVO.java
  65. 0 23
      src/main/java/com/diagbot/vo/QcresultFilterByDeptVO.java
  66. 17 0
      src/main/java/com/diagbot/vo/TaskVO.java
  67. 127 14
      src/main/java/com/diagbot/web/ConsoleByDeptController.java
  68. 169 4
      src/main/java/com/diagbot/web/ConsoleController.java
  69. 75 0
      src/main/java/com/diagbot/web/ModelHospitalController.java
  70. 69 0
      src/main/java/com/diagbot/web/QcAbnormalController.java
  71. 30 13
      src/main/java/com/diagbot/web/QcModeController.java
  72. 1 1
      src/main/java/com/diagbot/web/SysRoleController.java
  73. 1 1
      src/main/resources/mapper/BasDeptInfoMapper.xml
  74. 696 36
      src/main/resources/mapper/BehospitalInfoMapper.xml
  75. 75 0
      src/main/resources/mapper/HomePageMapper.xml
  76. 21 0
      src/main/resources/mapper/MedQcresultCasesMapper.xml
  77. 46 0
      src/main/resources/mapper/ModelHospitalMapper.xml
  78. 47 0
      src/main/resources/mapper/QcAbnormalMapper.xml
  79. 557 6
      src/main/resources/mapper/QcresultInfoMapper.xml
  80. 5 3
      src/main/resources/mapper/SysUserMapper.xml

+ 0 - 2
doc/003.20200513运行质控1.0.0/qc_init.sql

@@ -1,2 +0,0 @@
-use `qc`;
-alter table qc_model_hospital add column `is_deleted` char(3) DEFAULT 'N' COMMENT '是否删除,N:未删除,Y:删除';

文件差異過大導致無法顯示
+ 539 - 0
doc/003.20200515第3期/qc_init.sql


+ 31 - 31
src/main/java/com/diagbot/aggregate/ResultStatisticsAggregate.java

@@ -71,6 +71,7 @@ public class ResultStatisticsAggregate {
      */
     @DataProvider("entryCountGroupByCase")
     public List<NumDTO> entryCountGroupByCase(@InvokeParameter("filterVO") FilterVO filterVO) {
+        DecimalFormat df = new DecimalFormat("#0.00");
         Integer limitCount = filterVO.getLimitCount();
         QcresultFilterVO qcresultFilterVO = new QcresultFilterVO();
         BeanUtil.copyProperties(filterVO, qcresultFilterVO);
@@ -78,40 +79,39 @@ public class ResultStatisticsAggregate {
         List<NumDTO> qcEntryNumList = qcresultInfoFacade.entryCountGroupByCase(filterVO);
         List<NumDTO> standardEntryNumList = qcCasesFacade.entryGroupByCase();
         if (ListUtil.isEmpty(qcEntryNumList)) {
-            standardEntryNumList.forEach(entryNum -> {
-                Integer totleNum = entryNum.getNum() * mrNum;
+            return qcEntryNumList;
+        }
+        if (ListUtil.isEmpty(standardEntryNumList)
+                && ListUtil.isNotEmpty(qcEntryNumList)) {
+            qcEntryNumList.forEach(entryNum -> {
                 entryNum.setNum(0);
                 entryNum.setPercent(0d);
                 entryNum.setPercentStr("0%");
-                entryNum.setTotleNum(totleNum);
+                entryNum.setTotleNum(0);
+            });
+        }
+        if (ListUtil.isNotEmpty(qcEntryNumList)) {
+            Map<String, Integer> standardMap
+                    = EntityUtil.makeMapWithKeyValue(standardEntryNumList, "name", "num");
+            qcEntryNumList.forEach(item -> {
+                if (!standardMap.containsKey(item.getName())) {
+                    item.setTotleNum(0);
+                    item.setPercent(0d);
+                    item.setPercentStr("0%");
+                } else {
+                    Integer totleNum = standardMap.get(item.getName()) * mrNum;
+                    Double percent = BigDecimal.valueOf(item.getNum())
+                            .divide(BigDecimal.valueOf(totleNum), 4, RoundingMode.HALF_UP)
+                            .doubleValue();
+                    String percentStr
+                            = df.format(BigDecimal.valueOf(percent).multiply(BigDecimal.valueOf(100))) + "%";
+                    item.setTotleNum(totleNum);
+                    item.setPercent(percent);
+                    item.setPercentStr(percentStr);
+                }
             });
-        } else {
-            Map<Long, Integer> qcEntryNumMap
-                    = EntityUtil.makeMapWithKeyValue(qcEntryNumList, "id", "num");
-            if (ListUtil.isNotEmpty(standardEntryNumList)) {
-                standardEntryNumList.forEach(entryNum -> {
-                    Integer totleNum = entryNum.getNum() * mrNum;
-                    if (qcEntryNumMap.containsKey(entryNum.getId())) {
-                        entryNum.setNum(qcEntryNumMap.get(entryNum.getId()));
-                        Double percent = BigDecimal.valueOf(entryNum.getNum())
-                                .divide(BigDecimal.valueOf(totleNum), 4, RoundingMode.HALF_UP)
-                                .doubleValue();
-                        DecimalFormat df = new DecimalFormat("#0.00");
-                        String percentStr
-                                = df.format(BigDecimal.valueOf(percent).multiply(BigDecimal.valueOf(100))) + "%";
-                        entryNum.setTotleNum(totleNum);
-                        entryNum.setPercent(percent);
-                        entryNum.setPercentStr(percentStr);
-                    } else {
-                        entryNum.setNum(0);
-                        entryNum.setPercent(0d);
-                        entryNum.setPercentStr("0%");
-                        entryNum.setTotleNum(totleNum);
-                    }
-                });
-            }
             //降序排序
-            Collections.sort(standardEntryNumList, new Comparator<NumDTO>() {
+            Collections.sort(qcEntryNumList, new Comparator<NumDTO>() {
                 @Override
                 public int compare(NumDTO o1, NumDTO o2) {
                     return o2.getPercent().compareTo(o1.getPercent());
@@ -120,12 +120,12 @@ public class ResultStatisticsAggregate {
         }
 
         //取top10
-        standardEntryNumList = standardEntryNumList
+        qcEntryNumList = qcEntryNumList
                 .stream()
                 .limit(limitCount)
                 .collect(Collectors.toList());
 
-        return standardEntryNumList;
+        return qcEntryNumList;
     }
 
     /**

+ 29 - 0
src/main/java/com/diagbot/config/CacheDeleteInit.java

@@ -0,0 +1,29 @@
+package com.diagbot.config;
+
+import com.diagbot.facade.CacheFacade;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 项目启动后初始化缓存
+ * @author: gaodm
+ * @time: 2020/5/13 11:20
+ */
+@Component //把类交给spring容器管理
+@Order(100)  //使用order属性,设置该类在spring容器中的加载顺序
+@Slf4j
+public class CacheDeleteInit implements CommandLineRunner {
+
+    @Autowired
+    CacheFacade cacheFacade;
+
+    @Override
+    public void run(String... args) throws Exception {
+        // 服务启动清除redis缓存
+        cacheFacade.clear();
+        log.info("病历质控系统缓存启动初始化成功!");
+    }
+}

+ 1 - 0
src/main/java/com/diagbot/config/ResourceServerConfigurer.java

@@ -59,6 +59,7 @@ public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
                 .antMatchers("/bas/dept/getListUser").permitAll()
                 .antMatchers("/qc/behospitalInfo/page_dept").permitAll()
                 .antMatchers("/qc/behospitalInfo/page_person").permitAll()
+                .antMatchers("/consoleByDept/getDept").permitAll()
                 .antMatchers("/**").authenticated();
 //                .antMatchers("/**").permitAll();
     }

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

@@ -102,6 +102,7 @@ public class UrlAccessDecisionManager implements AccessDecisionManager {
                 || matchers("/bas/dept/getListUser", request)
                 || matchers("/qc/behospitalInfo/page_dept", request)
                 || matchers("/qc/behospitalInfo/page_person", request)
+                || matchers("/consoleByDept/getDept", request)
                 || matchers("/", request)) {
             return true;
         }

+ 31 - 0
src/main/java/com/diagbot/dto/LevelStatisticsDTO.java

@@ -0,0 +1,31 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/5/19 16:04
+ */
+@Getter
+@Setter
+public class LevelStatisticsDTO {
+    private String deptId;
+    private String deptName;
+    private String doctorId;
+    private String doctorName;
+    private Integer entryNum;
+    private Integer mrNum;
+    private Double totleValue;
+    private Double averageValue;
+    private Integer firstLevelNum;
+    private Integer secondLevelNum;
+    private Integer thirdLevelNum;
+    private Double firstLevelPercent;
+    private Double secondLevelPercent;
+    private Double thirdLevelPercent;
+    private String firstLevelPercentStr;
+    private String secondLevelPercentStr;
+    private String thirdLevelPercentStr;
+}

+ 50 - 0
src/main/java/com/diagbot/dto/ModelHospitalAllDTO.java

@@ -0,0 +1,50 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * @author wangfeng
+ * @Description:
+ * @date 2020-05-15 14:45
+ */
+@Setter
+@Getter
+public class ModelHospitalAllDTO {
+
+    private Long id;
+
+    private Long hospitalId;
+
+    private String hospitalModelName;
+
+    private Long standModelId;
+
+    private String standModelName;
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 95 - 0
src/main/java/com/diagbot/dto/QcAbnormalDTO.java

@@ -0,0 +1,95 @@
+package com.diagbot.dto;
+
+import com.diagbot.enums.AbnormalStatusEnum;
+import com.diagbot.enums.AbnormalTypeEnum;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/5/15 9:27
+ */
+@Getter
+@Setter
+public class QcAbnormalDTO {
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 医院ID
+     */
+    private Long hospitalId;
+
+    /**
+     * 病人住院ID
+     */
+    private String behospitalCode;
+
+    /**
+     * 异常类型(1:数据模块 2:质控类型 3:XML结构)
+     */
+    private Integer type;
+
+    /**
+     * 异常类型名称(1:数据模块 2:质控类型 3:XML结构)
+     */
+    private String typeName;
+
+    public String getTypeName() {
+        return AbnormalTypeEnum.getName(this.type);
+    }
+
+    /**
+     * 异常描述
+     */
+    private String description;
+
+    /**
+     * 状态(0:未处理,1:已处理)
+     */
+    private Integer status;
+
+    /**
+     * 状态名称(0:未处理,1:已处理)
+     */
+    private String statusName;
+
+    public String getStatusName() {
+        return AbnormalStatusEnum.getName(this.status);
+    }
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 2 - 1
src/main/java/com/diagbot/dto/QcCasesDTO.java

@@ -5,6 +5,7 @@ import lombok.Setter;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.Date;
 
 /**
  * @Description:
@@ -27,7 +28,7 @@ public class QcCasesDTO {
     /**
      * 记录修改时间,如果时间是1970年则表示纪录未修改
      */
-    private LocalDateTime gmtModified;
+    private Date gmtModified;
 
     /**
      * 模块名称

+ 25 - 0
src/main/java/com/diagbot/dto/QcModeAllDTO.java

@@ -0,0 +1,25 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author wangfeng
+ * @Description:
+ * @date 2020-05-18 9:29
+ */
+@Setter
+@Getter
+public class QcModeAllDTO {
+    private Long id;
+
+    /**
+     * 模块名称
+     */
+    private String name;
+
+    /**
+     * 上级模块
+     */
+    private Long parentId;
+}

+ 193 - 0
src/main/java/com/diagbot/entity/MedQcresultCases.java

@@ -0,0 +1,193 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 质控评分模块评分信息
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-05-19
+ */
+public class MedQcresultCases implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 医院ID
+     */
+    private Long hospitalId;
+
+    /**
+     * 病人住院ID
+     */
+    private String behospitalCode;
+
+    /**
+     * 数据模块ID(0:其他模块)
+     */
+    private Long casesId;
+
+    /**
+     * 最后得分
+     */
+    private BigDecimal scoreRes;
+
+    /**
+     * 等级
+     */
+    private String level;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getHospitalId() {
+        return hospitalId;
+    }
+
+    public void setHospitalId(Long hospitalId) {
+        this.hospitalId = hospitalId;
+    }
+
+    public String getBehospitalCode() {
+        return behospitalCode;
+    }
+
+    public void setBehospitalCode(String behospitalCode) {
+        this.behospitalCode = behospitalCode;
+    }
+
+    public Long getCasesId() {
+        return casesId;
+    }
+
+    public void setCasesId(Long casesId) {
+        this.casesId = casesId;
+    }
+
+    public BigDecimal getScoreRes() {
+        return scoreRes;
+    }
+
+    public void setScoreRes(BigDecimal scoreRes) {
+        this.scoreRes = scoreRes;
+    }
+
+    public String getLevel() {
+        return level;
+    }
+
+    public void setLevel(String level) {
+        this.level = level;
+    }
+
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public String toString() {
+        return "MedQcresultCases{" +
+                "id=" + id +
+                ", hospitalId=" + hospitalId +
+                ", behospitalCode=" + behospitalCode +
+                ", casesId=" + casesId +
+                ", scoreRes=" + scoreRes +
+                ", level=" + level +
+                ", isDeleted=" + isDeleted +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", creator=" + creator +
+                ", modifier=" + modifier +
+                ", remark=" + remark +
+                "}";
+    }
+}

+ 158 - 0
src/main/java/com/diagbot/entity/ModelHospital.java

@@ -0,0 +1,158 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author wangfeng
+ * @since 2020-05-15
+ */
+@TableName("qc_model_hospital")
+public class ModelHospital implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private Long hospitalId;
+
+    private String hospitalModelName;
+
+    private Long standModelId;
+
+    private String standModelName;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+    public Long getHospitalId() {
+        return hospitalId;
+    }
+
+    public void setHospitalId(Long hospitalId) {
+        this.hospitalId = hospitalId;
+    }
+    public String getHospitalModelName() {
+        return hospitalModelName;
+    }
+
+    public void setHospitalModelName(String hospitalModelName) {
+        this.hospitalModelName = hospitalModelName;
+    }
+    public Long getStandModelId() {
+        return standModelId;
+    }
+
+    public void setStandModelId(Long standModelId) {
+        this.standModelId = standModelId;
+    }
+    public String getStandModelName() {
+        return standModelName;
+    }
+
+    public void setStandModelName(String standModelName) {
+        this.standModelName = standModelName;
+    }
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public String toString() {
+        return "ModelHospital{" +
+            "id=" + id +
+            ", hospitalId=" + hospitalId +
+            ", hospitalModelName=" + hospitalModelName +
+            ", standModelId=" + standModelId +
+            ", standModelName=" + standModelName +
+            ", isDeleted=" + isDeleted +
+            ", gmtCreate=" + gmtCreate +
+            ", gmtModified=" + gmtModified +
+            ", creator=" + creator +
+            ", modifier=" + modifier +
+            ", remark=" + remark +
+        "}";
+    }
+}

+ 195 - 0
src/main/java/com/diagbot/entity/QcAbnormal.java

@@ -0,0 +1,195 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 异常数据监控信息
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-05-15
+ */
+public class QcAbnormal implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 医院ID
+     */
+    private Long hospitalId;
+
+    /**
+     * 病人住院ID
+     */
+    private String behospitalCode;
+
+    /**
+     * 异常类型(1:数据模块 2:质控类型 3:XML结构)
+     */
+    private Integer type;
+
+    /**
+     * 异常描述
+     */
+    private String description;
+
+    /**
+     * 状态(0:未处理,1:已处理)
+     */
+    private Integer status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    public Long getHospitalId() {
+        return hospitalId;
+    }
+
+    public void setHospitalId(Long hospitalId) {
+        this.hospitalId = hospitalId;
+    }
+
+    public String getBehospitalCode() {
+        return behospitalCode;
+    }
+
+    public void setBehospitalCode(String behospitalCode) {
+        this.behospitalCode = behospitalCode;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public String toString() {
+        return "QcAbnormal{" +
+                "id=" + id +
+                ", isDeleted=" + isDeleted +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", creator=" + creator +
+                ", modifier=" + modifier +
+                ", hospitalId=" + hospitalId +
+                ", behospitalCode=" + behospitalCode +
+                ", type=" + type +
+                ", description=" + description +
+                ", status=" + status +
+                ", remark=" + remark +
+                "}";
+    }
+}

+ 50 - 0
src/main/java/com/diagbot/enums/AbnormalStatusEnum.java

@@ -0,0 +1,50 @@
+package com.diagbot.enums;
+
+import com.diagbot.core.KeyedNamed;
+import lombok.Setter;
+
+/**
+ * @author wangfeng
+ * @Description: TODO
+ * @date 2018年11月21日 下午2:31:42
+ */
+public enum AbnormalStatusEnum implements KeyedNamed {
+    NOT_HANDLED(0, "未处理"),
+    HAS_HANDLED(1, "已处理");
+
+    @Setter
+    private int key;
+
+    @Setter
+    private String name;
+
+    AbnormalStatusEnum(int key, String name) {
+        this.key = key;
+        this.name = name;
+    }
+
+    public static AbnormalStatusEnum getEnum(int key) {
+        for (AbnormalStatusEnum item : AbnormalStatusEnum.values()) {
+            if (item.key == key) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    public static String getName(int key) {
+        AbnormalStatusEnum item = getEnum(key);
+        return item != null ? item.name : null;
+    }
+
+    @Override
+    public int getKey() {
+        return key;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+}
+

+ 51 - 0
src/main/java/com/diagbot/enums/AbnormalTypeEnum.java

@@ -0,0 +1,51 @@
+package com.diagbot.enums;
+
+import com.diagbot.core.KeyedNamed;
+import lombok.Setter;
+
+/**
+ * @author wangfeng
+ * @Description: TODO
+ * @date 2018年11月21日 下午2:31:42
+ */
+public enum AbnormalTypeEnum implements KeyedNamed {
+    DATA_MODEL(1, "数据模块"),
+    QC_TYPE(2, "质控类型"),
+    XML(3, "XML结构");
+
+    @Setter
+    private int key;
+
+    @Setter
+    private String name;
+
+    AbnormalTypeEnum(int key, String name) {
+        this.key = key;
+        this.name = name;
+    }
+
+    public static AbnormalTypeEnum getEnum(int key) {
+        for (AbnormalTypeEnum item : AbnormalTypeEnum.values()) {
+            if (item.key == key) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    public static String getName(int key) {
+        AbnormalTypeEnum item = getEnum(key);
+        return item != null ? item.name : null;
+    }
+
+    @Override
+    public int getKey() {
+        return key;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+}
+

+ 91 - 1
src/main/java/com/diagbot/facade/AlgorithmFacade.java

@@ -3,13 +3,17 @@ package com.diagbot.facade;
 import com.diagbot.dto.AlgorithmDTO;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
+import com.diagbot.util.BeanUtil;
 import com.diagbot.util.BigDecimalUtil;
 import com.diagbot.util.ListUtil;
 import com.diagbot.vo.AlgorithmVO;
+import com.diagbot.vo.MedQcresultCasesVO;
 import com.diagbot.vo.QcResultAlgVO;
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
@@ -50,11 +54,88 @@ public class AlgorithmFacade {
         }
         //处理数据
         dataDeal(algorithmVO);
+
+        BigDecimal res = BigDecimal.ZERO;
         //计算得分
-        BigDecimal res = cal(algorithmVO);
+        if (algorithmVO.getHospitalId().equals(1L)) {
+            //长兴医院的情况下
+            res = getScoreForCx(algorithmVO);
+        } else {
+            //非长兴医院的情况下
+            res = cal(algorithmVO);
+        }
+        return res;
+    }
+
+    /**
+     * 评结果分数(长兴)
+     *
+     * @param algorithmVO 操作条目的所有信息
+     * @return 评结果分数
+     */
+    private BigDecimal getScoreForCx(AlgorithmVO algorithmVO) {
+        List<QcResultAlgVO> qcResultAlgHomePage = new ArrayList<>();
+        List<QcResultAlgVO> qcResultAlgHomePageExt = new ArrayList<>();
+        for (QcResultAlgVO qcResultAlgVO : algorithmVO.getQcResultAlgVOList()) {
+            //首页的情况
+            if (qcResultAlgVO.getCasesId().equals(243L)) {
+                qcResultAlgHomePage.add(qcResultAlgVO);
+            } else {
+                //非首页
+                qcResultAlgHomePageExt.add(qcResultAlgVO);
+            }
+        }
+        List<MedQcresultCasesVO> medQcresultCasesVOList = new ArrayList<>();
+        //病案首页
+        AlgorithmVO homePage = new AlgorithmVO();
+        BeanUtil.copyProperties(algorithmVO, homePage);
+        homePage.setQcResultAlgVOList(qcResultAlgHomePage);
+        homePage.setIsHomePage(true);
+        BigDecimal homePageRes = cal(homePage);
+        String level = getHomePageLevel(homePageRes);
+        MedQcresultCasesVO medQcresultCasesVOHp = new MedQcresultCasesVO();
+        medQcresultCasesVOHp.setHospitalId(algorithmVO.getHospitalId());
+        medQcresultCasesVOHp.setBehospitalCode(algorithmVO.getBehospitalCode());
+        medQcresultCasesVOHp.setCasesId(243L);
+        medQcresultCasesVOHp.setScoreRes(homePageRes);
+        medQcresultCasesVOHp.setLevel(level);
+        medQcresultCasesVOList.add(medQcresultCasesVOHp);
+        //病案首页以外
+        AlgorithmVO homePageExt = new AlgorithmVO();
+        BeanUtil.copyProperties(algorithmVO, homePageExt);
+        homePageExt.setQcResultAlgVOList(qcResultAlgHomePageExt);
+        BigDecimal homePageExtRes = cal(homePageExt);
+        MedQcresultCasesVO medQcresultCasesVOHpExt = new MedQcresultCasesVO();
+        medQcresultCasesVOHpExt.setHospitalId(algorithmVO.getHospitalId());
+        medQcresultCasesVOHpExt.setBehospitalCode(algorithmVO.getBehospitalCode());
+        medQcresultCasesVOHpExt.setCasesId(0L);
+        medQcresultCasesVOHpExt.setScoreRes(homePageExtRes);
+        medQcresultCasesVOHpExt.setLevel("");
+        medQcresultCasesVOList.add(medQcresultCasesVOHpExt);
+        algorithmVO.setMedQcresultCasesVOList(medQcresultCasesVOList);
+        //计算分数
+        BigDecimal res = homePageRes
+                .add(homePageExtRes)
+                .multiply(new BigDecimal(100))
+                .divide(new BigDecimal(120), 1, RoundingMode.HALF_UP);
         return res;
     }
 
+    /**
+     * 根据分数评定等级(病案首页)
+     *
+     * @param score 评分分数
+     * @return 等级
+     */
+    private String getHomePageLevel(BigDecimal score) {
+        String level = "不合格";
+        //得分≥18分为甲级
+        if (BigDecimalUtil.ge(score, new BigDecimal(18))) {
+            level = "合格";
+        }
+        return level;
+    }
+
     /**
      * 根据分数评定等级
      *
@@ -160,6 +241,10 @@ public class AlgorithmFacade {
      */
     private BigDecimal cal(AlgorithmVO algorithmVO) {
         BigDecimal res = new BigDecimal(100);
+        if (algorithmVO.getHospitalId().equals(1L)
+                && algorithmVO.getIsHomePage().equals(true)) {
+            res = new BigDecimal(20);
+        }
         //模块总分
         Map<Long, BigDecimal> casesMap = new HashMap<>();
         //单票否决计分
@@ -228,6 +313,11 @@ public class AlgorithmFacade {
         System.out.println("60:" + algorithmFacade.getLevel(new BigDecimal(60)));
         System.out.println("0:" + algorithmFacade.getLevel(new BigDecimal(0)));
 
+
+        System.out.println("18:" + algorithmFacade.getHomePageLevel(new BigDecimal(20)));
+        System.out.println("18:" + algorithmFacade.getHomePageLevel(new BigDecimal(18)));
+        System.out.println("17.9:" + algorithmFacade.getHomePageLevel(new BigDecimal(17.9)));
+
         if (BigDecimalUtil.lt(new BigDecimal(-1), BigDecimal.ZERO)) {
             System.out.println(BigDecimal.ZERO);
         }

+ 22 - 1
src/main/java/com/diagbot/facade/BehospitalInfoFacade.java

@@ -49,6 +49,7 @@ import com.diagbot.vo.QcResultAlgQueryVO;
 import com.diagbot.vo.QcResultAlgVO;
 import com.diagbot.vo.QueryVo;
 import com.diagbot.vo.RecordContentVO;
+import com.diagbot.vo.TaskVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
@@ -389,6 +390,8 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
         AlgorithmVO algorithmVO = new AlgorithmVO();
         algorithmVO.setType(0);
         algorithmVO.setQcResultAlgVOList(qcResultAlgVOList);
+        algorithmVO.setHospitalId(hospitalId);
+        algorithmVO.setBehospitalCode(analyzeVO.getBehospitalCode());
         AlgorithmDTO algorithmDTO = algorithmFacade.getAlgorithmRes(algorithmVO);
         //保存
         Map<String, Object> pageMap = outputInfo.getPageData();
@@ -655,7 +658,8 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
      * 执行未评分的病历
      */
     public void execute() {
-        List<BehospitalInfo> behospitalInfoList = getNoGrade();
+        TaskVO taskVO = new TaskVO();
+        List<BehospitalInfo> behospitalInfoList = getNoGrade(taskVO);
         for (BehospitalInfo bean : behospitalInfoList) {
             AnalyzeVO analyzeVO = new AnalyzeVO();
             analyzeVO.setIsTask(true);
@@ -682,6 +686,23 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
     }
 
 
+    /**
+     * 对出院日期之前3天的未评分的病历进行评分
+     */
+    public void execute2() {
+        TaskVO taskVO = new TaskVO();
+        Date date = DateUtil.addDay(DateUtil.now(), -3);
+        taskVO.setLeaveDate(date);
+        List<BehospitalInfo> behospitalInfoList = getNoGrade(taskVO);
+        for (BehospitalInfo bean : behospitalInfoList) {
+            AnalyzeVO analyzeVO = new AnalyzeVO();
+            analyzeVO.setIsTask(true);
+            analyzeVO.setHospitalId(bean.getHospitalId());
+            analyzeVO.setBehospitalCode(bean.getBehospitalCode());
+            authServiceClient.analyze_rpc(analyzeVO);
+        }
+    }
+
     /**
      * 评分api
      *

+ 395 - 109
src/main/java/com/diagbot/facade/ConsoleByDeptFacade.java

@@ -1,15 +1,22 @@
 package com.diagbot.facade;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.dto.DeptBaseDTO;
 import com.diagbot.dto.DeptNumDTO;
+import com.diagbot.dto.LevelStatisticsDTO;
 import com.diagbot.dto.NumDTO;
+import com.diagbot.entity.BehospitalInfo;
 import com.diagbot.util.BeanUtil;
+import com.diagbot.util.DateUtil;
 import com.diagbot.util.EntityUtil;
 import com.diagbot.util.ListUtil;
+import com.diagbot.util.StringUtil;
 import com.diagbot.util.SysUserUtils;
-import com.diagbot.vo.FilterByDeptVO;
-import com.diagbot.vo.HPFilterByDeptVO;
-import com.diagbot.vo.QcresultFilterByDeptVO;
+import com.diagbot.vo.FilterOrderByDeptVO;
+import com.diagbot.vo.FilterPageByDeptVO;
+import com.diagbot.vo.FilterVO;
+import com.diagbot.vo.HomePageFilterVO;
+import com.diagbot.vo.QcresultFilterVO;
 import com.google.common.collect.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -17,9 +24,16 @@ import org.springframework.stereotype.Component;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.DecimalFormat;
-import java.util.*;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
+
 /**
  * @Description:主任医生相关首页
  * @Author:zhaops
@@ -41,39 +55,39 @@ public class ConsoleByDeptFacade {
     /**
      * 出院人数统计-按科室
      *
-     * @param filterByDeptVO
+     * @param filterVO
      * @return
      */
-    public Map<String, Object> leaveHosCountByDept(FilterByDeptVO filterByDeptVO) {
+    public Map<String, Object> leaveHosCountByDept(FilterVO filterVO) {
         Map<String, Object> retMap = new LinkedHashMap<>();
         String hospitalId = SysUserUtils.getCurrentHospitalID();
         String userId = SysUserUtils.getCurrentPrincipleID();
-        String startDate = filterFacade.getStartDateStr(filterByDeptVO.getType(), null);
-        String endDate = filterFacade.getEndDateStr(filterByDeptVO.getType(), null);
-        filterByDeptVO.setHospitalId(hospitalId);
-        filterByDeptVO.setUserId(Long.valueOf(userId));
-        filterByDeptVO.setStartDate(startDate);
-        filterByDeptVO.setEndDate(endDate);
-        HPFilterByDeptVO hpFilterByDeptVO = new HPFilterByDeptVO();
-        BeanUtil.copyProperties(filterByDeptVO, hpFilterByDeptVO);
+        String startDate = filterFacade.getStartDateStr(filterVO.getType(), null);
+        String endDate = filterFacade.getEndDateStr(filterVO.getType(), null);
+        filterVO.setHospitalId(hospitalId);
+        filterVO.setUserId(Long.valueOf(userId));
+        filterVO.setStartDate(startDate);
+        filterVO.setEndDate(endDate);
+        HomePageFilterVO homePageFilterVO = new HomePageFilterVO();
+        BeanUtil.copyProperties(filterVO, homePageFilterVO);
         //关联科室
-        Map<String, Object> deptMap = getDeptByUser(filterByDeptVO);
+        Map<String, Object> deptMap = getDeptByUser(filterVO);
         if (deptMap == null) {
             return retMap;
         }
         //出院总人数
-        List<NumDTO> totleNumList = behospitalInfoFacade.homePageCountByDept(hpFilterByDeptVO);
+        List<NumDTO> totleNumList = behospitalInfoFacade.homePageCountByDept(homePageFilterVO);
         Map<String, NumDTO> totleMap = ListUtil.isEmpty(totleNumList)
                 ? new HashMap<>()
                 : EntityUtil.makeEntityMap(totleNumList, "name");
         //死亡人数
-        hpFilterByDeptVO.setDeath(1);
-        List<NumDTO> deathNumList = behospitalInfoFacade.homePageCountByDept(hpFilterByDeptVO);
+        homePageFilterVO.setDeath(1);
+        List<NumDTO> deathNumList = behospitalInfoFacade.homePageCountByDept(homePageFilterVO);
         Map<String, NumDTO> deathMap = ListUtil.isEmpty(deathNumList)
                 ? new HashMap<>()
                 : EntityUtil.makeEntityMap(deathNumList, "name");
         //手术人数
-        List<NumDTO> operationNumList = behospitalInfoFacade.homePageCountForOperationByDept(filterByDeptVO);
+        List<NumDTO> operationNumList = behospitalInfoFacade.homePageCountForOperationByDept(filterVO);
         Map<String, NumDTO> operationMap = ListUtil.isEmpty(operationNumList)
                 ? new HashMap<>()
                 : EntityUtil.makeEntityMap(operationNumList, "name");
@@ -100,47 +114,47 @@ public class ConsoleByDeptFacade {
     /**
      * 病历数统计-按科室
      *
-     * @param filterByDeptVO
+     * @param filterVO
      * @return
      */
-    public Map<String, Object> mrCountByDept(FilterByDeptVO filterByDeptVO) {
+    public Map<String, Object> mrCountByDept(FilterVO filterVO) {
         DecimalFormat df = new DecimalFormat("#0.00");
         Map<String, Object> retMap = new LinkedHashMap<>();
         String hospitalId = SysUserUtils.getCurrentHospitalID();
         String userId = SysUserUtils.getCurrentPrincipleID();
-        String startDate = filterFacade.getStartDateStr(filterByDeptVO.getType(), null);
-        String endDate = filterFacade.getEndDateStr(filterByDeptVO.getType(), null);
-        filterByDeptVO.setHospitalId(hospitalId);
-        filterByDeptVO.setUserId(Long.valueOf(userId));
-        filterByDeptVO.setStartDate(startDate);
-        filterByDeptVO.setEndDate(endDate);
-        QcresultFilterByDeptVO qcresultFilterByDeptVO = new QcresultFilterByDeptVO();
-        BeanUtil.copyProperties(filterByDeptVO, qcresultFilterByDeptVO);
+        String startDate = filterFacade.getStartDateStr(filterVO.getType(), null);
+        String endDate = filterFacade.getEndDateStr(filterVO.getType(), null);
+        filterVO.setHospitalId(hospitalId);
+        filterVO.setUserId(Long.valueOf(userId));
+        filterVO.setStartDate(startDate);
+        filterVO.setEndDate(endDate);
+        QcresultFilterVO qcresultFilterVO = new QcresultFilterVO();
+        BeanUtil.copyProperties(filterVO, qcresultFilterVO);
         //关联科室
-        Map<String, Object> deptMap = getDeptByUser(filterByDeptVO);
+        Map<String, Object> deptMap = getDeptByUser(filterVO);
         if (deptMap == null) {
             return retMap;
         }
         //质控病历总数
-        List<NumDTO> totleNumList = qcresultInfoFacade.resultCountByDept(qcresultFilterByDeptVO);
+        List<NumDTO> totleNumList = qcresultInfoFacade.resultCountByDept(qcresultFilterVO);
         Map<String, NumDTO> totleMap = ListUtil.isEmpty(totleNumList)
                 ? new HashMap<>()
                 : EntityUtil.makeEntityMap(totleNumList, "name");
         //甲级病历
-        qcresultFilterByDeptVO.setLevel("甲");
-        List<NumDTO> firstNumList = qcresultInfoFacade.resultCountByDept(qcresultFilterByDeptVO);
+        qcresultFilterVO.setLevel("甲");
+        List<NumDTO> firstNumList = qcresultInfoFacade.resultCountByDept(qcresultFilterVO);
         Map<String, NumDTO> firstMap = ListUtil.isEmpty(firstNumList)
                 ? new HashMap<>()
                 : EntityUtil.makeEntityMap(firstNumList, "name");
         //乙级病历
-        qcresultFilterByDeptVO.setLevel("乙");
-        List<NumDTO> secondNumList = qcresultInfoFacade.resultCountByDept(qcresultFilterByDeptVO);
+        qcresultFilterVO.setLevel("乙");
+        List<NumDTO> secondNumList = qcresultInfoFacade.resultCountByDept(qcresultFilterVO);
         Map<String, NumDTO> secondMap = ListUtil.isEmpty(secondNumList)
                 ? new HashMap<>()
                 : EntityUtil.makeEntityMap(secondNumList, "name");
         //丙级病历
-        qcresultFilterByDeptVO.setLevel("丙");
-        List<NumDTO> thirdNumList = qcresultInfoFacade.resultCountByDept(qcresultFilterByDeptVO);
+        qcresultFilterVO.setLevel("丙");
+        List<NumDTO> thirdNumList = qcresultInfoFacade.resultCountByDept(qcresultFilterVO);
         Map<String, NumDTO> thirdMap = ListUtil.isEmpty(thirdNumList)
                 ? new HashMap<>()
                 : EntityUtil.makeEntityMap(thirdNumList, "name");
@@ -214,40 +228,43 @@ public class ConsoleByDeptFacade {
     /**
      * 各模块缺陷占比排名-按科室
      *
-     * @param filterByDeptVO
+     * @param filterVO
      * @return
      */
-    public Map<String, Object> entryCountGroupByCaseAndDept(FilterByDeptVO filterByDeptVO) {
+    public Map<String, Object> entryCountGroupByCaseAndDept(FilterVO filterVO) {
         DecimalFormat df = new DecimalFormat("#0.00");
         Map<String, Object> retMap = new LinkedHashMap<>();
         String hospitalId = SysUserUtils.getCurrentHospitalID();
         String userId = SysUserUtils.getCurrentPrincipleID();
-        String startDate = filterFacade.getStartDateStr(filterByDeptVO.getType(), null);
-        String endDate = filterFacade.getEndDateStr(filterByDeptVO.getType(), null);
-        filterByDeptVO.setHospitalId(hospitalId);
-        filterByDeptVO.setUserId(Long.valueOf(userId));
-        filterByDeptVO.setStartDate(startDate);
-        filterByDeptVO.setEndDate(endDate);
-        if (filterByDeptVO.getLimitCount() == null || filterByDeptVO.getLimitCount().equals(0)) {
-            filterByDeptVO.setLimitCount(10);
+        String startDate = filterFacade.getStartDateStr(filterVO.getType(), null);
+        String endDate = filterFacade.getEndDateStr(filterVO.getType(), null);
+        filterVO.setHospitalId(hospitalId);
+        filterVO.setUserId(Long.valueOf(userId));
+        filterVO.setStartDate(startDate);
+        filterVO.setEndDate(endDate);
+        if (filterVO.getLimitCount() == null || filterVO.getLimitCount().equals(0)) {
+            filterVO.setLimitCount(10);
         }
-        Integer limitCount = filterByDeptVO.getLimitCount();
-        QcresultFilterByDeptVO qcresultFilterByDeptVO = new QcresultFilterByDeptVO();
-        BeanUtil.copyProperties(filterByDeptVO, qcresultFilterByDeptVO);
+        Integer limitCount = filterVO.getLimitCount();
+        QcresultFilterVO qcresultFilterVO = new QcresultFilterVO();
+        BeanUtil.copyProperties(filterVO, qcresultFilterVO);
         //关联科室
-        Map<String, Object> deptMap = getDeptByUser(filterByDeptVO);
+        Map<String, Object> deptMap = getDeptByUser(filterVO);
         if (deptMap == null) {
             return retMap;
         }
-        List<NumDTO> mrNumList = qcresultInfoFacade.resultCountByDept(qcresultFilterByDeptVO);
+        List<NumDTO> mrNumList = qcresultInfoFacade.resultCountByDept(qcresultFilterVO);
         Map<String, NumDTO> mrMap = ListUtil.isEmpty(mrNumList)
                 ? new HashMap<>()
                 : EntityUtil.makeEntityMap(mrNumList, "name");
-        List<DeptNumDTO> qcEntryNumList = qcresultInfoFacade.entryCountGroupByCaseAndDept(filterByDeptVO);
+        List<DeptNumDTO> qcEntryNumList = qcresultInfoFacade.entryCountGroupByCaseAndDept(filterVO);
         Map<String, List<DeptNumDTO>> qcEntryMap = ListUtil.isEmpty(qcEntryNumList)
                 ? new HashMap<>()
                 : EntityUtil.makeEntityListMap(qcEntryNumList, "deptName");
         List<NumDTO> standardEntryNumList = qcCasesFacade.entryGroupByCase();
+        Map<String, NumDTO> standardMap = ListUtil.isEmpty(standardEntryNumList)
+                ? new HashMap<>()
+                : EntityUtil.makeEntityMap(standardEntryNumList, "name");
         for (String deptName : deptMap.keySet()) {
             //没有质控病历
             if (!mrMap.containsKey(deptName)) {
@@ -256,6 +273,11 @@ public class ConsoleByDeptFacade {
             }
             //病历数
             Integer mrNum = mrMap.get(deptName).getNum();
+            //缺陷模块条目未维护
+            if (ListUtil.isEmpty(standardEntryNumList)) {
+                retMap.put(deptName, Lists.newLinkedList());
+                continue;
+            }
             //没有缺陷
             if (!qcEntryMap.containsKey(deptName)) {
                 retMap.put(deptName, Lists.newLinkedList());
@@ -263,48 +285,38 @@ public class ConsoleByDeptFacade {
             }
             //模块缺陷
             List<DeptNumDTO> qcEntryNumByDeptList = qcEntryMap.get(deptName);
-            List<NumDTO> retList = Lists.newLinkedList();
-            retList = BeanUtil.listCopyTo(standardEntryNumList, NumDTO.class);
             if (ListUtil.isEmpty(qcEntryNumByDeptList)) {
-                for (NumDTO entryNum : retList) {
-                    Integer totleNum = entryNum.getNum() * mrNum;
-                    entryNum.setNum(0);
-                    entryNum.setPercent(0d);
-                    entryNum.setPercentStr("0%");
-                    entryNum.setTotleNum(totleNum);
+                retMap.put(deptName, Lists.newLinkedList());
+                continue;
+            }
+            List<NumDTO> retList = Lists.newLinkedList();
+            retList = BeanUtil.listCopyTo(qcEntryNumByDeptList, NumDTO.class);
+            retList.forEach(item -> {
+                if (!standardMap.containsKey(item.getName())) {
+                    item.setTotleNum(0);
+                    item.setPercent(0d);
+                    item.setPercentStr("0%");
+                } else {
+                    Integer totleNum = standardMap.get(item.getName()).getNum() * mrNum;
+                    Double percent = BigDecimal.valueOf(item.getNum())
+                            .divide(BigDecimal.valueOf(totleNum), 4, RoundingMode.HALF_UP)
+                            .doubleValue();
+                    String percentStr
+                            = df.format(BigDecimal.valueOf(percent).multiply(BigDecimal.valueOf(100))) + "%";
+                    item.setTotleNum(totleNum);
+                    item.setPercent(percent);
+                    item.setPercentStr(percentStr);
                 }
-            } else {
-                Map<Long, Integer> qcEntryNumMap
-                        = EntityUtil.makeMapWithKeyValue(qcEntryNumByDeptList, "id", "num");
-                if (ListUtil.isNotEmpty(standardEntryNumList)) {
-                    for (NumDTO entryNum : retList) {
-                        Integer totleNum = entryNum.getNum() * mrNum;
-                        if (qcEntryNumMap.containsKey(entryNum.getId())) {
-                            entryNum.setNum(qcEntryNumMap.get(entryNum.getId()));
-                            Double percent = BigDecimal.valueOf(entryNum.getNum())
-                                    .divide(BigDecimal.valueOf(totleNum), 4, RoundingMode.HALF_UP)
-                                    .doubleValue();
-                            String percentStr
-                                    = df.format(BigDecimal.valueOf(percent).multiply(BigDecimal.valueOf(100))) + "%";
-                            entryNum.setTotleNum(totleNum);
-                            entryNum.setPercent(percent);
-                            entryNum.setPercentStr(percentStr);
-                        } else {
-                            entryNum.setNum(0);
-                            entryNum.setPercent(0d);
-                            entryNum.setPercentStr("0%");
-                            entryNum.setTotleNum(totleNum);
-                        }
-                    }
+            });
+
+            //降序排序
+            Collections.sort(retList, new Comparator<NumDTO>() {
+                @Override
+                public int compare(NumDTO o1, NumDTO o2) {
+                    return o2.getPercent().compareTo(o1.getPercent());
                 }
-                //降序排序
-                Collections.sort(retList, new Comparator<NumDTO>() {
-                    @Override
-                    public int compare(NumDTO o1, NumDTO o2) {
-                        return o2.getPercent().compareTo(o1.getPercent());
-                    }
-                });
-            }
+            });
+
 
             //取top10
             retList = retList
@@ -321,30 +333,30 @@ public class ConsoleByDeptFacade {
     /**
      * 条目缺陷占比-按科室
      *
-     * @param filterByDeptVO
+     * @param filterVO
      * @return
      */
-    public Map<String, Object> entryCountGroupByEntryAndDept(FilterByDeptVO filterByDeptVO) {
+    public Map<String, Object> entryCountGroupByEntryAndDept(FilterVO filterVO) {
         DecimalFormat df = new DecimalFormat("#0.00");
         Map<String, Object> retMap = new LinkedHashMap<>();
         String hospitalId = SysUserUtils.getCurrentHospitalID();
         String userId = SysUserUtils.getCurrentPrincipleID();
-        String startDate = filterFacade.getStartDateStr(filterByDeptVO.getType(), null);
-        String endDate = filterFacade.getEndDateStr(filterByDeptVO.getType(), null);
-        filterByDeptVO.setHospitalId(hospitalId);
-        filterByDeptVO.setUserId(Long.valueOf(userId));
-        filterByDeptVO.setStartDate(startDate);
-        filterByDeptVO.setEndDate(endDate);
-        if (filterByDeptVO.getLimitCount() == null || filterByDeptVO.getLimitCount().equals(0)) {
-            filterByDeptVO.setLimitCount(10);
+        String startDate = filterFacade.getStartDateStr(filterVO.getType(), null);
+        String endDate = filterFacade.getEndDateStr(filterVO.getType(), null);
+        filterVO.setHospitalId(hospitalId);
+        filterVO.setUserId(Long.valueOf(userId));
+        filterVO.setStartDate(startDate);
+        filterVO.setEndDate(endDate);
+        if (filterVO.getLimitCount() == null || filterVO.getLimitCount().equals(0)) {
+            filterVO.setLimitCount(10);
         }
-        Integer limitCount = filterByDeptVO.getLimitCount();
+        Integer limitCount = filterVO.getLimitCount();
         //关联科室
-        Map<String, Object> deptMap = getDeptByUser(filterByDeptVO);
+        Map<String, Object> deptMap = getDeptByUser(filterVO);
         if (deptMap == null) {
             return retMap;
         }
-        List<DeptNumDTO> entryList = qcresultInfoFacade.entryCountGroupByEntryAndDept(filterByDeptVO);
+        List<DeptNumDTO> entryList = qcresultInfoFacade.entryCountGroupByEntryAndDept(filterVO);
         Map<String, List<DeptNumDTO>> numListMap = ListUtil.isEmpty(entryList)
                 ? new HashMap<>()
                 : EntityUtil.makeEntityListMap(entryList, "deptName");
@@ -420,15 +432,289 @@ public class ConsoleByDeptFacade {
     /**
      * 用户关联科室
      *
-     * @param filterByDeptVO
+     * @param filterVO
      * @return
      */
-    public Map<String, Object> getDeptByUser(FilterByDeptVO filterByDeptVO) {
-        List<DeptBaseDTO> deptList = basDeptInfoFacade.getDeptByUser(filterByDeptVO);
+    public Map<String, Object> getDeptByUser(FilterVO filterVO) {
+        List<DeptBaseDTO> deptList = basDeptInfoFacade.getDeptByUser(filterVO);
         if (ListUtil.isNotEmpty(deptList)) {
             return EntityUtil.makeMapWithKeyValue(deptList, "deptName", "deptId");
         } else {
             return null;
         }
     }
-}
+
+    /**
+     * 获取关联科室
+     *
+     * @param
+     * @return
+     */
+    public List<DeptBaseDTO> getDept() {
+        FilterVO filterVO = new FilterVO();
+        String hospitalId = SysUserUtils.getCurrentHospitalID();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        filterVO.setHospitalId(hospitalId);
+        filterVO.setUserId(Long.valueOf(userId));
+        List<DeptBaseDTO> deptList = basDeptInfoFacade.getDeptByUser(filterVO);
+        return deptList;
+    }
+
+
+    /**
+     * 过滤条件设置
+     *
+     * @param filterPageByDeptVO
+     */
+    private void filterPageByDeptVOSet(FilterPageByDeptVO filterPageByDeptVO) {
+        String hospitalId = SysUserUtils.getCurrentHospitalID();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        String startDate = "";
+        String endDate = "";
+        Date date = new Date();
+
+        //统计维度 1-本月,2-本年
+        //时间类型 1-本月/本年,2-上月/去年,3-去年本月/去年
+        if (filterPageByDeptVO.getType().equals(1)) {
+            if (filterPageByDeptVO.getDateType() == null) {
+                startDate = filterFacade.getStartDateStr(filterPageByDeptVO.getType(), null);
+                endDate = filterFacade.getEndDateStr(filterPageByDeptVO.getType(), null);
+            } else if (filterPageByDeptVO.getDateType().equals(2)) {
+                startDate = filterFacade.getLastStartDateStr(filterPageByDeptVO.getType());
+                endDate = filterFacade.getLastEndDateStr(filterPageByDeptVO.getType());
+            } else if (filterPageByDeptVO.getDateType().equals(3)) {
+                String year = DateUtil.getYear(date);
+                startDate = filterFacade.getStartDateStr(filterPageByDeptVO.getType(), Integer.valueOf(year) - 1);
+                endDate = filterFacade.getEndDateStr(filterPageByDeptVO.getType(), Integer.valueOf(year) - 1);
+            } else {
+                startDate = filterFacade.getStartDateStr(filterPageByDeptVO.getType(), null);
+                endDate = filterFacade.getEndDateStr(filterPageByDeptVO.getType(), null);
+            }
+        } else if (filterPageByDeptVO.getType().equals(2)) {
+            if (filterPageByDeptVO.getDateType() == null) {
+                startDate = filterFacade.getStartDateStr(filterPageByDeptVO.getType(), null);
+                endDate = filterFacade.getEndDateStr(filterPageByDeptVO.getType(), null);
+            } else if (filterPageByDeptVO.getDateType().equals(2) || filterPageByDeptVO.getDateType().equals(3)) {
+                startDate = filterFacade.getLastStartDateStr(filterPageByDeptVO.getType());
+                endDate = filterFacade.getLastEndDateStr(filterPageByDeptVO.getType());
+            } else {
+                startDate = filterFacade.getStartDateStr(filterPageByDeptVO.getType(), null);
+                endDate = filterFacade.getEndDateStr(filterPageByDeptVO.getType(), null);
+            }
+        }
+
+        filterPageByDeptVO.setStartDate(startDate);
+        filterPageByDeptVO.setEndDate(endDate);
+        filterPageByDeptVO.setHospitalId(hospitalId);
+        filterPageByDeptVO.setUserId(Long.valueOf(userId));
+    }
+
+    /**
+     * 各模块缺陷占比-科室(分页)
+     *
+     * @param filterPageByDeptVO
+     * @return
+     */
+    public IPage<DeptNumDTO> entryCountGroupByCaseAndDeptPage(FilterPageByDeptVO filterPageByDeptVO) {
+        if (StringUtil.isBlank(filterPageByDeptVO.getDeptName())) {
+            List<DeptBaseDTO> deptList = this.getDept();
+            //默认取第一个科室
+            if (ListUtil.isNotEmpty(deptList)) {
+                filterPageByDeptVO.setDeptName(deptList.get(0).getDeptName());
+            }
+        }
+        filterPageByDeptVOSet(filterPageByDeptVO);
+        IPage<DeptNumDTO> page = qcresultInfoFacade.entryCountGroupByCaseAndDeptPage(filterPageByDeptVO);
+        return page;
+    }
+
+    /**
+     * 条目缺陷占比-科室(分页)
+     *
+     * @param filterPageByDeptVO
+     * @return
+     */
+    public IPage<DeptNumDTO> entryCountGroupByEntryAndDeptPage(FilterPageByDeptVO filterPageByDeptVO) {
+        if (StringUtil.isBlank(filterPageByDeptVO.getDeptName())) {
+            List<DeptBaseDTO> deptList = this.getDept();
+            //默认取第一个科室
+            if (ListUtil.isNotEmpty(deptList)) {
+                filterPageByDeptVO.setDeptName(deptList.get(0).getDeptName());
+            }
+        }
+        DecimalFormat df = new DecimalFormat("#0.00");
+        filterPageByDeptVOSet(filterPageByDeptVO);
+        IPage<DeptNumDTO> page = qcresultInfoFacade.entryCountGroupByEntryAndDeptPage(filterPageByDeptVO);
+        List<DeptNumDTO> records = page.getRecords();
+        if (ListUtil.isNotEmpty(records)) {
+            records.forEach(item -> {
+                Double percent = BigDecimal.valueOf(item.getNum())
+                        .divide(BigDecimal.valueOf(item.getTotleNum()), 4, RoundingMode.HALF_UP)
+                        .doubleValue();
+                item.setPercent(percent);
+                String percentStr
+                        = df.format(BigDecimal.valueOf(percent).multiply(BigDecimal.valueOf(100))) + "%";
+                item.setPercentStr(percentStr);
+            });
+        }
+        page.setRecords(records);
+        return page;
+    }
+
+    /**
+     * 缺陷明细-科室(分页)
+     *
+     * @param filterPageByDeptVO
+     * @return
+     */
+    public IPage<DeptNumDTO> resultStatisticsByDeptAndDoctorPage(FilterPageByDeptVO filterPageByDeptVO) {
+        if (StringUtil.isBlank(filterPageByDeptVO.getDeptName())) {
+            List<DeptBaseDTO> deptList = this.getDept();
+            //默认取第一个科室
+            if (ListUtil.isNotEmpty(deptList)) {
+                filterPageByDeptVO.setDeptName(deptList.get(0).getDeptName());
+            }
+        }
+        filterPageByDeptVOSet(filterPageByDeptVO);
+        IPage<DeptNumDTO> page = behospitalInfoFacade.resultStatisticsByDeptAndDoctorPage(filterPageByDeptVO);
+        return page;
+    }
+
+
+    /**
+     * 各科室缺陷占比(组合)
+     *
+     * @param filterOrderByDeptVO
+     * @return
+     */
+    public List<LevelStatisticsDTO> levelStatisticsByDept(FilterOrderByDeptVO filterOrderByDeptVO) {
+        List<DeptBaseDTO> deptList = getDept();
+        if (ListUtil.isEmpty(deptList)) {
+            return null;
+        }
+        if (StringUtil.isBlank(filterOrderByDeptVO.getDeptName())) {
+            filterOrderByDeptVO.setDeptName(deptList.get(0).getDeptName());
+        }
+        String hosptialId = SysUserUtils.getCurrentHospitalID();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        String startDate = filterFacade.getStartDateStr(filterOrderByDeptVO.getType(), null);
+        String endDate = filterFacade.getEndDateStr(filterOrderByDeptVO.getType(), null);
+        filterOrderByDeptVO.setStartDate(startDate);
+        filterOrderByDeptVO.setEndDate(endDate);
+        filterOrderByDeptVO.setHospitalId(hosptialId);
+        filterOrderByDeptVO.setUserId(Long.valueOf(userId));
+        List<LevelStatisticsDTO> records = behospitalInfoFacade.levelStatisticsByDept(filterOrderByDeptVO);
+        return records;
+    }
+
+    /**
+     * 病案首页合格率占比
+     *
+     * @param filterOrderByDeptVO
+     * @return
+     */
+    public List<LevelStatisticsDTO> homePageLevelStatisticsByDept(FilterOrderByDeptVO filterOrderByDeptVO) {
+        List<DeptBaseDTO> deptList = getDept();
+        if (ListUtil.isEmpty(deptList)) {
+            return null;
+        }
+        if (StringUtil.isBlank(filterOrderByDeptVO.getDeptName())) {
+            filterOrderByDeptVO.setDeptName(deptList.get(0).getDeptName());
+        }
+        String hosptialId = SysUserUtils.getCurrentHospitalID();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        String startDate = filterFacade.getStartDateStr(filterOrderByDeptVO.getType(), null);
+        String endDate = filterFacade.getEndDateStr(filterOrderByDeptVO.getType(), null);
+        filterOrderByDeptVO.setStartDate(startDate);
+        filterOrderByDeptVO.setEndDate(endDate);
+        filterOrderByDeptVO.setHospitalId(hosptialId);
+        filterOrderByDeptVO.setUserId(Long.valueOf(userId));
+        List<LevelStatisticsDTO> records = behospitalInfoFacade.homePageLevelStatisticsByDept(filterOrderByDeptVO);
+        return records;
+    }
+
+    /**
+     * 病案首页合格率占比(首页)
+     *
+     * @param filterOrderByDeptVO
+     * @return
+     */
+    public List<LevelStatisticsDTO> homePageLevelByDeptLimit(FilterOrderByDeptVO filterOrderByDeptVO) {
+        DecimalFormat df = new DecimalFormat("#0.00");
+        List<DeptBaseDTO> deptList = getDept();
+        if (ListUtil.isEmpty(deptList)) {
+            return null;
+        }
+        if (StringUtil.isBlank(filterOrderByDeptVO.getDeptName())) {
+            filterOrderByDeptVO.setDeptName(deptList.get(0).getDeptName());
+        }
+        String hosptialId = SysUserUtils.getCurrentHospitalID();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        String startDate = filterFacade.getStartDateStr(filterOrderByDeptVO.getType(), null);
+        String endDate = filterFacade.getEndDateStr(filterOrderByDeptVO.getType(), null);
+        filterOrderByDeptVO.setStartDate(startDate);
+        filterOrderByDeptVO.setEndDate(endDate);
+        filterOrderByDeptVO.setHospitalId(hosptialId);
+        filterOrderByDeptVO.setUserId(Long.valueOf(userId));
+        if (filterOrderByDeptVO.getLimitCount() == null || filterOrderByDeptVO.getLimitCount().equals(0)) {
+            filterOrderByDeptVO.setLimitCount(10);
+        }
+        List<LevelStatisticsDTO> records = behospitalInfoFacade.homePageLevelStatisticsByDept(filterOrderByDeptVO);
+        //增加全科室
+        LevelStatisticsDTO item = new LevelStatisticsDTO();
+        Integer mrNum = records
+                .stream()
+                .map(LevelStatisticsDTO::getMrNum)
+                .reduce(0, Integer::sum);
+        if (mrNum == null || mrNum == 0) {
+            return Lists.newLinkedList();
+        }
+        Integer entryNum = records
+                .stream()
+                .map(LevelStatisticsDTO::getEntryNum)
+                .reduce(0, Integer::sum);
+        Double totleFee = records
+                .stream()
+                .map(i -> BigDecimal.valueOf(i.getTotleValue()))
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .doubleValue();
+        Double averageFee = BigDecimal.valueOf(totleFee)
+                .divide(BigDecimal.valueOf(mrNum), 2, RoundingMode.HALF_UP)
+                .doubleValue();
+        Integer firstLevelNum = records
+                .stream()
+                .map(LevelStatisticsDTO::getFirstLevelNum)
+                .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))) + "%";
+        Integer secondLevelNum = mrNum - firstLevelNum;
+        Double secondLevelPercent = BigDecimal.valueOf(1)
+                .subtract(BigDecimal.valueOf(firstLevelPercent))
+                .doubleValue();
+        String secondLevelPercentStr
+                = df.format(BigDecimal.valueOf(secondLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
+        item.setDoctorName(filterOrderByDeptVO.getDeptName());
+        item.setEntryNum(entryNum);
+        item.setMrNum(mrNum);
+        item.setTotleValue(totleFee);
+        item.setAverageValue(averageFee);
+        item.setFirstLevelNum(firstLevelNum);
+        item.setFirstLevelPercent(firstLevelPercent);
+        item.setFirstLevelPercentStr(firstLevelPercentStr);
+        item.setSecondLevelNum(secondLevelNum);
+        item.setSecondLevelPercent(secondLevelPercent);
+        item.setSecondLevelPercentStr(secondLevelPercentStr);
+
+        records.add(0, item);
+
+        records = records
+                .stream()
+                .limit(filterOrderByDeptVO.getLimitCount())
+                .collect(Collectors.toList());
+
+        return records;
+    }
+}

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

@@ -1,24 +1,37 @@
 package com.diagbot.facade;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.aggregate.AverageStatisticsAggregate;
 import com.diagbot.aggregate.MrStatisticsAggregate;
 import com.diagbot.aggregate.ResultStatisticsAggregate;
 import com.diagbot.dto.AverageStatisticsDTO;
+import com.diagbot.dto.LevelStatisticsDTO;
 import com.diagbot.dto.NumDTO;
 import com.diagbot.dto.QcResultPercentDTO;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
+import com.diagbot.util.BeanUtil;
+import com.diagbot.util.DateUtil;
 import com.diagbot.util.ListUtil;
 import com.diagbot.util.SysUserUtils;
+import com.diagbot.vo.FilterOrderVO;
+import com.diagbot.vo.FilterPageVO;
 import com.diagbot.vo.FilterVO;
+import com.google.common.collect.Lists;
 import io.github.lvyahui8.spring.aggregate.facade.DataBeanAggregateQueryFacade;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.logging.Filter;
+import java.util.stream.Collectors;
 
 /**
  * @Description:
@@ -38,8 +51,14 @@ public class ConsoleFacade {
     private MrStatisticsAggregate mrStatisticsAggregate;
     @Autowired
     private ResultStatisticsAggregate resultStatisticsAggregate;
+    @Autowired
+    private QcresultInfoFacade qcresultInfoFacade;
+    @Autowired
+    private HomePageFacade homePageFacade;
+    @Autowired
+    private BehospitalInfoFacade behospitalInfoFacade;
 
-    //-----------------------聚合接口开始-------------------------------
+    //region-----------------------聚合接口开始-------------------------------
 
     /**
      * 病历相关统计
@@ -125,9 +144,10 @@ public class ConsoleFacade {
         return retMap;
     }
 
-    //-----------------------聚合接口结束-------------------------------
+    //endregion-----------------------聚合接口结束-------------------------------
+
+    //region-----------------------单独接口开始-------------------------------
 
-    //-----------------------单独接口开始-------------------------------
     /**
      * 平均住院天数
      *
@@ -272,7 +292,7 @@ public class ConsoleFacade {
         return retMap;
     }
 
-    private void filterVOSet(FilterVO filterVO){
+    private void filterVOSet(FilterVO filterVO) {
         String hospitalId = SysUserUtils.getCurrentHospitalID();
         String startDate = filterFacade.getStartDateStr(filterVO.getType(), null);
         String endDate = filterFacade.getEndDateStr(filterVO.getType(), null);
@@ -283,5 +303,263 @@ public class ConsoleFacade {
             filterVO.setLimitCount(10);
         }
     }
-    //-----------------------单独接口结束-------------------------------
+    //endregion-----------------------单独接口结束-------------------------------
+
+    //region_______________________分页接口开始-------------------------------
+
+    /**
+     * 过滤条件设置
+     *
+     * @param filterPageVO
+     */
+    private void filterPageVOSet(FilterPageVO filterPageVO) {
+        String hospitalId = SysUserUtils.getCurrentHospitalID();
+        String startDate = "";
+        String endDate = "";
+        Date date = new Date();
+
+        //统计维度 1-本月,2-本年
+        //时间类型 1-本月/本年,2-上月/去年,3-去年本月/去年
+        if (filterPageVO.getType().equals(1)) {
+            if (filterPageVO.getDateType() == null) {
+                startDate = filterFacade.getStartDateStr(filterPageVO.getType(), null);
+                endDate = filterFacade.getEndDateStr(filterPageVO.getType(), null);
+            } else if (filterPageVO.getDateType().equals(2)) {
+                startDate = filterFacade.getLastStartDateStr(filterPageVO.getType());
+                endDate = filterFacade.getLastEndDateStr(filterPageVO.getType());
+            } else if (filterPageVO.getDateType().equals(3)) {
+                String year = DateUtil.getYear(date);
+                startDate = filterFacade.getStartDateStr(filterPageVO.getType(), Integer.valueOf(year) - 1);
+                endDate = filterFacade.getEndDateStr(filterPageVO.getType(), Integer.valueOf(year) - 1);
+            } else {
+                startDate = filterFacade.getStartDateStr(filterPageVO.getType(), null);
+                endDate = filterFacade.getEndDateStr(filterPageVO.getType(), null);
+            }
+        } else if (filterPageVO.getType().equals(2)) {
+            if (filterPageVO.getDateType() == null) {
+                startDate = filterFacade.getStartDateStr(filterPageVO.getType(), null);
+                endDate = filterFacade.getEndDateStr(filterPageVO.getType(), null);
+            } else if (filterPageVO.getDateType().equals(2) || filterPageVO.getDateType().equals(3)) {
+                startDate = filterFacade.getLastStartDateStr(filterPageVO.getType());
+                endDate = filterFacade.getLastEndDateStr(filterPageVO.getType());
+            } else {
+                startDate = filterFacade.getStartDateStr(filterPageVO.getType(), null);
+                endDate = filterFacade.getEndDateStr(filterPageVO.getType(), null);
+            }
+        }
+
+        filterPageVO.setStartDate(startDate);
+        filterPageVO.setEndDate(endDate);
+        filterPageVO.setHospitalId(hospitalId);
+    }
+
+    /**
+     * 各模块缺陷占比(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<NumDTO> entryCountGroupByCasePage(FilterPageVO filterPageVO) {
+        filterPageVOSet(filterPageVO);
+        IPage<NumDTO> page = qcresultInfoFacade.entryCountGroupByCasePage(filterPageVO);
+        return page;
+    }
+
+    /**
+     * 条目缺陷占比(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<NumDTO> entryCountGroupByEntryPage(FilterPageVO filterPageVO) {
+        DecimalFormat df = new DecimalFormat("#0.00");
+        filterPageVOSet(filterPageVO);
+        IPage<NumDTO> page = qcresultInfoFacade.entryCountGroupByEntryPage(filterPageVO);
+        List<NumDTO> records = page.getRecords();
+        if (ListUtil.isNotEmpty(records)) {
+            records.forEach(item -> {
+                Double percent = BigDecimal.valueOf(item.getNum())
+                        .divide(BigDecimal.valueOf(item.getTotleNum()), 4, RoundingMode.HALF_UP)
+                        .doubleValue();
+                item.setPercent(percent);
+                String percentStr
+                        = df.format(BigDecimal.valueOf(percent).multiply(BigDecimal.valueOf(100))) + "%";
+                item.setPercentStr(percentStr);
+            });
+        }
+        page.setRecords(records);
+        return page;
+    }
+
+    /**
+     * 按科室统计平均住院天数(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<AverageStatisticsDTO> getAverageDayNumPage(FilterPageVO filterPageVO) {
+        filterPageVOSet(filterPageVO);
+        IPage<AverageStatisticsDTO> page = homePageFacade.getAverageDayNumPage(filterPageVO);
+        return page;
+    }
+
+    /**
+     * 按科室统计平均住院费用(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<AverageStatisticsDTO> getAverageFeePage(FilterPageVO filterPageVO) {
+        filterPageVOSet(filterPageVO);
+        IPage<AverageStatisticsDTO> page = homePageFacade.getAverageFeePage(filterPageVO);
+        return page;
+    }
+
+    /**
+     * 各科室质控平均分(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<AverageStatisticsDTO> getAverageScoreByDeptPage(FilterPageVO filterPageVO) {
+        filterPageVOSet(filterPageVO);
+        IPage<AverageStatisticsDTO> page = qcresultInfoFacade.getAverageScoreByDeptPage(filterPageVO);
+        return page;
+    }
+
+    /**
+     * 各科室缺陷占比排行(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<NumDTO> resultStatisticsByDeptPage(FilterPageVO filterPageVO) {
+        filterPageVOSet(filterPageVO);
+        IPage<NumDTO> page = behospitalInfoFacade.resultStatisticsByDeptPage(filterPageVO);
+        return page;
+    }
+
+    /**
+     * 各科室甲级病历占比排行(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<QcResultPercentDTO> levelPercentGroupByDeptPage(FilterPageVO filterPageVO) {
+        filterPageVOSet(filterPageVO);
+        IPage<QcResultPercentDTO> page = qcresultInfoFacade.levelPercentGroupByDeptPage(filterPageVO);
+        return page;
+    }
+    //endregion-----------------------分页接口结束-------------------------------
+
+    /**
+     * 各科室缺陷占比(组合)
+     *
+     * @param filterOrderVO
+     * @return
+     */
+    public List<LevelStatisticsDTO> levelStatistics(FilterOrderVO filterOrderVO) {
+        String hosptialId = SysUserUtils.getCurrentHospitalID();
+        String startDate = filterFacade.getStartDateStr(filterOrderVO.getType(), null);
+        String endDate = filterFacade.getEndDateStr(filterOrderVO.getType(), null);
+        filterOrderVO.setStartDate(startDate);
+        filterOrderVO.setEndDate(endDate);
+        filterOrderVO.setHospitalId(hosptialId);
+        List<LevelStatisticsDTO> records = behospitalInfoFacade.levelStatistics(filterOrderVO);
+        return records;
+    }
+
+    /**
+     * 病案首页合格率占比
+     *
+     * @param filterOrderVO
+     * @return
+     */
+    public List<LevelStatisticsDTO> homePageLevelStatistics(FilterOrderVO filterOrderVO) {
+        String hosptialId = SysUserUtils.getCurrentHospitalID();
+        String startDate = filterFacade.getStartDateStr(filterOrderVO.getType(), null);
+        String endDate = filterFacade.getEndDateStr(filterOrderVO.getType(), null);
+        filterOrderVO.setStartDate(startDate);
+        filterOrderVO.setEndDate(endDate);
+        filterOrderVO.setHospitalId(hosptialId);
+        List<LevelStatisticsDTO> records = behospitalInfoFacade.homePageLevelStatistics(filterOrderVO);
+        return records;
+    }
+
+    /**
+     * 病案首页合格率占比
+     *
+     * @param filterOrderVO
+     * @return
+     */
+    public List<LevelStatisticsDTO> homePageLevelLimit(FilterOrderVO filterOrderVO) {
+        DecimalFormat df = new DecimalFormat("#0.00");
+        String hosptialId = SysUserUtils.getCurrentHospitalID();
+        String startDate = filterFacade.getStartDateStr(filterOrderVO.getType(), null);
+        String endDate = filterFacade.getEndDateStr(filterOrderVO.getType(), null);
+        filterOrderVO.setStartDate(startDate);
+        filterOrderVO.setEndDate(endDate);
+        filterOrderVO.setHospitalId(hosptialId);
+        if (filterOrderVO.getLimitCount() == null || filterOrderVO.getLimitCount().equals(0)) {
+            filterOrderVO.setLimitCount(10);
+        }
+        List<LevelStatisticsDTO> records = behospitalInfoFacade.homePageLevelStatistics(filterOrderVO);
+
+        //增加全院
+        LevelStatisticsDTO item = new LevelStatisticsDTO();
+        Integer mrNum = records
+                .stream()
+                .map(LevelStatisticsDTO::getMrNum)
+                .reduce(0, Integer::sum);
+        if (mrNum == null || mrNum == 0) {
+            return Lists.newLinkedList();
+        }
+        Integer entryNum = records
+                .stream()
+                .map(LevelStatisticsDTO::getEntryNum)
+                .reduce(0, Integer::sum);
+        Double totleFee = records
+                .stream()
+                .map(i -> BigDecimal.valueOf(i.getTotleValue()))
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .doubleValue();
+        Double averageFee = BigDecimal.valueOf(totleFee)
+                .divide(BigDecimal.valueOf(mrNum), 2, RoundingMode.HALF_UP)
+                .doubleValue();
+        Integer firstLevelNum = records
+                .stream()
+                .map(LevelStatisticsDTO::getFirstLevelNum)
+                .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))) + "%";
+        Integer secondLevelNum = mrNum - firstLevelNum;
+        Double secondLevelPercent = BigDecimal.valueOf(1)
+                .subtract(BigDecimal.valueOf(firstLevelPercent))
+                .doubleValue();
+        String secondLevelPercentStr
+                = df.format(BigDecimal.valueOf(secondLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
+        item.setDeptName("全院");
+        item.setEntryNum(entryNum);
+        item.setMrNum(mrNum);
+        item.setTotleValue(totleFee);
+        item.setAverageValue(averageFee);
+        item.setFirstLevelNum(firstLevelNum);
+        item.setFirstLevelPercent(firstLevelPercent);
+        item.setFirstLevelPercentStr(firstLevelPercentStr);
+        item.setSecondLevelNum(secondLevelNum);
+        item.setSecondLevelPercent(secondLevelPercent);
+        item.setSecondLevelPercentStr(secondLevelPercentStr);
+
+        records.add(0, item);
+
+        records = records
+                .stream()
+                .limit(filterOrderVO.getLimitCount())
+                .collect(Collectors.toList());
+
+        return records;
+    }
 }

+ 13 - 0
src/main/java/com/diagbot/facade/MedQcresultCasesFacade.java

@@ -0,0 +1,13 @@
+package com.diagbot.facade;
+
+import com.diagbot.service.impl.MedQcresultCasesServiceImpl;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/5/19 9:20
+ */
+@Component
+public class MedQcresultCasesFacade extends MedQcresultCasesServiceImpl {
+}

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

@@ -0,0 +1,131 @@
+package com.diagbot.facade;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.ModelHospitalAllDTO;
+import com.diagbot.entity.MedicalRecord;
+import com.diagbot.entity.ModelHospital;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
+import com.diagbot.service.ModelHospitalService;
+import com.diagbot.service.impl.ModelHospitalServiceImpl;
+import com.diagbot.util.BeanUtil;
+import com.diagbot.util.DateUtil;
+import com.diagbot.vo.ModelHospitalAllVO;
+import com.diagbot.vo.ModelHospitalUpdataVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author wangfeng
+ * @Description:
+ * @date 2020-05-15 14:42
+ */
+@Component
+public class ModelHospitalFacade extends ModelHospitalServiceImpl {
+
+    @Autowired
+    ModelHospitalService modelHospitalService;
+    @Autowired
+    MedicalRecordFacade medicalRecordFacade;
+
+    /**
+     *
+     * @param modelHospitalAllVO
+     * @return
+     */
+    public IPage<List<ModelHospitalAllDTO>> getModelHospitalAlls(ModelHospitalAllVO modelHospitalAllVO) {
+        IPage<List<ModelHospitalAllDTO>> data =  modelHospitalService.getModelHospitalAll(modelHospitalAllVO);
+        return data;
+    }
+
+    /**
+     *
+     * @param modeId
+     * @return
+     */
+    public ModelHospitalAllDTO getModelHospitalById(Long modeId) {
+        QueryWrapper<ModelHospital> queryModelHospital = new QueryWrapper<>();
+        queryModelHospital.eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("id",modeId);
+        ModelHospital modelHospital = modelHospitalService.getOne(queryModelHospital);
+        if(modelHospital == null){
+            throw new CommonException(CommonErrorCode.NOT_EXISTS, "该数据不存在!");
+        }
+        ModelHospitalAllDTO modelHospitalData =  new ModelHospitalAllDTO();
+        BeanUtil.copyProperties(modelHospital,modelHospitalData);
+        return  modelHospitalData;
+    }
+
+    public Boolean updataModelHospitals(ModelHospitalUpdataVO modelHospitalUpdataVO) {
+        QueryWrapper<ModelHospital> queryModelHospital = new QueryWrapper<>();
+        queryModelHospital.eq("is_deleted", IsDeleteEnum.N.getKey())
+                .ne("id",modelHospitalUpdataVO.getId()==null? -1:modelHospitalUpdataVO.getId())
+                .eq("hospital_model_name",modelHospitalUpdataVO.getHospitalModelName());
+        int sum = modelHospitalService.count(queryModelHospital);
+        if(sum != 0){
+            throw new CommonException(CommonErrorCode.NOT_EXISTS, "该名称已存在");
+        }
+        boolean res= false;
+        QueryWrapper<ModelHospital> modelHospitalQuery = new QueryWrapper<>();
+        modelHospitalQuery.eq("id",modelHospitalUpdataVO.getId())
+                .eq("is_deleted", IsDeleteEnum.N.getKey());
+        ModelHospital data = modelHospitalService.getOne(modelHospitalQuery);
+        Date date = DateUtil.now();
+        if(data!=null){
+            ModelHospital modelHospitals  = new ModelHospital();
+            BeanUtil.copyProperties(modelHospitalUpdataVO,modelHospitals);
+            modelHospitals.setGmtModified(date);
+            res = modelHospitalService.updateById(modelHospitals);
+            if(res) {
+                UpdateWrapper<MedicalRecord> medicalRecordData = new UpdateWrapper<>();
+                medicalRecordData.eq("rec_title", modelHospitalUpdataVO.getHospitalModelName())
+                        .eq("is_deleted", IsDeleteEnum.N.getKey())
+                        .eq("hospital_id", modelHospitalUpdataVO.getHospitalId())
+                        .set("mode_id", modelHospitals.getId())
+                        .set("gmt_create",date);
+                medicalRecordFacade.update(medicalRecordData);
+            }
+        }else {
+            ModelHospital modelHospitalDatas = new ModelHospital();
+            BeanUtil.copyProperties(modelHospitalUpdataVO,modelHospitalDatas);
+            modelHospitalDatas.setGmtCreate(date);
+            modelHospitalDatas.setGmtModified(date);
+            res= modelHospitalService.save(modelHospitalDatas);
+            if(res) {
+                UpdateWrapper<MedicalRecord> medicalRecordData = new UpdateWrapper<>();
+                medicalRecordData.eq("rec_title", modelHospitalUpdataVO.getHospitalModelName())
+                        .eq("is_deleted", IsDeleteEnum.N.getKey())
+                        .eq("hospital_id", modelHospitalUpdataVO.getHospitalId())
+                        .set("mode_id", modelHospitalDatas.getId())
+                        .set("gmt_create",date);
+                medicalRecordFacade.update(medicalRecordData);
+            }
+        }
+
+        return res;
+    }
+
+    public Boolean clearModelHospital(Long modeId) {
+        boolean res= false;
+        Date date = DateUtil.now();
+        UpdateWrapper<ModelHospital> modelHospitalData = new UpdateWrapper<>();
+        modelHospitalData.eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("id", modeId)
+                .set("is_deleted", IsDeleteEnum.Y.getKey())
+                .set("gmt_create",date);
+        res = modelHospitalService.update(modelHospitalData);
+        UpdateWrapper<MedicalRecord> medicalRecordData = new UpdateWrapper<>();
+        medicalRecordData.eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("mode_id", modeId)
+                .set("mode_id", 0)
+                .set("gmt_create",date);
+        medicalRecordFacade.update(medicalRecordData);
+        return  res ;
+    }
+}

+ 76 - 0
src/main/java/com/diagbot/facade/QcAbnormalFacade.java

@@ -0,0 +1,76 @@
+package com.diagbot.facade;
+
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.QcAbnormalDTO;
+import com.diagbot.entity.QcAbnormal;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.service.impl.QcAbnormalServiceImpl;
+import com.diagbot.util.DateUtil;
+import com.diagbot.util.SysUserUtils;
+import com.diagbot.vo.QcAbnormalDelVO;
+import com.diagbot.vo.QcAbnormalSaveVO;
+import com.diagbot.vo.QcAbnormalVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/5/15 9:26
+ */
+@Component
+public class QcAbnormalFacade extends QcAbnormalServiceImpl {
+
+    @Autowired
+    private FilterFacade filterFacade;
+    /**
+     * 查询异常数据监控信息
+     *
+     * @param qcAbnormalVO 异常数据监控信息查询参数
+     * @return 异常数据监控信息
+     */
+    public IPage<QcAbnormalDTO> getQcAnnormalFac(QcAbnormalVO qcAbnormalVO) {
+        String startDate = filterFacade.getStartDateStr(qcAbnormalVO.getStatisticsType(), null);
+        String endDate = filterFacade.getEndDateStr(qcAbnormalVO.getStatisticsType(), null);
+        qcAbnormalVO.setStartDate(startDate);
+        qcAbnormalVO.setEndDate(endDate);
+        qcAbnormalVO.setHospitalId(Long.valueOf(SysUserUtils.getCurrentHospitalID()));
+        return this.getQcAnnormal(qcAbnormalVO);
+    }
+
+    /**
+     * 更新异常数据监控信息
+     *
+     * @param qcAbnormalSaveVO 异常数据监控信息更新参数
+     * @return 是否成功
+     */
+    public Boolean saveQcAnnormal(QcAbnormalSaveVO qcAbnormalSaveVO) {
+        return this.update(new UpdateWrapper<QcAbnormal>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("hospital_id", SysUserUtils.getCurrentHospitalID())
+                .eq("id", qcAbnormalSaveVO.getId())
+                .set("status", qcAbnormalSaveVO.getStatus())
+                .set("remark", qcAbnormalSaveVO.getRemark())
+                .set("gmt_modified", DateUtil.now())
+                .set("modifier", SysUserUtils.getCurrentPrincipleID())
+        );
+    }
+
+    /**
+     * 删除异常数据监控信息
+     *
+     * @param qcAbnormalDelVO 异常数据监控信息更新参数
+     * @return 是否成功
+     */
+    public Boolean delQcAnnormal(QcAbnormalDelVO qcAbnormalDelVO) {
+        return this.update(new UpdateWrapper<QcAbnormal>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("hospital_id", SysUserUtils.getCurrentHospitalID())
+                .eq("id", qcAbnormalDelVO.getId())
+                .set("is_deleted", IsDeleteEnum.Y.getKey())
+                .set("gmt_modified", DateUtil.now())
+                .set("modifier", SysUserUtils.getCurrentPrincipleID())
+        );
+    }
+}

+ 16 - 0
src/main/java/com/diagbot/facade/QcModeFacade.java

@@ -1,15 +1,19 @@
 package com.diagbot.facade;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.diagbot.dto.QcModeAllDTO;
 import com.diagbot.dto.QcModeDTO;
 import com.diagbot.entity.QcMode;
 import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.service.QcModeService;
 import com.diagbot.service.impl.QcModeServiceImpl;
 import com.diagbot.util.BeanUtil;
 import com.diagbot.util.EntityUtil;
 import com.diagbot.util.ListUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -21,6 +25,9 @@ import java.util.Map;
 @Component
 public class QcModeFacade extends QcModeServiceImpl {
 
+    @Autowired
+    QcModeService qcModeService;
+
     public List<QcModeDTO> getMenu(Map<String, Object> pageData) {
         List<QcMode> qcModeList = this.list(new QueryWrapper<QcMode>()
                 .eq("is_deleted", IsDeleteEnum.N.getKey())
@@ -51,4 +58,13 @@ public class QcModeFacade extends QcModeServiceImpl {
         }
         return res;
     }
+
+
+    public List<QcModeAllDTO> getModeAll() {
+        List<QcMode> data = qcModeService.list();
+        List<QcModeAllDTO> dataNew = new ArrayList<QcModeAllDTO>();
+        dataNew = BeanUtil.listCopyTo(data, QcModeAllDTO.class);
+        return dataNew;
+
+    }
 }

+ 2 - 1
src/main/java/com/diagbot/facade/QcModuleInfoFacade.java

@@ -17,6 +17,7 @@ import com.diagbot.vo.GetModuleInfoOneVO;
 import com.diagbot.vo.GetModuleMapVO;
 import com.diagbot.vo.QuestionIdsVO;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Component;
 
 import java.util.HashMap;
@@ -81,7 +82,7 @@ public class QcModuleInfoFacade extends QcModuleInfoServiceImpl {
      * @param getModuleMapVO
      * @return
      */
-//    @Cacheable(value = "cache", key = "'qcmodule'")
+    @Cacheable(value = "cache", key = "'qcmodule:hospId_'+#getModuleMapVO.hospitalId")
     public Map<Long, GetModuleInfoOneDTO> getModuleMap(GetModuleMapVO getModuleMapVO) {
         Map<Long, GetModuleInfoOneDTO> res = new LinkedHashMap<>();
         List<QcModuleInfo> qcModuleInfoList = this.list(new QueryWrapper<QcModuleInfo>()

+ 35 - 0
src/main/java/com/diagbot/facade/QcresultInfoFacade.java

@@ -6,11 +6,13 @@ import com.diagbot.dto.AlgorithmDTO;
 import com.diagbot.dto.AnalyzeDTO;
 import com.diagbot.dto.QcResultDTO;
 import com.diagbot.entity.BehospitalInfo;
+import com.diagbot.entity.MedQcresultCases;
 import com.diagbot.entity.QcresultDetail;
 import com.diagbot.entity.QcresultInfo;
 import com.diagbot.enums.IsDeleteEnum;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
+import com.diagbot.service.impl.MedQcresultCasesServiceImpl;
 import com.diagbot.service.impl.QcresultDetailServiceImpl;
 import com.diagbot.service.impl.QcresultInfoServiceImpl;
 import com.diagbot.util.BeanUtil;
@@ -21,6 +23,7 @@ import com.diagbot.util.SysUserUtils;
 import com.diagbot.vo.AlgorithmVO;
 import com.diagbot.vo.AnalyzeVO;
 import com.diagbot.vo.GetDetailVO;
+import com.diagbot.vo.MedQcresultCasesVO;
 import com.diagbot.vo.QcResultAlgVO;
 import com.diagbot.vo.QcresultVO;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -45,6 +48,9 @@ public class QcresultInfoFacade extends QcresultInfoServiceImpl {
     private AlgorithmFacade algorithmFacade;
     @Autowired
     private BehospitalInfoFacade behospitalInfoFacade;
+    @Autowired
+    @Qualifier("medQcresultCasesServiceImpl")
+    private MedQcresultCasesServiceImpl medQcresultCasesService;
 
     /**
      * 修改评分结果信息
@@ -98,6 +104,8 @@ public class QcresultInfoFacade extends QcresultInfoServiceImpl {
         algorithmVO.setType(qcresultVO.getType());
         algorithmVO.setOptResultAlgVO(qcresultVO.getOptResultAlgVO());
         algorithmVO.setQcResultAlgVOList(qcResultAlgVOList);
+        algorithmVO.setHospitalId(hospitalId);
+        algorithmVO.setBehospitalCode(qcresultVO.getBehospitalCode());
         AlgorithmDTO algorithmDTO = algorithmFacade.getAlgorithmRes(algorithmVO);
         //更新质控评分结果信息
         AnalyzeVO analyzeVO = new AnalyzeVO();
@@ -202,6 +210,33 @@ public class QcresultInfoFacade extends QcresultInfoServiceImpl {
             }
             qcresultDetailServiceImpl.saveBatch(qcresultDetailList);
         }
+        //长兴的数据
+        if (algorithmVO.getHospitalId().equals(1L)) {
+            //质控模块评分数据
+            //逻辑删除数据
+            medQcresultCasesService.update(new UpdateWrapper<MedQcresultCases>()
+                    .eq("is_deleted", IsDeleteEnum.N.getKey())
+                    .eq("hospital_id", analyzeVO.getHospitalId())
+                    .eq("behospital_code", analyzeVO.getBehospitalCode())
+                    .set("is_deleted", IsDeleteEnum.Y.getKey())
+                    .set("modifier", useId)
+                    .set("gmt_modified", now));
+            //批量插入新的数据
+            List<MedQcresultCases> medQcresultCasesList = new ArrayList<>();
+            List<MedQcresultCasesVO> medQcresultCasesVOList = algorithmVO.getMedQcresultCasesVOList();
+            if (ListUtil.isNotEmpty(medQcresultCasesVOList)) {
+                for (MedQcresultCasesVO medQcresultCasesVO : medQcresultCasesVOList) {
+                    MedQcresultCases medQcresultCases = new MedQcresultCases();
+                    BeanUtil.copyProperties(medQcresultCasesVO, medQcresultCases);
+                    medQcresultCases.setGmtCreate(now);
+                    medQcresultCases.setCreator(useId.toString());
+                    medQcresultCases.setGmtModified(now);
+                    medQcresultCases.setModifier(useId.toString());
+                    medQcresultCasesList.add(medQcresultCases);
+                }
+                medQcresultCasesService.saveBatch(medQcresultCasesList);
+            }
+        }
         return now;
     }
 

+ 1 - 1
src/main/java/com/diagbot/facade/SysUserFacade.java

@@ -399,7 +399,7 @@ public class SysUserFacade extends SysUserServiceImpl {
         checkUser(sysUserBaseVO.getUserId());
         SysUserRoleDTO sysUserRoleDTO = new SysUserRoleDTO();
         sysUserRoleDTO.setUserId(sysUserBaseVO.getUserId());
-        List<SysRoleDTO> sysRoleDTOList = sysRoleFacade.listForUser();
+        List<SysRoleDTO> sysRoleDTOList = sysRoleFacade.listFac();
         List<SysUserRole> sysUserRoleList
                 = sysUserRoleService.list(new QueryWrapper<SysUserRole>()
                 .eq("is_deleted", IsDeleteEnum.N.getKey())

+ 3 - 3
src/main/java/com/diagbot/mapper/BasDeptInfoMapper.java

@@ -5,7 +5,7 @@ import com.diagbot.dto.BasDeptInfoDTO;
 import com.diagbot.dto.DeptBaseDTO;
 import com.diagbot.entity.BasDeptInfo;
 import com.diagbot.vo.BasDeptInfoVO;
-import com.diagbot.vo.FilterByDeptVO;
+import com.diagbot.vo.FilterVO;
 
 import java.util.List;
 
@@ -25,8 +25,8 @@ public interface BasDeptInfoMapper extends BaseMapper<BasDeptInfo> {
     /**
      * 查询用户关联科室
      *
-     * @param filterByDeptVO
+     * @param filterVO
      * @return
      */
-    List<DeptBaseDTO> getDeptByUser(FilterByDeptVO filterByDeptVO);
+    List<DeptBaseDTO> getDeptByUser(FilterVO filterVO);
 }

+ 61 - 8
src/main/java/com/diagbot/mapper/BehospitalInfoMapper.java

@@ -3,16 +3,22 @@ package com.diagbot.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.dto.BehospitalInfoDTO;
+import com.diagbot.dto.DeptNumDTO;
+import com.diagbot.dto.LevelStatisticsDTO;
 import com.diagbot.dto.MsgDTO;
 import com.diagbot.dto.NumDTO;
 import com.diagbot.entity.BehospitalInfo;
 import com.diagbot.vo.AnalyzeCodeVO;
 import com.diagbot.vo.AnalyzeVO;
 import com.diagbot.vo.BehospitalPageVO;
-import com.diagbot.vo.FilterByDeptVO;
+import com.diagbot.vo.FilterOrderByDeptVO;
+import com.diagbot.vo.FilterOrderVO;
+import com.diagbot.vo.FilterPageByDeptVO;
+import com.diagbot.vo.FilterPageVO;
 import com.diagbot.vo.FilterVO;
-import com.diagbot.vo.HPFilterByDeptVO;
 import com.diagbot.vo.HomePageFilterVO;
+import org.apache.ibatis.annotations.Param;
+import com.diagbot.vo.TaskVO;
 
 import java.util.List;
 
@@ -72,8 +78,7 @@ public interface BehospitalInfoMapper extends BaseMapper<BehospitalInfo> {
      */
     public int getTotleResultNum(FilterVO filterVO);
 
-
-    public List<BehospitalInfo> getNoGrade();
+    public List<BehospitalInfo> getNoGrade(TaskVO taskVO);
 
     IPage<BehospitalInfoDTO> getPageByDept(BehospitalPageVO behospitalPageVO);
 
@@ -98,16 +103,64 @@ public interface BehospitalInfoMapper extends BaseMapper<BehospitalInfo> {
     /**
      * 按科室统计病案首页病历数
      *
-     * @param hpFilterByDeptVO
+     * @param homePageFilterVO
      * @return
      */
-    public List<NumDTO> homePageCountByDept(HPFilterByDeptVO hpFilterByDeptVO);
+    public List<NumDTO> homePageCountByDept(HomePageFilterVO homePageFilterVO);
 
     /**
      * 按科室统计病案首页手术病历数
      *
-     * @param filterByDeptVO
+     * @param filterVO
+     * @return
+     */
+    public List<NumDTO> homePageCountForOperationByDept(FilterVO filterVO);
+
+    /**
+     * 各科室缺陷占比排行(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<NumDTO> resultStatisticsByDeptPage(@Param("filterPageVO") FilterPageVO filterPageVO);
+
+    /**
+     * 各科室缺陷占比(组合)
+     *
+     * @param filterOrderVO
+     * @return
+     */
+    public List<LevelStatisticsDTO> levelStatistics(FilterOrderVO filterOrderVO);
+
+    /**
+     * 病案首页合格率占比
+     *
+     * @param filterOrderVO
+     * @return
+     */
+    public List<LevelStatisticsDTO> homePageLevelStatistics(FilterOrderVO filterOrderVO);
+
+    /**
+     * 各科室缺陷占比(主任医生)
+     *
+     * @param filterOrderByDeptVO
+     * @return
+     */
+    public List<LevelStatisticsDTO> levelStatisticsByDept(FilterOrderByDeptVO filterOrderByDeptVO);
+
+    /**
+     * 病案首页合格率占比(主任医生)
+     *
+     * @param filterOrderByDeptVO
+     * @return
+     */
+    public List<LevelStatisticsDTO> homePageLevelStatisticsByDept(FilterOrderByDeptVO filterOrderByDeptVO);
+
+    /**
+     * 科室缺陷占比-科室(分页)
+     *
+     * @param filterPageByDeptVO
      * @return
      */
-    public List<NumDTO> homePageCountForOperationByDept(FilterByDeptVO filterByDeptVO);
+    public IPage<DeptNumDTO> resultStatisticsByDeptAndDoctorPage(@Param("filterPageByDeptVO") FilterPageByDeptVO filterPageByDeptVO);
 }

+ 18 - 0
src/main/java/com/diagbot/mapper/HomePageMapper.java

@@ -1,9 +1,12 @@
 package com.diagbot.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.dto.AverageStatisticsDTO;
 import com.diagbot.entity.HomePage;
+import com.diagbot.vo.FilterPageVO;
 import com.diagbot.vo.FilterVO;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -33,4 +36,19 @@ public interface HomePageMapper extends BaseMapper<HomePage> {
      */
     public List<AverageStatisticsDTO> getAverageFee(FilterVO filterVO);
 
+    /**
+     * 按科室统计平均住院天数(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<AverageStatisticsDTO> getAverageDayNumPage(@Param("filterPageVO") FilterPageVO filterPageVO);
+
+    /**
+     * 按科室统计平均费用(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<AverageStatisticsDTO> getAverageFeePage(@Param("filterPageVO") FilterPageVO filterPageVO);
 }

+ 16 - 0
src/main/java/com/diagbot/mapper/MedQcresultCasesMapper.java

@@ -0,0 +1,16 @@
+package com.diagbot.mapper;
+
+import com.diagbot.entity.MedQcresultCases;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 质控评分模块评分信息 Mapper 接口
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-05-19
+ */
+public interface MedQcresultCasesMapper extends BaseMapper<MedQcresultCases> {
+
+}

+ 22 - 0
src/main/java/com/diagbot/mapper/ModelHospitalMapper.java

@@ -0,0 +1,22 @@
+package com.diagbot.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.ModelHospitalAllDTO;
+import com.diagbot.entity.ModelHospital;
+import com.diagbot.vo.ModelHospitalAllVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author wangfeng
+ * @since 2020-05-15
+ */
+public interface ModelHospitalMapper extends BaseMapper<ModelHospital> {
+
+    IPage<List<ModelHospitalAllDTO>> getModelHospitalAll(ModelHospitalAllVO modelHospitalAllVO);
+}

+ 19 - 0
src/main/java/com/diagbot/mapper/QcAbnormalMapper.java

@@ -0,0 +1,19 @@
+package com.diagbot.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.QcAbnormalDTO;
+import com.diagbot.entity.QcAbnormal;
+import com.diagbot.vo.QcAbnormalVO;
+
+/**
+ * <p>
+ * 异常数据监控信息 Mapper 接口
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-05-15
+ */
+public interface QcAbnormalMapper extends BaseMapper<QcAbnormal> {
+    IPage<QcAbnormalDTO> getQcAnnormal(QcAbnormalVO qcAbnormalVO);
+}

+ 56 - 8
src/main/java/com/diagbot/mapper/QcresultInfoMapper.java

@@ -1,15 +1,17 @@
 package com.diagbot.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.dto.AverageStatisticsDTO;
 import com.diagbot.dto.DeptNumDTO;
 import com.diagbot.dto.NumDTO;
 import com.diagbot.dto.QcResultPercentDTO;
 import com.diagbot.entity.QcresultInfo;
-import com.diagbot.vo.FilterByDeptVO;
+import com.diagbot.vo.FilterPageByDeptVO;
+import com.diagbot.vo.FilterPageVO;
 import com.diagbot.vo.FilterVO;
-import com.diagbot.vo.QcresultFilterByDeptVO;
 import com.diagbot.vo.QcresultFilterVO;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -75,24 +77,70 @@ public interface QcresultInfoMapper extends BaseMapper<QcresultInfo> {
     /**
      * 按科室统计质控病历数
      *
-     * @param qcresultFilterByDeptVO
+     * @param qcresultFilterVO
      * @return
      */
-    public List<NumDTO> resultCountByDept(QcresultFilterByDeptVO qcresultFilterByDeptVO);
+    public List<NumDTO> resultCountByDept(QcresultFilterVO qcresultFilterVO);
 
     /**
      * 各模块缺陷占比-按科室
      *
-     * @param filterByDeptVO
+     * @param filterVO
      * @return
      */
-    public List<DeptNumDTO> entryCountGroupByCaseAndDept(FilterByDeptVO filterByDeptVO);
+    public List<DeptNumDTO> entryCountGroupByCaseAndDept(FilterVO filterVO);
 
     /**
      * 条目缺陷占比-按科室
      *
-     * @param filterByDeptVO
+     * @param filterVO
+     * @return
+     */
+    public List<DeptNumDTO> entryCountGroupByEntryAndDept(FilterVO filterVO);
+
+    /**
+     * 各模块缺陷占比(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<NumDTO> entryCountGroupByCasePage(@Param("filterPageVO") FilterPageVO filterPageVO);
+
+    /**
+     * 条目缺陷占比(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<NumDTO> entryCountGroupByEntryPage(@Param("filterPageVO") FilterPageVO filterPageVO);
+
+    /**
+     * 各科室质控平均分(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<AverageStatisticsDTO> getAverageScoreByDeptPage(@Param("filterPageVO") FilterPageVO filterPageVO);
+
+    /**
+     * 各科室甲级病历占比排行(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<QcResultPercentDTO> levelPercentGroupByDeptPage(@Param("filterPageVO") FilterPageVO filterPageVO);
+
+    /**
+     * 各模块缺陷占比-科室(分页)
+     * @param filterPageByDeptVO
+     * @return
+     */
+    public IPage<DeptNumDTO> entryCountGroupByCaseAndDeptPage(@Param("filterPageByDeptVO")FilterPageByDeptVO filterPageByDeptVO);
+
+    /**
+     * 条目缺陷占比-科室(分页)
+     * @param filterPageByDeptVO
      * @return
      */
-    public List<DeptNumDTO> entryCountGroupByEntryAndDept(FilterByDeptVO filterByDeptVO);
+    public IPage<DeptNumDTO> entryCountGroupByEntryAndDeptPage(@Param("filterPageByDeptVO")FilterPageByDeptVO filterPageByDeptVO);
 }

+ 4 - 4
src/main/java/com/diagbot/service/BasDeptInfoService.java

@@ -1,11 +1,11 @@
 package com.diagbot.service;
 
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.diagbot.dto.BasDeptInfoDTO;
 import com.diagbot.dto.DeptBaseDTO;
 import com.diagbot.entity.BasDeptInfo;
-import com.baomidou.mybatisplus.extension.service.IService;
 import com.diagbot.vo.BasDeptInfoVO;
-import com.diagbot.vo.FilterByDeptVO;
+import com.diagbot.vo.FilterVO;
 
 import java.util.List;
 
@@ -25,8 +25,8 @@ public interface BasDeptInfoService extends IService<BasDeptInfo> {
     /**
      * 查询用户关联科室
      *
-     * @param filterByDeptVO
+     * @param filterVO
      * @return
      */
-    List<DeptBaseDTO> getDeptByUser(FilterByDeptVO filterByDeptVO);
+    List<DeptBaseDTO> getDeptByUser(FilterVO filterVO);
 }

+ 61 - 7
src/main/java/com/diagbot/service/BehospitalInfoService.java

@@ -3,16 +3,22 @@ package com.diagbot.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.diagbot.dto.BehospitalInfoDTO;
+import com.diagbot.dto.DeptNumDTO;
+import com.diagbot.dto.LevelStatisticsDTO;
 import com.diagbot.dto.MsgDTO;
 import com.diagbot.dto.NumDTO;
 import com.diagbot.entity.BehospitalInfo;
 import com.diagbot.vo.AnalyzeCodeVO;
 import com.diagbot.vo.AnalyzeVO;
 import com.diagbot.vo.BehospitalPageVO;
-import com.diagbot.vo.FilterByDeptVO;
+import com.diagbot.vo.FilterOrderByDeptVO;
+import com.diagbot.vo.FilterOrderVO;
+import com.diagbot.vo.FilterPageByDeptVO;
+import com.diagbot.vo.FilterPageVO;
 import com.diagbot.vo.FilterVO;
-import com.diagbot.vo.HPFilterByDeptVO;
 import com.diagbot.vo.HomePageFilterVO;
+import org.apache.ibatis.annotations.Param;
+import com.diagbot.vo.TaskVO;
 
 import java.util.List;
 
@@ -73,7 +79,7 @@ public interface BehospitalInfoService extends IService<BehospitalInfo> {
     public int getTotleResultNum(FilterVO filterVO);
 
 
-    public List<BehospitalInfo> getNoGrade();
+    public List<BehospitalInfo> getNoGrade(TaskVO taskVO);
 
     IPage<BehospitalInfoDTO> getPageByDept(BehospitalPageVO behospitalPageVO);
 
@@ -98,16 +104,64 @@ public interface BehospitalInfoService extends IService<BehospitalInfo> {
     /**
      * 按科室统计病案首页病历数
      *
-     * @param hpFilterByDeptVO
+     * @param homePageFilterVO
      * @return
      */
-    public List<NumDTO> homePageCountByDept(HPFilterByDeptVO hpFilterByDeptVO);
+    public List<NumDTO> homePageCountByDept(HomePageFilterVO homePageFilterVO);
 
     /**
      * 按科室统计病案首页手术病历数
      *
-     * @param filterByDeptVO
+     * @param filterVO
+     * @return
+     */
+    public List<NumDTO> homePageCountForOperationByDept(FilterVO filterVO);
+
+    /**
+     * 各科室缺陷占比排行(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<NumDTO> resultStatisticsByDeptPage(@Param("filterPageVO") FilterPageVO filterPageVO);
+
+    /**
+     * 各科室缺陷占比(组合)
+     *
+     * @param filterOrderVO
+     * @return
+     */
+    public List<LevelStatisticsDTO> levelStatistics(FilterOrderVO filterOrderVO);
+
+    /**
+     * 病案首页合格率占比
+     *
+     * @param filterOrderVO
+     * @return
+     */
+    public List<LevelStatisticsDTO> homePageLevelStatistics(FilterOrderVO filterOrderVO);
+
+    /**
+     * 各科室缺陷占比(主任医生)
+     *
+     * @param filterOrderByDeptVO
+     * @return
+     */
+    public List<LevelStatisticsDTO> levelStatisticsByDept(FilterOrderByDeptVO filterOrderByDeptVO);
+
+    /**
+     * 病案首页合格率占比(主任医生)
+     *
+     * @param filterOrderByDeptVO
+     * @return
+     */
+    public List<LevelStatisticsDTO> homePageLevelStatisticsByDept(FilterOrderByDeptVO filterOrderByDeptVO);
+
+    /**
+     * 缺陷明细-科室(分页)
+     *
+     * @param filterPageByDeptVO
      * @return
      */
-    public List<NumDTO> homePageCountForOperationByDept(FilterByDeptVO filterByDeptVO);
+    public IPage<DeptNumDTO> resultStatisticsByDeptAndDoctorPage(@Param("filterPageByDeptVO") FilterPageByDeptVO filterPageByDeptVO);
 }

+ 19 - 0
src/main/java/com/diagbot/service/HomePageService.java

@@ -1,9 +1,12 @@
 package com.diagbot.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.dto.AverageStatisticsDTO;
 import com.diagbot.entity.HomePage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.vo.FilterPageVO;
 import com.diagbot.vo.FilterVO;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -31,4 +34,20 @@ public interface HomePageService extends IService<HomePage> {
      * @return
      */
     public List<AverageStatisticsDTO> getAverageFee(FilterVO filterVO);
+
+    /**
+     * 按科室统计平均住院天数(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<AverageStatisticsDTO> getAverageDayNumPage(@Param("filterPageVO") FilterPageVO filterPageVO);
+
+    /**
+     * 按科室统计平均费用(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<AverageStatisticsDTO> getAverageFeePage(@Param("filterPageVO") FilterPageVO filterPageVO);
 }

+ 16 - 0
src/main/java/com/diagbot/service/MedQcresultCasesService.java

@@ -0,0 +1,16 @@
+package com.diagbot.service;
+
+import com.diagbot.entity.MedQcresultCases;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 质控评分模块评分信息 服务类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-05-19
+ */
+public interface MedQcresultCasesService extends IService<MedQcresultCases> {
+
+}

+ 22 - 0
src/main/java/com/diagbot/service/ModelHospitalService.java

@@ -0,0 +1,22 @@
+package com.diagbot.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.dto.ModelHospitalAllDTO;
+import com.diagbot.entity.ModelHospital;
+import com.diagbot.vo.ModelHospitalAllVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author wangfeng
+ * @since 2020-05-15
+ */
+public interface ModelHospitalService extends IService<ModelHospital> {
+
+    IPage<List<ModelHospitalAllDTO>> getModelHospitalAll(ModelHospitalAllVO modelHospitalAllVO);
+}

+ 19 - 0
src/main/java/com/diagbot/service/QcAbnormalService.java

@@ -0,0 +1,19 @@
+package com.diagbot.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.QcAbnormalDTO;
+import com.diagbot.entity.QcAbnormal;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.vo.QcAbnormalVO;
+
+/**
+ * <p>
+ * 异常数据监控信息 服务类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-05-15
+ */
+public interface QcAbnormalService extends IService<QcAbnormal> {
+    IPage<QcAbnormalDTO> getQcAnnormal(QcAbnormalVO qcAbnormalVO);
+}

+ 56 - 8
src/main/java/com/diagbot/service/QcresultInfoService.java

@@ -1,15 +1,17 @@
 package com.diagbot.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.diagbot.dto.AverageStatisticsDTO;
 import com.diagbot.dto.DeptNumDTO;
 import com.diagbot.dto.NumDTO;
 import com.diagbot.dto.QcResultPercentDTO;
 import com.diagbot.entity.QcresultInfo;
-import com.diagbot.vo.FilterByDeptVO;
+import com.diagbot.vo.FilterPageByDeptVO;
+import com.diagbot.vo.FilterPageVO;
 import com.diagbot.vo.FilterVO;
-import com.diagbot.vo.QcresultFilterByDeptVO;
 import com.diagbot.vo.QcresultFilterVO;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -76,24 +78,70 @@ public interface QcresultInfoService extends IService<QcresultInfo> {
     /**
      * 按科室统计质控病历数
      *
-     * @param qcresultFilterByDeptVO
+     * @param qcresultFilterVO
      * @return
      */
-    public List<NumDTO> resultCountByDept(QcresultFilterByDeptVO qcresultFilterByDeptVO);
+    public List<NumDTO> resultCountByDept(QcresultFilterVO qcresultFilterVO);
 
     /**
      * 各模块缺陷占比-按科室
      *
-     * @param filterByDeptVO
+     * @param filterVO
      * @return
      */
-    public List<DeptNumDTO> entryCountGroupByCaseAndDept(FilterByDeptVO filterByDeptVO);
+    public List<DeptNumDTO> entryCountGroupByCaseAndDept(FilterVO filterVO);
 
     /**
      * 条目缺陷占比-按科室
      *
-     * @param filterByDeptVO
+     * @param filterVO
+     * @return
+     */
+    public List<DeptNumDTO> entryCountGroupByEntryAndDept(FilterVO filterVO);
+
+    /**
+     * 各模块缺陷占比(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<NumDTO> entryCountGroupByCasePage(@Param("filterPageVO") FilterPageVO filterPageVO);
+
+    /**
+     * 条目缺陷占比(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<NumDTO> entryCountGroupByEntryPage(@Param("filterPageVO") FilterPageVO filterPageVO);
+
+    /**
+     * 各科室质控平均分(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<AverageStatisticsDTO> getAverageScoreByDeptPage(@Param("filterPageVO") FilterPageVO filterPageVO);
+
+    /**
+     * 各科室甲级病历占比排行(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<QcResultPercentDTO> levelPercentGroupByDeptPage(@Param("filterPageVO") FilterPageVO filterPageVO);
+
+    /**
+     * 各模块缺陷占比-科室(分页)
+     * @param filterPageByDeptVO
+     * @return
+     */
+    public IPage<DeptNumDTO> entryCountGroupByCaseAndDeptPage(@Param("filterPageByDeptVO") FilterPageByDeptVO filterPageByDeptVO);
+
+    /**
+     * 条目缺陷占比-科室(分页)
+     * @param filterPageByDeptVO
      * @return
      */
-    public List<DeptNumDTO> entryCountGroupByEntryAndDept(FilterByDeptVO filterByDeptVO);
+    public IPage<DeptNumDTO> entryCountGroupByEntryAndDeptPage(@Param("filterPageByDeptVO")FilterPageByDeptVO filterPageByDeptVO);
 }

+ 4 - 4
src/main/java/com/diagbot/service/impl/BasDeptInfoServiceImpl.java

@@ -7,7 +7,7 @@ import com.diagbot.entity.BasDeptInfo;
 import com.diagbot.mapper.BasDeptInfoMapper;
 import com.diagbot.service.BasDeptInfoService;
 import com.diagbot.vo.BasDeptInfoVO;
-import com.diagbot.vo.FilterByDeptVO;
+import com.diagbot.vo.FilterVO;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -36,11 +36,11 @@ public class BasDeptInfoServiceImpl extends ServiceImpl<BasDeptInfoMapper, BasDe
     /**
      * 查询用户关联科室
      *
-     * @param filterByDeptVO
+     * @param filterVO
      * @return
      */
     @Override
-    public List<DeptBaseDTO> getDeptByUser(FilterByDeptVO filterByDeptVO) {
-        return baseMapper.getDeptByUser(filterByDeptVO);
+    public List<DeptBaseDTO> getDeptByUser(FilterVO filterVO) {
+        return baseMapper.getDeptByUser(filterVO);
     }
 }

+ 81 - 10
src/main/java/com/diagbot/service/impl/BehospitalInfoServiceImpl.java

@@ -3,6 +3,8 @@ package com.diagbot.service.impl;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.diagbot.dto.BehospitalInfoDTO;
+import com.diagbot.dto.DeptNumDTO;
+import com.diagbot.dto.LevelStatisticsDTO;
 import com.diagbot.dto.MsgDTO;
 import com.diagbot.dto.NumDTO;
 import com.diagbot.entity.BehospitalInfo;
@@ -11,10 +13,14 @@ import com.diagbot.service.BehospitalInfoService;
 import com.diagbot.vo.AnalyzeCodeVO;
 import com.diagbot.vo.AnalyzeVO;
 import com.diagbot.vo.BehospitalPageVO;
-import com.diagbot.vo.FilterByDeptVO;
+import com.diagbot.vo.FilterOrderByDeptVO;
+import com.diagbot.vo.FilterOrderVO;
+import com.diagbot.vo.FilterPageByDeptVO;
+import com.diagbot.vo.FilterPageVO;
 import com.diagbot.vo.FilterVO;
-import com.diagbot.vo.HPFilterByDeptVO;
 import com.diagbot.vo.HomePageFilterVO;
+import org.apache.ibatis.annotations.Param;
+import com.diagbot.vo.TaskVO;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -101,8 +107,8 @@ public class BehospitalInfoServiceImpl extends ServiceImpl<BehospitalInfoMapper,
     }
 
     @Override
-    public List<BehospitalInfo> getNoGrade() {
-        return baseMapper.getNoGrade();
+    public List<BehospitalInfo> getNoGrade(TaskVO taskVO) {
+        return baseMapper.getNoGrade(taskVO);
     }
 
     @Override
@@ -140,22 +146,87 @@ public class BehospitalInfoServiceImpl extends ServiceImpl<BehospitalInfoMapper,
     /**
      * 按科室统计病案首页病历数
      *
-     * @param hpFilterByDeptVO
+     * @param homePageFilterVO
      * @return
      */
     @Override
-    public List<NumDTO> homePageCountByDept(HPFilterByDeptVO hpFilterByDeptVO) {
-        return baseMapper.homePageCountByDept(hpFilterByDeptVO);
+    public List<NumDTO> homePageCountByDept(HomePageFilterVO homePageFilterVO) {
+        return baseMapper.homePageCountByDept(homePageFilterVO);
     }
 
     /**
      * 按科室统计病案首页手术病历数
      *
-     * @param filterByDeptVO
+     * @param filterVO
+     * @return
+     */
+    @Override
+    public List<NumDTO> homePageCountForOperationByDept(FilterVO filterVO) {
+        return baseMapper.homePageCountForOperationByDept(filterVO);
+    }
+
+    /**
+     * 各科室缺陷占比排行(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    @Override
+    public IPage<NumDTO> resultStatisticsByDeptPage(@Param("filterPageVO") FilterPageVO filterPageVO) {
+        return baseMapper.resultStatisticsByDeptPage(filterPageVO);
+    }
+
+    /**
+     * 各科室缺陷占比(组合)
+     *
+     * @param filterOrderVO
      * @return
      */
     @Override
-    public List<NumDTO> homePageCountForOperationByDept(FilterByDeptVO filterByDeptVO) {
-        return baseMapper.homePageCountForOperationByDept(filterByDeptVO);
+    public List<LevelStatisticsDTO> levelStatistics(FilterOrderVO filterOrderVO) {
+        return baseMapper.levelStatistics(filterOrderVO);
+    }
+
+    /**
+     * 病案首页合格率占比
+     *
+     * @param filterOrderVO
+     * @return
+     */
+    @Override
+    public List<LevelStatisticsDTO> homePageLevelStatistics(FilterOrderVO filterOrderVO) {
+        return baseMapper.homePageLevelStatistics(filterOrderVO);
+    }
+
+    /**
+     * 各科室缺陷占比(主任医生)
+     *
+     * @param filterOrderByDeptVO
+     * @return
+     */
+    @Override
+    public List<LevelStatisticsDTO> levelStatisticsByDept(FilterOrderByDeptVO filterOrderByDeptVO) {
+        return baseMapper.levelStatisticsByDept(filterOrderByDeptVO);
+    }
+
+    /**
+     * 病案首页合格率占比(主任医生)
+     *
+     * @param filterOrderByDeptVO
+     * @return
+     */
+    @Override
+    public List<LevelStatisticsDTO> homePageLevelStatisticsByDept(FilterOrderByDeptVO filterOrderByDeptVO) {
+        return baseMapper.homePageLevelStatisticsByDept(filterOrderByDeptVO);
+    }
+
+    /**
+     * 缺陷明细-科室(分页)
+     *
+     * @param filterPageByDeptVO
+     * @return
+     */
+    public IPage<DeptNumDTO> resultStatisticsByDeptAndDoctorPage(@Param("filterPageByDeptVO") FilterPageByDeptVO filterPageByDeptVO) {
+        return baseMapper.resultStatisticsByDeptAndDoctorPage(filterPageByDeptVO);
     }
 }

+ 24 - 0
src/main/java/com/diagbot/service/impl/HomePageServiceImpl.java

@@ -1,11 +1,14 @@
 package com.diagbot.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.diagbot.dto.AverageStatisticsDTO;
 import com.diagbot.entity.HomePage;
 import com.diagbot.mapper.HomePageMapper;
 import com.diagbot.service.HomePageService;
+import com.diagbot.vo.FilterPageVO;
 import com.diagbot.vo.FilterVO;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -42,4 +45,25 @@ public class HomePageServiceImpl extends ServiceImpl<HomePageMapper, HomePage> i
     public List<AverageStatisticsDTO> getAverageFee(FilterVO filterVO) {
         return baseMapper.getAverageFee(filterVO);
     }
+
+    /**
+     * 按科室统计平均住院天数(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    @Override
+    public IPage<AverageStatisticsDTO> getAverageDayNumPage(@Param("filterPageVO") FilterPageVO filterPageVO) {
+        return baseMapper.getAverageDayNumPage(filterPageVO);
+    }
+
+    /**
+     * 按科室统计平均费用(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<AverageStatisticsDTO> getAverageFeePage(@Param("filterPageVO") FilterPageVO filterPageVO) {
+        return baseMapper.getAverageFeePage(filterPageVO);
+    }
 }

+ 20 - 0
src/main/java/com/diagbot/service/impl/MedQcresultCasesServiceImpl.java

@@ -0,0 +1,20 @@
+package com.diagbot.service.impl;
+
+import com.diagbot.entity.MedQcresultCases;
+import com.diagbot.mapper.MedQcresultCasesMapper;
+import com.diagbot.service.MedQcresultCasesService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 质控评分模块评分信息 服务实现类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-05-19
+ */
+@Service
+public class MedQcresultCasesServiceImpl extends ServiceImpl<MedQcresultCasesMapper, MedQcresultCases> implements MedQcresultCasesService {
+
+}

+ 29 - 0
src/main/java/com/diagbot/service/impl/ModelHospitalServiceImpl.java

@@ -0,0 +1,29 @@
+package com.diagbot.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.dto.ModelHospitalAllDTO;
+import com.diagbot.entity.ModelHospital;
+import com.diagbot.mapper.ModelHospitalMapper;
+import com.diagbot.service.ModelHospitalService;
+import com.diagbot.vo.ModelHospitalAllVO;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author wangfeng
+ * @since 2020-05-15
+ */
+@Service
+public class ModelHospitalServiceImpl extends ServiceImpl<ModelHospitalMapper, ModelHospital> implements ModelHospitalService {
+
+    @Override
+    public IPage<List<ModelHospitalAllDTO>> getModelHospitalAll(ModelHospitalAllVO modelHospitalAllVO) {
+        return baseMapper.getModelHospitalAll(modelHospitalAllVO);
+    }
+}

+ 25 - 0
src/main/java/com/diagbot/service/impl/QcAbnormalServiceImpl.java

@@ -0,0 +1,25 @@
+package com.diagbot.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.QcAbnormalDTO;
+import com.diagbot.entity.QcAbnormal;
+import com.diagbot.mapper.QcAbnormalMapper;
+import com.diagbot.service.QcAbnormalService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.vo.QcAbnormalVO;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 异常数据监控信息 服务实现类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-05-15
+ */
+@Service
+public class QcAbnormalServiceImpl extends ServiceImpl<QcAbnormalMapper, QcAbnormal> implements QcAbnormalService {
+    public IPage<QcAbnormalDTO> getQcAnnormal(QcAbnormalVO qcAbnormalVO){
+        return baseMapper.getQcAnnormal(qcAbnormalVO);
+    }
+}

+ 79 - 11
src/main/java/com/diagbot/service/impl/QcresultInfoServiceImpl.java

@@ -1,5 +1,6 @@
 package com.diagbot.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.diagbot.dto.AverageStatisticsDTO;
 import com.diagbot.dto.DeptNumDTO;
@@ -8,10 +9,11 @@ import com.diagbot.dto.QcResultPercentDTO;
 import com.diagbot.entity.QcresultInfo;
 import com.diagbot.mapper.QcresultInfoMapper;
 import com.diagbot.service.QcresultInfoService;
-import com.diagbot.vo.FilterByDeptVO;
+import com.diagbot.vo.FilterPageByDeptVO;
+import com.diagbot.vo.FilterPageVO;
 import com.diagbot.vo.FilterVO;
-import com.diagbot.vo.QcresultFilterByDeptVO;
 import com.diagbot.vo.QcresultFilterVO;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -98,33 +100,99 @@ public class QcresultInfoServiceImpl extends ServiceImpl<QcresultInfoMapper, Qcr
     /**
      * 按科室统计质控病历数
      *
-     * @param qcresultFilterByDeptVO
+     * @param qcresultFilterVO
      * @return
      */
     @Override
-    public List<NumDTO> resultCountByDept(QcresultFilterByDeptVO qcresultFilterByDeptVO) {
-        return baseMapper.resultCountByDept(qcresultFilterByDeptVO);
+    public List<NumDTO> resultCountByDept(QcresultFilterVO qcresultFilterVO) {
+        return baseMapper.resultCountByDept(qcresultFilterVO);
     }
 
     /**
      * 各模块缺陷占比-按科室
      *
-     * @param filterByDeptVO
+     * @param filterVO
      * @return
      */
     @Override
-    public List<DeptNumDTO> entryCountGroupByCaseAndDept(FilterByDeptVO filterByDeptVO) {
-        return baseMapper.entryCountGroupByCaseAndDept(filterByDeptVO);
+    public List<DeptNumDTO> entryCountGroupByCaseAndDept(FilterVO filterVO) {
+        return baseMapper.entryCountGroupByCaseAndDept(filterVO);
     }
 
     /**
      * 条目缺陷占比-按科室
      *
-     * @param filterByDeptVO
+     * @param filterVO
+     * @return
+     */
+    @Override
+    public List<DeptNumDTO> entryCountGroupByEntryAndDept(FilterVO filterVO) {
+        return baseMapper.entryCountGroupByEntryAndDept(filterVO);
+    }
+
+    /**
+     * 各模块缺陷占比(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    @Override
+    public IPage<NumDTO> entryCountGroupByCasePage(@Param("filterPageVO") FilterPageVO filterPageVO) {
+        return baseMapper.entryCountGroupByCasePage(filterPageVO);
+    }
+
+    /**
+     * 条目缺陷占比(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    @Override
+    public IPage<NumDTO> entryCountGroupByEntryPage(@Param("filterPageVO") FilterPageVO filterPageVO) {
+        return baseMapper.entryCountGroupByEntryPage(filterPageVO);
+    }
+
+    /**
+     * 各科室质控平均分(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    @Override
+    public IPage<AverageStatisticsDTO> getAverageScoreByDeptPage(@Param("filterPageVO") FilterPageVO filterPageVO) {
+        return baseMapper.getAverageScoreByDeptPage(filterPageVO);
+    }
+
+    /**
+     * 各科室甲级病历占比排行(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    @Override
+    public IPage<QcResultPercentDTO> levelPercentGroupByDeptPage(@Param("filterPageVO") FilterPageVO filterPageVO) {
+        return baseMapper.levelPercentGroupByDeptPage(filterPageVO);
+    }
+
+    /**
+     * 各模块缺陷占比-科室(分页)
+     *
+     * @param filterPageByDeptVO
+     * @return
+     */
+    @Override
+    public IPage<DeptNumDTO> entryCountGroupByCaseAndDeptPage(@Param("filterPageByDeptVO") FilterPageByDeptVO filterPageByDeptVO) {
+        return baseMapper.entryCountGroupByCaseAndDeptPage(filterPageByDeptVO);
+    }
+
+    /**
+     * 条目缺陷占比-科室(分页)
+     *
+     * @param filterPageByDeptVO
      * @return
      */
     @Override
-    public List<DeptNumDTO> entryCountGroupByEntryAndDept(FilterByDeptVO filterByDeptVO) {
-        return baseMapper.entryCountGroupByEntryAndDept(filterByDeptVO);
+    public IPage<DeptNumDTO> entryCountGroupByEntryAndDeptPage(@Param("filterPageByDeptVO") FilterPageByDeptVO filterPageByDeptVO) {
+        return baseMapper.entryCountGroupByEntryAndDeptPage(filterPageByDeptVO);
     }
 }

+ 72 - 0
src/main/java/com/diagbot/task/TASK_CX.java

@@ -0,0 +1,72 @@
+package com.diagbot.task;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.diagbot.entity.SysTaskCron;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.facade.BehospitalInfoFacade;
+import com.diagbot.facade.SysTaskCronFacade;
+import com.diagbot.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.Trigger;
+import org.springframework.scheduling.TriggerContext;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.SchedulingConfigurer;
+import org.springframework.scheduling.config.ScheduledTaskRegistrar;
+import org.springframework.scheduling.support.CronTrigger;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/4/15 17:45
+ */
+@Configuration      //1.主要用于标记配置类,兼备Component的效果。
+@EnableScheduling   // 2.开启定时任务
+@Slf4j
+public class TASK_CX implements SchedulingConfigurer {
+    @Autowired
+    private SysTaskCronFacade sysTaskCronFacade;
+
+    private SysTaskCron task = new SysTaskCron();
+
+    @Autowired
+    private BehospitalInfoFacade behospitalInfoFacade;
+
+    /**
+     * 执行定时任务.
+     */
+    @Override
+    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
+        taskRegistrar.addTriggerTask(new Runnable() {
+            @Override
+            public void run() {
+                //1.添加任务内容(Runnable)
+                if (null != task
+                        && task.getIsDeleted().equals(IsDeleteEnum.N.getKey())
+                        && task.getIsUsed().equals(1)) {
+                    log.info("执行动态定时任务: " + LocalDateTime.now().toLocalTime());
+                    behospitalInfoFacade.execute2();
+                }
+            }
+        }, new Trigger() {
+            @Override
+            public Date nextExecutionTime(TriggerContext triggerContext) {
+                //2.1 从数据库获取执行周期
+                task = sysTaskCronFacade.getOne(new QueryWrapper<SysTaskCron>()
+                        .eq("cron_code", "TASK_CX")
+                );
+                String cron = "0/5 * * * * ?";
+                //2.2 合法性校验.
+                if (null != task && StringUtil.isNotBlank(task.getCron())) {
+                    cron = task.getCron();
+                }
+                CronTrigger trigger = new CronTrigger(cron);
+                return trigger.nextExecutionTime(triggerContext);
+            }
+        });
+    }
+}

+ 11 - 0
src/main/java/com/diagbot/vo/AlgorithmVO.java

@@ -3,6 +3,7 @@ package com.diagbot.vo;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -19,4 +20,14 @@ public class AlgorithmVO {
     private QcResultAlgVO optResultAlgVO;
     //扣分条目
     private List<QcResultAlgVO> qcResultAlgVOList;
+    //-------长兴特殊算分用开始-----------
+    //医院ID
+    private Long hospitalId;
+    // 病历id
+    private String behospitalCode;
+    //质控评分模块评分信息
+    private List<MedQcresultCasesVO> medQcresultCasesVOList = new ArrayList<>();
+    //是否病案首页
+    private Boolean isHomePage = false;
+    //-------长兴特殊算分用结束-----------
 }

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

@@ -1,17 +0,0 @@
-package com.diagbot.vo;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * @Description:主任医生过滤
- * @Author:zhaops
- * @time: 2020/5/8 17:02
- */
-@Getter
-@Setter
-public class FilterByDeptVO extends FilterVO {
-    @ApiModelProperty(hidden = true)
-    private Long userId;
-}

+ 15 - 0
src/main/java/com/diagbot/vo/FilterOrderByDeptVO.java

@@ -0,0 +1,15 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/5/19 18:05
+ */
+@Getter
+@Setter
+public class FilterOrderByDeptVO extends FilterOrderVO {
+    private String deptName;
+}

+ 29 - 0
src/main/java/com/diagbot/vo/FilterOrderVO.java

@@ -0,0 +1,29 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/5/19 13:39
+ */
+@Getter
+@Setter
+public class FilterOrderVO extends FilterVO {
+    /**
+     * 等级
+     */
+    private String level;
+
+    /**
+     * 排序(升序)
+     */
+    private String asc;
+
+    /**
+     * 排序(降序)
+     */
+    private String desc;
+    private String name;
+}

+ 23 - 0
src/main/java/com/diagbot/vo/FilterPageByDeptVO.java

@@ -0,0 +1,23 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/5/15 11:32
+ */
+@Getter
+@Setter
+public class FilterPageByDeptVO extends FilterPageVO {
+    /**
+     * 科室名称
+     */
+    private String deptName;
+
+    /**
+     * 医生名称
+     */
+    private String doctorName;
+}

+ 45 - 0
src/main/java/com/diagbot/vo/FilterPageVO.java

@@ -0,0 +1,45 @@
+package com.diagbot.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/5/14 14:57
+ */
+@Getter
+@Setter
+public class FilterPageVO extends Page {
+    /**
+     * 统计维度 1-本月,2-本年
+     */
+    private Integer type;
+    /**
+     * 时间类型 1-本月/本年,2-上月/去年,3-去年本月/去年
+     */
+    private Integer dateType;
+    /**
+     * 起始时间
+     */
+    @ApiModelProperty(hidden = true)
+    private String startDate;
+    /**
+     * 结束时间
+     */
+    @ApiModelProperty(hidden = true)
+    private String endDate;
+    /**
+     * 医院id
+     */
+    @ApiModelProperty(hidden = true)
+    private String hospitalId;
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(hidden = true)
+    private Long userId;
+    private String name;
+}

+ 3 - 0
src/main/java/com/diagbot/vo/FilterVO.java

@@ -36,4 +36,7 @@ public class FilterVO {
      */
     @ApiModelProperty(hidden = true)
     private Integer limitCount;
+
+    @ApiModelProperty(hidden = true)
+    private Long userId;
 }

+ 0 - 18
src/main/java/com/diagbot/vo/HPFilterByDeptVO.java

@@ -1,18 +0,0 @@
-package com.diagbot.vo;
-
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * @Description:
- * @Author:zhaops
- * @time: 2020/5/8 19:27
- */
-@Getter
-@Setter
-public class HPFilterByDeptVO extends FilterByDeptVO {
-    /**
-     * 死亡
-     */
-    private Integer death;
-}

+ 40 - 0
src/main/java/com/diagbot/vo/MedQcresultCasesVO.java

@@ -0,0 +1,40 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * @Description: 质控评分模块评分信息
+ * @author: gaodm
+ * @time: 2020/5/19 9:37
+ */
+@Getter
+@Setter
+public class MedQcresultCasesVO {
+    /**
+     * 医院ID
+     */
+    private Long hospitalId;
+
+    /**
+     * 病人住院ID
+     */
+    private String behospitalCode;
+
+    /**
+     * 数据模块ID(0:其他模块)
+     */
+    private Long casesId;
+
+    /**
+     * 最后得分
+     */
+    private BigDecimal scoreRes;
+
+    /**
+     * 等级
+     */
+    private String level;
+}

+ 23 - 0
src/main/java/com/diagbot/vo/ModelHospitalAllVO.java

@@ -0,0 +1,23 @@
+package com.diagbot.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author wangfeng
+ * @Description:
+ * @date 2020-05-15 14:52
+ */
+@Setter
+@Getter
+public class ModelHospitalAllVO extends Page {
+
+    private Long hospitalId;
+
+    private String hospitalModelName;
+
+    private Long standModelId;
+
+    private String standModelName;
+}

+ 18 - 0
src/main/java/com/diagbot/vo/ModelHospitalIdVO.java

@@ -0,0 +1,18 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author wangfeng
+ * @Description:
+ * @date 2020-05-15 15:19
+ */
+@Setter
+@Getter
+public class ModelHospitalIdVO {
+    @NotNull(message = "请输入模块id")
+      private Long  ModeId;
+}

+ 29 - 0
src/main/java/com/diagbot/vo/ModelHospitalUpdataVO.java

@@ -0,0 +1,29 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author wangfeng
+ * @Description:
+ * @date 2020-05-15 15:37
+ */
+@Setter
+@Getter
+public class ModelHospitalUpdataVO {
+
+
+    private Long id;
+
+    private Long hospitalId;
+
+    private String hospitalModelName;
+
+    private Long standModelId;
+
+    private String standModelName;
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 21 - 0
src/main/java/com/diagbot/vo/QcAbnormalDelVO.java

@@ -0,0 +1,21 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/5/15 10:16
+ */
+@Getter
+@Setter
+public class QcAbnormalDelVO {
+    /**
+     * 主键
+     */
+    @NotNull(message = "请输入异常数据监控ID")
+    private Long id;
+}

+ 32 - 0
src/main/java/com/diagbot/vo/QcAbnormalSaveVO.java

@@ -0,0 +1,32 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/5/15 10:16
+ */
+@Getter
+@Setter
+public class QcAbnormalSaveVO {
+    /**
+     * 主键
+     */
+    @NotNull(message = "请输入异常数据监控ID")
+    private Long id;
+
+    /**
+     * 状态(0:未处理,1:已处理)
+     */
+    @NotNull(message = "请输入处理状态")
+    private Integer status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 49 - 0
src/main/java/com/diagbot/vo/QcAbnormalVO.java

@@ -0,0 +1,49 @@
+package com.diagbot.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/5/15 10:16
+ */
+@Getter
+@Setter
+public class QcAbnormalVO extends Page {
+    /**
+     * 病人住院ID
+     */
+    private String behospitalCode;
+
+    /**
+     * 异常类型(1:数据模块 2:质控类型 3:XML结构)
+     */
+    private Integer type;
+
+    /**
+     * 状态(0:未处理,1:已处理)
+     */
+    private Integer status;
+
+    /**
+     * 统计维度 1-本月,2-本年
+     */
+    private Integer statisticsType;
+    /**
+     * 起始时间
+     */
+    @ApiModelProperty(hidden = true)
+    private String startDate;
+    /**
+     * 结束时间
+     */
+    @ApiModelProperty(hidden = true)
+    private String endDate;
+
+    //医院ID
+    @ApiModelProperty(hidden = true)
+    private Long hospitalId;
+}

+ 0 - 23
src/main/java/com/diagbot/vo/QcresultFilterByDeptVO.java

@@ -1,23 +0,0 @@
-package com.diagbot.vo;
-
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * @Description:
- * @Author:zhaops
- * @time: 2020/5/8 19:50
- */
-@Getter
-@Setter
-public class QcresultFilterByDeptVO extends FilterByDeptVO{
-    /**
-     * 等级
-     */
-    private String level;
-
-    /**
-     * 评分类型
-     */
-    private Integer gradeType;
-}

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

@@ -0,0 +1,17 @@
+package com.diagbot.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/4/14 9:53
+ */
+@Data
+public class TaskVO {
+
+    // 出院时间过滤
+    private Date leaveDate;
+}

+ 127 - 14
src/main/java/com/diagbot/web/ConsoleByDeptController.java

@@ -1,9 +1,15 @@
 package com.diagbot.web;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.annotation.SysLogger;
+import com.diagbot.dto.DeptBaseDTO;
+import com.diagbot.dto.DeptNumDTO;
+import com.diagbot.dto.LevelStatisticsDTO;
 import com.diagbot.dto.RespDTO;
 import com.diagbot.facade.ConsoleByDeptFacade;
-import com.diagbot.vo.FilterByDeptVO;
+import com.diagbot.vo.FilterOrderByDeptVO;
+import com.diagbot.vo.FilterPageByDeptVO;
+import com.diagbot.vo.FilterVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -12,6 +18,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -27,39 +34,145 @@ public class ConsoleByDeptController {
     @Autowired
     private ConsoleByDeptFacade consoleByDeptFacade;
 
-    @ApiOperation(value = "出院病人统计(科室)[by:zhaops]",
+    //region --------------------------首页接口开始------------------------------
+    @ApiOperation(value = "出院病人统计(科室)-首页[by:zhaops]",
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/leaveHosCountByDept")
     @SysLogger("leaveHosCountByDept")
-    public RespDTO<Map<String, Object>> leaveHosCountByDept(@RequestBody FilterByDeptVO filterByDeptVO) {
-        Map<String, Object> data = consoleByDeptFacade.leaveHosCountByDept(filterByDeptVO);
+    public RespDTO<Map<String, Object>> leaveHosCountByDept(@RequestBody FilterVO filterVO) {
+        Map<String, Object> data = consoleByDeptFacade.leaveHosCountByDept(filterVO);
         return RespDTO.onSuc(data);
     }
 
-    @ApiOperation(value = "病历数统计(科室)[by:zhaops]",
+    @ApiOperation(value = "病历数统计(科室)-首页[by:zhaops]",
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/mrCountByDept")
     @SysLogger("mrCountByDept")
-    public RespDTO<Map<String, Object>> mrCountByDept(@RequestBody FilterByDeptVO filterByDeptVO) {
-        Map<String, Object> data = consoleByDeptFacade.mrCountByDept(filterByDeptVO);
+    public RespDTO<Map<String, Object>> mrCountByDept(@RequestBody FilterVO filterVO) {
+        Map<String, Object> data = consoleByDeptFacade.mrCountByDept(filterVO);
         return RespDTO.onSuc(data);
     }
 
-    @ApiOperation(value = "各模块缺陷占比排名(科室)[by:zhaops]",
+    @ApiOperation(value = "各模块缺陷占比排名(科室)-首页[by:zhaops]",
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/entryCountGroupByCaseAndDept")
     @SysLogger("entryCountGroupByCaseAndDept")
-    public RespDTO<Map<String, Object>> entryCountGroupByCaseAndDept(@RequestBody FilterByDeptVO filterByDeptVO) {
-        Map<String, Object> data = consoleByDeptFacade.entryCountGroupByCaseAndDept(filterByDeptVO);
+    public RespDTO<Map<String, Object>> entryCountGroupByCaseAndDept(@RequestBody FilterVO filterVO) {
+        Map<String, Object> data = consoleByDeptFacade.entryCountGroupByCaseAndDept(filterVO);
         return RespDTO.onSuc(data);
     }
 
-    @ApiOperation(value = "条目缺陷占比(科室)[by:zhaops]",
+    @ApiOperation(value = "条目缺陷占比(科室)-首页[by:zhaops]",
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/entryCountGroupByEntryAndDept")
     @SysLogger("entryCountGroupByEntryAndDept")
-    public RespDTO<Map<String, Object>> entryCountGroupByEntryAndDept(@RequestBody FilterByDeptVO filterByDeptVO) {
-        Map<String, Object> data = consoleByDeptFacade.entryCountGroupByEntryAndDept(filterByDeptVO);
+    public RespDTO<Map<String, Object>> entryCountGroupByEntryAndDept(@RequestBody FilterVO filterVO) {
+        Map<String, Object> data = consoleByDeptFacade.entryCountGroupByEntryAndDept(filterVO);
         return RespDTO.onSuc(data);
     }
-}
+
+    /**
+     * 病案首页合格率占比(首页)
+     *
+     * @param filterOrderByDeptVO
+     * @return
+     */
+    @ApiOperation(value = "病案首页合格率占比-首页[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
+                    "level: 病历等级 <br>" +
+                    "name: 主治医生名称 <br>" +
+                    "deptName: 科室名称 <br>" +
+                    "asc: 排序(升序) <br>" +
+                    "desc: 排序(降序) <br>")
+    @PostMapping("/homePageLevelByDeptLimit")
+    @SysLogger("homePageLevelByDeptLimit")
+    public RespDTO<List<LevelStatisticsDTO>> homePageLevelByDeptLimit(@RequestBody FilterOrderByDeptVO filterOrderByDeptVO) {
+        return RespDTO.onSuc(consoleByDeptFacade.homePageLevelByDeptLimit(filterOrderByDeptVO));
+    }
+    //endregion -----------------------首页接口结束------------------------------
+
+    @ApiOperation(value = "用户关联科室[by:zhaops]",
+            notes = "")
+    @PostMapping("/getDept")
+    @SysLogger("getDept")
+    public RespDTO<List<DeptBaseDTO>> getDept() {
+        List<DeptBaseDTO> data = consoleByDeptFacade.getDept();
+        return RespDTO.onSuc(data);
+    }
+
+    //region --------------------------内页接口开始------------------------------
+    @ApiOperation(value = "各模块缺陷占比排名-科室(分页)-内页[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
+                    "name: 模块名称<br>" +
+                    "deptName: 科室名称(必填)<br>")
+    @PostMapping("/entryCountGroupByCaseAndDeptPage")
+    @SysLogger("entryCountGroupByCaseAndDeptPage")
+    public RespDTO<IPage<DeptNumDTO>> entryCountGroupByCaseAndDeptPage(@RequestBody FilterPageByDeptVO filterPageByDeptVO) {
+        IPage<DeptNumDTO> data = consoleByDeptFacade.entryCountGroupByCaseAndDeptPage(filterPageByDeptVO);
+        return RespDTO.onSuc(data);
+    }
+
+    @ApiOperation(value = "条目缺陷占比-科室(分页)-内页[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
+                    "name: 缺陷名称<br>" +
+                    "deptName: 科室名称(必填)<br>")
+    @PostMapping("/entryCountGroupByEntryAndDeptPage")
+    @SysLogger("entryCountGroupByEntryAndDeptPage")
+    public RespDTO<IPage<DeptNumDTO>> entryCountGroupByEntryAndDeptPage(@RequestBody FilterPageByDeptVO filterPageByDeptVO) {
+        IPage<DeptNumDTO> data = consoleByDeptFacade.entryCountGroupByEntryAndDeptPage(filterPageByDeptVO);
+        return RespDTO.onSuc(data);
+    }
+
+    @ApiOperation(value = "缺陷明细-科室(分页)-内页[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
+                    "name: 缺陷名称<br>" +
+                    "deptName: 科室名称(必填)<br>" +
+                    "doctorName: 医生名称(必填)<br>")
+    @PostMapping("/resultStatisticsByDeptAndDoctorPage")
+    @SysLogger("resultStatisticsByDeptAndDoctorPage")
+    public RespDTO<IPage<DeptNumDTO>> resultStatisticsByDeptAndDoctorPage(@RequestBody FilterPageByDeptVO filterPageByDeptVO) {
+        IPage<DeptNumDTO> data = consoleByDeptFacade.resultStatisticsByDeptAndDoctorPage(filterPageByDeptVO);
+        return RespDTO.onSuc(data);
+    }
+
+    /**
+     * 各科室缺陷占比(组合)
+     *
+     * @param filterOrderByDeptVO
+     * @return
+     */
+    @ApiOperation(value = "各科室缺陷占比(组合)-内页[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
+                    "level: 病历等级 <br>" +
+                    "name: 主治医生名称 <br>" +
+                    "deptName: 科室名称 <br>" +
+                    "asc: 排序(升序) <br>" +
+                    "desc: 排序(降序) <br>")
+    @PostMapping("/levelStatisticsByDept")
+    @SysLogger("levelStatisticsByDept")
+    public RespDTO<List<LevelStatisticsDTO>> levelStatisticsByDept(@RequestBody FilterOrderByDeptVO filterOrderByDeptVO) {
+        return RespDTO.onSuc(consoleByDeptFacade.levelStatisticsByDept(filterOrderByDeptVO));
+    }
+
+    /**
+     * 病案首页合格率占比
+     *
+     * @param filterOrderByDeptVO
+     * @return
+     */
+    @ApiOperation(value = "病案首页合格率占比(科室)-内页[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
+                    "level: 病历等级 <br>" +
+                    "name: 主治医生名称 <br>" +
+                    "deptName: 科室名称 <br>" +
+                    "asc: 排序(升序) <br>" +
+                    "desc: 排序(降序) <br>")
+    @PostMapping("/homePageLevelStatisticsByDept")
+    @SysLogger("homePageLevelStatisticsByDept")
+    public RespDTO<List<LevelStatisticsDTO>> homePageLevelStatisticsByDept(@RequestBody FilterOrderByDeptVO filterOrderByDeptVO) {
+        return RespDTO.onSuc(consoleByDeptFacade.homePageLevelStatisticsByDept(filterOrderByDeptVO));
+    }
+
+    //endregion -----------------------内页接口结束------------------------------
+
+}

+ 169 - 4
src/main/java/com/diagbot/web/ConsoleController.java

@@ -1,8 +1,14 @@
 package com.diagbot.web;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.annotation.SysLogger;
+import com.diagbot.dto.AverageStatisticsDTO;
+import com.diagbot.dto.LevelStatisticsDTO;
+import com.diagbot.dto.NumDTO;
 import com.diagbot.dto.RespDTO;
 import com.diagbot.facade.ConsoleFacade;
+import com.diagbot.vo.FilterOrderVO;
+import com.diagbot.vo.FilterPageVO;
 import com.diagbot.vo.FilterVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -13,6 +19,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import springfox.documentation.annotations.ApiIgnore;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -29,7 +36,7 @@ public class ConsoleController {
     @Autowired
     private ConsoleFacade consoleFacade;
 
-    //-----------------------聚合接口开始-------------------------------
+    //region-----------------------聚合接口开始-------------------------------
     @ApiOperation(value = "病历相关统计[by:zhaops]",
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/mrStatistics")
@@ -59,9 +66,9 @@ public class ConsoleController {
         Map<String, Object> data = consoleFacade.averageStatistics(filterVO);
         return RespDTO.onSuc(data);
     }
-    //-----------------------聚合接口结束-------------------------------
+    //endregion-----------------------聚合接口结束-------------------------------
 
-    //-----------------------单独接口开始-------------------------------
+    //region-----------------------单独接口开始-------------------------------
 
     /**
      * 平均住院天数
@@ -188,5 +195,163 @@ public class ConsoleController {
     public RespDTO<Map<String, Object>> entryByDept(@RequestBody FilterVO filterVO) {
         return RespDTO.onSuc(consoleFacade.entryByDept(filterVO));
     }
-    //-----------------------单独接口结束-------------------------------
+    //endregion-----------------------单独接口结束-------------------------------
+
+    //region-----------------------分页接口开始-------------------------------
+
+    /**
+     * 各模块缺陷占比(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    @ApiOperation(value = "各模块缺陷占比(分页)[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
+    @PostMapping("/entryCountGroupByCasePage")
+    @SysLogger("entryCountGroupByCasePage")
+    public RespDTO<IPage<NumDTO>> entryCountGroupByCasePage(@RequestBody FilterPageVO filterPageVO) {
+        return RespDTO.onSuc(consoleFacade.entryCountGroupByCasePage(filterPageVO));
+    }
+
+    /**
+     * 各模块缺陷占比(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    @ApiOperation(value = "条目缺陷占比(分页)[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
+    @PostMapping("/entryCountGroupByEntryPage")
+    @SysLogger("entryCountGroupByEntryPage")
+    public RespDTO<IPage<NumDTO>> entryCountGroupByEntryPage(@RequestBody FilterPageVO filterPageVO) {
+        return RespDTO.onSuc(consoleFacade.entryCountGroupByEntryPage(filterPageVO));
+    }
+
+    /**
+     * 按科室统计平均住院天数(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    @ApiOperation(value = "按科室统计平均住院天数(分页)[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年<br>" +
+                    "dateType: 时间类型 1-本月/本年,2-上月/去年,3-去年本月/去年<br>")
+    @PostMapping("/getAverageDayNumPage")
+    @SysLogger("getAverageDayNumPage")
+    public RespDTO<IPage<AverageStatisticsDTO>> getAverageDayNumPage(@RequestBody FilterPageVO filterPageVO) {
+        return RespDTO.onSuc(consoleFacade.getAverageDayNumPage(filterPageVO));
+    }
+
+    /**
+     * 按科室统计平均住院费用(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    @ApiOperation(value = "按科室统计平均住院费用(分页)[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年<br>" +
+                    "dateType: 时间类型 1-本月/本年,2-上月/去年,3-去年本月/去年<br>")
+    @PostMapping("/getAverageFeePage")
+    @SysLogger("getAverageFeePage")
+    public RespDTO<IPage<AverageStatisticsDTO>> getAverageFeePage(@RequestBody FilterPageVO filterPageVO) {
+        return RespDTO.onSuc(consoleFacade.getAverageFeePage(filterPageVO));
+    }
+
+    /**
+     * 各科室质控平均分(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    @ApiOperation(value = "各科室质控平均分(分页)[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
+    @PostMapping("/getAverageScoreByDeptPage")
+    @SysLogger("getAverageScoreByDeptPage")
+    public RespDTO<IPage<AverageStatisticsDTO>> getAverageScoreByDeptPage(@RequestBody FilterPageVO filterPageVO) {
+        return RespDTO.onSuc(consoleFacade.getAverageScoreByDeptPage(filterPageVO));
+    }
+
+    /**
+     * 各科室缺陷占比排行(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    @ApiOperation(value = "各科室缺陷占比排行(分页)[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
+    @PostMapping("/resultStatisticsByDeptPage")
+    @SysLogger("resultStatisticsByDeptPage")
+    public RespDTO<IPage<NumDTO>> resultStatisticsByDeptPage(@RequestBody FilterPageVO filterPageVO) {
+        return RespDTO.onSuc(consoleFacade.resultStatisticsByDeptPage(filterPageVO));
+    }
+
+    /**
+     * 各科室甲级病历占比排行(分页)
+     *
+     * @param filterPageVO
+     * @return
+     */
+    @ApiOperation(value = "各科室甲级病历占比排行(分页)[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
+    @PostMapping("/levelPercentGroupByDeptPage")
+    @SysLogger("levelPercentGroupByDeptPage")
+    public RespDTO<IPage<NumDTO>> levelPercentGroupByDeptPage(@RequestBody FilterPageVO filterPageVO) {
+        return RespDTO.onSuc(consoleFacade.levelPercentGroupByDeptPage(filterPageVO));
+    }
+
+    //endregion-----------------------分页接口结束-------------------------------
+
+    /**
+     * 各科室缺陷占比(组合)
+     *
+     * @param filterOrderVO
+     * @return
+     */
+    @ApiOperation(value = "各科室缺陷占比(组合)[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
+                    "level: 病历等级 <br>" +
+                    "name: 科室名称 <br>" +
+                    "asc: 排序(升序) <br>" +
+                    "desc: 排序(降序) <br>")
+    @PostMapping("/levelStatistics")
+    @SysLogger("levelStatistics")
+    public RespDTO<List<LevelStatisticsDTO>> levelStatistics(@RequestBody FilterOrderVO filterOrderVO) {
+        return RespDTO.onSuc(consoleFacade.levelStatistics(filterOrderVO));
+    }
+
+    /**
+     * 病案首页合格率占比
+     *
+     * @param filterOrderVO
+     * @return
+     */
+    @ApiOperation(value = "病案首页合格率占比[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
+                    "level: 病历等级 <br>" +
+                    "name: 科室名称 <br>" +
+                    "asc: 排序(升序) <br>" +
+                    "desc: 排序(降序) <br>")
+    @PostMapping("/homePageLevelStatistics")
+    @SysLogger("homePageLevelStatistics")
+    public RespDTO<List<LevelStatisticsDTO>> homePageLevelStatistics(@RequestBody FilterOrderVO filterOrderVO) {
+        return RespDTO.onSuc(consoleFacade.homePageLevelStatistics(filterOrderVO));
+    }
+
+    /**
+     * 病案首页合格率占比(首页)
+     *
+     * @param filterOrderVO
+     * @return
+     */
+    @ApiOperation(value = "病案首页合格率占比(首页)[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
+                    "level: 病历等级 <br>" +
+                    "name: 科室名称 <br>" +
+                    "asc: 排序(升序) <br>" +
+                    "desc: 排序(降序) <br>")
+    @PostMapping("/homePageLevelLimit")
+    @SysLogger("homePageLevelLimit")
+    public RespDTO<List<LevelStatisticsDTO>> homePageLevelLimit(@RequestBody FilterOrderVO filterOrderVO) {
+        return RespDTO.onSuc(consoleFacade.homePageLevelLimit(filterOrderVO));
+    }
 }

+ 75 - 0
src/main/java/com/diagbot/web/ModelHospitalController.java

@@ -0,0 +1,75 @@
+package com.diagbot.web;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.annotation.SysLogger;
+import com.diagbot.dto.ModelHospitalAllDTO;
+import com.diagbot.dto.RespDTO;
+import com.diagbot.facade.ModelHospitalFacade;
+import com.diagbot.vo.ModelHospitalAllVO;
+import com.diagbot.vo.ModelHospitalIdVO;
+import com.diagbot.vo.ModelHospitalUpdataVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author wangfeng
+ * @since 2020-05-15
+ */
+@RestController
+@RequestMapping("/qc/modelHospital")
+@Api(value = "医院数据模块相关接口API", tags = { "医院数据模块相关接口API" })
+@SuppressWarnings("unchecked")
+public class ModelHospitalController {
+
+    @Autowired
+    ModelHospitalFacade modelHospitalFacade;
+
+    @ApiOperation(value = "获取全部条目[by:wangfeng]",
+            notes = "获取全部条目")
+    @PostMapping("/getModelHospitalAll")
+    @SysLogger("getModelHospitalAll")
+    public RespDTO<IPage<List<ModelHospitalAllDTO>>> getModelHospitalAll(@RequestBody ModelHospitalAllVO modelHospitalAllVO) {
+        IPage<List<ModelHospitalAllDTO>> data = modelHospitalFacade.getModelHospitalAlls(modelHospitalAllVO);
+        return RespDTO.onSuc(data);
+    }
+
+    @ApiOperation(value = "根据id获取医院数据[by:wangfeng]",
+            notes = "根据id获取医院数据")
+    @PostMapping("/getModelHospitalById")
+    @SysLogger("getModelHospitalById")
+    public RespDTO<ModelHospitalAllDTO> getModelHospitalById(@RequestBody ModelHospitalIdVO modelHospitalIdVO) {
+        ModelHospitalAllDTO data = modelHospitalFacade.getModelHospitalById(modelHospitalIdVO.getModeId());
+        return RespDTO.onSuc(data);
+    }
+    @ApiOperation(value = "添加和修改医院数据模块[by:wangfeng]",
+            notes = "添加和修改医院数据模块")
+    @PostMapping("/saveAndupdataModel")
+    @SysLogger("saveAndupdataModel")
+    public RespDTO<Boolean> updataModelHospital(@RequestBody ModelHospitalUpdataVO modelHospitalUpdataVO) {
+        Boolean res = modelHospitalFacade.updataModelHospitals(modelHospitalUpdataVO);
+        return RespDTO.onSuc(res);
+    }
+
+    @ApiOperation(value = "删除医院数据模块[by:wangfeng]",
+            notes = "删除医院数据模块")
+    @PostMapping("/clearModelHospital")
+    @SysLogger("clearModelHospital")
+    public RespDTO<Boolean> clearModelHospital(@RequestBody ModelHospitalIdVO modelHospitalIdVO) {
+        Boolean res = modelHospitalFacade.clearModelHospital(modelHospitalIdVO.getModeId());
+        return RespDTO.onSuc(res);
+    }
+
+
+}

+ 69 - 0
src/main/java/com/diagbot/web/QcAbnormalController.java

@@ -0,0 +1,69 @@
+package com.diagbot.web;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.annotation.SysLogger;
+import com.diagbot.dto.QcAbnormalDTO;
+import com.diagbot.dto.RespDTO;
+import com.diagbot.facade.QcAbnormalFacade;
+import com.diagbot.vo.QcAbnormalDelVO;
+import com.diagbot.vo.QcAbnormalSaveVO;
+import com.diagbot.vo.QcAbnormalVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+/**
+ * <p>
+ * 异常数据监控信息 前端控制器
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-05-15
+ */
+@RequestMapping("/qc/abnormal")
+@RestController
+@Api(value = "异常数据监控相关API", tags = { "异常数据监控相关API" })
+@SuppressWarnings("unchecked")
+public class QcAbnormalController {
+    @Autowired
+    private QcAbnormalFacade qcAbnormalFacade;
+
+    @ApiOperation(value = "查询异常数据监控信息[by:gaodm]",
+            notes = "behospitalCode: 病人住院ID<br>" +
+                    "type: 异常类型(1:数据模块 2:质控类型 3:XML结构)<br>" +
+                    "status: 状态(0:未处理,1:已处理)<br>" +
+                    "statisticsType: 统计维度 1-本月,2-本年<br>")
+    @PostMapping("/getQcAnnormal")
+    @SysLogger("getQcAnnormal")
+    public RespDTO<IPage<QcAbnormalDTO>> getQcAnnormal(@RequestBody QcAbnormalVO qcAbnormalVO) {
+        return RespDTO.onSuc(qcAbnormalFacade.getQcAnnormalFac(qcAbnormalVO));
+    }
+
+    @ApiOperation(value = "更新异常数据监控信息[by:gaodm]",
+            notes = "id: 异常数据监控ID<br>" +
+                    "status: 状态(0:未处理,1:已处理)<br>" +
+                    "remark: 备注<br>")
+    @PostMapping("/saveQcAnnormal")
+    @SysLogger("saveQcAnnormal")
+    @Transactional
+    public RespDTO<Boolean> saveQcAnnormal(@RequestBody @Valid QcAbnormalSaveVO qcAbnormalSaveVO) {
+        return RespDTO.onSuc(qcAbnormalFacade.saveQcAnnormal(qcAbnormalSaveVO));
+    }
+
+    @ApiOperation(value = "删除异常数据监控信息[by:gaodm]",
+            notes = "id: 异常数据监控ID<br>")
+    @PostMapping("/delQcAnnormal")
+    @SysLogger("delQcAnnormal")
+    @Transactional
+    public RespDTO<Boolean> delQcAnnormal(@RequestBody @Valid QcAbnormalDelVO qcAbnormalDelVO) {
+        return RespDTO.onSuc(qcAbnormalFacade.delQcAnnormal(qcAbnormalDelVO));
+    }
+}

+ 30 - 13
src/main/java/com/diagbot/web/QcModeController.java

@@ -1,10 +1,19 @@
 package com.diagbot.web;
 
 
+import com.diagbot.annotation.SysLogger;
+import com.diagbot.dto.QcModeAllDTO;
+import com.diagbot.dto.RespDTO;
+import com.diagbot.facade.QcModeFacade;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 /**
  * <p>
  * 菜单 前端控制器
@@ -15,20 +24,28 @@ import org.springframework.web.bind.annotation.RestController;
  */
 @RestController
 @RequestMapping("/qc/mode")
-@Api(value = "菜单相关API", tags = { "菜单相关API" })
+@Api(value = "医院模块菜单相关API", tags = { "医院模块菜单相关API" })
 @SuppressWarnings("unchecked")
-@Deprecated
 public class QcModeController {
 
-//    @Autowired
-//    QcModeFacade qcModeFacade;
-//
-//    @ApiOperation(value = "获取菜单信息[by:zhoutg]",
-//            notes = "")
-//    @PostMapping("/getMenu")
-//    @SysLogger("getMenu")
-//    public RespDTO<List<QcModeDTO> > getMenu() {
-//        List<QcModeDTO> data = qcModeFacade.getMenu();
-//        return RespDTO.onSuc(data);
-//    }
+        @Autowired
+        QcModeFacade qcModeFacade;
+    //
+    //    @ApiOperation(value = "获取菜单信息[by:zhoutg]",
+    //            notes = "")
+    //    @PostMapping("/getMenu")
+    //    @SysLogger("getMenu")
+    //    public RespDTO<List<QcModeDTO> > getMenu() {
+    //        List<QcModeDTO> data = qcModeFacade.getMenu();
+    //        return RespDTO.onSuc(data);
+    //    }
+    @ApiOperation(value = "获取医院全部模块[by:wangfeng]",
+            notes = "获取医院全部模块")
+    @PostMapping("/getModes")
+    @SysLogger("getModes")
+    public RespDTO<List<QcModeAllDTO>> getModeAlls() {
+
+        return RespDTO.onSuc(qcModeFacade.getModeAll());
+    }
+
 }

+ 1 - 1
src/main/java/com/diagbot/web/SysRoleController.java

@@ -48,7 +48,7 @@ public class SysRoleController {
     @PostMapping("/listForUser")
     @SysLogger("listForUser")
     public RespDTO<List<SysRoleDTO>> listForUser() {
-        return RespDTO.onSuc(sysRoleFacade.listForUser());
+        return RespDTO.onSuc(sysRoleFacade.listFac());
     }
 
     @ApiOperation(value = "获取角色菜权限单等数据[by:gaodm]",

+ 1 - 1
src/main/resources/mapper/BasDeptInfoMapper.xml

@@ -57,7 +57,7 @@
     </select>
 
     <!-- 查询用户关联科室 -->
-    <select id="getDeptByUser" parameterType="com.diagbot.vo.FilterByDeptVO" resultType="com.diagbot.dto.DeptBaseDTO">
+    <select id="getDeptByUser" parameterType="com.diagbot.vo.FilterVO" resultType="com.diagbot.dto.DeptBaseDTO">
         SELECT
         b.dept_id as deptId,
         b.dept_name as deptName

+ 696 - 36
src/main/resources/mapper/BehospitalInfoMapper.xml

@@ -130,20 +130,24 @@
         (
         (
         SELECT
-        c.msg,
+        d.msg,
         count(*) AS num
         FROM
         med_behospital_info a,
-        med_qcresult_info b,
-        med_qcresult_detail c
+        med_home_page b,
+        med_qcresult_info c,
+        med_qcresult_detail d
         WHERE
         a.behospital_code = b.behospital_code
         AND a.hospital_id = b.hospital_id
-        AND b.behospital_code = c.behospital_code
-        AND b.hospital_id = c.hospital_id
+        AND a.behospital_code = c.behospital_code
+        AND a.hospital_id = c.hospital_id
+        AND a.behospital_code = d.behospital_code
+        AND a.hospital_id = d.hospital_id
         AND a.is_deleted = 'N'
         AND b.is_deleted = 'N'
         AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
         <![CDATA[AND a.qc_type_id <>0 ]]>
         <if test="hospitalId != null and hospitalId != ''">
             AND a.hospital_id = #{hospitalId}
@@ -155,7 +159,7 @@
             <![CDATA[AND a.leave_hospital_date < DATE(#{endDate})]]>
         </if>
         GROUP BY
-        c.msg
+        d.msg
         ORDER BY
         count(*) DESC
         ) t1,
@@ -164,16 +168,20 @@
         count(*) AS totle
         FROM
         med_behospital_info a,
-        med_qcresult_info b,
-        med_qcresult_detail c
+        med_home_page b,
+        med_qcresult_info c,
+        med_qcresult_detail d
         WHERE
         a.behospital_code = b.behospital_code
         AND a.hospital_id = b.hospital_id
-        AND b.behospital_code = c.behospital_code
-        AND b.hospital_id = c.hospital_id
+        AND a.behospital_code = c.behospital_code
+        AND a.hospital_id = c.hospital_id
+        AND a.behospital_code = d.behospital_code
+        AND a.hospital_id = d.hospital_id
         AND a.is_deleted = 'N'
         AND b.is_deleted = 'N'
         AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
         <![CDATA[AND a.qc_type_id <>0 ]]>
         <if test="hospitalId != null and hospitalId != ''">
             AND a.hospital_id = #{hospitalId}
@@ -206,16 +214,20 @@
         count(*) AS num
         FROM
         med_behospital_info a,
-        med_qcresult_info b,
-        med_qcresult_detail c
+        med_home_page b,
+        med_qcresult_info c,
+        med_qcresult_detail d
         WHERE
         a.behospital_code = b.behospital_code
         AND a.hospital_id = b.hospital_id
-        AND b.behospital_code = c.behospital_code
-        AND b.hospital_id = c.hospital_id
+        AND a.behospital_code = c.behospital_code
+        AND a.hospital_id = c.hospital_id
+        AND a.behospital_code = d.behospital_code
+        AND a.hospital_id = d.hospital_id
         AND a.is_deleted = 'N'
         AND b.is_deleted = 'N'
         AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
         <![CDATA[AND a.qc_type_id <>0 ]]>
         <if test="hospitalId != null and hospitalId != ''">
             AND a.hospital_id = #{hospitalId}
@@ -237,16 +249,20 @@
         count(*) AS totle
         FROM
         med_behospital_info a,
-        med_qcresult_info b,
-        med_qcresult_detail c
+        med_home_page b,
+        med_qcresult_info c,
+        med_qcresult_detail d
         WHERE
         a.behospital_code = b.behospital_code
         AND a.hospital_id = b.hospital_id
-        AND b.behospital_code = c.behospital_code
-        AND b.hospital_id = c.hospital_id
+        AND a.behospital_code = c.behospital_code
+        AND a.hospital_id = c.hospital_id
+        AND a.behospital_code = d.behospital_code
+        AND a.hospital_id = d.hospital_id
         AND a.is_deleted = 'N'
         AND b.is_deleted = 'N'
         AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
         <![CDATA[AND a.qc_type_id <>0 ]]>
         <if test="hospitalId != null and hospitalId != ''">
             AND a.hospital_id = #{hospitalId}
@@ -264,20 +280,25 @@
     <!-- 缺陷排行列表 -->
     <select id="resultStatistics2"  parameterType="com.diagbot.vo.FilterVO" resultType="com.diagbot.dto.NumDTO">
         SELECT
-        c.msg as name,
+        d.msg as name,
         count(*) AS num
         FROM
+        FROM
         med_behospital_info a,
-        med_qcresult_info b,
-        med_qcresult_detail c
+        med_home_page b,
+        med_qcresult_info c,
+        med_qcresult_detail d
         WHERE
         a.behospital_code = b.behospital_code
         AND a.hospital_id = b.hospital_id
-        AND b.behospital_code = c.behospital_code
-        AND b.hospital_id = c.hospital_id
+        AND a.behospital_code = c.behospital_code
+        AND a.hospital_id = c.hospital_id
+        AND a.behospital_code = d.behospital_code
+        AND a.hospital_id = d.hospital_id
         AND a.is_deleted = 'N'
         AND b.is_deleted = 'N'
         AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
         <![CDATA[AND a.qc_type_id <>0 ]]>
         <if test="hospitalId != null and hospitalId != ''">
             AND a.hospital_id = #{hospitalId}
@@ -289,7 +310,7 @@
             <![CDATA[AND a.leave_hospital_date < DATE(#{endDate})]]>
         </if>
         GROUP BY
-        c.msg
+        d.msg
         ORDER BY
         count(*) DESC
         <if test="limitCount != null and limitCount != ''">
@@ -305,16 +326,20 @@
         count(*) AS num
         FROM
         med_behospital_info a,
-        med_qcresult_info b,
-        med_qcresult_detail c
+        med_home_page b,
+        med_qcresult_info c,
+        med_qcresult_detail d
         WHERE
         a.behospital_code = b.behospital_code
         AND a.hospital_id = b.hospital_id
-        AND b.behospital_code = c.behospital_code
-        AND b.hospital_id = c.hospital_id
+        AND a.behospital_code = c.behospital_code
+        AND a.hospital_id = c.hospital_id
+        AND a.behospital_code = d.behospital_code
+        AND a.hospital_id = d.hospital_id
         AND a.is_deleted = 'N'
         AND b.is_deleted = 'N'
         AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
         <![CDATA[AND a.qc_type_id <>0 ]]>
         <if test="hospitalId != null and hospitalId != ''">
             AND a.hospital_id = #{hospitalId}
@@ -338,16 +363,20 @@
         count(*) AS totle
         FROM
         med_behospital_info a,
-        med_qcresult_info b,
-        med_qcresult_detail c
+        med_home_page b,
+        med_qcresult_info c,
+        med_qcresult_detail d
         WHERE
         a.behospital_code = b.behospital_code
         AND a.hospital_id = b.hospital_id
-        AND b.behospital_code = c.behospital_code
-        AND b.hospital_id = c.hospital_id
+        AND a.behospital_code = c.behospital_code
+        AND a.hospital_id = c.hospital_id
+        AND a.behospital_code = d.behospital_code
+        AND a.hospital_id = d.hospital_id
         AND a.is_deleted = 'N'
         AND b.is_deleted = 'N'
         AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
         <![CDATA[AND a.qc_type_id <>0 ]]>
         <if test="hospitalId != null and hospitalId != ''">
             AND a.hospital_id = #{hospitalId}
@@ -376,6 +405,9 @@
             AND a.behospital_code = b.behospital_code
             )
          and a.qc_type_id != 0
+         <if test="leaveDate != null">
+             <![CDATA[ and a.leave_hospital_date < #{leaveDate}]]>
+         </if>
     </select>
 
     <!--质控评分(科室)分页-->
@@ -547,7 +579,7 @@
     <!-- 病案首页手术病历数统计 -->
     <select id="homePageCountForOperation" parameterType="com.diagbot.vo.FilterVO" resultType="int">
         SELECT
-        COUNT(*)
+        COUNT(DISTINCT a.behospital_code)
         FROM
         med_behospital_info a,
         med_home_page b,
@@ -573,7 +605,7 @@
     </select>
 
     <!-- 按科室统计病案首页病历数 -->
-    <select id="homePageCountByDept" parameterType="com.diagbot.vo.HPFilterByDeptVO" resultType="com.diagbot.dto.NumDTO">
+    <select id="homePageCountByDept" parameterType="com.diagbot.vo.HomePageFilterVO" resultType="com.diagbot.dto.NumDTO">
         SELECT
         a.beh_dept_id AS id,
         a.beh_dept_name AS NAME,
@@ -612,11 +644,11 @@
     </select>
 
     <!-- 按科室病案首页手术病历数 -->
-    <select id="homePageCountForOperationByDept" parameterType="com.diagbot.vo.FilterByDeptVO" resultType="com.diagbot.dto.NumDTO">
+    <select id="homePageCountForOperationByDept" parameterType="com.diagbot.vo.FilterVO" resultType="com.diagbot.dto.NumDTO">
         SELECT
         a.beh_dept_id AS id,
         a.beh_dept_name AS NAME,
-        COUNT(*) AS num
+        COUNT(DISTINCT a.behospital_code) AS num
         FROM
         med_behospital_info a,
         med_home_page b,
@@ -650,4 +682,632 @@
         a.beh_dept_id,
         a.beh_dept_name
     </select>
+
+    <!-- 各科室缺陷占比排行(分页) -->
+    <select id="resultStatisticsByDeptPage" resultType="com.diagbot.dto.NumDTO">
+        SELECT t.*
+        FROM
+        (SELECT
+        t1.beh_dept_name AS NAME,
+        t1.num AS num,
+        t2.totle AS totleNum,
+        round( t1.num / t2.totle, 4 ) AS percent,
+        concat( round( t1.num / t2.totle * 100, 2 ), '%' ) AS percentStr
+        FROM
+        (
+        SELECT
+        a.beh_dept_id,
+        a.beh_dept_name,
+        count(*) AS num
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_info c,
+        med_qcresult_detail d
+        WHERE
+        a.behospital_code = b.behospital_code
+        AND a.hospital_id = b.hospital_id
+        AND a.behospital_code = c.behospital_code
+        AND a.hospital_id = c.hospital_id
+        AND a.behospital_code = d.behospital_code
+        AND a.hospital_id = d.hospital_id
+        AND a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="filterPageVO.hospitalId != null and filterPageVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageVO.hospitalId}
+        </if>
+        <if test="filterPageVO.startDate != null and filterPageVO.startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageVO.startDate})]]>
+        </if>
+        <if test="filterPageVO.endDate != null and filterPageVO.endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageVO.endDate})]]>
+        </if>
+        <if test="filterPageVO.name != null and filterPageVO.name != ''">
+            AND a.beh_dept_name like CONCAT('%', #{filterPageVO.name},'%')
+        </if>
+        GROUP BY
+        a.beh_dept_id,
+        a.beh_dept_name
+        ORDER BY
+        count(*) DESC
+        ) t1,
+        (
+        SELECT
+        count(*) AS totle
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_info c,
+        med_qcresult_detail d
+        WHERE
+        a.behospital_code = b.behospital_code
+        AND a.hospital_id = b.hospital_id
+        AND a.behospital_code = c.behospital_code
+        AND a.hospital_id = c.hospital_id
+        AND a.behospital_code = d.behospital_code
+        AND a.hospital_id = d.hospital_id
+        AND a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="filterPageVO.hospitalId != null and filterPageVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageVO.hospitalId}
+        </if>
+        <if test="filterPageVO.startDate != null and filterPageVO.startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageVO.startDate})]]>
+        </if>
+        <if test="filterPageVO.endDate != null and filterPageVO.endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageVO.endDate})]]>
+        </if>
+        <if test="filterPageVO.name != null and filterPageVO.name != ''">
+            AND a.beh_dept_name like CONCAT('%', #{filterPageVO.name},'%')
+        </if>
+        ) t2
+        )t
+    </select>
+
+    <!-- 科室缺陷占比(主任医生) -->
+    <select id="resultStatisticsByDeptAndDoctorPage" resultType="com.diagbot.dto.DeptNumDTO">
+        SELECT
+        t.*
+        FROM
+        (
+        SELECT
+        t1.NAME,
+        t1.num AS num,
+        t2.totle AS totleNum,
+        round( t1.num / t2.totle, 4 ) AS percent,
+        concat( round( t1.num / t2.totle * 100, 2 ), '%' ) AS percentStr
+        FROM
+        (
+        SELECT
+        d.msg as name,
+        count(*) AS num
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_info c,
+        med_qcresult_detail d,
+        sys_user_dept e
+        WHERE
+        a.behospital_code = b.behospital_code
+        AND a.hospital_id = b.hospital_id
+        AND a.behospital_code = c.behospital_code
+        AND a.hospital_id = c.hospital_id
+        AND a.behospital_code = d.behospital_code
+        AND a.hospital_id = d.hospital_id
+        AND a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        AND e.is_deleted = 'N'
+        AND a.beh_dept_id = e.dept_id
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="filterPageByDeptVO.userId!=null">
+            AND e.user_id = #{filterPageByDeptVO.userId}
+        </if>
+        <if test="filterPageByDeptVO.hospitalId != null and filterPageByDeptVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageByDeptVO.hospitalId}
+        </if>
+        <if test="filterPageByDeptVO.startDate != null and filterPageByDeptVO.startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageByDeptVO.startDate})]]>
+        </if>
+        <if test="filterPageByDeptVO.endDate != null and filterPageByDeptVO.endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageByDeptVO.endDate})]]>
+        </if>
+        <if test="filterPageByDeptVO.name != null and filterPageByDeptVO.name != ''">
+            AND d.msg like CONCAT('%', #{filterPageByDeptVO.name},'%')
+        </if>
+        <if test="filterPageByDeptVO.doctorName != null and filterPageByDeptVO.doctorName != ''">
+            AND a.doctor_name = #{filterPageByDeptVO.name}
+        </if>
+        <if test="filterPageByDeptVO.deptName != null and filterPageByDeptVO.deptName != ''">
+            AND a.beh_dept_name = #{filterPageByDeptVO.deptName}
+        </if>
+        GROUP BY
+        d.msg
+        ORDER BY
+        count(*) DESC
+        ) t1,
+        (
+        SELECT
+        count(*) AS totle
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_info c,
+        med_qcresult_detail d,
+        sys_user_dept e
+        WHERE
+        a.behospital_code = b.behospital_code
+        AND a.hospital_id = b.hospital_id
+        AND a.behospital_code = c.behospital_code
+        AND a.hospital_id = c.hospital_id
+        AND a.behospital_code = d.behospital_code
+        AND a.hospital_id = d.hospital_id
+        AND a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        AND e.is_deleted = 'N'
+        AND a.beh_dept_id = e.dept_id
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="filterPageByDeptVO.userId!=null">
+            AND e.user_id = #{filterPageByDeptVO.userId}
+        </if>
+        <if test="filterPageByDeptVO.hospitalId != null and filterPageByDeptVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageByDeptVO.hospitalId}
+        </if>
+        <if test="filterPageByDeptVO.startDate != null and filterPageByDeptVO.startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageByDeptVO.startDate})]]>
+        </if>
+        <if test="filterPageByDeptVO.endDate != null and filterPageByDeptVO.endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageByDeptVO.endDate})]]>
+        </if>
+        <if test="filterPageByDeptVO.name != null and filterPageByDeptVO.name != ''">
+            AND d.msg like CONCAT('%', #{filterPageByDeptVO.name},'%')
+        </if>
+        <if test="filterPageByDeptVO.doctorName != null and filterPageByDeptVO.doctorName != ''">
+            AND a.doctor_name = #{filterPageByDeptVO.name}
+        </if>
+        <if test="filterPageByDeptVO.deptName != null and filterPageByDeptVO.deptName != ''">
+            AND a.beh_dept_name = #{filterPageByDeptVO.deptName}
+        </if>
+        ) t2
+        )t
+    </select>
+
+
+    <!-- 各科室缺陷占比(组合) -->
+    <select id="levelStatistics" parameterType="com.diagbot.vo.FilterOrderVO" resultType="com.diagbot.dto.LevelStatisticsDTO">
+        SELECT
+        a.beh_dept_id AS deptId,
+        a.beh_dept_name AS deptName,
+        count( DISTINCT d.id ) AS entryNum,
+        count( DISTINCT c.id ) AS mrNum,
+        ROUND( sum( c.score_res ), 2 ) AS totleValue,
+        ROUND( sum( c.score_res )/ count(*), 2 ) AS averageValue,
+        COUNT( DISTINCT CASE WHEN c.`level` = '甲' THEN c.id END ) AS firstLevelNum,
+        COUNT( DISTINCT CASE WHEN c.`level` = '乙' THEN c.id END ) AS secondLevelNum,
+        COUNT( DISTINCT CASE WHEN c.`level` = '丙' THEN c.id END ) AS thirdLevelNum,
+        ROUND( COUNT( DISTINCT CASE WHEN c.`level` = '甲' THEN c.id END )/ count( DISTINCT c.id ), 4 ) AS firstLevelPercent,
+        ROUND( COUNT( DISTINCT CASE WHEN c.`level` = '乙' THEN c.id END )/ count( DISTINCT c.id ), 4 ) AS secondLevelPercent,
+        1-ROUND ( COUNT( DISTINCT CASE WHEN c.`level` = '甲' THEN c.id END )/ count( DISTINCT c.id ), 4 ) - ROUND( COUNT( DISTINCT CASE WHEN c.`level` = '乙' THEN c.id END )/ count( DISTINCT c.id ), 4 ) AS thirdLevelPercent,
+        concat(
+        ROUND( COUNT( DISTINCT CASE WHEN c.`level` = '甲' THEN c.id END )/ count( DISTINCT c.id )* 100, 2 ),
+        '%'
+        ) AS firstLevelPercentStr,
+        concat(
+        ROUND( COUNT( DISTINCT CASE WHEN c.`level` = '乙' THEN c.id END )/ count( DISTINCT c.id )* 100, 2 ),
+        '%'
+        ) AS sencondLevelPercentStr,
+        concat(
+        (
+        100-ROUND ( COUNT( DISTINCT CASE WHEN c.`level` = '甲' THEN c.id END )/ count( DISTINCT c.id )* 100, 2 ) - ROUND( COUNT( DISTINCT CASE WHEN c.`level` = '乙' THEN c.id END )/ count( DISTINCT c.id )* 100, 2 )),
+        '%'
+        ) AS thirdLevelPercentStr
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_info c,
+        med_qcresult_detail d
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.hospital_id = c.hospital_id
+        AND a.hospital_id = d.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.behospital_code = c.behospital_code
+        AND a.behospital_code = d.behospital_code
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="hospitalId != null and hospitalId != ''">
+            AND a.hospital_id = #{hospitalId}
+        </if>
+        <if test="startDate != null and startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{startDate})]]>
+        </if>
+        <if test="endDate != null and endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{endDate})]]>
+        </if>
+        <if test="level != null and level != ''">
+            and c.level = #{level}
+        </if>
+        <if test="name != null and name != ''">
+            and a.beh_dept_name like CONCAT('%',#{name},'%')
+        </if>
+        GROUP BY
+        a.beh_dept_id,
+        a.beh_dept_name
+        <if test="asc != null and asc !=''">
+            order by
+            <choose>
+                <when test='asc=="deptId"'>deptId asc</when>
+                <when test='asc=="deptName"'>deptName asc</when>
+                <when test='asc=="entryNum"'>entryNum asc</when>
+                <when test='asc=="mrNum"'>mrNum asc</when>
+                <when test='asc=="totleValue"'>totleValue asc</when>
+                <when test='asc=="averageValue"'>averageValue asc</when>
+                <when test='asc=="firstLevelNum"'>firstLevelNum asc</when>
+                <when test='asc=="secondLevelNum"'>secondLevelNum asc</when>
+                <when test='asc=="thirdLevelNum"'>thirdLevelNum asc</when>
+                <when test='asc=="firstLevelPercent"'>firstLevelPercent asc</when>
+                <when test='asc=="secondLevelPercent"'>secondLevelPercent asc</when>
+                <when test='asc=="thirdLevelPercent"'>thirdLevelPercent asc</when>
+                <when test='asc=="firstLevelPercentStr"'>firstLevelPercent asc</when>
+                <when test='asc=="secondLevelPercentStr"'>secondLevelPercent asc</when>
+                <when test='asc=="thirdLevelPercentStr"'>thirdLevelPercent asc</when>
+                <otherwise> deptName asc </otherwise>
+            </choose>
+        </if>
+        <if test="desc != null and desc!=''">
+            order by
+            <choose>
+                <when test='desc=="deptId"'>deptId desc</when>
+                <when test='desc=="deptName"'>deptName desc</when>
+                <when test='desc=="entryNum"'>entryNum desc</when>
+                <when test='desc=="mrNum"'>mrNum desc</when>
+                <when test='desc=="totleValue"'>totleValue desc</when>
+                <when test='desc=="averageValue"'>averageValue desc</when>
+                <when test='desc=="firstLevelNum"'>firstLevelNum desc</when>
+                <when test='desc=="secondLevelNum"'>secondLevelNum desc</when>
+                <when test='desc=="thirdLevelNum"'>thirdLevelNum desc</when>
+                <when test='desc=="firstLevelPercent"'>firstLevelPercent desc</when>
+                <when test='desc=="secondLevelPercent"'>secondLevelPercent desc</when>
+                <when test='desc=="thirdLevelPercent"'>thirdLevelPercent desc</when>
+                <when test='desc=="firstLevelPercentStr"'>firstLevelPercent desc</when>
+                <when test='desc=="secondLevelPercentStr"'>secondLevelPercent desc</when>
+                <when test='desc=="thirdLevelPercentStr"'>thirdLevelPercent desc</when>
+                <otherwise> deptName desc </otherwise>
+            </choose>
+        </if>
+    </select>
+
+    <!-- 病案首页合格率占比 -->
+    <select id="homePageLevelStatistics" parameterType="com.diagbot.vo.FilterOrderVO" resultType="com.diagbot.dto.LevelStatisticsDTO">
+        SELECT
+        a.beh_dept_id AS deptId,
+        a.beh_dept_name AS deptName,
+        count( DISTINCT d.id ) AS entryNum,
+        count( DISTINCT c.id ) AS mrNum,
+        ROUND( sum( c.score_res ), 2 ) AS totleValue,
+        ROUND( sum( c.score_res )/ count(*), 2 ) AS averageValue,
+        COUNT( DISTINCT CASE WHEN c.`level` = '合格' THEN c.id END ) AS firstLevelNum,
+        COUNT( DISTINCT CASE WHEN c.`level` = '不合格' THEN c.id END ) AS secondLevelNum,
+        ROUND( COUNT( DISTINCT CASE WHEN c.`level` = '合格' THEN c.id END )/ count( DISTINCT c.id ), 4 ) AS firstLevelPercent,
+        1-ROUND ( COUNT( DISTINCT CASE WHEN c.`level` = '合格' THEN c.id END )/ count( DISTINCT c.id ), 4 ) AS secondLevelPercent,
+        concat(
+        ROUND( COUNT( DISTINCT CASE WHEN c.`level` = '合格' THEN c.id END )/ count( DISTINCT c.id )* 100, 2 ),
+        '%'
+        ) AS firstLevelPercentStr,
+        concat(
+        100-ROUND ( COUNT( DISTINCT CASE WHEN c.`level` = '合格' THEN c.id END )/ count( DISTINCT c.id )* 100, 2 ),
+        '%'
+        ) AS secondLevelPercentStr
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_cases c,
+        med_qcresult_detail d
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.hospital_id = c.hospital_id
+        AND a.hospital_id = d.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.behospital_code = c.behospital_code
+        AND a.behospital_code = d.behospital_code
+        AND c.cases_id = d.cases_id
+        AND c.cases_id = 243
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="hospitalId != null and hospitalId != ''">
+            AND a.hospital_id = #{hospitalId}
+        </if>
+        <if test="startDate != null and startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{startDate})]]>
+        </if>
+        <if test="endDate != null and endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{endDate})]]>
+        </if>
+        <if test="level != null and level != ''">
+            and c.level = #{level}
+        </if>
+        <if test="name != null and name != ''">
+            and a.beh_dept_name like CONCAT('%',#{name},'%')
+        </if>
+        GROUP BY
+        a.beh_dept_id,
+        a.beh_dept_name
+        <if test="asc != null and asc !=''">
+            order by
+            <choose>
+                <when test='asc=="deptId"'>deptId asc</when>
+                <when test='asc=="deptName"'>deptName asc</when>
+                <when test='asc=="entryNum"'>entryNum asc</when>
+                <when test='asc=="mrNum"'>mrNum asc</when>
+                <when test='asc=="totleValue"'>totleValue asc</when>
+                <when test='asc=="averageValue"'>averageValue asc</when>
+                <when test='asc=="firstLevelNum"'>firstLevelNum asc</when>
+                <when test='asc=="secondLevelNum"'>secondLevelNum asc</when>
+                <when test='asc=="firstLevelPercent"'>firstLevelPercent asc</when>
+                <when test='asc=="secondLevelPercent"'>secondLevelPercent asc</when>
+                <when test='asc=="firstLevelPercentStr"'>firstLevelPercent asc</when>
+                <when test='asc=="secondLevelPercentStr"'>secondLevelPercent asc</when>
+                <otherwise> deptName asc </otherwise>
+            </choose>
+        </if>
+        <if test="desc != null and desc!=''">
+            order by
+            <choose>
+                <when test='desc=="deptId"'>deptId desc</when>
+                <when test='desc=="deptName"'>deptName desc</when>
+                <when test='desc=="entryNum"'>entryNum desc</when>
+                <when test='desc=="mrNum"'>mrNum desc</when>
+                <when test='desc=="totleValue"'>totleValue desc</when>
+                <when test='desc=="averageValue"'>averageValue desc</when>
+                <when test='desc=="firstLevelNum"'>firstLevelNum desc</when>
+                <when test='desc=="secondLevelNum"'>secondLevelNum desc</when>
+                <when test='desc=="firstLevelPercent"'>firstLevelPercent desc</when>
+                <when test='desc=="secondLevelPercent"'>secondLevelPercent desc</when>
+                <when test='desc=="firstLevelPercentStr"'>firstLevelPercent desc</when>
+                <when test='desc=="secondLevelPercentStr"'>secondLevelPercent desc</when>
+                <otherwise> deptName desc </otherwise>
+            </choose>
+        </if>
+    </select>
+
+    <!-- 各科室缺陷占比(主任医生) -->
+    <select id="levelStatisticsByDept" parameterType="com.diagbot.vo.FilterOrderByDeptVO" resultType="com.diagbot.dto.LevelStatisticsDTO">
+        SELECT
+        a.doctor_id AS doctorId,
+        a.doctor_name AS doctorName,
+        count( DISTINCT d.id ) AS entryNum,
+        count( DISTINCT c.id ) AS mrNum,
+        ROUND( sum( c.score_res ), 2 ) AS totleValue,
+        ROUND( sum( c.score_res )/ count(*), 2 ) AS averageValue,
+        COUNT( DISTINCT CASE WHEN c.`level` = '甲' THEN c.id END ) AS firstLevelNum,
+        COUNT( DISTINCT CASE WHEN c.`level` = '乙' THEN c.id END ) AS secondLevelNum,
+        COUNT( DISTINCT CASE WHEN c.`level` = '丙' THEN c.id END ) AS thirdLevelNum,
+        ROUND( COUNT( DISTINCT CASE WHEN c.`level` = '甲' THEN c.id END )/ count( DISTINCT c.id ), 4 ) AS firstLevelPercent,
+        ROUND( COUNT( DISTINCT CASE WHEN c.`level` = '乙' THEN c.id END )/ count( DISTINCT c.id ), 4 ) AS secondLevelPercent,
+        1-ROUND ( COUNT( DISTINCT CASE WHEN c.`level` = '甲' THEN c.id END )/ count( DISTINCT c.id ), 4 ) - ROUND( COUNT( DISTINCT CASE WHEN c.`level` = '乙' THEN c.id END )/ count( DISTINCT c.id ), 4 ) AS thirdLevelPercent,
+        concat(
+        ROUND( COUNT( DISTINCT CASE WHEN c.`level` = '甲' THEN c.id END )/ count( DISTINCT c.id )* 100, 2 ),
+        '%'
+        ) AS firstLevelPercentStr,
+        concat(
+        ROUND( COUNT( DISTINCT CASE WHEN c.`level` = '乙' THEN c.id END )/ count( DISTINCT c.id )* 100, 2 ),
+        '%'
+        ) AS sencondLevelPercentStr,
+        concat(
+        (
+        100-ROUND ( COUNT( DISTINCT CASE WHEN c.`level` = '甲' THEN c.id END )/ count( DISTINCT c.id )* 100, 2 ) - ROUND( COUNT( DISTINCT CASE WHEN c.`level` = '乙' THEN c.id END )/ count( DISTINCT c.id )* 100, 2 )),
+        '%'
+        ) AS thirdLevelPercentStr
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_info c,
+        med_qcresult_detail d,
+        sys_user_dept e
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.hospital_id = c.hospital_id
+        AND a.hospital_id = d.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.behospital_code = c.behospital_code
+        AND a.behospital_code = d.behospital_code
+        AND a.beh_dept_id = e.dept_id
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="hospitalId != null and hospitalId != ''">
+            AND a.hospital_id = #{hospitalId}
+        </if>
+        <if test="startDate != null and startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{startDate})]]>
+        </if>
+        <if test="endDate != null and endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{endDate})]]>
+        </if>
+        <if test="level != null and level != ''">
+            and c.level = #{level}
+        </if>
+        <if test="name != null and name != ''">
+            and a.doctor_name like CONCAT('%',#{name},'%')
+        </if>
+        <if test="userId!=null and userId !=''">
+            AND e.user_id = #{userId}
+        </if>
+        <if test="deptName!=null and deptName !=''">
+            AND a.beh_dept_name = #{deptName}
+        </if>
+        GROUP BY
+        a.doctor_id,
+        a.doctor_name
+        <if test="asc != null and asc !=''">
+            order by
+            <choose>
+                <when test='asc=="doctorId"'>doctorId asc</when>
+                <when test='asc=="doctorName"'>doctorName asc</when>
+                <when test='asc=="entryNum"'>entryNum asc</when>
+                <when test='asc=="mrNum"'>mrNum asc</when>
+                <when test='asc=="totleValue"'>totleValue asc</when>
+                <when test='asc=="averageValue"'>averageValue asc</when>
+                <when test='asc=="firstLevelNum"'>firstLevelNum asc</when>
+                <when test='asc=="secondLevelNum"'>secondLevelNum asc</when>
+                <when test='asc=="thirdLevelNum"'>thirdLevelNum asc</when>
+                <when test='asc=="firstLevelPercent"'>firstLevelPercent asc</when>
+                <when test='asc=="secondLevelPercent"'>secondLevelPercent asc</when>
+                <when test='asc=="thirdLevelPercent"'>thirdLevelPercent asc</when>
+                <when test='asc=="firstLevelPercentStr"'>firstLevelPercent asc</when>
+                <when test='asc=="secondLevelPercentStr"'>secondLevelPercent asc</when>
+                <when test='asc=="thirdLevelPercentStr"'>thirdLevelPercent asc</when>
+                <otherwise> doctorName asc </otherwise>
+            </choose>
+        </if>
+        <if test="desc != null and desc!=''">
+            order by
+            <choose>
+                <when test='desc=="doctorId"'>doctorId desc</when>
+                <when test='desc=="doctorName"'>doctorName desc</when>
+                <when test='desc=="entryNum"'>entryNum desc</when>
+                <when test='desc=="mrNum"'>mrNum desc</when>
+                <when test='desc=="totleValue"'>totleValue desc</when>
+                <when test='desc=="averageValue"'>averageValue desc</when>
+                <when test='desc=="firstLevelNum"'>firstLevelNum desc</when>
+                <when test='desc=="secondLevelNum"'>secondLevelNum desc</when>
+                <when test='desc=="thirdLevelNum"'>thirdLevelNum desc</when>
+                <when test='desc=="firstLevelPercent"'>firstLevelPercent desc</when>
+                <when test='desc=="secondLevelPercent"'>secondLevelPercent desc</when>
+                <when test='desc=="thirdLevelPercent"'>thirdLevelPercent desc</when>
+                <when test='desc=="firstLevelPercentStr"'>firstLevelPercent desc</when>
+                <when test='desc=="secondLevelPercentStr"'>secondLevelPercent desc</when>
+                <when test='desc=="thirdLevelPercentStr"'>thirdLevelPercent desc</when>
+                <otherwise> doctorName desc </otherwise>
+            </choose>
+        </if>
+    </select>
+
+    <!-- 病案首页合格率占比(主任医生) -->
+    <select id="homePageLevelStatisticsByDept" parameterType="com.diagbot.vo.FilterOrderByDeptVO" resultType="com.diagbot.dto.LevelStatisticsDTO">
+        SELECT
+        a.doctor_id AS doctorId,
+        a.doctor_name AS doctorName,
+        count( DISTINCT d.id ) AS entryNum,
+        count( DISTINCT c.id ) AS mrNum,
+        ROUND( sum( c.score_res ), 2 ) AS totleValue,
+        ROUND( sum( c.score_res )/ count(*), 2 ) AS averageValue,
+        COUNT( DISTINCT CASE WHEN c.`level` = '合格' THEN c.id END ) AS firstLevelNum,
+        COUNT( DISTINCT CASE WHEN c.`level` = '不合格' THEN c.id END ) AS secondLevelNum,
+        ROUND( COUNT( DISTINCT CASE WHEN c.`level` = '合格' THEN c.id END )/ count( DISTINCT c.id ), 4 ) AS firstLevelPercent,
+        1-ROUND ( COUNT( DISTINCT CASE WHEN c.`level` = '合格' THEN c.id END )/ count( DISTINCT c.id ), 4 ) AS secondLevelPercent,
+        concat(
+        ROUND( COUNT( DISTINCT CASE WHEN c.`level` = '合格' THEN c.id END )/ count( DISTINCT c.id )* 100, 2 ),
+        '%'
+        ) AS firstLevelPercentStr,
+        concat(
+        100-ROUND ( COUNT( DISTINCT CASE WHEN c.`level` = '合格' THEN c.id END )/ count( DISTINCT c.id )* 100, 2 ),
+        '%'
+        ) AS secondLevelPercentStr
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_cases c,
+        med_qcresult_detail d,
+        sys_user_dept e
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        AND e.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.hospital_id = c.hospital_id
+        AND a.hospital_id = d.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.behospital_code = c.behospital_code
+        AND a.behospital_code = d.behospital_code
+        AND a.beh_dept_id = e.dept_id
+        AND c.cases_id = d.cases_id
+        AND c.cases_id = 243
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="hospitalId != null and hospitalId != ''">
+            AND a.hospital_id = #{hospitalId}
+        </if>
+        <if test="startDate != null and startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{startDate})]]>
+        </if>
+        <if test="endDate != null and endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{endDate})]]>
+        </if>
+        <if test="level != null and level != ''">
+            and c.level = #{level}
+        </if>
+        <if test="name != null and name != ''">
+            and a.doctor_name like CONCAT('%',#{name},'%')
+        </if>
+        <if test="userId!=null and userId !=''">
+            AND e.user_id = #{userId}
+        </if>
+        <if test="deptName!=null and deptName !=''">
+        AND a.beh_dept_name = #{deptName}
+        </if>
+        GROUP BY
+        a.doctor_id,
+        a.doctor_name
+        <if test="asc != null and asc !=''">
+            order by
+            <choose>
+                <when test='asc=="doctorId"'>doctorId asc</when>
+                <when test='asc=="doctorName"'>doctorName asc</when>
+                <when test='asc=="entryNum"'>entryNum asc</when>
+                <when test='asc=="mrNum"'>mrNum asc</when>
+                <when test='asc=="totleValue"'>totleValue asc</when>
+                <when test='asc=="averageValue"'>averageValue asc</when>
+                <when test='asc=="firstLevelNum"'>firstLevelNum asc</when>
+                <when test='asc=="secondLevelNum"'>secondLevelNum asc</when>
+                <when test='asc=="thirdLevelNum"'>thirdLevelNum asc</when>
+                <when test='asc=="firstLevelPercent"'>firstLevelPercent asc</when>
+                <when test='asc=="secondLevelPercent"'>secondLevelPercent asc</when>
+                <when test='asc=="thirdLevelPercent"'>thirdLevelPercent asc</when>
+                <when test='asc=="firstLevelPercentStr"'>firstLevelPercent asc</when>
+                <when test='asc=="secondLevelPercentStr"'>secondLevelPercent asc</when>
+                <when test='asc=="thirdLevelPercentStr"'>thirdLevelPercent asc</when>
+                <otherwise> doctorName asc </otherwise>
+            </choose>
+        </if>
+        <if test="desc != null and desc!=''">
+            order by
+            <choose>
+                <when test='desc=="doctorId"'>doctorId desc</when>
+                <when test='desc=="doctorName"'>doctorName desc</when>
+                <when test='desc=="entryNum"'>entryNum desc</when>
+                <when test='desc=="mrNum"'>mrNum desc</when>
+                <when test='desc=="totleValue"'>totleValue desc</when>
+                <when test='desc=="averageValue"'>averageValue desc</when>
+                <when test='desc=="firstLevelNum"'>firstLevelNum desc</when>
+                <when test='desc=="secondLevelNum"'>secondLevelNum desc</when>
+                <when test='desc=="thirdLevelNum"'>thirdLevelNum desc</when>
+                <when test='desc=="firstLevelPercent"'>firstLevelPercent desc</when>
+                <when test='desc=="secondLevelPercent"'>secondLevelPercent desc</when>
+                <when test='desc=="thirdLevelPercent"'>thirdLevelPercent desc</when>
+                <when test='desc=="firstLevelPercentStr"'>firstLevelPercent desc</when>
+                <when test='desc=="secondLevelPercentStr"'>secondLevelPercent desc</when>
+                <when test='desc=="thirdLevelPercentStr"'>thirdLevelPercent desc</when>
+                <otherwise> doctorName desc </otherwise>
+            </choose>
+        </if>
+    </select>
 </mapper>

+ 75 - 0
src/main/resources/mapper/HomePageMapper.xml

@@ -200,4 +200,79 @@
         a.beh_dept_name
     </select>
 
+    <!-- 按科室统计平均住院天数 (分页)-->
+    <select id="getAverageDayNumPage" resultType="com.diagbot.dto.AverageStatisticsDTO">
+        SELECT t.*
+        FROM
+        (SELECT
+        a.beh_dept_id AS id,
+        a.beh_dept_name AS NAME,
+        count(*) AS num,
+        round( sum( CAST( b.behospital_day_num AS DECIMAL ))/ count(*), 2 ) AS averageValue,
+        round( sum( CAST( b.behospital_day_num AS DECIMAL )), 2 ) AS totleValue
+        FROM
+        med_behospital_info a,
+        med_home_page b
+        WHERE
+        a.hospital_id = b.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="filterPageVO.hospitalId != null and filterPageVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageVO.hospitalId}
+        </if>
+        <if test="filterPageVO.startDate != null and filterPageVO.startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageVO.startDate})]]>
+        </if>
+        <if test="filterPageVO.endDate != null and filterPageVO.endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageVO.endDate})]]>
+        </if>
+        <if test="filterPageVO.name != null and filterPageVO.name != ''">
+            AND a.beh_dept_name like CONCAT('%', #{filterPageVO.name},'%')
+        </if>
+        GROUP BY
+        a.beh_dept_id,
+        a.beh_dept_name
+        ORDER BY
+        round(sum(CAST( b.behospital_day_num AS DECIMAL ))/ count(*),2 ) DESC)t
+    </select>
+
+    <!-- 按科室统计平均费用(分页) -->
+    <select id="getAverageFeePage"   resultType="com.diagbot.dto.AverageStatisticsDTO">
+        SELECT t.*
+        FROM
+        (SELECT
+        a.beh_dept_id as id,
+        a.beh_dept_name as name,
+        count(*) AS num,
+        round( sum( CAST(b.total_fee AS DECIMAL ))/ count(*), 2 ) AS averageValue,
+        round( sum( CAST(b.total_fee AS DECIMAL )), 2 ) AS totleValue
+        FROM
+        med_behospital_info a,
+        med_home_page b
+        WHERE
+        a.hospital_id = b.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="filterPageVO.hospitalId != null and filterPageVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageVO.hospitalId}
+        </if>
+        <if test="filterPageVO.startDate != null and filterPageVO.startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageVO.startDate})]]>
+        </if>
+        <if test="filterPageVO.endDate != null and filterPageVO.endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageVO.endDate})]]>
+        </if>
+        <if test="filterPageVO.name != null and filterPageVO.name != ''">
+            AND a.beh_dept_name like CONCAT('%', #{filterPageVO.name},'%')
+        </if>
+        GROUP BY
+        a.beh_dept_id,
+        a.beh_dept_name
+        ORDER BY
+        round(sum(CAST( b.total_fee AS DECIMAL ))/ count(*),2 ) DESC)t
+    </select>
 </mapper>

+ 21 - 0
src/main/resources/mapper/MedQcresultCasesMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.diagbot.mapper.MedQcresultCasesMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.MedQcresultCases">
+        <id column="id" property="id" />
+        <result column="hospital_id" property="hospitalId" />
+        <result column="behospital_code" property="behospitalCode" />
+        <result column="cases_id" property="casesId" />
+        <result column="score_res" property="scoreRes" />
+        <result column="level" property="level" />
+        <result column="is_deleted" property="isDeleted" />
+        <result column="gmt_create" property="gmtCreate" />
+        <result column="gmt_modified" property="gmtModified" />
+        <result column="creator" property="creator" />
+        <result column="modifier" property="modifier" />
+        <result column="remark" property="remark" />
+    </resultMap>
+
+</mapper>

+ 46 - 0
src/main/resources/mapper/ModelHospitalMapper.xml

@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.diagbot.mapper.ModelHospitalMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.ModelHospital">
+        <id column="id" property="id"/>
+        <result column="hospital_id" property="hospitalId"/>
+        <result column="hospital_model_name" property="hospitalModelName"/>
+        <result column="stand_model_id" property="standModelId"/>
+        <result column="stand_model_name" property="standModelName"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="gmt_create" property="gmtCreate"/>
+        <result column="gmt_modified" property="gmtModified"/>
+        <result column="creator" property="creator"/>
+        <result column="modifier" property="modifier"/>
+        <result column="remark" property="remark"/>
+    </resultMap>
+    <select id="getModelHospitalAll" parameterType="com.diagbot.vo.ModelHospitalAllVO"
+            resultType="com.diagbot.dto.ModelHospitalAllDTO">
+        select id as id ,
+        hospital_id as hospitalId,
+        hospital_model_name as hospitalModelName,
+        stand_model_id as standModelId,
+        stand_model_name as standModelName,
+        gmt_create as gmtCreate ,
+        gmt_modified as gmtModified,
+        creator as creator,
+        modifier as modifier,
+        remark as remark
+        from qc_model_hospital where is_deleted = "N"
+        <if test="hospitalId != null and hospitalId != ''">
+            AND hospital_id = #{hospitalId}
+        </if>
+        <if test="hospitalModelName != null and hospitalModelName != ''">
+            AND UPPER(hospital_model_name) LIKE CONCAT('%', UPPER(trim(#{hospitalModelName})), '%')
+        </if>
+        <if test="standModelId != null and standModelId != ''">
+            AND stand_model_id = #{standModelId}
+        </if>
+        <if test="standModelName != null and standModelName != ''">
+            AND UPPER(stand_model_name) LIKE CONCAT('%', UPPER(trim(#{standModelName})), '%')
+        </if>
+    </select>
+
+</mapper>

+ 47 - 0
src/main/resources/mapper/QcAbnormalMapper.xml

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.diagbot.mapper.QcAbnormalMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.QcAbnormal">
+        <id column="id" property="id" />
+        <result column="is_deleted" property="isDeleted" />
+        <result column="gmt_create" property="gmtCreate" />
+        <result column="gmt_modified" property="gmtModified" />
+        <result column="creator" property="creator" />
+        <result column="modifier" property="modifier" />
+        <result column="hospital_id" property="hospitalId" />
+        <result column="behospital_code" property="behospitalCode" />
+        <result column="type" property="type" />
+        <result column="description" property="description" />
+        <result column="status" property="status" />
+        <result column="remark" property="remark" />
+    </resultMap>
+
+    <select id="getQcAnnormal" resultType="com.diagbot.dto.QcAbnormalDTO" parameterType="com.diagbot.vo.QcAbnormalVO">
+        SELECT
+        t1.*
+        FROM
+        `qc_abnormal` t1
+        WHERE
+        t1.is_deleted = 'N'
+        <if test="hospitalId != null">
+            and t1.hospital_id = #{hospitalId}
+        </if>
+        <if test="type != null">
+            and t1.type = #{type}
+        </if>
+        <if test="status != null">
+            and t1.status = #{status}
+        </if>
+        <if test="behospitalCode != null and behospitalCode != ''">
+            and t1.behospital_code like CONCAT('%',#{behospitalCode},'%')
+        </if>
+        <if test="startDate != null and startDate != ''">
+            <![CDATA[ and t1.gmt_create >= DATE(#{startDate})]]>
+        </if>
+        <if test="endDate != null and endDate != ''">
+            <![CDATA[AND t1.gmt_create < DATE(#{endDate})]]>
+        </if>
+    </select>
+</mapper>

+ 557 - 6
src/main/resources/mapper/QcresultInfoMapper.xml

@@ -24,12 +24,16 @@
         count(1)
         FROM
         med_behospital_info a,
-        med_qcresult_info b
+        med_home_page b,
+        med_qcresult_info c
         WHERE
         a.hospital_id = b.hospital_id
         AND a.behospital_code = b.behospital_code
+        AND a.hospital_id = c.hospital_id
+        AND a.behospital_code = c.behospital_code
         AND a.is_deleted = 'N'
         AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
         <![CDATA[AND a.qc_type_id <>0 ]]>
         <if test="hospitalId != null and hospitalId != ''">
             AND a.hospital_id = #{hospitalId}
@@ -41,10 +45,10 @@
             <![CDATA[AND a.leave_hospital_date < DATE(#{endDate})]]>
         </if>
         <if test="gradeType != null and gradeType != ''">
-            AND b.grade_type = #{gradeType}
+            AND c.grade_type = #{gradeType}
         </if>
         <if test="level != null and level != ''">
-            AND b.level = #{level}
+            AND c.level = #{level}
         </if>
     </select>
 
@@ -238,7 +242,7 @@
     </select>
 
     <!-- 按科室统计质控病历数 -->
-    <select id="resultCountByDept" parameterType="com.diagbot.vo.QcresultFilterByDeptVO" resultType="com.diagbot.dto.NumDTO">
+    <select id="resultCountByDept" parameterType="com.diagbot.vo.QcresultFilterVO" resultType="com.diagbot.dto.NumDTO">
         SELECT
         a.beh_dept_id AS id,
         a.beh_dept_name AS NAME,
@@ -284,7 +288,7 @@
     </select>
 
     <!-- 按模块统计质控缺陷数 -->
-    <select id="entryCountGroupByCaseAndDept" parameterType="com.diagbot.vo.FilterByDeptVO" resultType="com.diagbot.dto.DeptNumDTO">
+    <select id="entryCountGroupByCaseAndDept" parameterType="com.diagbot.vo.FilterVO" resultType="com.diagbot.dto.DeptNumDTO">
         SELECT
         d.cases_id AS id,
         e.NAME AS NAME,
@@ -339,7 +343,7 @@
     </select>
 
     <!-- 条目缺陷分组统计 -->
-    <select id="entryCountGroupByEntryAndDept" parameterType="com.diagbot.vo.FilterByDeptVO" resultType="com.diagbot.dto.DeptNumDTO">
+    <select id="entryCountGroupByEntryAndDept" parameterType="com.diagbot.vo.FilterVO" resultType="com.diagbot.dto.DeptNumDTO">
         SELECT
         d.id,
         d.NAME,
@@ -385,4 +389,551 @@
         a.beh_dept_id,
         a.beh_dept_name
     </select>
+
+    <!-- 按模块统计质控缺陷数(分页) -->
+    <select id="entryCountGroupByCasePage"  resultType="com.diagbot.dto.NumDTO">
+        SELECT
+        t.id,
+        t.`NAME`,
+        t.num,
+        t.totleNum,
+        t.percent,
+        t.percentStr
+        FROM
+        (
+        SELECT
+        t1.caseId AS id,
+        t1.caseName AS NAME,
+        t1.num AS num,
+        t2.mrNum,
+        t3.originalNum,
+        t2.mrNum * t3.originalNum AS totleNum,
+        ROUND( t1.num /( t2.mrNum * t3.originalNum ), 4 ) AS percent,
+        CONCAT( ROUND( t1.num /( t2.mrNum * t3.originalNum )* 100, 2 ), '%' ) AS percentStr
+        FROM
+        (
+        SELECT
+        d.cases_id AS caseId,
+        e.NAME AS caseName,
+        count(*) AS num
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_info c,
+        med_qcresult_detail d,
+        qc_cases e,
+        qc_cases_entry f
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        AND e.is_deleted = 'N'
+        AND f.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.hospital_id = c.hospital_id
+        AND a.hospital_id = d.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.behospital_code = c.behospital_code
+        AND a.behospital_code = d.behospital_code
+        AND d.cases_id = e.id
+        AND d.cases_entry_id = f.id
+        AND e.id = f.cases_id
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="filterPageVO.hospitalId != null and filterPageVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageVO.hospitalId}
+        </if>
+        <if test="filterPageVO.startDate != null and filterPageVO.startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageVO.startDate})]]>
+        </if>
+        <if test="filterPageVO.endDate != null and filterPageVO.endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageVO.endDate})]]>
+        </if>
+        <if test="filterPageVO.name != null and filterPageVO.name != ''">
+            AND e.name like CONCAT('%', #{filterPageVO.name},'%')
+        </if>
+        GROUP BY
+        d.cases_id,
+        e.`name`
+        ) t1,
+        (
+        SELECT
+        COUNT(*) AS mrNum
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_info c
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.hospital_id = c.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.behospital_code = c.behospital_code
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="filterPageVO.hospitalId != null and filterPageVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageVO.hospitalId}
+        </if>
+        <if test="filterPageVO.startDate != null and filterPageVO.startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageVO.startDate})]]>
+        </if>
+        <if test="filterPageVO.endDate != null and filterPageVO.endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageVO.endDate})]]>
+        </if>
+        ) t2,
+        (
+        SELECT
+        a.id AS caseId,
+        a.NAME AS caseName,
+        count(*) AS originalNum
+        FROM
+        qc_cases a,
+        qc_cases_entry b
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND a.id = b.cases_id
+        <if test="filterPageVO.name != null and filterPageVO.name != ''">
+            AND a.name like CONCAT('%', #{filterPageVO.name},'%')
+        </if>
+        GROUP BY
+        a.id,
+        a.`name`
+        ) t3
+        WHERE
+        t1.caseId = t3.caseId
+        AND t1.caseName = t3.caseName
+        ORDER BY
+        ROUND( t1.num /( t2.mrNum * t3.originalNum ), 4 ) DESC
+        ) t
+    </select>
+
+    <!-- 条目缺陷分组统计(分页) -->
+    <select id="entryCountGroupByEntryPage"  resultType="com.diagbot.dto.NumDTO">
+        SELECT t.*
+        FROM
+        (SELECT
+        t1.id,
+        t1.NAME,
+        count(*) AS num,
+        t2.totleNum
+        FROM
+        (
+        SELECT
+        d.id AS id,
+        d.NAME AS NAME
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_detail c,
+        qc_cases_entry d
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.hospital_id = c.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.behospital_code = c.behospital_code
+        AND c.cases_id = d.cases_id
+        AND c.cases_entry_id = d.id
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="filterPageVO.hospitalId != null and filterPageVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageVO.hospitalId}
+        </if>
+        <if test="filterPageVO.startDate != null and filterPageVO.startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageVO.startDate})]]>
+        </if>
+        <if test="filterPageVO.endDate != null and filterPageVO.endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageVO.endDate})]]>
+        </if>
+        <if test="filterPageVO.name != null and filterPageVO.name != ''">
+            AND d.name like CONCAT('%', #{filterPageVO.name},'%')
+        </if>
+        ) t1,(
+        SELECT
+        count(*) AS totleNum
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_detail c,
+        qc_cases_entry d
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.hospital_id = c.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.behospital_code = c.behospital_code
+        AND c.cases_id = d.cases_id
+        AND c.cases_entry_id = d.id
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="filterPageVO.hospitalId != null and filterPageVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageVO.hospitalId}
+        </if>
+        <if test="filterPageVO.startDate != null and filterPageVO.startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageVO.startDate})]]>
+        </if>
+        <if test="filterPageVO.endDate != null and filterPageVO.endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageVO.endDate})]]>
+        </if>
+        <if test="filterPageVO.name != null and filterPageVO.name != ''">
+            AND d.name like CONCAT('%', #{filterPageVO.name},'%')
+        </if>
+        ) t2
+        GROUP BY
+        t1.id,
+        t1.NAME
+        ORDER BY
+        count(*) DESC)t
+    </select>
+
+    <!-- 质控平均分按科室统计(分页) -->
+    <select id="getAverageScoreByDeptPage"  resultType="com.diagbot.dto.AverageStatisticsDTO">
+        SELECT t.*
+        FROM
+        (SELECT
+        a.beh_dept_id AS id,
+        a.beh_dept_name AS name,
+        ROUND( sum( CAST( c.score_res AS DECIMAL )), 2 ) AS totleValue,
+        ROUND( sum( CAST( c.score_res AS DECIMAL ))/ count(*), 2 ) AS averageValue,
+        count(*) AS num
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_info c
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.hospital_id = c.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.behospital_code = c.behospital_code
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="filterPageVO.hospitalId != null and filterPageVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageVO.hospitalId}
+        </if>
+        <if test="filterPageVO.startDate != null and filterPageVO.startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageVO.startDate})]]>
+        </if>
+        <if test="filterPageVO.endDate != null and filterPageVO.endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageVO.endDate})]]>
+        </if>
+        <if test="filterPageVO.name != null and filterPageVO.name != ''">
+            AND a.beh_dept_name like CONCAT('%', #{filterPageVO.name},'%')
+        </if>
+        GROUP BY
+        a.beh_dept_id,
+        a.beh_dept_name
+        ORDER BY ROUND( sum( CAST( c.score_res AS DECIMAL ))/ count(*), 2 ) DESC ) t
+    </select>
+
+    <!-- 按科室统计质控病历数(分页) -->
+    <select id="levelPercentGroupByDeptPage" resultType="com.diagbot.dto.QcResultPercentDTO">
+        SELECT t.*
+        FROM
+        (SELECT
+        a.beh_dept_id AS deptId,
+        a.beh_dept_name AS deptName,
+        count(*) AS totleNum,
+        sum( c.`level` = '甲' ) AS firstLevelNum,
+        sum( c.`level` = '乙' ) AS secondLevelNum,
+        sum( c.`level` = '丙' ) AS thirdLevelNum,
+        concat( ROUND( sum( c.`level` = '甲' )/ count(*)* 100, 2 ), '%' ) AS firstPercent,
+        concat( ROUND( sum( c.`level` = '乙' )/ count(*)* 100, 2 ), '%' ) AS sencondPercent,
+        concat( ROUND( sum( c.`level` = '丙' )/ count(*)* 100, 2 ), '%' ) AS thirdPercent
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_info c
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.hospital_id = c.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.behospital_code = c.behospital_code
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="filterPageVO.hospitalId != null and filterPageVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageVO.hospitalId}
+        </if>
+        <if test="filterPageVO.startDate != null and filterPageVO.startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageVO.startDate})]]>
+        </if>
+        <if test="filterPageVO.endDate != null and filterPageVO.endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageVO.endDate})]]>
+        </if>
+        <if test="filterPageVO.name != null and filterPageVO.name != ''">
+            AND a.beh_dept_name like CONCAT('%', #{filterPageVO.name},'%')
+        </if>
+        GROUP BY
+        a.beh_dept_id,
+        a.beh_dept_name
+        order by ROUND( sum( c.`level` = '甲' )/ count(*)* 100, 2 ) DESC,
+        ROUND( sum( c.`level` = '乙' )/ count(*)* 100, 2 ) DESC,
+        ROUND( sum( c.`level` = '丙' )/ count(*)* 100, 2 ) DESC) t
+    </select>
+
+    <!-- 按模块统计质控缺陷数-科室(分页) -->
+    <select id="entryCountGroupByCaseAndDeptPage" resultType="com.diagbot.dto.DeptNumDTO">
+        SELECT
+        t.id,
+        t.`NAME`,
+        t.num,
+        t.totleNum,
+        t.percent,
+        t.percentStr
+        FROM
+        (
+        SELECT
+        t1.caseId AS id,
+        t1.caseName AS NAME,
+        t1.num AS num,
+        t2.mrNum,
+        t3.originalNum,
+        t2.mrNum * t3.originalNum AS totleNum,
+        ROUND( t1.num /( t2.mrNum * t3.originalNum ), 4 ) AS percent,
+        CONCAT( ROUND( t1.num /( t2.mrNum * t3.originalNum )* 100, 2 ), '%' ) AS percentStr
+        FROM
+        (
+        SELECT
+        d.cases_id AS caseId,
+        e.NAME AS caseName,
+        a.beh_dept_id AS deptId,
+        a.beh_dept_name AS deptName,
+        count(*) AS num
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_info c,
+        med_qcresult_detail d,
+        qc_cases e,
+        qc_cases_entry f,
+        sys_user_dept g
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        AND e.is_deleted = 'N'
+        AND f.is_deleted = 'N'
+        AND g.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.hospital_id = c.hospital_id
+        AND a.hospital_id = d.hospital_id
+        AND a.hospital_id = g.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.behospital_code = c.behospital_code
+        AND a.behospital_code = d.behospital_code
+        AND d.cases_id = e.id
+        AND d.cases_entry_id = f.id
+        AND e.id = f.cases_id
+        AND a.beh_dept_id = g.dept_id
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="filterPageByDeptVO.userId!=null">
+            AND g.user_id = #{filterPageByDeptVO.userId}
+        </if>
+        <if test="filterPageByDeptVO.hospitalId != null and filterPageByDeptVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageByDeptVO.hospitalId}
+        </if>
+        <if test="filterPageByDeptVO.startDate != null and filterPageByDeptVO.startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageByDeptVO.startDate})]]>
+        </if>
+        <if test="filterPageByDeptVO.endDate != null and filterPageByDeptVO.endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageByDeptVO.endDate})]]>
+        </if>
+        <if test="filterPageByDeptVO.name != null and filterPageByDeptVO.name != ''">
+            AND e.name like CONCAT('%', #{filterPageByDeptVO.name},'%')
+        </if>
+        <if test="filterPageByDeptVO.deptName != null and filterPageByDeptVO.deptName != ''">
+            AND a.beh_dept_name = #{filterPageByDeptVO.deptName}
+        </if>
+        GROUP BY
+        d.cases_id,
+        e.`name`,
+        a.beh_dept_id,
+        a.beh_dept_name
+        ) t1,
+        (
+        SELECT
+        a.beh_dept_id AS deptId,
+        a.beh_dept_name AS deptName,
+        COUNT(*) AS mrNum
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_info c,
+        sys_user_dept d
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.hospital_id = c.hospital_id
+        AND a.hospital_id = d.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.behospital_code = c.behospital_code
+        AND a.beh_dept_id = d.dept_id
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="filterPageByDeptVO.userId!=null">
+            AND d.user_id = #{filterPageByDeptVO.userId}
+        </if>
+        <if test="filterPageByDeptVO.hospitalId != null and filterPageByDeptVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageByDeptVO.hospitalId}
+        </if>
+        <if test="filterPageByDeptVO.startDate != null and filterPageByDeptVO.startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageByDeptVO.startDate})]]>
+        </if>
+        <if test="filterPageByDeptVO.endDate != null and filterPageByDeptVO.endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageByDeptVO.endDate})]]>
+        </if>
+        <if test="filterPageByDeptVO.deptName != null and filterPageByDeptVO.deptName != ''">
+            AND a.beh_dept_name = #{filterPageByDeptVO.deptName}
+        </if>
+        GROUP BY
+        a.beh_dept_id,
+        a.beh_dept_name
+        ) t2,
+        (
+        SELECT
+        a.id AS caseId,
+        a.NAME AS caseName,
+        count(*) AS originalNum
+        FROM
+        qc_cases a,
+        qc_cases_entry b
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND a.id = b.cases_id
+        GROUP BY
+        a.id,
+        a.`name`
+        ) t3
+        WHERE
+        t1.caseId = t3.caseId
+        AND t1.caseName = t3.caseName
+        AND t1.deptId = t2.deptId
+        AND t1.deptName = t2.deptName
+        ORDER BY
+        ROUND( t1.num /( t2.mrNum * t3.originalNum ), 4 ) DESC
+        ) t
+    </select>
+
+    <!-- 条目缺陷分组统计-科室(分页) -->
+    <select id="entryCountGroupByEntryAndDeptPage"  resultType="com.diagbot.dto.DeptNumDTO">
+        SELECT
+        t.*
+        FROM
+        (
+        SELECT
+        t1.id,
+        t1.NAME,
+        count(*) AS num,
+        t2.totleNum
+        FROM
+        (
+        SELECT
+        d.id,
+        d.NAME,
+        a.beh_dept_id AS deptId,
+        a.beh_dept_name AS deptName
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_detail c,
+        qc_cases_entry d,
+        sys_user_dept e
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        AND e.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.hospital_id = c.hospital_id
+        AND a.hospital_id = e.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.behospital_code = c.behospital_code
+        AND c.cases_id = d.cases_id
+        AND c.cases_entry_id = d.id
+        AND a.beh_dept_id = e.dept_id
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="filterPageByDeptVO.userId!=null">
+            AND e.user_id = #{filterPageByDeptVO.userId}
+        </if>
+        <if test="filterPageByDeptVO.hospitalId != null and filterPageByDeptVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageByDeptVO.hospitalId}
+        </if>
+        <if test="filterPageByDeptVO.startDate != null and filterPageByDeptVO.startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageByDeptVO.startDate})]]>
+        </if>
+        <if test="filterPageByDeptVO.endDate != null and filterPageByDeptVO.endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageByDeptVO.endDate})]]>
+        </if>
+        <if test="filterPageByDeptVO.name != null and filterPageByDeptVO.name != ''">
+            AND d.name like CONCAT('%', #{filterPageByDeptVO.name},'%')
+        </if>
+        <if test="filterPageByDeptVO.deptName != null and filterPageByDeptVO.deptName != ''">
+            AND a.beh_dept_name like CONCAT('%', #{filterPageByDeptVO.deptName},'%')
+        </if>
+        ) t1,(
+        SELECT
+        count(*) AS totleNum
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_detail c,
+        qc_cases_entry d,
+        sys_user_dept e
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        AND e.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.hospital_id = c.hospital_id
+        AND a.hospital_id = e.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.behospital_code = c.behospital_code
+        AND c.cases_id = d.cases_id
+        AND c.cases_entry_id = d.id
+        AND a.beh_dept_id = e.dept_id
+        <![CDATA[AND a.qc_type_id <>0 ]]>
+        <if test="filterPageByDeptVO.userId!=null">
+            AND e.user_id = #{filterPageByDeptVO.userId}
+        </if>
+        <if test="filterPageByDeptVO.hospitalId != null and filterPageByDeptVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageByDeptVO.hospitalId}
+        </if>
+        <if test="filterPageByDeptVO.startDate != null and filterPageByDeptVO.startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageByDeptVO.startDate})]]>
+        </if>
+        <if test="filterPageByDeptVO.endDate != null and filterPageByDeptVO.endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageByDeptVO.endDate})]]>
+        </if>
+        <if test="filterPageByDeptVO.name != null and filterPageByDeptVO.name != ''">
+            AND d.name like CONCAT('%', #{filterPageByDeptVO.name},'%')
+        </if>
+        <if test="filterPageByDeptVO.deptName != null and filterPageByDeptVO.deptName != ''">
+            AND a.beh_dept_name = #{filterPageByDeptVO.deptName}
+        </if>
+        ) t2
+        GROUP BY
+        t1.id,
+        t1.NAME,
+        t1.deptId,
+        t1.deptName
+        ORDER BY
+        count(*) DESC
+        )t
+    </select>
 </mapper>

+ 5 - 3
src/main/resources/mapper/SysUserMapper.xml

@@ -88,7 +88,8 @@
                 INNER JOIN (
                 SELECT
                 t8.user_id AS userId,
-                group_concat(t9.`name` order by t9.id ASC) AS roleName
+                group_concat(t9.`name` order by t9.id ASC) AS roleName,
+                min(t9.id) as roleId
                 FROM
                 sys_user_role t8,
                 sys_role t9
@@ -105,7 +106,8 @@
                 LEFT JOIN (
                 SELECT
                 t8.user_id AS userId,
-                group_concat(t9.`name` order by t9.id ASC) AS roleName
+                group_concat(t9.`name` order by t9.id ASC) AS roleName,
+                min(t9.id) as roleId
                 FROM
                 sys_user_role t8,
                 sys_role t9
@@ -119,7 +121,7 @@
             </otherwise>
         </choose>
         WHERE
-        1 = 1
+        IFNULL(t10.roleId,0) != -1
         <if test="linkman != null and linkman != ''">
             and t3.linkman like CONCAT('%',#{linkman},'%')
         </if>