Bladeren bron

1、诊断编码模糊匹配规则改造
2、违规描述优先获取规则数据中的违规描述字段

0027005599 2 jaren geleden
bovenliggende
commit
a17f6ef976

+ 7 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/Constant.java

@@ -122,7 +122,7 @@ public class Constant {
     public static final String MEDICAL_INS_KEY = "medical_ins_";
 
     /**
-     * 1:药品、2:耗材、3:诊疗、4:手术
+     * 1:药品、2:耗材、3:诊疗、4:手术 、5:诊断编码
      * project_type
      */
 
@@ -134,6 +134,8 @@ public class Constant {
 
     public static final String PROJECT_TYPE_OPERATIVE = "4";
 
+    public static final String PROJECT_TYPE_DIAG_CODE = "5";
+
     /**
      * 费用类别对应项目类型
      */
@@ -157,6 +159,10 @@ public class Constant {
      */
     public static final String RESTORATIVES_X_START_KEY ="X";
 
+    /**
+     * 项目编码,医保规则对应的违规描述
+      */
+    public static final String PROJECT_VOLIDATION_DESC_KEY = "PROJECT_VOLIDATION_DESC_MAP_";
 
 
 }

+ 5 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/AdviceDetailsVO.java

@@ -78,6 +78,11 @@ public class AdviceDetailsVO {
     private String take_frequence;//		char	服用频次
     @NotBlank(message = "医保标志不能为空 0:不是医保 1:是医保")
     private String medical_insurance_mark; //医保标志
+    /**
+     * 项目使用日期
+     * yyyy-MM-dd HH:mm:ss
+     */
+    private String projectUseTime;
     private String inspection_site;//检查部位
     private String order_catalog;//医嘱大类
     private String order_type;//医嘱类别

+ 19 - 6
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/FactorEnchangeFactory.java

@@ -33,6 +33,7 @@ import org.jeecg.modules.medical.service.IFactorCondRelaService;
 import org.jeecg.modules.medical.service.IMidIncidentAuditDetailService;
 import org.jeecg.modules.medical.service.IMidIncidentAuditService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
@@ -75,6 +76,8 @@ public class FactorEnchangeFactory {
     IAdvanceWarningAuditDetailService advanceWarningAuditDetailService;
     @Autowired
     SqlUtil sqlUtil;
+    @Autowired
+    RedisTemplate redisTemplate;
 
     public static Map<Integer, EventAttr> enchanceAttrMap = new HashMap<>();
 
@@ -297,19 +300,29 @@ public class FactorEnchangeFactory {
                 midIncidentAuditDetail.setMedicalInsRuleInfoCode(medicalInsRuleInfo.getRuleCode());
                 midIncidentAuditDetail.setMedicalInsRuleInfoId(medicalInsRuleInfo.getId());
                 midIncidentAuditDetail.setMedicalInsRuleInfoName(medicalInsRuleInfo.getRuleName());
-                midIncidentAuditDetail.setDescription(medicalInsRuleInfo.getViolationDesc());
+                String desc = medicalInsRuleInfo.getViolationDesc();
+                if(otherItemMap.containsKey(Constant.PROJECT_CODE_KEY)){
+                    midIncidentAuditDetail.setProejctCode(otherItemMap.get(Constant.PROJECT_CODE_KEY).toString());
+                    midIncidentAuditDetail.setProejctName(otherItemMap.get(Constant.PROJECT_NAME_KEY).toString());
+                    midIncidentAuditDetail.setMedicalProjectCode(otherItemMap.get(Constant.MEDICAL_PROJECT_CODE_KEY).toString());
+                    midIncidentAuditDetail.setMedicalProjectName(otherItemMap.get(Constant.MEDICAL_PROJECT_NAME_KEY).toString());
+                    midIncidentAuditDetail.setProjectType(otherItemMap.getOrDefault(Constant.PROJECT_TYPE_KEY, "default").toString());
+                    Object descObject = redisTemplate.opsForHash().get(Constant.PROJECT_VOLIDATION_DESC_KEY+medicalInsRuleInfo.getId(), otherItemMap.get(Constant.MEDICAL_PROJECT_NAME_KEY).toString());
+                    if(null != descObject){
+                        desc = descObject.toString();
+                    }
+                }
+
+                midIncidentAuditDetail.setDescription(desc);
                 midIncidentAuditDetail.setOutpatientNumber(midIncidentAudit.getOutpatientNumber());
                 midIncidentAuditDetail.setPrescriptionNumber(midIncidentAudit.getPrescriptionNumber());
                 midIncidentAuditDetail.setViolationLevel(medicalInsRuleInfo.getViolationLevel());
                 midIncidentAuditDetail.setTreatmentType(medicalInsRuleInfo.getTreatmentType());
                 midIncidentAuditDetail.setMidIncidentAuditId(midIncidentAudit.getId());
-                midIncidentAuditDetail.setProejctCode(otherItemMap.get(Constant.PROJECT_CODE_KEY).toString());
-                midIncidentAuditDetail.setProejctName(otherItemMap.get(Constant.PROJECT_NAME_KEY).toString());
-                midIncidentAuditDetail.setMedicalProjectCode(otherItemMap.get(Constant.MEDICAL_PROJECT_CODE_KEY).toString());
-                midIncidentAuditDetail.setMedicalProjectName(otherItemMap.get(Constant.MEDICAL_PROJECT_NAME_KEY).toString());
+
                 BigDecimal otherAmount = (BigDecimal) otherItemMap.getOrDefault(Constant.AMOUNT_KEY, 0);
                 midIncidentAuditDetail.setAmount(otherAmount.doubleValue());
-                midIncidentAuditDetail.setProjectType(otherItemMap.getOrDefault(Constant.PROJECT_TYPE_KEY, "default").toString());
+
 
                 midIncidentAuditDetail.setDoseDay((Integer) otherItemMap.getOrDefault(SystemEventAttrConstant.DOSE_DAY, 0));
                 midIncidentAuditDetail.setPrice((BigDecimal) otherItemMap.getOrDefault(SystemEventAttrConstant.PRICE, 0));

+ 54 - 12
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/RuleEngine.java

@@ -18,6 +18,7 @@ import org.jeecg.modules.medical.entity.AfterIncidentDetailLog;
 import org.jeecg.modules.medical.entity.AfterIncidentLog;
 import org.jeecg.modules.medical.entity.AfterwardsAudit;
 import org.jeecg.modules.medical.entity.AfterwardsIncidentAuditDiagnose;
+import org.jeecg.modules.medical.entity.DiagnoseItems;
 import org.jeecg.modules.medical.entity.DiagnosesVO;
 import org.jeecg.modules.medical.entity.FactorEnchance;
 import org.jeecg.modules.medical.entity.MaterialItems;
@@ -40,6 +41,7 @@ import org.jeecg.modules.medical.service.IAdvanceWarningAuditService;
 import org.jeecg.modules.medical.service.IAfterwardsAuditDetailService;
 import org.jeecg.modules.medical.service.IAfterwardsAuditService;
 import org.jeecg.modules.medical.service.IAfterwardsIncidentAuditDiagnoseService;
+import org.jeecg.modules.medical.service.IDiagnoseItemsService;
 import org.jeecg.modules.medical.service.IFactorEnchanceService;
 import org.jeecg.modules.medical.service.IMaterialItemsService;
 import org.jeecg.modules.medical.service.IMedicalInsRuleInfoService;
@@ -129,6 +131,8 @@ public class RuleEngine {
     ITreatmentItemsService treatmentItemsService;
     @Autowired
     IMedicalInsuranceDrugsService medicalInsuranceDrugsService;
+    @Autowired
+    IDiagnoseItemsService diagnoseItemsService;
 
     public static ThreadLocal<MidIncidentWarningVO> midIncidentWarningVOThreadLocal = new ThreadLocal<>();
 
@@ -153,8 +157,10 @@ public class RuleEngine {
             medicalMap.put(medicalInsRuleInfo.getId(), medicalInsRuleInfo);
             if (Constant.TREATMEN_TYPE_ADVANCE_WARNING.equals(medicalInsRuleInfo.getCallScenario())) {
                 advanceWaringRuleIdList.add(medicalInsRuleInfo.getId());
-            } else if (Constant.TREATMEN_TYPE_MID_INCIDENT_WARNING.equals(medicalInsRuleInfo.getCallScenario())
-                    || Constant.TREATMEN_TYPE_MID_EX_POST_SUPERVISION.equals(medicalInsRuleInfo.getCallScenario())) {
+            } else
+//                if (Constant.TREATMEN_TYPE_MID_INCIDENT_WARNING.equals(medicalInsRuleInfo.getCallScenario())
+//                    || Constant.TREATMEN_TYPE_MID_EX_POST_SUPERVISION.equals(medicalInsRuleInfo.getCallScenario()))
+            {
                 midMedicalInsRuleInfoList.add(medicalInsRuleInfo);
             }
         }
@@ -177,11 +183,15 @@ public class RuleEngine {
                     Set<String> consumableProjectCodeList = new HashSet<>();
                     Set<String> restorativesProjectCodeList = new HashSet<>();
                     Set<String> treatmentProjectCodeList = new HashSet<>();
+                    Map<String, String> ruleIdAndCodeMap = new HashMap<>();
                     for (int index = 0; index < medicalInsRuleProjectList.size(); index++) {
                         medicalInsRuleProject = medicalInsRuleProjectList.get(index);
                         String projectCode = medicalInsRuleProject.getProjectCode();
                         String correlationProjectCode = medicalInsRuleProject.getCorrelationProjectCode();
                         if (StringUtils.isNotBlank(projectCode)) {
+                            if(StringUtils.isNotBlank(medicalInsRuleProject.getViolationDesc())) {
+                                ruleIdAndCodeMap.put(medicalInsInfoId + "_" + projectCode, medicalInsRuleProject.getViolationDesc());
+                            }
                             if (projectCode.startsWith(Constant.CONSUMABLE_START_KEY)) {
                                 consumableProjectCodeList.add(projectCode);
                             } else if (projectCode.startsWith(Constant.RESTORATIVES_T_START_KEY) ||
@@ -222,9 +232,9 @@ public class RuleEngine {
 
 
                     }
-                    setCache(consumableProjectCodeList, ruleItemCodeAndRuleIdMap, Constant.PROJECT_TYPE_CONSUMABLE_METERIAL);
-                    setCache(restorativesProjectCodeList, ruleItemCodeAndRuleIdMap, Constant.PROJECT_TYPE_MEDICINE);
-                    setCache(treatmentProjectCodeList, ruleItemCodeAndRuleIdMap, Constant.PROJECT_TYPE_DIAGNOSIS_TREATMENT);
+                    setCache(consumableProjectCodeList, ruleItemCodeAndRuleIdMap, ruleIdAndCodeMap, Constant.PROJECT_TYPE_CONSUMABLE_METERIAL);
+                    setCache(restorativesProjectCodeList, ruleItemCodeAndRuleIdMap, ruleIdAndCodeMap, Constant.PROJECT_TYPE_MEDICINE);
+                    setCache(treatmentProjectCodeList, ruleItemCodeAndRuleIdMap, ruleIdAndCodeMap, Constant.PROJECT_TYPE_DIAGNOSIS_TREATMENT);
 
                 }
             }
@@ -238,15 +248,18 @@ public class RuleEngine {
                     if (medicalDiagnoseCodeFlag || cMedicalDiagnoseCodeFlag) {
                         List<MedicalInsRuleProjectDiagnose> medicalInsRuleProjectDiagnoseList = medicalInsRuleProjectDiagnoseService.lambdaQuery().eq(MedicalInsRuleProjectDiagnose::getMedicalInsRuleInfoId, medicalInsRuleInfo.getId()).list();
                         if (CollectionUtil.isNotEmpty(medicalInsRuleProjectDiagnoseList)) {
+                            Set<String> treatmentProjectCodeList = new HashSet<>();
                             for (MedicalInsRuleProjectDiagnose medicalInsRuleProjectDiagnose : medicalInsRuleProjectDiagnoseList) {
-                                if (itemCodeAndRuleIdMap.containsKey(medicalInsRuleProjectDiagnose.getMedicalDiagnoseCode())) {
-                                    itemCodeAndRuleIdMap.get(medicalInsRuleProjectDiagnose.getMedicalDiagnoseCode()).add(medicalInsRuleInfo.getId());
+                                if (ruleItemCodeAndRuleIdMap.containsKey(medicalInsRuleProjectDiagnose.getMedicalDiagnoseCode())) {
+                                    ruleItemCodeAndRuleIdMap.get(medicalInsRuleProjectDiagnose.getMedicalDiagnoseCode()).add(medicalInsRuleInfo.getId());
                                 } else {
                                     Set<Integer> ruleIdSet = new HashSet<>();
                                     ruleIdSet.add(medicalInsRuleInfo.getId());
-                                    itemCodeAndRuleIdMap.put(medicalInsRuleProjectDiagnose.getMedicalDiagnoseCode(), ruleIdSet);
+                                    ruleItemCodeAndRuleIdMap.put(medicalInsRuleProjectDiagnose.getMedicalDiagnoseCode(), ruleIdSet);
                                 }
+                                treatmentProjectCodeList.add(medicalInsRuleProjectDiagnose.getMedicalDiagnoseCode());
                             }
+                            setCache(treatmentProjectCodeList, ruleItemCodeAndRuleIdMap, null, Constant.PROJECT_TYPE_DIAG_CODE);
                         }
                     }
                 }
@@ -256,10 +269,21 @@ public class RuleEngine {
         }
     }
 
-    public void setCache(Set<String> projectCodeList, Map<String, Set<Integer>> ruleItemCodeAndRuleIdMap, String projectType) {
+    public void setDesc(Map<String,String> ruleIdAndCodeMap, String medicineCode, String projectCode, Set<Integer> medicalRuleInfoIdSet){
+        if(CollectionUtil.isNotEmpty(ruleIdAndCodeMap)) {
+            for (Integer medicalRuleInfoId : medicalRuleInfoIdSet) {
+                if (ruleIdAndCodeMap.containsKey(medicalRuleInfoId+"_"+projectCode)) {
+                    String desc = ruleIdAndCodeMap.get(medicalRuleInfoId+"_"+projectCode);
+                    redisTemplate.opsForHash().put(Constant.PROJECT_VOLIDATION_DESC_KEY + medicalRuleInfoId, medicineCode, desc);
+                }
+            }
+        }
+    }
+
+    public void setCache(Set<String> projectCodeList, Map<String, Set<Integer>> ruleItemCodeAndRuleIdMap, Map<String,String> ruleIdAndCodeMap, String projectType) {
         if (Constant.PROJECT_TYPE_MEDICINE.equals(projectType) && CollectionUtil.isNotEmpty(ruleItemCodeAndRuleIdMap)) {
             List<MedicalInsuranceDrugs> medicalInsuranceDrugsList = medicalInsuranceDrugsService.lambdaQuery().isNotNull(MedicalInsuranceDrugs::getItemIdHosp).isNotNull(MedicalInsuranceDrugs::getMedicineCode).list();
-            if(CollectionUtil.isNotEmpty(medicalInsuranceDrugsList)) {
+            if (CollectionUtil.isNotEmpty(medicalInsuranceDrugsList)) {
                 for (MedicalInsuranceDrugs medicalInsuranceDrugs : medicalInsuranceDrugsList) {
                     for (String projectCode : projectCodeList) {
                         boolean startFlag = SPELUtil.startWithKey(medicalInsuranceDrugs.getMedicineCode(), projectCode);
@@ -267,6 +291,7 @@ public class RuleEngine {
                             Set<Integer> medicalRuleInfoIdSet = ruleItemCodeAndRuleIdMap.get(projectCode);
                             if (CollectionUtil.isNotEmpty(medicalRuleInfoIdSet)) {
                                 itemCodeAndRuleIdMap.put(medicalInsuranceDrugs.getMedicineCode(), medicalRuleInfoIdSet);
+                                setDesc(ruleIdAndCodeMap, medicalInsuranceDrugs.getMedicineCode(), projectCode, medicalRuleInfoIdSet);
                             }
                         }
                     }
@@ -274,7 +299,7 @@ public class RuleEngine {
             }
         } else if (Constant.PROJECT_TYPE_CONSUMABLE_METERIAL.equals(projectType) && CollectionUtil.isNotEmpty(ruleItemCodeAndRuleIdMap)) {
             List<MaterialItems> materialItemsList = materialItemsService.lambdaQuery().isNotNull(MaterialItems::getItemIdHosp).isNotNull(MaterialItems::getItemId).list();
-            if(CollectionUtil.isNotEmpty(materialItemsList)) {
+            if (CollectionUtil.isNotEmpty(materialItemsList)) {
                 for (MaterialItems materialItems : materialItemsList) {
                     for (String projectCode : projectCodeList) {
                         boolean startFlag = SPELUtil.startWithKey(materialItems.getItemId(), projectCode);
@@ -282,6 +307,7 @@ public class RuleEngine {
                             Set<Integer> medicalRuleInfoIdSet = ruleItemCodeAndRuleIdMap.get(projectCode);
                             if (CollectionUtil.isNotEmpty(medicalRuleInfoIdSet)) {
                                 itemCodeAndRuleIdMap.put(materialItems.getItemId(), medicalRuleInfoIdSet);
+                                setDesc(ruleIdAndCodeMap, materialItems.getItemId(), projectCode, medicalRuleInfoIdSet);
                             }
                         }
                     }
@@ -289,7 +315,7 @@ public class RuleEngine {
             }
         } else if (Constant.PROJECT_TYPE_DIAGNOSIS_TREATMENT.equals(projectType) && CollectionUtil.isNotEmpty(ruleItemCodeAndRuleIdMap)) {
             List<TreatmentItems> treatmentItemsList = treatmentItemsService.lambdaQuery().isNotNull(TreatmentItems::getItemIdHosp).isNotNull(TreatmentItems::getItemId).list();
-            if(CollectionUtil.isNotEmpty(treatmentItemsList)) {
+            if (CollectionUtil.isNotEmpty(treatmentItemsList)) {
                 for (TreatmentItems treatmentItems : treatmentItemsList) {
                     for (String projectCode : projectCodeList) {
                         boolean startFlag = SPELUtil.startWithKey(treatmentItems.getItemId(), projectCode);
@@ -297,6 +323,22 @@ public class RuleEngine {
                             Set<Integer> medicalRuleInfoIdSet = ruleItemCodeAndRuleIdMap.get(projectCode);
                             if (CollectionUtil.isNotEmpty(medicalRuleInfoIdSet)) {
                                 itemCodeAndRuleIdMap.put(treatmentItems.getItemId(), medicalRuleInfoIdSet);
+                                setDesc(ruleIdAndCodeMap, treatmentItems.getItemId(), projectCode, medicalRuleInfoIdSet);
+                            }
+                        }
+                    }
+                }
+            }
+        } else if (Constant.PROJECT_TYPE_DIAG_CODE.equals(projectType) && CollectionUtil.isNotEmpty(ruleItemCodeAndRuleIdMap)) {
+            List<DiagnoseItems> diagnoseItemsList = diagnoseItemsService.lambdaQuery().isNotNull(DiagnoseItems::getDiagnoseCode).isNotNull(DiagnoseItems::getMedicalDiagnoseCode).list();
+            if (CollectionUtil.isNotEmpty(diagnoseItemsList)) {
+                for (DiagnoseItems diagnoseItems : diagnoseItemsList) {
+                    for (String projectCode : projectCodeList) {
+                        boolean startFlag = SPELUtil.startWithKey(diagnoseItems.getDiagnoseCode(), projectCode);
+                        if (startFlag) {
+                            Set<Integer> medicalRuleInfoIdSet = ruleItemCodeAndRuleIdMap.get(projectCode);
+                            if (CollectionUtil.isNotEmpty(medicalRuleInfoIdSet)) {
+                                itemCodeAndRuleIdMap.put(diagnoseItems.getDiagnoseCode(), medicalRuleInfoIdSet);
                             }
                         }
                     }