فهرست منبع

关键条目缺陷占比统计

zhaops 5 سال پیش
والد
کامیت
769d5c9022

+ 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

@@ -115,6 +115,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("/**").authenticated();
         //                .antMatchers("/**").permitAll();
     }

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

@@ -158,6 +158,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("/", request)) {
             return true;
         }

+ 113 - 19
src/main/java/com/diagbot/dto/EntryStatisticsDTO.java

@@ -11,30 +11,124 @@ import lombok.Setter;
 @Getter
 @Setter
 public class EntryStatisticsDTO {
+    /**
+     * 科室id(科室编码)
+     */
     private String deptId;
+    /**
+     * 科室名称
+     */
     private String deptName;
-    private Integer consultationNum;
+    /**
+     * 未在24小时内完成会诊数
+     */
+    private Integer consultationNum = 0;
+    /**
+     * 未在24小时内完成会诊条目id
+     */
     private Long consultationEntryId;
-    private Double consultationPercent;
-    private String consultationPercentStr;
-    private Integer consultationMRNum;
+    /**
+     * 未在24小时内完成会诊率
+     */
+    private Double consultationPercent = 0.00d;
+    /**
+     * 未在24小时内完成会诊率(百分比)
+     */
+    private String consultationPercentStr = "0.00%";
+    /**
+     * 会诊病历数
+     */
+    private Integer consultationMRNum = 0;
+    /**
+     * 手术记录名称不匹配条目id
+     */
     private Long operationNameEntryId;
-    private Integer operationNameNum;
-    private Double operationNamePercent;
-    private String operationNamePercentStr;
+    /**
+     * 手术记录名称不匹配数
+     */
+    private Integer operationNameNum = 0;
+    /**
+     * 手术记录名称不匹配率
+     */
+    private Double operationNamePercent = 0.00d;
+    /**
+     * 手术记录名称不匹配率(百分比)
+     */
+    private String operationNamePercentStr = "0.00%";
+    /**
+     * 术后首程未在15分钟内完成条目id
+     */
+    private Long operation15MinuteEntryId;
+    /**
+     * 术后首程未在15分钟内完成数
+     */
+    private Integer operation15MinuteNum = 0;
+    /**
+     * 术后首程未在15分钟内完成率
+     */
+    private Double operation15MinutePercent = 0.00d;
+    /**
+     * 术后首程未在15分钟内完成率(百分比)
+     */
+    private String operation15MinutePercentStr = "0.00%";
+    /**
+     * 病案首页手术时间不匹配条目id
+     */
     private Long operationTimeEntryId;
-    private Integer operationTimeNum;
-    private Double operationTimePercent;
-    private String operationTimePercentStr;
-    private Integer operationMRNum;
+    /**
+     * 病案首页手术时间不匹配数
+     */
+    private Integer operationTimeNum = 0;
+    /**
+     * 病案首页手术时间不匹配率
+     */
+    private Double operationTimePercent = 0.00;
+    /**
+     * 病案首页手术时间不匹配率(百分比)
+     */
+    private String operationTimePercentStr = "0.00%";
+    /**
+     * 手术记录病历数
+     */
+    private Integer operationMRNum = 0;
+    /**
+     * 未在6小时内书写危急值条目id
+     */
     private Long crisisEntryId;
-    private Integer crisisNum;
-    private Double crisisPercent;
-    private String crisisPercentStr;
-    private Integer crisisMRNum;
+    /**
+     * 未在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 Integer stageSummaryNum;
-    private Double stageSummaryPercent;
-    private String stageSummaryPercentStr;
-    private Integer stageSummaryMRNum;
+    /**
+     * 阶段小节未书写数
+     */
+    private Integer stageSummaryNum = 0;
+    /**
+     * 阶段小节未书写率
+     */
+    private Double stageSummaryPercent = 0.00d;
+    /**
+     * 阶段小节未书写率(百分比)
+     */
+    private String stageSummaryPercentStr = "0.00%";
+    /**
+     * 病人住院超过30天的病历数
+     */
+    private Integer stageSummaryMRNum = 0;
 }

+ 67 - 42
src/main/java/com/diagbot/facade/ConsoleFacade.java

@@ -627,6 +627,7 @@ public class ConsoleFacade {
      * @return
      */
     public List<EntryStatisticsDTO> entryStatistics(EntryStatisticsVO entryStatisticsVO) {
+        filterFacade.entryStatisticsVOSet(entryStatisticsVO);
         if (entryStatisticsVO.getDeptName().equals("全院")) {
             entryStatisticsVO.setDeptName("");
         }
@@ -655,7 +656,7 @@ public class ConsoleFacade {
 
         EntryStatisticsDTO record = new EntryStatisticsDTO();
         record.setDeptName("全院");
-        //会诊记录合格率
+        //未在24小时内完成会诊
         Integer consultationNum = records
                 .stream()
                 .map(EntryStatisticsDTO::getConsultationNum)
@@ -667,14 +668,16 @@ public class ConsoleFacade {
                 .map(EntryStatisticsDTO::getConsultationMRNum)
                 .reduce(0, Integer::sum);
         record.setConsultationMRNum(consultationMRNum);
-        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);
-        //手术记录名称
+        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)
@@ -686,29 +689,48 @@ public class ConsoleFacade {
                 .map(EntryStatisticsDTO::getOperationMRNum)
                 .reduce(0, Integer::sum);
         record.setOperationMRNum(operationMRNum);
-        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);
-        //手术记录时间
+        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());
-
-        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);
-        //危机值
+        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)
@@ -720,14 +742,16 @@ public class ConsoleFacade {
                 .map(EntryStatisticsDTO::getCrisisMRNum)
                 .reduce(0, Integer::sum);
         record.setCrisisMRNum(crisisMRNum);
-        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天,阶段小节书写率
+        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)
@@ -739,14 +763,15 @@ public class ConsoleFacade {
                 .map(EntryStatisticsDTO::getStageSummaryMRNum)
                 .reduce(0, Integer::sum);
         record.setStageSummaryMRNum(stageSummaryMRNum);
-        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);
-
+        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)));
+    }
 }

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

