PushFacade.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. package com.diagbot.facade;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.diagbot.client.AiptServiceClient;
  4. import com.diagbot.client.bean.ConceptBaseVO;
  5. import com.diagbot.client.bean.ConceptExistVO;
  6. import com.diagbot.client.bean.ResponseData;
  7. import com.diagbot.client.bean.SearchData;
  8. import com.diagbot.dto.ConceptBaseDTO;
  9. import com.diagbot.dto.ConceptPushDTO;
  10. import com.diagbot.dto.PushDTO;
  11. import com.diagbot.dto.PushKYJDTO;
  12. import com.diagbot.dto.QuestionDTO;
  13. import com.diagbot.dto.QuestionPushDTO;
  14. import com.diagbot.dto.RespDTO;
  15. import com.diagbot.entity.DeptVital;
  16. import com.diagbot.entity.QuestionInfo;
  17. import com.diagbot.enums.ConceptTypeEnum;
  18. import com.diagbot.enums.FeatureTypeEnum;
  19. import com.diagbot.enums.IsDeleteEnum;
  20. import com.diagbot.enums.LisSourceEnum;
  21. import com.diagbot.enums.QuestionTypeEnum;
  22. import com.diagbot.enums.TagTypeEnum;
  23. import com.diagbot.exception.CommonErrorCode;
  24. import com.diagbot.exception.CommonException;
  25. import com.diagbot.util.BeanUtil;
  26. import com.diagbot.util.EntityUtil;
  27. import com.diagbot.util.ListUtil;
  28. import com.diagbot.util.RespDTOUtil;
  29. import com.diagbot.vo.LisResult;
  30. import com.diagbot.vo.PushKYJVO;
  31. import com.diagbot.vo.PushVO;
  32. import com.diagbot.vo.QuestionIds2VO;
  33. import com.diagbot.vo.QuestionVO;
  34. import com.google.common.collect.Lists;
  35. import org.springframework.beans.factory.annotation.Autowired;
  36. import org.springframework.stereotype.Component;
  37. import java.util.Arrays;
  38. import java.util.HashSet;
  39. import java.util.LinkedHashMap;
  40. import java.util.List;
  41. import java.util.Map;
  42. import java.util.Set;
  43. import java.util.stream.Collectors;
  44. /**
  45. * @Description:
  46. * @Author:zhaops
  47. * @time: 2018/11/20 11:18
  48. */
  49. @Component
  50. public class PushFacade {
  51. @Autowired
  52. private QuestionFacade questionFacade;
  53. @Autowired
  54. private DeptVitalFacade deptVitalFacade;
  55. @Autowired
  56. private TreatmentFacade treatmentFacade;
  57. @Autowired
  58. private AiptServiceClient aiptServiceClient;
  59. @Autowired
  60. private AssembleFacade assembleFacade;
  61. /**
  62. * 中间层接口
  63. *
  64. * @param searchData
  65. * @return ResponseData
  66. */
  67. public ResponseData pushAipt(SearchData searchData) {
  68. RespDTO<ResponseData> res = aiptServiceClient.aiptData(searchData);
  69. RespDTOUtil.respNGDeal(res, "中间层没有返回结果");
  70. return res.data;
  71. }
  72. /**
  73. * 中间层推理-症状……诊断、核心指标
  74. *
  75. * @param searchData
  76. * @return
  77. */
  78. public PushDTO pushInnerAipt(SearchData searchData) {
  79. RespDTO<PushDTO> res = aiptServiceClient.pushInner(searchData);
  80. RespDTOUtil.respNGDeal(res, "中间层没有返回结果");
  81. return res.data;
  82. }
  83. /**
  84. * 中间层获取治疗方案
  85. *
  86. * @param searchData
  87. * @return
  88. */
  89. public Map<String, Object> getTreatment(SearchData searchData) {
  90. RespDTO<Map<String, Object>> res = aiptServiceClient.getTreatment(searchData);
  91. RespDTOUtil.respNGDealCover(res, "中间层没有返回治疗方案");
  92. return res.data;
  93. }
  94. /**
  95. * 推理接口
  96. *
  97. * @param pushVO
  98. * @return
  99. */
  100. public PushDTO pushInner(PushVO pushVO) {
  101. PushDTO pushDTO = new PushDTO();
  102. SearchData aiSearchData = assembleFacade.assembleData(pushVO);
  103. PushDTO data = pushInnerAipt(aiSearchData);
  104. String featureType = pushVO.getFeatureType();
  105. String[] featureTypes = featureType.split(",|,");
  106. Set<String> featureTypeSet = new HashSet(Arrays.asList(featureTypes));
  107. //推理结果返回科室
  108. pushDTO.setDept(data.getDept());
  109. //症状 概念+标签id
  110. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Symptom.getKey()))) {
  111. List<ConceptPushDTO> symptom = data.getSymptom();
  112. if (ListUtil.isNotEmpty(symptom)) {
  113. List<ConceptPushDTO> symptomDTO = addQuestionId(symptom, QuestionTypeEnum.Symptom.getKey());
  114. pushDTO.setSymptom(symptomDTO);
  115. }
  116. }
  117. //其他史 概念+标签id
  118. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Other.getKey()))) {
  119. }
  120. //查体标记项
  121. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.VitalResult.getKey())) ||
  122. featureTypeSet.contains(String.valueOf(FeatureTypeEnum.VitalIndex.getKey()))) {
  123. List<ConceptPushDTO> vitals = data.getVital();
  124. if (ListUtil.isNotEmpty(vitals)) {
  125. List<ConceptPushDTO> vitalDTOList = addQuestionId(vitals, QuestionTypeEnum.Vital.getKey());
  126. pushDTO.setVital(vitalDTOList);
  127. if (ListUtil.isNotEmpty(vitalDTOList)) {
  128. List<Long> vitalIds = vitalDTOList
  129. .stream()
  130. .map(vital -> vital.getId()).filter(vitalId -> vitalId != null).collect(Collectors.toList());
  131. pushDTO.setVitalIds(vitalIds);
  132. }
  133. }
  134. }
  135. //查体模板
  136. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.VitalModule.getKey()))) {
  137. ConceptPushDTO dept = data.getDept();
  138. List<QuestionPushDTO> moduleVitalDTO = getVitalModule(dept, pushVO);
  139. pushDTO.setModuleVital(moduleVitalDTO);
  140. }
  141. //化验 标签列表
  142. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Lis.getKey()))) {
  143. List<QuestionPushDTO> labs = data.getLab();
  144. if (ListUtil.isNotEmpty(labs)) {
  145. List<QuestionPushDTO> lisDTO = Lists.newLinkedList();
  146. Map<String, Long> lisMap = new LinkedHashMap<>();
  147. List<String> mealNameList = labs
  148. .stream()
  149. .map(lab -> lab.getName()).collect(Collectors.toList());
  150. Map<String, QuestionDTO> questionDTOMap
  151. = addLisQuestion(mealNameList, pushVO.getAge(), pushVO.getSex());
  152. for (String name : mealNameList) {
  153. QuestionPushDTO questionPushDTO = new QuestionPushDTO();
  154. QuestionDTO questionDTO = questionDTOMap.get(name);
  155. if (questionDTO != null) {
  156. BeanUtil.copyProperties(questionDTO, questionPushDTO);
  157. } else {
  158. questionPushDTO.setName(name);
  159. questionPushDTO.setType(ConceptTypeEnum.Lis.getKey());
  160. }
  161. questionPushDTO.setLibType(12);
  162. if (lisMap.containsKey(name) && lisMap.get(name) != null) {
  163. questionPushDTO.setConceptId(lisMap.get(name));
  164. }
  165. lisDTO.add(questionPushDTO);
  166. }
  167. /* List<String> uniqueNameList = labs.stream().map(lab -> lab.getName()).collect(Collectors.toList());
  168. //公表项转套餐项
  169. Map<String, List<String>> lisMapping = lisMappingFacade.getLisMappingByUniqueName(uniqueNameList);
  170. List<String> nameList = Lists.newLinkedList();
  171. Map<String, Long> lisMap = new LinkedHashMap<>();
  172. List<QuestionPushDTO> lisDTO = Lists.newLinkedList();
  173. for (QuestionPushDTO lab : labs) {
  174. if (ListUtil.isNotEmpty(lisMapping.get(lab.getName()))) {
  175. //匹配出多个套餐项默认取第一个
  176. String name = lisMapping.get(lab.getName()).get(0);
  177. if (nameList.contains(name)) {
  178. continue;
  179. }
  180. nameList.add(name);
  181. }
  182. }
  183. if (ListUtil.isNotEmpty(nameList)) {
  184. ConceptExistVO conceptExistVO = new ConceptExistVO();
  185. conceptExistVO.setNameList(nameList);
  186. conceptExistVO.setType(ConceptTypeEnum.Lis.getKey());
  187. RespDTO<Map<String, Long>> respDTO = aiptServiceClient.getConceptMapByNameAndType(conceptExistVO);
  188. if (RespDTOUtil.respIsOK(respDTO)) {
  189. lisMap = respDTO.data;
  190. }
  191. }
  192. Map<String, QuestionDTO> questionDTOMap = addLisQuestion(nameList, pushVO.getAge(), pushVO.getSex());
  193. for (String name : nameList) {
  194. QuestionPushDTO questionPushDTO = new QuestionPushDTO();
  195. QuestionDTO questionDTO = questionDTOMap.get(name);
  196. if (questionDTO != null) {
  197. BeanUtil.copyProperties(questionDTO, questionPushDTO);
  198. } else {
  199. questionPushDTO.setName(name);
  200. questionPushDTO.setType(ConceptTypeEnum.Lis.getKey());
  201. }
  202. questionPushDTO.setLibType(12);
  203. if (lisMap.containsKey(name) && lisMap.get(name) != null) {
  204. questionPushDTO.setConceptId(lisMap.get(name));
  205. }
  206. lisDTO.add(questionPushDTO);
  207. }*/
  208. pushDTO.setLab(lisDTO);
  209. }
  210. }
  211. //辅检 标签列表
  212. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Pacs.getKey()))) {
  213. pushDTO.setPacs(data.getPacs());
  214. }
  215. //诊断 返回分类+标签列表
  216. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Disease.getKey()))) {
  217. pushDTO.setDis(data.getDis());
  218. }
  219. //推送指标 featuretype=22
  220. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.MedicalIndication.getKey()))) {
  221. pushDTO.setMedicalIndications(data.getMedicalIndications());
  222. }
  223. return pushDTO;
  224. }
  225. /**
  226. * 治疗方案推送
  227. *
  228. * @param pushVO
  229. * @return
  230. */
  231. public Map<String, Object> pushTreatment(PushVO pushVO) {
  232. SearchData searchData = assembleFacade.assembleData(pushVO);
  233. Map<String, Object> data = getTreatment(searchData);
  234. data = treatmentFacade.getTreatment(data, pushVO.getPatientId());
  235. return data;
  236. }
  237. /**
  238. * 推理接口-快易检
  239. *
  240. * @param pushKYJVO
  241. * @return
  242. */
  243. public PushKYJDTO pushKYJ(PushKYJVO pushKYJVO) {
  244. PushVO pushVO = new PushVO();
  245. pushVO.setAge(pushKYJVO.getAge());
  246. pushVO.setSex(pushKYJVO.getSex());
  247. pushVO.setFeatureType(pushKYJVO.getFeatureType());
  248. //化验结果
  249. List<LisResult> lisResultList = pushKYJVO.getLisResultList();
  250. for (LisResult lisResult : lisResultList) {
  251. lisResult.setSource(LisSourceEnum.Outer.getKey());
  252. }
  253. pushVO.setLis(lisResultList);
  254. SearchData searchData = assembleFacade.assembleData(pushVO);
  255. ResponseData responseData = pushAipt(searchData);
  256. PushKYJDTO pushKYJDTO = new PushKYJDTO();
  257. pushKYJDTO.setLabs(responseData.getLabs());
  258. pushKYJDTO.setDis(responseData.getDis());
  259. return pushKYJDTO;
  260. }
  261. /**
  262. * 获取查体模板
  263. *
  264. * @param dept
  265. * @param pushVO
  266. * @return
  267. */
  268. public List<QuestionPushDTO> getVitalModule(ConceptPushDTO dept, PushVO pushVO) {
  269. List<QuestionPushDTO> vitalDTO = Lists.newLinkedList();
  270. if (dept.getConceptId() == null) {
  271. throw new CommonException(CommonErrorCode.NOT_EXISTS, "全科信息未维护");
  272. }
  273. QueryWrapper<DeptVital> deptVitalQueryWrapper = new QueryWrapper<>();
  274. deptVitalQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey()).
  275. eq("dept_id", dept.getConceptId()).
  276. orderByAsc("order_no");
  277. List<DeptVital> deptVitalList = deptVitalFacade.list(deptVitalQueryWrapper);
  278. //科室模板为空时,取全科模板
  279. if (deptVitalList.size() == 0 && dept.getName().equals("全科") == false) {
  280. ConceptBaseVO conceptBaseVO = new ConceptBaseVO();
  281. conceptBaseVO.setName("全科");
  282. conceptBaseVO.setLibType(ConceptTypeEnum.DEPARTMENT.getKey());
  283. RespDTO<ConceptBaseDTO> res = aiptServiceClient.existConcept(conceptBaseVO);
  284. RespDTOUtil.respNGDeal(res, "全科信息未维护");
  285. BeanUtil.copyProperties(res.data, dept);
  286. deptVitalQueryWrapper = new QueryWrapper<>();
  287. deptVitalQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey()).
  288. eq("dept_id", dept.getConceptId()).
  289. orderByAsc("order_no");
  290. deptVitalList = deptVitalFacade.list(deptVitalQueryWrapper);
  291. }
  292. //标签列表
  293. for (DeptVital deptVital : deptVitalList) {
  294. QuestionVO questionVO = new QuestionVO();
  295. QuestionPushDTO questionPushDTO = new QuestionPushDTO();
  296. questionVO.setAge(pushVO.getAge());
  297. questionVO.setSexType(pushVO.getSex());
  298. questionVO.setId(deptVital.getVitalId());
  299. QuestionDTO questionDTO = questionFacade.getById(questionVO);
  300. if (questionDTO != null && questionDTO.getId() != null) {
  301. BeanUtil.copyProperties(questionDTO, questionPushDTO);
  302. questionPushDTO.setLibType(ConceptTypeEnum.Vital.getKey());
  303. vitalDTO.add(questionPushDTO);
  304. }
  305. }
  306. //增加概念id
  307. if (ListUtil.isNotEmpty(vitalDTO)) {
  308. ConceptExistVO conceptExistVO = new ConceptExistVO();
  309. conceptExistVO.setType(ConceptTypeEnum.Vital.getKey());
  310. List<String> vitalNames = vitalDTO.stream().map(vital -> vital.getTagName()).collect(Collectors.toList());
  311. conceptExistVO.setNameList(vitalNames);
  312. RespDTO<Map<String, Long>> respDTO = aiptServiceClient.getConceptMapByNameAndType(conceptExistVO);
  313. if (RespDTOUtil.respIsOK(respDTO)) {
  314. Map<String, Long> vitalMap = respDTO.data;
  315. for (QuestionPushDTO questionPushDTO : vitalDTO) {
  316. if (vitalMap.get(questionPushDTO.getTagName()) != null) {
  317. questionPushDTO.setConceptId(vitalMap.get(questionPushDTO.getTagName()));
  318. }
  319. }
  320. }
  321. }
  322. return vitalDTO;
  323. }
  324. /**
  325. * 概念关联标签,添加标签id ——症状
  326. *
  327. * @param concepts
  328. * @param type
  329. * @return
  330. */
  331. public List<ConceptPushDTO> addQuestionId(List<ConceptPushDTO> concepts, Integer type) {
  332. QueryWrapper<QuestionInfo> questionInfoQueryWrapper = new QueryWrapper<>();
  333. List<String> nameList = concepts.stream()
  334. .map(concept -> concept.getName())
  335. .collect(Collectors.toList());
  336. questionInfoQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
  337. .eq("type", type)
  338. .ne("tag_type", TagTypeEnum.T8.getKey());
  339. //化验填写单匹配name
  340. if (ListUtil.isNotEmpty(nameList)) {
  341. if (type.equals(ConceptTypeEnum.Lis.getKey())) {
  342. questionInfoQueryWrapper.in("name", nameList);
  343. } else {
  344. questionInfoQueryWrapper.in("tag_name", nameList);
  345. }
  346. }
  347. List<QuestionInfo> questionInfoList = questionFacade.list(questionInfoQueryWrapper);
  348. if (ListUtil.isNotEmpty(questionInfoList)) {
  349. Map<String, QuestionInfo> questionInfoMap
  350. = EntityUtil.makeEntityMap(questionInfoList, "tagName");
  351. for (ConceptPushDTO concept : concepts) {
  352. if (questionInfoMap.containsKey(concept.getName())) {
  353. concept.setId(questionInfoMap.get(concept.getName()).getId());
  354. }
  355. }
  356. }
  357. return concepts;
  358. }
  359. /**
  360. * 获取化验填写单
  361. *
  362. * @param nameList
  363. * @param age
  364. * @param sex
  365. * @return
  366. */
  367. public Map<String, QuestionDTO> addLisQuestion(List<String> nameList, Integer age, Integer sex) {
  368. Map<String, QuestionDTO> mapDTO = new LinkedHashMap<>();
  369. if (ListUtil.isEmpty(nameList)) {
  370. return mapDTO;
  371. }
  372. QueryWrapper<QuestionInfo> questionInfoQueryWrapper = new QueryWrapper<>();
  373. questionInfoQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey()).
  374. in("name", nameList).
  375. eq("tag_type", TagTypeEnum.T7.getKey());
  376. List<QuestionInfo> lisList = questionFacade.list(questionInfoQueryWrapper);
  377. if (ListUtil.isNotEmpty(lisList)) {
  378. List<Long> lisIds = lisList.stream().map(lis -> lis.getId()).collect(Collectors.toList());
  379. QuestionIds2VO questionIds2VO = new QuestionIds2VO();
  380. questionIds2VO.setAge(age);
  381. questionIds2VO.setSexType(sex);
  382. questionIds2VO.setIds(lisIds);
  383. Map<Long, Object> questionDTOMap = questionFacade.getByIds(questionIds2VO);
  384. for (Map.Entry<Long, Object> entry : questionDTOMap.entrySet()) {
  385. QuestionDTO questionDTO = new QuestionDTO();
  386. BeanUtil.copyProperties(entry.getValue(), questionDTO);
  387. mapDTO.put(questionDTO.getName(), questionDTO);
  388. }
  389. }
  390. return mapDTO;
  391. }
  392. }