0027005599 2 лет назад
Родитель
Сommit
1e09f97e5a

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

@@ -22,6 +22,7 @@ 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.entity.MidResult;
 import org.jeecg.modules.medical.ruleengine.HospGetDataToRuleEngine;
 import org.jeecg.modules.medical.ruleengine.RuleEngine;
 import org.jeecg.modules.medical.service.IAuditService;
@@ -85,11 +86,12 @@ public class HisController extends JeecgController<Audit, IAuditService> {
     @AutoLog(value = "事中预警")
     @ApiOperation(value="事中预警接口", notes="事中预警接口调用")
     @PostMapping(value = "/midIncidentWarning")
-    public Result<String> midIncidentWarning(@RequestBody @Valid MidIncidentWarningVO midIncidentWarningVO,HttpServletRequest httpServletRequest) {
+    public Result midIncidentWarning(@RequestBody @Valid MidIncidentWarningVO midIncidentWarningVO,HttpServletRequest httpServletRequest) {
 
         String ipStr = HttpUtils.getIPAddress(httpServletRequest);
         log.info("事中远端请求的服务ip地址:{}", ipStr);
-        return ruleEngine.dealMidInterfaceEngin("midIncidentWarning", midIncidentWarningVO, ipStr);
+        MidResult midResult = ruleEngine.dealMidInterfaceEngin(midIncidentWarningVO);
+        return Result.OK(midResult);
     }
 
 
@@ -102,7 +104,7 @@ public class HisController extends JeecgController<Audit, IAuditService> {
     @AutoLog(value = "住院事中预警")
     @ApiOperation(value="住院事中预警接口", notes="住院事中预警接口调用")
     @PostMapping(value = "/hospMidIncidentWarning")
-    public Result<String> hospMidIncidentWarning(@RequestBody @Valid HospMidIncidentWarningVO midIncidentWarningVO, HttpServletRequest httpServletRequest) {
+    public Result hospMidIncidentWarning(@RequestBody @Valid HospMidIncidentWarningVO midIncidentWarningVO, HttpServletRequest httpServletRequest) {
 
         String ipStr = HttpUtils.getIPAddress(httpServletRequest);
         log.info("住院事中远端请求的服务ip地址:{}", ipStr);
@@ -120,11 +122,12 @@ public class HisController extends JeecgController<Audit, IAuditService> {
     @AutoLog(value = "门诊事中预警")
     @ApiOperation(value="门诊事中预警接口", notes="门诊事中预警接口调用")
     @PostMapping(value = "/outpatientMidIncidentWarning")
-    public Result<String> outpatientMidIncidentWarning(@RequestBody @Valid MidIncidentWarningVO midIncidentWarningVO,HttpServletRequest httpServletRequest) {
+    public Result outpatientMidIncidentWarning(@RequestBody @Valid MidIncidentWarningVO midIncidentWarningVO,HttpServletRequest httpServletRequest) {
 
         String ipStr = HttpUtils.getIPAddress(httpServletRequest);
         log.info("事中远端请求的服务ip地址:{}", ipStr);
-        return ruleEngine.dealMidInterfaceEngin("midIncidentWarning", midIncidentWarningVO, ipStr);
+        MidResult midResult = ruleEngine.dealMidInterfaceEngin(midIncidentWarningVO);
+        return Result.OK(midResult);
     }
 
 

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

@@ -1,10 +1,12 @@
 package org.jeecg.modules.medical.ruleengine;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.extern.slf4j.Slf4j;
+import net.sf.json.JSONArray;
 import org.apache.commons.lang.StringUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.constant.CommonConstant;
@@ -33,6 +35,7 @@ import org.jeecg.modules.medical.entity.MidIncidentAuditDiagnose;
 import org.jeecg.modules.medical.entity.MidIncidentVisitDetailLog;
 import org.jeecg.modules.medical.entity.MidIncidentVisitLog;
 import org.jeecg.modules.medical.entity.MidIncidentWarningVO;
+import org.jeecg.modules.medical.entity.MidResult;
 import org.jeecg.modules.medical.entity.RuleAttr;
 import org.jeecg.modules.medical.entity.RuleFactorRela;
 import org.jeecg.modules.medical.entity.TreatmentItems;
@@ -58,15 +61,17 @@ import org.jeecg.modules.medical.service.IMidIncidentVisitLogService;
 import org.jeecg.modules.medical.service.IRuleAttrService;
 import org.jeecg.modules.medical.service.IRuleFactorRelaService;
 import org.jeecg.modules.medical.service.ITreatmentItemsService;
+import org.jeecg.modules.medical.threadpool.MidRunRuleEngineCallable;
 import org.jeecg.modules.message.websocket.WebSocket;
 import org.jeecg.modules.system.service.ISysDictService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.text.ParseException;
 import java.util.ArrayList;
@@ -77,6 +82,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.Future;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -137,6 +143,8 @@ public class RuleEngine {
     ISysDictService sysDictService;
     @Autowired
     IAfterIncidentDetailLogService afterIncidentDetailLogService;
+    @Resource(name = "commonTaskAsyncPool")
+    ThreadPoolTaskExecutor threadPoolTaskExecutor;
 
     @Value("${cache.auto:false}")
     private Boolean cacheAutoInit;
@@ -585,25 +593,28 @@ public class RuleEngine {
         return Result.ok();
     }
 
-    public Result dealMidInterfaceEngin(String intefName, MidIncidentWarningVO midIncidentWarningVO, String ipStr) {
-        JSONObject sendJson = new JSONObject();
+    public MidResult dealMidInterfaceEngin(MidIncidentWarningVO midIncidentWarningVO) {
+        MidResult midResult = new MidResult();
         try {
-            List<RuleAttr> ruleAttrList = interfRuleAttrList.get(intefName);
-            if (null == ruleAttrList) {
-                return Result.error("接口:" + intefName + " 未配置 对应的规则属性");
-            }
             dictUtil.transferMidIncidentWarningVO(midIncidentWarningVO);
             String jsonStr = JSON.toJSONString(midIncidentWarningVO);
             log.info("事中提醒接收报文:{}", jsonStr);
-            JSONObject paramMap = JSON.parseObject(jsonStr);
-            List<Map<String, Object>> itemList = interfItemListPlugin.findProIntersection(paramMap, ruleAttrList);
             MidIncidentAudit midIncidentAudit = insertMidWarning(midIncidentWarningVO);
             insertLog(midIncidentWarningVO);
-            midIncidentAudit.setInterfName(intefName);
             //callScenario 1=事前  2=事后  3=事前/事后 4=事中 5=事后/事中
             List<String> callScenarioList = Arrays.asList("4", "5");
             boolean sendFlag = false;
-            for (Map<String, Object> itemMap : itemList) {
+            MidRunRuleEngineCallable midRunRuleEngineCallable = null;
+
+            List<Map<String,Object>> detailMapList = new ArrayList<>();
+            for(AdviceDetailsVO adviceDetailsVO : midIncidentWarningVO.getAdvice_details()){
+                detailMapList.add(BeanUtil.beanToMap(adviceDetailsVO));
+            }
+            List<Future> futureList = new ArrayList();
+            List<String> medicalDiagnoseStrList = midIncidentWarningVO.getDiagnoses().stream().map(DiagnosesVO::getMedical_diagnose_code).collect(Collectors.toList());
+
+            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));
@@ -611,49 +622,59 @@ public class RuleEngine {
                     Set<Integer> medicalInsRuleInfoIdList = medicalInsRuleProjectList.stream().map(MedicalInsRuleProject::getMedicalInsRuleInfoId).collect(Collectors.toSet());
                     log.info("项目编码:{} 数据库检索到匹配规则ID列表:{}", itemMap.get(Constant.MEDICAL_PROJECT_CODE_KEY), medicalInsRuleInfoIdList);
                 }
-
-                Object diagnose = itemMap.get(Constant.MEDICAL_DIAGNOSE_CODE_KEY);
-                if (null != diagnose) {
-                    List<String> diagnoseList = (List<String>) diagnose;
+                if (CollectionUtil.isNotEmpty(medicalDiagnoseStrList)) {
                     //获取诊断编码配置的规则ID,加入需要执行的规则
-                    getAndSetDiagRule(diagnoseList, medicalInsRuleProjectList);
-
+                    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));
-                paramMap.put(SystemEventAttrConstant.ADVICE_DETAILS_LIST_KEY, itemList);
+                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);
                     setProjectToLocalMap(itemMap, medicalInsRuleProject);
                     itemMap.put(SystemEventAttrConstant.MEDICAL_INS_CORRELATIONPROJECTCODELIST, medicalInsCorrProjectCodeList);
-                    setItemCodeListToItemMap(itemList, itemMap);
-                    boolean sendFlagTemp = false;
+                    setItemCodeListToItemMap(detailMapList, itemMap);
+
                     try {
-                        sendFlagTemp = runMidEngine(itemMap, medicalInsRuleInfoId, midIncidentAudit, itemList);
+                        midRunRuleEngineCallable = new MidRunRuleEngineCallable(itemMap, medicalInsRuleInfoId, midIncidentAudit, detailMapList);
+                        Future future = threadPoolTaskExecutor.submit(midRunRuleEngineCallable);
+                        futureList.add(future);
                     } catch (Exception e) {
                         log.error(e.getMessage(), e);
                     }
-                    sendFlag = sendFlagTemp || sendFlag;
+
                 }
             }
-            sendJson.put("id", midIncidentAudit.getId());
-            sendJson.put("violationFlag", sendFlag);
+            for (Future future : futureList) {
+                try {
+                    boolean auditFlag = (boolean) future.get();
+                    sendFlag = auditFlag || sendFlag;
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                }
+            }
+
+
             if (!sendFlag) {
                 log.error("无违规,事中审核无需提醒 门诊/住院号:{}", midIncidentWarningVO.getVisit_no());
+            } else {
+
             }
+
         } catch (Exception e) {
             log.error(e.getMessage(), e);
         }
 
-        return Result.ok(sendJson);
+        return midResult;
     }
 
 
-    public Result dealMidInterfaceEnginSocket(String intefName, MidIncidentWarningVO midIncidentWarningVO, String ipStr) {
+    public Result dealMidInterfaceEnginSocket(String intefName, MidIncidentWarningVO midIncidentWarningVO, String
+            ipStr) {
         midIncidentWarningVOThreadLocal.set(midIncidentWarningVO);
         try {
             List<RuleAttr> ruleAttrList = interfRuleAttrList.get(intefName);
@@ -733,7 +754,8 @@ public class RuleEngine {
      * @param afterwardsAudit
      * @param afterIncidentDetailLog
      */
-    public void dealAfterInterfaceEngin(AfterwardsAudit afterwardsAudit, AfterIncidentDetailLog afterIncidentDetailLog, List<Map<String, Object>> itemList) {
+    public void dealAfterInterfaceEngin(AfterwardsAudit afterwardsAudit, AfterIncidentDetailLog
+            afterIncidentDetailLog, List<Map<String, Object>> itemList) {
         try {
             dictUtil.transferAfterIncidentWarning(afterIncidentDetailLog);
             String jsonStr = JSON.toJSONString(afterIncidentDetailLog);
@@ -790,7 +812,8 @@ public class RuleEngine {
 
     }
 
-    public void getAndSetDiagRule(List<String> diagnoseList, List<MedicalInsRuleProject> medicalInsRuleProjectList) {
+    public void getAndSetDiagRule
+            (List<String> diagnoseList, List<MedicalInsRuleProject> medicalInsRuleProjectList) {
         if (CollectionUtil.isNotEmpty(diagRuleIdList)) {
             List<MedicalInsRuleProjectDiagnose> projectDiagnoseList = medicalInsRuleProjectDiagnoseService.getRuleProjectByDiagCodeAndRuleId(diagRuleIdList, diagnoseList);
             if (CollectionUtil.isNotEmpty(projectDiagnoseList)) {
@@ -943,7 +966,7 @@ public class RuleEngine {
                 midIncidentVisitDetailLog.setMedicalProjectName(adviceDetailsVO.getMedical_project_name());
                 midIncidentVisitDetailLog.setTakeFrequence(adviceDetailsVO.getTake_frequence());
                 midIncidentVisitDetailLog.setMedicalSpecification(adviceDetailsVO.getMedical_specification());
-                if(null != adviceDetailsVO.getPrice()) {
+                if (null != adviceDetailsVO.getPrice()) {
                     midIncidentVisitDetailLog.setPrice(new BigDecimal(adviceDetailsVO.getPrice()));
                 }
                 midIncidentVisitDetailLog.setRecipeNo(adviceDetailsVO.getRecipe_no());
@@ -1039,7 +1062,7 @@ public class RuleEngine {
                 midIncidentAuditDiagnose.setMedDiagnoseDesc(diagnosesVO.getMedical_diagnose_name());
                 midIncidentAuditDiagnose.setCreateTime(date);
                 midIncidentAuditDiagnose.setOutpatientNumber(midIncidentWarningVO.getVisit_no());
-                midIncidentAuditDiagnose.setPrescriptionNumber(midIncidentWarningVO.getDoctor_advice_no());
+//                midIncidentAuditDiagnose.setPrescriptionNumber(diagnosesVO.get);
                 midIncidentAuditDiagnoseList.add(midIncidentAuditDiagnose);
             }
             midIncidentAuditDiagnoseService.saveBatch(midIncidentAuditDiagnoseList);
@@ -1115,7 +1138,8 @@ public class RuleEngine {
      *
      * @param paramMap
      */
-    public boolean runAdvanceWaringEngine(Map<String, Object> paramMap, MedicalInsRuleInfo medicalInsRuleInfo, Object audit, List<Map<String, Object>> itemList) {
+    public boolean runAdvanceWaringEngine(Map<String, Object> paramMap, MedicalInsRuleInfo
+            medicalInsRuleInfo, Object audit, List<Map<String, Object>> itemList) {
         if (null == medicalInsRuleInfo) {
             log.error("未有对应的规则,接口数据:{}", paramMap);
             return false;
@@ -1187,7 +1211,8 @@ public class RuleEngine {
      *
      * @param paramMap
      */
-    public boolean runAfterEngine(Map<String, Object> paramMap, Integer medicalRuleInsInfoId, AfterwardsAudit afterIncidentAudit, List<Map<String, Object>> itemList) throws Exception {
+    public boolean runAfterEngine(Map<String, Object> paramMap, Integer medicalRuleInsInfoId, AfterwardsAudit
+            afterIncidentAudit, List<Map<String, Object>> itemList) throws Exception {
         if (null == medicalRuleInsInfoId) {
             log.error("未有对应的规则,接口数据:{}", paramMap);
             return false;
@@ -1220,7 +1245,8 @@ public class RuleEngine {
      * @param paramMap
      */
 //    @Async("commonTaskAsyncPool")
-    public boolean runMidEngine(Map<String, Object> paramMap, Integer medicalRuleInsInfoId, MidIncidentAudit midIncidentAudit, List<Map<String, Object>> itemList) throws Exception {
+    public boolean runMidEngine(Map<String, Object> paramMap, Integer medicalRuleInsInfoId, MidIncidentAudit
+            midIncidentAudit, List<Map<String, Object>> itemList) throws Exception {
         boolean auditFlag = false;
         if (null == medicalRuleInsInfoId) {
             log.error("未有对应的规则,接口数据:{}", paramMap);

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

@@ -144,7 +144,7 @@ public class DictUtil {
     public void transferMidIncidentWarningVO(MidIncidentWarningVO midIncidentWarningVO) {
         if (CollectionUtil.isNotEmpty(midIncidentWarningVO.getDiagnoses())) {
             for (DiagnosesVO diagnose : midIncidentWarningVO.getDiagnoses()) {
-                if (null != diagnose.getDiagnose_code()) {
+                if (null != diagnose.getDiagnose_code() && StringUtils.isBlank(diagnose.getMedical_diagnose_code())) {
                     Object value = redisTemplate.opsForHash().get(Constant.HIS_MEDICAL_DICT_KEY, diagnose.getDiagnose_code());
                     if (value == null) {
                         log.error("字段未配置该诊断编码映射的医保记录,项目:{}", diagnose);
@@ -170,7 +170,7 @@ public class DictUtil {
             List<String> medicalProjectCodeList = new ArrayList<>();
             Double totalAmount = Double.valueOf(0);
             for (AdviceDetailsVO adviceDetailsVO : midIncidentWarningVO.getAdvice_details()) {
-                if (null != adviceDetailsVO.getProject_code()) {
+                if (null != adviceDetailsVO.getProject_code() && StringUtils.isBlank(adviceDetailsVO.getMedical_project_code())) {
                     projectCodeList.add(adviceDetailsVO.getProject_code());
                     Object value = redisTemplate.opsForHash().get(Constant.HIS_MEDICAL_DICT_KEY, adviceDetailsVO.getProject_code());
                     if (value == null) {

+ 11 - 0
jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/BeforeAuditDataTest.java

@@ -1,6 +1,7 @@
 package org.jeecg;
 
 import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.jeecg.common.util.DateUtils;
@@ -124,6 +125,16 @@ public class BeforeAuditDataTest {
     @Autowired
     IAdvanceWarningAuditDetailService advanceWarningAuditDetailService;
 
+    @Test
+    public void querytest() {
+        QueryWrapper<MidIncidentAuditDetail> queryWrapper = new QueryWrapper<>();
+        queryWrapper.select("medical_ins_rule_info_code as medicalInsRuleInfoCode,medical_ins_rule_info_name as medicalInsRuleInfoName," +
+                "treatment_type as treatmentType,violation_level as violationLevel,amount,description");
+        queryWrapper.groupBy("medical_ins_rule_info_code");
+//        queryWrapper.eq("mid_incident_audit_id", midIncidentAudit.getId());
+        List<MidIncidentAuditDetail> midIncidentAuditDetailList = midIncidentAuditDetailService.list(queryWrapper);
+        System.out.println(midIncidentAuditDetailList);
+    }
     @Test
     public void genAdvanceWaringDetail(){
         List<AdvanceWarningAudit> advanceWarningAudits = advanceWarningAuditService.lambdaQuery().ge(AdvanceWarningAudit::getId,46).list();

+ 15 - 0
jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/TestMain.java

@@ -1,9 +1,14 @@
 package org.jeecg;
 
+import cn.hutool.core.bean.BeanUtil;
+import org.jeecg.modules.medical.entity.AdviceDetailsVO;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
 
 import java.time.Period;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
 import java.util.regex.Pattern;
 
 /**
@@ -53,6 +58,16 @@ public class TestMain {
 
         System.out.println("年龄为 " + ageString + " 的人的天数为 " + ageInDays + " 天");
 
+        List<Map<String,Object>> detailMapList = new ArrayList<>();
+        List<AdviceDetailsVO> adviceDetailsVOList = new ArrayList<>();
+        AdviceDetailsVO adviceDetailsVO = new AdviceDetailsVO();
+        adviceDetailsVOList.add(adviceDetailsVO);
+        adviceDetailsVO.setMedical_project_name("123123");
+        adviceDetailsVO.setDose_day(1);
+        for(AdviceDetailsVO adviceDetailsVOTemp : adviceDetailsVOList){
+            detailMapList.add(BeanUtil.beanToMap(adviceDetailsVOTemp));
+        }
+        System.out.println(detailMapList);
 
     }