ConceptFacade.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. package com.diagbot.facade;
  2. import java.io.InputStream;
  3. import java.text.DecimalFormat;
  4. import java.util.ArrayList;
  5. import java.util.Date;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.stream.Collectors;
  10. import org.apache.commons.lang.time.DateFormatUtils;
  11. import org.apache.poi.hssf.usermodel.HSSFDateUtil;
  12. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  13. import org.apache.poi.ss.usermodel.Cell;
  14. import org.apache.poi.ss.usermodel.Row;
  15. import org.apache.poi.ss.usermodel.Sheet;
  16. import org.apache.poi.ss.usermodel.Workbook;
  17. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.beans.factory.annotation.Qualifier;
  20. import org.springframework.stereotype.Component;
  21. import org.springframework.web.multipart.MultipartFile;
  22. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  23. import com.baomidou.mybatisplus.core.metadata.IPage;
  24. import com.diagbot.client.UserServiceClient;
  25. import com.diagbot.dto.GetAllConceptDTO;
  26. import com.diagbot.dto.GetAllInformationDTO;
  27. import com.diagbot.dto.GetConceptInfoDetailDTO;
  28. import com.diagbot.dto.RespDTO;
  29. import com.diagbot.entity.Concept;
  30. import com.diagbot.entity.LibraryDetail;
  31. import com.diagbot.entity.LibraryInfo;
  32. import com.diagbot.entity.Medical;
  33. import com.diagbot.entity.Relation;
  34. import com.diagbot.exception.CommonErrorCode;
  35. import com.diagbot.exception.CommonException;
  36. import com.diagbot.service.LibraryInfoService;
  37. import com.diagbot.service.impl.ConceptServiceImpl;
  38. import com.diagbot.util.BeanUtil;
  39. import com.diagbot.util.DateUtil;
  40. import com.diagbot.util.ListUtil;
  41. import com.diagbot.util.StringUtil;
  42. import com.diagbot.util.UserUtils;
  43. import com.diagbot.vo.AddConceptInfoDetailVO;
  44. import com.diagbot.vo.AddConceptInfoVO;
  45. import com.diagbot.vo.GetAllConceptVO;
  46. import com.diagbot.vo.GetAllInformationVO;
  47. import com.diagbot.vo.GetConceptInfoDetailVO;
  48. import com.diagbot.vo.RemoveConceptInfoVO;
  49. /**
  50. * @Description: 术语查询业务层
  51. * @author: Weixuan Huang
  52. * @time: 2019/1/14 16:17
  53. */
  54. @Component
  55. public class ConceptFacade extends ConceptServiceImpl {
  56. @Autowired
  57. private LibraryInfoFacade libraryinfoFacade;
  58. @Autowired
  59. private LibraryDetailFacade libraryDetailFacade;
  60. @Autowired
  61. private MedicalFacade medicalFacade;
  62. @Autowired
  63. private RelationFacade relationFacade;
  64. @Autowired
  65. @Qualifier("libraryInfoServiceImpl")
  66. private LibraryInfoService libraryInfoService;
  67. @Autowired
  68. private UserServiceClient userServiceClient;
  69. /**
  70. * 获取所有医学术语命名
  71. * @param getAllConceptVO
  72. * @return
  73. */
  74. public List<GetAllConceptDTO> getAllConcept(GetAllConceptVO getAllConceptVO){
  75. QueryWrapper<LibraryInfo> libraryInfoQe = new QueryWrapper<LibraryInfo>();
  76. libraryInfoQe.eq("is_deleted", "N");
  77. if(getAllConceptVO.getIsConcept()!=null){
  78. libraryInfoQe.eq("is_concept", getAllConceptVO.getIsConcept());
  79. }
  80. if(StringUtil.isNotBlank(getAllConceptVO.getName())){
  81. libraryInfoQe.like("name", getAllConceptVO.getName());
  82. }
  83. List<LibraryInfo> libraryInfoList = libraryinfoFacade.list(libraryInfoQe);
  84. if(getAllConceptVO.getIsConcept()!=null&&getAllConceptVO.getIsConcept()==1){
  85. QueryWrapper<Concept> conceptQe = new QueryWrapper<>();
  86. conceptQe.eq("is_deleted", "N");
  87. conceptQe.in("id", libraryInfoList.stream().map(i->i.getConceptId()).distinct().collect(Collectors.toList()));
  88. Map<Long,Concept> conceptMap = list(conceptQe).stream().collect(Collectors.toMap(Concept::getId, i->i));
  89. libraryInfoList.forEach(i->{
  90. if(conceptMap.get(i.getConceptId())==null||conceptMap.get(i.getConceptId()).getLibId()!=i.getId()){
  91. i.setIsDeleted("Y");
  92. }
  93. });
  94. }
  95. List<GetAllConceptDTO> getAllConceptDTOList = BeanUtil.listCopyTo(libraryInfoList.stream().filter(i->i.getIsDeleted().equals("N")).collect(Collectors.toList()), GetAllConceptDTO.class);
  96. getAllConceptDTOList.forEach(i->{
  97. i.setNameAndType(i.getName()+"("+i.getType()+")");
  98. });
  99. return getAllConceptDTOList;
  100. }
  101. /**
  102. * 获取医学术语命名列表
  103. * @param getAllInformationVO
  104. * @return
  105. */
  106. public IPage<GetAllInformationDTO> getAllInformation(GetAllInformationVO getAllInformationVO) {
  107. IPage<GetAllInformationDTO> ipage = libraryinfoFacade.getAllInformation(getAllInformationVO);
  108. List<String> ids = ipage.getRecords().stream().map(i->i.getOperName()).distinct().collect(Collectors.toList());
  109. RespDTO<Map<String, String>> respDTO = userServiceClient.getUserInfoByIds(ids);
  110. if (respDTO == null || !CommonErrorCode.OK.getCode().equals(respDTO.code)) {
  111. throw new CommonException(CommonErrorCode.RPC_ERROR,
  112. "获取用户信息失败");
  113. }
  114. ipage.getRecords().forEach(i->{
  115. i.setOperName(respDTO.data.get(i.getOperName()));
  116. });
  117. return ipage;
  118. }
  119. /**
  120. * 医学术语命名删除
  121. * @param removeConceptInfoVO
  122. * @return
  123. */
  124. public Boolean removeConceptInfo(RemoveConceptInfoVO removeConceptInfoVO) {
  125. StringBuffer sbf = new StringBuffer();
  126. QueryWrapper<Medical> medicalQe = new QueryWrapper<Medical>();
  127. medicalQe.eq("is_deleted", "N");
  128. medicalQe.eq("concept_id", removeConceptInfoVO.getConceptId());
  129. if(medicalFacade.list(medicalQe).size()>0){
  130. sbf.append("请先解除医学属性关联 ");
  131. }
  132. QueryWrapper<Relation> relationQe = new QueryWrapper<Relation>();
  133. relationQe.eq("is_deleted", "N");
  134. relationQe.and(i->i.eq("start_id", removeConceptInfoVO.getConceptId()).or().eq("end_id", removeConceptInfoVO.getConceptId()));
  135. if(relationFacade.list(relationQe).size()>0){
  136. sbf.append("请先解除术语关系关联 ");
  137. }
  138. QueryWrapper<LibraryDetail> libraryDetailQe = new QueryWrapper<LibraryDetail>();
  139. libraryDetailQe.eq("is_deleted", "N");
  140. libraryDetailQe.eq("concept_id", removeConceptInfoVO.getConceptId());
  141. if(libraryDetailFacade.list(libraryDetailQe).size()>0){
  142. sbf.append("请先解除医学静态知识关联 ");
  143. }
  144. if(sbf.length()>0){
  145. throw new CommonException(CommonErrorCode.RPC_ERROR,sbf.toString());
  146. }
  147. String currentUser = UserUtils.getCurrentPrincipleID();
  148. Date now = DateUtil.now();
  149. QueryWrapper<LibraryInfo> libraryInfoQe = new QueryWrapper<LibraryInfo>();
  150. libraryInfoQe.eq("concept_id", removeConceptInfoVO.getConceptId());
  151. LibraryInfo libraryInfo = new LibraryInfo();
  152. libraryInfo.setIsDeleted("Y");
  153. libraryInfo.setGmtModified(now);
  154. libraryInfo.setModifier(currentUser);
  155. libraryinfoFacade.update(libraryInfo, libraryInfoQe);
  156. Concept concept = new Concept();
  157. concept.setId(removeConceptInfoVO.getConceptId());
  158. concept.setIsDeleted("Y");
  159. concept.setModifier(currentUser);
  160. concept.setGmtModified(now);
  161. this.updateById(concept);
  162. return true;
  163. }
  164. /**
  165. * 获取医学术语命名详情
  166. * @param getConceptInfoDetailVO
  167. * @return 1-标准术语,0-同义词
  168. */
  169. public Map<String,List<GetConceptInfoDetailDTO>> getConceptInfoDetail(GetConceptInfoDetailVO getConceptInfoDetailVO){
  170. QueryWrapper<LibraryInfo> libraryInfoQe = new QueryWrapper<LibraryInfo>();
  171. libraryInfoQe.eq("concept_id", getConceptInfoDetailVO.getConceptId());
  172. libraryInfoQe.eq("is_deleted", "N");
  173. libraryInfoQe.orderByAsc("order_no");
  174. List<LibraryInfo> libraryInfoList = libraryinfoFacade.list(libraryInfoQe);
  175. Map<String,List<GetConceptInfoDetailDTO>> retMap = new HashMap<>();
  176. retMap.put("otherNames", BeanUtil.listCopyTo(libraryInfoList.stream().filter(i->i.getIsConcept()==null||i.getIsConcept()==0).collect(Collectors.toList()), GetConceptInfoDetailDTO.class));
  177. retMap.put("libName", BeanUtil.listCopyTo(libraryInfoList.stream().filter(i->i.getIsConcept()!=null&&i.getIsConcept()==1).collect(Collectors.toList()), GetConceptInfoDetailDTO.class));
  178. return retMap;
  179. }
  180. /**
  181. * 医学术语命名添加或者编辑
  182. * @param addConceptInfoVO
  183. * @return
  184. */
  185. @SuppressWarnings("unchecked")
  186. public Boolean addConceptInfo(AddConceptInfoVO addConceptInfoVO){
  187. Map<String,Object> ckMap = checkAddConceptInfoVO(addConceptInfoVO);
  188. Object message = ckMap.get("message");
  189. if(message!=null){
  190. throw new CommonException(CommonErrorCode.RPC_ERROR,message.toString());
  191. }
  192. saveConceptInfos((List<LibraryInfo>)ckMap.get("libraryInfoList"));
  193. return true;
  194. }
  195. /**
  196. * 医学术语命名保存
  197. * @param libraryInfoList
  198. * @return
  199. */
  200. private void saveConceptInfos(List<LibraryInfo> saveOrUpdateLibraryInfoList){
  201. if(ListUtil.isNotEmpty(saveOrUpdateLibraryInfoList)){
  202. libraryInfoService.saveOrUpdateBatch(saveOrUpdateLibraryInfoList);
  203. }
  204. }
  205. /**
  206. * 校验即将添加的数据
  207. * @param addConceptInfoVO
  208. * @return 返回map中,包含2个字段:message和libraryInfoList,message-为空时,表示正常,取LibraryInfo的集合libraryInfoList
  209. */
  210. private Map<String,Object> checkAddConceptInfoVO(AddConceptInfoVO addConceptInfoVO){
  211. Map<String,Object> retMap = new HashMap<>();
  212. List<AddConceptInfoDetailVO> addConceptInfoDetailVOMainList = addConceptInfoVO.getDetailList().stream().filter(i->i.getIsConcept()==1).collect(Collectors.toList());
  213. if(addConceptInfoDetailVOMainList.size()==0){
  214. retMap.put("message", "无标准术语");
  215. return retMap;
  216. }
  217. if(addConceptInfoDetailVOMainList.size()>1){
  218. retMap.put("message", "标准术语只能有一个");
  219. return retMap;
  220. }
  221. List<LibraryInfo> saveOrUpdateLibraryInfoList = new ArrayList<>();
  222. AddConceptInfoDetailVO addConceptInfoDetailVOMain = addConceptInfoDetailVOMainList.get(0);//提交过来的标准术语
  223. StringBuffer sbf = new StringBuffer();
  224. QueryWrapper<LibraryInfo> libraryInfoQe = new QueryWrapper<LibraryInfo>();
  225. libraryInfoQe.eq("type", addConceptInfoVO.getType());
  226. libraryInfoQe.in("name", addConceptInfoVO.getDetailList().stream().map(i->i.getName()).collect(Collectors.toList()));
  227. Map<String,LibraryInfo> libraryInfoMap = libraryinfoFacade.list(libraryInfoQe).stream().collect(Collectors.toMap(LibraryInfo::getName, i->i));
  228. LibraryInfo libraryInfoMain = libraryInfoMap.get(addConceptInfoDetailVOMain.getName());
  229. if(libraryInfoMain!=null&&libraryInfoMain.getIsDeleted().equals("N")&&libraryInfoMain.getIsConcept()==0){
  230. retMap.put("message", "标准术语已被占用");
  231. return retMap;
  232. }
  233. for(AddConceptInfoDetailVO i:addConceptInfoVO.getDetailList()){
  234. if(i.getIsConcept()==1){
  235. continue;
  236. }
  237. LibraryInfo libraryInfo = libraryInfoMap.get(i.getName());
  238. if(libraryInfo!=null){
  239. if(libraryInfo.getIsDeleted().equals("N")&&(libraryInfoMain == null||libraryInfo.getConceptId()!=libraryInfoMain.getConceptId())){
  240. sbf.append(i.getName()).append(" ");
  241. continue;
  242. }
  243. libraryInfo.setIsDeleted("N");
  244. libraryInfo.setRemark(i.getRemark());
  245. }else{
  246. libraryInfo = new LibraryInfo();
  247. BeanUtil.copyProperties(i, libraryInfo);
  248. }
  249. saveOrUpdateLibraryInfoList.add(libraryInfo);
  250. }
  251. if(sbf.length()>0){
  252. sbf.append("已被占用");
  253. retMap.put("message", sbf.toString());
  254. return retMap;
  255. }
  256. Long conceptId = null;
  257. if(libraryInfoMain==null){
  258. libraryInfoMain = new LibraryInfo();
  259. BeanUtil.copyProperties(addConceptInfoDetailVOMain, libraryInfoMain);
  260. libraryInfoMain.setType(addConceptInfoVO.getType());
  261. libraryinfoFacade.save(libraryInfoMain);
  262. Concept concept = new Concept();
  263. concept.setLibId(libraryInfoMain.getId());
  264. save(concept);
  265. conceptId = concept.getId();
  266. }else{
  267. libraryInfoMain.setRemark(addConceptInfoDetailVOMain.getRemark());
  268. Concept concept = new Concept();
  269. if(libraryInfoMain.getIsDeleted().equals("N")){
  270. conceptId = libraryInfoMain.getConceptId();
  271. }else{
  272. libraryInfoMain.setIsDeleted("N");
  273. if(libraryInfoMain.getIsConcept()==1){
  274. concept.setIsDeleted("N");
  275. }else{
  276. concept.setLibId(libraryInfoMain.getId());
  277. }
  278. }
  279. }
  280. saveOrUpdateLibraryInfoList.add(libraryInfoMain);
  281. for(LibraryInfo i : saveOrUpdateLibraryInfoList){
  282. i.setConceptId(conceptId);
  283. i.setType(addConceptInfoVO.getType());
  284. }
  285. retMap.put("libraryInfoList", saveOrUpdateLibraryInfoList);
  286. return retMap;
  287. }
  288. /**
  289. * 医学术语命名excel文件导入
  290. * @param file
  291. * @return
  292. */
  293. @SuppressWarnings("unchecked")
  294. public Boolean conceptInfoExcelIm(MultipartFile file) {
  295. List<AddConceptInfoVO> addConceptInfoVOList = new ArrayList<>();
  296. StringBuffer sbf = new StringBuffer();
  297. InputStream inputStream = null;
  298. Workbook wb = null;
  299. try {
  300. if (!file.isEmpty()) {
  301. inputStream = file.getInputStream();
  302. if (inputStream.available() > 512000) {
  303. sbf.append("文件最大支持500KB!").append("<br/>");
  304. } else {
  305. String fileName = file.getOriginalFilename();
  306. if (fileName.lastIndexOf(".") != -1) {
  307. String type = fileName.substring(fileName.lastIndexOf("."));
  308. if (type.equals(".xls")) {
  309. wb = new HSSFWorkbook(inputStream);
  310. } else if (type.equals(".xlsx")) {
  311. wb = new XSSFWorkbook(inputStream);
  312. }
  313. if (wb != null) {
  314. Sheet sheet = wb.getSheetAt(0);
  315. int count = 0;
  316. String libName, libType, otherNames, remark;
  317. for (Row row : sheet) {
  318. count++;
  319. if (count == 1 || row == null) {
  320. continue;
  321. }
  322. libName = getValue(row.getCell(0)).trim().replace(" ", "");
  323. libType = getValue(row.getCell(1)).trim().replace(" ", "");
  324. otherNames = getValue(row.getCell(2)).trim().replace(" ", "");
  325. remark = getValue(row.getCell(3)).trim().replace(" ", "");
  326. if(StringUtil.isEmpty(libName) && StringUtil.isEmpty(libType)
  327. && StringUtil.isEmpty(otherNames) && StringUtil.isEmpty(remark)){
  328. continue;
  329. }
  330. if (StringUtil.isEmpty(libName) || StringUtil.isEmpty(libType) || StringUtil.isEmpty(otherNames)) {
  331. sbf.append("第" + count + "行数据不完整;").append("<br/>");
  332. continue;
  333. }
  334. AddConceptInfoVO addConceptInfoVO = new AddConceptInfoVO();
  335. addConceptInfoVO.setName(libName);
  336. addConceptInfoVO.setType(libType);
  337. List<AddConceptInfoDetailVO> detailList = new ArrayList<>();
  338. for(String nm:otherNames.split(",")){
  339. if(StringUtil.isBlank(nm)){
  340. continue;
  341. }
  342. AddConceptInfoDetailVO addConceptInfoDetailVO = new AddConceptInfoDetailVO();
  343. addConceptInfoDetailVO.setName(nm);
  344. addConceptInfoDetailVO.setType(libType);
  345. if(libName.equals(nm)){
  346. addConceptInfoDetailVO.setIsConcept(1);
  347. addConceptInfoDetailVO.setRemark(remark);
  348. }else{
  349. addConceptInfoDetailVO.setIsConcept(0);
  350. }
  351. detailList.add(addConceptInfoDetailVO);
  352. }
  353. addConceptInfoVO.setDetailList(detailList);
  354. addConceptInfoVOList.add(addConceptInfoVO);
  355. }
  356. } else {
  357. sbf.append("非excel文件无法解析!").append("<br/>");
  358. }
  359. } else {
  360. sbf.append("未知文件无法解析!").append("<br/>");
  361. }
  362. }
  363. } else {
  364. sbf.append("无文件上传!").append("<br/>");
  365. }
  366. } catch (Exception e) {
  367. sbf.append("解析失败!").append("<br/>");
  368. } finally {
  369. try {
  370. if (wb != null) {
  371. wb.close();
  372. }
  373. if (inputStream != null) {
  374. inputStream.close();
  375. }
  376. } catch (Exception e) {
  377. }
  378. }
  379. /*****************excel文件本身问题提醒************************/
  380. if(sbf.length()>0){
  381. throw new CommonException(CommonErrorCode.RPC_ERROR,sbf.toString());
  382. }
  383. /****************excel文件中所有术语存在重复提示---名字和类型一样即重复***********************/
  384. List<AddConceptInfoDetailVO> addConceptInfoDetailVOList = new ArrayList<>();
  385. addConceptInfoVOList.forEach(i->{
  386. addConceptInfoDetailVOList.addAll(i.getDetailList());
  387. });
  388. Map<String,List<AddConceptInfoDetailVO>> addConceptInfoDetailVOListMap = addConceptInfoDetailVOList.stream().collect(Collectors.groupingBy(AddConceptInfoDetailVO::getName));
  389. for(String key : addConceptInfoDetailVOListMap.keySet()){
  390. if(addConceptInfoDetailVOListMap.get(key).size()>1&&addConceptInfoDetailVOListMap.get(key).stream().map(i->i.getType()).distinct().count()==1){
  391. sbf.append(key).append(" ");
  392. }
  393. }
  394. if(sbf.length()>0){
  395. sbf.append("(术语存在重复)");
  396. throw new CommonException(CommonErrorCode.RPC_ERROR,sbf.toString());
  397. }
  398. /**************校验每一组数据,同时组装*************************/
  399. List<LibraryInfo> saveOrUpdateLibraryInfoList = new ArrayList<>();
  400. Map<String,Object> ckMap = null;
  401. Object message = null;
  402. for(AddConceptInfoVO i : addConceptInfoVOList){
  403. ckMap = checkAddConceptInfoVO(i);
  404. message = ckMap.get("message");
  405. if(message!=null){
  406. sbf.append(message.toString()).append("(标准术语:").append(i.getName()).append(")").append("<br/>");
  407. }else{
  408. saveOrUpdateLibraryInfoList.addAll((List<LibraryInfo>)ckMap.get("libraryInfoList"));
  409. }
  410. }
  411. if(sbf.length()>0){
  412. throw new CommonException(CommonErrorCode.RPC_ERROR,sbf.toString());
  413. }
  414. /******************最终保存***************************/
  415. saveConceptInfos(saveOrUpdateLibraryInfoList);
  416. return true;
  417. }
  418. @SuppressWarnings("deprecation")
  419. private String getValue(Cell cell) {
  420. try {
  421. Object obj = null;
  422. switch (cell.getCellTypeEnum()) {
  423. case BOOLEAN:
  424. obj = cell.getBooleanCellValue();
  425. break;
  426. case ERROR:
  427. obj = cell.getErrorCellValue();
  428. break;
  429. case NUMERIC:
  430. if (HSSFDateUtil.isCellDateFormatted(cell)) {
  431. Date date = cell.getDateCellValue();
  432. obj = DateFormatUtils.format(date, "yyyy-MM-dd");
  433. } else {
  434. obj = cell.getNumericCellValue();
  435. DecimalFormat df = new DecimalFormat("0");
  436. obj = df.format(obj);
  437. }
  438. break;
  439. case STRING:
  440. obj = cell.getStringCellValue();
  441. break;
  442. default:
  443. break;
  444. }
  445. return obj.toString();
  446. } catch (Exception e) {
  447. return "";
  448. }
  449. }
  450. }