Browse Source

时候his接口

0027005599 2 years ago
parent
commit
54597dfe81
13 changed files with 441 additions and 35 deletions
  1. 20 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/common/CommonUtil.java
  2. 38 2
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/controller/HisController.java
  3. 20 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/HospMidIncidentWarningVO.java
  4. 6 3
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/MidIncidentWarningVO.java
  5. 15 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/MidResult.java
  6. 25 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/MidRule.java
  7. 2 2
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/job/XCFYDatav_outpatient_settle_billJob.java
  8. 4 4
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/job/XCFYDatav_outpatient_settle_detailsJob.java
  9. 24 21
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/FactorEnchangeFactory.java
  10. 250 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/HospGetDataToRuleEngine.java
  11. 2 2
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/RuleEngine.java
  12. 1 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/dict/DictUtil.java
  13. 34 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/threadpool/MidRunRuleEngineCallable.java

+ 20 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/common/CommonUtil.java

@@ -132,7 +132,7 @@ public class CommonUtil {
             }else if("未知".equals(patientGenderStr)){
                 patientGenderInt = "0";
             }else {
-                patientGenderInt = "9";
+                patientGenderInt = patientGenderStr;
             }
             return patientGenderInt;
         }
@@ -168,6 +168,25 @@ public class CommonUtil {
         return cateGoriesMap;
     }
 
