|
@@ -4,13 +4,11 @@ import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.diagbot.common.push.bean.CrisisDetail;
|
|
|
import org.diagbot.common.push.bean.FeatureRate;
|
|
|
import org.diagbot.common.push.bean.ResponseData;
|
|
|
import org.diagbot.common.push.bean.SearchData;
|
|
|
-import org.diagbot.common.push.bean.neo4j.Filnlly;
|
|
|
-import org.diagbot.common.push.bean.neo4j.MangementEvaluation;
|
|
|
-import org.diagbot.common.push.bean.neo4j.MedicalIndication;
|
|
|
-import org.diagbot.common.push.bean.neo4j.MedicalIndicationDetail;
|
|
|
+import org.diagbot.common.push.bean.neo4j.*;
|
|
|
import org.diagbot.common.push.cache.CacheUtil;
|
|
|
import org.diagbot.graph.jdbc.DriverManager;
|
|
|
import org.diagbot.graph.jdbc.Neo4jAPI;
|
|
@@ -18,13 +16,23 @@ import org.diagbot.graph.jdbc.Neo4jAPI;
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import java.util.*;
|
|
|
|
|
|
+import org.diagbot.graph.medicationProcess.PushTreat;
|
|
|
import org.diagbot.nlp.rule.module.PreResult;
|
|
|
import org.diagbot.nlp.util.Constants;
|
|
|
+import org.neo4j.driver.v1.Driver;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
public class GraphCalculate {
|
|
|
Logger logger = LoggerFactory.getLogger(GraphCalculate.class);
|
|
|
+ private static Driver driver;
|
|
|
+ static {
|
|
|
+ try {
|
|
|
+ driver = DriverManager.newDrive();
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
private static Neo4jAPI neo4jAPI ;
|
|
|
|
|
|
/**
|
|
@@ -35,7 +43,7 @@ public class GraphCalculate {
|
|
|
* @return
|
|
|
* @throws Exception
|
|
|
*/
|
|
|
- public ResponseData calculate(HttpServletRequest request, SearchData searchData) throws Exception {
|
|
|
+ public ResponseData calculate(HttpServletRequest request, SearchData searchData,Map<String, List<CrisisDetail>> crisisDetails) throws Exception {
|
|
|
|
|
|
long starttime = System.currentTimeMillis();
|
|
|
System.out.println("Start at: " + starttime);
|
|
@@ -44,33 +52,30 @@ public class GraphCalculate {
|
|
|
int age = searchData.getAge();
|
|
|
String sex = searchData.getSex();
|
|
|
String diseaseName = searchData.getDiseaseName();
|
|
|
+ String webDiag = searchData.getDiag();
|
|
|
+ logger.info("页面诊断为 :"+webDiag);
|
|
|
+ String[] webDiagList = webDiag.split(",|,|、|;|:|;");
|
|
|
logger.info("前端传来的年龄为 :"+age+" 前端传来的性别为 :"+sex);
|
|
|
Map<String, Map<String, String>> sexAgeCache = CacheUtil.getSexAgeCache();
|
|
|
Map<String, Map<String, String>> inputs = searchData.getGraphInputs();
|
|
|
- Set<String> ss = new HashSet<>();
|
|
|
- if(inputs.size()>0){
|
|
|
- for (Map.Entry<String, Map<String, String>> input:inputs.entrySet()) {
|
|
|
- Map<String, String> value = input.getValue();
|
|
|
- String concept = value.get("concept");
|
|
|
- String[] splits = StringUtils.split(concept, ",");
|
|
|
- for (String s:splits) {
|
|
|
- ss.add(s);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
+ List<String> exculdDiagFilds = this.exculdDiagFilds(inputs,webDiagList,diseaseName);
|
|
|
+ //从大数据解析分词
|
|
|
+ Set<String> ss = processParticiple(inputs);
|
|
|
logger.info("从分词系统接收到的词 :" + ss);
|
|
|
System.out.println("Participle takes: " + (System.currentTimeMillis()-starttime)/1000d + 's');
|
|
|
+ inputList.addAll(ss);
|
|
|
+ //提取前端传来的features
|
|
|
List<String> featureTypeList = Arrays.asList(searchData.getFeatureTypes());
|
|
|
logger.info("featureTypeList : " + featureTypeList);
|
|
|
- inputList.addAll(ss);
|
|
|
if(neo4jAPI == null){
|
|
|
- neo4jAPI = new Neo4jAPI(DriverManager.newDrive());
|
|
|
+ neo4jAPI = new Neo4jAPI(driver);
|
|
|
}
|
|
|
logger.info("图谱开始推送诊断!!!!!!!!!!!");
|
|
|
- String webDiag = searchData.getDiag();
|
|
|
- logger.info("页面诊断为 :"+webDiag);
|
|
|
- String[] webDiagList = webDiag.split(",|,|、|;|:|;");
|
|
|
+
|
|
|
+ //处理血肌酐
|
|
|
+ List<PreResult> lisArr = searchData.getLisArr();
|
|
|
+ String serumCreatinine = processSerumcreatinine(lisArr);
|
|
|
+
|
|
|
//计算诊断
|
|
|
Map<String, Object> condition =null;
|
|
|
Map<String, Map<String, String>> excludelist = null;
|
|
@@ -82,75 +87,35 @@ public class GraphCalculate {
|
|
|
excludelist = neo4jAPI.getExcludeDiag(inputList);
|
|
|
responseData.setExcludeDiag(Arrays.asList(excludelist.keySet().stream().toArray(String[]::new)));
|
|
|
}
|
|
|
- List<FeatureRate> featureRates = new ArrayList<>();
|
|
|
- if(condition != null){
|
|
|
- Map<String, Map<String,String>> allCondition = (Map<String, Map<String,String>>)condition.get("全部诊断");
|
|
|
- if(allCondition != null && allCondition.size()>0){
|
|
|
- for (Map.Entry<String, Map<String,String>> d : allCondition.entrySet()) {
|
|
|
- String dis = d.getKey();
|
|
|
- Map<String, String> sexAgeMap = sexAgeCache.get(dis);
|
|
|
- if(sexAgeMap != null){
|
|
|
- String sexType = sexAgeMap.get("sexType");
|
|
|
- Integer min_age = Integer.parseInt(sexAgeMap.get("min_age"));
|
|
|
- Integer max_age = Integer.parseInt(sexAgeMap.get("max_age"));
|
|
|
- if(("1".equals(sexType) &&sex.equals(sexType)) || ("2".equals(sexType) &&sex.equals(sexType)) || "3".equals(sexType)){
|
|
|
- if(min_age <age && age<=max_age){
|
|
|
- FeatureRate featureRate = new FeatureRate();
|
|
|
- featureRate.setFeatureName(dis);
|
|
|
- Map<String, String> value = d.getValue();
|
|
|
- String s = JSON.toJSONString(value);
|
|
|
- featureRate.setDesc(s);
|
|
|
- featureRate.setSource("neo4j");
|
|
|
- featureRates.add(featureRate);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- Set<String> diseaseSet =null;
|
|
|
- if(condition != null){
|
|
|
- diseaseSet = condition.keySet();
|
|
|
- logger.info("diseaseSet :" + diseaseSet);
|
|
|
- }
|
|
|
+ //包装推送出来的诊断
|
|
|
+ List<FeatureRate> featureRates = pavkageAndSetDis(age, sex, sexAgeCache, condition);
|
|
|
+ //返回拟、确诊组合
|
|
|
+ Set<String> diseaseSet = getQueNiDiagnose(condition);
|
|
|
+
|
|
|
Integer diseaseType = searchData.getDisType();
|
|
|
- List<PreResult> lisArr = searchData.getLisArr();
|
|
|
- Set<String> lisSet = new HashSet<>();
|
|
|
- Map<String,Double> lis_Result = new HashMap<>();
|
|
|
- if(lisArr != null && lisArr.size() > 0){
|
|
|
- for (PreResult lis:lisArr) {
|
|
|
- String detailName = lis.getUniqueName();
|
|
|
- logger.info("公表名为 :"+detailName);
|
|
|
- String lisValue = lis.getValue();
|
|
|
- if(StringUtils.isNotEmpty(lisValue)){
|
|
|
- Double value = Double.valueOf(lisValue);
|
|
|
- lis_Result.put(detailName,value);
|
|
|
- lisSet.add(detailName);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- logger.info("页面导入的所有化验项为 :" +lisSet);
|
|
|
+
|
|
|
starttime = System.currentTimeMillis();
|
|
|
//走治疗
|
|
|
if (StringUtils.isNotEmpty(diseaseName) && featureTypeList.contains(Constants.feature_type_treat)) {
|
|
|
- // 查找页面诊断里是否有不良反应
|
|
|
- Map<String, List<String>> disUE = neo4jAPI.getDisUE(diseaseName, diseaseType);
|
|
|
- //根据页面输入内容推出的不良反应集合
|
|
|
- Set<String> ue = neo4jAPI.getUe((String[]) inputList.toArray(new String[inputList.size()]));
|
|
|
+ PushTreat pushTreat = new PushTreat();
|
|
|
+ Treat treat = pushTreat.processTreat(diseaseName,webDiag,diseaseType, driver, (String[]) inputList.toArray(new String[inputList.size()]),exculdDiagFilds, crisisDetails);
|
|
|
+// Map<String, List<String>> disUE = pushTreat.getDisUE(diseaseName,1,driver);
|
|
|
+// Map<String,String> ue = pushTreat.getUe((String[]) inputList.toArray(new String[inputList.size()]),driver);
|
|
|
//走平常诊断治疗
|
|
|
// Map<String, Filnlly> mulDiseaseTreat = neo4jAPI.getMulDiseaseTreat_2(diseaseName,webDiag, diseaseType, diseaseSet,disUE,ue,String.join(",", inputList));
|
|
|
- Map<String, Filnlly> mulDiseaseTreat_new = neo4jAPI.getMulDiseaseTreat_new(diseaseName,webDiag, diseaseType, diseaseSet,disUE,ue,String.join(",", inputList));
|
|
|
- System.out.println("推送治疗消耗:"+(System.currentTimeMillis()-starttime)+"s");
|
|
|
- responseData.setTreat(mulDiseaseTreat_new);
|
|
|
+// Map<String, Filnlly> mulDiseaseTreat_new = neo4jAPI.getMulDiseaseTreat_new(diseaseName,webDiag, diseaseType, diseaseSet,disUE,ue,String.join(",", inputList),crisisDetails);
|
|
|
+// System.out.println("推送治疗消耗:"+(System.currentTimeMillis()-starttime)+"s");
|
|
|
+ responseData.setTreat(treat);
|
|
|
}
|
|
|
//管理评估(慢病才有)
|
|
|
if (featureTypeList.contains("11") && diseaseType == 1 && diseaseType != null) {
|
|
|
logger.info("featureTypeList 包含11,走管理评估!!!");
|
|
|
starttime = System.currentTimeMillis();
|
|
|
if(webDiag != null){
|
|
|
- MangementEvaluation mangementEvaluation = neo4jAPI.pushMe(webDiagList,lis_Result);
|
|
|
+// MangementEvaluation mangementEvaluation = neo4jAPI.pushMe(webDiagList,lis_Result);
|
|
|
+ MangementEvaluation mangementEvaluation_new = neo4jAPI.pushMe_new(diseaseName,crisisDetails);
|
|
|
System.out.println("推送管理评估消耗:"+(System.currentTimeMillis()-starttime)+"s");
|
|
|
- Map<String, JSONObject> mangementEvaluation1 = mangementEvaluation.getMangementEvaluation();
|
|
|
+ Map<String, JSONObject> mangementEvaluation1 = mangementEvaluation_new.getMangementEvaluation();
|
|
|
responseData.setManagementEvaluation(mangementEvaluation1);
|
|
|
}
|
|
|
}
|
|
@@ -179,7 +144,7 @@ public class GraphCalculate {
|
|
|
logger.info("featureTypeList 包含22,走指标推送!!!,图谱推出的指标为:" + indSet);
|
|
|
List<MedicalIndication> idn =null;
|
|
|
if(newindSet.contains("肾功能不全")){
|
|
|
- idn = neo4jAPI.getIdn(newindSet, age, sex);
|
|
|
+ idn = neo4jAPI.getIdn(newindSet, age, sex,serumCreatinine);
|
|
|
if(idn!= null && idn.size()>0){
|
|
|
idns.addAll(idn);
|
|
|
}
|
|
@@ -211,6 +176,74 @@ public class GraphCalculate {
|
|
|
System.out.println("Total takes: " + (System.currentTimeMillis()-starttime)/1000d + 's');
|
|
|
return responseData;
|
|
|
}
|
|
|
+
|
|
|
+ private Set<String> getQueNiDiagnose(Map<String, Object> condition) {
|
|
|
+ Set<String> diseaseSet =new HashSet<>();
|
|
|
+ if(condition != null){
|
|
|
+ Map<String, Map<String,String>> allCondition = (Map<String, Map<String,String>>)condition.get("全部诊断");
|
|
|
+ if(allCondition != null && allCondition.size()>0){
|
|
|
+ for (Map.Entry<String, Map<String,String>> sd:allCondition.entrySet()) {
|
|
|
+ Set<String> keyset = sd.getValue().keySet();
|
|
|
+ if(keyset.contains("拟诊") || keyset.contains("确诊")){
|
|
|
+ diseaseSet.add(sd.getKey());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ logger.info("diseaseSet :" + diseaseSet);
|
|
|
+ }
|
|
|
+ return diseaseSet;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<FeatureRate> pavkageAndSetDis(int age, String sex, Map<String, Map<String, String>> sexAgeCache, Map<String, Object> condition) {
|
|
|
+ List<FeatureRate> featureRates = new ArrayList<>();
|
|
|
+ if(condition != null){
|
|
|
+ Map<String, Map<String,String>> allCondition = (Map<String, Map<String,String>>)condition.get("全部诊断");
|
|
|
+ if(allCondition != null && allCondition.size()>0){
|
|
|
+ for (Map.Entry<String, Map<String,String>> d : allCondition.entrySet()) {
|
|
|
+ String dis = d.getKey();
|
|
|
+ Map<String, String> sexAgeMap = sexAgeCache.get(dis);
|
|
|
+ if(sexAgeMap != null){
|
|
|
+ String sexType = sexAgeMap.get("sexType");
|
|
|
+ Integer min_age = Integer.parseInt(sexAgeMap.get("min_age"));
|
|
|
+ Integer max_age = Integer.parseInt(sexAgeMap.get("max_age"));
|
|
|
+ if(("1".equals(sexType) &&sex.equals(sexType)) || ("2".equals(sexType) &&sex.equals(sexType)) || "3".equals(sexType)){
|
|
|
+ if(min_age <age && age<=max_age){
|
|
|
+ FeatureRate featureRate = new FeatureRate();
|
|
|
+ featureRate.setFeatureName(dis);
|
|
|
+ Map<String, String> value = d.getValue();
|
|
|
+ String s = JSON.toJSONString(value);
|
|
|
+ featureRate.setDesc(s);
|
|
|
+ featureRate.setSource("neo4j");
|
|
|
+ featureRates.add(featureRate);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return featureRates;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 解析分词
|
|
|
+ * @param inputs
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Set<String> processParticiple(Map<String, Map<String, String>> inputs) {
|
|
|
+ Set<String> ss = new HashSet<>();
|
|
|
+ if(inputs.size()>0){
|
|
|
+ for (Map.Entry<String, Map<String, String>> input:inputs.entrySet()) {
|
|
|
+ Map<String, String> value = input.getValue();
|
|
|
+ String concept = value.get("concept");
|
|
|
+ String[] splits = StringUtils.split(concept, ",");
|
|
|
+ for (String s:splits) {
|
|
|
+ ss.add(s);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ss;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 推送化验,辅检,体征
|
|
|
*/
|
|
@@ -219,4 +252,60 @@ public class GraphCalculate {
|
|
|
Map<String, List<FeatureRate>> lisPacs = neo4jAPI.getLisPacs(searchData);
|
|
|
return lisPacs;
|
|
|
}
|
|
|
+ /**
|
|
|
+ * 处理血肌酐
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public String processSerumcreatinine(List<PreResult> lisArr){
|
|
|
+ String sc = "";
|
|
|
+ if(lisArr !=null && lisArr.size()>0){
|
|
|
+ for (PreResult pre:lisArr) {
|
|
|
+ if("化验--肾功能测定--肌酐(Cr)".equals(pre.getUniqueName()) && StringUtils.isNotEmpty(pre.getValue())){
|
|
|
+ try {
|
|
|
+ sc = String.format("%.2f",Double.parseDouble(pre.getValue().trim())*0.01131);
|
|
|
+ }catch (Exception e){e.printStackTrace();}
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return sc;
|
|
|
+ }
|
|
|
+ private List<String> exculdDiagFilds(Map<String, Map<String, String>> inputs,String[] webDiagList,String disName){
|
|
|
+ List<String> exculdDiagFilds = new ArrayList<>();
|
|
|
+ String fildName ="";
|
|
|
+ if(inputs != null && inputs.size()>0){
|
|
|
+
|
|
|
+ for (Map.Entry<String, Map<String, String>> fild:inputs.entrySet()) {
|
|
|
+ fildName = fild.getKey();
|
|
|
+ Map<String, String> value = fild.getValue();
|
|
|
+ String propertys = value.get("property");
|
|
|
+ List<String> stringList = Arrays.asList(propertys.split(","));
|
|
|
+ if(stringList.contains("18") || stringList.contains("55")){
|
|
|
+ continue;
|
|
|
+ }else {
|
|
|
+ fildName = "'"+fildName+"'";
|
|
|
+ if(!exculdDiagFilds.contains(fildName)){
|
|
|
+ exculdDiagFilds.add(fildName);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ try{
|
|
|
+ if(webDiagList!=null && webDiagList.length>0){
|
|
|
+ for (String wd:webDiagList) {
|
|
|
+ if(wd != null && !disName.equals(wd)){
|
|
|
+ fildName = "'"+wd+"'";
|
|
|
+ if(!exculdDiagFilds.contains(fildName)){
|
|
|
+ exculdDiagFilds.add(fildName);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }catch (Exception e){
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ return exculdDiagFilds;
|
|
|
+ }
|
|
|
}
|