ConceptFacade.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. package com.diagbot.facade;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.diagbot.dto.ConceptBaseDTO;
  4. import com.diagbot.dto.ConceptRetrievalDTO;
  5. import com.diagbot.dto.ConceptWithOrderRes;
  6. import com.diagbot.dto.RetrievalDTO;
  7. import com.diagbot.entity.Concept;
  8. import com.diagbot.entity.wrapper.ConceptWrapper;
  9. import com.diagbot.enums.ConceptTypeEnum;
  10. import com.diagbot.enums.IsDeleteEnum;
  11. import com.diagbot.enums.LexiconRSTypeEnum;
  12. import com.diagbot.enums.LexiconTypeEnum;
  13. import com.diagbot.exception.CommonErrorCode;
  14. import com.diagbot.exception.CommonException;
  15. import com.diagbot.service.impl.ConceptServiceImpl;
  16. import com.diagbot.util.BeanUtil;
  17. import com.diagbot.util.IntegerUtil;
  18. import com.diagbot.util.ListUtil;
  19. import com.diagbot.util.ParamConvertUtil;
  20. import com.diagbot.util.StringUtil;
  21. import com.diagbot.vo.ConceptBaseVO;
  22. import com.diagbot.vo.ConceptExistVO;
  23. import com.diagbot.vo.ConceptFindVO;
  24. import com.diagbot.vo.ConceptSearchVO;
  25. import com.diagbot.vo.ConceptUsualVO;
  26. import com.diagbot.vo.GetStaticKnowledgeVO;
  27. import com.diagbot.vo.RetrievalVO;
  28. import com.google.common.collect.Lists;
  29. import org.springframework.beans.factory.annotation.Autowired;
  30. import org.springframework.stereotype.Component;
  31. import java.util.ArrayList;
  32. import java.util.HashMap;
  33. import java.util.List;
  34. import java.util.Map;
  35. import java.util.stream.Collectors;
  36. /**
  37. * @Description:
  38. * @Author:zhaops
  39. * @time: 2019/5/6 15:04
  40. */
  41. @Component
  42. public class ConceptFacade extends ConceptServiceImpl {
  43. @Autowired
  44. ConceptDetailFacade conceptDetailFacade;
  45. /**
  46. * 验证存在并且获取概念基本信息
  47. *
  48. * @param conceptBaseVO 概念名称和类型
  49. * @return 概念基本信息
  50. */
  51. public Concept exist(ConceptBaseVO conceptBaseVO) {
  52. QueryWrapper<Concept> conceptQueryWrapper = new QueryWrapper<>();
  53. conceptQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
  54. .eq("lib_name", conceptBaseVO.getName())
  55. .eq("lib_type", conceptBaseVO.getLibType());
  56. Concept concept = this.getOne(conceptQueryWrapper);
  57. if (concept == null) {
  58. throw new CommonException(CommonErrorCode.NOT_EXISTS, "概念不存在");
  59. }
  60. return concept;
  61. }
  62. /**
  63. * 获取概念基本信息
  64. *
  65. * @param conceptBaseVO
  66. * @return
  67. */
  68. public Concept getConcept(ConceptBaseVO conceptBaseVO) {
  69. QueryWrapper<Concept> conceptQueryWrapper = new QueryWrapper<>();
  70. conceptQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
  71. .eq("lib_name", conceptBaseVO.getName())
  72. .eq("lib_type", conceptBaseVO.getLibType());
  73. Concept concept = this.getOne(conceptQueryWrapper);
  74. return concept;
  75. }
  76. /**
  77. * 根据概念Id列表获取概念列表Map
  78. *
  79. * @param conceptSearchVO 搜索参数
  80. * @return 术语id和术语 Map
  81. */
  82. public Map<Long, String> getConceptMap(ConceptSearchVO conceptSearchVO) {
  83. //入参验证
  84. if (ListUtil.isEmpty(conceptSearchVO.getConceptIds())) {
  85. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "术语列表不能为空");
  86. }
  87. //获取结构
  88. List<Concept> concepts
  89. = this.getListByIds(conceptSearchVO.getConceptIds());
  90. //出参封装
  91. Map<Long, String> map = new HashMap<>();
  92. if (ListUtil.isNotEmpty(concepts)) {
  93. map = concepts.stream().collect(Collectors.toMap(r -> r.getId(), r -> r.getLibName()));
  94. }
  95. return map;
  96. }
  97. /**
  98. * 根据概念Id列表获取概念列表Map
  99. *
  100. * @param conceptFindVO 搜索参数
  101. * @return 术语id和术语 Map
  102. */
  103. public Map<Long, String> getConceptCondMap(ConceptFindVO conceptFindVO) {
  104. //入参验证
  105. if (ListUtil.isEmpty(conceptFindVO.getConceptIds())) {
  106. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "术语列表不能为空");
  107. }
  108. if (IntegerUtil.isNull(conceptFindVO.getAge())) {
  109. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "年龄不能为空");
  110. }
  111. if (IntegerUtil.isNull(conceptFindVO.getSexType())) {
  112. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "性别不能为空");
  113. }
  114. //获取结构
  115. List<ConceptBaseDTO> concepts
  116. = this.getConceptConMap(conceptFindVO);
  117. //出参封装
  118. Map<Long, String> map = new HashMap<>();
  119. if (ListUtil.isNotEmpty(concepts)) {
  120. map = concepts.stream().collect(Collectors.toMap(r -> r.getConceptId(), r -> r.getName()));
  121. }
  122. return map;
  123. }
  124. /**
  125. * 根据概念Id列表获取概念列表
  126. *
  127. * @param ids
  128. * @return
  129. */
  130. public List<Concept> getListByIds(List<Long> ids) {
  131. QueryWrapper<Concept> conceptQueryWrapper = new QueryWrapper<>();
  132. conceptQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
  133. .in("id", ids);
  134. List<Concept> list = this.list(conceptQueryWrapper);
  135. return list;
  136. }
  137. /**
  138. * 根据名称和词性获取概念列表
  139. *
  140. * @param nameList
  141. * @param libType
  142. * @return
  143. */
  144. public List<Concept> getListByNamesAndType(List<String> nameList, Integer libType) {
  145. QueryWrapper<Concept> conceptQueryWrapper = new QueryWrapper<>();
  146. conceptQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
  147. .in("lib_name", nameList);
  148. if (libType != null) {
  149. conceptQueryWrapper.eq("lib_type", libType);
  150. }
  151. List<Concept> list = this.list(conceptQueryWrapper);
  152. return list;
  153. }
  154. /**
  155. * 根据名称获取概念list
  156. *
  157. * @param nameList
  158. * @return
  159. */
  160. public List<Concept> getListByNames(List<String> nameList) {
  161. QueryWrapper<Concept> conceptQueryWrapper = new QueryWrapper<>();
  162. conceptQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
  163. .in("lib_name", nameList);
  164. List<Concept> list = this.list(conceptQueryWrapper);
  165. return list;
  166. }
  167. /**
  168. * 根据名称和类型获取概念列表Map
  169. *
  170. * @param conceptExistVO 搜索参数
  171. * @return 术语id和术语 Map
  172. */
  173. public Map<String, Long> getConceptMap(ConceptExistVO conceptExistVO) {
  174. // 入参验证
  175. if (ListUtil.isEmpty(conceptExistVO.getNameList())) {
  176. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "名称列表不能为空");
  177. }
  178. if (conceptExistVO.getType() != null) {
  179. Integer libType = ParamConvertUtil.conceptConvert2Lib(conceptExistVO.getType());
  180. if (libType == null) {
  181. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "类型不匹配");
  182. }
  183. conceptExistVO.setLibType(libType);
  184. }
  185. //获取结构
  186. List<Concept> concepts
  187. = this.getListByNamesAndType(conceptExistVO.getNameList(), conceptExistVO.getLibType());
  188. //出参封装
  189. Map<String, Long> map = new HashMap<>();
  190. if (ListUtil.isNotEmpty(concepts)) {
  191. map = concepts.stream().collect(Collectors.toMap(r -> r.getLibName(), r -> r.getId()));
  192. }
  193. return map;
  194. }
  195. /**
  196. * 获取常用标签
  197. *
  198. * @param conceptUsualVO
  199. * @return
  200. */
  201. public List<ConceptBaseDTO> getConceptUsual(ConceptUsualVO conceptUsualVO) {
  202. //入参验证
  203. List<Integer> inputTyps = new ArrayList<>();
  204. inputTyps.add(ConceptTypeEnum.Symptom.getKey());
  205. inputTyps.add(ConceptTypeEnum.Vital.getKey());
  206. inputTyps.add(ConceptTypeEnum.Lis.getKey());
  207. inputTyps.add(ConceptTypeEnum.Pacs.getKey());
  208. if (!inputTyps.contains(conceptUsualVO.getType())) {
  209. throw new CommonException(CommonErrorCode.NOT_EXISTS, "超出范围");
  210. }
  211. //获取标签内容
  212. ConceptWrapper conceptWrapper = new ConceptWrapper();
  213. conceptWrapper.setStartName(conceptUsualVO.getDeptName());//科室名称
  214. conceptWrapper.setStartType(LexiconTypeEnum.DEPARTMENT.getKey());
  215. conceptWrapper.setRelationType(LexiconRSTypeEnum.ORDER_BY.getKey());
  216. conceptWrapper.setEndAge(conceptUsualVO.getAge());//年龄
  217. conceptWrapper.setEndSex(conceptUsualVO.getSexType());//性别
  218. //找出标签类型对应的类型id
  219. conceptWrapper.setEndType(ParamConvertUtil.conceptConvert2Lib(conceptUsualVO.getType()));//标签类型
  220. List<ConceptWithOrderRes> concepts = this.getConceptWithOrder(conceptWrapper);
  221. List<ConceptBaseDTO> list = new ArrayList();
  222. //封装
  223. ConceptBaseDTO conceptBaseDTO = new ConceptBaseDTO();
  224. for (ConceptWithOrderRes conceptWithOrderRes : concepts) {
  225. conceptBaseDTO = new ConceptBaseDTO();
  226. conceptBaseDTO.setConceptId(conceptWithOrderRes.getEndId());
  227. conceptBaseDTO.setName(conceptWithOrderRes.getEndName());
  228. list.add(conceptBaseDTO);
  229. }
  230. return list;
  231. }
  232. /**
  233. * 概念id检索
  234. *
  235. * @param retrievalVO
  236. * @return
  237. */
  238. public List<ConceptRetrievalDTO> retrivelConceptInfo(RetrievalVO retrievalVO) {
  239. Boolean bla = true;
  240. if (null != retrievalVO.getType()) {
  241. if (retrievalVO.getType().intValue() == ConceptTypeEnum.Lis.getKey()) {//如果是化验,添加化验子项类型
  242. retrievalVO.setDetailType(LexiconTypeEnum.LIS_DETAILS.getKey());
  243. bla = true;
  244. } else if (retrievalVO.getType().intValue() == ConceptTypeEnum.Past.getKey()
  245. || retrievalVO.getType().intValue() == ConceptTypeEnum.Other.getKey()) {//如果是其他史设置其他史类型
  246. List<Integer> typeList = new ArrayList<>();
  247. typeList.add(LexiconTypeEnum.HISTORY_OF_PAST_DISEASES.getKey());
  248. typeList.add(LexiconTypeEnum.HISTORY_OF_TRAUMA.getKey());
  249. typeList.add(LexiconTypeEnum.HISTORY_OF_SURGERY.getKey());
  250. typeList.add(LexiconTypeEnum.HISTORY_OF_BLOOD_TRANSFUSION.getKey());
  251. typeList.add(LexiconTypeEnum.INFECTIOUS_DISEASE_HISTORY.getKey());
  252. typeList.add(LexiconTypeEnum.BAD_HABITS.getKey());
  253. typeList.add(LexiconTypeEnum.MARITAL_HISTORY.getKey());
  254. typeList.add(LexiconTypeEnum.HISTORY_OF_MARRIAGE_AND_CHILDBEARING.getKey());
  255. typeList.add(LexiconTypeEnum.BIRTH_HISTORY.getKey());
  256. typeList.add(LexiconTypeEnum.FAMILY_HISTORY.getKey());
  257. typeList.add(LexiconTypeEnum.FOOD_ALLERGY_HISTORY.getKey());
  258. typeList.add(LexiconTypeEnum.HISTORY_OF_DRUG_ALLERGY.getKey());
  259. typeList.add(LexiconTypeEnum.FAMILY_RELATED_INFECTIOUS_DISEASE_HISTORY.getKey());
  260. retrievalVO.setOtherType(typeList);
  261. bla = false;
  262. }
  263. if (bla) {
  264. retrievalVO.setType(ParamConvertUtil.conceptConvert2Lib(retrievalVO.getType()));
  265. }
  266. }
  267. List<ConceptRetrievalDTO> conceptRetrievalDTOS = Lists.newArrayList();
  268. if (retrievalVO.getIsStatic().equals(1)) {
  269. conceptRetrievalDTOS = this.staticKnowledge(retrievalVO);
  270. } else {
  271. conceptRetrievalDTOS = this.retrievalConcept(retrievalVO);
  272. }
  273. List<ConceptRetrievalDTO> res = new ArrayList<>();
  274. List<Long> selfList = new ArrayList<>(); // 本体
  275. List<Long> subList = new ArrayList<>(); // 子项
  276. List<String> conceptNameList = new ArrayList<>();//名称结果集保证数据唯一
  277. List<Long> uniqueIdList = new ArrayList<>();
  278. for (ConceptRetrievalDTO bean : conceptRetrievalDTOS) {
  279. if (StringUtil.isNotEmpty(bean.getParentName())) { // 重置showType
  280. bean.setShowType(2L);
  281. }
  282. if (bean.getShowType().intValue() == 1) { // 本体
  283. selfList.add(bean.getSelfId());
  284. } else if (bean.getShowType().intValue() == 2) { // 子项
  285. subList.add(bean.getSelfId());
  286. }
  287. }
  288. // 有本体,过滤同义词和子项;无本体,有子项,过滤同义词
  289. for (ConceptRetrievalDTO bean : conceptRetrievalDTOS) {
  290. if (bean.getShowType().intValue() == 1) {
  291. if(retrievalVO.getIsSonShow().intValue() == 0){//isSonShow为0执行检索去重逻辑
  292. res.add(bean);
  293. }else {//sSonShow不为0执行静态知识检索去重逻辑
  294. if(bean.getUniqueId() != null && bean.getUniqueId() != 0){
  295. if(!uniqueIdList.contains(bean.getUniqueId())){
  296. res.add(bean);
  297. uniqueIdList.add(bean.getUniqueId());
  298. }
  299. }else {
  300. res.add(bean);
  301. }
  302. }
  303. } else if (bean.getShowType().intValue() == 2) {
  304. if(retrievalVO.getIsSonShow().intValue() == 0){//isSonShow为0执行检索去重逻辑
  305. if (!selfList.contains(bean.getParentId()) && !conceptNameList.contains(bean.getParentName()) ) {
  306. conceptNameList.add(bean.getParentName());
  307. res.add(bean);
  308. }
  309. } else {//sSonShow不为0执行静态知识检索去重逻辑
  310. if(bean.getUniqueId() != null && bean.getUniqueId() != 0){
  311. if(!uniqueIdList.contains(bean.getUniqueId())){
  312. res.add(bean);
  313. uniqueIdList.add(bean.getUniqueId());
  314. }
  315. }
  316. }
  317. } else if (bean.getShowType().intValue() == 0) {
  318. if(retrievalVO.getIsSonShow().intValue() == 0){//isSonShow为0执行检索去重逻辑
  319. if (!selfList.contains(bean.getSelfId()) && !subList.contains(bean.getSelfId()) && !conceptNameList.contains(bean.getSelfName())) {
  320. conceptNameList.add(bean.getSelfName());
  321. res.add(bean);
  322. }
  323. }else {//SonShow不为0执行静态知识检索去重逻辑
  324. if(bean.getUniqueId() != null && bean.getUniqueId() != 0){
  325. if(!uniqueIdList.contains(bean.getUniqueId())){
  326. res.add(bean);
  327. uniqueIdList.add(bean.getUniqueId());
  328. }
  329. }else {
  330. res.add(bean);
  331. }
  332. }
  333. }
  334. }
  335. //把本体的sameName过滤掉
  336. for (ConceptRetrievalDTO conceptRetrievalDTO : res) {
  337. if (conceptRetrievalDTO.getSameName() != null && conceptRetrievalDTO.getSameName().equals(conceptRetrievalDTO.getSelfName())) {
  338. conceptRetrievalDTO.setSameName(null);
  339. }
  340. conceptRetrievalDTO.setType(ParamConvertUtil.libConvert2Concept(conceptRetrievalDTO.getLibTypeId().intValue()));
  341. }
  342. return res;
  343. }
  344. /**
  345. * 静态知识标签检索
  346. *
  347. * @param getStaticKnowledgeVO
  348. * @return
  349. */
  350. public List<RetrievalDTO> getStaticKnowledge(GetStaticKnowledgeVO getStaticKnowledgeVO) {
  351. List<RetrievalDTO> retrievalDTOS = new ArrayList<>();
  352. RetrievalVO retrievalVO = new RetrievalVO();
  353. RetrievalDTO retrievalDTO = new RetrievalDTO();
  354. BeanUtil.copyProperties(getStaticKnowledgeVO, retrievalVO);
  355. retrievalVO.setIsSonShow(1);
  356. retrievalVO.setIsStatic(1);
  357. List<Integer> types = new ArrayList<>();
  358. for (Integer type : getStaticKnowledgeVO.getTypes()) {
  359. if(type.intValue() == ConceptTypeEnum.Lis.getKey()){//单独设置化验类型
  360. retrievalVO.setType(type);
  361. }else {//查询时去掉化验
  362. types.add(ParamConvertUtil.conceptConvert2Lib(type));
  363. }
  364. }
  365. //设置类型为诊断、药品、辅检
  366. retrievalVO.setOtherType(types);
  367. //获取标签信息
  368. List<ConceptRetrievalDTO> conceptRetrievalDTOList = this.retrivelConceptInfo(retrievalVO);
  369. List<RetrievalDTO> staticRetrievalList = new ArrayList<>();
  370. if (ListUtil.isNotEmpty(conceptRetrievalDTOList)) {
  371. //封装
  372. for (ConceptRetrievalDTO conceptRetrievalDTO : conceptRetrievalDTOList) {
  373. retrievalDTO = new RetrievalDTO();
  374. retrievalDTO.setConceptId(conceptRetrievalDTO.getSelfId());
  375. retrievalDTO.setName(conceptRetrievalDTO.getSelfName());
  376. retrievalDTO.setUniqueName(conceptRetrievalDTO.getUniqueName());
  377. if (StringUtil.isNotEmpty(conceptRetrievalDTO.getParentName())) {//parent不为空时说明有子项,返回父级id
  378. retrievalDTO.setConceptId(conceptRetrievalDTO.getParentId());
  379. retrievalDTO.setName(conceptRetrievalDTO.getParentName());
  380. retrievalDTO.setRetrievalName(conceptRetrievalDTO.getSelfName());
  381. }
  382. if (StringUtil.isNotEmpty(conceptRetrievalDTO.getSameName())) {//同义词
  383. retrievalDTO.setRetrievalName(conceptRetrievalDTO.getSameName());
  384. }
  385. retrievalDTO.setLibTypeId(conceptRetrievalDTO.getLibTypeId());
  386. retrievalDTO.setLibTypeName(conceptRetrievalDTO.getLibTypeName());
  387. retrievalDTO.setType(conceptRetrievalDTO.getType());
  388. retrievalDTO.setShowType(conceptRetrievalDTO.getShowType());
  389. retrievalDTOS.add(retrievalDTO);
  390. }
  391. }
  392. for (RetrievalDTO retrievalDTOInfo : retrievalDTOS) {
  393. retrievalDTO = new RetrievalDTO();
  394. BeanUtil.copyProperties(retrievalDTOInfo, retrievalDTO);
  395. staticRetrievalList.add(retrievalDTO);
  396. }
  397. return staticRetrievalList;
  398. }
  399. /**
  400. * 检索词库获取标准词
  401. *
  402. * @param conceptBaseVO
  403. * @return
  404. */
  405. public List<ConceptBaseDTO> indexConceptFac(ConceptBaseVO conceptBaseVO) {
  406. return this.indexConcept(conceptBaseVO);
  407. }
  408. }