瀏覽代碼

事后稽核引擎

0027005599 2 年之前
父節點
當前提交
66df4462ed
共有 18 個文件被更改,包括 371 次插入168 次删除
  1. 53 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/CommonThreadPoolConfig.java
  2. 8 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/Constant.java
  3. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/controller/MidIncidentVisitLogController.java
  4. 12 4
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/AfterIncidentDetailLog.java
  5. 4 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/MidIncidentAudit.java
  6. 27 7
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/MidIncidentVisitLog.java
  7. 4 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/MidIncidentWarningVO.java
  8. 2 2
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/RuleAttr.java
  9. 19 5
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/job/AfterWaringJob.java
  10. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/mapper/MidIncidentVisitLogMapper.java
  11. 36 29
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/FactorEnchangeFactory.java
  12. 84 98
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/RuleEngine.java
  13. 33 16
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/dict/DictUtil.java
  14. 26 2
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/plugin/InterfItemListPlugin.java
  15. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/IMidIncidentVisitLogService.java
  16. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/impl/MidIncidentVisitLogServiceImpl.java
  17. 39 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/threadpool/CommonExecutePool.java
  18. 20 1
      jeecg-module-system/jeecg-system-start/src/main/resources/application.yml

+ 53 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/CommonThreadPoolConfig.java

@@ -0,0 +1,53 @@
+package org.jeecg.modules.medical;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author huang.youcai
+ * @version CdrThreadPoolConfig v 0.1 2019/4/2 9:30
+ */
+@Component
+@ConfigurationProperties(prefix = "cdr.threadpool")
+public class CommonThreadPoolConfig {
+
+    private int corePoolSize;
+
+    private int maxPoolSize;
+
+    private int keepAliveSeconds;
+
+    private int queueCapacity;
+
+    public int getCorePoolSize() {
+        return corePoolSize;
+    }
+
+    public void setCorePoolSize(int corePoolSize) {
+        this.corePoolSize = corePoolSize;
+    }
+
+    public int getMaxPoolSize() {
+        return maxPoolSize;
+    }
+
+    public void setMaxPoolSize(int maxPoolSize) {
+        this.maxPoolSize = maxPoolSize;
+    }
+
+    public int getKeepAliveSeconds() {
+        return keepAliveSeconds;
+    }
+
+    public void setKeepAliveSeconds(int keepAliveSeconds) {
+        this.keepAliveSeconds = keepAliveSeconds;
+    }
+
+    public int getQueueCapacity() {
+        return queueCapacity;
+    }
+
+    public void setQueueCapacity(int queueCapacity) {
+        this.queueCapacity = queueCapacity;
+    }
+}

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

