Quellcode durchsuchen

Merge branch 'dev/20200522temp' into debug

gaodm vor 5 Jahren
Ursprung
Commit
4ebda54f50
44 geänderte Dateien mit 1371 neuen und 196 gelöschten Zeilen
  1. 3 4
      src/main/java/com/diagbot/aggregate/MrStatisticsAggregate.java
  2. 5 3
      src/main/java/com/diagbot/aggregate/ResultStatisticsAggregate.java
  3. 38 0
      src/main/java/com/diagbot/dto/QcCasesEntrySimpleDTO.java
  4. 25 0
      src/main/java/com/diagbot/dto/QcTypeDTO.java
  5. 66 0
      src/main/java/com/diagbot/dto/QcTypePageDTO.java
  6. 19 0
      src/main/java/com/diagbot/entity/CommonParam.java
  7. 15 1
      src/main/java/com/diagbot/entity/QcType.java
  8. 50 0
      src/main/java/com/diagbot/enums/InsertOrUpdateEnum.java
  9. 6 8
      src/main/java/com/diagbot/facade/ConsoleByDeptFacade.java
  10. 37 12
      src/main/java/com/diagbot/facade/ConsoleFacade.java
  11. 11 0
      src/main/java/com/diagbot/facade/QcTypeCasesEntryFacade.java
  12. 248 0
      src/main/java/com/diagbot/facade/QcTypeFacade.java
  13. 5 4
      src/main/java/com/diagbot/mapper/HomePageMapper.java
  14. 8 1
      src/main/java/com/diagbot/mapper/QcCasesEntryMapper.java
  15. 5 0
      src/main/java/com/diagbot/mapper/QcTypeCasesEntryMapper.java
  16. 10 0
      src/main/java/com/diagbot/mapper/QcTypeMapper.java
  17. 5 4
      src/main/java/com/diagbot/service/HomePageService.java
  18. 7 0
      src/main/java/com/diagbot/service/QcCasesEntryService.java
  19. 6 2
      src/main/java/com/diagbot/service/QcTypeCasesEntryService.java
  20. 5 1
      src/main/java/com/diagbot/service/QcTypeService.java
  21. 7 6
      src/main/java/com/diagbot/service/impl/HomePageServiceImpl.java
  22. 13 0
      src/main/java/com/diagbot/service/impl/QcCasesEntryServiceImpl.java
  23. 9 2
      src/main/java/com/diagbot/service/impl/QcTypeCasesEntryServiceImpl.java
  24. 7 1
      src/main/java/com/diagbot/service/impl/QcTypeServiceImpl.java
  25. 19 0
      src/main/java/com/diagbot/vo/DeleteQcTypeVO.java
  26. 35 0
      src/main/java/com/diagbot/vo/FilterPageByAverageVO.java
  27. 4 1
      src/main/java/com/diagbot/vo/FilterPageVO.java
  28. 3 0
      src/main/java/com/diagbot/vo/FilterVO.java
  29. 18 0
      src/main/java/com/diagbot/vo/QcEntryHospitalVO.java
  30. 15 0
      src/main/java/com/diagbot/vo/QcTypeCasesEntryVO.java
  31. 24 0
      src/main/java/com/diagbot/vo/QcTypeIndexVO.java
  32. 22 0
      src/main/java/com/diagbot/vo/QcTypePageVO.java
  33. 26 0
      src/main/java/com/diagbot/vo/QcTypeSaveVO.java
  34. 18 0
      src/main/java/com/diagbot/vo/QcTypeVO.java
  35. 14 12
      src/main/java/com/diagbot/web/ConsoleByDeptController.java
  36. 30 28
      src/main/java/com/diagbot/web/ConsoleController.java
  37. 108 0
      src/main/java/com/diagbot/web/QcTypeController.java
  38. 12 11
      src/main/resources/mapper/BehospitalInfoMapper.xml
  39. 198 30
      src/main/resources/mapper/HomePageMapper.xml
  40. 42 0
      src/main/resources/mapper/QcCasesEntryMapper.xml
  41. 39 0
      src/main/resources/mapper/QcTypeCasesEntryMapper.xml
  42. 13 0
      src/main/resources/mapper/QcTypeMapper.xml
  43. 119 63
      src/main/resources/mapper/QcresultInfoMapper.xml
  44. 2 2
      src/test/java/com/diagbot/CodeGeneration.java

+ 3 - 4
src/main/java/com/diagbot/aggregate/MrStatisticsAggregate.java

