|
|
@@ -7,11 +7,17 @@ import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
import org.jeecg.common.api.vo.Result;
|
|
|
import org.jeecg.common.constant.CommonConstant;
|
|
|
+import org.jeecg.common.util.DateUtils;
|
|
|
import org.jeecg.modules.medical.Constant;
|
|
|
+import org.jeecg.modules.medical.entity.AdviceDetailsVO;
|
|
|
+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.MidIncidentAudit;
|
|
|
+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.RuleAttr;
|
|
|
import org.jeecg.modules.medical.entity.RuleFactorRela;
|
|
|
@@ -23,15 +29,20 @@ 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.IMedicalInsRuleProjectService;
|
|
|
+import org.jeecg.modules.medical.service.IMidIncidentAuditDiagnoseService;
|
|
|
import org.jeecg.modules.medical.service.IMidIncidentAuditService;
|
|
|
+import org.jeecg.modules.medical.service.IMidIncidentVisitDetailLogService;
|
|
|
+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.message.websocket.WebSocket;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
import javax.annotation.PostConstruct;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.text.ParseException;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Date;
|
|
|
import java.util.HashMap;
|
|
|
@@ -72,13 +83,20 @@ public class RuleEngine {
|
|
|
@Autowired
|
|
|
IMidIncidentAuditService midIncidentAuditService;
|
|
|
@Autowired
|
|
|
+ IMidIncidentAuditDiagnoseService midIncidentAuditDiagnoseService;
|
|
|
+ @Autowired
|
|
|
+ IMidIncidentVisitLogService midIncidentVisitLogService;
|
|
|
+ @Autowired
|
|
|
+ IMidIncidentVisitDetailLogService midIncidentVisitDetailLogService;
|
|
|
+ @Autowired
|
|
|
DictUtil dictUtil;
|
|
|
+ @Autowired
|
|
|
+ WebSocket webSocket;
|
|
|
|
|
|
public static ThreadLocal<MidIncidentWarningVO> midIncidentWarningVOThreadLocal = new ThreadLocal<>();
|
|
|
|
|
|
public static Map<String, Set<Integer>> itemCodeAndRuleIdMap = new HashMap<>();
|
|
|
- public static Map<String,List<RuleAttr>> interfRuleAttrList = new HashMap<>();
|
|
|
-
|
|
|
+ public static Map<String, List<RuleAttr>> interfRuleAttrList = new HashMap<>();
|
|
|
|
|
|
|
|
|
@PostConstruct
|
|
|
@@ -113,7 +131,7 @@ public class RuleEngine {
|
|
|
MedicalInsRuleProject medicalInsRuleProject = null;
|
|
|
for (int index = 0; index < medicalInsRuleProjectList.size(); index++) {
|
|
|
medicalInsRuleProject = medicalInsRuleProjectList.get(index);
|
|
|
- if(StringUtils.isNotBlank(medicalInsRuleProject.getProejctCode())) {
|
|
|
+ if (StringUtils.isNotBlank(medicalInsRuleProject.getProejctCode())) {
|
|
|
if (itemCodeAndRuleIdMap.containsKey(medicalInsRuleProject.getProejctCode())) {
|
|
|
itemCodeAndRuleIdMap.get(medicalInsRuleProject.getProejctCode()).add(medicalInsRuleProject.getMedicineInsRuleInfoId());
|
|
|
} else {
|
|
|
@@ -122,7 +140,7 @@ public class RuleEngine {
|
|
|
itemCodeAndRuleIdMap.put(medicalInsRuleProject.getProejctCode(), ruleIdSet);
|
|
|
}
|
|
|
}
|
|
|
- if(StringUtils.isNotBlank(medicalInsRuleProject.getCorrelationProjectCode())) {
|
|
|
+ if (StringUtils.isNotBlank(medicalInsRuleProject.getCorrelationProjectCode())) {
|
|
|
if (itemCodeAndRuleIdMap.containsKey(medicalInsRuleProject.getCorrelationProjectCode())) {
|
|
|
itemCodeAndRuleIdMap.get(medicalInsRuleProject.getCorrelationProjectCode()).add(medicalInsRuleProject.getMedicineInsRuleInfoId());
|
|
|
} else {
|
|
|
@@ -169,30 +187,102 @@ public class RuleEngine {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- public Result dealMidInterfaceEngin(String intefName, Map<String, Object> paramMap, MidIncidentWarningVO midIncidentWarningVO) {
|
|
|
+ public Result dealMidInterfaceEngin(String intefName, Map<String, Object> paramMap, MidIncidentWarningVO midIncidentWarningVO, String ipStr) {
|
|
|
midIncidentWarningVOThreadLocal.set(midIncidentWarningVO);
|
|
|
try {
|
|
|
List<RuleAttr> ruleAttrList = interfRuleAttrList.get(intefName);
|
|
|
- if(null == ruleAttrList){
|
|
|
- return Result.error("接口:"+intefName+" 未配置 对应的规则属性");
|
|
|
+ if (null == ruleAttrList) {
|
|
|
+ return Result.error("接口:" + intefName + " 未配置 对应的规则属性");
|
|
|
}
|
|
|
+ dictUtil.transferMidIncidentWarningVO(midIncidentWarningVO);
|
|
|
List<Map<String, Object>> itemList = interfItemListPlugin.findProIntersection(paramMap, ruleAttrList);
|
|
|
|
|
|
MidIncidentAudit midIncidentAudit = insertMidWarning(midIncidentWarningVO);
|
|
|
+ insertLog(midIncidentWarningVO);
|
|
|
midIncidentAudit.setInterfName(intefName);
|
|
|
for (Map<String, Object> itemMap : itemList) {
|
|
|
- dictUtil.transferItemMap(itemMap);
|
|
|
Set<Integer> medicalInsRuleInfoIdList = itemCodeAndRuleIdMap.get(itemMap.get(Constant.MEDICAL_PROJECT_CODE_KEY));
|
|
|
- runEngine(itemMap, medicalInsRuleInfoIdList,midIncidentAudit);
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ runEngine(itemMap, medicalInsRuleInfoIdList, midIncidentAudit, ipStr);
|
|
|
}
|
|
|
- }finally {
|
|
|
+ } finally {
|
|
|
midIncidentWarningVOThreadLocal.remove();
|
|
|
}
|
|
|
|
|
|
return Result.ok();
|
|
|
}
|
|
|
|
|
|
- public MidIncidentAudit insertMidWarning(MidIncidentWarningVO midIncidentWarningVO){
|
|
|
+ public void insertLog(MidIncidentWarningVO midIncidentWarningVO) {
|
|
|
+ MidIncidentVisitLog midIncidentVisitLog = new MidIncidentVisitLog();
|
|
|
+ midIncidentVisitLog.setDoctorId(midIncidentWarningVO.getDoctor_code());
|
|
|
+ midIncidentVisitLog.setDoctorName(midIncidentWarningVO.getDoctor_name());
|
|
|
+ midIncidentVisitLog.setVisitNo(midIncidentWarningVO.getVisit_no());
|
|
|
+ midIncidentVisitLog.setPatientId(midIncidentWarningVO.getPatient_id());
|
|
|
+ midIncidentVisitLog.setPatientName(midIncidentWarningVO.getPatient_name());
|
|
|
+ if (CollectionUtil.isNotEmpty(midIncidentWarningVO.getDiagnoses())) {
|
|
|
+ midIncidentVisitLog.setDiagnoses(JSON.toJSONString(midIncidentWarningVO.getDiagnoses()));
|
|
|
+ }
|
|
|
+ midIncidentVisitLog.setDoctorAdviceNo(midIncidentWarningVO.getDoctor_advice_no());
|
|
|
+ try {
|
|
|
+ Date inHospDate = DateUtils.parseDate(midIncidentWarningVO.getIn_hosp_date(), "yyyyMMdd");
|
|
|
+ midIncidentVisitLog.setInHospDate(inHospDate);
|
|
|
+ } catch (ParseException e) {
|
|
|
+ log.error(e.getMessage(), e);
|
|
|
+ }
|
|
|
+ Date now = new Date(System.currentTimeMillis());
|
|
|
+ midIncidentVisitLog.setCreateTime(now);
|
|
|
+ midIncidentVisitLog.setMedicalDeptCode(midIncidentWarningVO.getMedical_dept_code());
|
|
|
+ midIncidentVisitLog.setMedicalDeptName(midIncidentWarningVO.getMedical_dept_name());
|
|
|
+ midIncidentVisitLog.setVisitType(midIncidentWarningVO.getVisit_type());
|
|
|
+ midIncidentVisitLogService.save(midIncidentVisitLog);
|
|
|
+ if (CollectionUtil.isNotEmpty(midIncidentWarningVO.getAdvice_details())) {
|
|
|
+ List<MidIncidentVisitDetailLog> midIncidentVisitDetailLogList = new ArrayList<>();
|
|
|
+ MidIncidentVisitDetailLog midIncidentVisitDetailLog = null;
|
|
|
+ for (AdviceDetailsVO adviceDetailsVO : midIncidentWarningVO.getAdvice_details()) {
|
|
|
+ midIncidentVisitDetailLog = new MidIncidentVisitDetailLog();
|
|
|
+ midIncidentVisitDetailLog.setAmount(new BigDecimal(adviceDetailsVO.getAmount()));
|
|
|
+ midIncidentVisitDetailLog.setCreateTime(now);
|
|
|
+ midIncidentVisitDetailLog.setMidIncidentVisitLogId(midIncidentVisitLog.getId());
|
|
|
+ midIncidentVisitDetailLog.setDoctorId(midIncidentVisitLog.getDoctorId());
|
|
|
+ midIncidentVisitDetailLog.setDoctorName(midIncidentVisitLog.getDoctorName());
|
|
|
+ midIncidentVisitDetailLog.setDoseDay(adviceDetailsVO.getDose_day());
|
|
|
+ midIncidentVisitDetailLog.setDoseForm(adviceDetailsVO.getDose_form());
|
|
|
+ midIncidentVisitDetailLog.setDoseUnit(adviceDetailsVO.getDose_unit());
|
|
|
+ midIncidentVisitDetailLog.setExpenseCategory(adviceDetailsVO.getExpense_category());
|
|
|
+ midIncidentVisitDetailLog.setVisitNo(midIncidentVisitLog.getVisitNo());
|
|
|
+ midIncidentVisitDetailLog.setVisitType(midIncidentVisitLog.getVisitType());
|
|
|
+ midIncidentVisitDetailLog.setInspectionSite(adviceDetailsVO.getInspection_site());
|
|
|
+ midIncidentVisitDetailLog.setInvoiceProject(adviceDetailsVO.getInvoice_project());
|
|
|
+ midIncidentVisitDetailLog.setMedicalInsuranceMark(adviceDetailsVO.getMedical_insurance_mark());
|
|
|
+ midIncidentVisitDetailLog.setMedicalNumber(adviceDetailsVO.getMedical_number());
|
|
|
+ midIncidentVisitDetailLog.setOrderType(adviceDetailsVO.getOrder_type());
|
|
|
+ midIncidentVisitDetailLog.setOrderCatalog(adviceDetailsVO.getOrder_catalog());
|
|
|
+ midIncidentVisitDetailLog.setSingleDoseNumber(adviceDetailsVO.getSingle_dose_number());
|
|
|
+ midIncidentVisitDetailLog.setSingleDoseUnit(adviceDetailsVO.getSingle_dose_unit());
|
|
|
+ midIncidentVisitDetailLog.setMedicalDeptCode(adviceDetailsVO.getMedical_project_code());
|
|
|
+ midIncidentVisitDetailLog.setMedicalProjectName(adviceDetailsVO.getMedical_project_name());
|
|
|
+ midIncidentVisitDetailLog.setTakeFrequence(adviceDetailsVO.getTake_frequence());
|
|
|
+ midIncidentVisitDetailLog.setMedicalSpecification(adviceDetailsVO.getMedical_specification());
|
|
|
+ midIncidentVisitDetailLog.setPrice(new BigDecimal(adviceDetailsVO.getPrice()));
|
|
|
+ midIncidentVisitDetailLog.setRecipeNo(adviceDetailsVO.getRecipe_no());
|
|
|
+ midIncidentVisitDetailLog.setUseDay(adviceDetailsVO.getUse_day());
|
|
|
+ midIncidentVisitDetailLog.setProjectType(adviceDetailsVO.getProject_type());
|
|
|
+ midIncidentVisitDetailLog.setProejctCode(adviceDetailsVO.getProject_code());
|
|
|
+ midIncidentVisitDetailLog.setProejctName(adviceDetailsVO.getProject_name());
|
|
|
+ midIncidentVisitDetailLogList.add(midIncidentVisitDetailLog);
|
|
|
+ }
|
|
|
+ midIncidentVisitDetailLogService.saveBatch(midIncidentVisitDetailLogList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public MidIncidentAudit insertMidWarning(MidIncidentWarningVO midIncidentWarningVO) {
|
|
|
MidIncidentAudit midIncidentAudit = new MidIncidentAudit();
|
|
|
midIncidentAudit.setMedicalDeptCode(midIncidentWarningVO.getMedical_dept_code());
|
|
|
midIncidentAudit.setMedicalDeptName(midIncidentWarningVO.getMedical_dept_name());
|
|
|
@@ -206,7 +296,22 @@ public class RuleEngine {
|
|
|
midIncidentAudit.setPrescriptionNumber(midIncidentWarningVO.getDoctor_advice_no());
|
|
|
midIncidentAudit.setNoticeType("事中预警");
|
|
|
midIncidentAuditService.save(midIncidentAudit);
|
|
|
-
|
|
|
+ if (CollectionUtil.isNotEmpty(midIncidentWarningVO.getDiagnoses())) {
|
|
|
+ List<MidIncidentAuditDiagnose> midIncidentAuditDiagnoseList = new ArrayList<>();
|
|
|
+ for (DiagnosesVO diagnosesVO : midIncidentWarningVO.getDiagnoses()) {
|
|
|
+ MidIncidentAuditDiagnose midIncidentAuditDiagnose = new MidIncidentAuditDiagnose();
|
|
|
+ midIncidentAuditDiagnose.setMidIncidentAuditId(midIncidentAudit.getId());
|
|
|
+ midIncidentAuditDiagnose.setDiagnoseCode(diagnosesVO.getDiagnose_code());
|
|
|
+ midIncidentAuditDiagnose.setDiagnoseDesc(diagnosesVO.getDiagnose_desc());
|
|
|
+ midIncidentAuditDiagnose.setMedDiagnoseCode(diagnosesVO.getMedical_diagnose_code());
|
|
|
+ midIncidentAuditDiagnose.setMedDiagnoseDesc(diagnosesVO.getMedical_diagnose_name());
|
|
|
+ midIncidentAuditDiagnose.setCreateTime(date);
|
|
|
+ midIncidentAuditDiagnose.setOutpatientNumber(midIncidentWarningVO.getVisit_no());
|
|
|
+ midIncidentAuditDiagnose.setPrescriptionNumber(midIncidentWarningVO.getDoctor_advice_no());
|
|
|
+ midIncidentAuditDiagnoseList.add(midIncidentAuditDiagnose);
|
|
|
+ }
|
|
|
+ midIncidentAuditDiagnoseService.saveBatch(midIncidentAuditDiagnoseList);
|
|
|
+ }
|
|
|
|
|
|
|
|
|
return midIncidentAudit;
|
|
|
@@ -215,7 +320,7 @@ public class RuleEngine {
|
|
|
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<>();
|
|
|
+ Map<String, List<Integer>> itemCodeAndRuleIdMap = new HashMap<>();
|
|
|
for (RuleAttr ruleAttr : ruleAttrList) {
|
|
|
String itemCode = null;
|
|
|
if (StringUtils.isNotBlank(ruleAttr.getAttrPath())) {
|
|
|
@@ -269,7 +374,7 @@ public class RuleEngine {
|
|
|
*
|
|
|
* @param paramMap
|
|
|
*/
|
|
|
- public void runEngine(Map<String, Object> paramMap, Set<Integer> medicalInsRuleInfoIdList,MidIncidentAudit midIncidentAudit) {
|
|
|
+ public void runEngine(Map<String, Object> paramMap, Set<Integer> medicalInsRuleInfoIdList, MidIncidentAudit midIncidentAudit, String ipStr) {
|
|
|
LambdaQueryWrapper<RuleFactorRela> query = new LambdaQueryWrapper<RuleFactorRela>();
|
|
|
query.eq(RuleFactorRela::getDelFlag, CommonConstant.DEL_FLAG_0);
|
|
|
query.in(RuleFactorRela::getMedicalInsRuleInfoId, medicalInsRuleInfoIdList);
|
|
|
@@ -289,15 +394,7 @@ public class RuleEngine {
|
|
|
factorEnchangeFactory.runFactorEnchange(medicalRuleInsInfoId, medicalInsRuleInfo, midIncidentAudit, paramMap, factorEnchangeIdList, factorEnchanceListTemp);
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 调用规则引擎之后需要异步通知websocket服务
|
|
|
- *
|
|
|
- * @param paramMap
|
|
|
- */
|
|
|
- public void sendEnginResultToWebSocket(Map<String, Object> paramMap) {
|
|
|
-
|
|
|
+ webSocket.pushMessage(ipStr, JSON.toJSONString(midIncidentAudit));
|
|
|
}
|
|
|
|
|
|
|