@@ -70,6 +70,9 @@ public class Constant {
     public static final String PROJECT_TYPE_KEY = "project_type";
     //金额
     public static final String AMOUNT_KEY = "amount";
+
+    //单次门诊住院所有项目金额
+    public static final String ALL_AMOUNT_KEY = "totoal_amount";
 //    public static final String PROJECT_CODE_KEY = "project_code";
 
 
@@ -81,4 +84,9 @@ public class Constant {
 
     public static final String FAIL = "FAIL";
 
+    public static final String VALIDATION_HANDER_METHOD_RETURN = "RETURN";
+
+    public static final String VALIDATION_HANDER_METHOD_CONTINUE = "CONTINUE";
+
+    public static final String SPLIT_STR = ",";
 }

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/controller/MidIncidentVisitLogController.java

@@ -40,7 +40,7 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
  /**
  * @Description: mid_incident_visit_log
  * @Author: jeecg-boot
- * @Date:   2023-05-12 09:23:36
+ * @Date:   2023-05-21 18:30:54
  * @Version: V1.0
  */
 @Api(tags="mid_incident_visit_log")

+ 12 - 4
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/AfterIncidentDetailLog.java

@@ -4,6 +4,8 @@ import java.io.Serializable;
 import java.io.UnsupportedEncodingException;
 import java.util.Date;
 import java.math.BigDecimal;
+import java.util.List;
+
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -217,22 +219,22 @@ public class AfterIncidentDetailLog implements Serializable {
 	@Excel(name = "医院诊断编码;", width = 15)
     @ApiModelProperty(value = "医院诊断编码;")
     @TableField(value = "diagnose_code")
-    private java.lang.String diagnose_code;
+    private java.lang.String diagnose_code_str;
 	/**医院诊断描述;*/
 	@Excel(name = "医院诊断描述;", width = 15)
     @ApiModelProperty(value = "医院诊断描述;")
     @TableField(value = "diagnose_desc")
-    private java.lang.String diagnose_desc;
+    private java.lang.String diagnose_name_str;
 	/**医保诊断编码;*/
 	@Excel(name = "医保诊断编码;", width = 15)
     @ApiModelProperty(value = "医保诊断编码;")
     @TableField(value = "medical_diagnose_code")
-    private java.lang.String medical_diagnose_code;
+    private java.lang.String medical_diagnose_code_str;
 	/**医保诊断描述;*/
 	@Excel(name = "医保诊断描述;", width = 15)
     @ApiModelProperty(value = "医保诊断描述;")
     @TableField(value = "medical_diagnose_desc")
-    private java.lang.String medical_diagnose_name;
+    private java.lang.String medical_diagnose_name_str;
 	/**状态;WAITING,DEALING,SUCCESS,FAIL*/
 	@Excel(name = "状态;WAITING,DEALING,SUCCESS,FAIL", width = 15)
     @ApiModelProperty(value = "状态;WAITING,DEALING,SUCCESS,FAIL")
@@ -253,4 +255,10 @@ public class AfterIncidentDetailLog implements Serializable {
     @DateTimeFormat(pattern= "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "更新时间")
     private java.util.Date updateTime;
+
+    @TableField(exist = false)
+    private List<String> medical_diagnose_code;
+
+    @TableField(exist = false)
+    private List<String> medical_diagnose_name;
 }

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

@@ -79,6 +79,10 @@ public class MidIncidentAudit implements Serializable {
 	@Excel(name = "医嘱号/处方号", width = 15)
     @ApiModelProperty(value = "医嘱号/处方号")
     private java.lang.String prescriptionNumber;
+    /**违规金额*/
+    @Excel(name = "违规金额", width = 15)
+    @ApiModelProperty(value = "违规金额")
+    private java.lang.Double amount;
 	/**反馈结果*/
 	@Excel(name = "反馈结果", width = 15)
     @ApiModelProperty(value = "反馈结果")

+ 27 - 7
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/MidIncidentVisitLog.java

@@ -21,7 +21,7 @@ import lombok.experimental.Accessors;
 /**
  * @Description: mid_incident_visit_log
  * @Author: jeecg-boot
- * @Date:   2023-05-12 09:23:36
+ * @Date:   2023-05-21 18:30:54
  * @Version: V1.0
  */
 @Data
@@ -33,12 +33,12 @@ public class MidIncidentVisitLog implements Serializable {
     private static final long serialVersionUID = 1L;
 
 	/**主键ID*/
-	@TableId(type = IdType.AUTO)
+	@TableId(type = IdType.ASSIGN_ID)
     @ApiModelProperty(value = "主键ID")
     private java.lang.Integer id;
 	/**就诊类别;住院/门诊*/
-	@Excel(name = "就诊类别;1:住院 2:门诊", width = 15)
-    @ApiModelProperty(value = "就诊类别;1:住院 2:门诊")
+	@Excel(name = "就诊类别;住院/门诊", width = 15)
+    @ApiModelProperty(value = "就诊类别;住院/门诊")
     private java.lang.String visitType;
 	/**科室编码*/
 	@Excel(name = "科室编码", width = 15)
@@ -72,10 +72,30 @@ public class MidIncidentVisitLog implements Serializable {
 	@Excel(name = "医嘱号/处方号", width = 15)
     @ApiModelProperty(value = "医嘱号/处方号")
     private java.lang.String doctorAdviceNo;
+	/**医师级别;*/
+	@Excel(name = "医师级别;", width = 15)
+    @ApiModelProperty(value = "医师级别;")
+    private java.lang.String doctorLevel;
+	/**离院方式;1.医嘱离院 2.医嘱转院、转社区、转卫生机构 3.非医嘱离院 4.死亡 9.其他*/
+	@Excel(name = "离院方式;1.医嘱离院 2.医嘱转院、转社区、转卫生机构 3.非医嘱离院 4.死亡 9.其他", width = 15)
+    @ApiModelProperty(value = "离院方式;1.医嘱离院 2.医嘱转院、转社区、转卫生机构 3.非医嘱离院 4.死亡 9.其他")
+    private java.lang.String dischargeStatus;
+	/**病人年龄;*/
+	@Excel(name = "病人年龄;", width = 15)
+    @ApiModelProperty(value = "病人年龄;")
+    private java.lang.String patientAge;
+	/**病人性别;*/
+	@Excel(name = "病人性别;", width = 15)
+    @ApiModelProperty(value = "病人性别;")
+    private java.lang.String patientGender;
+	/**项目总金额;*/
+	@Excel(name = "项目总金额;", width = 15)
+    @ApiModelProperty(value = "项目总金额;")
+    private java.lang.Double totoalAmount;
 	/**入院日期*/
-	@Excel(name = "入院日期", width = 15, format =  "yyyy-MM-dd")
-	@JsonFormat(timezone = "GMT+8",pattern =  "yyyy-MM-dd")
-    @DateTimeFormat(pattern= "yyyy-MM-dd")
+	@Excel(name = "入院日期", width = 15, format =  "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(timezone = "GMT+8",pattern =  "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern= "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "入院日期")
     private java.util.Date inHospDate;
 	/**诊断编码*/

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

@@ -40,6 +40,10 @@ public class MidIncidentWarningVO {
      * 医师级别
      */
     private String doctor_level;
+    /**
+     * 所有项目总金额
+     */
+    private Double totoal_amount;
 
     private List<AdviceDetailsVO> advice_details;//	true	Array	医嘱明细信息(多项)(内容说明参见advice_details(医嘱明细信息说明))
 }

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

@@ -46,11 +46,11 @@ public class RuleAttr implements Serializable {
     private java.lang.String attrPath;
 	/**属性类型;属性类型*/
 	@Excel(name = "属性类型;属性类型", width = 15)
-    @ApiModelProperty(value = "属性类型;属性类型")
+    @ApiModelProperty(value = "属性类型;属性类型 1:以这个数据为明细主数据 2:附属属性")
     private java.lang.Integer attrType;
 	/**规则属性名;当有规则属性路径,属性类型时候,作为深度对象的属性*/
 	@Excel(name = "规则属性名;当有规则属性路径,属性类型时候,作为深度对象的属性", width = 15)
-    @ApiModelProperty(value = "规则属性名;当有规则属性路径,属性类型时候,作为深度对象的属性")
+    @ApiModelProperty(value = "规则属性名;当有规则属性路径,当有属性类型为2时候,作为深度对象的属性")
     private java.lang.String ruleAttr;
 	/**创建人*/
     @ApiModelProperty(value = "创建人")

+ 19 - 5
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/job/AfterWaringJob.java

@@ -4,12 +4,15 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import org.jeecg.modules.medical.Constant;
 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.ruleengine.RuleEngine;
 import org.jeecg.modules.medical.service.IAfterIncidentDetailLogService;
 import org.jeecg.modules.medical.service.IAfterIncidentLogService;
 import org.quartz.Job;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 
 import java.util.List;
 import java.util.Map;
@@ -20,23 +23,34 @@ import java.util.Map;
 public class AfterWaringJob implements Job {
     @Autowired
     IAfterIncidentLogService afterIncidentLogService;
-
     @Autowired
     IAfterIncidentDetailLogService afterIncidentDetailLogService;
+    @Autowired
+    RuleEngine ruleEngine;
 
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
-        QueryWrapper queryWrapper = new QueryWrapper(AfterIncidentDetailLog.class);
+        QueryWrapper queryWrapper = new QueryWrapper(AfterIncidentLog.class);
         queryWrapper.eq("state", Constant.WATING);
-        long count = afterIncidentDetailLogService.count(queryWrapper);
+        long count = afterIncidentLogService.count(queryWrapper);
         if(count>0){
             queryWrapper.last(" limit 1000");
-            List<AfterIncidentLog> afterIncidentLogList = afterIncidentDetailLogService.list(queryWrapper);
+            List<AfterIncidentLog> afterIncidentLogList = afterIncidentLogService.list(queryWrapper);
             for(AfterIncidentLog afterIncidentLog : afterIncidentLogList){
+                dealAftertask(afterIncidentLog);
+            }
 
+        }
+    }
 
-            }
 
+    @Async("commonTaskAsyncPool")
+    public void dealAftertask(AfterIncidentLog afterIncidentLog){
+        AfterwardsAudit afterwardsAudit = ruleEngine.insertAfterWarning(afterIncidentLog);
+        afterIncidentLogService.lambdaUpdate().set(AfterIncidentLog::getState, Constant.DEALING).eq(AfterIncidentLog::getId, afterIncidentLog.getId()).update();
+        List<AfterIncidentDetailLog> afterIncidentDetailLogList = afterIncidentDetailLogService.lambdaQuery().eq(AfterIncidentDetailLog::getAfterIncidentLogId, afterIncidentLog.getId()).list();
+        for(AfterIncidentDetailLog afterIncidentDetailLog : afterIncidentDetailLogList) {
+            ruleEngine.dealAfterInterfaceEngin("afterIncidentWarning", afterwardsAudit, afterIncidentDetailLog);
         }
     }
 }

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/mapper/MidIncidentVisitLogMapper.java

@@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 /**
  * @Description: mid_incident_visit_log
  * @Author: jeecg-boot
- * @Date:   2023-05-12 09:23:36
+ * @Date:   2023-05-21 18:30:54
  * @Version: V1.0
  */
 public interface MidIncidentVisitLogMapper extends BaseMapper<MidIncidentVisitLog> {

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

@@ -79,7 +79,7 @@ public class FactorEnchangeFactory {
 
     public boolean runFactorEnchange(Integer medicalInfoRuleInfoId, MedicalInsRuleInfo medicalInsRuleInfo, Object audit, Map<String, Object> localMap, List<RuleFactorRela> ruleFactorRelaList, List<FactorEnchance> factorEnchanceList) {
         Map<Integer, FactorEnchance> factorEnchanceMap = factorEnchanceList.stream().collect(Collectors.toMap(FactorEnchance::getId, v -> v, (v1, v2) -> v1));
-        boolean result = true;
+        boolean result = false;
         for (RuleFactorRela ruleFactorRela : ruleFactorRelaList) {
             Integer factorEnchanceId = ruleFactorRela.getFactorEnhanceId();
             FactorEnchance factorEnchance = factorEnchanceMap.get(factorEnchanceId);
@@ -149,34 +149,41 @@ public class FactorEnchangeFactory {
     public void insertMidWarningDetail(Map<String, Object> itemMap, MedicalInsRuleInfo medicalInsRuleInfo, Object audit) {
         if(audit instanceof MidIncidentAudit) {
             MidIncidentAudit midIncidentAudit = (MidIncidentAudit) audit;
-            MidIncidentWarningVO midIncidentWarningVO = RuleEngine.midIncidentWarningVOThreadLocal.get();
-            MidIncidentAuditDetail midIncidentAuditDetail = new MidIncidentAuditDetail();
-            midIncidentAuditDetail.setMedicalDeptCode(midIncidentWarningVO.getMedical_dept_code());
-            midIncidentAuditDetail.setMedicalDeptName(midIncidentWarningVO.getMedical_dept_name());
-            Date date = new Date(System.currentTimeMillis());
-            midIncidentAuditDetail.setCreateTime(date);
-            midIncidentAuditDetail.setDoctorName(midIncidentWarningVO.getDoctor_name());
-            midIncidentAuditDetail.setDoctorId(midIncidentWarningVO.getDoctor_code());
-            midIncidentAuditDetail.setPatientId(midIncidentWarningVO.getPatient_id());
-            midIncidentAuditDetail.setPatientName(midIncidentWarningVO.getPatient_name());
-            midIncidentAuditDetail.setTreatmentType(medicalInsRuleInfo.getTreatmentType());
-            midIncidentAuditDetail.setNoticeType("事中预警");
-            midIncidentAuditDetail.setMedicalInsRuleInfoCode(medicalInsRuleInfo.getRuleCode());
-            midIncidentAuditDetail.setMedicalInsRuleInfoId(medicalInsRuleInfo.getId());
-            midIncidentAuditDetail.setMedicalInsRuleInfoName(medicalInsRuleInfo.getRuleName());
-            midIncidentAuditDetail.setDescription(medicalInsRuleInfo.getDescription());
-            midIncidentAuditDetail.setProejctCode(itemMap.get(Constant.PROJECT_CODE_KEY).toString());
-            midIncidentAuditDetail.setProejctName(itemMap.get(Constant.PROJECT_NAME_KEY).toString());
-            midIncidentAuditDetail.setMedicalProjectCode(itemMap.get(Constant.MEDICAL_PROJECT_CODE_KEY).toString());
-            midIncidentAuditDetail.setMedicalProjectName(itemMap.get(Constant.MEDICAL_PROJECT_NAME_KEY).toString());
-            midIncidentAuditDetail.setOutpatientNumber(midIncidentAudit.getOutpatientNumber());
-            midIncidentAuditDetail.setPrescriptionNumber(midIncidentAudit.getPrescriptionNumber());
-            midIncidentAuditDetail.setProjectType(itemMap.getOrDefault(Constant.PROJECT_TYPE_KEY, "default").toString());
-            midIncidentAuditDetail.setViolationLevel(medicalInsRuleInfo.getViolationLevel());
-            midIncidentAuditDetail.setTreatmentType(medicalInsRuleInfo.getTreatmentType());
-            midIncidentAuditDetail.setMidIncidentAuditId(midIncidentAudit.getId());
-            midIncidentAuditDetail.setAmount((Double) itemMap.get(Constant.AMOUNT_KEY));
-            midIncidentAuditDetailService.save(midIncidentAuditDetail);
+            Double amount = (Double) itemMap.get(Constant.AMOUNT_KEY);
+            if(Constant.VALIDATION_HANDER_METHOD_RETURN.equals(medicalInsRuleInfo.getViolationHandingMethod())) {
+                midIncidentAuditService.lambdaUpdate().set(MidIncidentAudit::getAmount, midIncidentAudit.getAmount()).eq(MidIncidentAudit::getId, midIncidentAudit.getId()).update();
+            }else {
+                MidIncidentWarningVO midIncidentWarningVO = RuleEngine.midIncidentWarningVOThreadLocal.get();
+                MidIncidentAuditDetail midIncidentAuditDetail = new MidIncidentAuditDetail();
+                midIncidentAuditDetail.setMedicalDeptCode(midIncidentWarningVO.getMedical_dept_code());
+                midIncidentAuditDetail.setMedicalDeptName(midIncidentWarningVO.getMedical_dept_name());
+                Date date = new Date(System.currentTimeMillis());
+                midIncidentAuditDetail.setCreateTime(date);
+                midIncidentAuditDetail.setDoctorName(midIncidentWarningVO.getDoctor_name());
+                midIncidentAuditDetail.setDoctorId(midIncidentWarningVO.getDoctor_code());
+                midIncidentAuditDetail.setPatientId(midIncidentWarningVO.getPatient_id());
+                midIncidentAuditDetail.setPatientName(midIncidentWarningVO.getPatient_name());
+                midIncidentAuditDetail.setTreatmentType(medicalInsRuleInfo.getTreatmentType());
+                midIncidentAuditDetail.setNoticeType("事中预警");
+                midIncidentAuditDetail.setMedicalInsRuleInfoCode(medicalInsRuleInfo.getRuleCode());
+                midIncidentAuditDetail.setMedicalInsRuleInfoId(medicalInsRuleInfo.getId());
+                midIncidentAuditDetail.setMedicalInsRuleInfoName(medicalInsRuleInfo.getRuleName());
+                midIncidentAuditDetail.setDescription(medicalInsRuleInfo.getDescription());
+                midIncidentAuditDetail.setProejctCode(itemMap.get(Constant.PROJECT_CODE_KEY).toString());
+                midIncidentAuditDetail.setProejctName(itemMap.get(Constant.PROJECT_NAME_KEY).toString());
+                midIncidentAuditDetail.setMedicalProjectCode(itemMap.get(Constant.MEDICAL_PROJECT_CODE_KEY).toString());
+                midIncidentAuditDetail.setMedicalProjectName(itemMap.get(Constant.MEDICAL_PROJECT_NAME_KEY).toString());
+                midIncidentAuditDetail.setOutpatientNumber(midIncidentAudit.getOutpatientNumber());
+                midIncidentAuditDetail.setPrescriptionNumber(midIncidentAudit.getPrescriptionNumber());
+                midIncidentAuditDetail.setProjectType(itemMap.getOrDefault(Constant.PROJECT_TYPE_KEY, "default").toString());
+                midIncidentAuditDetail.setViolationLevel(medicalInsRuleInfo.getViolationLevel());
+                midIncidentAuditDetail.setTreatmentType(medicalInsRuleInfo.getTreatmentType());
+                midIncidentAuditDetail.setMidIncidentAuditId(midIncidentAudit.getId());
+                midIncidentAuditDetail.setAmount(amount);
+                midIncidentAuditService.lambdaUpdate().setSql("amount +"+amount).eq(MidIncidentAudit::getId, midIncidentAudit.getId()).update();
+                midIncidentAuditDetailService.save(midIncidentAuditDetail);
+            }
+
         }
     }
 

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

@@ -15,12 +15,12 @@ import org.jeecg.modules.medical.entity.AdviceDetailsVO;
 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.AfterwardsAuditDetail;
 import org.jeecg.modules.medical.entity.AfterwardsIncidentAuditDiagnose;
 import org.jeecg.modules.medical.entity.DiagnosesVO;
 import org.jeecg.modules.medical.entity.FactorEnchance;
 import org.jeecg.modules.medical.entity.MedicalInsRuleInfo;
 import org.jeecg.modules.medical.entity.MedicalInsRuleProject;
+import org.jeecg.modules.medical.entity.MedicalInsRuleProjectDiagnose;
 import org.jeecg.modules.medical.entity.MidIncidentAudit;
 import org.jeecg.modules.medical.entity.MidIncidentAuditDiagnose;
 import org.jeecg.modules.medical.entity.MidIncidentVisitDetailLog;
@@ -33,11 +33,9 @@ import org.jeecg.modules.medical.ruleengine.plugin.InterfItemListPlugin;
 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.IEventAttrService;
-import org.jeecg.modules.medical.service.IFactorAttrRelaService;
-import org.jeecg.modules.medical.service.IFactorCondRelaService;
 import org.jeecg.modules.medical.service.IFactorEnchanceService;
 import org.jeecg.modules.medical.service.IMedicalInsRuleInfoService;
+import org.jeecg.modules.medical.service.IMedicalInsRuleProjectDiagnoseService;
 import org.jeecg.modules.medical.service.IMedicalInsRuleProjectService;
 import org.jeecg.modules.medical.service.IMidIncidentAuditDiagnoseService;
 import org.jeecg.modules.medical.service.IMidIncidentAuditService;
@@ -72,7 +70,7 @@ public class RuleEngine {
     private IMedicalInsRuleInfoService medicalInsRuleInfoService;
     @Autowired
     private IFactorEnchanceService factorEnchanceService;
-//    @Autowired
+    //    @Autowired
 //    private IEventAttrService eventAttrService;
 //    @Autowired
 //    private IFactorAttrRelaService factorAttrRelaService;
@@ -106,6 +104,8 @@ public class RuleEngine {
     @Autowired
     IAfterwardsIncidentAuditDiagnoseService afterwardsIncidentAuditDiagnoseService;
     @Autowired
+    IMedicalInsRuleProjectDiagnoseService medicalInsRuleProjectDiagnoseService;
+    @Autowired
     DictUtil dictUtil;
     @Autowired
     WebSocket webSocket;
@@ -167,10 +167,18 @@ public class RuleEngine {
                                 itemCodeAndRuleIdMap.put(medicalInsRuleProject.getCorrelationProjectCode(), ruleIdSet);
                             }
                         }
-
-//                        if(StringUtils.isNotBlank(medicalInsRuleProject.get)){
-//
-//                        }
+                        List<MedicalInsRuleProjectDiagnose> medicalInsRuleProjectDiagnoseList = medicalInsRuleProjectDiagnoseService.lambdaQuery().eq(MedicalInsRuleProjectDiagnose::getMedicalInsRuleProjectId, medicalInsRuleProject.getMedicineInsRuleInfoId()).list();
+                        if (CollectionUtil.isNotEmpty(medicalInsRuleProjectDiagnoseList)) {
+                            for (MedicalInsRuleProjectDiagnose medicalInsRuleProjectDiagnose : medicalInsRuleProjectDiagnoseList) {
+                                if (itemCodeAndRuleIdMap.containsKey(medicalInsRuleProjectDiagnose.getMedicalDiagnoseCode())) {
+                                    itemCodeAndRuleIdMap.get(medicalInsRuleProjectDiagnose.getMedicalDiagnoseCode()).add(medicalInsRuleProject.getMedicineInsRuleInfoId());
+                                } else {
+                                    Set<Integer> ruleIdSet = new HashSet<>();
+                                    ruleIdSet.add(medicalInsRuleProject.getMedicineInsRuleInfoId());
+                                    itemCodeAndRuleIdMap.put(medicalInsRuleProjectDiagnose.getMedicalDiagnoseCode(), ruleIdSet);
+                                }
+                            }
+                        }
 //                        setMIDProjectCodeToRedis(medicalInsRuleProject);
                     }
                 }
@@ -200,14 +208,6 @@ public class RuleEngine {
         }
     }
 
-    public Integer getMIDMedicalId(String itemCode) {
-        Object medicineInsRuleId = redisTemplate.opsForHash().get(Constant.MEDICAL_RULE_CACHE_KEY, itemCode);
-//        redisTemplate.opsForSet().add(Constant.MEDICAL_RULE_CACHE_KEY)
-        if (null != medicineInsRuleId) {
-            return (Integer) medicineInsRuleId;
-        }
-        return null;
-    }
 
     public Result dealMidInterfaceEngin(String intefName, MidIncidentWarningVO midIncidentWarningVO, String ipStr) {
         midIncidentWarningVOThreadLocal.set(midIncidentWarningVO);
@@ -233,10 +233,13 @@ public class RuleEngine {
                 }
                 Object diagnose = itemMap.get(Constant.MEDICAL_DIAGNOSE_CODE_KEY);
                 if (null != diagnose) {
+                    List<Object> diagnoseList = (List<Object>) diagnose;
                     //获取诊断编码配置的规则ID,加入需要执行的规则
-                    Set<Integer> diagnoseMedicalInsRuleInfoIdList = itemCodeAndRuleIdMap.get(diagnose.toString());
-                    if (CollectionUtil.isNotEmpty(diagnoseMedicalInsRuleInfoIdList)) {
-                        medicalInsRuleInfoIdList.addAll(diagnoseMedicalInsRuleInfoIdList);
+                    for (Object diagnoseObject : diagnoseList) {
+                        Set<Integer> diagnoseMedicalInsRuleInfoIdList = itemCodeAndRuleIdMap.get(diagnoseObject.toString());
+                        if (CollectionUtil.isNotEmpty(diagnoseMedicalInsRuleInfoIdList)) {
+                            medicalInsRuleInfoIdList.addAll(diagnoseMedicalInsRuleInfoIdList);
+                        }
                     }
                 }
                 runMidEngine(auditDetailSet, itemMap, medicalInsRuleInfoIdList, midIncidentAudit, ipStr);
@@ -251,43 +254,51 @@ public class RuleEngine {
     }
 
 
-    public Result dealAfterInterfaceEngin(String intefName, AfterIncidentLog afterIncidentLog, AfterIncidentDetailLog afterIncidentDetailLog) {
+    /**
+     * 事后明细
+     *
+     * @param intefName
+     * @param afterwardsAudit
+     * @param afterIncidentDetailLog
+     */
+    public void dealAfterInterfaceEngin(String intefName, AfterwardsAudit afterwardsAudit, AfterIncidentDetailLog afterIncidentDetailLog) {
 
         try {
-            List<RuleAttr> ruleAttrList = interfRuleAttrList.get(intefName);
-            if (null == ruleAttrList) {
-                return Result.error("接口:" + intefName + " 未配置 对应的规则属性");
-            }
+//            List<RuleAttr> ruleAttrList = interfRuleAttrList.get(intefName);
+//            if (null == ruleAttrList) {
+//
+//                return Result.error("接口:" + intefName + " 未配置 对应的规则属性");
+//            }
             dictUtil.transferAfterIncidentWarning(afterIncidentDetailLog);
             String jsonStr = JSON.toJSONString(afterIncidentDetailLog);
             log.info("事后处理日志:{}", jsonStr);
-            JSONObject paramMap = JSON.parseObject(jsonStr);
-            List<Map<String, Object>> itemList = interfItemListPlugin.findProIntersection(paramMap, ruleAttrList);
-            AfterwardsAudit afterwardsAudit = insertAfterWarning(afterIncidentLog);
+            JSONObject itemMap = JSON.parseObject(jsonStr);
+//            List<Map<String, Object>> itemList = interfItemListPlugin.findProIntersection(paramMap, ruleAttrList);
+
 //            insertAfterWarning(afterwardsAudit);
 //            midIncidentAudit.setInterfName(intefName);
             Set<String> auditDetailSet = new HashSet<>();
-            for (Map<String, Object> itemMap : itemList) {
-                Set<Integer> medicalInsRuleInfoIdList = itemCodeAndRuleIdMap.get(itemMap.get(Constant.MEDICAL_PROJECT_CODE_KEY));
-                if (CollectionUtil.isEmpty(medicalInsRuleInfoIdList)) {
-                    log.error("项目编码未匹配到对应的医保规则:{}", itemMap.get(Constant.MEDICAL_PROJECT_CODE_KEY));
-                    continue;
-                }
-                Object diagnose = itemMap.get(Constant.MEDICAL_DIAGNOSE_CODE_KEY);
-                if (null != diagnose) {
-                    //获取诊断编码配置的规则ID,加入需要执行的规则
-                    Set<Integer> diagnoseMedicalInsRuleInfoIdList = itemCodeAndRuleIdMap.get(diagnose.toString());
-                    if (CollectionUtil.isNotEmpty(diagnoseMedicalInsRuleInfoIdList)) {
-                        medicalInsRuleInfoIdList.addAll(diagnoseMedicalInsRuleInfoIdList);
-                    }
+//            for (Map<String, Object> itemMap : itemList) {
+            Set<Integer> medicalInsRuleInfoIdList = itemCodeAndRuleIdMap.get(itemMap.get(Constant.MEDICAL_PROJECT_CODE_KEY));
+            if (CollectionUtil.isEmpty(medicalInsRuleInfoIdList)) {
+                log.error("项目编码未匹配到对应的医保规则:{}", itemMap.get(Constant.MEDICAL_PROJECT_CODE_KEY));
+                return;
+            }
+            Object diagnose = itemMap.get(Constant.MEDICAL_DIAGNOSE_CODE_KEY);
+            if (null != diagnose) {
+                //获取诊断编码配置的规则ID,加入需要执行的规则
+                Set<Integer> diagnoseMedicalInsRuleInfoIdList = itemCodeAndRuleIdMap.get(diagnose.toString());
+                if (CollectionUtil.isNotEmpty(diagnoseMedicalInsRuleInfoIdList)) {
+                    medicalInsRuleInfoIdList.addAll(diagnoseMedicalInsRuleInfoIdList);
                 }
-//                runAfterEngine(auditDetailSet, itemMap, medicalInsRuleInfoIdList, midIncidentAudit, ipStr);
             }
+            runAfterEngine(auditDetailSet, itemMap, medicalInsRuleInfoIdList, afterwardsAudit);
+//            }
         } catch (Exception e) {
             log.error(e.getMessage(), e);
         }
 
-        return Result.ok();
+//        return Result.ok();
     }
 
 
@@ -298,6 +309,11 @@ public class RuleEngine {
         midIncidentVisitLog.setVisitNo(midIncidentWarningVO.getVisit_no());
         midIncidentVisitLog.setPatientId(midIncidentWarningVO.getPatient_id());
         midIncidentVisitLog.setPatientName(midIncidentWarningVO.getPatient_name());
+        midIncidentVisitLog.setDoctorLevel(midIncidentWarningVO.getDoctor_level());
+        midIncidentVisitLog.setPatientAge(midIncidentWarningVO.getPatient_age());
+        midIncidentVisitLog.setPatientGender(midIncidentWarningVO.getPatient_gender());
+        midIncidentVisitLog.setDischargeStatus(midIncidentWarningVO.getDischarge_status());
+        midIncidentVisitLog.setTotoalAmount(midIncidentWarningVO.getTotoal_amount());
         if (CollectionUtil.isNotEmpty(midIncidentWarningVO.getDiagnoses())) {
             midIncidentVisitLog.setDiagnoses(JSON.toJSONString(midIncidentWarningVO.getDiagnoses()));
         }
@@ -353,6 +369,7 @@ public class RuleEngine {
                 midIncidentVisitDetailLog.setProejctName(adviceDetailsVO.getProject_name());
                 midIncidentVisitDetailLog.setPatientId(midIncidentWarningVO.getPatient_id());
                 midIncidentVisitDetailLog.setPatientId(midIncidentWarningVO.getPatient_name());
+                midIncidentVisitDetailLog.setAmount(new BigDecimal(adviceDetailsVO.getAmount()));
                 midIncidentVisitDetailLogList.add(midIncidentVisitDetailLog);
             }
             midIncidentVisitDetailLogService.saveBatch(midIncidentVisitDetailLogList);
@@ -372,7 +389,19 @@ public class RuleEngine {
         midIncidentAudit.setTreatmentType(midIncidentWarningVO.getVisit_type());
         midIncidentAudit.setPrescriptionNumber(midIncidentWarningVO.getDoctor_advice_no());
         midIncidentAudit.setNoticeType("事中预警");
+
         midIncidentAuditService.save(midIncidentAudit);
+        double allAmount = 0;
+        if (null != midIncidentWarningVO.getTotoal_amount() && midIncidentWarningVO.getTotoal_amount() > 0) {
+            allAmount = midIncidentWarningVO.getTotoal_amount();
+        } else {
+            if (CollectionUtil.isNotEmpty(midIncidentWarningVO.getAdvice_details())) {
+                for (AdviceDetailsVO adviceDetailsVO : midIncidentWarningVO.getAdvice_details()) {
+                    allAmount = allAmount + adviceDetailsVO.getAmount();
+                }
+            }
+        }
+        midIncidentAudit.setAmount(allAmount);
         if (CollectionUtil.isNotEmpty(midIncidentWarningVO.getDiagnoses())) {
             List<MidIncidentAuditDiagnose> midIncidentAuditDiagnoseList = new ArrayList<>();
             for (DiagnosesVO diagnosesVO : midIncidentWarningVO.getDiagnoses()) {
@@ -440,63 +469,13 @@ public class RuleEngine {
         return afterwardsAudit;
     }
 
-    public List<Integer> getMedicalInsRuleInfoIdByIntef(String intefName, Map<String, Object> paramMap, List<RuleAttr> ruleAttrList) {
-
-        List<Integer> medicalIdList = new ArrayList<>();
-        Map<String, List<Integer>> itemCodeAndRuleIdMap = new HashMap<>();
-        for (RuleAttr ruleAttr : ruleAttrList) {
-            String itemCode = null;
-            if (StringUtils.isNotBlank(ruleAttr.getAttrPath())) {
-                Object value = paramMap.get(ruleAttr.getAttrPath());
-                if (null == value) {
-                    log.error("接口调用:{} 不存在 属性路径:{}", intefName, ruleAttr.getAttrPath());
-                    break;
-                }
-                String attrName = ruleAttr.getRuleAttr();
-                if (value instanceof List) {
-                    List<Map<String, Object>> pathValueList = (List<Map<String, Object>>) value;
-                    for (Map<String, Object> itemMap : pathValueList) {
-                        Object itemCodeTemp = itemMap.get(attrName);
-                        if (null != itemCodeTemp) {
-                            itemCode = (String) itemCodeTemp;
-                            Integer medicineInsRuleId = getMIDMedicalId(itemCode);
-                            if (null != medicineInsRuleId) {
-                                medicalIdList.add(medicineInsRuleId);
-                            }
-                        }
-                    }
-                } else if (value instanceof Map) {
-                    Map<String, Object> pathValueMap = (Map) value;
-                    Object itemCodeTemp = pathValueMap.get(attrName);
-                    if (null != itemCodeTemp) {
-                        itemCode = (String) itemCodeTemp;
-                        Integer medicineInsRuleId = getMIDMedicalId(itemCode);
-                        if (null != medicineInsRuleId) {
-                            medicalIdList.add(medicineInsRuleId);
-                        }
-                    }
-                }
-            } else {
-                Object itemCodeObject = paramMap.get(ruleAttr.getRuleAttr());
-                if (null != itemCodeObject) {
-                    Integer medicineInsRuleId = getMIDMedicalId(itemCodeObject.toString());
-                    if (null != medicineInsRuleId) {
-                        medicalIdList.add(medicineInsRuleId);
-                    }
-                }
-            }
-        }
-
-//        paramMap.put("itemList", itemList);
-        return medicalIdList;
-    }
 
     /**
      * 事中跑批规则引擎
      *
      * @param paramMap
      */
-    public void runAfterEngine(Set<String> auditDetailSet, Map<String, Object> paramMap, Set<Integer> medicalInsRuleInfoIdList, MidIncidentAudit midIncidentAudit, String ipStr) {
+    public void runAfterEngine(Set<String> auditDetailSet, Map<String, Object> paramMap, Set<Integer> medicalInsRuleInfoIdList, AfterwardsAudit afterIncidentAudit) {
         if (CollectionUtil.isEmpty(medicalInsRuleInfoIdList)) {
             log.error("未有对应的规则,接口数据:{}", paramMap);
             return;
@@ -509,7 +488,6 @@ public class RuleEngine {
 
         if (CollectionUtil.isNotEmpty(ruleFactorRelaList)) {
             Map<Integer, List<RuleFactorRela>> ruleIdAndFatorEnchanceIdMap = ruleFactorRelaList.stream().collect(Collectors.groupingBy(RuleFactorRela::getMedicalInsRuleInfoId));
-//            Map<Integer, RuleFactorRela> factorEnchanceRuleIdMap = ruleFactorRelaList.stream().collect(Collectors.toMap(RuleFactorRela::getFactorEnhanceId, v -> v, (v1, v2) -> v1));
             Set<Integer> factorEnchangeIdList = ruleFactorRelaList.stream().map(RuleFactorRela::getFactorEnhanceId).collect(Collectors.toSet());
             List<FactorEnchance> factorEnchanceList = factorEnchanceService.listByIds(factorEnchangeIdList);
             Map<Integer, List<FactorEnchance>> enchanceTypeMap = factorEnchanceList.stream().collect(Collectors.groupingBy(FactorEnchance::getFactorCatalog));
@@ -525,10 +503,13 @@ public class RuleEngine {
                 paramMap.put(SystemEventAttrConstant.MEDICAL_INS_RULE_INFO_ID, medicalRuleInsInfoId);
                 List<RuleFactorRela> ruleFactorRelaSortList = ruleIdAndFatorEnchanceIdMap.get(medicalRuleInsInfoId);
 
-                factorEnchangeFactory.runFactorEnchange(medicalRuleInsInfoId, medicalInsRuleInfo, midIncidentAudit, paramMap, ruleFactorRelaSortList, factorEnchanceListTemp);
+                boolean auditFlag = factorEnchangeFactory.runFactorEnchange(medicalRuleInsInfoId, medicalInsRuleInfo, afterIncidentAudit, paramMap, ruleFactorRelaSortList, factorEnchanceListTemp);
+                if (Constant.VALIDATION_HANDER_METHOD_RETURN.equals(medicalInsRuleInfo.getViolationHandingMethod()) && auditFlag) {
+                    log.error("事后提醒数据:{} 规则名:{} 触发诊断类规则,直接全金额,后续规则无需再跑", paramMap, medicalInsRuleInfo);
+                    return;
+                }
             }
         }
-        webSocket.pushMessage(ipStr, JSON.toJSONString(midIncidentAudit));
     }
 
     /**
@@ -565,7 +546,12 @@ public class RuleEngine {
                 paramMap.put(SystemEventAttrConstant.MEDICAL_INS_RULE_INFO_ID, medicalRuleInsInfoId);
                 List<RuleFactorRela> ruleFactorRelaSortList = ruleIdAndFatorEnchanceIdMap.get(medicalRuleInsInfoId);
 
-                factorEnchangeFactory.runFactorEnchange(medicalRuleInsInfoId, medicalInsRuleInfo, midIncidentAudit, paramMap, ruleFactorRelaSortList, factorEnchanceListTemp);
+//                factorEnchangeFactory.runFactorEnchange(medicalRuleInsInfoId, medicalInsRuleInfo, midIncidentAudit, paramMap, ruleFactorRelaSortList, factorEnchanceListTemp);
+                boolean auditFlag = factorEnchangeFactory.runFactorEnchange(medicalRuleInsInfoId, medicalInsRuleInfo, midIncidentAudit, paramMap, ruleFactorRelaSortList, factorEnchanceListTemp);
+                if (Constant.VALIDATION_HANDER_METHOD_RETURN.equals(medicalInsRuleInfo.getViolationHandingMethod()) && auditFlag) {
+                    log.error("事中提醒数据:{} 规则名:{} 触发诊断类规则,直接全金额,后续规则无需再跑", paramMap, medicalInsRuleInfo);
+                    return;
+                }
             }
         }
         webSocket.pushMessage(ipStr, JSON.toJSONString(midIncidentAudit));

+ 33 - 16
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/dict/DictUtil.java

@@ -14,6 +14,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -161,25 +163,40 @@ public class DictUtil {
      * @param afterIncidentDetailLog
      */
     public void transferAfterIncidentWarning(AfterIncidentDetailLog afterIncidentDetailLog) {
-        if (StringUtils.isNotBlank(afterIncidentDetailLog.getDiagnose_code())) {
-
-
-            Object value = redisTemplate.opsForHash().get(Constant.HIS_MEDICAL_DICT_KEY, afterIncidentDetailLog.getDiagnose_code());
-            if (value == null) {
-                log.error("字段未配置该诊断编码映射的医保记录,项目:{}", afterIncidentDetailLog);
-                value = afterIncidentDetailLog.getDiagnose_code();
-                afterIncidentDetailLog.setMedical_diagnose_code(value.toString());
-                afterIncidentDetailLog.setMedical_diagnose_name(afterIncidentDetailLog.getDiagnose_desc());
-            }else {
-                afterIncidentDetailLog.setMedical_diagnose_code(value.toString());
+        if (StringUtils.isNotBlank(afterIncidentDetailLog.getDiagnose_code_str())) {
+
+            String[] diagnoseCodeArr = afterIncidentDetailLog.getDiagnose_code_str().split(Constant.SPLIT_STR);
+            StringBuffer medicalDiagnoseNameStr = new StringBuffer();
+            StringBuffer medicalDiagnoseCodeStr = new StringBuffer();
+            List<String> medicalDiagnoseNameList = new ArrayList<>();
+            List<String> medicalDiagnoseCodeList = new ArrayList<>();
+            for(String diagnose_code : diagnoseCodeArr) {
+                Object value = redisTemplate.opsForHash().get(Constant.HIS_MEDICAL_DICT_KEY, diagnose_code);
+                if (value == null) {
+                    log.error("字段未配置该诊断编码映射的医保记录,项目:{}", afterIncidentDetailLog);
+//                    value = diagnose_code;
+//                    medicalDiagnoseCodeStr.append(value).append(Constant.SPLIT_STR);
+//                    medicalDiagnoseNameStr.append(afterIncidentDetailLog.getDiagnose_desc())
+//                    afterIncidentDetailLog.setMedical_diagnose_code(value.toString());
+//                    afterIncidentDetailLog.setMedical_diagnose_name(afterIncidentDetailLog.getDiagnose_desc());
+                } else {
+                    medicalDiagnoseCodeStr.append(value).append(Constant.SPLIT_STR);
+                    medicalDiagnoseCodeList.add(value.toString());
+
+//                    medicalDiagnoseNameStr.append(afterIncidentDetailLog.getDiagnose_desc())
+//                    afterIncidentDetailLog.setMedical_diagnose_code(value.toString());
 //                        itemMap.put(Constant.MEDICAL_DIAGNOSE_CODE_KEY, value);
-                Object name = redisTemplate.opsForHash().get(Constant.MEDICAL_CODE_NAME_KEY, value.toString());
-                if (null != name) {
-                    afterIncidentDetailLog.setMedical_diagnose_name(name.toString());
+                    Object name = redisTemplate.opsForHash().get(Constant.MEDICAL_CODE_NAME_KEY, value.toString());
+                    if (null != name) {
+                        medicalDiagnoseNameStr.append(name).append(Constant.SPLIT_STR);
+                        medicalDiagnoseNameList.add(name.toString());
+                    }
                 }
             }
-
-
+            afterIncidentDetailLog.setMedical_diagnose_code_str(medicalDiagnoseCodeStr.toString());
+            afterIncidentDetailLog.setMedical_diagnose_name_str(medicalDiagnoseNameStr.toString());
+            afterIncidentDetailLog.setMedical_diagnose_code(medicalDiagnoseCodeList);
+            afterIncidentDetailLog.setMedical_diagnose_name(medicalDiagnoseNameList);
         }
 
 

+ 26 - 2
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/plugin/InterfItemListPlugin.java

@@ -30,12 +30,22 @@ public class InterfItemListPlugin {
                     break;
                 }
                 String attrName = ruleAttr.getRuleAttr();
+                Integer attrType = ruleAttr.getAttrType();
                 if (value instanceof List) {
                     List<Map<String, Object>> pathValueList = (List<Map<String, Object>>) value;
                     if(CollectionUtil.isEmpty(itemList)){
-                        itemList = pathValueList;
+                        if(1 == attrType) {
+                            itemList = pathValueList;
+                        }else{
+                            log.error("项目编码未排序在最前端,请调整rule_attr表配置");
+                        }
+
                     }else {
-                        itemList = setListToList(itemList, pathValueList, attrName);
+                        if(2 == attrType){
+                            setListAttrToList(itemList, pathValueList, attrName);
+                        }else {
+                            itemList = setListToList(itemList, pathValueList, attrName);
+                        }
                     }
                 }else if(value instanceof Map){
                     Map<String,Object> pathValueMap = (Map) value;
@@ -57,6 +67,20 @@ public class InterfItemListPlugin {
         return itemList;
     }
 
+    public void setListAttrToList(List<Map<String,Object>> srcItemList, List<Map<String,Object>> itemTempList, String attrName){
+        List<Map<String,Object>> resultList = new ArrayList<>();
+        Map<String,Object> temMap = null;
+        List<Object> itemTempObjectList = new ArrayList<>();
+        for(Map<String,Object> itemTempMap : itemTempList){
+
+            itemTempObjectList.add(itemTempMap.get(attrName));
+        }
+        for(Map<String,Object> itemMap : srcItemList){
+
+            itemMap.put(attrName, itemTempObjectList);
+        }
+    }
+
     public List<Map<String,Object>> setListToList(List<Map<String,Object>> itemList, List<Map<String,Object>> itemTempList, String attrName){
         List<Map<String,Object>> resultList = new ArrayList<>();
         Map<String,Object> temMap = null;

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

@@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 /**
  * @Description: mid_incident_visit_log
  * @Author: jeecg-boot
- * @Date:   2023-05-12 09:23:36
+ * @Date:   2023-05-21 18:30:54
  * @Version: V1.0
  */
 public interface IMidIncidentVisitLogService extends IService<MidIncidentVisitLog> {

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

@@ -10,7 +10,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 /**
  * @Description: mid_incident_visit_log
  * @Author: jeecg-boot
- * @Date:   2023-05-12 09:23:36
+ * @Date:   2023-05-21 18:30:54
  * @Version: V1.0
  */
 @Service

+ 39 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/threadpool/CommonExecutePool.java

@@ -0,0 +1,39 @@
+package org.jeecg.modules.medical.threadpool;
+
+import org.jeecg.modules.medical.CommonThreadPoolConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * @author lindong
+ * @version CdrExecutePool v 0.1 2019/4/2 9:39
+ */
+
+@Configuration
+@EnableAsync
+public class CommonExecutePool {
+
+    @Autowired
+    private CommonThreadPoolConfig config;
+
+    @Bean
+    public Executor commonTaskAsyncPool() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        executor.setCorePoolSize(config.getCorePoolSize());
+        executor.setMaxPoolSize(config.getMaxPoolSize());
+        executor.setQueueCapacity(config.getQueueCapacity());
+        executor.setKeepAliveSeconds(config.getKeepAliveSeconds());
+        executor.setThreadNamePrefix("CdrExecutor-");
+        // CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        executor.initialize();
+        return executor;
+    }
+
+}

+ 20 - 1
jeecg-module-system/jeecg-system-start/src/main/resources/application.yml

@@ -2,4 +2,23 @@ spring:
   application:
     name: jeecg-system
   profiles:
-    active: dev
+    active: dev
+
+
+cdr:
+
+  threadpool: #线程池配置
+
+    corePoolSize: 6
+
+    maxPoolSize: 100
+
+    keepAliveSeconds: 60
+
+    queueCapacity: 500
+
+  record:
+
+    batchSize: 10000 #记录批次,达到这个数量就进行数据发送,不用等到全部解析
+
+    bigFileSize: 10000 #单位是M