ConceptFacade.java 17 KB

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