ResultStaticKnowledgeFacade.java 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059
  1. package com.diagbot.facade;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.core.metadata.IPage;
  4. import com.diagbot.client.CdssCoreClient;
  5. import com.diagbot.dto.ExportCommonStaticTestDTO;
  6. import com.diagbot.dto.ExportCommonTestDTO;
  7. import com.diagbot.dto.ExportLisStaticTestDTO;
  8. import com.diagbot.dto.ExportLisTestDTO;
  9. import com.diagbot.dto.IndexBatchDTO;
  10. import com.diagbot.dto.RespDTO;
  11. import com.diagbot.entity.DiseaseConfig;
  12. import com.diagbot.entity.DrugConfig;
  13. import com.diagbot.entity.KlConcept;
  14. import com.diagbot.entity.KlConceptStatic;
  15. import com.diagbot.entity.KlRelation;
  16. import com.diagbot.entity.LisConfig;
  17. import com.diagbot.entity.OperationConfig;
  18. import com.diagbot.entity.PacsConfig;
  19. import com.diagbot.entity.ResultStaticInfo;
  20. import com.diagbot.entity.ResultStaticKnowledge;
  21. import com.diagbot.enums.ConceptTypeEnum;
  22. import com.diagbot.enums.IsDeleteEnum;
  23. import com.diagbot.enums.LexiconEnum;
  24. import com.diagbot.enums.StatusEnum;
  25. import com.diagbot.exception.CommonErrorCode;
  26. import com.diagbot.exception.CommonException;
  27. import com.diagbot.service.ResultStaticInfoService;
  28. import com.diagbot.service.ResultStaticKnowledgeService;
  29. import com.diagbot.service.impl.ResultStaticKnowledgeServiceImpl;
  30. import com.diagbot.util.BeanUtil;
  31. import com.diagbot.util.DateUtil;
  32. import com.diagbot.util.ExcelUtils;
  33. import com.diagbot.util.ListUtil;
  34. import com.diagbot.util.RespDTOUtil;
  35. import com.diagbot.util.StringUtil;
  36. import com.diagbot.vo.ConceptVO;
  37. import com.diagbot.vo.ResultStaticPageVO;
  38. import com.diagbot.vo.RunningInfoVO;
  39. import com.diagbot.vo.StaticKnowledgeTestVO;
  40. import com.google.common.collect.Lists;
  41. import org.springframework.beans.factory.annotation.Autowired;
  42. import org.springframework.beans.factory.annotation.Qualifier;
  43. import org.springframework.stereotype.Component;
  44. import org.springframework.transaction.annotation.Transactional;
  45. import org.springframework.web.multipart.MultipartFile;
  46. import javax.servlet.http.HttpServletResponse;
  47. import java.util.Date;
  48. import java.util.List;
  49. import java.util.Map;
  50. import java.util.stream.Collectors;
  51. /**
  52. * @Description:
  53. * @Author:zhaops
  54. * @time: 2021/1/21 15:20
  55. */
  56. @Component
  57. public class ResultStaticKnowledgeFacade extends ResultStaticKnowledgeServiceImpl {
  58. @Autowired
  59. private CdssCoreClient cdssCoreClient;
  60. @Autowired
  61. private KlConceptFacade klConceptFacade;
  62. @Autowired
  63. private KlRelationFacade klRelationFacade;
  64. @Autowired
  65. private KlConceptStaticFacade klConceptStaticFacade;
  66. @Autowired
  67. private MappingConfigFacade mappingConfigFacade;
  68. @Autowired
  69. private RunningInfoFacade runningInfoFacade;
  70. @Autowired
  71. @Qualifier("resultStaticKnowledgeServiceImpl")
  72. private ResultStaticKnowledgeService resultStaticKnowledgeService;
  73. @Autowired
  74. @Qualifier("resultStaticInfoServiceImpl")
  75. private ResultStaticInfoService resultStaticInfoService;
  76. /**
  77. * 化验静态知识测试
  78. *
  79. * @param file
  80. * @param testVO
  81. * @return
  82. */
  83. public Boolean lisTest(MultipartFile file, StaticKnowledgeTestVO testVO) {
  84. RunningInfoVO runningInfoVO = new RunningInfoVO();
  85. runningInfoVO.setCaseId(testVO.getCaseId());
  86. runningInfoVO.setHospitalId(testVO.getHospitalId());
  87. String fileName = file.getOriginalFilename();
  88. if (!(fileName.endsWith(".xls") || fileName.endsWith(".xlsx"))) {
  89. //终止运行
  90. runningInfoVO.setStatus(0);
  91. runningInfoFacade.updateStatus(runningInfoVO);
  92. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "请导入正确的文件类型");
  93. }
  94. List<ResultStaticKnowledge> mappingList = Lists.newLinkedList();
  95. List<ResultStaticKnowledge> saveList = Lists.newLinkedList();
  96. Long hospitalId = testVO.getHospitalId();
  97. Date now = DateUtil.now();
  98. //从Excel读取数据
  99. List<LisConfig> lisConfigList = Lists.newLinkedList();
  100. try {
  101. lisConfigList = ExcelUtils.importExcel(file, 0, 1, LisConfig.class);
  102. } catch (CommonException e) {
  103. if (!e.getErrorCode().equals(CommonErrorCode.OK)) {
  104. //终止运行
  105. runningInfoVO.setStatus(0);
  106. runningInfoFacade.updateStatus(runningInfoVO);
  107. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "请导入正确的文件格式");
  108. }
  109. }
  110. Integer totleNum = 0;
  111. if (ListUtil.isNotEmpty(lisConfigList)) {
  112. totleNum = lisConfigList.size();
  113. } else {
  114. lisConfigList = Lists.newLinkedList();
  115. }
  116. //数据预处理
  117. for (int i = 0; i < lisConfigList.size(); i++) {
  118. if (StringUtil.isNotBlank(lisConfigList.get(i).getHisName())) {
  119. lisConfigList.get(i).setHisName(lisConfigList.get(i).getHisName().trim());
  120. }
  121. if (StringUtil.isNotBlank(lisConfigList.get(i).getHisDetailName())) {
  122. lisConfigList.get(i).setHisDetailName(lisConfigList.get(i).getHisDetailName().trim());
  123. } else {
  124. lisConfigList.get(i).setHisDetailName("");
  125. }
  126. }
  127. // 已存在数据
  128. Map<String, Map<String, Map<String, List<String>>>> hisConfigMap
  129. = mappingConfigFacade.groupByHisNameWithName(null, ConceptTypeEnum.LisPack.getKey(), Long.valueOf(hospitalId));
  130. //术语映射
  131. for (LisConfig config : lisConfigList) {
  132. ResultStaticKnowledge result = new ResultStaticKnowledge();
  133. result.setGmtCreate(now);
  134. result.setGmtModified(now);
  135. result.setMessage("");
  136. if (StringUtil.isBlank(config.getHisName())) {
  137. result.setMessage(result.getMessage() + "医院术语不允许为空;");
  138. mappingList.add(result);
  139. continue;
  140. }
  141. result.setHisName(config.getHisName());
  142. result.setHisDetailName(config.getHisDetailName());
  143. if (hisConfigMap.containsKey(result.getHisName())
  144. && hisConfigMap.get(result.getHisName()).containsKey(result.getHisDetailName())) {
  145. Map<String, List<String>> subMap = hisConfigMap.get(result.getHisName()).get(result.getHisDetailName());
  146. if (subMap != null && subMap.size() > 0) {
  147. for (String subKey : subMap.keySet()) {
  148. ResultStaticKnowledge subResult = new ResultStaticKnowledge();
  149. BeanUtil.copyProperties(result, subResult);
  150. subResult.setName(subKey);
  151. subResult.setHasStandName(1);
  152. mappingList.add(subResult);
  153. }
  154. } else {
  155. result.setHasStandName(0);
  156. result.setMessage(result.getMessage() + "标准术语不存在;");
  157. mappingList.add(result);
  158. }
  159. } else {
  160. result.setHasStandName(0);
  161. result.setMessage(result.getMessage() + "标准术语不存在;");
  162. mappingList.add(result);
  163. }
  164. }
  165. //标准术语验证
  166. List<String> uniqueNames = mappingList
  167. .stream()
  168. .filter(i -> StringUtil.isNotBlank(i.getName()))
  169. .map(i -> i.getName())
  170. .collect(Collectors.toList());
  171. ConceptVO conceptVO = new ConceptVO();
  172. conceptVO.setNames(uniqueNames);
  173. conceptVO.setType(ConceptTypeEnum.LisPack.getKey());
  174. RespDTO<List<IndexBatchDTO>> respLisPackDTO = cdssCoreClient.getConceptNames(conceptVO);
  175. List<String> lisPackNames = Lists.newLinkedList();
  176. if (RespDTOUtil.respIsOK(respLisPackDTO)) {
  177. lisPackNames = respLisPackDTO.data.stream().map(IndexBatchDTO::getName).collect(Collectors.toList());
  178. }
  179. conceptVO.setType(ConceptTypeEnum.Lis.getKey());
  180. RespDTO<List<IndexBatchDTO>> respLisDTO = cdssCoreClient.getConceptNames(conceptVO);
  181. List<String> lisNames = Lists.newLinkedList();
  182. if (RespDTOUtil.respIsOK(respLisDTO)) {
  183. lisNames = respLisDTO.data.stream().map(IndexBatchDTO::getName).collect(Collectors.toList());
  184. }
  185. //判断是否有标准术语
  186. for (ResultStaticKnowledge result : mappingList) {
  187. if (result.getHasStandName() == null || result.getHasStandName().equals(0)) {
  188. continue;
  189. } else {
  190. if (lisPackNames.contains(result.getName()) || lisNames.contains(result.getName())) {
  191. result.setHasStandName(1);
  192. } else {
  193. result.setHasStandName(0);
  194. result.setMessage(result.getMessage() + "标准术语不存在;");
  195. }
  196. }
  197. }
  198. //验证静态知识
  199. List<KlConcept> infoList = klConceptStaticFacade.getAllConcept();
  200. if (ListUtil.isEmpty(infoList)) {
  201. infoList = Lists.newLinkedList();
  202. }
  203. List<String> lisStaticNames = infoList.stream()
  204. .filter(i -> i.getLibType().equals(LexiconEnum.LisSubName.getKey()))
  205. .map(i -> i.getLibName())
  206. .distinct()
  207. .collect(Collectors.toList());
  208. List<String> lisPackStaticNames = infoList.stream()
  209. .filter(i -> i.getLibType().equals(LexiconEnum.LisName.getKey()))
  210. .map(i -> i.getLibName())
  211. .distinct()
  212. .collect(Collectors.toList());
  213. for (ResultStaticKnowledge result : mappingList) {
  214. //静态知识是否存在
  215. if (result.getHasStandName() != null && result.getHasStandName().equals(1)) {
  216. if (lisStaticNames.contains(result.getName())
  217. || lisPackStaticNames.contains(result.getName())) {
  218. result.setHasStaticKnowledge(1);
  219. } else {
  220. //查找上级静态知识是否存在
  221. KlConcept lisSubName = klConceptFacade.getOne(new QueryWrapper<KlConcept>()
  222. .eq("is_deleted", IsDeleteEnum.N.getKey())
  223. .eq("lib_name", result.getName())
  224. .eq("lib_type", LexiconEnum.LisSubName.getKey()), false);
  225. if (lisSubName == null) {
  226. result.setHasStaticKnowledge(0);
  227. result.setMessage(result.getMessage() + "缺少静态知识;");
  228. } else {
  229. List<KlRelation> relations = klRelationFacade.list(new QueryWrapper<KlRelation>()
  230. .eq("is_deleted", IsDeleteEnum.N.getKey())
  231. .eq("end_id", lisSubName.getId())
  232. .eq("relation_id", 600));
  233. if (ListUtil.isNotEmpty(relations)) {
  234. KlConceptStatic staticInfo = klConceptStaticFacade.getOne(new QueryWrapper<KlConceptStatic>()
  235. .eq("is_deleted", IsDeleteEnum.N.getKey())
  236. .in("concept_id", relations.stream().map(i -> i.getStartId()).collect(Collectors.toList()))
  237. .eq("status", StatusEnum.Enable.getKey()), false);
  238. if (staticInfo == null) {
  239. result.setHasStaticKnowledge(0);
  240. result.setMessage(result.getMessage() + "缺少静态知识;");
  241. } else {
  242. KlConcept lisName = klConceptFacade.getById(staticInfo.getConceptId());
  243. result.setHasStaticKnowledge(1);
  244. result.setMessage(result.getMessage() + "取上级(" + lisName.getLibName() + ")静态知识;");
  245. }
  246. } else {
  247. result.setHasStaticKnowledge(0);
  248. result.setMessage(result.getMessage() + "缺少静态知识;");
  249. }
  250. }
  251. }
  252. }
  253. saveList.add(result);
  254. }
  255. //保存
  256. saveResult(saveList, testVO, totleNum);
  257. return true;
  258. }
  259. /**
  260. * 辅检静态知识测试
  261. *
  262. * @param file
  263. * @param testVO
  264. * @return
  265. */
  266. public Boolean pacsTest(MultipartFile file, StaticKnowledgeTestVO testVO) {
  267. RunningInfoVO runningInfoVO = new RunningInfoVO();
  268. runningInfoVO.setCaseId(testVO.getCaseId());
  269. runningInfoVO.setHospitalId(testVO.getHospitalId());
  270. String fileName = file.getOriginalFilename();
  271. if (!(fileName.endsWith(".xls") || fileName.endsWith(".xlsx"))) {
  272. //终止运行
  273. runningInfoVO.setStatus(0);
  274. runningInfoFacade.updateStatus(runningInfoVO);
  275. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "请导入正确的文件类型");
  276. }
  277. List<ResultStaticKnowledge> mappingList = Lists.newLinkedList();
  278. List<ResultStaticKnowledge> saveList = Lists.newLinkedList();
  279. Long hospitalId = testVO.getHospitalId();
  280. Date now = DateUtil.now();
  281. //从Excel读取数据
  282. List<PacsConfig> pacsConfigList = Lists.newLinkedList();
  283. try {
  284. pacsConfigList = ExcelUtils.importExcel(file, 0, 1, PacsConfig.class);
  285. } catch (CommonException e) {
  286. if (!e.getErrorCode().equals(CommonErrorCode.OK)) {
  287. //终止运行
  288. runningInfoVO.setStatus(0);
  289. runningInfoFacade.updateStatus(runningInfoVO);
  290. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "请导入正确的文件格式");
  291. }
  292. }
  293. Integer totleNum = 0;
  294. if (ListUtil.isNotEmpty(pacsConfigList)) {
  295. totleNum = pacsConfigList.size();
  296. } else {
  297. pacsConfigList = Lists.newLinkedList();
  298. }
  299. //数据预处理
  300. for (PacsConfig config : pacsConfigList) {
  301. if (StringUtil.isNotBlank(config.getHisName())) {
  302. config.setHisName(config.getHisName().trim());
  303. }
  304. }
  305. //重复数据过滤
  306. /*pacsConfigList = pacsConfigList
  307. .stream()
  308. .distinct()
  309. .collect(Collectors.toList());*/
  310. // 已存在数据
  311. Map<String, Map<String, Map<String, List<String>>>> hisConfigMap
  312. = mappingConfigFacade.groupByHisNameWithName(null, ConceptTypeEnum.Pacs.getKey(), Long.valueOf(hospitalId));
  313. //术语映射
  314. for (PacsConfig config : pacsConfigList) {
  315. ResultStaticKnowledge result = new ResultStaticKnowledge();
  316. result.setGmtCreate(now);
  317. result.setGmtModified(now);
  318. result.setMessage("");
  319. if (StringUtil.isBlank(config.getHisName())) {
  320. result.setMessage(result.getMessage() + "医院术语不允许为空;");
  321. mappingList.add(result);
  322. continue;
  323. }
  324. result.setHisName(config.getHisName());
  325. if (hisConfigMap.containsKey(result.getHisName())) {
  326. Map<String, List<String>> subMap = hisConfigMap.get(result.getHisName()).get("");
  327. if (subMap != null && subMap.size() > 0) {
  328. for (String subKey : subMap.keySet()) {
  329. ResultStaticKnowledge subResult = new ResultStaticKnowledge();
  330. BeanUtil.copyProperties(result, subResult);
  331. subResult.setName(subKey);
  332. subResult.setHasStandName(1);
  333. mappingList.add(subResult);
  334. }
  335. } else {
  336. result.setHasStandName(0);
  337. result.setMessage(result.getMessage() + "标准术语不存在;");
  338. mappingList.add(result);
  339. }
  340. } else {
  341. result.setHasStandName(0);
  342. result.setMessage(result.getMessage() + "标准术语不存在;");
  343. mappingList.add(result);
  344. }
  345. }
  346. //标准术语校验
  347. List<String> uniqueNames = mappingList.stream()
  348. .filter(i -> StringUtil.isNotBlank(i.getName()))
  349. .map(i -> i.getName())
  350. .distinct()
  351. .collect(Collectors.toList());
  352. ConceptVO conceptVO = new ConceptVO();
  353. conceptVO.setNames(uniqueNames);
  354. conceptVO.setType(ConceptTypeEnum.Pacs.getKey());
  355. RespDTO<List<IndexBatchDTO>> respDTO = cdssCoreClient.getConceptNames(conceptVO);
  356. List<String> names = Lists.newLinkedList();
  357. if (RespDTOUtil.respIsOK(respDTO)) {
  358. names = respDTO.data.stream().map(IndexBatchDTO::getName).collect(Collectors.toList());
  359. }
  360. for (ResultStaticKnowledge result : mappingList) {
  361. if (result.getHasStandName() == null || result.getHasStandName().equals(0)) {
  362. continue;
  363. } else {
  364. if (names.contains(result.getName())) {
  365. result.setHasStandName(1);
  366. } else {
  367. result.setHasStandName(0);
  368. result.setMessage(result.getMessage() + "标准术语不存在;");
  369. }
  370. }
  371. }
  372. //静态知识
  373. List<KlConcept> infoList = klConceptStaticFacade.getAllConcept();
  374. if (ListUtil.isEmpty(infoList)) {
  375. infoList = Lists.newLinkedList();
  376. }
  377. List<String> pacsStaticNames = infoList.stream()
  378. .filter(i -> i.getLibType().equals(LexiconEnum.PacsName.getKey()))
  379. .map(i -> i.getLibName())
  380. .distinct()
  381. .collect(Collectors.toList());
  382. List<String> subPacsPackStaticNames = infoList.stream()
  383. .filter(i -> i.getLibType().equals(LexiconEnum.PacsSubName.getKey()))
  384. .map(i -> i.getLibName())
  385. .distinct()
  386. .collect(Collectors.toList());
  387. for (ResultStaticKnowledge result : mappingList) {
  388. //静态知识是否存在
  389. if (result.getHasStandName() != null && result.getHasStandName().equals(1)) {
  390. if (pacsStaticNames.contains(result.getName())
  391. || subPacsPackStaticNames.contains(result.getName())) {
  392. result.setHasStaticKnowledge(1);
  393. } else {
  394. //查找上级静态知识是否存在
  395. KlConcept pacsSubName = klConceptFacade.getOne(new QueryWrapper<KlConcept>()
  396. .eq("is_deleted", IsDeleteEnum.N.getKey())
  397. .eq("lib_name", result.getName())
  398. .eq("lib_type", LexiconEnum.PacsSubName.getKey()), false);
  399. if (pacsSubName == null) {
  400. result.setHasStaticKnowledge(0);
  401. result.setMessage(result.getMessage() + "缺少静态知识;");
  402. } else {
  403. List<KlRelation> relations = klRelationFacade.list(new QueryWrapper<KlRelation>()
  404. .eq("is_deleted", IsDeleteEnum.N.getKey())
  405. .eq("end_id", pacsSubName.getId())
  406. .eq("relation_id", 600));
  407. if (ListUtil.isNotEmpty(relations)) {
  408. KlConceptStatic staticInfo = klConceptStaticFacade.getOne(new QueryWrapper<KlConceptStatic>()
  409. .eq("is_deleted", IsDeleteEnum.N.getKey())
  410. .in("concept_id", relations.stream().map(i -> i.getStartId()).collect(Collectors.toList()))
  411. .eq("status", StatusEnum.Enable.getKey()), false);
  412. if (staticInfo == null) {
  413. result.setHasStaticKnowledge(0);
  414. result.setMessage(result.getMessage() + "缺少静态知识;");
  415. } else {
  416. KlConcept pacsName = klConceptFacade.getById(staticInfo.getConceptId());
  417. result.setHasStaticKnowledge(1);
  418. result.setMessage(result.getMessage() + "取上级(" + pacsName.getLibName() + ")静态知识;");
  419. }
  420. } else {
  421. result.setHasStaticKnowledge(0);
  422. result.setMessage(result.getMessage() + "缺少静态知识;");
  423. }
  424. }
  425. }
  426. }
  427. saveList.add(result);
  428. }
  429. //保存
  430. saveResult(saveList, testVO, totleNum);
  431. return true;
  432. }
  433. /**
  434. * 药品静态知识测试
  435. *
  436. * @param file
  437. * @param testVO
  438. * @return
  439. */
  440. public Boolean drugTest(MultipartFile file, StaticKnowledgeTestVO testVO) {
  441. RunningInfoVO runningInfoVO = new RunningInfoVO();
  442. runningInfoVO.setCaseId(testVO.getCaseId());
  443. runningInfoVO.setHospitalId(testVO.getHospitalId());
  444. String fileName = file.getOriginalFilename();
  445. if (!(fileName.endsWith(".xls") || fileName.endsWith(".xlsx"))) {
  446. //终止运行
  447. runningInfoVO.setStatus(0);
  448. runningInfoFacade.updateStatus(runningInfoVO);
  449. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "请导入正确的文件类型");
  450. }
  451. List<ResultStaticKnowledge> mappingList = Lists.newLinkedList();
  452. List<ResultStaticKnowledge> saveList = Lists.newLinkedList();
  453. Long hospitalId = testVO.getHospitalId();
  454. Date now = DateUtil.now();
  455. //从Excel读取数据
  456. List<DrugConfig> drugConfigList = Lists.newLinkedList();
  457. try {
  458. drugConfigList = ExcelUtils.importExcel(file, 1, 1, DrugConfig.class);
  459. } catch (CommonException e) {
  460. if (!e.getErrorCode().equals(CommonErrorCode.OK)) {
  461. //终止运行
  462. runningInfoVO.setStatus(0);
  463. runningInfoFacade.updateStatus(runningInfoVO);
  464. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "请导入正确的文件格式");
  465. }
  466. }
  467. Integer totleNum = 0;
  468. if (ListUtil.isNotEmpty(drugConfigList)) {
  469. totleNum = drugConfigList.size();
  470. } else {
  471. drugConfigList = Lists.newLinkedList();
  472. }
  473. //数据预处理
  474. for (DrugConfig config : drugConfigList) {
  475. if (StringUtil.isNotBlank(config.getHisName())) {
  476. config.setHisName(config.getHisName().trim());
  477. }
  478. }
  479. //重复数据过滤
  480. /*drugConfigList = drugConfigList
  481. .stream()
  482. .distinct()
  483. .collect(Collectors.toList());*/
  484. // 已存在数据
  485. Map<String, Map<String, Map<String, List<String>>>> hisConfigMap
  486. = mappingConfigFacade.groupByHisNameWithName(null, ConceptTypeEnum.Drug.getKey(), Long.valueOf(hospitalId));
  487. //术语映射
  488. for (DrugConfig config : drugConfigList) {
  489. ResultStaticKnowledge result = new ResultStaticKnowledge();
  490. result.setGmtCreate(now);
  491. result.setGmtModified(now);
  492. result.setMessage("");
  493. if (StringUtil.isBlank(config.getHisName())) {
  494. result.setMessage(result.getMessage() + "医院术语不允许为空;");
  495. mappingList.add(result);
  496. continue;
  497. }
  498. result.setHisName(config.getHisName());
  499. if (hisConfigMap.containsKey(result.getHisName())) {
  500. Map<String, List<String>> subMap = hisConfigMap.get(result.getHisName()).get("");
  501. if (subMap != null && subMap.size() > 0) {
  502. for (String subKey : subMap.keySet()) {
  503. ResultStaticKnowledge subResult = new ResultStaticKnowledge();
  504. BeanUtil.copyProperties(result, subResult);
  505. subResult.setName(subKey);
  506. subResult.setHasStandName(1);
  507. mappingList.add(subResult);
  508. }
  509. } else {
  510. result.setHasStandName(0);
  511. result.setMessage(result.getMessage() + "标准术语不存在;");
  512. mappingList.add(result);
  513. }
  514. } else {
  515. result.setHasStandName(0);
  516. result.setMessage(result.getMessage() + "标准术语不存在;");
  517. mappingList.add(result);
  518. }
  519. }
  520. //标准术语校验
  521. List<String> uniqueNames = mappingList.stream()
  522. .filter(i -> StringUtil.isNotBlank(i.getName()))
  523. .map(i -> i.getName())
  524. .distinct()
  525. .collect(Collectors.toList());
  526. ConceptVO conceptVO = new ConceptVO();
  527. conceptVO.setNames(uniqueNames);
  528. conceptVO.setType(ConceptTypeEnum.Drug.getKey());
  529. RespDTO<List<IndexBatchDTO>> respDTO = cdssCoreClient.getConceptNames(conceptVO);
  530. List<String> names = Lists.newLinkedList();
  531. if (RespDTOUtil.respIsOK(respDTO)) {
  532. names = respDTO.data.stream().map(IndexBatchDTO::getName).collect(Collectors.toList());
  533. }
  534. for (ResultStaticKnowledge result : mappingList) {
  535. if (result.getHasStandName() == null || result.getHasStandName().equals(0)) {
  536. continue;
  537. } else {
  538. if (names.contains(result.getName())) {
  539. result.setHasStandName(1);
  540. } else {
  541. result.setHasStandName(0);
  542. result.setMessage(result.getMessage() + "标准术语不存在;");
  543. }
  544. }
  545. }
  546. //验证静态知识
  547. List<KlConcept> infoList = klConceptStaticFacade.getAllConcept();
  548. if (ListUtil.isEmpty(infoList)) {
  549. infoList = Lists.newLinkedList();
  550. }
  551. List<String> drugStaticNames = infoList.stream()
  552. .filter(i -> i.getLibType().equals(LexiconEnum.Medicine.getKey()))
  553. .map(i -> i.getLibName())
  554. .distinct()
  555. .collect(Collectors.toList());
  556. for (ResultStaticKnowledge result : mappingList) {
  557. //静态知识是否存在
  558. if (result.getHasStandName() != null && result.getHasStandName().equals(1)) {
  559. if (drugStaticNames.contains(result.getName())) {
  560. result.setHasStaticKnowledge(1);
  561. } else {
  562. result.setHasStaticKnowledge(0);
  563. result.setMessage(result.getMessage() + "缺少静态知识;");
  564. }
  565. }
  566. saveList.add(result);
  567. }
  568. //保存
  569. saveResult(saveList, testVO, totleNum);
  570. return true;
  571. }
  572. /**
  573. * 诊断静态知识测试
  574. *
  575. * @param file
  576. * @param testVO
  577. * @return
  578. */
  579. public Boolean diseaseTest(MultipartFile file, StaticKnowledgeTestVO testVO) {
  580. RunningInfoVO runningInfoVO = new RunningInfoVO();
  581. runningInfoVO.setCaseId(testVO.getCaseId());
  582. runningInfoVO.setHospitalId(testVO.getHospitalId());
  583. String fileName = file.getOriginalFilename();
  584. if (!(fileName.endsWith(".xls") || fileName.endsWith(".xlsx"))) {
  585. //终止运行
  586. runningInfoVO.setStatus(0);
  587. runningInfoFacade.updateStatus(runningInfoVO);
  588. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "请导入正确的文件类型");
  589. }
  590. List<ResultStaticKnowledge> mappingList = Lists.newLinkedList();
  591. List<ResultStaticKnowledge> saveList = Lists.newLinkedList();
  592. Long hospitalId = testVO.getHospitalId();
  593. Date now = DateUtil.now();
  594. //从Excel读取数据
  595. List<DiseaseConfig> diseaseConfigList = Lists.newLinkedList();
  596. try {
  597. diseaseConfigList = ExcelUtils.importExcel(file, 0, 1, DiseaseConfig.class);
  598. } catch (CommonException e) {
  599. if (!e.getErrorCode().equals(CommonErrorCode.OK)) {
  600. //终止运行
  601. runningInfoVO.setStatus(0);
  602. runningInfoFacade.updateStatus(runningInfoVO);
  603. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "请导入正确的文件格式");
  604. }
  605. }
  606. Integer totleNum = 0;
  607. if (ListUtil.isNotEmpty(diseaseConfigList)) {
  608. totleNum = diseaseConfigList.size();
  609. } else {
  610. diseaseConfigList = Lists.newLinkedList();
  611. }
  612. //数据预处理
  613. for (DiseaseConfig config : diseaseConfigList) {
  614. if (StringUtil.isNotBlank(config.getHisName())) {
  615. config.setHisName(config.getHisName().trim());
  616. }
  617. }
  618. //重复数据过滤
  619. /*diseaseConfigList = diseaseConfigList
  620. .stream()
  621. .distinct()
  622. .collect(Collectors.toList());*/
  623. // 已存在数据
  624. Map<String, Map<String, Map<String, List<String>>>> hisConfigMap
  625. = mappingConfigFacade.groupByHisNameWithName(null, ConceptTypeEnum.Disease.getKey(), Long.valueOf(hospitalId));
  626. //Map<String, Map<String, List<Long>>> hisConfigMap = diseaseConfigFacade.getConfigMap(Long.valueOf(hospitalId), null, null);
  627. //术语映射
  628. for (DiseaseConfig config : diseaseConfigList) {
  629. ResultStaticKnowledge result = new ResultStaticKnowledge();
  630. result.setGmtCreate(now);
  631. result.setGmtModified(now);
  632. result.setMessage("");
  633. if (StringUtil.isBlank(config.getHisName())) {
  634. result.setMessage(result.getMessage() + "医院术语不允许为空;");
  635. mappingList.add(result);
  636. continue;
  637. }
  638. result.setHisName(config.getHisName());
  639. if (hisConfigMap.containsKey(result.getHisName())) {
  640. Map<String, List<String>> subMap = hisConfigMap.get(result.getHisName()).get("");
  641. if (subMap != null && subMap.size() > 0) {
  642. for (String subKey : subMap.keySet()) {
  643. ResultStaticKnowledge subResult = new ResultStaticKnowledge();
  644. BeanUtil.copyProperties(result, subResult);
  645. subResult.setName(subKey);
  646. subResult.setHasStandName(1);
  647. mappingList.add(subResult);
  648. }
  649. } else {
  650. result.setHasStandName(0);
  651. result.setMessage(result.getMessage() + "标准术语不存在;");
  652. mappingList.add(result);
  653. }
  654. } else {
  655. result.setHasStandName(0);
  656. result.setMessage(result.getMessage() + "标准术语不存在;");
  657. mappingList.add(result);
  658. }
  659. }
  660. //标准术语校验
  661. List<String> uniqueNames = mappingList.stream()
  662. .filter(i -> StringUtil.isNotBlank(i.getName()))
  663. .map(i -> i.getName())
  664. .distinct()
  665. .collect(Collectors.toList());
  666. ConceptVO conceptVO = new ConceptVO();
  667. conceptVO.setNames(uniqueNames);
  668. conceptVO.setType(ConceptTypeEnum.Disease.getKey());
  669. RespDTO<List<IndexBatchDTO>> respDTO = cdssCoreClient.getConceptNames(conceptVO);
  670. List<String> names = Lists.newLinkedList();
  671. if (RespDTOUtil.respIsOK(respDTO)) {
  672. names = respDTO.data.stream().map(IndexBatchDTO::getName).collect(Collectors.toList());
  673. }
  674. for (ResultStaticKnowledge result : mappingList) {
  675. if (result.getHasStandName() == null || result.getHasStandName().equals(0)) {
  676. continue;
  677. } else {
  678. if (names.contains(result.getName())) {
  679. result.setHasStandName(1);
  680. } else {
  681. result.setHasStandName(0);
  682. result.setMessage(result.getMessage() + "标准术语不存在;");
  683. }
  684. }
  685. }
  686. //验证静态知识
  687. List<KlConcept> infoList = klConceptStaticFacade.getAllConcept();
  688. if (ListUtil.isEmpty(infoList)) {
  689. infoList = Lists.newLinkedList();
  690. }
  691. List<String> diseaseStaticNames = infoList.stream()
  692. .filter(i -> i.getLibName().equals(LexiconEnum.Disease.getKey()))
  693. .map(i -> i.getLibName())
  694. .distinct()
  695. .collect(Collectors.toList());
  696. for (ResultStaticKnowledge result : mappingList) {
  697. //静态知识是否存在
  698. if (result.getHasStandName() != null && result.getHasStandName().equals(1)) {
  699. if (diseaseStaticNames.contains(result.getName())) {
  700. result.setHasStaticKnowledge(1);
  701. } else {
  702. result.setHasStaticKnowledge(0);
  703. result.setMessage(result.getMessage() + "缺少静态知识;");
  704. }
  705. }
  706. saveList.add(result);
  707. }
  708. //保存
  709. saveResult(saveList, testVO, totleNum);
  710. return true;
  711. }
  712. /**
  713. * 手术/操作静态知识测试
  714. *
  715. * @param file
  716. * @param testVO
  717. * @return
  718. */
  719. public Boolean operationTest(MultipartFile file, StaticKnowledgeTestVO testVO) {
  720. RunningInfoVO runningInfoVO = new RunningInfoVO();
  721. runningInfoVO.setCaseId(testVO.getCaseId());
  722. runningInfoVO.setHospitalId(testVO.getHospitalId());
  723. String fileName = file.getOriginalFilename();
  724. if (!(fileName.endsWith(".xls") || fileName.endsWith(".xlsx"))) {
  725. //终止运行
  726. runningInfoVO.setStatus(0);
  727. runningInfoFacade.updateStatus(runningInfoVO);
  728. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "请导入正确的文件类型");
  729. }
  730. List<ResultStaticKnowledge> mappingList = Lists.newLinkedList();
  731. List<ResultStaticKnowledge> saveList = Lists.newLinkedList();
  732. Long hospitalId = testVO.getHospitalId();
  733. Date now = DateUtil.now();
  734. //从Excel读取数据
  735. List<OperationConfig> operationConfigList = Lists.newLinkedList();
  736. try {
  737. operationConfigList = ExcelUtils.importExcel(file, 0, 1, OperationConfig.class);
  738. } catch (CommonException e) {
  739. if (!e.getErrorCode().equals(CommonErrorCode.OK)) {
  740. //终止运行
  741. runningInfoVO.setStatus(0);
  742. runningInfoFacade.updateStatus(runningInfoVO);
  743. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "请导入正确的文件格式");
  744. }
  745. }
  746. Integer totleNum = 0;
  747. if (ListUtil.isNotEmpty(operationConfigList)) {
  748. totleNum = operationConfigList.size();
  749. } else {
  750. operationConfigList = Lists.newLinkedList();
  751. }
  752. //数据预处理
  753. for (OperationConfig config : operationConfigList) {
  754. if (StringUtil.isNotBlank(config.getHisName())) {
  755. config.setHisName(config.getHisName().trim());
  756. }
  757. }
  758. //重复数据过滤
  759. /* operationConfigList = operationConfigList
  760. .stream()
  761. .distinct()
  762. .collect(Collectors.toList());*/
  763. // 已存在数据
  764. Map<String, Map<String, Map<String, List<String>>>> hisConfigMap
  765. = mappingConfigFacade.groupByHisNameWithName(null, ConceptTypeEnum.Operation.getKey(), Long.valueOf(hospitalId));
  766. //Map<String, Map<String, List<Long>>> hisConfigMap = operationConfigFacade.getConfigMap(Long.valueOf(hospitalId), null, null);
  767. //术语映射
  768. for (OperationConfig config : operationConfigList) {
  769. ResultStaticKnowledge result = new ResultStaticKnowledge();
  770. result.setGmtCreate(now);
  771. result.setGmtModified(now);
  772. result.setMessage("");
  773. if (StringUtil.isBlank(config.getHisName())) {
  774. result.setMessage(result.getMessage() + "医院术语不允许为空;");
  775. mappingList.add(result);
  776. continue;
  777. }
  778. result.setHisName(config.getHisName());
  779. if (hisConfigMap.containsKey(result.getHisName())) {
  780. Map<String, List<String>> subMap = hisConfigMap.get(result.getHisName()).get("");
  781. if (subMap != null && subMap.size() > 0) {
  782. for (String subKey : subMap.keySet()) {
  783. ResultStaticKnowledge subResult = new ResultStaticKnowledge();
  784. BeanUtil.copyProperties(result, subResult);
  785. subResult.setName(subKey);
  786. subResult.setHasStandName(1);
  787. mappingList.add(subResult);
  788. }
  789. } else {
  790. result.setHasStandName(0);
  791. result.setMessage(result.getMessage() + "标准术语不存在;");
  792. mappingList.add(result);
  793. }
  794. } else {
  795. result.setHasStandName(0);
  796. result.setMessage(result.getMessage() + "标准术语不存在;");
  797. mappingList.add(result);
  798. }
  799. }
  800. //标准术语校验
  801. List<String> uniqueNames = mappingList.stream()
  802. .filter(i -> StringUtil.isNotBlank(i.getName()))
  803. .map(i -> i.getName())
  804. .distinct()
  805. .collect(Collectors.toList());
  806. ConceptVO conceptVO = new ConceptVO();
  807. conceptVO.setNames(uniqueNames);
  808. conceptVO.setType(ConceptTypeEnum.Operation.getKey());
  809. RespDTO<List<IndexBatchDTO>> respDTO = cdssCoreClient.getConceptNames(conceptVO);
  810. List<String> names = Lists.newLinkedList();
  811. if (RespDTOUtil.respIsOK(respDTO)) {
  812. names = respDTO.data.stream().map(IndexBatchDTO::getName).collect(Collectors.toList());
  813. }
  814. for (ResultStaticKnowledge result : mappingList) {
  815. if (result.getHasStandName() == null || result.getHasStandName().equals(0)) {
  816. continue;
  817. } else {
  818. if (names.contains(result.getName())) {
  819. result.setHasStandName(1);
  820. } else {
  821. result.setHasStandName(0);
  822. result.setMessage(result.getMessage() + "标准术语不存在;");
  823. }
  824. }
  825. }
  826. //验证静态知识
  827. List<KlConcept> infoList = klConceptStaticFacade.getAllConcept();
  828. if (ListUtil.isEmpty(infoList)) {
  829. infoList = Lists.newLinkedList();
  830. }
  831. List<String> diseaseStaticNames = infoList.stream()
  832. .filter(i -> i.getLibType().equals(LexiconEnum.Operation.getKey()))
  833. .map(i -> i.getLibName())
  834. .distinct()
  835. .collect(Collectors.toList());
  836. for (ResultStaticKnowledge result : mappingList) {
  837. //静态知识是否存在
  838. if (result.getHasStandName() != null && result.getHasStandName().equals(1)) {
  839. if (diseaseStaticNames.contains(result.getName())) {
  840. result.setHasStaticKnowledge(1);
  841. } else {
  842. result.setHasStaticKnowledge(0);
  843. result.setMessage(result.getMessage() + "缺少静态知识;");
  844. }
  845. }
  846. saveList.add(result);
  847. }
  848. //保存
  849. saveResult(saveList, testVO, totleNum);
  850. return true;
  851. }
  852. /**
  853. * 保存静态知识测试结果
  854. *
  855. * @param list
  856. * @param testVO
  857. * @return
  858. */
  859. @Transactional
  860. public Boolean saveResult(List<ResultStaticKnowledge> list, StaticKnowledgeTestVO testVO, Integer totleNum) {
  861. Date now = new Date();
  862. Integer unMappingNum = list.stream().filter(i -> i.getHasStandName() != null && i.getHasStandName().equals(0)).collect(Collectors.toList()).size();
  863. Integer withoutKnowledgeNum = list.stream().filter(i -> i.getHasStaticKnowledge() != null && i.getHasStaticKnowledge().equals(0)).collect(Collectors.toList()).size();
  864. QueryWrapper<ResultStaticInfo> resultStaticInfoQueryWrapper = new QueryWrapper<>();
  865. resultStaticInfoQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
  866. .eq("hospital_id", testVO.getHospitalId())
  867. .eq("case_id", testVO.getCaseId());
  868. ResultStaticInfo resultInfo = resultStaticInfoService.getOne(resultStaticInfoQueryWrapper, false);
  869. if (resultInfo == null) {
  870. resultInfo = new ResultStaticInfo();
  871. resultInfo.setHospitalId(testVO.getHospitalId());
  872. resultInfo.setCaseId(testVO.getCaseId());
  873. resultInfo.setGmtCreate(now);
  874. }
  875. resultInfo.setGmtModified(now);
  876. resultInfo.setTotleNum(totleNum);
  877. resultInfo.setUnMappingNum(unMappingNum);
  878. resultInfo.setWithoutKnowledgeNum(withoutKnowledgeNum);
  879. resultStaticInfoService.saveOrUpdate(resultInfo);
  880. QueryWrapper<ResultStaticKnowledge> resultStaticKnowledgeQueryWrapper = new QueryWrapper<>();
  881. resultStaticKnowledgeQueryWrapper.eq("result_id", resultInfo.getId());
  882. resultStaticKnowledgeService.remove(resultStaticKnowledgeQueryWrapper);
  883. for (ResultStaticKnowledge result : list) {
  884. result.setType(testVO.getType());
  885. result.setResultId(resultInfo.getId());
  886. }
  887. resultStaticKnowledgeService.saveOrUpdateBatch(list);
  888. return true;
  889. }
  890. //region --------------------------导出------------------------------
  891. /**
  892. * 数据导出
  893. *
  894. * @param response
  895. * @param resultStaticPageVO
  896. */
  897. public void exportLisExcel(HttpServletResponse response, ResultStaticPageVO resultStaticPageVO) {
  898. resultStaticPageVO.setSize(-1L);
  899. IPage<ResultStaticKnowledge> page = this.getPage(resultStaticPageVO);
  900. String fileName = "检验映射测试结果导出.xls";
  901. List<ExportLisTestDTO> records = BeanUtil.listCopyTo(page.getRecords(), ExportLisTestDTO.class);
  902. ExcelUtils.exportExcel(records, null, "sheet1", ExportLisTestDTO.class, fileName, response, 12.8f);
  903. }
  904. /**
  905. * 数据导出
  906. *
  907. * @param response
  908. * @param resultStaticPageVO
  909. */
  910. public void exportLisStaticExcel(HttpServletResponse response, ResultStaticPageVO resultStaticPageVO) {
  911. resultStaticPageVO.setSize(-1L);
  912. IPage<ResultStaticKnowledge> page = this.getPage(resultStaticPageVO);
  913. String fileName = "检验静态知识测试结果导出.xls";
  914. List<ExportLisStaticTestDTO> records = BeanUtil.listCopyTo(page.getRecords(), ExportLisStaticTestDTO.class);
  915. ExcelUtils.exportExcel(records, null, "sheet1", ExportLisStaticTestDTO.class, fileName, response, 12.8f);
  916. }
  917. /**
  918. * 数据导出
  919. *
  920. * @param response
  921. * @param resultStaticPageVO
  922. */
  923. public void exportCommonExcel(HttpServletResponse response, ResultStaticPageVO resultStaticPageVO) {
  924. resultStaticPageVO.setSize(-1L);
  925. IPage<ResultStaticKnowledge> page = this.getPage(resultStaticPageVO);
  926. String fileName = "通用映射测试结果导出.xls";
  927. List<ExportCommonTestDTO> records = BeanUtil.listCopyTo(page.getRecords(), ExportCommonTestDTO.class);
  928. ExcelUtils.exportExcel(records, null, "sheet1", ExportCommonTestDTO.class, fileName, response, 12.8f);
  929. }
  930. /**
  931. * 数据导出
  932. *
  933. * @param response
  934. * @param resultStaticPageVO
  935. */
  936. public void exportCommonStaticExcel(HttpServletResponse response, ResultStaticPageVO resultStaticPageVO) {
  937. resultStaticPageVO.setSize(-1L);
  938. IPage<ResultStaticKnowledge> page = this.getPage(resultStaticPageVO);
  939. String fileName = "通用静态知识测试结果导出.xls";
  940. List<ExportCommonStaticTestDTO> records = BeanUtil.listCopyTo(page.getRecords(), ExportCommonStaticTestDTO.class);
  941. ExcelUtils.exportExcel(records, null, "sheet1", ExportCommonStaticTestDTO.class, fileName, response, 12.8f);
  942. }
  943. //endregion --------------------------导出------------------------------
  944. }