zhanghang 4 лет назад
Родитель
Сommit
4f964798ab

+ 65 - 1
doc/031.20210326v2.0.3/qc_initv2.0.3.sql

@@ -10,5 +10,69 @@ CREATE TABLE `qc_cases_relevance_entry` (
   `cases_name` varchar(255) DEFAULT NULL COMMENT '指标名称',
   `relevance_id` bigint(20) DEFAULT NULL COMMENT '关联质控条目',
   `name` varchar(255) DEFAULT NULL COMMENT '条目',
+  `is_deleted` varchar(255) DEFAULT 'N',
   PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='质控关联条目表';
+) ENGINE=InnoDB AUTO_INCREMENT=60 DEFAULT CHARSET=utf8 COMMENT='质控关联条目表';
+
+-- ----------------------------
+-- Records of qc_cases_relevance_entry
+-- ----------------------------
+INSERT INTO `qc_cases_relevance_entry` VALUES ('1', '4', '4', '入院记录24小时内完成率', '2658', '入院记录未在患者入院24小时内完成', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('2', '5', '4', '手术记录24小时内完成率', '2170', '手术记录未在术后24h内完成', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('3', '6', '4', '出院记录24小时完成率', '2635', '出院记录未在患者入院24小时内完成', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('4', '7', '4', '病案首页24小时完成率', '3110', '病案首页未在患者出院24小时内完成', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('5', '8', '4', 'CT检查记录24小时内完成率', '3114', '医嘱存在CT,报告单未记录', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('6', '9', '4', 'MR检查记录24小时完成率', '3112', '医嘱存在MR,报告单未记录', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('7', '8', '4', 'CT检查记录24小时内完成率', '3115', '医嘱存在CT,病历记录未记录', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('8', '9', '4', 'MR检查记录24小时完成率', '3113', '医嘱存在MR,病历记录未记录', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('9', '10', '4', '病理检查完成率', '3116', '病理检查缺少病理检查报告单', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('10', '10', '4', '病理检查完成率', '3111', '手术病理检查存在手术记录中无病理相关记录', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('11', '10', '4', '病理检查完成率', '3117', '病理检查存在病程记录中无病理报告结果', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('12', '11', '4', '测试', '2528', '测试1111', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('13', '11', '4', '测试2', '2370', '测试2222', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('14', '11', '4', '测试3', '2522', '测试3333', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('15', '11', '4', '测试4', '2555', '测试4444', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('16', '11', '4', '测试5', '2560', '测试5555', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('17', '11', '4', '测试6', '2604', '测试6666', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('18', '17', '4', '医师查房记录完成率', '2655', '每周无2次副主任医师/主任医师查房记录', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('19', '17', '4', '医师查房记录完成率', '2654', '每周无3次主治医师查房记录', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('20', '17', '4', '医师查房记录完成率', '2468', '缺少术后首次病程记录', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('21', '14', '4', '手术相关记录完整率', '3107', '手术记录次数与手术次数不一致', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('22', '14', '4', '手术相关记录完整率', '2439', '手术记录中术前诊断未填写', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('23', '14', '4', '手术相关记录完整率', '2438', '手术记录中术(中)后诊断未填写', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('24', '14', '4', '手术相关记录完整率', '2437', '手术记录中手术经过未填写', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('25', '14', '4', '手术相关记录完整率', '2429', '手术患者缺麻醉记录', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('26', '14', '4', '手术相关记录完整率', '2480', '缺手术安全核查表', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('27', '14', '4', '手术相关记录完整率', '2478', '手术安全核查表填写时间不正确', 'Y');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('28', '14', '4', '手术相关记录完整率', '2479', '手术安全核查表内容不完整', 'Y');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('29', '14', '4', '手术相关记录完整率', '2467', '手术患者缺术前讨论或术前小结', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('30', '14', '4', '手术相关记录完整率', '2463', '术前讨论记录无术前准备内容', 'Y');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('31', '14', '4', '手术相关记录完整率', '2461', '术前讨论术中、术后注意事项未填写', 'Y');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('32', '14', '4', '手术相关记录完整率', '2466', '术前讨论记录无手术指征', 'Y');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('33', '16', '4', '临床用血相关记录符合率', '2247', '输血记录血型未填写', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('34', '16', '4', '临床用血相关记录符合率', '2245', '输血记录Rh血型未填写', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('35', '16', '4', '临床用血相关记录符合率', '2243', '输血记录输注前评估未填写', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('36', '16', '4', '临床用血相关记录符合率', '2248', '输血记录输血记录时间未填写', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('37', '16', '4', '临床用血相关记录符合率', '2249', '输血记录输血记录者未签名', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('38', '16', '4', '临床用血相关记录符合率', '2250', '输血记录输血结束时间填写不规范', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('39', '16', '4', '临床用血相关记录符合率', '2251', '输血记录输血结束时间未填写', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('40', '16', '4', '临床用血相关记录符合率', '2252', '输血记录开始输血时间填写不规范', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('41', '16', '4', '临床用血相关记录符合率', '2253', '输血记录开始输血时间未填写', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('42', '16', '4', '临床用血相关记录符合率', '2483', '输血记录中未记录有无不良反应', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('43', '16', '4', '临床用血相关记录符合率', '2484', '输血记录中无血液制品种类及量', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('44', '16', '4', '临床用血相关记录符合率', '2485', '输血记录中无输血指征', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('45', '16', '4', '临床用血相关记录符合率', '2486', '输血记录未在输注结束后24小时内完成', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('46', '16', '4', '临床用血相关记录符合率', '2491', '输血指征不严格', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('47', '16', '4', '临床用血相关记录符合率', '2492', '无输血/血制品病程记录', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('48', '16', '4', '临床用血相关记录符合率', '2482', '无输血或使用血液制品后效果评价', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('49', '16', '4', '临床用血相关记录符合率', '2490', '无输血或使用血液制品知情同意书', 'N未开发');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('50', '17', '4', '医师查房记录完成率', '2215', '整份病历无主治医师查房记录', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('51', '17', '4', '医师查房记录完成率', '2639', '患者出院前无上级医师(主治及以上)同意出院的病程记录', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('52', '17', '4', '医师查房记录完成率', '2214', '主刀医师在术后48小时内无查房记录', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('53', '17', '4', '医师查房记录完成率', '2378', '危重患者无上级医师(副高及以上)查房记录', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('54', '17', '4', '医师查房记录完成率', '2377', '疑难患者无上级医师(副高及以上)查房记录', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('55', '17', '4', '医师查房记录完成率', '2376', '抢救患者无上级医师(副高及以上)查房记录', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('56', '17', '4', '医师查房记录完成率', '2900', '术后24小时内无主刀或一助查房记录', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('57', '17', '4', '医师查房记录完成率', '2229', '术后查房没有连续记录3天', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('58', '17', '4', '医师查房记录完成率', '2468', '缺少术后首次病程记', 'N');
+INSERT INTO `qc_cases_relevance_entry` VALUES ('59', '18', '4', '患者抢救记录及时完成率', '2852', '抢救记录未在抢救结束后6小时内完成', 'N');

+ 2 - 0
src/main/java/com/diagbot/enums/QualityContent.java

@@ -9,6 +9,8 @@ import java.util.List;
 public class QualityContent {
     public static final String recordNumber = "关联首页表质控病历人数";
     public static final String NoRecordNumberId = "无病案首页病历ID";
+    public static final String DISCHARGED_PATIENTS = "出院人数";
+    public static final String NUMBER_OF_HOSPITAL = "入院人数";
     /**
      * 触发规则指标
      */

+ 73 - 44
src/main/java/com/diagbot/facade/ConsoleFacade.java

@@ -38,6 +38,8 @@ import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import static io.netty.util.internal.SystemPropertyUtil.contains;
+
 /**
  * @Description:
  * @Author:zhaops
@@ -390,57 +392,65 @@ public class ConsoleFacade {
         filterFacade.filterVOSet(filterVO);
         MedQualityControlDTO medQualityControlDTO = new MedQualityControlDTO();
         Map<String, Long> selectOperationNumMap = behospitalInfoFacade.selectOperationNum(filterVO);
-        Long startCount = selectOperationNumMap.get("出院人数");
-        Long endCount = selectOperationNumMap.get("住院人数");
+        Long startCount = selectOperationNumMap.get(QualityContent.DISCHARGED_PATIENTS);
+        Long endCount = selectOperationNumMap.get(QualityContent.NUMBER_OF_HOSPITAL);
         //手术人数
         Long operationFeeNum = selectOperationNumMap.get("operationFee");
         int operationNum = getOperationNum(filterVO);
         Integer integer = Integer.valueOf(operationNum);
-        operationFeeNum=operationFeeNum+integer;
+        operationFeeNum = operationFeeNum + integer;
         //抗菌人数
         Long antibiosisFeeNum = selectOperationNumMap.get("antibiosisFee");
         Integer antibiosis = Integer.valueOf(getAntibiosisNum(filterVO));
-        antibiosisFeeNum=antibiosisFeeNum+antibiosis;
+        antibiosisFeeNum = antibiosisFeeNum + antibiosis;
         //手术病理人数
         Long operationPathologyFeeNum = selectOperationNumMap.get("operationPathologyFee");
         int operationPathologyNum = getOperationPathologyNum(filterVO);
         Integer operationPathologyInteger = Integer.valueOf(operationPathologyNum);
-        operationPathologyFeeNum=operationPathologyFeeNum+operationPathologyInteger;
+        operationPathologyFeeNum = operationPathologyFeeNum + operationPathologyInteger;
         Map<String, Long> recordIndicatorMap = behospitalInfoFacade.triggeringRules(filterVO);
         //各指标未完成人数情况
         Long operationCount = recordIndicatorMap.get(QualityContent.SSJLWCC_24H);
         Long InHospitalRecords = recordIndicatorMap.get(QualityContent.RYJLWWC_24H);
         Long OutHospitalRecords = recordIndicatorMap.get(QualityContent.CYJLWWC_24H);
         Long recordHomePage = recordIndicatorMap.get(QualityContent.BASYWWC_24H);
-        if(startCount.intValue()!=0){
-            //手术记录完成率
-            //手术完成人数为
-            medQualityControlDTO.setOperationNum(Double.valueOf(operationFeeNum-operationCount));
-            //手术完成率
-            medQualityControlDTO.setOperationStr(getResult(operationFeeNum-operationCount,operationFeeNum));
+        //手术记录完成率
+        //手术完成人数为
+        if (operationCount != null && operationFeeNum!=null){
+            medQualityControlDTO.setOperationNum(Double.valueOf(operationFeeNum - operationCount));
+        //手术完成率
+             medQualityControlDTO.setOperationStr(getResult(operationFeeNum - operationCount, operationFeeNum));
+        }
             //入院记录24小时完成率
             //入院记录完成人数为
-            medQualityControlDTO.setAdmissionNum(Double.valueOf(startCount-InHospitalRecords));
+        if (InHospitalRecords != null && startCount!=null) {
+            medQualityControlDTO.setAdmissionNum(Double.valueOf(startCount - InHospitalRecords));
             //入院记录完成率
-            medQualityControlDTO.setAdmissionStr(getResult(startCount-InHospitalRecords,startCount));
+            medQualityControlDTO.setAdmissionStr(getResult(startCount - InHospitalRecords, startCount));
+        }
             //出院记录24小时完成率
             //出院记录完成人数为
-            medQualityControlDTO.setLeaveHospitalNum(Double.valueOf(startCount-OutHospitalRecords));
+        if (OutHospitalRecords != null && startCount!=null) {
+            medQualityControlDTO.setLeaveHospitalNum(Double.valueOf(startCount - OutHospitalRecords));
             //出院记录完成率
-            medQualityControlDTO.setLeaveHospitalStr(getResult(startCount-OutHospitalRecords,startCount));
+            medQualityControlDTO.setLeaveHospitalStr(getResult(startCount - OutHospitalRecords, startCount));
+        }
             //病案首页24小时完成率
             //病案首页完成人数为
-            medQualityControlDTO.setMedHomePageNum(Double.valueOf(startCount-recordHomePage));
+        if (recordHomePage != null && startCount!=null) {
+            medQualityControlDTO.setMedHomePageNum(Double.valueOf(startCount - recordHomePage));
             //病案首页完成率
-            medQualityControlDTO.setMedHomePageStr(getResult(startCount-recordHomePage,startCount));
+            medQualityControlDTO.setMedHomePageStr(getResult(startCount - recordHomePage, startCount));
         }
+
+        Map<String, Long> longMap = getCTNum(filterVO);
         //CT人数
-        Long CTNum = getCTNum(filterVO).get("CT");
+        Long CTNum = longMap.get("CT");
         //MR人数
-        Long MRNum = getCTNum(filterVO).get("MR");
+        Long MRNum = longMap.get("MR");
 
         //触发规则
-        //病理
+        //病理手术
         Map<String, Long> triggeringRulesMap = behospitalInfoFacade.triggeringRules(filterVO);
         Long antibiosisNum = triggeringRulesMap.get("antibiosisNum");
         //细菌培养
@@ -449,12 +459,18 @@ public class ConsoleFacade {
         Long ct = triggeringRulesMap.get("CT");
         //MR
         Long mr = triggeringRulesMap.get("MR");
-        //病理完成率为
-        medQualityControlDTO.setPathologicalExamination(getResult(operationPathologyFeeNum - antibiosisNum,operationPathologyFeeNum));
+        if(operationPathologyFeeNum!=null && antibiosisNum!=null) {
+            //病理完成率为
+            medQualityControlDTO.setPathologicalExamination(getResult(operationPathologyFeeNum - antibiosisNum, operationPathologyFeeNum));
+        }
         //CT完成率
-        medQualityControlDTO.setCTExaminationConform(getResult(CTNum - ct,CTNum));
+        if(CTNum!=null && ct!=null) {
+            medQualityControlDTO.setCTExaminationConform(getResult(CTNum - ct, CTNum));
+        }
         //MR完成率
-        medQualityControlDTO.setMRIExaminationConform(getResult(MRNum - mr,MRNum));
+            if(MRNum!=null && mr!=null) {
+                medQualityControlDTO.setMRIExaminationConform(getResult(MRNum - mr, MRNum));
+            }
         //抗菌完成率
       //    medQualityControlDTO.setAdmissionStr(getResult(antibiosisFeeNum-0,antibiosisFeeNum));
 
@@ -584,17 +600,20 @@ public class ConsoleFacade {
         HashMap<String, Long> map = new HashMap<>();
         ArrayList<String> codeList = new ArrayList<>();
         for (Map<String, String> ctNumMap : getDoctorAdviceNum) {
-            if (ctNumMap.get("doctor_advice_type").contains(QualityContent.STAT_ORDER)) {
-                String behospitalCode = ctNumMap.get("behospital_code");
-                if (!codeList.contains(behospitalCode)) {
-                    String daItemName = ctNumMap.get("da_item_name");
-                    if (daItemName.contains(QualityContent.CT) || daItemName.contains(QualityContent.X_RAY)) {
-                        if ((!daItemName.contains(QualityContent.ATCH) && !daItemName.contains(QualityContent.TCT) && !daItemName.contains(QualityContent.HCT)
-                                && !daItemName.contains(QualityContent.OCT) && !daItemName.contains(QualityContent.NCT) && !daItemName.contains(QualityContent.LCT)
-                                && !daItemName.contains(QualityContent.ACT)) || (daItemName.contains(QualityContent.STOP))) {
-                            //都不包含为CT
-                            codeList.add(behospitalCode);
-                            continue;
+            String doctorAdviceType = ctNumMap.get("doctor_advice_type");
+            if(StringUtil.isNotEmpty(doctorAdviceType)) {
+                if (doctorAdviceType.contains(QualityContent.STAT_ORDER)) {
+                    String behospitalCode = ctNumMap.get("behospital_code");
+                    if (!codeList.contains(behospitalCode)) {
+                        String daItemName = ctNumMap.get("da_item_name");
+                        if ((daItemName.contains(QualityContent.CT) || daItemName.contains(QualityContent.X_RAY)) && StringUtil.isNotEmpty(daItemName)) {
+                            if ((!daItemName.contains(QualityContent.ATCH) && !daItemName.contains(QualityContent.TCT) && !daItemName.contains(QualityContent.HCT)
+                                    && !daItemName.contains(QualityContent.OCT) && !daItemName.contains(QualityContent.NCT) && !daItemName.contains(QualityContent.LCT)
+                                    && !daItemName.contains(QualityContent.ACT)) || (daItemName.contains(QualityContent.STOP))) {
+                                //都不包含为CT
+                                codeList.add(behospitalCode);
+                                continue;
+                            }
                         }
                     }
                 }
@@ -603,20 +622,30 @@ public class ConsoleFacade {
         ArrayList<String> codeMri = new ArrayList<>();
         for (Map<String, String> MRINumMap : getDoctorAdviceNum) {
             String behospitalCodeMri = MRINumMap.get("behospital_code");
-            if (MRINumMap.get("doctor_advice_type").contains(QualityContent.STAT_ORDER)) {
-                if (!codeList.contains(behospitalCodeMri)) {
-                    String daItemName = MRINumMap.get("da_item_name");
-                    if (daItemName.contains(QualityContent.MRGNETIC_RESONANCE) || daItemName.contains(QualityContent.MR)) {
-                        if (!daItemName.contains(QualityContent.IMRT) && !daItemName.contains(QualityContent.MRS)) {
-                            codeMri.add(behospitalCodeMri);
-                            continue;
+            if(StringUtil.isNotEmpty(MRINumMap.get("doctor_advice_type"))) {
+                if (contains(QualityContent.STAT_ORDER)) {
+                    if (!codeList.contains(behospitalCodeMri)) {
+                        String daItemName = MRINumMap.get("da_item_name");
+                        if (daItemName.contains(QualityContent.MRGNETIC_RESONANCE) || daItemName.contains(QualityContent.MR)) {
+                            if (!daItemName.contains(QualityContent.IMRT) && !daItemName.contains(QualityContent.MRS)) {
+                                codeMri.add(behospitalCodeMri);
+                                continue;
+                            }
                         }
                     }
                 }
             }
         }
-        map.put("CT",Long.valueOf(codeList.size()));
-        map.put("MR",Long.valueOf(codeMri.size()));
+        if(ListUtil.isNotEmpty(codeList)){
+            map.put("CT",Long.valueOf(0));
+        }else {
+            map.put("CT",Long.valueOf(codeList.size()));
+        }
+        if(ListUtil.isNotEmpty(codeMri)){
+            map.put("MR",Long.valueOf(0));
+        }else {
+            map.put("MR",Long.valueOf(codeMri.size()));
+        }
         return map;
     }
 

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

@@ -844,14 +844,6 @@ public class ConsoleController {
         return RespDTO.onSuc(consoleFacade.getMedicalCheckTitle());
     }
 
-    @ApiOperation(value = " 病案管理指标(内页)[by:cy]",
-            notes = "startDate:单位开始时间<br>" +
-                    "endDate:单位结束时间<br>")
-    @PostMapping("/getMedManageIndex")
-    @SysLogger("getMedManageIndex")
-    public RespDTO<MedQualityControlDTO> getMedManageIndex(@RequestBody FilterVO filterVO) {
-        MedQualityControlDTO data = consoleFacade.getMedManageIndex(filterVO);
-        return RespDTO.onSuc(data);
-    }
+
 
 }