+    public static void setProjectType(Map<String,Object> dataMap){
+        Object projectType = dataMap.get("PROJECT_TYPE");
+        if(null != projectType){
+            String projectTypeStr = projectType.toString();
+            if("药品".equals(projectTypeStr)){
+                projectTypeStr = "medicine";
+            }else if("诊断".equals(projectTypeStr)){
+                projectTypeStr = "diagnoses";
+            }else if("耗材".equals(projectTypeStr)){
+                projectTypeStr = "consumable";
+            }else if("手术".equals(projectTypeStr)){
+                projectTypeStr = "operation";
+            }else if("诊疗".equals(projectTypeStr)){
+                projectTypeStr = "diagnosis_treatment";
+            }
+            dataMap.put("PROJECT_TYPE", projectTypeStr);
+        }
+    }
+
 
     public static void main(String[] args) {
 //        String day = "2023-11-09 19:10:11";

+ 38 - 2
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/controller/HisController.java

@@ -20,7 +20,9 @@ import org.jeecg.config.sign.util.HttpUtils;
 import org.jeecg.modules.medical.Constant;
 import org.jeecg.modules.medical.entity.AdvanceWarningVO;
 import org.jeecg.modules.medical.entity.Audit;
+import org.jeecg.modules.medical.entity.HospMidIncidentWarningVO;
 import org.jeecg.modules.medical.entity.MidIncidentWarningVO;
+import org.jeecg.modules.medical.ruleengine.HospGetDataToRuleEngine;
 import org.jeecg.modules.medical.ruleengine.RuleEngine;
 import org.jeecg.modules.medical.service.IAuditService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -53,8 +55,8 @@ import java.util.Map;
 public class HisController extends JeecgController<Audit, IAuditService> {
    @Autowired
    private RuleEngine ruleEngine;
-
-
+    @Autowired
+   private HospGetDataToRuleEngine hospGetDataToRuleEngine;
    /**
     *   事前提醒
     *
@@ -91,6 +93,40 @@ public class HisController extends JeecgController<Audit, IAuditService> {
     }
 
 
+    /**
+     *  事中预警
+     *
+     * @param midIncidentWarningVO
+     * @return
+     */
+    @AutoLog(value = "住院事中预警")
+    @ApiOperation(value="住院事中预警接口", notes="住院事中预警接口调用")
+    @PostMapping(value = "/hospMidIncidentWarning")
+    public Result<String> hospMidIncidentWarning(@RequestBody @Valid HospMidIncidentWarningVO midIncidentWarningVO, HttpServletRequest httpServletRequest) {
+
+        String ipStr = HttpUtils.getIPAddress(httpServletRequest);
+        log.info("住院事中远端请求的服务ip地址:{}", ipStr);
+        return hospGetDataToRuleEngine.getHopsDataByVisiVo(midIncidentWarningVO);
+    }
+
+
+
+    /**
+     *  事中预警
+     *
+     * @param midIncidentWarningVO
+     * @return
+     */
+    @AutoLog(value = "门诊事中预警")
+    @ApiOperation(value="门诊事中预警接口", notes="门诊事中预警接口调用")
+    @PostMapping(value = "/outpatientMidIncidentWarning")
+    public Result<String> outpatientMidIncidentWarning(@RequestBody @Valid MidIncidentWarningVO midIncidentWarningVO,HttpServletRequest httpServletRequest) {
+
+        String ipStr = HttpUtils.getIPAddress(httpServletRequest);
+        log.info("事中远端请求的服务ip地址:{}", ipStr);
+        return ruleEngine.dealMidInterfaceEngin("midIncidentWarning", midIncidentWarningVO, ipStr);
+    }
+
 
 
     /**

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

@@ -0,0 +1,20 @@
+package org.jeecg.modules.medical.entity;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.util.List;
+
+/**
+ * 住院事中预警接口类
+ * @author 林栋
+ */
+@Data
+@ApiModel(value="住院事中预警接口参数类", description="hospMidIncidentWarning")
+public class HospMidIncidentWarningVO {
+    @NotBlank(message = "住院登记号不能为空")
+    private String visit_no;//门诊挂号号/住院登记号
+    @NotBlank(message = "病人编号不能为空")
+    private String patient_id;//病人ID
+}

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

@@ -19,7 +19,6 @@ public class MidIncidentWarningVO {
     private String medical_dept_code;//科室编码
     @NotBlank(message = "科室名称不能为空")
     private String medical_dept_name;//科室名称
-    @NotBlank(message = "就诊类型不能为空(1:住院、2:门诊)")
     private String visit_type;//就诊类型(1住院、2门诊)
     /**
      * 险种类别
@@ -51,14 +50,18 @@ public class MidIncidentWarningVO {
      * 病人年龄
      */
     @NotBlank(message = "病人年龄不能为空,当为新生儿,传天数")
-    private Integer patient_age;
+    private String patient_age;
+
+    /**
+     * 年龄天数
+     */
+    private Integer patientAgeDays;
     /**
      * 离院方式
      * 1.医嘱离院 2.医嘱转院、转社区、转卫生机构 3.非医嘱离院 4.死亡 9.其他
      */
     private String discharge_status;
     private List<DiagnosesVO> diagnoses;	//true	Array	诊断信息(多项)(内容说明参见Diagnoses(诊断信息说明)
-    @NotBlank(message = "处方流水号不能为空")
     private String doctor_advice_no;//true	char	处方流水号(医院内部唯一号)
     @NotBlank(message = "医师编号不能为空")
     private String doctor_code;//	true	char	医师编号

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

@@ -0,0 +1,15 @@
+package org.jeecg.modules.medical.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 事中返回接口对象
+ */
+@Data
+public class MidResult {
+    private Integer id;
+    private Boolean violationFlag;
+    private List<MidRule> ruleCodeList;
+}

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

@@ -0,0 +1,25 @@
+package org.jeecg.modules.medical.entity;
+
+import lombok.Data;
+
+/**
+ * 事中违反规则对象
+ */
+@Data
+public class MidRule {
+    /**
+     *  "ruleCode": "", //违反医保规则编码
+     *       "ruleName": "", //规则名称
+     *       "violationLevel": "", //违规等级
+     *       "description": "", //规则处理结果
+     *       "treatmentType": "", //就诊类型
+     *       "abnormalAmount": 0.0 //异常金额
+     */
+
+    private String ruleCode;
+    private String ruleName;
+    private String violationLevel;
+    private String description;
+    private String treatmentType;
+    private Double abnormalAmount;
+}

+ 2 - 2
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/job/XCFYDatav_outpatient_settle_billJob.java

@@ -155,7 +155,7 @@ public class XCFYDatav_outpatient_settle_billJob implements Job {
     }
 
     public Integer getDetailByHisId(String hisId) {
-        String sql = "select * from V_YBKF_OUTPATIENT_SETTLE_DETAILS where hisid=:HISID and item_id is not null";
+        String sql = "select * from V_YBKF_OUTPATIENT_SETTLE_DEL where hisid=:HISID and item_id is not null";
 //        List<DictModel> cateGoriesList = sysDictService.getDictItems(Constant.DICT_CATEGORIES_ITEMS_KEY);
         Map<String, String> cateGoriesMap = CommonUtil.getCategoriesItemsMap();
 //        for (DictModel dictModel : cateGoriesList) {
@@ -189,7 +189,7 @@ public class XCFYDatav_outpatient_settle_billJob implements Job {
                 return true;
             }
         });
-        log.info("结束同步V_YBKF_OUTPATIENT_SETTLE_DETAILS数据,HISID:{} 条数:{}", hisId, count);
+        log.info("结束同步V_YBKF_OUTPATIENT_SETTLE_DEL数据,HISID:{} 条数:{}", hisId, count);
         return count;
 
 

+ 4 - 4
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/job/XCFYDatav_outpatient_settle_detailsJob.java

@@ -49,7 +49,7 @@ public class XCFYDatav_outpatient_settle_detailsJob implements Job {
 
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
-        String sql = "select * from V_YBKF_OUTPATIENT_SETTLE_DETAILS where rownum<1000 %s";
+        String sql = "select * from V_YBKF_OUTPATIENT_SETTLE_DEL where rownum<1000 %s";
 //        String sql = "SELECT A.*, ROWNUM RN FROM (SELECT * FROM V_OUTPATIENT_SETTLE_DETAILS) A WHERE ROWNUM < 1000 %s";
         List<DictModel> cateGoriesList = sysDictService.getDictItems(Constant.DICT_CATEGORIES_ITEMS_KEY);
         Map<String, String> cateGoriesMap = new HashMap<>();
@@ -57,10 +57,10 @@ public class XCFYDatav_outpatient_settle_detailsJob implements Job {
             cateGoriesMap.put(dictModel.getText(), dictModel.getValue());
         }
         while (true) {
-            log.info("开始同步V_YBKF_outpatient_settle_details数据");
+            log.info("开始同步V_YBKF_OUTPATIENT_SETTLE_DEL数据");
             String whereSql = "";
             Long hsdId = getLastId();
-            log.info("开始同步V_YBKF_outpatient_settle_details数据,获取上个同步记录访问最大主键ID:{}", hsdId);
+            log.info("开始同步V_YBKF_OUTPATIENT_SETTLE_DEL数据,获取上个同步记录访问最大主键ID:{}", hsdId);
             Map<String, Object> paramMap = new HashMap<>();
             if (null != hsdId && hsdId > 0) {
                 whereSql = "and ID>:ID";
@@ -95,7 +95,7 @@ public class XCFYDatav_outpatient_settle_detailsJob implements Job {
                 }
             });
             if (count <= 0) {
-                log.info("V_YBKF_outpatient_settle_details 大于ID:{} 没有的数据,停止同步", hsdId);
+                log.info("V_YBKF_OUTPATIENT_SETTLE_DEL 大于ID:{} 没有的数据,停止同步", hsdId);
                 return;
             }
         }

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

@@ -353,25 +353,25 @@ public class FactorEnchangeFactory {
     }
 
     public void insertMidWarningDetail(Map<String, Object> itemMap, MedicalInsRuleInfo medicalInsRuleInfo, MidIncidentAudit midIncidentAudit, List<Map<String, Object>> itemList) {
-        MidIncidentWarningVO midIncidentWarningVO = RuleEngine.midIncidentWarningVOThreadLocal.get();
 
         if (Constant.VALIDATION_HANDER_METHOD_RETURN.equals(medicalInsRuleInfo.getViolationHandingMethod())) {
             midIncidentAuditService.lambdaUpdate().set(MidIncidentAudit::getAmount, midIncidentAudit.getAmount()).eq(MidIncidentAudit::getId, midIncidentAudit.getId()).update();
-            QueryWrapper<MidIncidentAuditDetail> queryWrapper = new QueryWrapper();
-            queryWrapper.eq("mid_incident_audit_id", midIncidentAudit.getId());
-            midIncidentAuditDetailService.remove(queryWrapper);
             List<MidIncidentAuditDetail> otherList = new ArrayList();
             for (Map<String, Object> otherItemMap : itemList) {
                 MidIncidentAuditDetail midIncidentAuditDetail = new MidIncidentAuditDetail();
-                midIncidentAuditDetail.setMedicalDeptCode(midIncidentWarningVO.getMedical_dept_code());
-                midIncidentAuditDetail.setMedicalDeptName(midIncidentWarningVO.getMedical_dept_name());
+                midIncidentAuditDetail.setMedicalDeptCode(itemMap.get("medical_dept_code").toString());
+                midIncidentAuditDetail.setMedicalDeptName(itemMap.get("medical_dept_name").toString());
                 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.setDoctorName(itemMap.get("doctor_name").toString());
+                midIncidentAuditDetail.setDoctorId(itemMap.get("doctor_code").toString());
+                midIncidentAuditDetail.setPatientId(itemMap.get("patient_id").toString());
+                midIncidentAuditDetail.setPatientName(itemMap.get("patient_name").toString());
+                String treatmentType = medicalInsRuleInfo.getTreatmentType();
+                if(otherItemMap.containsKey("visit_type")){
+                    treatmentType = otherItemMap.get("visit_type").toString();
+                }
+                midIncidentAuditDetail.setTreatmentType(treatmentType);
                 midIncidentAuditDetail.setNoticeType("middle");
                 midIncidentAuditDetail.setMedicalInsRuleInfoCode(medicalInsRuleInfo.getRuleCode());
                 midIncidentAuditDetail.setMedicalInsRuleInfoId(medicalInsRuleInfo.getId());
@@ -413,15 +413,19 @@ public class FactorEnchangeFactory {
             MidIncidentAuditDetail midIncidentAuditDetail = new MidIncidentAuditDetail();
             midIncidentAuditDetail.setAmount(midIncidentAudit.getAmount());
             BigDecimal amount = (BigDecimal) itemMap.getOrDefault(Constant.AMOUNT_KEY, 0);
-            midIncidentAuditDetail.setMedicalDeptCode(midIncidentWarningVO.getMedical_dept_code());
-            midIncidentAuditDetail.setMedicalDeptName(midIncidentWarningVO.getMedical_dept_name());
+            midIncidentAuditDetail.setMedicalDeptCode(itemMap.get("medical_dept_code").toString());
+            midIncidentAuditDetail.setMedicalDeptName(itemMap.get("medical_dept_name").toString());
             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.setDoctorName(itemMap.get("doctor_name").toString());
+            midIncidentAuditDetail.setDoctorId(itemMap.get("doctor_code").toString());
+            midIncidentAuditDetail.setPatientId(itemMap.get("patient_id").toString());
+            midIncidentAuditDetail.setPatientName(itemMap.get("patient_name").toString());
+            String treatmentType = medicalInsRuleInfo.getTreatmentType();
+            if(itemMap.containsKey("visit_type")){
+                treatmentType = itemMap.get("visit_type").toString();
+            }
+            midIncidentAuditDetail.setTreatmentType(treatmentType);
             midIncidentAuditDetail.setNoticeType("middle");
             midIncidentAuditDetail.setMedicalInsRuleInfoCode(medicalInsRuleInfo.getRuleCode());
             midIncidentAuditDetail.setMedicalInsRuleInfoId(medicalInsRuleInfo.getId());
@@ -444,12 +448,11 @@ public class FactorEnchangeFactory {
             midIncidentAuditDetail.setSingleDoseNumber((Integer) itemMap.getOrDefault(SystemEventAttrConstant.SINGLE_DOSE_NUMBER, 0));
             midIncidentAuditDetail.setSingleDoseUnit((String) itemMap.getOrDefault(SystemEventAttrConstant.SINGLE_DOSE_UNIT, ""));
             midIncidentAuditDetail.setMedicalSpecification((String) itemMap.getOrDefault(SystemEventAttrConstant.MEDICAL_SPECIFICATION, ""));
-            midIncidentAuditDetail.setMedicalNumber((Float) itemMap.getOrDefault(SystemEventAttrConstant.QUANTITY, 0));
+            midIncidentAuditDetail.setMedicalNumber((Float) itemMap.getOrDefault(SystemEventAttrConstant.QUANTITY, 1));
             midIncidentAuditDetail.setDoseUnit((String) itemMap.getOrDefault(SystemEventAttrConstant.DOSE_UNIT, ""));
-            midIncidentAuditDetail.setUseDay((Integer) itemMap.getOrDefault(SystemEventAttrConstant.USE_DAY, 0));
+            midIncidentAuditDetail.setUseDay((Integer) itemMap.getOrDefault(SystemEventAttrConstant.USE_DAY, 1));
             midIncidentAuditDetail.setProjectType(itemMap.getOrDefault(Constant.PROJECT_TYPE_KEY, "default").toString());
             midIncidentAuditService.lambdaUpdate().setSql("amount = amount +" + amount.doubleValue()).eq(MidIncidentAudit::getId, midIncidentAudit.getId()).update();
-
             midIncidentAuditDetailService.save(midIncidentAuditDetail);
         }
 

+ 250 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/HospGetDataToRuleEngine.java

@@ -0,0 +1,250 @@
+package org.jeecg.modules.medical.ruleengine;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.util.dynamic.db.DynamicDBUtil;
+import org.jeecg.modules.medical.Constant;
+import org.jeecg.modules.medical.SystemEventAttrConstant;
+import org.jeecg.modules.medical.common.CommonUtil;
+import org.jeecg.modules.medical.entity.AdviceDetailsVO;
+import org.jeecg.modules.medical.entity.DiagnosesVO;
+import org.jeecg.modules.medical.entity.HospMidIncidentWarningVO;
+import org.jeecg.modules.medical.entity.MedicalInsRuleProject;
+import org.jeecg.modules.medical.entity.MidIncidentAudit;
+import org.jeecg.modules.medical.entity.MidIncidentAuditDetail;
+import org.jeecg.modules.medical.entity.MidIncidentWarningVO;
+import org.jeecg.modules.medical.entity.MidResult;
+import org.jeecg.modules.medical.entity.MidRule;
+import org.jeecg.modules.medical.ruleengine.dict.DictUtil;
+import org.jeecg.modules.medical.ruleengine.plugin.InterfItemListPlugin;
+import org.jeecg.modules.medical.service.IMedicalInsRuleProjectDiagnoseService;
+import org.jeecg.modules.medical.service.IMedicalInsRuleProjectService;
+import org.jeecg.modules.medical.service.IMidIncidentAuditDetailService;
+import org.jeecg.modules.medical.threadpool.MidRunRuleEngineCallable;
+import org.jeecg.modules.utils.DateTimeUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Future;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Component
+public class HospGetDataToRuleEngine {
+    @Autowired
+    InterfItemListPlugin interfItemListPlugin;
+    @Autowired
+    IMedicalInsRuleProjectDiagnoseService medicalInsRuleProjectDiagnoseService;
+    @Autowired
+    IMedicalInsRuleProjectService medicalInsRuleProjectService;
+    @Autowired
+    RuleEngine ruleEngine;
+    @Autowired
+    DictUtil dictUtil;
+    @Resource(name = "commonTaskAsyncPool")
+    ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Autowired
+    IMidIncidentAuditDetailService midIncidentAuditDetailService;
+
+    NamedParameterJdbcTemplate namedParameterJdbcTemplate = DynamicDBUtil.getNamedParameterJdbcTemplate(Constant.FY_ORACLE);
+    String detailSql = "select * from V_YBKF_ADVICE_DETAILS where patient_id=:PATIENT_ID and visit_no=:VISIT_NO and medical_project_code is not null";
+    String diagnoseSql = "select * from V_YBKF_DIAGNOSES where patient_id=:PATIENT_ID and visit_no=:VISIT_NO and medical_diagnose_code is not null";
+
+    public Result getHopsDataByVisiVo(HospMidIncidentWarningVO hospMidIncidentWarningVO) {
+        log.info("接收报文:{}", JSON.toJSONString(hospMidIncidentWarningVO));
+        MidResult midResult = new MidResult();
+        Map<String, Object> paramMap = new HashMap<>();
+        paramMap.put("PATIENT_ID", hospMidIncidentWarningVO.getPatient_id());
+        paramMap.put("VISIT_NO", hospMidIncidentWarningVO.getVisit_no());
+        List<Map<String, Object>> detailList = namedParameterJdbcTemplate.queryForList(detailSql, paramMap);
+        List<Map<String, Object>> diagnoseList = namedParameterJdbcTemplate.queryForList(diagnoseSql, paramMap);
+        List<Map<String, Object>> detailMapList = new ArrayList<>();
+        Double totalAmount = 0.0;
+        Map<String, String> categoriesItemMap = CommonUtil.getCategoriesItemsMap();
+        String visitTime = DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN);
+        for (Map<String, Object> detailMap : detailList) {
+            if (CollectionUtil.isNotEmpty(diagnoseList)) {
+                detailMap.putAll(diagnoseList.get(0));
+            }
+            String pCategory = detailMap.getOrDefault("EXPENSE_CATEGORY", "").toString();
+            if (StringUtils.isNotBlank(pCategory)) {
+                detailMap.put("EXPENSE_CATEGORY", categoriesItemMap.getOrDefault(pCategory, pCategory));
+            }
+            CommonUtil.setDockerLevel(detailMap);
+            CommonUtil.setProjectType(detailMap);
+            Map<String, Object> lowercaseMap = new HashMap<>();
+            for (Map.Entry<String, Object> entry : detailMap.entrySet()) {
+                String lowercaseKey = entry.getKey().toLowerCase();
+                lowercaseMap.put(lowercaseKey, entry.getValue());
+            }
+            if (!lowercaseMap.containsKey("visit_time")) {
+                lowercaseMap.put("visit_time", visitTime);
+            }
+            if (!lowercaseMap.containsKey("visit_type")) {
+                lowercaseMap.put("visit_type", "1");
+            }
+            Double amount = (Double) lowercaseMap.get("amount");
+            totalAmount = totalAmount + amount;
+            Object patientGender = lowercaseMap.get("patient_gender");
+            lowercaseMap.put("patient_gender", CommonUtil.getMedicalSex(patientGender));
+            Object quantity = lowercaseMap.get("quantity");
+            if (null != quantity) {
+                Integer quantityInt = (Integer) quantity;
+                if (quantityInt <= 0) {
+                    lowercaseMap.put("quantity", 1);
+                }
+            } else {
+                lowercaseMap.put("quantity", 1);
+            }
+            detailMapList.add(lowercaseMap);
+        }
+        List<Map<String, Object>> diagnoseMapList = new ArrayList<>();
+        for (Map<String, Object> detailMap : diagnoseList) {
+            Map<String, Object> lowercaseMap = new HashMap<>();
+            for (Map.Entry<String, Object> entry : detailMap.entrySet()) {
+                String lowercaseKey = entry.getKey().toLowerCase();
+                lowercaseMap.put(lowercaseKey, entry.getValue());
+            }
+            diagnoseMapList.add(lowercaseMap);
+        }
+        dealMidInterfaceEngin(detailMapList, diagnoseMapList, totalAmount);
+        log.info("返回报文:{}", JSON.toJSONString(midResult));
+        return Result.OK();
+    }
+
+    public Result dealMidInterfaceEngin(List<Map<String, Object>> detailMapList, List<Map<String, Object>> diagnoseList, Double totalAmount) {
+        MidIncidentWarningVO midIncidentWarningVO = null;
+        midIncidentWarningVO = BeanUtil.mapToBean(detailMapList.get(0), MidIncidentWarningVO.class, true);
+        List<AdviceDetailsVO> adviceDetailsVOList = getAdviceDetailVOList(detailMapList);
+        midIncidentWarningVO.setAdvice_details(adviceDetailsVOList);
+        String patientAge = null;
+        if (null == midIncidentWarningVO.getPatient_age()) {
+            patientAge = "0天";
+        }
+        Integer days = DateTimeUtil.getDayByAgeStr(patientAge);
+        midIncidentWarningVO.setPatientAgeDays(days);
+        midIncidentWarningVO.setTotoal_amount(totalAmount);
+//        midIncidentWarningVO.setVisit_type("1");
+        List<String> diagnoseStrList = new ArrayList<>();
+        List<String> medicalDiagnoseStrList = new ArrayList<>();
+        List<DiagnosesVO> diagnosesVOList = new ArrayList<>();
+        if (CollectionUtil.isNotEmpty(diagnoseList)) {
+            for (Map<String, Object> diagnoseMap : diagnoseList) {
+                diagnoseStrList.add(diagnoseMap.get("diagnose_code").toString());
+                medicalDiagnoseStrList.add(diagnoseMap.get("medical_diagnose_code").toString());
+                DiagnosesVO diagnosesVO = new DiagnosesVO();
+                diagnosesVO.setDiagnose_code(diagnoseMap.get("diagnose_code").toString());
+                diagnosesVO.setDiagnose_desc(diagnoseMap.get("diagnose_desc").toString());
+                diagnosesVO.setMedical_diagnose_code(diagnoseMap.get("medical_diagnose_code").toString());
+                diagnosesVO.setMedical_diagnose_name(diagnoseMap.get("medical_diagnose_name").toString());
+                diagnosesVOList.add(diagnosesVO);
+            }
+            midIncidentWarningVO.setDiagnoses(diagnosesVOList);
+        }
+        MidResult midResult = new MidResult();
+        try {
+            MidIncidentAudit midIncidentAudit = ruleEngine.insertMidWarning(midIncidentWarningVO);
+            ruleEngine.insertLog(midIncidentWarningVO);
+            //callScenario 1=事前  2=事后  3=事前/事后 4=事中 5=事后/事中
+            List<String> callScenarioList = Arrays.asList("4", "5");
+            boolean sendFlag = false;
+            MidRunRuleEngineCallable midRunRuleEngineCallable = null;
+            List<Future> futureList = new ArrayList();
+            for (Map<String, Object> itemMap : detailMapList) {
+                itemMap.put(Constant.MEDICAL_DIAGNOSE_CODE_KEY, medicalDiagnoseStrList);
+                List<MedicalInsRuleProject> medicalInsRuleProjectList = medicalInsRuleProjectService.getRuleProjectByMedicalProjectCode(itemMap.get(Constant.MEDICAL_PROJECT_CODE_KEY).toString(), callScenarioList);
+                if (CollectionUtil.isEmpty(medicalInsRuleProjectList)) {
+                    log.error("项目编码未匹配到对应的医保规则:{} 在规则库数据库中未检索到数据", itemMap.get(Constant.MEDICAL_PROJECT_CODE_KEY));
+                } else {
+                    Set<Integer> medicalInsRuleInfoIdList = medicalInsRuleProjectList.stream().map(MedicalInsRuleProject::getMedicalInsRuleInfoId).collect(Collectors.toSet());
+                    log.info("项目编码:{} 数据库检索到匹配规则ID列表:{}", itemMap.get(Constant.MEDICAL_PROJECT_CODE_KEY), medicalInsRuleInfoIdList);
+                }
+                if (CollectionUtil.isNotEmpty(medicalDiagnoseStrList)) {
+                    //获取诊断编码配置的规则ID,加入需要执行的规则
+                    ruleEngine.getAndSetDiagRule(medicalDiagnoseStrList, medicalInsRuleProjectList);
+                }
+                if (CollectionUtil.isEmpty(medicalInsRuleProjectList)) {
+                    log.error("项目编码未匹配到对应的医保规则:{} 在规则库数据库中未检索到数据,退出规则执行", itemMap.get(Constant.MEDICAL_PROJECT_CODE_KEY));
+                    continue;
+                }
+                Map<Integer, List<MedicalInsRuleProject>> ruleAndProjectMap = medicalInsRuleProjectList.stream().collect(Collectors.groupingBy(MedicalInsRuleProject::getMedicalInsRuleInfoId));
+                itemMap.put(SystemEventAttrConstant.ADVICE_DETAILS_LIST_KEY, detailMapList);
+                for (Integer medicalInsRuleInfoId : ruleAndProjectMap.keySet()) {
+                    List<String> medicalInsCorrProjectCodeList = ruleAndProjectMap.get(medicalInsRuleInfoId).stream().map(MedicalInsRuleProject::getCorrelationProjectCode).collect(Collectors.toList());
+                    MedicalInsRuleProject medicalInsRuleProject = ruleAndProjectMap.get(medicalInsRuleInfoId).get(0);
+                    ruleEngine.setProjectToLocalMap(itemMap, medicalInsRuleProject);
+                    itemMap.put(SystemEventAttrConstant.MEDICAL_INS_CORRELATIONMEDICALDIAGNOSECODE, medicalInsCorrProjectCodeList);
+                    ruleEngine.setItemCodeListToItemMap(detailMapList, itemMap);
+
+                    try {
+                        midRunRuleEngineCallable = new MidRunRuleEngineCallable(itemMap, medicalInsRuleInfoId, midIncidentAudit, detailMapList);
+                        Future future = threadPoolTaskExecutor.submit(midRunRuleEngineCallable);
+                        futureList.add(future);
+                    } catch (Exception e) {
+                        log.error(e.getMessage(), e);
+                    }
+
+                }
+            }
+            for (Future future : futureList) {
+                try {
+                    boolean auditFlag = (boolean) future.get();
+                    sendFlag = auditFlag || sendFlag;
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                }
+            }
+            midResult.setId(midIncidentAudit.getId());
+            midResult.setViolationFlag(sendFlag);
+            if(sendFlag){
+                List<MidIncidentAuditDetail> midIncidentAuditDetailList = midIncidentAuditDetailService.lambdaQuery().eq(MidIncidentAuditDetail::getMidIncidentAuditId, midIncidentAudit.getId()).list();
+                List<MidRule> midRuleList = new ArrayList<>();
+                for(MidIncidentAuditDetail midIncidentAuditDetail : midIncidentAuditDetailList){
+                    MidRule midRule = new MidRule();
+                    midRule.setRuleCode(midIncidentAuditDetail.getMedicalInsRuleInfoCode());
+                    midRule.setRuleName(midIncidentAuditDetail.getMedicalInsRuleInfoName());
+                    midRule.setDescription(midIncidentAuditDetail.getDescription());
+                    midRule.setAbnormalAmount(midIncidentAuditDetail.getAmount());
+                    midRule.setTreatmentType(midIncidentAuditDetail.getTreatmentType());
+                    midRuleList.add(midRule);
+                }
+                midResult.setRuleCodeList(midRuleList);
+            }
+            if (!sendFlag) {
+                log.error("无违规,事中审核无需提醒 门诊/住院号:{}", midIncidentWarningVO.getVisit_no());
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+
+        return Result.ok(midResult);
+    }
+
+    public List<AdviceDetailsVO> getAdviceDetailVOList(List<Map<String, Object>> detailList) {
+        List<AdviceDetailsVO> adviceDetailsVOList = new ArrayList<>();
+        for (Map<String, Object> detailMap : detailList) {
+            AdviceDetailsVO adviceDetailsVO = BeanUtil.mapToBean(detailMap, AdviceDetailsVO.class, true);
+            adviceDetailsVOList.add(adviceDetailsVO);
+        }
+        return adviceDetailsVOList;
+    }
+
+
+}

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

@@ -994,7 +994,7 @@ public class RuleEngine {
         midIncidentAudit.setNoticeType("middle");
         midIncidentAudit.setAmount((double) 0);
         midIncidentAudit.setDoctorLevel(midIncidentWarningVO.getDoctor_level());
-        midIncidentAudit.setPatientAge(midIncidentWarningVO.getPatient_age().toString());
+        midIncidentAudit.setPatientAge(midIncidentWarningVO.getPatient_age());
         midIncidentAudit.setPatientGender(midIncidentWarningVO.getPatient_gender());
         midIncidentAudit.setDischargeStatus(midIncidentWarningVO.getDischarge_status());
         midIncidentAudit.setAllergies(midIncidentWarningVO.getAllergies());
@@ -1220,7 +1220,7 @@ public class RuleEngine {
      *
      * @param paramMap
      */
-    @Async("commonTaskAsyncPool")
+//    @Async("commonTaskAsyncPool")
     public boolean runMidEngine(Map<String, Object> paramMap, Integer medicalRuleInsInfoId, MidIncidentAudit midIncidentAudit, List<Map<String, Object>> itemList) throws Exception {
         boolean auditFlag = false;
         if (null == medicalRuleInsInfoId) {

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

@@ -326,6 +326,7 @@ public class DictUtil {
      *
      * @param itemMap
      */
+    @Deprecated
     public void transferItemMap(Map<String, Object> itemMap) {
         Object projectCode = itemMap.get(Constant.PROJECT_CODE_KEY);
         if (null != projectCode) {

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

@@ -0,0 +1,34 @@
+package org.jeecg.modules.medical.threadpool;
+
+import org.jeecg.common.util.SpringContextUtils;
+import org.jeecg.modules.medical.entity.MidIncidentAudit;
+import org.jeecg.modules.medical.ruleengine.RuleEngine;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Callable;
+
+public class MidRunRuleEngineCallable implements Callable {
+
+    RuleEngine ruleEngine = SpringContextUtils.getBean(RuleEngine.class);
+
+    //    private MidIncidentAudit midIncidentAudit;
+//    private AfterIncidentDetailLog afterIncidentDetailLog;
+//    private List<Map<String, Object>> itemList;
+    Map<String, Object> paramMap;
+    Integer medicalRuleInsInfoId;
+    MidIncidentAudit midIncidentAudit;
+    List<Map<String, Object>> itemList;
+
+    public MidRunRuleEngineCallable(Map<String, Object> paramMap, Integer medicalRuleInsInfoId, MidIncidentAudit midIncidentAudit, List<Map<String, Object>> itemList) {
+        this.midIncidentAudit = midIncidentAudit;
+        this.paramMap = paramMap;
+        this.itemList = itemList;
+        this.medicalRuleInsInfoId = medicalRuleInsInfoId;
+    }
+
+    @Override
+    public Object call() throws Exception {
+        return ruleEngine.runMidEngine(paramMap, medicalRuleInsInfoId, midIncidentAudit, itemList);
+    }
+}