PushFacade.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. package com.diagbot.facade;
  2. import com.diagbot.client.CdssCoreClient;
  3. import com.diagbot.dto.BillMsg;
  4. import com.diagbot.dto.IndicationDTO;
  5. import com.diagbot.dto.PushBaseDTO;
  6. import com.diagbot.dto.PushDTO;
  7. import com.diagbot.dto.PushPlanDTO;
  8. import com.diagbot.dto.RespDTO;
  9. import com.diagbot.dto.TreatDTO;
  10. import com.diagbot.entity.ConceptDetail;
  11. import com.diagbot.enums.StaticTypeEnum;
  12. import com.diagbot.util.BeanUtil;
  13. import com.diagbot.util.ListUtil;
  14. import com.diagbot.util.RespDTOUtil;
  15. import com.diagbot.util.StringUtil;
  16. import com.diagbot.vo.IndicationPushVO;
  17. import com.diagbot.vo.PushPlanVO;
  18. import com.diagbot.vo.PushVO;
  19. import com.diagbot.vo.SearchData;
  20. import com.google.common.collect.Lists;
  21. import org.apache.commons.collections4.MapUtils;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.stereotype.Component;
  24. import java.util.ArrayList;
  25. import java.util.Arrays;
  26. import java.util.HashMap;
  27. import java.util.List;
  28. import java.util.Map;
  29. import java.util.stream.Collectors;
  30. /**
  31. * @Description:
  32. * @Author:zhaops
  33. * @time: 2020/8/4 14:08
  34. */
  35. @Component
  36. public class PushFacade {
  37. @Autowired
  38. private AssembleFacade assembleFacade;
  39. @Autowired
  40. private CdssCoreClient cdssCoreClient;
  41. @Autowired
  42. private ConceptInfoFacade conceptInfoFacade;
  43. /**
  44. * 基础推理-症状、查体、化验、辅检、诊断
  45. *
  46. * @param pushVO
  47. */
  48. public PushDTO push(PushVO pushVO) {
  49. if (pushVO.getDiseaseName() != null
  50. && StringUtil.isBlank(pushVO.getDiseaseName().getName())
  51. && StringUtil.isBlank(pushVO.getDiseaseName().getUniqueName())) {
  52. pushVO.setDiseaseName(null);
  53. }
  54. SearchData searchData = new SearchData();
  55. BeanUtil.copyProperties(pushVO, searchData);
  56. //入参映射
  57. searchData = assembleFacade.assembleData(searchData);
  58. BeanUtil.copyProperties(searchData, pushVO);
  59. RespDTO<PushDTO> resp = cdssCoreClient.push(pushVO);
  60. RespDTOUtil.respNGDeal(resp, "远程调用推理接口失败");
  61. PushDTO data = resp.data;
  62. //------------------测试数据开始------------------
  63. // PushDTO data = testDataPush();
  64. //------------------测试数据结束------------------
  65. //出参映射
  66. data = assembleFacade.assemblePushDTO(data, pushVO.getHospitalId());
  67. //是否有静态信息
  68. if (pushVO.getGetStaticKnowledge() != null
  69. && pushVO.getGetStaticKnowledge().equals(1)) {
  70. data = getStaticKnoledge(data);
  71. }
  72. //一般治疗
  73. if (data != null) {
  74. data.setTreat(retGeneraTreat(data, pushVO.getHospitalId()));
  75. }
  76. return data;
  77. }
  78. /**
  79. * 提示信息相关推理-危急值、开单合理项、药品禁忌等
  80. *
  81. * @param indicationPushVO
  82. */
  83. public IndicationDTO indicationPush(IndicationPushVO indicationPushVO) {
  84. SearchData searchData = new SearchData();
  85. BeanUtil.copyProperties(indicationPushVO, searchData);
  86. //入参映射
  87. searchData = assembleFacade.assembleData(searchData);
  88. BeanUtil.copyProperties(searchData, indicationPushVO);
  89. RespDTO<IndicationDTO> resp = cdssCoreClient.indication(indicationPushVO);
  90. RespDTOUtil.respNGDeal(resp, "远程调用推理接口失败");
  91. IndicationDTO indicationDTO = resp.data;
  92. return indicationDTO;
  93. }
  94. /**
  95. * 推理持续检验检查计划
  96. *
  97. * @param pushPlanVO
  98. * @return
  99. */
  100. public PushPlanDTO pushPlan(PushPlanVO pushPlanVO) {
  101. SearchData searchData = new SearchData();
  102. BeanUtil.copyProperties(pushPlanVO, searchData);
  103. //入参映射
  104. searchData = assembleFacade.assembleData(searchData);
  105. BeanUtil.copyProperties(searchData, pushPlanVO);
  106. RespDTO<PushPlanDTO> resp = cdssCoreClient.pushPlan(pushPlanVO);
  107. RespDTOUtil.respNGDeal(resp, "远程调用推理接口失败");
  108. PushPlanDTO pushPlanDTO = resp.data;
  109. return pushPlanDTO;
  110. }
  111. /**
  112. * 推理结果标志是否包含静态知识
  113. *
  114. * @param pushDTO
  115. * @return
  116. */
  117. public PushDTO getStaticKnoledge(PushDTO pushDTO) {
  118. List<String> conceptNameList = Lists.newLinkedList();
  119. List<PushBaseDTO> conceptBaseList = Lists.newArrayList();
  120. if (ListUtil.isNotEmpty(pushDTO.getLis())) {
  121. conceptBaseList.addAll(pushDTO.getLis());
  122. }
  123. if (ListUtil.isNotEmpty(pushDTO.getPacs())) {
  124. conceptBaseList.addAll(pushDTO.getPacs());
  125. }
  126. if (pushDTO.getDis() != null) {
  127. for (Map.Entry<String, List<PushBaseDTO>> entry : pushDTO.getDis().entrySet()) {
  128. if (ListUtil.isNotEmpty(entry.getValue())) {
  129. conceptBaseList.addAll(entry.getValue());
  130. }
  131. }
  132. }
  133. if (ListUtil.isNotEmpty(pushDTO.getMedicines())) {
  134. conceptBaseList.addAll(pushDTO.getMedicines());
  135. }
  136. if (ListUtil.isNotEmpty(pushDTO.getOperations())) {
  137. conceptBaseList.addAll(pushDTO.getOperations());
  138. }
  139. if (ListUtil.isNotEmpty(conceptBaseList)) {
  140. conceptNameList = conceptBaseList.stream()
  141. .map(i -> i.getName())
  142. .collect(Collectors.toList());
  143. Map<String, List<ConceptDetail>> conceptDetailMap = conceptInfoFacade.getDetailByConcept(conceptNameList);
  144. if (pushDTO.getDis() != null) {
  145. for (Map.Entry<String, List<PushBaseDTO>> entry : pushDTO.getDis().entrySet()) {
  146. if (ListUtil.isNotEmpty(entry.getValue())) {
  147. entry.getValue().forEach(item -> {
  148. if (conceptDetailMap.containsKey(item.getName() + "_" + StaticTypeEnum.getName(1))) {
  149. item.setHasInfo(1);
  150. }
  151. });
  152. }
  153. }
  154. }
  155. if (ListUtil.isNotEmpty(pushDTO.getLis())) {
  156. pushDTO.getLis().forEach(item -> {
  157. if (conceptDetailMap.containsKey(item.getName() + "_" + StaticTypeEnum.getName(3))) {
  158. item.setHasInfo(1);
  159. }
  160. });
  161. }
  162. if (ListUtil.isNotEmpty(pushDTO.getPacs())) {
  163. pushDTO.getPacs().forEach(item -> {
  164. if (conceptDetailMap.containsKey(item.getName() + "_" + StaticTypeEnum.getName(5))) {
  165. item.setHasInfo(1);
  166. }
  167. });
  168. }
  169. if (ListUtil.isNotEmpty(pushDTO.getMedicines())) {
  170. pushDTO.getMedicines().forEach(item -> {
  171. if (conceptDetailMap.containsKey(item.getName() + "_" + StaticTypeEnum.getName(2))) {
  172. item.setHasInfo(1);
  173. }
  174. });
  175. }
  176. if (ListUtil.isNotEmpty(pushDTO.getOperations())) {
  177. pushDTO.getOperations().forEach(item -> {
  178. if (conceptDetailMap.containsKey(item.getName() + "_" + StaticTypeEnum.getName(6))) {
  179. item.setHasInfo(1);
  180. }
  181. });
  182. }
  183. }
  184. return pushDTO;
  185. }
  186. /**
  187. * 查找一般治疗
  188. *
  189. * @param pushDTO
  190. * @param hospitalId
  191. * @return
  192. */
  193. public List<TreatDTO> retGeneraTreat(PushDTO pushDTO, Long hospitalId) {
  194. List<TreatDTO> retGeneraTreat = pushDTO.getTreat();
  195. if (ListUtil.isNotEmpty(retGeneraTreat)) {
  196. List<String> conceptNameList = retGeneraTreat.stream()
  197. .filter(i -> StringUtil.isNotBlank(i.getUniqueName()))
  198. .map(i -> i.getUniqueName())
  199. .collect(Collectors.toList());
  200. Map<String, List<ConceptDetail>> conceptDetailMap = conceptInfoFacade.getDetailByConcept(conceptNameList);
  201. if (conceptDetailMap == null || conceptDetailMap.size() == 0) {
  202. return retGeneraTreat;
  203. }
  204. for (TreatDTO treatDTO : retGeneraTreat) {
  205. if (StringUtil.isNotBlank(treatDTO.getUniqueName())) {
  206. String key = treatDTO.getUniqueName() + "_" + StaticTypeEnum.getName(1);
  207. if (conceptDetailMap.containsKey(key)) {
  208. List<ConceptDetail> conceptDetailList = conceptDetailMap.get(key);
  209. treatDTO.setGeneraTreat(conceptDetailList
  210. .stream()
  211. .filter(i -> Arrays.asList(i.getContentType().split(",")).contains("4"))
  212. .collect(Collectors.toList())
  213. .get(0).getContent());
  214. }
  215. }
  216. }
  217. }
  218. return retGeneraTreat;
  219. }
  220. /**
  221. * 推理测试数据设置
  222. *
  223. * @return 推理测试数据
  224. */
  225. private PushDTO testDataPush() {
  226. PushDTO data = new PushDTO();
  227. //症状
  228. if (ListUtil.isEmpty(data.getSymptom())) {
  229. List<PushBaseDTO> symptom = Lists.newArrayList();
  230. PushBaseDTO sympItem1 = new PushBaseDTO();
  231. sympItem1.setName("发热");
  232. symptom.add(sympItem1);
  233. PushBaseDTO sympItem2 = new PushBaseDTO();
  234. sympItem2.setName("咳嗽");
  235. symptom.add(sympItem2);
  236. data.setSymptom(symptom);
  237. }
  238. //体格检查
  239. if (ListUtil.isEmpty(data.getVital())) {
  240. List<PushBaseDTO> vital = Lists.newArrayList();
  241. PushBaseDTO vital1 = new PushBaseDTO();
  242. vital1.setName("肾区叩痛阳性");
  243. vital.add(vital1);
  244. PushBaseDTO vital2 = new PushBaseDTO();
  245. vital2.setName("血压升高");
  246. vital.add(vital2);
  247. data.setVital(vital);
  248. }
  249. //检验
  250. if (ListUtil.isEmpty(data.getLis())) {
  251. List<PushBaseDTO> lis = Lists.newArrayList();
  252. PushBaseDTO lis1 = new PushBaseDTO();
  253. lis1.setName("血常规");
  254. lis.add(lis1);
  255. PushBaseDTO lis2 = new PushBaseDTO();
  256. lis2.setName("尿常规");
  257. lis.add(lis2);
  258. PushBaseDTO lis3 = new PushBaseDTO();
  259. lis3.setName("幽门螺杆菌抗体测定");
  260. lis.add(lis3);
  261. data.setLis(lis);
  262. }
  263. //检查
  264. if (ListUtil.isEmpty(data.getPacs())) {
  265. List<PushBaseDTO> pacs = Lists.newArrayList();
  266. PushBaseDTO pacs1 = new PushBaseDTO();
  267. pacs1.setName("普通胃镜检查");
  268. pacs.add(pacs1);
  269. PushBaseDTO pacs2 = new PushBaseDTO();
  270. pacs2.setName("经直肠前列腺彩超检查");
  271. pacs.add(pacs2);
  272. data.setPacs(pacs);
  273. }
  274. //药品
  275. if (ListUtil.isEmpty(data.getMedicines())) {
  276. List<PushBaseDTO> medicines = Lists.newArrayList();
  277. PushBaseDTO medicines1 = new PushBaseDTO();
  278. medicines1.setName("钙通道阻滞剂");
  279. medicines.add(medicines1);
  280. PushBaseDTO medicines2 = new PushBaseDTO();
  281. medicines2.setName("盐酸肾上腺素注射液");
  282. medicines.add(medicines2);
  283. data.setMedicines(medicines);
  284. }
  285. //手术和操作
  286. if (ListUtil.isEmpty(data.getOperations())) {
  287. List<PushBaseDTO> operations = Lists.newArrayList();
  288. PushBaseDTO operations1 = new PushBaseDTO();
  289. operations1.setName("前列腺按摩");
  290. operations.add(operations1);
  291. PushBaseDTO operations2 = new PushBaseDTO();
  292. operations2.setName("经皮冠状动脉介入治疗(PCI)");
  293. operations.add(operations2);
  294. data.setOperations(operations);
  295. }
  296. //诊断
  297. if (MapUtils.isEmpty(data.getDis())) {
  298. List<PushBaseDTO> dis = Lists.newArrayList();
  299. PushBaseDTO disItem1 = new PushBaseDTO();
  300. disItem1.setName("急性胰腺炎");
  301. dis.add(disItem1);
  302. PushBaseDTO disItem2 = new PushBaseDTO();
  303. disItem2.setName("无晶状体眼");
  304. dis.add(disItem2);
  305. Map<String, List<PushBaseDTO>> disMap = new HashMap<>();
  306. disMap.put("可能诊断", dis);
  307. List<PushBaseDTO> dis2 = Lists.newArrayList();
  308. dis2.addAll(dis);
  309. PushBaseDTO disItem3 = new PushBaseDTO();
  310. disItem3.setName("糖尿病");
  311. dis2.add(disItem3);
  312. disMap.put("鉴别诊断", dis2);
  313. data.setDis(disMap);
  314. }
  315. //一般治疗
  316. if (ListUtil.isEmpty(data.getTreat())) {
  317. List<TreatDTO> treat = new ArrayList<>();
  318. TreatDTO treatDTO1 = new TreatDTO();
  319. treatDTO1.setName("无晶状体眼");
  320. treatDTO1.setUniqueName("无晶状体眼");
  321. treat.add(treatDTO1);
  322. data.setTreat(treat);
  323. }
  324. return data;
  325. }
  326. /**
  327. * 提醒测试数据
  328. *
  329. * @return 提醒测试数据
  330. */
  331. private IndicationDTO indicationTestData() {
  332. IndicationDTO indicationDTO = new IndicationDTO();
  333. List<BillMsg> billMsgList = Lists.newArrayList();
  334. BillMsg item1 = new BillMsg();
  335. item1.setMsg("该患者年龄15,不宜开左氧氟沙星");
  336. item1.setOrderName("左氧氟沙星");
  337. item1.setOrderStandName("左氧氟沙星");
  338. item1.setContent("年龄15");
  339. item1.setType("禁忌年龄");
  340. billMsgList.add(item1);
  341. indicationDTO.setBillMsgList(billMsgList);
  342. List<BillMsg> criticalValList = Lists.newArrayList();
  343. BillMsg item2 = new BillMsg();
  344. item2.setMsg("该患者血常规血小板计数30,请留意");
  345. item2.setOrderName("");
  346. item2.setOrderStandName("");
  347. item2.setContent("血常规血小板计数30");
  348. item2.setType("血常规血小板计数30");
  349. criticalValList.add(item2);
  350. indicationDTO.setCriticalValList(criticalValList);
  351. //加入高危假数据
  352. if (ListUtil.isEmpty(indicationDTO.getHighRiskList())) {
  353. List<BillMsg> highRiskList = Lists.newArrayList();
  354. BillMsg item3 = new BillMsg();
  355. item3.setMsg("盐酸肾上腺素注射液为高风险药品,请留意(假数据)");
  356. item3.setOrderName("盐酸肾上腺素注射液");
  357. item3.setOrderStandName("盐酸肾上腺素注射液");
  358. item3.setContent("");
  359. item3.setType("药品");
  360. highRiskList.add(item3);
  361. indicationDTO.setHighRiskList(highRiskList);
  362. }
  363. //加入其他提醒假数据
  364. if (ListUtil.isEmpty(indicationDTO.getOtherList())) {
  365. List<BillMsg> otherList = new ArrayList<>();
  366. BillMsg other = new BillMsg();
  367. other.setMsg("该患者血小板计数<10×10^9/L,建议输注血小板。(假数据)");
  368. other.setOrderName("血小板");
  369. other.setOrderStandName("血小板");
  370. other.setContent("");
  371. other.setType("输血");
  372. otherList.add(other);
  373. indicationDTO.setOtherList(otherList);
  374. }
  375. return indicationDTO;
  376. }
  377. }