Bläddra i källkod

Merge branch 'dev/20210326_2.0.2' into develop

# Conflicts:
#	doc/031.20210326v2.0.2/qc_initv2.0.2.sql
#	src/main/java/com/diagbot/facade/BehospitalInfoFacade.java
#	src/main/java/com/diagbot/facade/ConsoleFacade.java
#	src/main/resources/mapper/BehospitalInfoMapper.xml
#	src/main/resources/mapper/MedIndexResultMapper.xml
chengyao 4 år sedan
förälder
incheckning
7d848193d0

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 91 - 24
doc/031.20210326v2.0.2/qc_initv2.0.2.sql


+ 5 - 4
src/main/java/com/diagbot/dto/MedManageParamsDTO.java

@@ -37,10 +37,11 @@ public class MedManageParamsDTO implements Serializable {
     //医嘱状态判别
     private String daStatus;
 
-    /**
-     * 住院科室名称
-     */
-    private String behDeptName;
+    //病历标题
+    private String content;
+
+    //文书内容(blob)
+    private String rec_title;
 
 
 

+ 0 - 20
src/main/java/com/diagbot/entity/MedIndexResult.java

@@ -98,11 +98,6 @@ public class MedIndexResult implements Serializable {
      */
     private Double bloodResult;
 
-    /**
-     * 医师查房记录完整率--分母
-     */
-    private Double wardRoundResult;
-
     /**
      * 患者抢救记录及时完成率--分母
      */
@@ -118,21 +113,6 @@ public class MedIndexResult implements Serializable {
      */
     private Double fileCompleteResult;
 
-    /**
-     * 不合理复制病历发生率--分母
-     */
-    private Double noCopyResult;
-
-    /**
-     * 知情同意书规范签署率--分母
-     */
-    private Double recordSignResult;
-
-    /**
-     * 甲级病历率--分母
-     */
-    private Double firRecordResult;
-
     private String startDate;
 
     private String endDate;

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

@@ -155,6 +155,17 @@ public class QualityContent {
      */
     public static List<String> FOURSTR = Arrays.asList(
             "住院病案管理人员月均负担出院患者病历数", "病案编码人员月均负担出院患者病历数", "门诊病案管理人员月均负担门诊患者病历数");
+
+    // 放疗药物目录
+    public static List<String> radiotherapyDrugList = Arrays.asList(
+            "艾迪注射液", "康艾注射液", "康莱特注射液", "鸦胆子油乳注射液", "榄香烯乳注射液", "香菇多糖", "胎盘多肽注射液", "甘露聚糖肽注射液",
+            "脾多肽注射液", "E巨和粒", "欣粒生", "特尔津", "日达仙注射剂", "益比奥", "特比澳", "胸腺五肽", "古拉定","天晴甘美", "易善复", "己糖神经节苷脂钠",
+            "核糖核酸II", "参芪扶正注射液", "甘露醇注射液", "兰索拉唑", "奥西康", "卡络磺钠注射液", "维生素K1注射液", "氨甲苯酸注射液", "酚磺乙胺注射液",
+            "盐酸甲氧氯普胺注", "甲磺酸托烷司琼注射液", "伊班膦酸钠注射液", "唑来膦酸", "盐酸氨溴索注射液","氨茶碱注射液", "孟鲁司特钠片", "阿托伐他汀钙片",
+            "阿卡波糖片", "盐酸二甲双胍片", "瑞格列奈片", "格列齐特片","拉米夫定片","耐信","益血生胶囊","地榆升白片", "鲨肝醇片", "复方皂矾丸", "加巴喷丁胶囊",
+            "塞来昔布胶囊", "氨酚曲马多片", "盐酸羟考酮缓释片","硫酸吗啡缓释片", "盐酸吗啡片","复方甲氧那明胶囊","醋酸甲地孕酮分散","枸橼酸托瑞米芬片","标准桃金娘油肠溶",
+            "甲氧氯普胺片","多潘立酮片"
+    );
 }
 
 

+ 47 - 41
src/main/java/com/diagbot/facade/BehospitalInfoFacade.java

@@ -1,6 +1,7 @@
 package com.diagbot.facade;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -13,31 +14,9 @@ import com.diagbot.enums.IsDeleteEnum;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
 import com.diagbot.service.impl.BehospitalInfoServiceImpl;
-import com.diagbot.util.BeanUtil;
-import com.diagbot.util.DateUtil;
-import com.diagbot.util.EncrypDES;
-import com.diagbot.util.EntityUtil;
-import com.diagbot.util.ExcelUtils;
-import com.diagbot.util.ListUtil;
-import com.diagbot.util.MapUtil;
-import com.diagbot.util.StringUtil;
-import com.diagbot.util.SysUserUtils;
-import com.diagbot.vo.AlgorithmVO;
-import com.diagbot.vo.AnalyzeCdsVO;
-import com.diagbot.vo.AnalyzeCodeVO;
-import com.diagbot.vo.AnalyzeRunVO;
-import com.diagbot.vo.AnalyzeVO;
-import com.diagbot.vo.BasDeptInfoVO;
-import com.diagbot.vo.BehospitalPageVO;
-import com.diagbot.vo.ExportQcresultVO;
-import com.diagbot.vo.FilterVO;
-import com.diagbot.vo.GetDetailVO;
-import com.diagbot.vo.MedrecVo;
-import com.diagbot.vo.QcResultAlgQueryVO;
-import com.diagbot.vo.QcResultAlgVO;
-import com.diagbot.vo.QueryVo;
-import com.diagbot.vo.RecordContentVO;
-import com.diagbot.vo.TaskVO;
+import com.diagbot.service.impl.StrInformedConsentServiceImpl;
+import com.diagbot.util.*;
+import com.diagbot.vo.*;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import org.apache.commons.lang3.StringUtils;
@@ -50,15 +29,8 @@ import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -171,6 +143,9 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
     SysHospitalSetFacade sysHospitalSetFacade;
     @Autowired
     QcCasesRelevanceEntryFacade qcCasesRelevanceEntryFacade;
+    @Autowired
+    StrInformedConsentServiceImpl strInformedConsentServiceImpl;
+
     @Autowired
     SysUserRoleFacade sysUserRoleFacade;
 
@@ -392,7 +367,7 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
         List<RecordContentDTO> recordContentDTOList = medicalRecordFacade.getRecordContentFac(recordContentVO);
         String recTitle = "";
         // 解密数据
-        if (false  && encryptFlag) {
+        if (encryptFlag) {
             try {
                 EncrypDES encrypDES = new EncrypDES();
                 for (RecordContentDTO recordContentDTO : recordContentDTOList) {
@@ -674,7 +649,7 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
         );
 
         //知情同意书
-        List<MedicalRecord> recordList = medicalRecordFacade.list(new QueryWrapper<MedicalRecord>()
+    /*    List<MedicalRecord> recordList = medicalRecordFacade.list(new QueryWrapper<MedicalRecord>()
                 .eq("is_deleted", IsDeleteEnum.N.getKey())
                 .eq("behospital_code", analyzeVO.getBehospitalCode())
                 .eq("hospital_id", hospitalId)
@@ -682,7 +657,7 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
                 .orderByAsc("rec_date")
         );
         List<MedicalRecordDTO> medicalRecordDTOList = BeanUtil.listCopyTo(recordList, MedicalRecordDTO.class);
-
+*/
         List<HomeDiagnoseInfo> homePageList = new ArrayList<>();
         List<HomeOperationInfo> homeOperationInfoList = new ArrayList<>();
         if (homePage != null) {
@@ -792,7 +767,6 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
         //使用sql进行关联优化数据查询
         List<MedPacsResultDTO> medPacsResultList = medPacsResultFacade.getMedPacsResultList(behospitalInfoList.get(0));
 
-
         /**
          * 结构化/文书数据兼容处理
          */
@@ -993,8 +967,8 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
 
         addData("日常病程录", recMap, medrecVoList);
 
-        DataWithKey("知情同意书", medicalRecordDTOList, medrecVoList);
-        //addDataWithInnerKey("知情同意书", recMap, medrecVoList);
+        //DataWithKey("知情同意书", medicalRecordDTOList, medrecVoList);
+        addDataWithInnerKey("知情同意书", recMap, medrecVoList);
         addDataWithInnerKey("谈话告知书", recMap, medrecVoList);
 
         //==============文书====================
@@ -1049,7 +1023,6 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
      * @return
      */
     public AnalyzeDTO analyze(AnalyzeVO analyzeVO) {
-
         Long hospitalId = analyzeVO.getHospitalId();
         if (!analyzeVO.getIsTask()) {
             hospitalId = Long.parseLong(SysUserUtils.getCurrentHospitalID());
@@ -2291,6 +2264,39 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
 
         //保存
         Map<String, Object> pageMap = outputInfo.getPageData();
+        //保存解析过后的手术知情同意书
+            List<String> recIds = new ArrayList<>();
+            if(pageMap.containsKey("手术知情同意书")){
+                Object informObject = pageMap.get("手术知情同意书");
+                List<Map<String,Object>> informList= (List<Map<String,Object>>) informObject;
+                List<StrInformedConsent> strInformedConsents = new ArrayList<>();
+                if(ListUtil.isNotEmpty(informList)) {
+                    informList.forEach(obj ->
+                            {
+                                Map<String, String> strMap = new HashMap<>();
+                                strMap.put("使用植入性材料", String.valueOf(obj.get("使用植入性材料")));
+                                StrInformedConsent strInformedConsent = new StrInformedConsent();
+                                strInformedConsent.setHospitalId(analyzeVO.getHospitalId());
+                                strInformedConsent.setBehospitalCode(analyzeVO.getBehospitalCode());
+                                strInformedConsent.setRecId(String.valueOf(obj.get("记录编号")));
+                                strInformedConsent.setRecTitle(String.valueOf(obj.get("病历标题")));
+                                strInformedConsent.setRecType("知情同意书");
+                                strInformedConsent.setContent(JSONObject.toJSONString(strMap));
+                                strInformedConsent.setGmtCreate(new Date());
+                                strInformedConsents.add(strInformedConsent);
+                                recIds.add(String.valueOf(obj.get("记录编号")));
+                            }
+                    );
+                    //删除手术知情同意书历史ric_id
+                    strInformedConsentServiceImpl.remove( new QueryWrapper<StrInformedConsent>()
+                            .eq("hospital_id",analyzeVO.getHospitalId())
+                            .eq("is_deleted",IsDeleteEnum.N.getKey())
+                            .eq("behospital_code",analyzeVO.getBehospitalCode())
+                            .in("rec_id",recIds));
+                    //新增
+                    strInformedConsentServiceImpl.saveBatch(strInformedConsents);
+                }
+            }
         // 手动拼接数据【知情同意书】【谈话告知书】
         List<MedicalRecord> recordList = medicalRecordFacade.list(new QueryWrapper<MedicalRecord>()
                 .eq("is_deleted", IsDeleteEnum.N.getKey())

+ 285 - 30
src/main/java/com/diagbot/facade/ConsoleFacade.java

@@ -1,5 +1,6 @@
 package com.diagbot.facade;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -420,11 +421,12 @@ public class ConsoleFacade {
         //MR
         Long mr = triggeringRulesMap.get("MR");
         //细菌培养
-        Long bacterialCulture = 0L;
+        Long bacterialCulture = triggeringRulesMap.get("bacterialCulture");
         //抗菌药物
-        Long antibiosis = 0L;
+        Long antibiosis = triggeringRulesMap.get("antibiosis");
         //恶性肿瘤化学治疗
-        Long chemotherapyMalignantTumors = 0L;
+        Long chemotherapyMalignantTumors = triggeringRulesMap.get("chemotherapyMalignantTumors");
+
         Map<String, Double> medicalRecordIndicator = medIndexResultFacade.medicalRecordIndicator(filterVO);
         Double startCount = medicalRecordIndicator.get("startCount");
         Double operationFeeNum = medicalRecordIndicator.get("operationFeeNum");
@@ -542,16 +544,23 @@ public class ConsoleFacade {
                 hashMapArrayList.add(stringStringHashMap);
             }
         }
+        //指标十四 恶性肿瘤放射治疗
+        if (indexName.equals(QualityContent.EXZL_FSZL_FHL)||indexName.equals(QualityContent.QB)) {
+            hashMapArrayList = tumorRadiationMethod(medicalRecordIndicator,hashMapArrayList,triggeringRulesMap);
+        }
 
         //指标十五 手术记录
         if (indexName.equals(QualityContent.SS_XGJL_WCL)||indexName.equals(QualityContent.QB)) {
             hashMapArrayList = operationMethod(medicalRecordIndicator,hashMapArrayList,triggeringRulesMap);
         }
 
+        //指标十六 植入物相关记录符合率
+        if (indexName.equals(QualityContent.ZRW_XGJL_WCL)||indexName.equals(QualityContent.QB)) {
+            hashMapArrayList = implantsMethod(medicalRecordIndicator,hashMapArrayList,triggeringRulesMap);
+        }
 
         //指标十七  临床用血相关记录符合率
         if (indexName.equals(QualityContent.LCYX_XGJL_WCL)||indexName.equals(QualityContent.QB)) {
-            filterVO.setFlagStr("1");
             hashMapArrayList = bloodMethod(hashMapArrayList,medicalRecordIndicator,triggeringRulesMap);
         }
 
@@ -575,8 +584,17 @@ public class ConsoleFacade {
             hashMapArrayList = fileCompleteMethod(medicalRecordIndicator,hashMapArrayList, baseIndex);
         }
 
+        //指标二十二 不合理复制病历发生率
+        if (indexName.equals(QualityContent.BHL_FZ_FSL)||indexName.equals(QualityContent.QB)) {
+            hashMapArrayList = unreasonedCopyMethod(hashMapArrayList, baseIndex, triggeringRulesMap);
+        }
+
+        //指标二十三 知情同意书规范签署率
+        if (indexName.equals(QualityContent.ZQTYS_GF_QSL)||indexName.equals(QualityContent.QB)) {
+            hashMapArrayList = contentSignMethod(hashMapArrayList, baseIndex, triggeringRulesMap);
+        }
 
-        //指标二十七 甲级率
+        //指标二十 甲级率
         if (indexName.equals(QualityContent.JJBLL)||indexName.equals(QualityContent.QB)) {
             hashMapArrayList = firMethod(hashMapArrayList,baseIndex);
         }
@@ -784,19 +802,37 @@ public class ConsoleFacade {
             Set<String> rescueCode = new CopyOnWriteArraySet<>();
             Set<String> bloodCode = new CopyOnWriteArraySet<>();
         //指标二十七
+        //指标14--恶性肿瘤放射治疗记录符合率
+        Set<String> tumorRadiationSet = tumorRadiationMethods(adviceNum, medIndexResult);
+
+        //指标15 手术记录
+        medIndexResult.setOperationCompleteResult(Double.parseDouble(operationFeeNum+""));
+
+        //指标16--植入物相关记录符合率
+        Set<String> implantsCode = implantsMethods(filterVO, medIndexResult);
+
+        //指标17  临床用血相关记录符合率
+        bloodMethods(doctorAdviceMedManageParams, filterVO,medIndexResult,bloodCode);
 
         //指标18 医师查房记录 查询直接返回 -code需要加载
 
         //指标19 抢救记录
         rescueMethods(doctorAdviceMedManageParams,medIndexResult,rescueCode);
+
         //指标20 出院患者病历2日归档
         getfileSecAmounts(filterVO,medIndexResult);
+
         //指标21 出院患者病历归档完整率
         fileCompleteMethods(filterVO,medIndexResult);
-        //指标15 手术记录
-        medIndexResult.setOperationCompleteResult(Double.parseDouble(operationFeeNum+""));
-        //指标17  临床用血相关记录符合率
-        bloodMethods(doctorAdviceMedManageParams, filterVO,medIndexResult,bloodCode);
+
+        //指标22 不合理复制病历发生率 查询直接返回
+
+        //指标23  知情同意书规范签署率 //分子通过规则
+       // contentSignMethods(contentFile,medIndexResult);
+
+        //指标24 甲级率 查询直接返回
+
+
         medIndexResult.setHospitalId(filterVO.getHospitalId());
         medIndexResult.setStartDate(filterVO.getStartDate());
         medIndexResult.setEndDate(filterVO.getEndDate());
@@ -875,34 +911,62 @@ public class ConsoleFacade {
                     medIndexRelevanceFacade.save(medIndexRelevance);
                 }
             }
-            if(operationCode.size()>0&&operationCode!=null) {
+        if(tumorRadiationSet.size()>0 && tumorRadiationSet != null) {
+            medIndexRelevance.setRelevanceType(14);
+            for (String Code : tumorRadiationSet) {
+                medIndexRelevance.setBehospitalCode(Code);
+                medIndexRelevanceFacade.save(medIndexRelevance);
+            }
+        }
+            if(operationCode.size() > 0 && operationCode != null) {
                 medIndexRelevance.setRelevanceType(15);
                 for (String Code : operationCode) {
                     medIndexRelevance.setBehospitalCode(Code);
                     medIndexRelevanceFacade.save(medIndexRelevance);
                 }
             }
-            if(bloodCode.size()>0&&bloodCode!=null) {
+        if(implantsCode.size() > 0 && implantsCode != null) {
+            medIndexRelevance.setRelevanceType(16);
+            for (String Code : implantsCode) {
+                medIndexRelevance.setBehospitalCode(Code);
+                medIndexRelevanceFacade.save(medIndexRelevance);
+            }
+        }
+            if(bloodCode.size() > 0 && bloodCode != null) {
                 medIndexRelevance.setRelevanceType(17);
                 for (String Code : bloodCode) {
                     medIndexRelevance.setBehospitalCode(Code);
                     medIndexRelevanceFacade.save(medIndexRelevance);
                 }
             }
-            if(outHospitalCode.size()>0&&outHospitalCode!=null) {
+            if(outHospitalCode.size() > 0 && outHospitalCode != null) {
                 medIndexRelevance.setRelevanceType(18);
                 for (String Code : outHospitalCode) {
                     medIndexRelevance.setBehospitalCode(Code);
                     medIndexRelevanceFacade.save(medIndexRelevance);
                 }
             }
-            if(rescueCode.size()>0&&rescueCode!=null) {
+            if(rescueCode.size() > 0 && rescueCode != null) {
                 medIndexRelevance.setRelevanceType(19);
                 for (String Code : rescueCode) {
                     medIndexRelevance.setBehospitalCode(Code);
                     medIndexRelevanceFacade.save(medIndexRelevance);
                 }
             }
+        if(outHospitalCode.size() > 0 && outHospitalCode != null) {
+            medIndexRelevance.setRelevanceType(22);
+            for (String Code : outHospitalCode) {
+                medIndexRelevance.setBehospitalCode(Code);
+                medIndexRelevanceFacade.save(medIndexRelevance);
+            }
+        }
+        if(outHospitalCode.size() > 0 && outHospitalCode != null) {
+            medIndexRelevance.setRelevanceType(23);
+            for (String Code : outHospitalCode) {
+                medIndexRelevance.setBehospitalCode(Code);
+                medIndexRelevanceFacade.save(medIndexRelevance);
+            }
+        }
         }
     /**
      * 两数据相除得到百分比
@@ -995,6 +1059,7 @@ public class ConsoleFacade {
         Set<String> bacterialCultureCode = new CopyOnWriteArraySet<>();
         Set<String> antibiosisBehospitalCode = new CopyOnWriteArraySet<>();
         Set<String> chemotherapyMalignantTumorsBehospitalCode = new CopyOnWriteArraySet<>();
+        Set<String> tumorRadiationBehospitalCode = new CopyOnWriteArraySet<>();
         //无首页code
         List<String> behospitalCodeList = adviceVerify(filterVO);
         //首页为肿瘤code
@@ -1115,6 +1180,24 @@ public class ConsoleFacade {
                                     }
                                 }
                             }
+
+                            if (indexName.equals(QualityContent.EXZL_FSZL_FHL) || indexName.equals(QualityContent.QB)) {
+                                if (ListUtil.isNotEmpty(malignancyCodeList)) {
+                                    if (malignancyCodeList.contains(behospitalCode)) {
+                                        if (!tumorRadiationBehospitalCode.contains(behospitalCode)) {
+                                            if (doctorAdviceType.equals(QualityContent.STAT_ORDER) || doctorAdviceType.equals(QualityContent.STANDING_ORDER)) {
+                                                List<String> tumorRadiationDrugList = QualityContent.radiotherapyDrugList;
+                                                for (String tumorRadiationDrug : tumorRadiationDrugList) {
+                                                    if (daItemName.contains(tumorRadiationDrug)) {
+                                                        //医嘱含有放射治疗药物
+                                                        tumorRadiationBehospitalCode.add(behospitalCode);
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
                         }
                     }
                 }
@@ -1167,6 +1250,11 @@ public class ConsoleFacade {
             }else {
                 mapCode.put("chemotherapyMalignantTumors",null);
             }
+            if(tumorRadiationBehospitalCode!=null && tumorRadiationBehospitalCode.size()>0){
+                mapCode.put("tumorRadiationSecNum",tumorRadiationBehospitalCode);
+            }else {
+                mapCode.put("tumorRadiationSecNum",null);
+            }
             return mapCode;
         }
     }
@@ -3010,11 +3098,63 @@ public class ConsoleFacade {
         return behospitalInfoFacade.hmImproveMRPage(qcResultShortPageVO);
     }
 
+
+    //指标十四 恶性肿瘤放射治疗
+    private List<Map<String, String>> tumorRadiationMethod(Map<String, Double> medManageParams,List<Map<String, String>> retList, Map<String, Long> triggeringRulesMap){
+        LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
+        //接受肿瘤放射治疗的质控病历总数
+        Double count = medManageParams.get("tumorRadiationResult");
+        String num = null;
+        if( null == count){
+            count = 0d;
+        }
+        if(StringUtils.isNotEmpty(String.valueOf(count)) &&  count != 0d){
+            double tumorRadiationDo = currencyCal(count, triggeringRulesMap.get("tumorRadiationNum"));//triggeringRules(filterVO)
+            num = String.valueOf(tumorRadiationDo);
+            if(tumorRadiationDo<0d){
+                num = null;
+            }
+        };
+
+        firMap.put("name","恶性肿瘤放射治疗记录符合率");
+        firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        firMap.put("num",String.valueOf(count));
+        retList.add(firMap);
+        return retList;
+    }
+
+    //指标十六 植入物相关记录符合率
+    private List<Map<String, String>> implantsMethod(Map<String, Double> medManageParams,List<Map<String, String>> retList, Map<String, Long> triggeringRulesMap){
+        LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
+        //使用植入物的质控病历总数
+        Double count = medManageParams.get("implantsResult");
+        if( null == count){
+            count = 0d;
+        }
+        String num = null;
+        if(StringUtils.isNotEmpty(String.valueOf(count)) &&  count != 0d){
+            double implantsDo = currencyCal(count, triggeringRulesMap.get("implantsNum"));//triggeringRules(filterVO)
+            num = String.valueOf(implantsDo);
+            if(implantsDo<0d){
+                num = null;
+            }
+        };
+
+        firMap.put("name","植入物相关记录符合率");
+        firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        firMap.put("num",String.valueOf(count));
+        retList.add(firMap);
+        return retList;
+    }
+
     //指标十八 抢救记录
     private  List<Map<String, String>> rescueMethod( Map<String, Double> medManageParams, List<Map<String, String>> retList,Map<String, Long> triggeringRulesMap){
         LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
         //接受抢救的质控病历总数
-        double count = medManageParams.get("rescue_result");
+        Double count = medManageParams.get("rescueResult");
+        if( null == count){
+            count = 0d;
+        }
         String num = null;
         if(StringUtils.isNotEmpty(String.valueOf(count)) &&  count != 0d){
             double rescueDo = currencyCal(count, triggeringRulesMap.get("rescueNum"));
@@ -3022,11 +3162,11 @@ public class ConsoleFacade {
             if(rescueDo<0d){
                 num = null;
             }
-            firMap.put("num",String.valueOf(count));
         };
 
         firMap.put("name","患者抢救记录及时完成率");
         firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        firMap.put("num",String.valueOf(count));
         retList.add(firMap);
         return retList;
     };
@@ -3035,16 +3175,70 @@ public class ConsoleFacade {
     private List<Map<String, String>> WardRoundMethod( List<Map<String, String>> retList, Map<String, Object> baseIndex, Map<String, Long> triggeringRulesMap){
         LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
         String num = null;
+        Object forWorkNum = baseIndex.get("forWorkNum");
         if( triggeringRulesMap.containsKey("WardRoundNum") && baseIndex.containsKey("forWorkNum") && !baseIndex.get("forWorkNum").toString().equals("0")){
             double wardRoundDo = currencyCal(baseIndex.get("forWorkNum"), triggeringRulesMap.get("WardRoundNum"));
             num = String.valueOf(wardRoundDo);
             if(wardRoundDo<0d){
                 num = null;
             }
-            firMap.put("num",baseIndex.get("forWorkNum").toString());
         };
         firMap.put("name","医师查房记录完成率");
         firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        if(null == forWorkNum){
+            firMap.put("num","0");
+        }else{
+            firMap.put("num",baseIndex.get("forWorkNum").toString());
+        }
+        retList.add(firMap);
+        return retList;
+    }
+
+
+    //指标二十二 不合理复制病历发生率
+    private List<Map<String, String>> unreasonedCopyMethod( List<Map<String, String>> retList, Map<String, Object> baseIndex, Map<String, Long> triggeringRulesMap){
+       LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
+       String num = null;
+        Object forWorkNum = baseIndex.get("forWorkNum");
+        if( triggeringRulesMap.containsKey("unreasonedCopyNum") && baseIndex.containsKey("forWorkNum") && !baseIndex.get("forWorkNum").toString().equals("0")){
+           double wardRoundDo = currencyCal(baseIndex.get("forWorkNum"), triggeringRulesMap.get("unreasonedCopyNum"));
+           num = String.valueOf(wardRoundDo);
+           if(wardRoundDo<0d){
+               num = null;
+           }
+       };
+       firMap.put("name","不合理复制病历发生率");
+       firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        if(null == forWorkNum){
+            firMap.put("num","0");
+        }else{
+            firMap.put("num",baseIndex.get("forWorkNum").toString());
+        }
+       retList.add(firMap);
+        return retList;
+        };
+
+
+    //指标二十三 知情同意书规范签署率
+    private List<Map<String, String>> contentSignMethod(List<Map<String, String>> retList, Map<String, Object> baseIndex, Map<String, Long> triggeringRulesMap){
+        LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
+        Object forWorkNum = baseIndex.get("forWorkNum");
+        String num = null;
+        if( triggeringRulesMap.containsKey("InformedNum") && baseIndex.containsKey("forWorkNum") && !baseIndex.get("forWorkNum").toString().equals("0")){
+            double InformedDo = currencyCal(baseIndex.get("forWorkNum"), triggeringRulesMap.get("InformedNum"));
+            num = String.valueOf(InformedDo);
+            if(InformedDo<0d){
+                num = null;
+            }
+        }
+        firMap.put("name","知情同意书规范签署率");
+        firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        if(null == forWorkNum){
+            firMap.put("num","0");
+        }else{
+            firMap.put("num",baseIndex.get("forWorkNum").toString());
+        }
+
         retList.add(firMap);
         return retList;
     }
@@ -3053,6 +3247,9 @@ public class ConsoleFacade {
     private  List<Map<String, String>> operationMethod(Map<String, Double> medManageParams, List<Map<String, String>>retList, Map<String, Long> triggeringRulesMap){
         LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
         String operationFeeNum = medManageParams.get("operationFeeNum")+"";
+        if(StringUtils.isEmpty(operationFeeNum)){
+            operationFeeNum = "0";
+        }
         String num = null;
         if( triggeringRulesMap.containsKey("operationRecordNum") && StringUtils.isNotEmpty(operationFeeNum) && ! operationFeeNum.equals("0")){
             double operationRecordDo = currencyCal(operationFeeNum, triggeringRulesMap.get("operationRecordNum"));
@@ -3060,13 +3257,13 @@ public class ConsoleFacade {
             if(operationRecordDo<0d){
                 num = null;
             }
-            firMap.put("num",operationFeeNum);
         };
         firMap.put("name","手术相关记录完成率");
         if("0.0".equals(num)){
             num = "0.00";
         }
         firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        firMap.put("num",operationFeeNum);
 
         retList.add(firMap);
         return retList;
@@ -3075,7 +3272,10 @@ public class ConsoleFacade {
     //指标十六  临床用血相关记录符合率
     private  List<Map<String, String>> bloodMethod( List<Map<String, String>>retList,Map<String, Double> bloodRes,Map<String, Long> triggeringRulesMap){
         LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
-        double count = bloodRes.get("blood_result");
+        Double count = bloodRes.get("bloodResult");
+        if( null == count){
+            count = 0d;
+        }
         String num = null;
         if(StringUtils.isNotEmpty(String.valueOf(count)) &&  count != 0d){
             //指标十七
@@ -3084,11 +3284,11 @@ public class ConsoleFacade {
             if(bloodDo<0d){
                 num = null;
             }
-            firMap.put("num",String.valueOf(count));
         }
 
         firMap.put("name","临床用血相关记录符合率");
         firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        firMap.put("num",String.valueOf(count));
         retList.add(firMap);
         return retList;
     }
@@ -3108,36 +3308,51 @@ public class ConsoleFacade {
     private List<Map<String, String>> getfileSecAmount(Map<String, Double> medManageParams, List<Map<String, String>>retList, Map<String, Object> baseIndex){
         LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
         DecimalFormat df = new DecimalFormat("#0.00");
-        double count = medManageParams.get("sec_file_result");
+        Double count = medManageParams.get("secFileResult");
+        Object forWorkNum = baseIndex.get("forWorkNum");
+        if( null == count){
+            count = 0d;
+        }
         String num = null;
-        if(StringUtils.isNotEmpty( baseIndex.get("sevenWorkNum").toString()) && ! baseIndex.get("sevenWorkNum").toString().equals("0") ){
-            double retNum =count* 100/Double.parseDouble(baseIndex.get("sevenWorkNum").toString());
+        if(StringUtils.isNotEmpty( baseIndex.get("forWorkNum").toString()) && ! baseIndex.get("forWorkNum").toString().equals("0") ){
+            double retNum =count* 100/Double.parseDouble(baseIndex.get("forWorkNum").toString());
             double firGradeStr = Double.parseDouble(df.format(retNum));
             num = String.valueOf(firGradeStr);
-            firMap.put("num",baseIndex.get("sevenWorkNum").toString());
+
         }
 
         firMap.put("name","出院患者病历2日归档率");
         firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        if(null == forWorkNum){
+            firMap.put("num","0");
+        }else{
+            firMap.put("num",baseIndex.get("forWorkNum").toString());
+        }
         retList.add(firMap);
         return retList;
     };
 
     //指标21 --出院患者病历归档完整率
     private  List<Map<String, String>> fileCompleteMethod(Map<String, Double> medManageParams, List<Map<String, String>>retList, Map<String, Object> baseIndex){
-        DecimalFormat df = new DecimalFormat("#0.00");
         LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
-        double count = medManageParams.get("fileCompleteResult");
+        Double count = medManageParams.get("fileCompleteResult");
+        Object forWorkNum = baseIndex.get("forWorkNum");
+        if( null == count){
+            count = 0d;
+        }
         String num = null;
         if(StringUtils.isNotEmpty( baseIndex.get("forWorkNum").toString()) && ! baseIndex.get("forWorkNum").toString().equals("0") ){
-            double retNum =count* 100/Double.parseDouble(baseIndex.get("forWorkNum").toString());
-            double firGradeStr = Double.parseDouble(df.format(retNum));
-            num = String.valueOf(firGradeStr);
-            firMap.put("num",baseIndex.get("forWorkNum").toString());
+            double retNum = currencyCal( baseIndex.get("forWorkNum").toString(),count);
+            num = String.valueOf(retNum);
         }
 
         firMap.put("name","出院患者病历归档完整率");
         firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        if(null == forWorkNum){
+            firMap.put("num","0");
+        }else{
+            firMap.put("num",baseIndex.get("forWorkNum").toString());
+        }
         retList.add(firMap);
         return retList;
     }
@@ -3235,10 +3450,10 @@ public class ConsoleFacade {
                 double retNum = Double.parseDouble(baseIndex.get("sixWorkNum").toString()) * 100 / firRecord;
                 double firGradeStr = Double.parseDouble(df.format(retNum));
                 num4 = String.valueOf(firGradeStr);
-                fouMap.put("num",String.valueOf(firRecord));
             }
             fouMap.put("name","甲级病历率");
             fouMap.put("notCopiedStr",StringUtils.isEmpty(num4) ? "0.00%":(num4+"%"));
+        fouMap.put("num",String.valueOf(firRecord));
             retList.add(fouMap);
         return retList;
     };
@@ -3247,6 +3462,17 @@ public class ConsoleFacade {
     /**
      * ==============================后台维护===============================
      */
+    private  Set<String> tumorRadiationMethods( Map<String, Set<String>> adviceNum,MedIndexResult medIndexResult){
+        Set<String> tumorRadiationSecNum = new CopyOnWriteArraySet<>();
+        if(adviceNum.containsKey("tumorRadiationSecNum")&& adviceNum.get("tumorRadiationSecNum") != null && adviceNum.get("tumorRadiationSecNum").size()>0){
+            tumorRadiationSecNum = adviceNum.get("tumorRadiationSecNum");
+            double count = tumorRadiationSecNum.size();
+            if(StringUtils.isNotEmpty(String.valueOf(count)) &&  count != 0d){
+                medIndexResult.setTumorRadiationResult(count);
+            }
+        }
+        return tumorRadiationSecNum;
+    }
     //指标19 抢救记录
     private  void rescueMethods(List<MedManageParamsDTO> medManageParams,MedIndexResult medIndexResult, Set<String> rescueCode){
         List<MedManageParamsDTO> manageList= new ArrayList<>();
@@ -3393,6 +3619,23 @@ public class ConsoleFacade {
         filterVO.setLastEndDate(endTime);
     };
 
+    //指标 16--植入物相关记录符合率
+    private Set<String> implantsMethods(FilterVO filterVO,MedIndexResult medIndexResult){
+        filterVO.setFlagStr("4");
+        List<MedManageParamsDTO> fileLists = behospitalInfoFacade.getMedManageParams(filterVO);
+        Set<String> collect = fileLists.parallelStream().filter(obj -> {
+            String content = obj.getContent();
+            Map contenMap = JSON.parseObject(content, Map.class);
+            return contenMap.containsKey("使用植入性材料") && StringUtils.isNotEmpty(contenMap.get("使用植入性材料").toString())
+                    && "true".equals(contenMap.get("使用植入性材料").toString());
+        }).map(MedManageParamsDTO::getBehospitalCode).collect(Collectors.toSet());
+        double count = collect.size();
+        if(StringUtils.isNotEmpty(String.valueOf(count)) &&  count != 0d){
+            medIndexResult.setImplantsResult(count);
+        }
+        return collect;
+    }
+
     //指标21 出院患者病历归档完整率
     private void fileCompleteMethods(FilterVO filterVO,MedIndexResult medIndexResult){
         filterVO.setFlagStr("3");
@@ -3403,6 +3646,18 @@ public class ConsoleFacade {
         }
     }
 
+    //指标23  知情同意书规范签署率
+//    private void contentSignMethods(List<MedManageParamsDTO>fileLists,MedIndexResult medIndexResult){
+//        Set<String> collect = fileLists.parallelStream().filter(obj -> {
+//            String content = obj.getContent();
+//            Map contenMap = JSON.parseObject(content, Map.class);
+//            return contenMap.containsKey("签署") && StringUtils.isNotEmpty(contenMap.get("签署").toString());
+//        }).map(MedManageParamsDTO::getBehospitalCode).collect(Collectors.toSet());
+//        double count = collect.size();
+//        if(StringUtils.isNotEmpty(String.valueOf(count)) &&  count != 0d){
+//            medIndexResult.setRecordSignResult(count);
+//        }
+//    }
 
 
     /**

+ 92 - 31
src/main/resources/mapper/BehospitalInfoMapper.xml

@@ -728,8 +728,7 @@
         f2.secWorkNum,
         f3.thrWorkNum,
         f3.forWorkNum,
-        f3.sixWorkNum,
-        f4.sevenWorkNum
+        f3.sixWorkNum
         from (
         SELECT count(DISTINCT a.behospital_code)  as firWorkNum
         FROM
@@ -780,23 +779,7 @@
         <if test="hospitalId != null and hospitalId != ''">
             AND a.hospital_id = #{hospitalId}
         </if>)m
-            )f3,(
-        SELECT count(DISTINCT a.behospital_code)  as sevenWorkNum
-        FROM
-        med_behospital_info a
-        WHERE
-        a.is_deleted = 'N'
-        AND a.is_placefile = 1
-        <if test="hospitalId != null and hospitalId != ''">
-            AND a.hospital_id = #{hospitalId}
-        </if>
-        <![CDATA[AND a.qc_type_id <>0 ]]>
-        <if test="startDate != null and startDate != ''">
-            <![CDATA[ AND a.leave_hospital_date >= #{startDate}]]>
-        </if>
-        <if test="endDate != null and endDate != ''">
-            <![CDATA[ AND a.leave_hospital_date <= #{endDate}]]>
-        </if>)f4
+            )f3
     </select>
 
     <!-- 病案管理规则质控缺陷病历总数查询-->
@@ -811,6 +794,10 @@
         f3.da_status AS daStatus,
         f3.doctor_advice_type as doctorAdviceType,
         </if>
+        <if test="flagStr != null and flagStr == 4 ">
+            f5.content as content,
+            f5.rec_title as recTitle,
+        </if>
         f1.hospitalId
         from(
         SELECT DISTINCT
@@ -850,6 +837,12 @@
             AND f1.behospitalCode = f4.behospital_code
             AND f4.is_reject = 1
         </if>
+        <if test="flagStr != null and flagStr == 4">
+            join  str_informed_consent f5
+            on  f5.is_deleted = 'N'
+            AND f1.hospitalId = f5.hospital_id
+            AND f1.behospitalCode = f5.behospital_code
+        </if>
     </select>
 
 
@@ -17715,6 +17708,33 @@
         count(
         DISTINCT
         CASE
+        WHEN a.type = 11 THEN
+        a.behospital_code
+        ELSE
+        NULL
+        END
+        ) AS 'bacterialCulture',
+        count(
+        DISTINCT
+        CASE
+        WHEN a.type = 12 THEN
+        a.behospital_code
+        ELSE
+        NULL
+        END
+        ) AS 'antibiosis',
+        count(
+        DISTINCT
+        CASE
+        WHEN a.type = 13 THEN
+        a.behospital_code
+        ELSE
+        NULL
+        END
+        ) AS 'chemotherapyMalignantTumors',
+        count(
+        DISTINCT
+        CASE
         WHEN a.type = 15 THEN
         a.behospital_code
         ELSE
@@ -17747,7 +17767,43 @@
         ELSE
         NULL
         END
-        ) AS 'rescueNum'
+        ) AS 'rescueNum',
+        count(
+        DISTINCT
+        CASE
+        WHEN a.type = 22 THEN
+        a.behospital_code
+        ELSE
+        NULL
+        END
+        ) AS 'unreasonedCopyNum',
+        count(
+        DISTINCT
+        CASE
+        WHEN a.type = 14 THEN
+        a.behospital_code
+        ELSE
+        NULL
+        END
+        ) AS 'tumorRadiationNum',
+        count(
+        DISTINCT
+        CASE
+        WHEN a.type = 16 THEN
+        a.behospital_code
+        ELSE
+        NULL
+        END
+        ) AS 'implantsNum',
+        count(
+        DISTINCT
+        CASE
+        WHEN a.type = 23 THEN
+        a.behospital_code
+        ELSE
+        NULL
+        END
+        ) AS 'InformedNum'
         FROM
         (
         SELECT
@@ -17843,8 +17899,17 @@
 
 <!--    首页恶性肿瘤-->
     <select id="malignancy" parameterType="com.diagbot.vo.FilterVO" resultType="java.util.Map">
+        select
+        a.behospital_code,
+        a.hospital_id,
+        d.diagnose_name,
+        d.diagnose_type,
+        d.icd_code
+        from(
         SELECT
-        d.behospital_code
+        d.behospital_code,
+        d.hospital_id,
+        b.home_page_id
         FROM
         (
         SELECT
@@ -17871,16 +17936,12 @@
         JOIN med_home_page b ON b.behospital_code = d.behospital_code
         AND d.hospital_id = b.hospital_id
         AND b.is_deleted = 'N'
-        AND (
-        (
-        b.outpatient_emr_diagnose LIKE '%恶性肿瘤%'
-        AND b.outpatient_emr_diagnose_code LIKE 'C%'
-        )
-        OR (
-        b.outpatient_emr_diagnose LIKE 'C%'
-        AND b.outpatient_emr_diagnose_code LIKE '%恶性肿瘤%'
-        )
-        )
+        )a join
+        med_home_diagnose_info d on a.hospital_id=d.hospital_id
+        where a.home_page_id =d.home_page_id
+        and d.is_deleted ='N'
+        and d.diagnose_name like '%恶性肿瘤%'
+        and d.icd_code like 'C%'
     </select>
 
     <!-- 获取患者年龄信息(通过出生日期和入院日期重新计算) -->

+ 7 - 5
src/main/resources/mapper/MedIndexResultMapper.xml

@@ -48,11 +48,13 @@
             COALESCE (sum(a.antibiosis_result), 0) AS 'antibiosisFeeNum',
             COALESCE (sum(a.tumor_chemistry_result),0) AS 'chemotherapyMalignantTumorsNum',
             COALESCE (sum(a.tumor_radiation_result),0) AS 'tumor_radiation_result',
-            COALESCE (sum(a.implants_result), 0) AS 'implants_result',
-            COALESCE (sum(a.blood_result), 0) AS 'blood_result',
-            COALESCE (sum(a.rescue_result), 0) AS 'rescue_result',
-            COALESCE (sum(a.sec_file_result), 0) AS 'sec_file_result',
-            COALESCE (sum(a.file_complete_result), 0) AS 'fileCompleteResult'
+            COALESCE (sum(a.implants_result), 0) AS 'implantsResult',
+            COALESCE (sum(a.blood_result), 0) AS 'bloodResult',
+            COALESCE (sum(a.rescue_result), 0) AS 'rescueResult',
+            COALESCE (sum(a.sec_file_result), 0) AS 'secFileResult',
+            COALESCE (sum(a.file_complete_result), 0) AS 'fileCompleteResult',
+            COALESCE (sum(a.tumor_radiation_result), 0) AS 'tumorRadiationResult'
+
         FROM
             med_index_result a
         WHERE