소스 검색

规则引擎优化

0027005599 2 년 전
부모
커밋
8b1a624d02

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

@@ -110,4 +110,9 @@ public class Constant {
      * 管理统计类规则定时执行,并统计数据
      */
     public static final String MANAGER_STATICTIS_CATEGORY = "MANAGER_STATICTIS_CATEGORY";
+
+    /**
+     * 医保库属性名前缀
+     */
+    public static final String MEDICAL_INS_KEY = "medical_ins_";
 }

+ 1 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/SystemEventAttrConstant.java

@@ -96,4 +96,5 @@ public class SystemEventAttrConstant {
     public static final String CATEGORIES_ITEMS = "categories_items";
 
 
+
 }

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

@@ -70,10 +70,10 @@ public class AdviceDetailsVO {
     private String dose_unit;//	true	char	单位,发药单位,例如:瓶、盒、片等,和发药数量对应
     @NotBlank(message = "医嘱明细项目金额不能为空")
     private Double amount;//	true	float	金额,必须使用数值型,如”50.5”
-    private Integer use_day;//		float	用药天数(项目为药品时非空),医嘱服用该药品天数,必须使用数值型,如”15”
+    private Integer use_day;//		float	实际用药天数(项目为药品时非空),医嘱服用该药品天数,必须使用数值型,如”15”
     private Integer single_dose_number;//		float	单次用药量(项目为药品时非空),配合下一个字段的单位,如 50 mg,必须使用数值型,如”50”
     private String single_dose_unit;//		char	单次用药量剂量单位(项目为药品时非空)
-    private Integer dose_day;//		float	药量天数(项目为药品时非空),依据医嘱服药要求,所配药品患者可以服用的天数,必须使用数值型,如”5”
+    private Integer dose_day;//		float	药量最大服用天数(项目为药品时非空),依据医嘱服药要求,所配药品患者可以服用的天数,必须使用数值型,如”5”
     private String take_frequence;//		char	服用频次
     @NotBlank(message = "医保标志不能为空 0:不是医保 1:是医保")
     private String medical_insurance_mark; //医保标志

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

@@ -56,30 +56,35 @@ public class MedicalInsRuleProject implements Serializable {
      */
     @Excel(name = "项目编码", width = 15)
     @ApiModelProperty(value = "主数据表编码")
+    @TableField("project_code")
     private java.lang.String projectCode;
     /**
      * 项目名称
      */
     @Excel(name = "项目名称", width = 15)
     @ApiModelProperty(value = "项目名称")
+    @TableField("project_name")
     private java.lang.String projectName;
     /**
      * 主数据表ID
      */
     @Excel(name = "主数据表ID", width = 15)
     @ApiModelProperty(value = "主数据表ID")
+    @TableField("project_id")
     private java.lang.String projectId;
     /**
      * 关联项目编号
      */
     @Excel(name = "关联项目编号", width = 15)
     @ApiModelProperty(value = "关联项目编号")
+    @TableField("correlation_project_code")
     private java.lang.String correlationProjectCode;
     /**
      * 关联项目名称
      */
     @Excel(name = "关联项目名称", width = 15)
     @ApiModelProperty(value = "关联项目名称")
+    @TableField("correlation_project_name")
     private java.lang.String correlationProjectName;
     /**
      * 收费等级;01 甲类 02 乙类 03 丙类 04 可报丙类
@@ -87,6 +92,7 @@ public class MedicalInsRuleProject implements Serializable {
     @Excel(name = "收费项目等级", width = 15)
     @ApiModelProperty(value = "收费等级;01 甲类 02 乙类 03 丙类 04 可报丙类")
     @Dict(dicCode = "change_class")
+    @TableField("change_class")
     private java.lang.String changeClass;
     /**
      * 医疗收费项目类别
@@ -94,12 +100,14 @@ public class MedicalInsRuleProject implements Serializable {
     @Excel(name = "医疗收费项目类别", width = 15)
     @ApiModelProperty(value = "医疗收费项目类别;01\t床位费 02\t诊察费 03\t检查费 04\t化验费 05\t治疗费 06\t手术费 07\t护理费 08\t卫生材料费 09\t西药费 10\t中药饮片费 11\t中成药费 12\t一般诊疗费 13\t挂号费 14\t其他费 14012\t单病种除外内容 14013\t单病种超标准床位费 14014\t单病种定额标准费 1407\t救护车费 1408\tMRI费 1409\tCT费 1410\t彩超费 1411\t输氧费 1412\t输血费 1413\t麻醉费 1414\t麻醉相关项目费 1415\t其他医疗费")
     @Dict(dicCode = "categories_items")
+    @TableField("categories_items")
     private java.lang.String categoriesItems;
     /**
      * 年龄;
      */
     @Excel(name = "年龄", width = 15)
     @ApiModelProperty(value = "年龄;")
+    @TableField("age")
     private java.lang.Integer age;
 
     /**
@@ -107,12 +115,14 @@ public class MedicalInsRuleProject implements Serializable {
      */
     @Excel(name = "数量", width = 15)
     @ApiModelProperty(value = "数量;")
+    @TableField("quantity")
     private java.lang.Integer quantity;
     /**
      * 金额;
      */
     @Excel(name = "金额", width = 15)
     @ApiModelProperty(value = "金额;")
+    @TableField("amount")
     private java.lang.Double amount;
     /**
      * 性别;0 未知的性别 1 男性 2 女性 9 未说明性别s
@@ -120,6 +130,7 @@ public class MedicalInsRuleProject implements Serializable {
     @Excel(name = "性别", width = 15)
     @ApiModelProperty(value = "性别;0 未知的性别 1 男性 2 女性 9 未说明性别")
     @Dict(dicCode = "sex")
+    @TableField("gender")
     private java.lang.String gender;
     /**
      * 医疗机构等级;
@@ -127,6 +138,7 @@ public class MedicalInsRuleProject implements Serializable {
     @Excel(name = "医疗机构等级", width = 15)
     @ApiModelProperty(value = "医疗机构等级;")
     @Dict(dicCode = "medical_ins_level")
+    @TableField("medical_ins_level")
     private java.lang.String medicalInsLevel;
     /**
      * 医师级别;
@@ -134,35 +146,41 @@ public class MedicalInsRuleProject implements Serializable {
     @Excel(name = "医师级别", width = 15)
     @ApiModelProperty(value = "医师级别;")
     @Dict(dicCode = "doctor_level")
+    @TableField("doctor_level")
     private java.lang.String doctorLevel;
     /**
      * 参保类型;
      */
     @Excel(name = "参保类型", width = 15)
     @ApiModelProperty(value = "参保类型;")
+    @TableField("ins_type")
     private java.lang.String insType;
     /**
      * 科室;
      */
     @Excel(name = "科室", width = 15)
     @ApiModelProperty(value = "科室;")
+    @TableField("medical_dept_code")
     private java.lang.String medicalDeptCode;
     /**
      * 用药天数;
      */
     @Excel(name = "用药天数", width = 15)
     @ApiModelProperty(value = "用药天数;")
+    @TableField("dose_day")
     private java.lang.String doseDay;
     /**
      * 状态
      */
     @Excel(name = "状态", width = 15)
     @ApiModelProperty(value = "状态")
+    @TableField("state")
     private java.lang.String state;
 
 
     @Excel(name = "诊断编码")
     @ApiModelProperty(value = "诊断编码")
+    @TableField("medical_diagnose_code")
     private String medicalDiagnoseCode;
 
     /**

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/MidIncidentWarningVO.java

@@ -51,7 +51,7 @@ public class MidIncidentWarningVO {
      * 病人年龄
      */
     @NotBlank(message = "病人年龄不能为空")
-    private String patient_age;
+    private Integer patient_age;
     /**
      * 离院方式
      * 1.医嘱离院 2.医嘱转院、转社区、转卫生机构 3.非医嘱离院 4.死亡 9.其他

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

@@ -345,7 +345,7 @@ public class RuleEngine {
         midIncidentVisitLog.setPatientId(midIncidentWarningVO.getPatient_id());
         midIncidentVisitLog.setPatientName(midIncidentWarningVO.getPatient_name());
         midIncidentVisitLog.setDoctorLevel(midIncidentWarningVO.getDoctor_level());
-        midIncidentVisitLog.setPatientAge(midIncidentWarningVO.getPatient_age());
+        midIncidentVisitLog.setPatientAge(midIncidentWarningVO.getPatient_age().toString());
         midIncidentVisitLog.setPatientGender(midIncidentWarningVO.getPatient_gender());
         midIncidentVisitLog.setDischargeStatus(midIncidentWarningVO.getDischarge_status());
         midIncidentVisitLog.setTotoalAmount(midIncidentWarningVO.getTotoal_amount());
@@ -456,7 +456,7 @@ public class RuleEngine {
         midIncidentAudit.setNoticeType("事中预警");
         midIncidentAudit.setAmount((double) 0);
         midIncidentAudit.setDoctorLevel(midIncidentWarningVO.getDoctor_level());
-        midIncidentAudit.setPatientAge(midIncidentWarningVO.getPatient_age());
+        midIncidentAudit.setPatientAge(midIncidentWarningVO.getPatient_age().toString());
         midIncidentAudit.setPatientGender(midIncidentWarningVO.getPatient_gender());
         midIncidentAudit.setDischargeStatus(midIncidentWarningVO.getDischarge_status());
         midIncidentAudit.setAllergies(midIncidentWarningVO.getAllergies());
@@ -663,7 +663,7 @@ public class RuleEngine {
                 paramMap.put(SystemEventAttrConstant.MEDICAL_INS_RULE_INFO_CODE, medicalInsRuleInfo.getRuleCode());
                 paramMap.put(SystemEventAttrConstant.MEDICAL_INS_RULE_INFO_NAME, medicalInsRuleInfo.getRuleName());
                 List<RuleFactorRela> ruleFactorRelaSortList = ruleIdAndFatorEnchanceIdMap.get(medicalRuleInsInfoId);
-
+                getRuleProjectIntoMap(medicalInsRuleInfo, paramMap);
                 boolean auditFlag = factorEnchangeFactory.runFactorEnchange(medicalRuleInsInfoId, medicalInsRuleInfo, afterIncidentAudit, paramMap, ruleFactorRelaSortList, factorEnchanceListTemp, itemList);
                 if (Constant.VALIDATION_HANDER_METHOD_RETURN.equals(medicalInsRuleInfo.getViolationHandingMethod()) && auditFlag) {
                     log.error("事后提醒数据:{} 规则名:{} 触发诊断类规则,直接全金额,后续规则无需再跑", paramMap, medicalInsRuleInfo);
@@ -707,6 +707,7 @@ public class RuleEngine {
                 paramMap.put(SystemEventAttrConstant.MEDICAL_INS_RULE_INFO_CODE, medicalInsRuleInfo.getRuleCode());
                 paramMap.put(SystemEventAttrConstant.MEDICAL_INS_RULE_INFO_NAME, medicalInsRuleInfo.getRuleName());
                 List<RuleFactorRela> ruleFactorRelaSortList = ruleIdAndFatorEnchanceIdMap.get(medicalRuleInsInfoId);
+                getRuleProjectIntoMap(medicalInsRuleInfo, paramMap);
                 auditFlag = factorEnchangeFactory.runFactorEnchange(medicalRuleInsInfoId, medicalInsRuleInfo, midIncidentAudit, paramMap, ruleFactorRelaSortList, factorEnchanceListTemp, itemList);
                 if (Constant.VALIDATION_HANDER_METHOD_RETURN.equals(medicalInsRuleInfo.getViolationHandingMethod()) && auditFlag) {
                     log.error("事中提醒数据:{} 规则名:{} 触发诊断类规则,直接全金额,后续规则无需再跑", paramMap, medicalInsRuleInfo);
@@ -717,5 +718,35 @@ public class RuleEngine {
         return auditFlag;
     }
 
+    public void getRuleProjectIntoMap(MedicalInsRuleInfo medicalInsRuleInfo, Map<String,Object> itemMap){
+        List<MedicalInsRuleProject> medicalInsRuleProjectList = medicalInsRuleProjectService.lambdaQuery().eq(MedicalInsRuleProject::getMedicalInsRuleInfoId, medicalInsRuleInfo.getId())
+                .eq(MedicalInsRuleProject::getState,Constant.EFF_STATE).list();
+        String selectedRoles = medicalInsRuleInfo.getSelectedRoles();
+        if(StringUtils.isNotBlank(selectedRoles)){
+//            String[] selectedRolesArr = selectedRoles.split(",");
+            if(CollectionUtil.isNotEmpty(medicalInsRuleProjectList)){
+                if(medicalInsRuleProjectList.size()==1) {
+                    String jsonStr = JSON.toJSONString(medicalInsRuleProjectList.get(0));
+                    JSONObject ruleProjectJSONObject = JSON.parseObject(jsonStr);
+                    Map<String,Object> filterMap = filterMap(ruleProjectJSONObject);
+                    itemMap.putAll(filterMap);
+                }
+            }
+
+        }
+    }
+
+
+    public Map<String,Object> filterMap(JSONObject ruleProjectJSONObject){
+        Map<String,Object> filterMap = new HashMap<>();
+        if(CollectionUtil.isNotEmpty(ruleProjectJSONObject)){
+            for(Map.Entry<String,Object> entry:ruleProjectJSONObject.entrySet()){
+                if(null != entry.getValue()){
+                    filterMap.put(Constant.MEDICAL_INS_KEY+entry.getKey(), entry.getValue());
+                }
+            }
+        }
+        return filterMap;
+    }
 
 }

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/impl/FactorEnchanceServiceImpl.java

@@ -97,7 +97,7 @@ public class FactorEnchanceServiceImpl extends ServiceImpl<FactorEnchanceMapper,
 
                 spelStringBu.append(spelStr);
                 if (i < (factorCondRelaListSize - 1)) {
-                    spelStringBu.append(factorEnchance.getExtAttr1());
+                    spelStringBu.append(" ").append(factorEnchance.getExtAttr1()).append(" ");
                 }
                 factorCondRela.setCondStr(spelStr);
                 factorCondRelaMapper.insert(factorCondRela);