Explorar el Código

Merge remote-tracking branch 'origin/dev/20200619_1.3.6.1' into test

zhaops hace 5 años
padre
commit
f8b1477d99

+ 8 - 0
doc/011.20200619v1.3.6.1/qc_initv1.3.6.1.sql

@@ -0,0 +1,8 @@
+use `qc`;
+
+-- 新增权限
+INSERT INTO `sys_permission`(`id`, `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `name`, `code`, `permissionUrl`, `method`, `descritpion`, `remark`) VALUES (100, 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '关键条目缺陷占比', 'FUNC000100', '/console/entryStatistics', 'ALL', '数据报表明细-关键条目缺陷占比', NULL);
+INSERT INTO `sys_role_permission`(`id`, `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `role_id`, `permission_id`, `remark`) VALUES (1655, 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', -1, 100, '数据报表明细-关键条目缺陷占比');
+INSERT INTO `sys_menu_permission`(`id`, `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `menu_id`, `permission_id`, `remark`) VALUES (72, 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', 34, 100, '数据报表明细-关键条目缺陷占比');
+INSERT INTO `sys_menu`(`id`, `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `name`, `parent_id`, `code`, `show_status`, `maintain_status`, `order_no`, `remark`) VALUES (34, 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '关键条目缺陷占比', 17, 'YH-ZKK-GJTMQXZB', 1, 1, 10, '用户-质控科-关键条目缺陷占比');
+INSERT INTO `sys_role_menu`(`id`, `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `role_id`, `menu_id`, `remark`) VALUES (826, 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', -1, 34, '用户-质控科-关键条目缺陷占比');

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

@@ -116,6 +116,7 @@ public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
                 .antMatchers("/console/export/homePageLevelExport").permitAll()
                 .antMatchers("/console/export/entryGroupByEntryExport").permitAll()
                 .antMatchers("/console/export/levelExport").permitAll()
+                .antMatchers("/console/entryStatistics").permitAll()
                 .antMatchers("/console/export/levelExport_TZ").permitAll()
                 .antMatchers("/qc/data/sendDoctorInfos").permitAll()
                 .antMatchers("/qc/data/sendDeptInfos").permitAll()

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

@@ -159,6 +159,7 @@ public class UrlAccessDecisionManager implements AccessDecisionManager {
                 || matchers("/console/export/homePageLevelExport", request)
                 || matchers("/console/export/entryGroupByEntryExport", request)
                 || matchers("/console/export/levelExport", request)
+                || matchers("/console/entryStatistics", request)
                 || matchers("/console/export/levelExport_TZ", request)
                 || matchers("/qc/data/sendDoctorInfos", request)
                 || matchers("/qc/data/sendDeptInfos", request)

+ 158 - 0
src/main/java/com/diagbot/dto/EntryStatisticsDTO.java

@@ -0,0 +1,158 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/6/18 20:17
+ */
+@Getter
+@Setter
+public class EntryStatisticsDTO {
+    /**
+     * 科室id(科室编码)
+     */
+    private String deptId;
+    /**
+     * 科室名称
+     */
+    private String deptName;
+    /**
+     * 未在24小时内完成会诊数
+     */
+    private Integer consultationNum = 0;
+    /**
+     * 未在24小时内完成会诊条目id
+     */
+    private Long consultationEntryId;
+    /**
+     * 未在24小时内完成会诊条目名称
+     */
+    private String consultationEntryName;
+    /**
+     * 未在24小时内完成会诊率
+     */
+    private Double consultationPercent = 0.00d;
+    /**
+     * 未在24小时内完成会诊率(百分比)
+     */
+    private String consultationPercentStr = "0.00%";
+    /**
+     * 会诊病历数
+     */
+    private Integer consultationMRNum = 0;
+    /**
+     * 手术记录名称不匹配条目id
+     */
+    private Long operationNameEntryId;
+    /**
+     * 手术记录名称不匹配条目名称
+     */
+    private String operationNameEntryName;
+    /**
+     * 手术记录名称不匹配数
+     */
+    private Integer operationNameNum = 0;
+    /**
+     * 手术记录名称不匹配率
+     */
+    private Double operationNamePercent = 0.00d;
+    /**
+     * 手术记录名称不匹配率(百分比)
+     */
+    private String operationNamePercentStr = "0.00%";
+    /**
+     * 术后首程未在15分钟内完成条目id
+     */
+    private Long operation15MinuteEntryId;
+    /**
+     * 术后首程未在15分钟内完成条目名称
+     */
+    private String operation15MinuteEntryName;
+    /**
+     * 术后首程未在15分钟内完成数
+     */
+    private Integer operation15MinuteNum = 0;
+    /**
+     * 术后首程未在15分钟内完成率
+     */
+    private Double operation15MinutePercent = 0.00d;
+    /**
+     * 术后首程未在15分钟内完成率(百分比)
+     */
+    private String operation15MinutePercentStr = "0.00%";
+    /**
+     * 病案首页手术时间不匹配条目id
+     */
+    private Long operationTimeEntryId;
+    /**
+     * 病案首页手术时间不匹配条目名称
+     */
+    private String operationTimeEntryName;
+    /**
+     * 病案首页手术时间不匹配数
+     */
+    private Integer operationTimeNum = 0;
+    /**
+     * 病案首页手术时间不匹配率
+     */
+    private Double operationTimePercent = 0.00;
+    /**
+     * 病案首页手术时间不匹配率(百分比)
+     */
+    private String operationTimePercentStr = "0.00%";
+    /**
+     * 手术记录病历数
+     */
+    private Integer operationMRNum = 0;
+    /**
+     * 未在6小时内书写危急值条目id
+     */
+    private Long crisisEntryId;
+    /**
+     * 未在6小时内书写危急值条目名称
+     */
+    private String crisisEntryName;
+    /**
+     * 未在6小时内书写危急值记录数
+     */
+    private Integer crisisNum = 0;
+    /**
+     * 未在6小时内书写危急值记录率
+     */
+    private Double crisisPercent = 0.00d;
+    /**
+     * 未在6小时内书写危急值记录率(百分比)
+     */
+    private String crisisPercentStr = "0.00%";
+    /**
+     * 危急值记录病历数
+     */
+    private Integer crisisMRNum = 0;
+    /**
+     * 阶段小节未书写条目id
+     */
+    private Long stageSummaryEntryId;
+    /**
+     * 阶段小节未书写条目名称
+     */
+    private String stageSummaryEntryName;
+    /**
+     * 阶段小节未书写数
+     */
+    private Integer stageSummaryNum = 0;
+    /**
+     * 阶段小节未书写率
+     */
+    private Double stageSummaryPercent = 0.00d;
+    /**
+     * 阶段小节未书写率(百分比)
+     */
+    private String stageSummaryPercentStr = "0.00%";
+    /**
+     * 病人住院超过30天的病历数
+     */
+    private Integer stageSummaryMRNum = 0;
+}

+ 157 - 0
src/main/java/com/diagbot/facade/ConsoleFacade.java

@@ -7,6 +7,7 @@ import com.diagbot.aggregate.ResultStatisticsAggregate;
 import com.diagbot.dto.AverageStatisticsDTO;
 import com.diagbot.dto.DeptNumDTO;
 import com.diagbot.dto.EntryNumDTO;
+import com.diagbot.dto.EntryStatisticsDTO;
 import com.diagbot.dto.HomePageNumDTO;
 import com.diagbot.dto.LevelStatisticsDTO;
 import com.diagbot.dto.LevelStatisticsTZDTO;
@@ -17,6 +18,7 @@ import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
 import com.diagbot.util.ListUtil;
 import com.diagbot.util.StringUtil;
+import com.diagbot.vo.EntryStatisticsVO;
 import com.diagbot.vo.FilterOrderVO;
 import com.diagbot.vo.FilterPageByAverageVO;
 import com.diagbot.vo.FilterPageVO;
@@ -618,4 +620,159 @@ public class ConsoleFacade {
         IPage<QcResultShortDTO> page = behospitalInfoFacade.qcResultShortPage(qcResultShortPageVO);
         return page;
     }
+
+    /**
+     * 关键条目缺陷占比统计
+     *
+     * @param entryStatisticsVO
+     * @return
+     */
+    public List<EntryStatisticsDTO> entryStatistics(EntryStatisticsVO entryStatisticsVO) {
+        filterFacade.entryStatisticsVOSet(entryStatisticsVO);
+        if (entryStatisticsVO.getDeptName().equals("全院")) {
+            entryStatisticsVO.setDeptName("");
+        }
+        List<EntryStatisticsDTO> records = behospitalInfoFacade.entryStatistics(entryStatisticsVO);
+        //增加全院数据
+        if (entryStatisticsVO.getDeptName().equals("")) {
+            EntryStatisticsDTO record = getEntryGlobleRecord(records);
+            if (record != null) {
+                records.add(0, record);
+            }
+        }
+        return records;
+    }
+
+    /**
+     * 关键条目缺陷占比统计增加全院记录
+     *
+     * @param records
+     * @return
+     */
+    private EntryStatisticsDTO getEntryGlobleRecord(List<EntryStatisticsDTO> records) {
+        DecimalFormat df = new DecimalFormat("#0.00");
+        if (ListUtil.isEmpty(records)) {
+            return null;
+        }
+
+        EntryStatisticsDTO record = new EntryStatisticsDTO();
+        record.setDeptName("全院");
+        //未在24小时内完成会诊
+        Integer consultationNum = records
+                .stream()
+                .map(EntryStatisticsDTO::getConsultationNum)
+                .reduce(0, Integer::sum);
+        record.setConsultationNum(consultationNum);
+        record.setConsultationEntryId(records.get(0).getConsultationEntryId());
+        Integer consultationMRNum = records
+                .stream()
+                .map(EntryStatisticsDTO::getConsultationMRNum)
+                .reduce(0, Integer::sum);
+        record.setConsultationMRNum(consultationMRNum);
+        if (consultationMRNum != null && !consultationMRNum.equals(0)) {
+            Double consultationPercent = BigDecimal.valueOf(consultationNum)
+                    .divide(BigDecimal.valueOf(consultationMRNum), 4, RoundingMode.HALF_UP)
+                    .doubleValue();
+            String consultationPercentStr
+                    = df.format(BigDecimal.valueOf(consultationPercent).multiply(BigDecimal.valueOf(100))) + "%";
+            record.setConsultationPercent(consultationPercent);
+            record.setConsultationPercentStr(consultationPercentStr);
+        }
+        //手术记录名称不匹配
+        Integer operationNameNum = records
+                .stream()
+                .map(EntryStatisticsDTO::getOperationNameNum)
+                .reduce(0, Integer::sum);
+        record.setOperationNameNum(operationNameNum);
+        record.setOperationNameEntryId(records.get(0).getOperationNameEntryId());
+        Integer operationMRNum = records
+                .stream()
+                .map(EntryStatisticsDTO::getOperationMRNum)
+                .reduce(0, Integer::sum);
+        record.setOperationMRNum(operationMRNum);
+        if (operationMRNum != null && !operationMRNum.equals(0)) {
+            Double operationNamePercent = BigDecimal.valueOf(operationNameNum)
+                    .divide(BigDecimal.valueOf(operationMRNum), 4, RoundingMode.HALF_UP)
+                    .doubleValue();
+            String operationNamePercentStr
+                    = df.format(BigDecimal.valueOf(operationNamePercent).multiply(BigDecimal.valueOf(100))) + "%";
+            record.setOperationNamePercent(operationNamePercent);
+            record.setOperationNamePercentStr(operationNamePercentStr);
+        }
+        //术后首程未在15分钟内完成
+        Integer operation15MinuteNum = records
+                .stream()
+                .map(EntryStatisticsDTO::getOperation15MinuteNum)
+                .reduce(0, Integer::sum);
+        record.setOperation15MinuteNum(operation15MinuteNum);
+        record.setOperation15MinuteEntryId(records.get(0).getOperation15MinuteEntryId());
+        if (operationMRNum != null && !operationMRNum.equals(0)) {
+            Double operation15MinutePercent = BigDecimal.valueOf(operation15MinuteNum)
+                    .divide(BigDecimal.valueOf(operationMRNum), 4, RoundingMode.HALF_UP)
+                    .doubleValue();
+            String operation15MinutePercentStr
+                    = df.format(BigDecimal.valueOf(operation15MinutePercent).multiply(BigDecimal.valueOf(100))) + "%";
+            record.setOperation15MinutePercent(operation15MinutePercent);
+            record.setOperation15MinutePercentStr(operation15MinutePercentStr);
+        }
+        //病案首页手术时间不匹配
+        Integer operationTimeNum = records
+                .stream()
+                .map(EntryStatisticsDTO::getOperationTimeNum)
+                .reduce(0, Integer::sum);
+        record.setOperationTimeNum(operationTimeNum);
+        record.setOperationTimeEntryId(records.get(0).getOperationTimeEntryId());
+        if (operationMRNum != null && !operationMRNum.equals(0)) {
+            Double operationTimePercent = BigDecimal.valueOf(operationTimeNum)
+                    .divide(BigDecimal.valueOf(operationMRNum), 4, RoundingMode.HALF_UP)
+                    .doubleValue();
+            String operationTimePercentStr
+                    = df.format(BigDecimal.valueOf(operationTimePercent).multiply(BigDecimal.valueOf(100))) + "%";
+            record.setOperationTimePercent(operationTimePercent);
+            record.setOperationTimePercentStr(operationTimePercentStr);
+        }
+        //未在6小时内书写危机值记录
+        Integer crisisNum = records
+                .stream()
+                .map(EntryStatisticsDTO::getCrisisNum)
+                .reduce(0, Integer::sum);
+        record.setCrisisNum(crisisNum);
+        record.setCrisisEntryId(records.get(0).getCrisisEntryId());
+        Integer crisisMRNum = records
+                .stream()
+                .map(EntryStatisticsDTO::getCrisisMRNum)
+                .reduce(0, Integer::sum);
+        record.setCrisisMRNum(crisisMRNum);
+        if (crisisMRNum != null && !crisisMRNum.equals(0)) {
+            Double crisisPercent = BigDecimal.valueOf(crisisNum)
+                    .divide(BigDecimal.valueOf(crisisMRNum), 4, RoundingMode.HALF_UP)
+                    .doubleValue();
+            String crisisPercentStr
+                    = df.format(BigDecimal.valueOf(crisisPercent).multiply(BigDecimal.valueOf(100))) + "%";
+            record.setCrisisPercent(crisisPercent);
+            record.setCrisisPercentStr(crisisPercentStr);
+        }
+        //病人住院超过30天,阶段小节书写
+        Integer stageSummaryNum = records
+                .stream()
+                .map(EntryStatisticsDTO::getStageSummaryNum)
+                .reduce(0, Integer::sum);
+        record.setStageSummaryNum(stageSummaryNum);
+        record.setStageSummaryEntryId(records.get(0).getStageSummaryEntryId());
+        Integer stageSummaryMRNum = records
+                .stream()
+                .map(EntryStatisticsDTO::getStageSummaryMRNum)
+                .reduce(0, Integer::sum);
+        record.setStageSummaryMRNum(stageSummaryMRNum);
+        if (stageSummaryMRNum != null && !stageSummaryMRNum.equals(0)) {
+            Double stageSummaryPercent = BigDecimal.valueOf(stageSummaryNum)
+                    .divide(BigDecimal.valueOf(stageSummaryMRNum), 4, RoundingMode.HALF_UP)
+                    .doubleValue();
+            String stageSummaryPercentStr
+                    = df.format(BigDecimal.valueOf(stageSummaryPercent).multiply(BigDecimal.valueOf(100))) + "%";
+            record.setStageSummaryPercent(stageSummaryPercent);
+            record.setStageSummaryPercentStr(stageSummaryPercentStr);
+        }
+        return record;
+    }
 }

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

@@ -4,6 +4,7 @@ import com.diagbot.util.BeanUtil;
 import com.diagbot.util.DateUtil;
 import com.diagbot.util.StringUtil;
 import com.diagbot.util.SysUserUtils;
+import com.diagbot.vo.EntryStatisticsVO;
 import com.diagbot.vo.FilterOrderByDeptVO;
 import com.diagbot.vo.FilterOrderVO;
 import com.diagbot.vo.FilterPageByAverageVO;
@@ -255,4 +256,18 @@ public class FilterFacade {
         long interval = qcResultShortPageVO.getEndDate().getTime() + 1000;
         qcResultShortPageVO.setEndDate(new Date(Long.valueOf(interval)));
     }
+
+    /**
+     * 关键条目缺陷占比入参拼接
+     *
+     * @param entryStatisticsVO
+     */
+    public void entryStatisticsVOSet(EntryStatisticsVO entryStatisticsVO) {
+        String hospitalId = SysUserUtils.getCurrentHospitalID();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        entryStatisticsVO.setHospitalId(hospitalId);
+        entryStatisticsVO.setUserId(Long.valueOf(userId));
+        long interval = entryStatisticsVO.getEndDate().getTime() + 1000;
+        entryStatisticsVO.setEndDate(new Date(Long.valueOf(interval)));
+    }
 }

+ 11 - 0
src/main/java/com/diagbot/mapper/BehospitalInfoMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.dto.BehospitalInfoDTO;
 import com.diagbot.dto.DeptNumDTO;
+import com.diagbot.dto.EntryStatisticsDTO;
 import com.diagbot.dto.ExportExcelDTO;
 import com.diagbot.dto.HomePageNumDTO;
 import com.diagbot.dto.LevelStatisticsDTO;
@@ -15,6 +16,7 @@ import com.diagbot.entity.BehospitalInfo;
 import com.diagbot.vo.AnalyzeCodeVO;
 import com.diagbot.vo.AnalyzeVO;
 import com.diagbot.vo.BehospitalPageVO;
+import com.diagbot.vo.EntryStatisticsVO;
 import com.diagbot.vo.ExportQcresultVO;
 import com.diagbot.vo.FilterOrderByDeptVO;
 import com.diagbot.vo.FilterOrderVO;
@@ -240,7 +242,16 @@ public interface BehospitalInfoMapper extends BaseMapper<BehospitalInfo> {
 
     /**
      * 根据两个主键-批量修改
+     *
      * @param list
      */
     public void updateBatchByKey(List<BehospitalInfo> list);
+
+    /**
+     * 关键条目缺陷占比统计
+     *
+     * @param entryStatisticsVO
+     * @return
+     */
+    public List<EntryStatisticsDTO> entryStatistics(EntryStatisticsVO entryStatisticsVO);
 }

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

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.diagbot.dto.BehospitalInfoDTO;
 import com.diagbot.dto.DeptNumDTO;
+import com.diagbot.dto.EntryStatisticsDTO;
 import com.diagbot.dto.ExportExcelDTO;
 import com.diagbot.dto.HomePageNumDTO;
 import com.diagbot.dto.LevelStatisticsDTO;
@@ -15,6 +16,7 @@ import com.diagbot.entity.BehospitalInfo;
 import com.diagbot.vo.AnalyzeCodeVO;
 import com.diagbot.vo.AnalyzeVO;
 import com.diagbot.vo.BehospitalPageVO;
+import com.diagbot.vo.EntryStatisticsVO;
 import com.diagbot.vo.ExportQcresultVO;
 import com.diagbot.vo.FilterOrderByDeptVO;
 import com.diagbot.vo.FilterOrderVO;
@@ -237,4 +239,12 @@ public interface BehospitalInfoService extends IService<BehospitalInfo> {
      * @return
      */
     public IPage<QcResultShortDTO> qcResultShortByDeptPage(@Param("qcResultShortPageVO") QcResultShortPageVO qcResultShortPageVO);
+
+    /**
+     * 关键条目缺陷占比统计
+     *
+     * @param entryStatisticsVO
+     * @return
+     */
+    public List<EntryStatisticsDTO> entryStatistics(EntryStatisticsVO entryStatisticsVO);
 }

+ 15 - 1
src/main/java/com/diagbot/service/impl/BehospitalInfoServiceImpl.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.diagbot.dto.BehospitalInfoDTO;
 import com.diagbot.dto.DeptNumDTO;
+import com.diagbot.dto.EntryStatisticsDTO;
 import com.diagbot.dto.ExportExcelDTO;
 import com.diagbot.dto.HomePageNumDTO;
 import com.diagbot.dto.LevelStatisticsDTO;
@@ -17,6 +18,7 @@ import com.diagbot.service.BehospitalInfoService;
 import com.diagbot.vo.AnalyzeCodeVO;
 import com.diagbot.vo.AnalyzeVO;
 import com.diagbot.vo.BehospitalPageVO;
+import com.diagbot.vo.EntryStatisticsVO;
 import com.diagbot.vo.ExportQcresultVO;
 import com.diagbot.vo.FilterOrderByDeptVO;
 import com.diagbot.vo.FilterOrderVO;
@@ -317,9 +319,21 @@ public class BehospitalInfoServiceImpl extends ServiceImpl<BehospitalInfoMapper,
 
     /**
      * 根据编码、医院编码批量更新
+     *
      * @param list
      */
-    public void updateBatchByKey(List<BehospitalInfo> list){
+    public void updateBatchByKey(List<BehospitalInfo> list) {
         this.baseMapper.updateBatchByKey(list);
     }
+
+    /**
+     * 关键条目缺陷占比统计
+     *
+     * @param entryStatisticsVO
+     * @return
+     */
+    @Override
+    public List<EntryStatisticsDTO> entryStatistics(EntryStatisticsVO entryStatisticsVO) {
+        return baseMapper.entryStatistics(entryStatisticsVO);
+    }
 }

+ 51 - 0
src/main/java/com/diagbot/vo/EntryStatisticsVO.java

@@ -0,0 +1,51 @@
+package com.diagbot.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/6/18 20:25
+ */
+@Getter
+@Setter
+public class EntryStatisticsVO {
+    /**
+     * 起始时间
+     */
+    @NotNull(message = "请输入起始时间")
+    private Date startDate;
+    /**
+     * 结束时间
+     */
+    @NotNull(message = "请输入截止时间")
+    private Date endDate;
+    /**
+     * 医院id
+     */
+    @ApiModelProperty(hidden = true)
+    private String hospitalId;
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(hidden = true)
+    private Long userId;
+    /**
+     * 排序(升序)
+     */
+    private String asc;
+
+    /**
+     * 排序(降序)
+     */
+    private String desc;
+    /**
+     * 科室名称
+     */
+    private String deptName;
+}

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

@@ -5,6 +5,7 @@ import com.diagbot.annotation.SysLogger;
 import com.diagbot.dto.AverageStatisticsDTO;
 import com.diagbot.dto.DeptNumDTO;
 import com.diagbot.dto.EntryNumDTO;
+import com.diagbot.dto.EntryStatisticsDTO;
 import com.diagbot.dto.HomePageNumDTO;
 import com.diagbot.dto.LevelStatisticsDTO;
 import com.diagbot.dto.LevelStatisticsTZDTO;
@@ -12,6 +13,7 @@ import com.diagbot.dto.NumDTO;
 import com.diagbot.dto.QcResultShortDTO;
 import com.diagbot.dto.RespDTO;
 import com.diagbot.facade.ConsoleFacade;
+import com.diagbot.vo.EntryStatisticsVO;
 import com.diagbot.vo.FilterOrderVO;
 import com.diagbot.vo.FilterPageByAverageVO;
 import com.diagbot.vo.FilterPageVO;
@@ -453,7 +455,7 @@ public class ConsoleController {
      * @return
      */
     @ApiOperation(value = "条目缺陷质控评分页(内页)[by:zhaops]",
-            notes = "behospitalCode: 病历号)<br>" +
+            notes = "behospitalCode: 病历号<br>" +
                     "patName: 病人姓名 <br>" +
                     "casesEntryName: 条目名称 <br>" +
                     "casesEntryId: 条目id <br>" +
@@ -468,4 +470,22 @@ public class ConsoleController {
     public RespDTO<IPage<QcResultShortDTO>> qcResultShortPage(@RequestBody @Valid QcResultShortPageVO qcResultShortPageVO) {
         return RespDTO.onSuc(consoleFacade.qcResultShortPage(qcResultShortPageVO));
     }
+
+    /**
+     * 关键条目缺陷占比统计
+     *
+     * @param entryStatisticsVO
+     * @return
+     */
+    @ApiOperation(value = "关键条目缺陷占比统计[by:zhaops]",
+            notes = "deptName:科室名称 <br>" +
+                    "asc: 排序(升序) <br>" +
+                    "desc:排序(降序) <br>" +
+                    "startDate: 起始时间 <br>" +
+                    "endDate: 截止时间 <br>")
+    @PostMapping("/entryStatistics")
+    @SysLogger("entryStatistics")
+    public RespDTO<List<EntryStatisticsDTO>> entryStatistics(@RequestBody @Valid EntryStatisticsVO entryStatisticsVO) {
+        return RespDTO.onSuc(consoleFacade.entryStatistics(entryStatisticsVO));
+    }
 }

+ 318 - 0
src/main/resources/mapper/BehospitalInfoMapper.xml

@@ -2988,4 +2988,322 @@
             where behospital_code = #{item.behospitalCode} and hospital_id = #{item.hospitalId}
         </foreach>
     </update>
+
+    <!-- 关键条目缺陷统计报表-->
+    <select id="entryStatistics" parameterType="com.diagbot.vo.EntryStatisticsVO" resultType="com.diagbot.dto.EntryStatisticsDTO">
+        SELECT
+        deptId,
+        deptName,
+        consultationNum,
+        2511 AS consultationEntryId,
+        '普通会诊未在24小时内完成' AS consultationEntryName,
+        ROUND( consultationNum / consultationMRNum, 4 ) AS consultationPercent,
+        CONCAT( ROUND( consultationNum / consultationMRNum * 100, 2 ), '%' ) AS consultationPercentStr,
+        consultationMRNum,
+        2594 AS operationNameEntryId,
+        '首页手术名称与手术记录不一致' AS operationNameEntryName,
+        operationNameNum,
+        ROUND( operationNameNum / operationMRNum, 4 ) AS operationNamePercent,
+        CONCAT( ROUND( operationNameNum / operationMRNum * 100, 2 ), '%' ) AS operationNamePercentStr,
+        2973 AS operationTimeEntryId,
+        '手术日期与手术记录中手术日期不一致' AS operationTimeEntryName,
+        operationTimeNum,
+        ROUND( operationTimeNum / operationMRNum, 4 ) AS operationTimePercent,
+        CONCAT( ROUND( operationTimeNum / operationMRNum * 100, 2 ), '%' ) AS operationTimePercentStr,
+        2166 AS operation15MinuteEntryId,
+        '术后首程未在手术结束1小时内完成' AS operation15MinuteEntryName,
+        operation15MinuteNum,
+        ROUND( operation15MinuteNum / operationMRNum, 4 ) AS operation15MinutePercent,
+        CONCAT( ROUND( operation15MinuteNum / operationMRNum * 100, 2 ), '%' ) AS operation15MinutePercentStr,
+        operationMRNum,
+        2419 AS crisisEntryId,
+        '危急值记录未在接到危急值报告后6小时内完成' AS crisisEntryName,
+        crisisNum,
+        ROUND( crisisNum / crisisMRNum, 4 ) AS crisisPercent,
+        CONCAT( ROUND( crisisNum / crisisMRNum * 100, 2 ), '%' ) AS crisisPercentStr,
+        crisisMRNum,
+        2495 AS stageSummaryEntryId,
+        '无阶段小结' AS stageSummaryEntryName,
+        stageSummaryNum,
+        ROUND( stageSummaryNum / stageSummaryMRNum, 4 ) AS stageSummaryPercent,
+        CONCAT( ROUND( stageSummaryNum / stageSummaryMRNum * 100, 2 ), '%' ) AS stageSummaryPercentStr,
+        stageSummaryMRNum
+        FROM
+        (
+        SELECT
+        tt.deptId,
+        tt.deptName,
+        sum( tt.consultationNum ) AS consultationNum,
+        sum( tt.consultationMRNum ) AS consultationMRNum,
+        sum( tt.operationNameNum ) AS operationNameNum,
+        sum( tt.operationTimeNum ) AS operationTimeNum,
+        sum( tt.operation15MinuteNum ) AS operation15MinuteNum,
+        sum( tt.operationMRNum ) AS operationMRNum,
+        sum( tt.crisisNum ) AS crisisNum,
+        sum( tt.crisisMRNum ) AS crisisMRNum,
+        sum( tt.stageSummaryNum ) AS stageSummaryNum,
+        sum( tt.stageSummaryMRNum ) AS stageSummaryMRNum
+        FROM
+        (
+        (
+        SELECT
+        c.beh_dept_id AS deptId,
+        c.beh_dept_name AS deptName,
+        sum( d.cases_entry_id = 2511 ) AS consultationNum,
+        count( DISTINCT c.behospital_code ) AS consultationMRNum,
+        0 AS operationNameNum,
+        0 AS operationTimeNum,
+        0 AS operation15MinuteNum,
+        0 AS operationMRNum,
+        0 AS crisisNum,
+        0 AS crisisMRNum,
+        0 AS stageSummaryNum,
+        0 AS stageSummaryMRNum
+        FROM
+        (
+        SELECT DISTINCT
+        a.hospital_id,
+        a.behospital_code,
+        a.beh_dept_name,
+        a.beh_dept_id
+        FROM
+        med_behospital_info a,
+        med_medical_record b
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND b.mode_id = 30
+        AND a.is_placefile = '1'
+        AND a.qc_type_id != 0
+        <if test="hospitalId != null and hospitalId != ''">
+            AND a.hospital_id = #{hospitalId}
+        </if>
+        <if test="startDate != null">
+            <![CDATA[ AND a.leave_hospital_date >= DATE(#{startDate})]]>
+        </if>
+        <if test="endDate != null">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{endDate})]]>
+        </if>
+        <if test="deptName != null and deptName != ''">
+            AND a.beh_dept_name = #{deptName}
+        </if>
+        ) c,
+        med_qcresult_detail d
+        WHERE
+        d.is_deleted = 'N'
+        AND c.hospital_id = d.hospital_id
+        AND c.behospital_code = d.behospital_code
+        GROUP BY
+        c.beh_dept_id,
+        c.beh_dept_name
+        ) UNION
+        (
+        SELECT
+        a.beh_dept_id AS deptId,
+        a.beh_dept_name AS deptName,
+        0 AS consultationNum,
+        0 AS consultationMRNum,
+        sum( c.cases_entry_id = 2594 ) AS operationNameNum,
+        sum( c.cases_entry_id = 2973 ) AS operationTimeNum,
+        sum( c.cases_entry_id = 2166 ) AS operation15MinuteNum,
+        count( DISTINCT a.behospital_code ) AS operationMRNum,
+        0 AS crisisNum,
+        0 AS crisisMRNum,
+        0 AS stageSummaryNum,
+        0 AS stageSummaryMRNum
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_detail c
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.hospital_id = c.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.behospital_code = c.behospital_code
+        AND a.is_placefile = '1'
+        AND a.qc_type_id !=0
+        <if test="hospitalId != null and hospitalId != ''">
+            AND a.hospital_id = #{hospitalId}
+        </if>
+        <if test="startDate != null">
+            <![CDATA[ AND a.leave_hospital_date >= DATE(#{startDate})]]>
+        </if>
+        <if test="endDate != null">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{endDate})]]>
+        </if>
+        <if test="deptName != null and deptName != ''">
+            AND a.beh_dept_name = #{deptName}
+        </if>
+        GROUP BY
+        a.beh_dept_id,
+        a.beh_dept_name
+        ) UNION
+        (
+        SELECT
+        c.beh_dept_id AS deptId,
+        c.beh_dept_name AS deptName,
+        sum( d.cases_entry_id = 2419 ) AS crisisNum,
+        count( DISTINCT c.behospital_code ) AS crisisMRNum,
+        0 AS consultationNum,
+        0 AS consultationMRNum,
+        0 AS operationNameNum,
+        0 AS operationTimeNum,
+        0 AS operation15MinuteNum,
+        0 AS operationMRNum,
+        0 AS stageSummaryNum,
+        0 AS stageSummaryMRNum
+        FROM
+        (
+        SELECT DISTINCT
+        a.hospital_id,
+        a.behospital_code,
+        a.beh_dept_name,
+        a.beh_dept_id
+        FROM
+        med_behospital_info a,
+        med_crisis_info b
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.is_placefile = '1'
+        AND a.qc_type_id != 0
+        <if test="hospitalId != null and hospitalId != ''">
+            AND a.hospital_id = #{hospitalId}
+        </if>
+        <if test="startDate != null">
+            <![CDATA[ AND a.leave_hospital_date >= DATE(#{startDate})]]>
+        </if>
+        <if test="endDate != null">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{endDate})]]>
+        </if>
+        <if test="deptName != null and deptName != ''">
+            AND a.beh_dept_name = #{deptName}
+        </if>
+        ) c,
+        med_qcresult_detail d
+        WHERE
+        d.is_deleted = 'N'
+        AND c.hospital_id = d.hospital_id
+        AND c.behospital_code = d.behospital_code
+        GROUP BY
+        c.beh_dept_id,
+        c.beh_dept_name
+        ) UNION
+        (
+        SELECT
+        a.beh_dept_id AS deptId,
+        a.beh_dept_name AS deptName,
+        sum( b.cases_entry_id = 2495 ) AS stageSummaryNum,
+        count( DISTINCT a.behospital_code ) AS stageSummaryMRNum,
+        0 AS consultationNum,
+        0 AS consultationMRNum,
+        0 AS operationNameNum,
+        0 AS operationTimeNum,
+        0 AS operation15MinuteNum,
+        0 AS operationMRNum,
+        0 AS crisisNum,
+        0 AS crisisMRNum
+        FROM
+        med_behospital_info a,
+        med_qcresult_detail b
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND TIMESTAMPDIFF(
+        DAY,
+        DATE( behospital_date ),
+        DATE( leave_hospital_date ))> 30
+        AND a.is_placefile = '1'
+        AND a.qc_type_id !=0
+        <if test="hospitalId != null and hospitalId != ''">
+            AND a.hospital_id = #{hospitalId}
+        </if>
+        <if test="startDate != null">
+            <![CDATA[ AND a.leave_hospital_date >= DATE(#{startDate})]]>
+        </if>
+        <if test="endDate != null">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{endDate})]]>
+        </if>
+        <if test="deptName != null and deptName != ''">
+            AND a.beh_dept_name = #{deptName}
+        </if>
+        GROUP BY
+        a.beh_dept_id,
+        a.beh_dept_name
+        )
+        ) tt
+        GROUP BY
+        tt.deptId,
+        tt.deptName
+        ) t
+        <if test="asc != null and asc !=''">
+            order by
+            <choose>
+                <when test='asc=="deptId"'>deptId asc</when>
+                <when test='asc=="deptName"'>deptName asc</when>
+                <when test='asc=="consultationNum"'>consultationNum asc</when>
+                <when test='asc=="consultationPercent"'>consultationPercent asc</when>
+                <when test='asc=="consultationPercentStr"'>consultationPercent asc</when>
+                <when test='asc=="consultationMRNum"'>consultationMRNum asc</when>
+                <when test='asc=="operationNameNum"'>operationNameNum asc</when>
+                <when test='asc=="operationNamePercent"'>operationNamePercent asc</when>
+                <when test='asc=="operationNamePercentStr"'>operationNamePercent asc</when>
+                <when test='asc=="operationTimeNum"'>operationTimeNum asc</when>
+                <when test='asc=="operationTimePercent"'>operationTimePercent asc</when>
+                <when test='asc=="operationTimePercentStr"'>operationTimePercent asc</when>
+                <when test='asc=="operation15MinuteNum"'>operation15MinuteNum asc</when>
+                <when test='asc=="operation15MinutePercent"'>operation15MinutePercent asc</when>
+                <when test='asc=="operation15MinutePercentStr"'>operation15MinutePercent asc</when>
+                <when test='asc=="operationMRNum"'>operationMRNum asc</when>
+                <when test='asc=="crisisNum"'>crisisNum asc</when>
+                <when test='asc=="crisisPercent"'>crisisPercent asc</when>
+                <when test='asc=="crisisPercentStr"'>crisisPercent asc</when>
+                <when test='asc=="crisisMRNum"'>crisisMRNum asc</when>
+                <when test='asc=="stageSummaryNum"'>stageSummaryNum asc</when>
+                <when test='asc=="stageSummaryPercent"'>stageSummaryPercent asc</when>
+                <when test='asc=="stageSummaryPercentStr"'>stageSummaryPercent asc</when>
+                <when test='asc=="stageSummaryMRNum"'>stageSummaryMRNum asc</when>
+                <otherwise>deptName asc</otherwise>
+            </choose>
+        </if>
+        <if test="desc != null and desc!=''">
+            order by
+            <choose>
+                <when test='desc=="deptId"'>deptId desc</when>
+                <when test='desc=="deptName"'>deptName desc</when>
+                <when test='desc=="consultationNum"'>consultationNum desc</when>
+                <when test='desc=="consultationPercent"'>consultationPercent desc</when>
+                <when test='desc=="consultationPercentStr"'>consultationPercent desc</when>
+                <when test='desc=="consultationMRNum"'>consultationMRNum desc</when>
+                <when test='desc=="operationNameNum"'>operationNameNum desc</when>
+                <when test='desc=="operationNamePercent"'>operationNamePercent desc</when>
+                <when test='desc=="operationNamePercentStr"'>operationNamePercent desc</when>
+                <when test='desc=="operationTimeNum"'>operationTimeNum desc</when>
+                <when test='desc=="operationTimePercent"'>operationTimePercent desc</when>
+                <when test='desc=="operationTimePercentStr"'>operationTimePercent desc</when>
+                <when test='desc=="operation15MinuteNum"'>operation15MinuteNum desc</when>
+                <when test='desc=="operation15MinutePercent"'>operation15MinutePercent desc</when>
+                <when test='desc=="operation15MinutePercentStr"'>operation15MinutePercent desc</when>
+                <when test='desc=="operationMRNum"'>operationMRNum desc</when>
+                <when test='desc=="crisisNum"'>crisisNum desc</when>
+                <when test='desc=="crisisPercent"'>crisisPercent desc</when>
+                <when test='desc=="crisisPercentStr"'>crisisPercent desc</when>
+                <when test='desc=="crisisMRNum"'>crisisMRNum desc</when>
+                <when test='desc=="stageSummaryNum"'>stageSummaryNum desc</when>
+                <when test='desc=="stageSummaryPercent"'>stageSummaryPercent desc</when>
+                <when test='desc=="stageSummaryPercentStr"'>stageSummaryPercent desc</when>
+                <when test='desc=="stageSummaryMRNum"'>stageSummaryMRNum desc</when>
+                <otherwise>deptName desc</otherwise>
+            </choose>
+        </if>
+    </select>
 </mapper>