PushFacade.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. package com.diagbot.facade;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.diagbot.client.TranServiceClient;
  4. import com.diagbot.client.bean.FeatureRate;
  5. import com.diagbot.client.bean.HosCodeVO;
  6. import com.diagbot.client.bean.MedicalIndication;
  7. import com.diagbot.client.bean.MedicalIndicationDetail;
  8. import com.diagbot.client.bean.ResponseData;
  9. import com.diagbot.dto.ConceptPushDTO;
  10. import com.diagbot.dto.LisResult;
  11. import com.diagbot.dto.PushDTO;
  12. import com.diagbot.dto.RespDTO;
  13. import com.diagbot.dto.SysSetInfoDTO;
  14. import com.diagbot.entity.Concept;
  15. import com.diagbot.enums.ConceptTypeEnum;
  16. import com.diagbot.enums.FeatureTypeEnum;
  17. import com.diagbot.enums.LexiconTypeEnum;
  18. import com.diagbot.enums.LisSourceEnum;
  19. import com.diagbot.enums.SysTypeEnum;
  20. import com.diagbot.exception.CommonErrorCode;
  21. import com.diagbot.exception.CommonException;
  22. import com.diagbot.util.EntityUtil;
  23. import com.diagbot.util.FastJsonUtils;
  24. import com.diagbot.util.ListUtil;
  25. import com.diagbot.util.ParamConvertUtil;
  26. import com.diagbot.util.RespDTOUtil;
  27. import com.diagbot.util.StringUtil;
  28. import com.diagbot.vo.ConceptBaseVO;
  29. import com.diagbot.vo.HospitalSetVO;
  30. import com.diagbot.vo.LisConfigVO;
  31. import com.diagbot.vo.SearchVo;
  32. import com.google.common.collect.Lists;
  33. import org.springframework.beans.factory.annotation.Autowired;
  34. import org.springframework.stereotype.Component;
  35. import java.util.Arrays;
  36. import java.util.HashSet;
  37. import java.util.LinkedHashMap;
  38. import java.util.List;
  39. import java.util.Map;
  40. import java.util.Set;
  41. import java.util.stream.Collectors;
  42. /**
  43. * @Description:
  44. * @Author:zhaops
  45. * @time: 2019/5/7 16:12
  46. */
  47. @Component
  48. public class PushFacade {
  49. @Autowired
  50. private ClinicalFacade clinicalFacade;
  51. @Autowired
  52. private ConceptFacade conceptFacade;
  53. @Autowired
  54. private TreatmentFacade treatmentFacade;
  55. @Autowired
  56. private TranServiceClient tranServiceClient;
  57. /**
  58. * 推理接口
  59. *
  60. * @param searchVo
  61. * @return ResponseData
  62. */
  63. public PushDTO pushInner(SearchVo searchVo) {
  64. PushDTO pushDTO = new PushDTO();
  65. //是否对接
  66. Boolean isConnect = false;
  67. if (StringUtil.isNotBlank(searchVo.getHosCode())) {
  68. HosCodeVO hosCodeVO = new HosCodeVO();
  69. hosCodeVO.setHosCode(searchVo.getHosCode());
  70. HospitalSetVO hospitalSetVO = new HospitalSetVO();
  71. hospitalSetVO.setHospitalCode(searchVo.getHosCode());
  72. hospitalSetVO.setCode("connect");
  73. if (searchVo.getSysType() != null) {
  74. hospitalSetVO.setSysType(searchVo.getSysType());
  75. } else {
  76. hospitalSetVO.setSysType(SysTypeEnum.AIPT_SERVICE.getKey());
  77. }
  78. RespDTO<List<SysSetInfoDTO>> sysSetInfoListRes = tranServiceClient.getSysSetInfoDatas(hospitalSetVO);
  79. if (RespDTOUtil.respIsOK(sysSetInfoListRes)) {
  80. List<SysSetInfoDTO> sysSetInfoList = sysSetInfoListRes.data;
  81. if (ListUtil.isNotEmpty(sysSetInfoList)) {
  82. if (sysSetInfoList.get(0).getValue().equals(1)) {
  83. isConnect = true;
  84. } else {
  85. isConnect = false;
  86. }
  87. } else {
  88. isConnect = false;
  89. }
  90. }
  91. }
  92. //化验转公表项处理
  93. if (isConnect) {
  94. List<LisResult> lisArr = searchVo.getLisArr();
  95. lisArr = addUniqueName(lisArr, searchVo.getHosCode());
  96. searchVo.setLisArr(lisArr);
  97. }
  98. ResponseData data = clinicalFacade.processClinicalData(searchVo);
  99. String featureType = searchVo.getFeatureType();
  100. String[] featureTypes = featureType.split(",|,");
  101. Set<String> featureTypeSet = new HashSet(Arrays.asList(featureTypes));
  102. //确定推送科室
  103. List<FeatureRate> dis = data.getDis();
  104. pushDTO.setDept(getDept(dis));
  105. //症状 概念列表
  106. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Feature_Type_Symptom.getKey()))) {
  107. List<FeatureRate> symptom = data.getSymptom();
  108. if (ListUtil.isNotEmpty(symptom)) {
  109. List<String> nameList = symptom
  110. .stream()
  111. .map(featureRate -> featureRate.getFeatureName()).collect(Collectors.toList());
  112. if (ListUtil.isNotEmpty(nameList)) {
  113. pushDTO.setSymptom(getConceptDTOList(nameList, LexiconTypeEnum.SYMPTOM.getKey()));
  114. }
  115. }
  116. }
  117. //查体 查体结果
  118. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Feature_Type_Vital_Result.getKey()))) {
  119. List<FeatureRate> vital = data.getVitals();
  120. if (ListUtil.isNotEmpty(vital)) {
  121. List<String> nameList = vital
  122. .stream()
  123. .map(featureRate -> featureRate.getFeatureName()).collect(Collectors.toList());
  124. if (ListUtil.isNotEmpty(nameList)) {
  125. pushDTO.setVital(getConceptDTOList(nameList, LexiconTypeEnum.VITAL_RESULT.getKey()));
  126. }
  127. }
  128. }
  129. //查体 查体指标
  130. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Feature_Type_Vital_Index.getKey()))) {
  131. List<FeatureRate> vital = data.getVitals();
  132. if (ListUtil.isNotEmpty(vital)) {
  133. List<String> nameList = vital
  134. .stream()
  135. .map(featureRate -> featureRate.getFeatureName()).collect(Collectors.toList());
  136. if (ListUtil.isNotEmpty(nameList)) {
  137. pushDTO.setVital(getConceptDTOList(nameList, LexiconTypeEnum.VITAL_INDEX.getKey()));
  138. }
  139. }
  140. }
  141. //化验 概念列表-公表项
  142. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Feature_Type_Lis.getKey()))) {
  143. List<FeatureRate> lis = data.getLabs();
  144. if (ListUtil.isNotEmpty(lis)) {
  145. List<String> nameList = lis
  146. .stream()
  147. .map(featureRate -> featureRate.getFeatureName()).collect(Collectors.toList());
  148. if (ListUtil.isNotEmpty(nameList)) {
  149. List<ConceptPushDTO> lisDTO = getConceptDTOList(nameList, LexiconTypeEnum.LIS_PACKAGE.getKey());
  150. if (isConnect) {
  151. lisDTO = addClientName(lisDTO, searchVo.getHosCode(), ConceptTypeEnum.Lis.getKey());
  152. //lisDTO = removeLisDetail(lisDTO);
  153. }
  154. pushDTO.setLab(lisDTO);
  155. }
  156. }
  157. }
  158. //辅检 概念列表
  159. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Feature_Type_Pacs.getKey()))) {
  160. List<FeatureRate> pacs = data.getPacs();
  161. if (ListUtil.isNotEmpty(pacs)) {
  162. List<String> nameList = pacs
  163. .stream()
  164. .map(featureRate -> featureRate.getFeatureName()).collect(Collectors.toList());
  165. if (ListUtil.isNotEmpty(nameList)) {
  166. List<ConceptPushDTO> pacsDTO = getConceptDTOList(nameList, LexiconTypeEnum.PACS_ITEMS.getKey());
  167. if (isConnect) {
  168. pacsDTO = addClientName(pacsDTO, searchVo.getHosCode(), ConceptTypeEnum.Pacs.getKey());
  169. }
  170. pushDTO.setPacs(pacsDTO);
  171. }
  172. }
  173. }
  174. //诊断 map
  175. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Feature_Type_Disease.getKey()))) {
  176. if (ListUtil.isNotEmpty(dis)) {
  177. Map<String, List<ConceptPushDTO>> disMapDTO = new LinkedHashMap<>();
  178. Map<String, List<FeatureRate>> disFeatureMap = new LinkedHashMap<>();
  179. //诊断分类
  180. for (FeatureRate featureRate : dis) {
  181. if (StringUtil.isBlank(featureRate.getDesc())) {
  182. featureRate.setDesc("{\"可能诊断\":\"\"}");
  183. }
  184. Map<String, Object> descMap = FastJsonUtils.getJsonToMap(featureRate.getDesc());
  185. for (String disClass : descMap.keySet()) {
  186. List<FeatureRate> featureRateList = Lists.newLinkedList();
  187. if (disFeatureMap.get(disClass) != null) {
  188. featureRateList = disFeatureMap.get(disClass);
  189. }
  190. featureRateList.add(featureRate);
  191. disFeatureMap.put(disClass, featureRateList);
  192. }
  193. }
  194. for (Map.Entry<String, List<FeatureRate>> entry : disFeatureMap.entrySet()) {
  195. List<String> nameListByDisClass = entry.getValue()
  196. .stream()
  197. .map(featureRate -> featureRate.getFeatureName()).collect(Collectors.toList());
  198. if (ListUtil.isNotEmpty(nameListByDisClass)) {
  199. List<ConceptPushDTO> disDTO
  200. = getConceptDTOList(nameListByDisClass, LexiconTypeEnum.DIAGNOSIS.getKey());
  201. if (isConnect) {
  202. disDTO = addClientName(disDTO, searchVo.getHosCode(), ConceptTypeEnum.Disease.getKey());
  203. }
  204. disMapDTO.put(entry.getKey(), disDTO);
  205. }
  206. }
  207. pushDTO.setDis(disMapDTO);
  208. }
  209. }
  210. //核心指标 list
  211. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Feature_Type_Indication.getKey()))) {
  212. List<MedicalIndication> medicalIndicationList = data.getMedicalIndications();
  213. ConceptBaseVO conceptBaseVO = new ConceptBaseVO();
  214. if (ListUtil.isNotEmpty(medicalIndicationList)) {
  215. for (MedicalIndication medicalIndication : medicalIndicationList) {
  216. medicalIndication.setLibType(LexiconTypeEnum.CORE_INDICATORS.getKey());
  217. medicalIndication.setType(ConceptTypeEnum.Indication.getKey());
  218. //关联概念,增加概念id
  219. conceptBaseVO.setName(medicalIndication.getName());
  220. conceptBaseVO.setLibType(LexiconTypeEnum.CORE_INDICATORS.getKey());
  221. Concept medConcept = conceptFacade.getConcept(conceptBaseVO);
  222. if (medConcept != null) {
  223. medicalIndication.setConceptId(medConcept.getId());
  224. }
  225. if (ListUtil.isNotEmpty(medicalIndication.getDetails())) {
  226. for (MedicalIndicationDetail detail : medicalIndication.getDetails()) {
  227. //量表,增加概念id;其他类型保留图谱返回结果
  228. if (detail.getType().equals(1)) {
  229. JSONObject scaleJson = detail.getContent();
  230. if (null != scaleJson.get("name")) {
  231. String scaleName = scaleJson.get("name").toString();
  232. conceptBaseVO.setName(scaleName);
  233. conceptBaseVO.setLibType(LexiconTypeEnum.GAUGE.getKey());
  234. Concept scaleConcept = conceptFacade.getConcept(conceptBaseVO);
  235. scaleJson.put("libType", LexiconTypeEnum.GAUGE.getKey());
  236. scaleJson.put("type", ConceptTypeEnum.Scale.getKey());
  237. if (scaleConcept != null) {
  238. scaleJson.put("conceptId", scaleConcept.getId());
  239. } else {
  240. scaleJson.put("conceptId", null);
  241. }
  242. detail.setContent(scaleJson);
  243. }
  244. }
  245. }
  246. }
  247. }
  248. pushDTO.setMedicalIndications(medicalIndicationList);
  249. }
  250. }
  251. return pushDTO;
  252. }
  253. /**
  254. * 获取管理评估大数据推理内容
  255. *
  256. * @param searchVo
  257. * @return
  258. */
  259. public Map<String, JSONObject> getManagementEvaluationContent(SearchVo searchVo) {
  260. ResponseData data = clinicalFacade.processClinicalData(searchVo);
  261. String featureType = searchVo.getFeatureType();
  262. String[] featureTypes = featureType.split(",|,");
  263. Set<String> featureTypeSet = new HashSet(Arrays.asList(featureTypes));
  264. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Feature_Type_ManagementEvaluation.getKey()))) {
  265. return data.getManagementEvaluation();
  266. } else {
  267. return null;
  268. }
  269. }
  270. /**
  271. * 获取量表推理内容
  272. *
  273. * @param searchVo
  274. * @return
  275. */
  276. public Map<String, Object> scale(SearchVo searchVo) {
  277. Map<String, Object> data = clinicalFacade.scale(searchVo);
  278. return data;
  279. }
  280. /**
  281. * 获取治疗方案
  282. *
  283. * @param searchVo
  284. * @return
  285. */
  286. public Map<String, Object> getTreatment(SearchVo searchVo) {
  287. ResponseData data = clinicalFacade.processClinicalData(searchVo);
  288. Map<String, JSONObject> treat = data.getTreat();
  289. if (StringUtil.isBlank(searchVo.getDiseaseName())) {
  290. throw new CommonException(CommonErrorCode.PARAM_ERROR, "请输入需获取治疗方案的诊断名称");
  291. }
  292. Map<String, Object> treatmentMap
  293. = treatmentFacade.getTreatment(treat, searchVo.getDiseaseName(), searchVo.getDisType());
  294. return treatmentMap;
  295. }
  296. /**
  297. * 推理返回概念
  298. *
  299. * @param nameList
  300. * @param libType
  301. * @return
  302. */
  303. public List<ConceptPushDTO> getConceptDTOList(List<String> nameList, Integer libType) {
  304. List<Concept> concepts = conceptFacade.getListByNamesAndType(nameList, libType);
  305. Map<String, Concept> conceptMap = EntityUtil.makeEntityMap(concepts, "libName");
  306. List<ConceptPushDTO> conceptDTOS = Lists.newLinkedList();
  307. for (String name : nameList) {
  308. ConceptPushDTO conceptDTO = new ConceptPushDTO();
  309. conceptDTO.setName(name);
  310. conceptDTO.setLibType(libType);
  311. conceptDTO.setType(ParamConvertUtil.libConvert2Concept(libType));
  312. if (conceptMap.containsKey(name) && conceptMap.get(name) != null) {
  313. Concept concept = conceptMap.get(name);
  314. conceptDTO.setConceptId(concept.getId());
  315. }
  316. conceptDTOS.add(conceptDTO);
  317. }
  318. return conceptDTOS;
  319. }
  320. /**
  321. * 根据诊断推送确定科室
  322. *
  323. * @param dis
  324. * @return
  325. */
  326. public ConceptPushDTO getDept(List<FeatureRate> dis) {
  327. String deptName = "";
  328. if (ListUtil.isNotEmpty(dis)) {
  329. for (FeatureRate featureRate : dis) {
  330. if (StringUtil.isNotBlank(featureRate.getExtraProperty())) {
  331. deptName = featureRate.getExtraProperty();
  332. break;
  333. }
  334. }
  335. }
  336. //没有推送信息时,默认取全科模板
  337. if (StringUtil.isBlank(deptName)) {
  338. deptName = "全科";
  339. }
  340. ConceptBaseVO conceptBaseVO = new ConceptBaseVO();
  341. conceptBaseVO.setName(deptName);
  342. conceptBaseVO.setLibType(LexiconTypeEnum.DEPARTMENT.getKey());
  343. ConceptPushDTO deptDTO = new ConceptPushDTO();
  344. Concept dept = conceptFacade.getConcept(conceptBaseVO);
  345. if (dept == null && deptName.equals("全科") == false) {
  346. deptName = "全科";
  347. conceptBaseVO.setName(deptName);
  348. dept = conceptFacade.getConcept(conceptBaseVO);
  349. }
  350. if (dept != null) {
  351. deptDTO.setName(deptName);
  352. deptDTO.setConceptId(dept.getId());
  353. deptDTO.setLibType(ConceptTypeEnum.DEPARTMENT.getKey());
  354. }
  355. return deptDTO;
  356. }
  357. /**
  358. * 增加化验公表项
  359. *
  360. * @param lisResults
  361. * @param hosCode
  362. * @return
  363. */
  364. public List<LisResult> addUniqueName(List<LisResult> lisResults, String hosCode) {
  365. //化验项转公表内容,参数处理
  366. if (ListUtil.isNotEmpty(lisResults)) {
  367. List<String> mealNameList = lisResults
  368. .stream()
  369. .map(lisResult -> lisResult.getName()).collect(Collectors.toList());
  370. LisConfigVO lisConfigVO = new LisConfigVO();
  371. lisConfigVO.setHosCode(hosCode);
  372. lisConfigVO.setMealNameList(mealNameList);
  373. RespDTO<Map<String, Map<String, String>>> lisConfigRes
  374. = tranServiceClient.getLisConfigByMealNameAndHosCode(lisConfigVO);
  375. Map<String, Map<String, String>> lisConfigMap = new LinkedHashMap<>();
  376. if (RespDTOUtil.respIsOK(lisConfigRes)) {
  377. lisConfigMap = lisConfigRes.data;
  378. }
  379. for (LisResult lisResult : lisResults) {
  380. if (!lisResult.getSource().equals(LisSourceEnum.Outer.getKey())) {
  381. continue;
  382. }
  383. if (lisResult.getDetailName() == null) {
  384. lisResult.setDetailName("");
  385. }
  386. if (lisConfigMap.get(lisResult.getName()) != null) {
  387. lisResult.setUniqueName(lisConfigMap.get(lisResult.getName()).get(lisResult.getDetailName()));
  388. }
  389. }
  390. }
  391. return lisResults;
  392. }
  393. /**
  394. * 添加外部名称(调用方)
  395. *
  396. * @param concepts
  397. * @param hosCode
  398. * @param type
  399. * @return
  400. */
  401. public List<ConceptPushDTO> addClientName(List<ConceptPushDTO> concepts, String hosCode, Integer type) {
  402. HosCodeVO hosCodeVO = new HosCodeVO();
  403. hosCodeVO.setHosCode(hosCode);
  404. LisConfigVO lisConfigVO = new LisConfigVO();
  405. lisConfigVO.setHosCode(hosCode);
  406. List<String> uniqueNameList = concepts
  407. .stream()
  408. .map(concept -> concept.getName()).collect(Collectors.toList());
  409. lisConfigVO.setUniqueNameList(uniqueNameList);
  410. if (type.equals(ConceptTypeEnum.Lis.getKey())) {
  411. RespDTO<Map<String, List<String>>> lisRes
  412. = tranServiceClient.getLisConfigByUniqueNameAndHosCode(lisConfigVO);
  413. if (RespDTOUtil.respIsOK(lisRes)) {
  414. Map<String, List<String>> lisMappingByUniqueName = lisRes.data;
  415. for (ConceptPushDTO concept : concepts) {
  416. List<String> clientNames = lisMappingByUniqueName.get(concept.getName());
  417. if (ListUtil.isNotEmpty(clientNames)) {
  418. concept.setClientNames(clientNames);
  419. }
  420. }
  421. }
  422. } else if (type.equals(ConceptTypeEnum.Pacs.getKey())) {
  423. RespDTO<Map<String, List<String>>> pacsRes
  424. = tranServiceClient.getPacsConfigByUniqueNameAndHosCode(hosCodeVO);
  425. if (RespDTOUtil.respIsOK(pacsRes)) {
  426. Map<String, List<String>> pacsConfigMapByUniqueName = pacsRes.data;
  427. for (ConceptPushDTO concept : concepts) {
  428. List<String> clientNames = pacsConfigMapByUniqueName.get(concept.getName());
  429. if (ListUtil.isNotEmpty(clientNames)) {
  430. concept.setClientNames(clientNames);
  431. }
  432. }
  433. }
  434. } else if (type.equals(ConceptTypeEnum.Disease.getKey())) {
  435. RespDTO<Map<String, String>> disRes = tranServiceClient.getDiseaseIcdByHosCode(hosCodeVO);
  436. if (RespDTOUtil.respIsOK(disRes)) {
  437. Map<String, String> disMap = disRes.data;
  438. for (ConceptPushDTO concept : concepts) {
  439. String clientName = disMap.get(concept.getName());
  440. if (StringUtil.isNotBlank(clientName)) {
  441. List<String> clientNames = Lists.newLinkedList();
  442. clientNames.add(clientName);
  443. concept.setClientNames(clientNames);
  444. }
  445. }
  446. }
  447. }
  448. return concepts;
  449. }
  450. /**
  451. * 外部化验返回时,公表匹配出套餐,保留套餐,删除细项;否则保留公表
  452. *
  453. * @param lisDTO
  454. * @return
  455. */
  456. /*public List<ConceptPushDTO> removeLisDetail(List<ConceptPushDTO> lisDTO) {
  457. List<ConceptPushDTO> retLisDTO = Lists.newLinkedList();
  458. if (ListUtil.isEmpty(lisDTO)) {
  459. return retLisDTO;
  460. }
  461. List<String> mealNameList = lisDTO.stream().map(lis -> lis.getClientName()).filter(mealName -> mealName != null && mealName != "").distinct().collect(Collectors.toList());
  462. List<ConceptPushDTO> mealConceptList = getConceptDTOList(mealNameList, LexiconTypeEnum.LIS_TABLES.getKey());
  463. Map<String, ConceptPushDTO> mealConceptMap = EntityUtil.makeEntityMap(mealConceptList, "name");
  464. List<String> addedName = Lists.newLinkedList();
  465. for (ConceptPushDTO conceptPushDTO : lisDTO) {
  466. if (addedName.contains(conceptPushDTO.getName())) {
  467. continue;
  468. }
  469. if (StringUtil.isBlank(conceptPushDTO.getClientName()) || conceptPushDTO.getClientName().equals(conceptPushDTO.getName())) {
  470. addedName.add(conceptPushDTO.getName());
  471. retLisDTO.add(conceptPushDTO);
  472. } else {
  473. ConceptPushDTO conceptPushDTOConvert = mealConceptMap.get(conceptPushDTO.getClientName());
  474. conceptPushDTOConvert.setClientName(conceptPushDTO.getClientName());
  475. addedName.add(conceptPushDTOConvert.getName());
  476. retLisDTO.add(conceptPushDTOConvert);
  477. }
  478. }
  479. return retLisDTO;
  480. }*/
  481. }