@@ -2997,6 +2997,10 @@
         operationTimeNum,
         ROUND( operationTimeNum / operationMRNum, 4 ) AS operationTimePercent,
         CONCAT( ROUND( operationTimeNum / operationMRNum * 100, 2 ), '%' ) AS operationTimePercentStr,
+        2166 AS operation15MinuteEntryId,
+        operation15MinuteNum,
+        ROUND( operation15MinuteNum / operationMRNum, 4 ) AS operation15MinutePercent,
+        CONCAT( ROUND( operation15MinuteNum / operationMRNum * 100, 2 ), '%' ) AS operation15MinutePercentStr,
         operationMRNum,
         2419 AS crisisEntryId,
         crisisNum,
@@ -3017,6 +3021,7 @@
         sum( tt.consultationMRNum ) AS consultationMRNum,
         sum( tt.operationMRNum )- sum( tt.operationNameNum ) AS operationNameNum,
         sum( tt.operationMRNum )- sum( tt.operationTimeNum ) AS operationTimeNum,
+        sum( tt.operationMRNum )- sum( tt.operation15MinuteNum ) AS operation15MinuteNum,
         sum( tt.operationMRNum ) AS operationMRNum,
         sum( tt.crisisMRNum )- sum( tt.crisisNum ) AS crisisNum,
         sum( tt.crisisMRNum ) AS crisisMRNum,
@@ -3032,6 +3037,7 @@
         count( DISTINCT a.behospital_code ) AS consultationMRNum,
         0 AS operationNameNum,
         0 AS operationTimeNum,
+        0 AS operation15MinuteNum,
         0 AS operationMRNum,
         0 AS crisisNum,
         0 AS crisisMRNum,
@@ -3055,10 +3061,10 @@
         <if test="hospitalId != null and hospitalId != ''">
             AND a.hospital_id = #{hospitalId}
         </if>
-        <if test="startDate != null and startDate != ''">
-            <![CDATA[ and a.leave_hospital_date >= DATE(#{startDate})]]>
+        <if test="startDate != null">
+            <![CDATA[ AND a.leave_hospital_date >= DATE(#{startDate})]]>
         </if>
-        <if test="endDate != null and endDate != ''">
+        <if test="endDate != null">
             <![CDATA[AND a.leave_hospital_date < DATE(#{endDate})]]>
         </if>
         <if test="deptName != null and deptName != ''">
@@ -3076,6 +3082,7 @@
         0 AS consultationMRNum,
         sum( c.cases_entry_id = 2594 ) AS operationNameNum,
         sum( c.cases_entry_id = 2594 ) AS operationTimeNum,
+        sum( c.cases_entry_id = 2166 ) AS operation15MinuteNum,
         count( DISTINCT a.behospital_code ) AS operationMRNum,
         0 AS crisisNum,
         0 AS crisisMRNum,
@@ -3098,10 +3105,10 @@
         <if test="hospitalId != null and hospitalId != ''">
             AND a.hospital_id = #{hospitalId}
         </if>
-        <if test="startDate != null and startDate != ''">
-            <![CDATA[ and a.leave_hospital_date >= DATE(#{startDate})]]>
+        <if test="startDate != null">
+            <![CDATA[ AND a.leave_hospital_date >= DATE(#{startDate})]]>
         </if>
-        <if test="endDate != null and endDate != ''">
+        <if test="endDate != null">
             <![CDATA[AND a.leave_hospital_date < DATE(#{endDate})]]>
         </if>
         <if test="deptName != null and deptName != ''">
@@ -3121,6 +3128,7 @@
         0 AS consultationMRNum,
         0 AS operationNameNum,
         0 AS operationTimeNum,
+        0 AS operation15MinuteNum,
         0 AS operationMRNum,
         0 AS stageSummaryNum,
         0 AS stageSummaryMRNum
@@ -3133,16 +3141,18 @@
         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 and startDate != ''">
-            <![CDATA[ and a.leave_hospital_date >= DATE(#{startDate})]]>
+        <if test="startDate != null">
+            <![CDATA[ AND a.leave_hospital_date >= DATE(#{startDate})]]>
         </if>
-        <if test="endDate != null and endDate != ''">
+        <if test="endDate != null">
             <![CDATA[AND a.leave_hospital_date < DATE(#{endDate})]]>
         </if>
         <if test="deptName != null and deptName != ''">
@@ -3162,6 +3172,7 @@
         0 AS consultationMRNum,
         0 AS operationNameNum,
         0 AS operationTimeNum,
+        0 AS operation15MinuteNum,
         0 AS operationMRNum,
         0 AS crisisNum,
         0 AS crisisMRNum
@@ -3182,10 +3193,10 @@
         <if test="hospitalId != null and hospitalId != ''">
             AND a.hospital_id = #{hospitalId}
         </if>
-        <if test="startDate != null and startDate != ''">
-            <![CDATA[ and a.leave_hospital_date >= DATE(#{startDate})]]>
+        <if test="startDate != null">
+            <![CDATA[ AND a.leave_hospital_date >= DATE(#{startDate})]]>
         </if>
-        <if test="endDate != null and endDate != ''">
+        <if test="endDate != null">
             <![CDATA[AND a.leave_hospital_date < DATE(#{endDate})]]>
         </if>
         <if test="deptName != null and deptName != ''">