@@ -118,7 +118,7 @@ public class MrStatisticsAggregate {
         BeanUtil.copyProperties(filterVO, qcresultFilterVO);
 
         int totleNum = qcresultInfoFacade.resultCount(qcresultFilterVO);
-        if (totleNum == 0){
+        if (totleNum == 0) {
             return retList;
         }
         qcresultFilterVO.setLevel("甲");
@@ -155,9 +155,8 @@ public class MrStatisticsAggregate {
         thirdLevelNumDTO.setName("丙级病历");
         thirdLevelNumDTO.setNum(thirdLevelNum);
         thirdLevelNumDTO.setTotleNum(totleNum);
-        Double thirdPercent = BigDecimal.valueOf(1)
-                .subtract(BigDecimal.valueOf(firstPercent))
-                .subtract(BigDecimal.valueOf(secondPercent))
+        Double thirdPercent = BigDecimal.valueOf(thirdLevelNum)
+                .divide(BigDecimal.valueOf(totleNum), 4, RoundingMode.HALF_UP)
                 .doubleValue();
         String thirdPercentStr = df.format(BigDecimal.valueOf(thirdPercent).multiply(BigDecimal.valueOf(100))) + "%";
         thirdLevelNumDTO.setPercent(thirdPercent);

+ 5 - 3
src/main/java/com/diagbot/aggregate/ResultStatisticsAggregate.java

@@ -183,8 +183,8 @@ public class ResultStatisticsAggregate {
                         otherNumDTO.setName("其他");
                         otherNumDTO.setNum(num);
                         otherNumDTO.setTotleNum(totle);
-                        Double percent = BigDecimal.valueOf(1)
-                                .subtract(BigDecimal.valueOf(sumPercent))
+                        Double percent = BigDecimal.valueOf(num)
+                                .divide(BigDecimal.valueOf(totle), 4, RoundingMode.HALF_UP)
                                 .doubleValue();
                         otherNumDTO.setPercent(percent);
                         String percentStr
@@ -241,7 +241,9 @@ public class ResultStatisticsAggregate {
                 NumDTO otherNumDTO = new NumDTO();
                 otherNumDTO.setName("其他");
                 otherNumDTO.setNum(num);
-                otherNumDTO.setPercent(BigDecimal.valueOf(1).subtract(BigDecimal.valueOf(rate)).doubleValue());
+                otherNumDTO.setPercent(BigDecimal.valueOf(num)
+                        .divide(BigDecimal.valueOf(totle), 4, RoundingMode.HALF_UP)
+                        .doubleValue());
                 retList.add(otherNumDTO);
             }
             retList.forEach(result -> {

+ 38 - 0
src/main/java/com/diagbot/dto/QcCasesEntrySimpleDTO.java

@@ -0,0 +1,38 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author zhoutg
+ * @Description:
+ * @date 2020-04-27 10:09
+ */
+@Setter
+@Getter
+public class QcCasesEntrySimpleDTO {
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 条目
+     */
+    private String name;
+
+    /**
+     * 0-未启用 1-启用
+     */
+    private String isUsed;
+
+    /**
+     * modeName
+     */
+    private String modeName;
+
+    /**
+     * 是否勾选
+     */
+    private Integer sel;
+}

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

@@ -0,0 +1,25 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @Author: ztg
+ * @Date: 2018/10/24 16:11
+ */
+@Getter
+@Setter
+public class QcTypeDTO {
+    // 主键
+    private Long id;
+    // 医院ID
+    private Long hospitalId;
+    // 质控类型名称
+    private String name;
+    // 质控类型和质控条目对应关系
+    private Map<String, List<QcCasesEntrySimpleDTO>> entryMap;
+}

+ 66 - 0
src/main/java/com/diagbot/dto/QcTypePageDTO.java

@@ -0,0 +1,66 @@
+package com.diagbot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 质控类型标准
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-05-14
+ */
+@Data
+public class QcTypePageDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 医院ID
+     */
+    private Long hospitalId;
+
+    /**
+     * 质控类型名称
+     */
+    private String name;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+}

+ 19 - 0
src/main/java/com/diagbot/entity/CommonParam.java

@@ -0,0 +1,19 @@
+package com.diagbot.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * @Description:
+ * @Author: ztg
+ * @Date: 2018/12/14 14:15
+ */
+@Getter
+@Setter
+public class CommonParam {
+    private String person;     //操作人
+    private Date now;          //当前时间
+    private int insertOrUpdate;//更新或新增标识
+}

+ 15 - 1
src/main/java/com/diagbot/entity/QcType.java

@@ -12,7 +12,7 @@ import java.util.Date;
  * </p>
  *
  * @author gaodm
- * @since 2020-04-13
+ * @since 2020-05-27
  */
 public class QcType implements Serializable {
 
@@ -24,6 +24,11 @@ public class QcType implements Serializable {
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
+    /**
+     * 医院ID
+     */
+    private Long hospitalId;
+
     /**
      * 质控类型名称
      */
@@ -67,6 +72,14 @@ public class QcType implements Serializable {
         this.id = id;
     }
 
+    public Long getHospitalId() {
+        return hospitalId;
+    }
+
+    public void setHospitalId(Long hospitalId) {
+        this.hospitalId = hospitalId;
+    }
+
     public String getName() {
         return name;
     }
@@ -127,6 +140,7 @@ public class QcType implements Serializable {
     public String toString() {
         return "QcType{" +
                 "id=" + id +
+                ", hospitalId=" + hospitalId +
                 ", name=" + name +
                 ", remark=" + remark +
                 ", isDeleted=" + isDeleted +

+ 50 - 0
src/main/java/com/diagbot/enums/InsertOrUpdateEnum.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 InsertOrUpdateEnum implements KeyedNamed {
+    Insert(1, "新增"),
+    Update(2, "修改");
+
+    @Setter
+    private int key;
+
+    @Setter
+    private String name;
+
+    InsertOrUpdateEnum(int key, String name) {
+        this.key = key;
+        this.name = name;
+    }
+
+    public static InsertOrUpdateEnum getEnum(int key) {
+        for (InsertOrUpdateEnum item : InsertOrUpdateEnum.values()) {
+            if (item.key == key) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    public static String getName(int key) {
+        InsertOrUpdateEnum item = getEnum(key);
+        return item != null ? item.name : null;
+    }
+
+    @Override
+    public int getKey() {
+        return key;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+}
+

+ 6 - 8
src/main/java/com/diagbot/facade/ConsoleByDeptFacade.java

@@ -5,7 +5,6 @@ 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;
@@ -209,9 +208,8 @@ public class ConsoleByDeptFacade {
             thirdLevelNumDTO.setName("丙级病历");
             thirdLevelNumDTO.setNum(thirdLevelNum);
             thirdLevelNumDTO.setTotleNum(totleNum);
-            Double thirdPercent = BigDecimal.valueOf(1)
-                    .subtract(BigDecimal.valueOf(firstPercent))
-                    .subtract(BigDecimal.valueOf(secondPercent))
+            Double thirdPercent = BigDecimal.valueOf(thirdLevelNum)
+                    .divide(BigDecimal.valueOf(totleNum), 4, RoundingMode.HALF_UP)
                     .doubleValue();
             String thirdPercentStr = df.format(BigDecimal.valueOf(thirdPercent).multiply(BigDecimal.valueOf(100))) + "%";
             thirdLevelNumDTO.setPercent(thirdPercent);
@@ -411,8 +409,8 @@ public class ConsoleByDeptFacade {
                             otherNumDTO.setName("其他");
                             otherNumDTO.setNum(num);
                             otherNumDTO.setTotleNum(totle);
-                            Double percent = BigDecimal.valueOf(1)
-                                    .subtract(BigDecimal.valueOf(sumPercent))
+                            Double percent = BigDecimal.valueOf(num)
+                                    .divide(BigDecimal.valueOf(totle), 4, RoundingMode.HALF_UP)
                                     .doubleValue();
                             otherNumDTO.setPercent(percent);
                             String percentStr
@@ -691,8 +689,8 @@ public class ConsoleByDeptFacade {
         String firstLevelPercentStr
                 = df.format(BigDecimal.valueOf(firstLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
         Integer secondLevelNum = mrNum - firstLevelNum;
-        Double secondLevelPercent = BigDecimal.valueOf(1)
-                .subtract(BigDecimal.valueOf(firstLevelPercent))
+        Double secondLevelPercent = BigDecimal.valueOf(secondLevelNum)
+                .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
                 .doubleValue();
         String secondLevelPercentStr
                 = df.format(BigDecimal.valueOf(secondLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";

+ 37 - 12
src/main/java/com/diagbot/facade/ConsoleFacade.java

@@ -10,11 +10,11 @@ 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.FilterPageByAverageVO;
 import com.diagbot.vo.FilterPageVO;
 import com.diagbot.vo.FilterVO;
 import com.google.common.collect.Lists;
@@ -30,7 +30,6 @@ 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;
 
 /**
@@ -353,6 +352,32 @@ public class ConsoleFacade {
         filterPageVO.setHospitalId(hospitalId);
     }
 
+    /**
+     * 平均住院天数、平均花费入参设置
+     *
+     * @param filterPageByAverageVO
+     */
+    private void filterPageByAverageVOSet(FilterPageByAverageVO filterPageByAverageVO) {
+        String hospitalId = SysUserUtils.getCurrentHospitalID();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        Date date = new Date();
+        String year = DateUtil.getYear(date);
+        String startDate = filterFacade.getStartDateStr(filterPageByAverageVO.getType(), null);
+        String endDate = filterFacade.getEndDateStr(filterPageByAverageVO.getType(), null);
+        String lastStartDate = filterFacade.getLastStartDateStr(filterPageByAverageVO.getType());
+        String lastEndDate = filterFacade.getLastEndDateStr(filterPageByAverageVO.getType());
+        String lastYearStartDate = filterFacade.getStartDateStr(filterPageByAverageVO.getType(), Integer.valueOf(year) - 1);
+        String lastYearEndDate = filterFacade.getEndDateStr(filterPageByAverageVO.getType(), Integer.valueOf(year) - 1);
+        filterPageByAverageVO.setHospitalId(hospitalId);
+        filterPageByAverageVO.setUserId(Long.valueOf(userId));
+        filterPageByAverageVO.setStartDate(startDate);
+        filterPageByAverageVO.setEndDate(endDate);
+        filterPageByAverageVO.setLastStartDate(lastStartDate);
+        filterPageByAverageVO.setLastEndDate(lastEndDate);
+        filterPageByAverageVO.setLastYearStartDate(lastYearStartDate);
+        filterPageByAverageVO.setLastYearEndDate(lastYearEndDate);
+    }
+
     /**
      * 各模块缺陷占比(分页)
      *
@@ -394,24 +419,24 @@ public class ConsoleFacade {
     /**
      * 按科室统计平均住院天数(分页)
      *
-     * @param filterPageVO
+     * @param filterPageByAverageVO
      * @return
      */
-    public IPage<AverageStatisticsDTO> getAverageDayNumPage(FilterPageVO filterPageVO) {
-        filterPageVOSet(filterPageVO);
-        IPage<AverageStatisticsDTO> page = homePageFacade.getAverageDayNumPage(filterPageVO);
+    public IPage<AverageStatisticsDTO> getAverageDayNumPage(FilterPageByAverageVO filterPageByAverageVO) {
+        filterPageByAverageVOSet(filterPageByAverageVO);
+        IPage<AverageStatisticsDTO> page = homePageFacade.getAverageDayNumPage(filterPageByAverageVO);
         return page;
     }
 
     /**
      * 按科室统计平均住院费用(分页)
      *
-     * @param filterPageVO
+     * @param filterPageByAverageVO
      * @return
      */
-    public IPage<AverageStatisticsDTO> getAverageFeePage(FilterPageVO filterPageVO) {
-        filterPageVOSet(filterPageVO);
-        IPage<AverageStatisticsDTO> page = homePageFacade.getAverageFeePage(filterPageVO);
+    public IPage<AverageStatisticsDTO> getAverageFeePage(FilterPageByAverageVO filterPageByAverageVO) {
+        filterPageByAverageVOSet(filterPageByAverageVO);
+        IPage<AverageStatisticsDTO> page = homePageFacade.getAverageFeePage(filterPageByAverageVO);
         return page;
     }
 
@@ -536,8 +561,8 @@ public class ConsoleFacade {
         String firstLevelPercentStr
                 = df.format(BigDecimal.valueOf(firstLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
         Integer secondLevelNum = mrNum - firstLevelNum;
-        Double secondLevelPercent = BigDecimal.valueOf(1)
-                .subtract(BigDecimal.valueOf(firstLevelPercent))
+        Double secondLevelPercent = BigDecimal.valueOf(secondLevelNum)
+                .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
                 .doubleValue();
         String secondLevelPercentStr
                 = df.format(BigDecimal.valueOf(secondLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";

+ 11 - 0
src/main/java/com/diagbot/facade/QcTypeCasesEntryFacade.java

@@ -0,0 +1,11 @@
+package com.diagbot.facade;
+
+import com.diagbot.service.impl.QcTypeCasesEntryServiceImpl;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/5/26 16:20
+ */
+public class QcTypeCasesEntryFacade extends QcTypeCasesEntryServiceImpl {
+}

+ 248 - 0
src/main/java/com/diagbot/facade/QcTypeFacade.java

@@ -0,0 +1,248 @@
+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.QcCasesEntrySimpleDTO;
+import com.diagbot.dto.QcTypeDTO;
+import com.diagbot.dto.QcTypePageDTO;
+import com.diagbot.entity.CommonParam;
+import com.diagbot.entity.QcType;
+import com.diagbot.entity.QcTypeCasesEntry;
+import com.diagbot.enums.InsertOrUpdateEnum;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
+import com.diagbot.service.impl.QcTypeCasesEntryServiceImpl;
+import com.diagbot.service.impl.QcTypeServiceImpl;
+import com.diagbot.util.BeanUtil;
+import com.diagbot.util.DateUtil;
+import com.diagbot.util.EntityUtil;
+import com.diagbot.util.ListUtil;
+import com.diagbot.util.SysUserUtils;
+import com.diagbot.vo.DeleteQcTypeVO;
+import com.diagbot.vo.QcEntryHospitalVO;
+import com.diagbot.vo.QcTypeCasesEntryVO;
+import com.diagbot.vo.QcTypeIndexVO;
+import com.diagbot.vo.QcTypePageVO;
+import com.diagbot.vo.QcTypeSaveVO;
+import com.diagbot.vo.QcTypeVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @Author:zhoutg
+ * @time: 2018/11/23 11:37
+ */
+@Component
+public class QcTypeFacade extends QcTypeServiceImpl {
+
+
+    @Autowired
+    @Qualifier("qcTypeCasesEntryServiceImpl")
+    QcTypeCasesEntryServiceImpl qcTypeCasesEntryService;
+    @Autowired
+    QcCasesEntryFacade qcCasesEntryFacade;
+
+    /**
+     * 保存
+     *
+     * @param qcTypeSaveVO
+     */
+    public void saveOrUpdate(QcTypeSaveVO qcTypeSaveVO) {
+        CommonParam param = initCommonParam();
+        qcTypeSaveVO.setHospitalId(Long.valueOf(SysUserUtils.getCurrentHospitalID()));
+        // 保存主表
+        saveQcType(qcTypeSaveVO, param);
+        // 保存质控类型和质控条目映射关系
+        saveQcTypeCasesEntry(qcTypeSaveVO, param);
+    }
+
+    /**
+     * 初始化参数
+     *
+     * @return
+     */
+    public CommonParam initCommonParam() {
+        CommonParam param = new CommonParam();
+        String person = SysUserUtils.getCurrentPrincipleID();
+        param.setNow(DateUtil.now());
+        param.setPerson(person);
+        param.setInsertOrUpdate(InsertOrUpdateEnum.Insert.getKey());
+        return param;
+    }
+
+    /**
+     * 保存映射关系
+     *
+     * @param qcTypeSaveVO
+     * @param param
+     */
+    public void saveQcTypeCasesEntry(QcTypeSaveVO qcTypeSaveVO, CommonParam param) {
+        Date now = param.getNow();
+        String person = param.getPerson();
+        // 先删除原明细(物理删除)
+        qcTypeCasesEntryService.remove(new QueryWrapper<QcTypeCasesEntry>()
+                .eq("type_id", qcTypeSaveVO.getId())
+        );
+        // 再插入新明细
+        List<QcTypeCasesEntryVO> qcTypeCasesEntryVOList = qcTypeSaveVO.getQcTypeCasesEntryVOList();
+        if (ListUtil.isNotEmpty(qcTypeCasesEntryVOList)) {
+            List<QcTypeCasesEntry> saveQcTypeCasesEntry = new ArrayList<>();
+            for (QcTypeCasesEntryVO mapping : qcTypeCasesEntryVOList) {
+                QcTypeCasesEntry bean = new QcTypeCasesEntry();
+                bean.setCaseEntryId(mapping.getCaseEntryId());
+                bean.setCreator(person);
+                bean.setGmtCreate(now);
+                bean.setModifier(person);
+                bean.setGmtModified(now);
+                bean.setTypeId(qcTypeSaveVO.getId());
+                saveQcTypeCasesEntry.add(bean);
+            }
+            qcTypeCasesEntryService.saveBatch(saveQcTypeCasesEntry);
+        }
+    }
+
+    /**
+     * 保存主表
+     *
+     * @param qcTypeSaveVO
+     * @param param
+     */
+    public void saveQcType(QcTypeSaveVO qcTypeSaveVO, CommonParam param) {
+        QcType qcType = new QcType();
+        Long id = qcTypeSaveVO.getId();
+
+        // 保存主表
+        if (qcTypeSaveVO.getId() != null) {
+            qcType = this.getOne(new QueryWrapper<QcType>()
+                    .eq("id", id)
+                    .eq("hospital_id", qcTypeSaveVO.getHospitalId())
+                    .eq("is_deleted", IsDeleteEnum.N.getKey()), false);
+            if (qcType == null) { //校验
+                throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "当前质控类型不存在【id=" + id + "】");
+            }
+            param.setInsertOrUpdate(InsertOrUpdateEnum.Update.getKey());
+        }
+        BeanUtil.copyProperties(qcTypeSaveVO, qcType);
+        Integer count = this.count(new QueryWrapper<QcType>()
+                .eq("name", qcTypeSaveVO.getName())
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("hospital_id", qcTypeSaveVO.getHospitalId())
+                .ne("id", id == null ? -1 : id));
+        // 质控类型hospitalId、name唯一
+        if (count > 0) {
+            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "质控类型已存在");
+        }
+        if (InsertOrUpdateEnum.Insert.getKey() == param.getInsertOrUpdate()) {
+            qcType.setCreator(param.getPerson()); //创建人
+            qcType.setGmtCreate(param.getNow());//创建时间
+        }
+        qcType.setGmtModified(param.getNow());//修改时间
+        qcType.setModifier(param.getPerson());//修改人
+        this.saveOrUpdate(qcType);
+        qcTypeSaveVO.setId(qcType.getId());
+    }
+
+    /**
+     * 标签列表
+     *
+     * @param qcTypePageVO
+     * @return
+     */
+    public IPage<QcTypePageDTO> getListFac(QcTypePageVO qcTypePageVO) {
+        qcTypePageVO.setHospitalId(Long.valueOf(SysUserUtils.getCurrentHospitalID()));
+        IPage<QcTypePageDTO> res = this.getList(qcTypePageVO);
+        return res;
+    }
+
+    /**
+     * 新增时质控条目分组信息
+     *
+     * @param qcEntryHospitalVO
+     * @return
+     */
+    public Map<String, List<QcCasesEntrySimpleDTO>> getEntryByHospital(@RequestBody QcEntryHospitalVO qcEntryHospitalVO) {
+        qcEntryHospitalVO.setHospitalId(Long.valueOf(SysUserUtils.getCurrentHospitalID()));
+        List<QcCasesEntrySimpleDTO> qcCasesEntrySimpleDTOList = qcCasesEntryFacade.getEntryByHospital(qcEntryHospitalVO);
+        return EntityUtil.makeEntityListMap(qcCasesEntrySimpleDTOList, "modeName");
+    }
+
+    /**
+     * 检索
+     *
+     * @param qcTypeIndexVO
+     * @return
+     */
+    public List<QcCasesEntrySimpleDTO> indexFac(QcTypeIndexVO qcTypeIndexVO) {
+        qcTypeIndexVO.setHospitalId(Long.valueOf(SysUserUtils.getCurrentHospitalID()));
+        List<QcCasesEntrySimpleDTO> res = qcCasesEntryFacade.index(qcTypeIndexVO);
+        return res;
+    }
+
+    /**
+     * 根据参数返回质控类型内容
+     *
+     * @param qcTypeVO 获取质控类型内容参数
+     * @return 标签内容
+     */
+    public QcTypeDTO getById(QcTypeVO qcTypeVO) {
+        QcTypeDTO qcTypeDTO = new QcTypeDTO();
+        qcTypeVO.setHospitalId(Long.valueOf(SysUserUtils.getCurrentHospitalID()));
+        QcType qcType = this.getOne(new QueryWrapper<QcType>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("hospital_id", qcTypeVO.getHospitalId())
+                .eq("id", qcTypeVO.getId()), false
+        );
+        if (qcType == null) {
+            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR,
+                    "当前质控类型不存在或已删除【id=" + qcTypeVO.getId() + "】");
+        }
+        BeanUtil.copyProperties(qcType, qcTypeDTO);
+        List<QcCasesEntrySimpleDTO> list = qcTypeCasesEntryService.getByTypeId(qcTypeVO);
+        Map<String, List<QcCasesEntrySimpleDTO>> entryMap = EntityUtil.makeEntityListMap(list, "modeName");
+        qcTypeDTO.setEntryMap(entryMap);
+        return qcTypeDTO;
+    }
+
+    /**
+     * 根据id删除质控类型
+     *
+     * @param deleteQcTypeVO
+     * @return
+     */
+    public Boolean deleteByIdsFac(DeleteQcTypeVO deleteQcTypeVO) {
+        Date now = DateUtil.now();
+        String person = SysUserUtils.getCurrentPrincipleID();
+        // 更新主表
+        Boolean res =
+                this.update(new UpdateWrapper<QcType>()
+                        .eq("is_deleted", IsDeleteEnum.N.getKey())
+                        .eq("hospital_id", SysUserUtils.getCurrentHospitalID())
+                        .in("id", deleteQcTypeVO.getIds())
+                        .set("is_deleted", IsDeleteEnum.Y.getKey())
+                        .set("gmt_modified", now)
+                        .set("modifier", person)
+                );
+
+        if (!res){
+            throw new CommonException(CommonErrorCode.UPDATE_INFO_FAIL);
+        }
+        // 删除明细表
+        if (ListUtil.isNotEmpty(deleteQcTypeVO.getIds())) {
+            qcTypeCasesEntryService.remove(new QueryWrapper<QcTypeCasesEntry>()
+                    .in("type_id", deleteQcTypeVO.getIds())
+            );
+        }
+        return true;
+    }
+
+}

+ 5 - 4
src/main/java/com/diagbot/mapper/HomePageMapper.java

@@ -4,6 +4,7 @@ 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.FilterPageByAverageVO;
 import com.diagbot.vo.FilterPageVO;
 import com.diagbot.vo.FilterVO;
 import org.apache.ibatis.annotations.Param;
@@ -39,16 +40,16 @@ public interface HomePageMapper extends BaseMapper<HomePage> {
     /**
      * 按科室统计平均住院天数(分页)
      *
-     * @param filterPageVO
+     * @param filterPageByAverageVO
      * @return
      */
-    public IPage<AverageStatisticsDTO> getAverageDayNumPage(@Param("filterPageVO") FilterPageVO filterPageVO);
+    public IPage<AverageStatisticsDTO> getAverageDayNumPage(@Param("filterPageByAverageVO") FilterPageByAverageVO filterPageByAverageVO);
 
     /**
      * 按科室统计平均费用(分页)
      *
-     * @param filterPageVO
+     * @param filterPageByAverageVO
      * @return
      */
-    public IPage<AverageStatisticsDTO> getAverageFeePage(@Param("filterPageVO") FilterPageVO filterPageVO);
+    public IPage<AverageStatisticsDTO> getAverageFeePage(@Param("filterPageByAverageVO") FilterPageByAverageVO filterPageByAverageVO);
 }

+ 8 - 1
src/main/java/com/diagbot/mapper/QcCasesEntryMapper.java

@@ -1,11 +1,14 @@
 package com.diagbot.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.diagbot.dto.QcCasesEntryDTO;
+import com.diagbot.dto.QcCasesEntrySimpleDTO;
 import com.diagbot.entity.QcCasesEntry;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.diagbot.vo.AnalyzeVO;
+import com.diagbot.vo.QcEntryHospitalVO;
 import com.diagbot.vo.QcResultAlgQueryVO;
 import com.diagbot.vo.QcResultAlgVO;
+import com.diagbot.vo.QcTypeIndexVO;
 
 import java.util.List;
 
@@ -22,4 +25,8 @@ public interface QcCasesEntryMapper extends BaseMapper<QcCasesEntry> {
     List<QcCasesEntryDTO> getQcCasesEntry(AnalyzeVO analyzeVO);
 
     List<QcResultAlgVO> getQcResultAlgVO(QcResultAlgQueryVO qcResultAlgQueryVO);
+
+    List<QcCasesEntrySimpleDTO> index(QcTypeIndexVO qcTypeIndexVO);
+
+    List<QcCasesEntrySimpleDTO> getEntryByHospital(QcEntryHospitalVO qcEntryHospitalVO);
 }

+ 5 - 0
src/main/java/com/diagbot/mapper/QcTypeCasesEntryMapper.java

@@ -1,7 +1,11 @@
 package com.diagbot.mapper;
 
+import com.diagbot.dto.QcCasesEntrySimpleDTO;
 import com.diagbot.entity.QcTypeCasesEntry;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.vo.QcTypeVO;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +17,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface QcTypeCasesEntryMapper extends BaseMapper<QcTypeCasesEntry> {
 
+    List<QcCasesEntrySimpleDTO> getByTypeId(QcTypeVO qcTypeVO);
 }

+ 10 - 0
src/main/java/com/diagbot/mapper/QcTypeMapper.java

@@ -1,7 +1,10 @@
 package com.diagbot.mapper;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.QcTypePageDTO;
 import com.diagbot.entity.QcType;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.vo.QcTypePageVO;
 
 /**
  * <p>
@@ -13,4 +16,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface QcTypeMapper extends BaseMapper<QcType> {
 
+    /**
+     * 获取标签列表
+     *
+     * @param qcTypePageVO
+     * @return
+     */
+    IPage<QcTypePageDTO> getList(QcTypePageVO qcTypePageVO);
 }

+ 5 - 4
src/main/java/com/diagbot/service/HomePageService.java

@@ -4,6 +4,7 @@ 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.FilterPageByAverageVO;
 import com.diagbot.vo.FilterPageVO;
 import com.diagbot.vo.FilterVO;
 import org.apache.ibatis.annotations.Param;
@@ -38,16 +39,16 @@ public interface HomePageService extends IService<HomePage> {
     /**
      * 按科室统计平均住院天数(分页)
      *
-     * @param filterPageVO
+     * @param filterPageByAverageVO
      * @return
      */
-    public IPage<AverageStatisticsDTO> getAverageDayNumPage(@Param("filterPageVO") FilterPageVO filterPageVO);
+    public IPage<AverageStatisticsDTO> getAverageDayNumPage(@Param("filterPageByAverageVO") FilterPageByAverageVO filterPageByAverageVO);
 
     /**
      * 按科室统计平均费用(分页)
      *
-     * @param filterPageVO
+     * @param filterPageByAverageVO
      * @return
      */
-    public IPage<AverageStatisticsDTO> getAverageFeePage(@Param("filterPageVO") FilterPageVO filterPageVO);
+    public IPage<AverageStatisticsDTO> getAverageFeePage(@Param("filterPageByAverageVO") FilterPageByAverageVO filterPageByAverageVO);
 }

+ 7 - 0
src/main/java/com/diagbot/service/QcCasesEntryService.java

@@ -1,11 +1,14 @@
 package com.diagbot.service;
 
 import com.diagbot.dto.QcCasesEntryDTO;
+import com.diagbot.dto.QcCasesEntrySimpleDTO;
 import com.diagbot.entity.QcCasesEntry;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.diagbot.vo.AnalyzeVO;
+import com.diagbot.vo.QcEntryHospitalVO;
 import com.diagbot.vo.QcResultAlgQueryVO;
 import com.diagbot.vo.QcResultAlgVO;
+import com.diagbot.vo.QcTypeIndexVO;
 
 import java.util.List;
 
@@ -21,4 +24,8 @@ public interface QcCasesEntryService extends IService<QcCasesEntry> {
     List<QcCasesEntryDTO> getQcCasesEntry(AnalyzeVO analyzeVO);
 
     List<QcResultAlgVO> getQcResultAlgVO(QcResultAlgQueryVO qcResultAlgQueryVO);
+
+    List<QcCasesEntrySimpleDTO> index(QcTypeIndexVO qcTypeIndexVO);
+
+    List<QcCasesEntrySimpleDTO> getEntryByHospital(QcEntryHospitalVO qcEntryHospitalVO);
 }

+ 6 - 2
src/main/java/com/diagbot/service/QcTypeCasesEntryService.java

@@ -1,7 +1,11 @@
 package com.diagbot.service;
 
-import com.diagbot.entity.QcTypeCasesEntry;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.dto.QcCasesEntrySimpleDTO;
+import com.diagbot.entity.QcTypeCasesEntry;
+import com.diagbot.vo.QcTypeVO;
+
+import java.util.List;
 
 /**
  * <p>
@@ -12,5 +16,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @since 2020-04-13
  */
 public interface QcTypeCasesEntryService extends IService<QcTypeCasesEntry> {
-
+    List<QcCasesEntrySimpleDTO> getByTypeId(QcTypeVO qcTypeVO);
 }

+ 5 - 1
src/main/java/com/diagbot/service/QcTypeService.java

@@ -1,7 +1,10 @@
 package com.diagbot.service;
 
-import com.diagbot.entity.QcType;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.dto.QcTypePageDTO;
+import com.diagbot.entity.QcType;
+import com.diagbot.vo.QcTypePageVO;
 
 /**
  * <p>
@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface QcTypeService extends IService<QcType> {
 
+    IPage<QcTypePageDTO> getList(QcTypePageVO qcTypePageVO);
 }

+ 7 - 6
src/main/java/com/diagbot/service/impl/HomePageServiceImpl.java

@@ -6,6 +6,7 @@ import com.diagbot.dto.AverageStatisticsDTO;
 import com.diagbot.entity.HomePage;
 import com.diagbot.mapper.HomePageMapper;
 import com.diagbot.service.HomePageService;
+import com.diagbot.vo.FilterPageByAverageVO;
 import com.diagbot.vo.FilterPageVO;
 import com.diagbot.vo.FilterVO;
 import org.apache.ibatis.annotations.Param;
@@ -49,21 +50,21 @@ public class HomePageServiceImpl extends ServiceImpl<HomePageMapper, HomePage> i
     /**
      * 按科室统计平均住院天数(分页)
      *
-     * @param filterPageVO
+     * @param filterPageByAverageVO
      * @return
      */
     @Override
-    public IPage<AverageStatisticsDTO> getAverageDayNumPage(@Param("filterPageVO") FilterPageVO filterPageVO) {
-        return baseMapper.getAverageDayNumPage(filterPageVO);
+    public IPage<AverageStatisticsDTO> getAverageDayNumPage(@Param("filterPageByAverageVO") FilterPageByAverageVO filterPageByAverageVO) {
+        return baseMapper.getAverageDayNumPage(filterPageByAverageVO);
     }
 
     /**
      * 按科室统计平均费用(分页)
      *
-     * @param filterPageVO
+     * @param filterPageByAverageVO
      * @return
      */
-    public IPage<AverageStatisticsDTO> getAverageFeePage(@Param("filterPageVO") FilterPageVO filterPageVO) {
-        return baseMapper.getAverageFeePage(filterPageVO);
+    public IPage<AverageStatisticsDTO> getAverageFeePage(@Param("filterPageByAverageVO") FilterPageByAverageVO filterPageByAverageVO) {
+        return baseMapper.getAverageFeePage(filterPageByAverageVO);
     }
 }

+ 13 - 0
src/main/java/com/diagbot/service/impl/QcCasesEntryServiceImpl.java

@@ -1,13 +1,16 @@
 package com.diagbot.service.impl;
 
 import com.diagbot.dto.QcCasesEntryDTO;
+import com.diagbot.dto.QcCasesEntrySimpleDTO;
 import com.diagbot.entity.QcCasesEntry;
 import com.diagbot.mapper.QcCasesEntryMapper;
 import com.diagbot.service.QcCasesEntryService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.diagbot.vo.AnalyzeVO;
+import com.diagbot.vo.QcEntryHospitalVO;
 import com.diagbot.vo.QcResultAlgQueryVO;
 import com.diagbot.vo.QcResultAlgVO;
+import com.diagbot.vo.QcTypeIndexVO;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -31,4 +34,14 @@ public class QcCasesEntryServiceImpl extends ServiceImpl<QcCasesEntryMapper, QcC
     public List<QcResultAlgVO> getQcResultAlgVO(QcResultAlgQueryVO qcResultAlgQueryVO){
         return baseMapper.getQcResultAlgVO(qcResultAlgQueryVO);
     }
+
+    @Override
+    public List<QcCasesEntrySimpleDTO> index(QcTypeIndexVO qcTypeIndexVO) {
+        return baseMapper.index(qcTypeIndexVO);
+    }
+
+    @Override
+    public List<QcCasesEntrySimpleDTO> getEntryByHospital(QcEntryHospitalVO qcEntryHospitalVO) {
+        return baseMapper.getEntryByHospital(qcEntryHospitalVO);
+    }
 }

+ 9 - 2
src/main/java/com/diagbot/service/impl/QcTypeCasesEntryServiceImpl.java

@@ -1,11 +1,15 @@
 package com.diagbot.service.impl;
 
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.dto.QcCasesEntrySimpleDTO;
 import com.diagbot.entity.QcTypeCasesEntry;
 import com.diagbot.mapper.QcTypeCasesEntryMapper;
 import com.diagbot.service.QcTypeCasesEntryService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.vo.QcTypeVO;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * <p>
  * 质控类型和质控条目关联表 服务实现类
@@ -16,5 +20,8 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class QcTypeCasesEntryServiceImpl extends ServiceImpl<QcTypeCasesEntryMapper, QcTypeCasesEntry> implements QcTypeCasesEntryService {
-
+    @Override
+    public List<QcCasesEntrySimpleDTO> getByTypeId(QcTypeVO qcTypeVO) {
+        return baseMapper.getByTypeId(qcTypeVO);
+    }
 }

+ 7 - 1
src/main/java/com/diagbot/service/impl/QcTypeServiceImpl.java

@@ -1,9 +1,12 @@
 package com.diagbot.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.QcTypePageDTO;
 import com.diagbot.entity.QcType;
 import com.diagbot.mapper.QcTypeMapper;
 import com.diagbot.service.QcTypeService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.vo.QcTypePageVO;
 import org.springframework.stereotype.Service;
 
 /**
@@ -16,5 +19,8 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class QcTypeServiceImpl extends ServiceImpl<QcTypeMapper, QcType> implements QcTypeService {
-
+    @Override
+    public IPage<QcTypePageDTO> getList(QcTypePageVO qcTypePageVO) {
+        return baseMapper.getList(qcTypePageVO);
+    }
 }

+ 19 - 0
src/main/java/com/diagbot/vo/DeleteQcTypeVO.java

@@ -0,0 +1,19 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * @Description:
+ * @author: ztg
+ * @time: 2019/1/28 15:45
+ */
+@Getter
+@Setter
+public class DeleteQcTypeVO {
+    @NotEmpty(message = "ids不能为空")
+    private List<Long> ids;
+}

+ 35 - 0
src/main/java/com/diagbot/vo/FilterPageByAverageVO.java

@@ -0,0 +1,35 @@
+package com.diagbot.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/5/21 19:35
+ */
+@Getter
+@Setter
+public class FilterPageByAverageVO extends FilterPageVO {
+    /**
+     * 上一统计区间起始时间
+     */
+    @ApiModelProperty(hidden = true)
+    private String lastStartDate;
+    /**
+     * 上一统计区间结束时间
+     */
+    @ApiModelProperty(hidden = true)
+    private String lastEndDate;
+    /**
+     * 去年同一区间起始时间
+     */
+    @ApiModelProperty(hidden = true)
+    private String lastYearStartDate;
+    /**
+     * 去年同一区间结束时间
+     */
+    @ApiModelProperty(hidden = true)
+    private String lastYearEndDate;
+}

+ 4 - 1
src/main/java/com/diagbot/vo/FilterPageVO.java

@@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
 import lombok.Setter;
 
+import javax.validation.constraints.NotNull;
+
 /**
  * @Description:
  * @Author:zhaops
@@ -16,6 +18,7 @@ public class FilterPageVO extends Page {
     /**
      * 统计维度 1-本月,2-本年
      */
+    @NotNull(message = "请输入本年或本月")
     private Integer type;
     /**
      * 时间类型 1-本月/本年,2-上月/去年,3-去年本月/去年
@@ -52,4 +55,4 @@ public class FilterPageVO extends Page {
      * 模块id:243=病案首页
      */
     private Long casesId;
-}
+}

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

@@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
 import lombok.Setter;
 
+import javax.validation.constraints.NotNull;
+
 /**
  * @Description:
  * @Author:zhaops
@@ -15,6 +17,7 @@ public class FilterVO {
     /**
      * 统计维度 1-本月,2-本年
      */
+    @NotNull(message = "请输入本年或本月")
     private Integer type;
     /**
      * 起始时间

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

@@ -0,0 +1,18 @@
+package com.diagbot.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhoutg
+ * @time: 2018/11/29 15:09
+ */
+@Getter
+@Setter
+public class QcEntryHospitalVO {
+    // 医院id
+    @ApiModelProperty(hidden = true)
+    private Long hospitalId;
+}

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

@@ -0,0 +1,15 @@
+package com.diagbot.vo;
+
+import lombok.Data;
+
+/**
+ * @Description:
+ * @Author: ztg
+ * @Date: 2018/10/24 16:11
+ */
+@Data
+public class QcTypeCasesEntryVO {
+
+    // 质控条目id
+    private Long caseEntryId;
+}

+ 24 - 0
src/main/java/com/diagbot/vo/QcTypeIndexVO.java

@@ -0,0 +1,24 @@
+package com.diagbot.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @Author:zhoutg
+ * @time: 2018/11/29 15:09
+ */
+@Getter
+@Setter
+public class QcTypeIndexVO {
+    // 界面输入
+    private String input;
+    // 医院id
+    @ApiModelProperty(hidden = true)
+    private Long hospitalId;
+    // 过滤caseEntryId
+    private List<Long> notIds;
+}

+ 22 - 0
src/main/java/com/diagbot/vo/QcTypePageVO.java

@@ -0,0 +1,22 @@
+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: ztg
+ * @Date: 2018/12/13 10:07
+ */
+@Getter
+@Setter
+public class QcTypePageVO extends Page {
+
+    // 名称
+    private String name;
+    // 医院id
+    @ApiModelProperty(hidden = true)
+    private Long hospitalId;
+}

+ 26 - 0
src/main/java/com/diagbot/vo/QcTypeSaveVO.java

@@ -0,0 +1,26 @@
+package com.diagbot.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description: 质控类型保存入参
+ * @Author: ztg
+ * @Date: 2018/10/24 16:11
+ */
+@Data
+public class QcTypeSaveVO {
+
+    // 主键
+    private Long id;
+    // 医院ID
+    @ApiModelProperty(hidden = true)
+    private Long hospitalId;
+    // 质控类型名称
+    private String name;
+    // 质控类型和质控条目关联信息
+    private List<QcTypeCasesEntryVO> qcTypeCasesEntryVOList = new ArrayList<>();
+}

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

@@ -0,0 +1,18 @@
+package com.diagbot.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: zhoutg
+ * @time: 2018/8/6 10:16
+ */
+@Getter
+@Setter
+public class QcTypeVO {
+    private Long id;
+    @ApiModelProperty(hidden = true)
+    private Long hospitalId;
+}

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

@@ -17,7 +17,9 @@ 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 springfox.documentation.annotations.ApiIgnore;
 
+import javax.validation.Valid;
 import java.util.List;
 import java.util.Map;
 
@@ -39,7 +41,7 @@ public class ConsoleByDeptController {
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/leaveHosCountByDept")
     @SysLogger("leaveHosCountByDept")
-    public RespDTO<Map<String, Object>> leaveHosCountByDept(@RequestBody FilterVO filterVO) {
+    public RespDTO<Map<String, Object>> leaveHosCountByDept(@RequestBody @Valid FilterVO filterVO) {
         Map<String, Object> data = consoleByDeptFacade.leaveHosCountByDept(filterVO);
         return RespDTO.onSuc(data);
     }
@@ -48,7 +50,7 @@ public class ConsoleByDeptController {
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/mrCountByDept")
     @SysLogger("mrCountByDept")
-    public RespDTO<Map<String, Object>> mrCountByDept(@RequestBody FilterVO filterVO) {
+    public RespDTO<Map<String, Object>> mrCountByDept(@RequestBody @Valid FilterVO filterVO) {
         Map<String, Object> data = consoleByDeptFacade.mrCountByDept(filterVO);
         return RespDTO.onSuc(data);
     }
@@ -57,7 +59,7 @@ public class ConsoleByDeptController {
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/entryCountGroupByCaseAndDept")
     @SysLogger("entryCountGroupByCaseAndDept")
-    public RespDTO<Map<String, Object>> entryCountGroupByCaseAndDept(@RequestBody FilterVO filterVO) {
+    public RespDTO<Map<String, Object>> entryCountGroupByCaseAndDept(@RequestBody @Valid FilterVO filterVO) {
         Map<String, Object> data = consoleByDeptFacade.entryCountGroupByCaseAndDept(filterVO);
         return RespDTO.onSuc(data);
     }
@@ -66,7 +68,7 @@ public class ConsoleByDeptController {
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/entryCountGroupByEntryAndDept")
     @SysLogger("entryCountGroupByEntryAndDept")
-    public RespDTO<Map<String, Object>> entryCountGroupByEntryAndDept(@RequestBody FilterVO filterVO) {
+    public RespDTO<Map<String, Object>> entryCountGroupByEntryAndDept(@RequestBody @Valid FilterVO filterVO) {
         Map<String, Object> data = consoleByDeptFacade.entryCountGroupByEntryAndDept(filterVO);
         return RespDTO.onSuc(data);
     }
@@ -86,7 +88,7 @@ public class ConsoleByDeptController {
                     "desc: 排序(降序) <br>")
     @PostMapping("/homePageLevelByDeptLimit")
     @SysLogger("homePageLevelByDeptLimit")
-    public RespDTO<List<LevelStatisticsDTO>> homePageLevelByDeptLimit(@RequestBody FilterOrderByDeptVO filterOrderByDeptVO) {
+    public RespDTO<List<LevelStatisticsDTO>> homePageLevelByDeptLimit(@RequestBody @Valid FilterOrderByDeptVO filterOrderByDeptVO) {
         return RespDTO.onSuc(consoleByDeptFacade.homePageLevelByDeptLimit(filterOrderByDeptVO));
     }
     //endregion -----------------------首页接口结束------------------------------
@@ -107,7 +109,7 @@ public class ConsoleByDeptController {
                     "deptName: 科室名称(必填)<br>")
     @PostMapping("/entryCountGroupByCaseAndDeptPage")
     @SysLogger("entryCountGroupByCaseAndDeptPage")
-    public RespDTO<IPage<DeptNumDTO>> entryCountGroupByCaseAndDeptPage(@RequestBody FilterPageByDeptVO filterPageByDeptVO) {
+    public RespDTO<IPage<DeptNumDTO>> entryCountGroupByCaseAndDeptPage(@RequestBody @Valid FilterPageByDeptVO filterPageByDeptVO) {
         IPage<DeptNumDTO> data = consoleByDeptFacade.entryCountGroupByCaseAndDeptPage(filterPageByDeptVO);
         return RespDTO.onSuc(data);
     }
@@ -115,11 +117,11 @@ public class ConsoleByDeptController {
     @ApiOperation(value = "条目缺陷占比-科室(分页)-内页[by:zhaops]",
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
                     "name: 缺陷名称<br>" +
-                    "deptName: 科室名称(必填)<br>"+
+                    "deptName: 科室名称(必填)<br>" +
                     "casesId: 模块id:243=病案首页 <br>")
     @PostMapping("/entryCountGroupByEntryAndDeptPage")
     @SysLogger("entryCountGroupByEntryAndDeptPage")
-    public RespDTO<IPage<DeptNumDTO>> entryCountGroupByEntryAndDeptPage(@RequestBody FilterPageByDeptVO filterPageByDeptVO) {
+    public RespDTO<IPage<DeptNumDTO>> entryCountGroupByEntryAndDeptPage(@RequestBody @Valid FilterPageByDeptVO filterPageByDeptVO) {
         IPage<DeptNumDTO> data = consoleByDeptFacade.entryCountGroupByEntryAndDeptPage(filterPageByDeptVO);
         return RespDTO.onSuc(data);
     }
@@ -131,7 +133,8 @@ public class ConsoleByDeptController {
                     "doctorName: 医生名称(必填)<br>")
     @PostMapping("/resultStatisticsByDeptAndDoctorPage")
     @SysLogger("resultStatisticsByDeptAndDoctorPage")
-    public RespDTO<IPage<DeptNumDTO>> resultStatisticsByDeptAndDoctorPage(@RequestBody FilterPageByDeptVO filterPageByDeptVO) {
+    @ApiIgnore
+    public RespDTO<IPage<DeptNumDTO>> resultStatisticsByDeptAndDoctorPage(@RequestBody @Valid FilterPageByDeptVO filterPageByDeptVO) {
         IPage<DeptNumDTO> data = consoleByDeptFacade.resultStatisticsByDeptAndDoctorPage(filterPageByDeptVO);
         return RespDTO.onSuc(data);
     }
@@ -151,7 +154,7 @@ public class ConsoleByDeptController {
                     "desc: 排序(降序) <br>")
     @PostMapping("/levelStatisticsByDept")
     @SysLogger("levelStatisticsByDept")
-    public RespDTO<List<LevelStatisticsDTO>> levelStatisticsByDept(@RequestBody FilterOrderByDeptVO filterOrderByDeptVO) {
+    public RespDTO<List<LevelStatisticsDTO>> levelStatisticsByDept(@RequestBody @Valid FilterOrderByDeptVO filterOrderByDeptVO) {
         return RespDTO.onSuc(consoleByDeptFacade.levelStatisticsByDept(filterOrderByDeptVO));
     }
 
@@ -170,10 +173,9 @@ public class ConsoleByDeptController {
                     "desc: 排序(降序) <br>")
     @PostMapping("/homePageLevelStatisticsByDept")
     @SysLogger("homePageLevelStatisticsByDept")
-    public RespDTO<List<LevelStatisticsDTO>> homePageLevelStatisticsByDept(@RequestBody FilterOrderByDeptVO filterOrderByDeptVO) {
+    public RespDTO<List<LevelStatisticsDTO>> homePageLevelStatisticsByDept(@RequestBody @Valid FilterOrderByDeptVO filterOrderByDeptVO) {
         return RespDTO.onSuc(consoleByDeptFacade.homePageLevelStatisticsByDept(filterOrderByDeptVO));
     }
 
     //endregion -----------------------内页接口结束------------------------------
-
 }

+ 30 - 28
src/main/java/com/diagbot/web/ConsoleController.java

@@ -8,6 +8,7 @@ import com.diagbot.dto.NumDTO;
 import com.diagbot.dto.RespDTO;
 import com.diagbot.facade.ConsoleFacade;
 import com.diagbot.vo.FilterOrderVO;
+import com.diagbot.vo.FilterPageByAverageVO;
 import com.diagbot.vo.FilterPageVO;
 import com.diagbot.vo.FilterVO;
 import io.swagger.annotations.Api;
@@ -19,6 +20,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import springfox.documentation.annotations.ApiIgnore;
 
+import javax.validation.Valid;
 import java.util.List;
 import java.util.Map;
 
@@ -42,7 +44,7 @@ public class ConsoleController {
     @PostMapping("/mrStatistics")
     @SysLogger("mrStatistics")
     @ApiIgnore
-    public RespDTO<Map<String, Object>> mrStatistics(@RequestBody FilterVO filterVO) {
+    public RespDTO<Map<String, Object>> mrStatistics(@RequestBody @Valid FilterVO filterVO) {
         Map<String, Object> data = consoleFacade.mrStatistics(filterVO);
         return RespDTO.onSuc(data);
     }
@@ -52,7 +54,7 @@ public class ConsoleController {
     @PostMapping("/resultStatistics")
     @SysLogger("resultStatistics")
     @ApiIgnore
-    public RespDTO<Map<String, Object>> resultStatistics(@RequestBody FilterVO filterVO) {
+    public RespDTO<Map<String, Object>> resultStatistics(@RequestBody @Valid FilterVO filterVO) {
         Map<String, Object> data = consoleFacade.resultStatistics(filterVO);
         return RespDTO.onSuc(data);
     }
@@ -62,7 +64,7 @@ public class ConsoleController {
     @PostMapping("/averageStatistics")
     @SysLogger("averageStatistics")
     @ApiIgnore
-    public RespDTO<Map<String, Object>> averageStatistics(@RequestBody FilterVO filterVO) {
+    public RespDTO<Map<String, Object>> averageStatistics(@RequestBody @Valid FilterVO filterVO) {
         Map<String, Object> data = consoleFacade.averageStatistics(filterVO);
         return RespDTO.onSuc(data);
     }
@@ -80,7 +82,7 @@ public class ConsoleController {
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/getAverageDayNum")
     @SysLogger("getAverageDayNum")
-    public RespDTO<Map<String, Object>> getAverageDayNum(@RequestBody FilterVO filterVO) {
+    public RespDTO<Map<String, Object>> getAverageDayNum(@RequestBody @Valid FilterVO filterVO) {
         return RespDTO.onSuc(consoleFacade.getAverageDayNum(filterVO));
     }
 
@@ -94,7 +96,7 @@ public class ConsoleController {
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/getAverageFee")
     @SysLogger("getAverageFee")
-    public RespDTO<Map<String, Object>> getAverageFee(@RequestBody FilterVO filterVO) {
+    public RespDTO<Map<String, Object>> getAverageFee(@RequestBody @Valid FilterVO filterVO) {
         return RespDTO.onSuc(consoleFacade.getAverageFee(filterVO));
     }
 
@@ -108,7 +110,7 @@ public class ConsoleController {
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/getAverageScore")
     @SysLogger("getAverageScore")
-    public RespDTO<Map<String, Object>> getAverageScore(@RequestBody FilterVO filterVO) {
+    public RespDTO<Map<String, Object>> getAverageScore(@RequestBody @Valid FilterVO filterVO) {
         return RespDTO.onSuc(consoleFacade.getAverageScore(filterVO));
     }
 
@@ -122,7 +124,7 @@ public class ConsoleController {
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/getLevelResultDept")
     @SysLogger("getLevelResultDept")
-    public RespDTO<Map<String, Object>> getLevelResultDept(@RequestBody FilterVO filterVO) {
+    public RespDTO<Map<String, Object>> getLevelResultDept(@RequestBody @Valid FilterVO filterVO) {
         return RespDTO.onSuc(consoleFacade.getLevelResultDept(filterVO));
     }
 
@@ -136,7 +138,7 @@ public class ConsoleController {
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/leaveHosCount")
     @SysLogger("leaveHosCount")
-    public RespDTO<Map<String, Object>> leaveHosCount(@RequestBody FilterVO filterVO) {
+    public RespDTO<Map<String, Object>> leaveHosCount(@RequestBody @Valid FilterVO filterVO) {
         return RespDTO.onSuc(consoleFacade.leaveHosCount(filterVO));
     }
 
@@ -150,7 +152,7 @@ public class ConsoleController {
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/mrCount")
     @SysLogger("mrCount")
-    public RespDTO<Map<String, Object>> mrCount(@RequestBody FilterVO filterVO) {
+    public RespDTO<Map<String, Object>> mrCount(@RequestBody @Valid FilterVO filterVO) {
         return RespDTO.onSuc(consoleFacade.mrCount(filterVO));
     }
 
@@ -164,7 +166,7 @@ public class ConsoleController {
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/entryCountGroupByCase")
     @SysLogger("entryCountGroupByCase")
-    public RespDTO<Map<String, Object>> entryCountGroupByCase(@RequestBody FilterVO filterVO) {
+    public RespDTO<Map<String, Object>> entryCountGroupByCase(@RequestBody @Valid FilterVO filterVO) {
         return RespDTO.onSuc(consoleFacade.entryCountGroupByCase(filterVO));
     }
 
@@ -178,7 +180,7 @@ public class ConsoleController {
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/entryCountGroupByEntry")
     @SysLogger("entryCountGroupByEntry")
-    public RespDTO<Map<String, Object>> entryCountGroupByEntry(@RequestBody FilterVO filterVO) {
+    public RespDTO<Map<String, Object>> entryCountGroupByEntry(@RequestBody @Valid FilterVO filterVO) {
         return RespDTO.onSuc(consoleFacade.entryCountGroupByEntry(filterVO));
     }
 
@@ -192,7 +194,7 @@ public class ConsoleController {
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/entryByDept")
     @SysLogger("entryByDept")
-    public RespDTO<Map<String, Object>> entryByDept(@RequestBody FilterVO filterVO) {
+    public RespDTO<Map<String, Object>> entryByDept(@RequestBody @Valid FilterVO filterVO) {
         return RespDTO.onSuc(consoleFacade.entryByDept(filterVO));
     }
     //endregion-----------------------单独接口结束-------------------------------
@@ -209,7 +211,7 @@ public class ConsoleController {
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/entryCountGroupByCasePage")
     @SysLogger("entryCountGroupByCasePage")
-    public RespDTO<IPage<NumDTO>> entryCountGroupByCasePage(@RequestBody FilterPageVO filterPageVO) {
+    public RespDTO<IPage<NumDTO>> entryCountGroupByCasePage(@RequestBody @Valid FilterPageVO filterPageVO) {
         return RespDTO.onSuc(consoleFacade.entryCountGroupByCasePage(filterPageVO));
     }
 
@@ -220,19 +222,19 @@ public class ConsoleController {
      * @return
      */
     @ApiOperation(value = "条目缺陷占比(分页)[by:zhaops]",
-            notes = "type: 统计维度 1-本月,2-本年(必填)<br>"+
-                    "deptName: 科室名称 <br>"+
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
+                    "deptName: 科室名称 <br>" +
                     "casesId: 模块id:243=病案首页 <br>")
     @PostMapping("/entryCountGroupByEntryPage")
     @SysLogger("entryCountGroupByEntryPage")
-    public RespDTO<IPage<NumDTO>> entryCountGroupByEntryPage(@RequestBody FilterPageVO filterPageVO) {
+    public RespDTO<IPage<NumDTO>> entryCountGroupByEntryPage(@RequestBody @Valid FilterPageVO filterPageVO) {
         return RespDTO.onSuc(consoleFacade.entryCountGroupByEntryPage(filterPageVO));
     }
 
     /**
      * 按科室统计平均住院天数(分页)
      *
-     * @param filterPageVO
+     * @param filterPageByAverageVO
      * @return
      */
     @ApiOperation(value = "按科室统计平均住院天数(分页)[by:zhaops]",
@@ -240,14 +242,14 @@ public class ConsoleController {
                     "dateType: 时间类型 1-本月/本年,2-上月/去年,3-去年本月/去年<br>")
     @PostMapping("/getAverageDayNumPage")
     @SysLogger("getAverageDayNumPage")
-    public RespDTO<IPage<AverageStatisticsDTO>> getAverageDayNumPage(@RequestBody FilterPageVO filterPageVO) {
-        return RespDTO.onSuc(consoleFacade.getAverageDayNumPage(filterPageVO));
+    public RespDTO<IPage<AverageStatisticsDTO>> getAverageDayNumPage(@RequestBody @Valid FilterPageByAverageVO filterPageByAverageVO) {
+        return RespDTO.onSuc(consoleFacade.getAverageDayNumPage(filterPageByAverageVO));
     }
 
     /**
      * 按科室统计平均住院费用(分页)
      *
-     * @param filterPageVO
+     * @param filterPageByAverageVO
      * @return
      */
     @ApiOperation(value = "按科室统计平均住院费用(分页)[by:zhaops]",
@@ -255,8 +257,8 @@ public class ConsoleController {
                     "dateType: 时间类型 1-本月/本年,2-上月/去年,3-去年本月/去年<br>")
     @PostMapping("/getAverageFeePage")
     @SysLogger("getAverageFeePage")
-    public RespDTO<IPage<AverageStatisticsDTO>> getAverageFeePage(@RequestBody FilterPageVO filterPageVO) {
-        return RespDTO.onSuc(consoleFacade.getAverageFeePage(filterPageVO));
+    public RespDTO<IPage<AverageStatisticsDTO>> getAverageFeePage(@RequestBody @Valid FilterPageByAverageVO filterPageByAverageVO) {
+        return RespDTO.onSuc(consoleFacade.getAverageFeePage(filterPageByAverageVO));
     }
 
     /**
@@ -269,7 +271,7 @@ public class ConsoleController {
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/getAverageScoreByDeptPage")
     @SysLogger("getAverageScoreByDeptPage")
-    public RespDTO<IPage<AverageStatisticsDTO>> getAverageScoreByDeptPage(@RequestBody FilterPageVO filterPageVO) {
+    public RespDTO<IPage<AverageStatisticsDTO>> getAverageScoreByDeptPage(@RequestBody @Valid FilterPageVO filterPageVO) {
         return RespDTO.onSuc(consoleFacade.getAverageScoreByDeptPage(filterPageVO));
     }
 
@@ -283,7 +285,7 @@ public class ConsoleController {
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/resultStatisticsByDeptPage")
     @SysLogger("resultStatisticsByDeptPage")
-    public RespDTO<IPage<NumDTO>> resultStatisticsByDeptPage(@RequestBody FilterPageVO filterPageVO) {
+    public RespDTO<IPage<NumDTO>> resultStatisticsByDeptPage(@RequestBody @Valid FilterPageVO filterPageVO) {
         return RespDTO.onSuc(consoleFacade.resultStatisticsByDeptPage(filterPageVO));
     }
 
@@ -297,7 +299,7 @@ public class ConsoleController {
             notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
     @PostMapping("/levelPercentGroupByDeptPage")
     @SysLogger("levelPercentGroupByDeptPage")
-    public RespDTO<IPage<NumDTO>> levelPercentGroupByDeptPage(@RequestBody FilterPageVO filterPageVO) {
+    public RespDTO<IPage<NumDTO>> levelPercentGroupByDeptPage(@RequestBody @Valid FilterPageVO filterPageVO) {
         return RespDTO.onSuc(consoleFacade.levelPercentGroupByDeptPage(filterPageVO));
     }
 
@@ -317,7 +319,7 @@ public class ConsoleController {
                     "desc: 排序(降序) <br>")
     @PostMapping("/levelStatistics")
     @SysLogger("levelStatistics")
-    public RespDTO<List<LevelStatisticsDTO>> levelStatistics(@RequestBody FilterOrderVO filterOrderVO) {
+    public RespDTO<List<LevelStatisticsDTO>> levelStatistics(@RequestBody @Valid FilterOrderVO filterOrderVO) {
         return RespDTO.onSuc(consoleFacade.levelStatistics(filterOrderVO));
     }
 
@@ -335,7 +337,7 @@ public class ConsoleController {
                     "desc: 排序(降序) <br>")
     @PostMapping("/homePageLevelStatistics")
     @SysLogger("homePageLevelStatistics")
-    public RespDTO<List<LevelStatisticsDTO>> homePageLevelStatistics(@RequestBody FilterOrderVO filterOrderVO) {
+    public RespDTO<List<LevelStatisticsDTO>> homePageLevelStatistics(@RequestBody @Valid FilterOrderVO filterOrderVO) {
         return RespDTO.onSuc(consoleFacade.homePageLevelStatistics(filterOrderVO));
     }
 
@@ -353,7 +355,7 @@ public class ConsoleController {
                     "desc: 排序(降序) <br>")
     @PostMapping("/homePageLevelLimit")
     @SysLogger("homePageLevelLimit")
-    public RespDTO<List<LevelStatisticsDTO>> homePageLevelLimit(@RequestBody FilterOrderVO filterOrderVO) {
+    public RespDTO<List<LevelStatisticsDTO>> homePageLevelLimit(@RequestBody @Valid FilterOrderVO filterOrderVO) {
         return RespDTO.onSuc(consoleFacade.homePageLevelLimit(filterOrderVO));
     }
 }

+ 108 - 0
src/main/java/com/diagbot/web/QcTypeController.java

@@ -0,0 +1,108 @@
+package com.diagbot.web;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.annotation.SysLogger;
+import com.diagbot.dto.QcCasesEntrySimpleDTO;
+import com.diagbot.dto.QcTypeDTO;
+import com.diagbot.dto.QcTypePageDTO;
+import com.diagbot.dto.RespDTO;
+import com.diagbot.entity.QcQuestionInfo;
+import com.diagbot.facade.QcTypeFacade;
+import com.diagbot.vo.DeleteQcTypeVO;
+import com.diagbot.vo.QcEntryHospitalVO;
+import com.diagbot.vo.QcTypeIndexVO;
+import com.diagbot.vo.QcTypePageVO;
+import com.diagbot.vo.QcTypeSaveVO;
+import com.diagbot.vo.QcTypeVO;
+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 springfox.documentation.annotations.ApiIgnore;
+
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 质控类型标准 前端控制器
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-05-14
+ */
+@RestController
+@RequestMapping("/qc/qcType")
+@SuppressWarnings("unchecked")
+@Api(value = "质控类型相关API", tags = { "质控类型相关API" })
+public class QcTypeController {
+
+    @Autowired
+    QcTypeFacade qcTypeFacade;
+
+    @ApiOperation(value = "新增或更新[by:gaodm]",
+            notes = "")
+    @PostMapping("/saveOrUpdate")
+    @SysLogger("saveOrUpdate")
+    @Transactional
+    public RespDTO<Boolean> saveOrUpdate(@RequestBody QcTypeSaveVO qcTypeSaveVO) {
+        qcTypeFacade.saveOrUpdate(qcTypeSaveVO);
+        return RespDTO.onSuc(true);
+    }
+
+    @ApiOperation(value = "分页列表[by:gaodm]",
+            notes = "    // 名称\n" +
+                    "     String name;")
+    @PostMapping("/page")
+    @SysLogger("page")
+    public RespDTO<IPage<QcTypePageDTO>> list(@RequestBody QcTypePageVO qcTypePageVO) {
+        IPage<QcTypePageDTO> data = qcTypeFacade.getListFac(qcTypePageVO);
+        return RespDTO.onSuc(data);
+    }
+
+    @ApiOperation(value = "新增时质控条目分组信息[by:gaodm]",
+            notes = "")
+    @PostMapping("/getEntryByHospital")
+    @SysLogger("getEntryByHospital")
+    public RespDTO<Map<String, List<QcCasesEntrySimpleDTO>>> getEntryByHospital(@RequestBody QcEntryHospitalVO qcEntryHospitalVO) {
+        Map<String, List<QcCasesEntrySimpleDTO>> data = qcTypeFacade.getEntryByHospital(qcEntryHospitalVO);
+        return RespDTO.onSuc(data);
+    }
+
+    @ApiOperation(value = "质控条目检索[by:gaodm]",
+            notes = "    // 界面输入\n" +
+                    "     String input;\n" +
+                    "    // 过滤caseEntryId\n" +
+                    "     List<Long> notIds;")
+    @PostMapping("/index")
+    @SysLogger("index")
+    @ApiIgnore
+    public RespDTO<List<QcQuestionInfo>> index(@RequestBody QcTypeIndexVO qcTypeIndexVO) {
+        List<QcCasesEntrySimpleDTO> data = qcTypeFacade.indexFac(qcTypeIndexVO);
+        return RespDTO.onSuc(data);
+    }
+
+    @ApiOperation(value = "删除[by:gaodm]",
+            notes = "")
+    @PostMapping("/delete")
+    @SysLogger("delete")
+    @Transactional
+    public RespDTO<Boolean> delete(@Valid @RequestBody DeleteQcTypeVO deleteQcTypeVO) {
+        qcTypeFacade.deleteByIdsFac(deleteQcTypeVO);
+        return RespDTO.onSuc(true);
+    }
+
+    @ApiOperation(value = "根据id返回内容[by:gaodm]",
+            notes = "id: qcTypeId<br>" )
+    @PostMapping("/getById")
+    @SysLogger("getById")
+    public RespDTO<QcTypeDTO> getById(@RequestBody QcTypeVO qcTypeVO) {
+        QcTypeDTO data = qcTypeFacade.getById(qcTypeVO);
+        return RespDTO.onSuc(data);
+    }
+}

+ 12 - 11
src/main/resources/mapper/BehospitalInfoMapper.xml

@@ -905,8 +905,8 @@
         a.beh_dept_id AS deptId,
         a.beh_dept_name AS deptName,
         count( DISTINCT c.id ) AS mrNum,
-        ROUND( sum( c.score_res ), 2 ) AS totleValue,
-        ROUND( sum( c.score_res )/ count(*), 2 ) AS averageValue,
+        ROUND( sum( CAST(c.score_res as DECIMAL ( 18, 2 )) ), 2 ) AS totleValue,
+        ROUND( sum( CAST(c.score_res as DECIMAL ( 18, 2 )) )/ 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,
@@ -1070,8 +1070,8 @@
         a.beh_dept_id AS deptId,
         a.beh_dept_name AS deptName,
         count( DISTINCT c.id ) AS mrNum,
-        ROUND( sum( c.score_res ), 2 ) AS totleValue,
-        ROUND( sum( c.score_res )/ count(*), 2 ) AS averageValue,
+        ROUND( sum( CAST(c.score_res as DECIMAL ( 18, 2 )) ), 2 ) AS totleValue,
+        ROUND( sum( CAST(c.score_res as DECIMAL ( 18, 2 )) )/ 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,
@@ -1140,6 +1140,7 @@
         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 d.cases_id = e.cases_id
         AND d.cases_entry_id = e.id
         AND d.cases_id = 243
@@ -1228,8 +1229,8 @@
         a.doctor_id AS doctorId,
         a.doctor_name AS doctorName,
         count( DISTINCT c.id ) AS mrNum,
-        ROUND( sum( c.score_res ), 2 ) AS totleValue,
-        ROUND( sum( c.score_res )/ count(*), 2 ) AS averageValue,
+        ROUND( sum( CAST(c.score_res as DECIMAL ( 18, 2 )) ), 2 ) AS totleValue,
+        ROUND( sum( CAST(c.score_res as DECIMAL ( 18, 2 )) )/ 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,
@@ -1411,8 +1412,8 @@
         a.doctor_id AS doctorId,
         a.doctor_name AS doctorName,
         count( DISTINCT c.id ) AS mrNum,
-        ROUND( sum( c.score_res ), 2 ) AS totleValue,
-        ROUND( sum( c.score_res )/ count(*), 2 ) AS averageValue,
+        ROUND( sum( CAST(c.score_res as DECIMAL ( 18, 2 )) ), 2 ) AS totleValue,
+        ROUND( sum( CAST(c.score_res as DECIMAL ( 18, 2 )) )/ 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,
@@ -1429,17 +1430,17 @@
         med_behospital_info a,
         med_home_page b,
         med_qcresult_cases c,
-        sys_user_dept e
+        sys_user_dept f
         WHERE
         a.is_deleted = 'N'
         AND b.is_deleted = 'N'
         AND c.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.behospital_code = b.behospital_code
         AND a.behospital_code = c.behospital_code
-        AND a.beh_dept_id = e.dept_id
+        AND a.beh_dept_id = f.dept_id
         AND c.cases_id = 243
         <![CDATA[AND a.qc_type_id <>0 ]]>
         <if test="hospitalId != null and hospitalId != ''">

+ 198 - 30
src/main/resources/mapper/HomePageMapper.xml

@@ -144,8 +144,8 @@
         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
+        round( sum( CAST(b.behospital_day_num AS DECIMAL ( 18, 2 ) ))/ count(*), 2 ) AS averageValue,
+        round( sum( CAST(b.behospital_day_num AS DECIMAL ( 18, 2 ) )), 2 ) AS totleValue
         FROM
         med_behospital_info a,
         med_home_page b
@@ -175,8 +175,8 @@
         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
+        round( sum( CAST(b.total_fee AS DECIMAL ( 18, 2 ) ))/ count(*), 2 ) AS averageValue,
+        round( sum( CAST(b.total_fee AS DECIMAL ( 18, 2 ) )), 2 ) AS totleValue
         FROM
         med_behospital_info a,
         med_home_page b
@@ -202,14 +202,24 @@
 
     <!-- 按科室统计平均住院天数 (分页)-->
     <select id="getAverageDayNumPage" resultType="com.diagbot.dto.AverageStatisticsDTO">
-        SELECT t.*
+        SELECT t1.*
         FROM
         (SELECT
+        t.id,
+        t.NAME,
+        sum( t.averageValue ) AS averageValue,
+        sum( t.lastAverageValue ) AS lastAverageValue,
+        sum( t.lastYearAverageValue ) AS lastYearAverageValue
+        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
+        round( sum( CAST( b.behospital_day_num AS DECIMAL ( 18, 2 ) ))/ count(*), 2 ) AS averageValue,
+        0 AS lastAverageValue,
+        0 AS lastYearAverageValue
         FROM
         med_behospital_info a,
         med_home_page b
@@ -219,35 +229,119 @@
         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 test="filterPageByAverageVO.hospitalId != null and filterPageByAverageVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageByAverageVO.hospitalId}
         </if>
-        <if test="filterPageVO.startDate != null and filterPageVO.startDate != ''">
-            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageVO.startDate})]]>
+        <if test="filterPageByAverageVO.startDate != null and filterPageByAverageVO.startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageByAverageVO.startDate})]]>
         </if>
-        <if test="filterPageVO.endDate != null and filterPageVO.endDate != ''">
-            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageVO.endDate})]]>
+        <if test="filterPageByAverageVO.endDate != null and filterPageByAverageVO.endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageByAverageVO.endDate})]]>
         </if>
-        <if test="filterPageVO.name != null and filterPageVO.name != ''">
-            AND a.beh_dept_name like CONCAT('%', #{filterPageVO.name},'%')
+        <if test="filterPageByAverageVO.name != null and filterPageByAverageVO.name != ''">
+            AND a.beh_dept_name like CONCAT('%', #{filterPageByAverageVO.name},'%')
         </if>
         GROUP BY
         a.beh_dept_id,
         a.beh_dept_name
+        ) UNION
+        (
+        SELECT
+        a.beh_dept_id AS id,
+        a.beh_dept_name AS NAME,
+        count(*) AS num,
+        0 AS averageValue,
+        round( sum( CAST( b.behospital_day_num AS DECIMAL ( 18, 2 ) ))/ count(*), 2 ) AS lastAverageValue,
+        0 AS lastYearAverageValue
+        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="filterPageByAverageVO.hospitalId != null and filterPageByAverageVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageByAverageVO.hospitalId}
+        </if>
+        <if test="filterPageByAverageVO.lastStartDate != null and filterPageByAverageVO.lastStartDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageByAverageVO.lastStartDate})]]>
+        </if>
+        <if test="filterPageByAverageVO.lastEndDate != null and filterPageByAverageVO.lastEndDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageByAverageVO.lastEndDate})]]>
+        </if>
+        <if test="filterPageByAverageVO.name != null and filterPageByAverageVO.name != ''">
+            AND a.beh_dept_name like CONCAT('%', #{filterPageByAverageVO.name},'%')
+        </if>
+        GROUP BY
+        a.beh_dept_id,
+        a.beh_dept_name
+        ) UNION
+        (
+        SELECT
+        a.beh_dept_id AS id,
+        a.beh_dept_name AS NAME,
+        count(*) AS num,
+        0 AS averageValue,
+        0 AS lastAverageValue,
+        round( sum( CAST( b.behospital_day_num AS DECIMAL ( 18, 2 ) ))/ count(*), 2 ) AS lastYearAverageValue
+        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="filterPageByAverageVO.hospitalId != null and filterPageByAverageVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageByAverageVO.hospitalId}
+        </if>
+        <if test="filterPageByAverageVO.lastYearStartDate != null and filterPageByAverageVO.lastYearStartDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageByAverageVO.lastYearStartDate})]]>
+        </if>
+        <if test="filterPageByAverageVO.lastYearEndDate != null and filterPageByAverageVO.lastYearEndDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageByAverageVO.lastYearEndDate})]]>
+        </if>
+        <if test="filterPageByAverageVO.name != null and filterPageByAverageVO.name != ''">
+            AND a.beh_dept_name like CONCAT('%', #{filterPageByAverageVO.name},'%')
+        </if>
+        GROUP BY
+        a.beh_dept_id,
+        a.beh_dept_name
+        )
+        ) t
+        GROUP BY
+        t.id,
+        t.NAME
         ORDER BY
-        round(sum(CAST( b.behospital_day_num AS DECIMAL ))/ count(*),2 ) DESC)t
+        t.averageValue DESC,
+        t.lastAverageValue DESC,
+        t.lastYearAverageValue DESC)
+        t1
     </select>
 
     <!-- 按科室统计平均费用(分页) -->
     <select id="getAverageFeePage"   resultType="com.diagbot.dto.AverageStatisticsDTO">
-        SELECT t.*
+        SELECT t1.*
         FROM
         (SELECT
-        a.beh_dept_id as id,
-        a.beh_dept_name as name,
+        t.id,
+        t.NAME,
+        sum( t.averageValue ) AS averageValue,
+        sum( t.lastAverageValue ) AS lastAverageValue,
+        sum( t.lastYearAverageValue ) AS lastYearAverageValue
+        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
+        round( sum( CAST( b.total_fee AS DECIMAL ( 18, 2 ) ))/ count(*), 2 ) AS averageValue,
+        0 AS lastAverageValue,
+        0 AS lastYearAverageValue
         FROM
         med_behospital_info a,
         med_home_page b
@@ -257,22 +351,96 @@
         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 test="filterPageByAverageVO.hospitalId != null and filterPageByAverageVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageByAverageVO.hospitalId}
         </if>
-        <if test="filterPageVO.startDate != null and filterPageVO.startDate != ''">
-            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageVO.startDate})]]>
+        <if test="filterPageByAverageVO.startDate != null and filterPageByAverageVO.startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageByAverageVO.startDate})]]>
         </if>
-        <if test="filterPageVO.endDate != null and filterPageVO.endDate != ''">
-            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageVO.endDate})]]>
+        <if test="filterPageByAverageVO.endDate != null and filterPageByAverageVO.endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageByAverageVO.endDate})]]>
         </if>
-        <if test="filterPageVO.name != null and filterPageVO.name != ''">
-            AND a.beh_dept_name like CONCAT('%', #{filterPageVO.name},'%')
+        <if test="filterPageByAverageVO.name != null and filterPageByAverageVO.name != ''">
+            AND a.beh_dept_name like CONCAT('%', #{filterPageByAverageVO.name},'%')
         </if>
         GROUP BY
         a.beh_dept_id,
         a.beh_dept_name
+        ) UNION
+        (
+        SELECT
+        a.beh_dept_id AS id,
+        a.beh_dept_name AS NAME,
+        count(*) AS num,
+        0 AS averageValue,
+        round( sum( CAST( b.total_fee AS DECIMAL ( 18, 2 ) ))/ count(*), 2 ) AS lastAverageValue,
+        0 AS lastYearAverageValue
+        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="filterPageByAverageVO.hospitalId != null and filterPageByAverageVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageByAverageVO.hospitalId}
+        </if>
+        <if test="filterPageByAverageVO.lastStartDate != null and filterPageByAverageVO.lastStartDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageByAverageVO.lastStartDate})]]>
+        </if>
+        <if test="filterPageByAverageVO.lastEndDate != null and filterPageByAverageVO.lastEndDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageByAverageVO.lastEndDate})]]>
+        </if>
+        <if test="filterPageByAverageVO.name != null and filterPageByAverageVO.name != ''">
+            AND a.beh_dept_name like CONCAT('%', #{filterPageByAverageVO.name},'%')
+        </if>
+        GROUP BY
+        a.beh_dept_id,
+        a.beh_dept_name
+        ) UNION
+        (
+        SELECT
+        a.beh_dept_id AS id,
+        a.beh_dept_name AS NAME,
+        count(*) AS num,
+        0 AS averageValue,
+        0 AS lastAverageValue,
+        round( sum( CAST( b.total_fee AS DECIMAL ( 18, 2 ) ))/ count(*), 2 ) AS lastYearAverageValue
+        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="filterPageByAverageVO.hospitalId != null and filterPageByAverageVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageByAverageVO.hospitalId}
+        </if>
+        <if test="filterPageByAverageVO.lastYearStartDate != null and filterPageByAverageVO.lastYearStartDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= DATE(#{filterPageByAverageVO.lastYearStartDate})]]>
+        </if>
+        <if test="filterPageByAverageVO.lastYearEndDate != null and filterPageByAverageVO.lastYearEndDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{filterPageByAverageVO.lastYearEndDate})]]>
+        </if>
+        <if test="filterPageByAverageVO.name != null and filterPageByAverageVO.name != ''">
+            AND a.beh_dept_name like CONCAT('%', #{filterPageByAverageVO.name},'%')
+        </if>
+        GROUP BY
+        a.beh_dept_id,
+        a.beh_dept_name
+        )
+        ) t
+        GROUP BY
+        t.id,
+        t.NAME
         ORDER BY
-        round(sum(CAST( b.total_fee AS DECIMAL ))/ count(*),2 ) DESC)t
+        t.averageValue DESC,
+        t.lastAverageValue DESC,
+        t.lastYearAverageValue DESC)
+        t1
     </select>
 </mapper>

+ 42 - 0
src/main/resources/mapper/QcCasesEntryMapper.xml

@@ -84,4 +84,46 @@
             </foreach>
         </if>
     </select>
+
+    <select id="index" resultType="com.diagbot.dto.QcCasesEntrySimpleDTO">
+        SELECT distinct t3.msg name, t2.id
+        FROM
+        qc_cases_entry t2,
+        qc_cases_entry_hospital t3
+        where t2.is_deleted = 'N'
+        and t3.is_deleted = 'N'
+        and t2.id = t3.cases_entry_id
+        and t3.is_used = 1
+        <if test="hospitalId != null">
+            and t3.hospital_id = #{hospitalId}
+        </if>
+        <if test="input != null and input != ''">
+            and t2.name like concat('%', #{input}, '%')
+        </if>
+        <if test="notIds != null and notIds.size > 0">
+            and t2.id not in
+            <foreach item="item" collection="notIds" open="(" separator="," close=")" >
+                #{item}
+            </foreach>
+        </if>
+        order by t2.order_no
+    </select>
+
+    <select id="getEntryByHospital" resultType="com.diagbot.dto.QcCasesEntrySimpleDTO">
+        SELECT
+            t1.`name`, t1.id, t3.`name` mode_name, t2.is_used, 1 as sel
+        FROM
+            qc_cases_entry t1,
+            qc_cases_entry_hospital t2,
+            qc_mode t3
+        WHERE
+            t1.is_deleted = 'N'
+        AND t2.is_deleted = 'N'
+        AND t3.is_deleted = 'N'
+        AND t1.id = t2.cases_entry_id
+        AND t2.is_used = 1
+        AND t1.mode_id = t3.id
+        AND t2.hospital_id = #{hospitalId}
+        ORDER BY t3.order_no,t1.order_no
+    </select>
 </mapper>

+ 39 - 0
src/main/resources/mapper/QcTypeCasesEntryMapper.xml

@@ -15,4 +15,43 @@
         <result column="modifier" property="modifier" />
     </resultMap>
 
+    <select id="getByTypeId" resultType="com.diagbot.dto.QcCasesEntrySimpleDTO">
+        SELECT
+            a1.*,IF (a2.case_entry_id IS NULL,NULL,1) sel
+        FROM
+            (
+                SELECT
+                    t1.`name`,
+                    t1.id,
+                    t3.`name` mode_name,
+                    t2.is_used,
+                    t3.order_no mode_order,
+                    t1.order_no
+                FROM
+                    qc_cases_entry t1,
+                    qc_cases_entry_hospital t2,
+                    qc_mode t3
+                WHERE
+                    t1.is_deleted = 'N'
+                AND t2.is_deleted = 'N'
+                AND t3.is_deleted = 'N'
+                AND t1.id = t2.cases_entry_id
+                AND t1.mode_id = t3.id
+                AND t2.hospital_id = #{hospitalId}
+            ) a1
+        LEFT JOIN (
+            SELECT
+                q2.case_entry_id
+            FROM
+                qc_type q1,
+                qc_type_cases_entry q2
+            WHERE
+                q1.is_deleted = 'N'
+            AND q2.is_deleted = 'N'
+            AND q1.id = q2.type_id
+            AND q1.hospital_id = #{hospitalId}
+            AND q1.id = #{id}
+        ) a2 ON a1.id = a2.case_entry_id
+        ORDER BY a1.mode_order, a1.order_no
+    </select>
 </mapper>

+ 13 - 0
src/main/resources/mapper/QcTypeMapper.xml

@@ -5,6 +5,7 @@
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.diagbot.entity.QcType">
         <id column="id" property="id" />
+        <result column="hospital_id" property="hospitalId" />
         <result column="name" property="name" />
         <result column="remark" property="remark" />
         <result column="is_deleted" property="isDeleted" />
@@ -14,4 +15,16 @@
         <result column="modifier" property="modifier" />
     </resultMap>
 
+    <!--分页-->
+    <select id="getList" resultType="com.diagbot.dto.QcTypePageDTO">
+        SELECT a.* FROM `qc_type` a
+        WHERE a.is_deleted = 'N'
+        <if test="hospitalId != null">
+            AND a.hospital_id = #{hospitalId}
+        </if>
+        <if test="name != null and name != ''">
+            AND UPPER(a.name) like concat ('%', UPPER(trim(#{name})), '%')
+        </if>
+        order by a.gmt_modified desc
+    </select>
 </mapper>

+ 119 - 63
src/main/resources/mapper/QcresultInfoMapper.xml

@@ -172,25 +172,29 @@
     <!-- 条目缺陷分组统计 -->
     <select id="entryCountGroupByEntry" parameterType="com.diagbot.vo.FilterVO" resultType="com.diagbot.dto.NumDTO">
         SELECT
-        d.id,
-        d.NAME,
+        e.id,
+        e.NAME,
         count(*) AS num
         FROM
         med_behospital_info a,
         med_home_page b,
-        med_qcresult_detail c,
-        qc_cases_entry d
+        med_qcresult_info c,
+        med_qcresult_detail d,
+        qc_cases_entry 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 c.cases_id = d.cases_id
-        AND c.cases_entry_id = d.id
+        AND a.behospital_code = d.behospital_code
+        AND d.cases_id = e.cases_id
+        AND d.cases_entry_id = e.id
         <![CDATA[AND a.qc_type_id <>0 ]]>
         <if test="hospitalId != null and hospitalId != ''">
             AND a.hospital_id = #{hospitalId}
@@ -202,8 +206,8 @@
             <![CDATA[AND a.leave_hospital_date < DATE(#{endDate})]]>
         </if>
         GROUP BY
-        d.id,
-        d.NAME
+        e.id,
+        e.NAME
     </select>
 
     <!-- 质控平均分按科室统计 -->
@@ -211,8 +215,8 @@
         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,
+        ROUND( sum( CAST( c.score_res AS DECIMAL ( 18, 2 ) )), 2 ) AS totleValue,
+        ROUND( sum( CAST( c.score_res AS DECIMAL ( 18, 2 ) ))/ count(*), 2 ) AS averageValue,
         count(*) AS num
         FROM
         med_behospital_info a,
@@ -345,34 +349,38 @@
     <!-- 条目缺陷分组统计 -->
     <select id="entryCountGroupByEntryAndDept" parameterType="com.diagbot.vo.FilterVO" resultType="com.diagbot.dto.DeptNumDTO">
         SELECT
-        d.id,
-        d.NAME,
+        e.id,
+        e.NAME,
         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_detail c,
-        qc_cases_entry d,
-        sys_user_dept e
+        med_qcresult_info c,
+        med_qcresult_detail d,
+        qc_cases_entry e,
+        sys_user_dept 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 = e.hospital_id
+        AND a.hospital_id = d.hospital_id
+        AND a.hospital_id = f.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
+        AND a.behospital_code = d.behospital_code
+        AND d.cases_id = e.cases_id
+        AND d.cases_entry_id = e.id
+        AND a.beh_dept_id = f.dept_id
         <![CDATA[AND a.qc_type_id <>0 ]]>
         <if test="userId!=null">
-            AND e.user_id = #{userId}
+            AND f.user_id = #{userId}
         </if>
         <if test="hospitalId != null and hospitalId != ''">
             AND a.hospital_id = #{hospitalId}
@@ -384,8 +392,8 @@
             <![CDATA[AND a.leave_hospital_date < DATE(#{endDate})]]>
         </if>
         GROUP BY
-        d.id,
-        d.NAME,
+        e.id,
+        e.NAME,
         a.beh_dept_id,
         a.beh_dept_name
     </select>
@@ -527,27 +535,39 @@
         FROM
         (
         SELECT
-        d.id AS id,
-        d.NAME AS NAME
+        e.id AS id,
+        e.NAME AS NAME
         FROM
         med_behospital_info a,
         med_home_page b,
-        med_qcresult_detail c,
-        qc_cases_entry d
+        <if test="filterPageVO.casesId != null and filterPageVO.casesId ==243">
+            med_qcresult_cases c,
+        </if>
+        <if test="filterPageVO.casesId == null or filterPageVO.casesId ==0">
+            med_qcresult_info c,
+        </if>
+        med_qcresult_detail d,
+        qc_cases_entry 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 c.cases_id = d.cases_id
-        AND c.cases_entry_id = d.id
+        AND a.behospital_code = d.behospital_code
+        <if test="filterPageVO.casesId != null and filterPageVO.casesId ==243">
+            AND c.cases_id = d.cases_id
+        </if>
+        AND d.cases_id = e.cases_id
+        AND d.cases_entry_id = e.id
         <![CDATA[AND a.qc_type_id <>0 ]]>
-        <if test="filterPageVO.casesId != null and filterPageVO.casesId != ''">
-            AND c.cases_id = #{filterPageVO.casesId}
+        <if test="filterPageVO.casesId != null and filterPageVO.casesId != 0">
+            AND d.cases_id = #{filterPageVO.casesId}
         </if>
         <if test="filterPageVO.hospitalId != null and filterPageVO.hospitalId != ''">
             AND a.hospital_id = #{filterPageVO.hospitalId}
@@ -559,7 +579,7 @@
             <![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},'%')
+            AND e.name like CONCAT('%', #{filterPageVO.name},'%')
         </if>
         <if test="filterPageVO.deptName != null and filterPageVO.deptName != ''">
             AND a.beh_dept_name like CONCAT('%', #{filterPageVO.deptName},'%')
@@ -570,22 +590,34 @@
         FROM
         med_behospital_info a,
         med_home_page b,
-        med_qcresult_detail c,
-        qc_cases_entry d
+        <if test="filterPageVO.casesId != null and filterPageVO.casesId ==243">
+            med_qcresult_cases c,
+        </if>
+        <if test="filterPageVO.casesId == null or filterPageVO.casesId ==0">
+            med_qcresult_info c,
+        </if>
+        med_qcresult_detail d,
+        qc_cases_entry 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 c.cases_id = d.cases_id
-        AND c.cases_entry_id = d.id
+        AND a.behospital_code = d.behospital_code
+        <if test="filterPageVO.casesId != null and filterPageVO.casesId ==243">
+            AND c.cases_id = d.cases_id
+        </if>
+        AND d.cases_id = e.cases_id
+        AND d.cases_entry_id = e.id
         <![CDATA[AND a.qc_type_id <>0 ]]>
         <if test="filterPageVO.casesId != null and filterPageVO.casesId != ''">
-            AND c.cases_id = #{filterPageVO.casesId}
+            AND d.cases_id = #{filterPageVO.casesId}
         </if>
         <if test="filterPageVO.hospitalId != null and filterPageVO.hospitalId != ''">
             AND a.hospital_id = #{filterPageVO.hospitalId}
@@ -597,7 +629,7 @@
             <![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},'%')
+            AND e.name like CONCAT('%', #{filterPageVO.name},'%')
         </if>
         <if test="filterPageVO.deptName != null and filterPageVO.deptName != ''">
             AND a.beh_dept_name like CONCAT('%', #{filterPageVO.deptName},'%')
@@ -617,8 +649,8 @@
         (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,
+        ROUND( sum( CAST( c.score_res AS DECIMAL ( 18, 2 ) )), 2 ) AS totleValue,
+        ROUND( sum( CAST( c.score_res AS DECIMAL ( 18, 2 ) ))/ count(*), 2 ) AS averageValue,
         count(*) AS num
         FROM
         med_behospital_info a,
@@ -648,7 +680,7 @@
         GROUP BY
         a.beh_dept_id,
         a.beh_dept_name
-        ORDER BY ROUND( sum( CAST( c.score_res AS DECIMAL ))/ count(*), 2 ) DESC ) t
+        ORDER BY averageValue DESC ) t
     </select>
 
     <!-- 按科室统计质控病历数(分页) -->
@@ -859,36 +891,48 @@
         FROM
         (
         SELECT
-        d.id,
-        d.NAME,
+        e.id,
+        e.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
+        <if test="filterPageByDeptVO.casesId != null and filterPageByDeptVO.casesId ==243">
+            med_qcresult_cases c,
+        </if>
+        <if test="filterPageByDeptVO.casesId == null or filterPageByDeptVO.casesId ==0">
+            med_qcresult_info c,
+        </if>
+        med_qcresult_detail d,
+        qc_cases_entry e,
+        sys_user_dept 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 = e.hospital_id
+        AND a.hospital_id = d.hospital_id
+        AND a.hospital_id = f.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
+        AND a.behospital_code = d.behospital_code
+        <if test="filterPageByDeptVO.casesId != null and filterPageByDeptVO.casesId ==243">
+            AND c.cases_id = d.cases_id
+        </if>
+        AND d.cases_id = e.cases_id
+        AND d.cases_entry_id = e.id
+        AND a.beh_dept_id = f.dept_id
         <![CDATA[AND a.qc_type_id <>0 ]]>
         <if test="filterPageByDeptVO.casesId != null and filterPageByDeptVO.casesId != ''">
-            AND c.cases_id = #{filterPageByDeptVO.casesId}
+            AND d.cases_id = #{filterPageByDeptVO.casesId}
         </if>
         <if test="filterPageByDeptVO.userId!=null">
-            AND e.user_id = #{filterPageByDeptVO.userId}
+            AND f.user_id = #{filterPageByDeptVO.userId}
         </if>
         <if test="filterPageByDeptVO.hospitalId != null and filterPageByDeptVO.hospitalId != ''">
             AND a.hospital_id = #{filterPageByDeptVO.hospitalId}
@@ -900,7 +944,7 @@
             <![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},'%')
+            AND e.name like CONCAT('%', #{filterPageByDeptVO.name},'%')
         </if>
         <if test="filterPageByDeptVO.deptName != null and filterPageByDeptVO.deptName != ''">
             AND a.beh_dept_name like CONCAT('%', #{filterPageByDeptVO.deptName},'%')
@@ -914,29 +958,41 @@
         FROM
         med_behospital_info a,
         med_home_page b,
-        med_qcresult_detail c,
-        qc_cases_entry d,
-        sys_user_dept e
+        <if test="filterPageByDeptVO.casesId != null and filterPageByDeptVO.casesId ==243">
+            med_qcresult_cases c,
+        </if>
+        <if test="filterPageByDeptVO.casesId == null or filterPageByDeptVO.casesId ==0">
+            med_qcresult_info c,
+        </if>
+        med_qcresult_detail d,
+        qc_cases_entry e,
+        sys_user_dept 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 = e.hospital_id
+        AND a.hospital_id = d.hospital_id
+        AND a.hospital_id = f.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
+        AND a.behospital_code = d.behospital_code
+        <if test="filterPageByDeptVO.casesId != null and filterPageByDeptVO.casesId ==243">
+            AND c.cases_id = d.cases_id
+        </if>
+        AND d.cases_id = e.cases_id
+        AND d.cases_entry_id = e.id
+        AND a.beh_dept_id = f.dept_id
         <![CDATA[AND a.qc_type_id <>0 ]]>
         <if test="filterPageByDeptVO.casesId != null and filterPageByDeptVO.casesId != ''">
-            AND c.cases_id = #{filterPageByDeptVO.casesId}
+            AND d.cases_id = #{filterPageByDeptVO.casesId}
         </if>
         <if test="filterPageByDeptVO.userId!=null">
-            AND e.user_id = #{filterPageByDeptVO.userId}
+            AND f.user_id = #{filterPageByDeptVO.userId}
         </if>
         <if test="filterPageByDeptVO.hospitalId != null and filterPageByDeptVO.hospitalId != ''">
             AND a.hospital_id = #{filterPageByDeptVO.hospitalId}
@@ -948,13 +1004,13 @@
             <![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},'%')
+            AND e.name like CONCAT('%', #{filterPageByDeptVO.name},'%')
         </if>
         <if test="filterPageByDeptVO.deptName != null and filterPageByDeptVO.deptName != ''">
             AND a.beh_dept_name like CONCAT('%', #{filterPageByDeptVO.deptName},'%')
         </if>
         <if test="filterPageByDeptVO.doctorName != null and filterPageByDeptVO.doctorName != ''">
-            AND a.doctor_name like CONCAT('%', #{filterPageByDeptVO.doctorName},'%')
+        AND a.doctor_name like CONCAT('%', #{filterPageByDeptVO.doctorName},'%')
         </if>
         ) t2
         GROUP BY

+ 2 - 2
src/test/java/com/diagbot/CodeGeneration.java

@@ -33,7 +33,7 @@ public class CodeGeneration {
         gc.setEnableCache(false);// XML 二级缓存
         gc.setBaseResultMap(true);// XML ResultMap
         gc.setBaseColumnList(false);// XML columList
-        gc.setAuthor("zhoutg");// 作者
+        gc.setAuthor("gaodm");// 作者
 
         // 自定义文件命名,注意 %s 会自动填充表实体属性!
         gc.setControllerName("%sController");
@@ -56,7 +56,7 @@ public class CodeGeneration {
         StrategyConfig strategy = new StrategyConfig();
 //        strategy.setTablePrefix(new String[] { "med_" });// 此处可以修改为您的表前缀
         strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
-        strategy.setInclude(new String[] { "qc_model_hospital"}); // 需要生成的表
+        strategy.setInclude(new String[] { "qc_type"}); // 需要生成的表
 
         strategy.setSuperServiceClass(null);
         strategy.setSuperServiceImplClass(null);