DiseaseConfigFacade.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  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.HosRelationNumDTO;
  6. import com.diagbot.dto.RespDTO;
  7. import com.diagbot.entity.DiseaseConfig;
  8. import com.diagbot.enums.ConceptTypeEnum;
  9. import com.diagbot.enums.IsDeleteEnum;
  10. import com.diagbot.exception.CommonErrorCode;
  11. import com.diagbot.exception.CommonException;
  12. import com.diagbot.service.DiseaseConfigService;
  13. import com.diagbot.util.DateUtil;
  14. import com.diagbot.util.EntityUtil;
  15. import com.diagbot.util.ExcelUtils;
  16. import com.diagbot.util.ListUtil;
  17. import com.diagbot.util.RespDTOUtil;
  18. import com.diagbot.util.StringUtil;
  19. import com.diagbot.util.UserUtils;
  20. import com.diagbot.vo.ConceptVO;
  21. import com.diagbot.vo.DiseaseConfigListVO;
  22. import com.diagbot.vo.DiseaseConfigPageVO;
  23. import com.diagbot.vo.HosRelationNumPageVO;
  24. import com.diagbot.vo.HospitalIdVO;
  25. import com.diagbot.vo.IdListVO;
  26. import com.diagbot.vo.IdVO;
  27. import com.google.common.collect.Lists;
  28. import org.apache.commons.lang3.StringUtils;
  29. import org.springframework.beans.factory.annotation.Autowired;
  30. import org.springframework.stereotype.Component;
  31. import org.springframework.web.multipart.MultipartFile;
  32. import javax.servlet.http.HttpServletResponse;
  33. import java.util.ArrayList;
  34. import java.util.Date;
  35. import java.util.HashMap;
  36. import java.util.List;
  37. import java.util.Map;
  38. import java.util.stream.Collectors;
  39. /**
  40. * @Description:
  41. * @Author:zhaops
  42. * @time: 2020/7/29 15:05
  43. */
  44. @Component
  45. public class DiseaseConfigFacade {
  46. @Autowired
  47. private DiseaseConfigService diseaseConfigService;
  48. @Autowired
  49. private CdssCoreClient cdssCoreClient;
  50. /**
  51. * 判断是否已存在
  52. *
  53. * @param diseaseConfig
  54. * @return
  55. */
  56. public Boolean isExistRecord(DiseaseConfig diseaseConfig) {
  57. QueryWrapper<DiseaseConfig> queryWrapper = new QueryWrapper<>();
  58. queryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
  59. .eq("hospital_id", diseaseConfig.getHospitalId())
  60. .eq("his_name", diseaseConfig.getHisName())
  61. .eq("unique_name", diseaseConfig.getUniqueName());
  62. DiseaseConfig oldRecord = diseaseConfigService.getOne(queryWrapper, false);
  63. if (diseaseConfig.getId() == null
  64. && oldRecord != null) {
  65. throw new CommonException(CommonErrorCode.IS_EXISTS, "该条关联已存在,无法保存");
  66. }
  67. if (diseaseConfig.getId() != null
  68. && oldRecord != null
  69. && !diseaseConfig.getId().equals(oldRecord.getId())) {
  70. throw new CommonException(CommonErrorCode.IS_EXISTS, "该条关联已存在,无法保存");
  71. }
  72. return false;
  73. }
  74. /**
  75. * 保存记录-单条
  76. *
  77. * @param diseaseConfig
  78. * @return
  79. */
  80. public Boolean saveOrUpdateRecord(DiseaseConfig diseaseConfig) {
  81. String userId = UserUtils.getCurrentPrincipleID();
  82. Date now = DateUtil.now();
  83. diseaseConfig.setModifier(userId);
  84. diseaseConfig.setGmtModified(now);
  85. QueryWrapper<DiseaseConfig> queryWrapper = new QueryWrapper<>();
  86. queryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
  87. .eq("hospital_id", diseaseConfig.getHospitalId())
  88. .eq("his_name", diseaseConfig.getHisName())
  89. .eq("unique_name", diseaseConfig.getUniqueName());
  90. DiseaseConfig oldRecord = diseaseConfigService.getOne(queryWrapper, false);
  91. if (diseaseConfig.getId() == null
  92. && oldRecord != null) {
  93. throw new CommonException(CommonErrorCode.IS_EXISTS, "该条关联已存在,无法保存");
  94. }
  95. if (diseaseConfig.getId() != null
  96. && oldRecord != null
  97. && !diseaseConfig.getId().equals(oldRecord.getId())) {
  98. throw new CommonException(CommonErrorCode.IS_EXISTS, "该条关联已存在,无法保存");
  99. }
  100. //新增数据
  101. if (diseaseConfig.getId() == null) {
  102. diseaseConfig.setCreator(userId);
  103. diseaseConfig.setGmtCreate(now);
  104. }
  105. if (diseaseConfig.getIsDeleted() == null) {
  106. diseaseConfig.setIsDeleted(IsDeleteEnum.N.getKey());
  107. }
  108. diseaseConfigService.saveOrUpdate(diseaseConfig);
  109. return true;
  110. }
  111. /**
  112. * 保存记录-批量
  113. *
  114. * @param diseaseConfigListVO
  115. * @return
  116. */
  117. public Boolean saveOrUpdateRecords(DiseaseConfigListVO diseaseConfigListVO) {
  118. if (ListUtil.isEmpty(diseaseConfigListVO.getDiseaseConfigList())) {
  119. return false;
  120. }
  121. return saveOrUpdateRecords(diseaseConfigListVO.getDiseaseConfigList());
  122. }
  123. /**
  124. * 批量保存
  125. *
  126. * @param diseaseConfigList
  127. * @return
  128. */
  129. public Boolean saveOrUpdateRecords(List<DiseaseConfig> diseaseConfigList) {
  130. if (ListUtil.isEmpty(diseaseConfigList)) {
  131. return false;
  132. }
  133. String userId = UserUtils.getCurrentPrincipleID();
  134. Date now = DateUtil.now();
  135. //数据不完整的不保存
  136. //过滤外部名称或公表名为空的数据
  137. diseaseConfigList = diseaseConfigList
  138. .stream()
  139. .filter(i -> i.getHospitalId() != null)
  140. .filter(i -> StringUtil.isNotBlank(i.getHisName()))
  141. .filter(i -> StringUtil.isNotBlank(i.getUniqueName()))
  142. .collect(Collectors.toList());
  143. if (ListUtil.isEmpty(diseaseConfigList)) {
  144. return false;
  145. }
  146. Long hospitalId = diseaseConfigList.get(0).getHospitalId();
  147. // 验证数据是否已存在,已存在的先删除
  148. // 没id的删除重新插入,有id的更新
  149. List<Long> deleteIds = Lists.newLinkedList();
  150. Map<String, Map<String, Long>> configMap
  151. = getConfigMap(hospitalId, null, null);
  152. diseaseConfigList.forEach(diseaseConfig -> {
  153. diseaseConfig.setModifier(userId);
  154. diseaseConfig.setGmtModified(now);
  155. if (diseaseConfig.getId() == null) {
  156. if (configMap.containsKey(diseaseConfig.getHisName())) {
  157. deleteIds.add(configMap.get(diseaseConfig.getHisName()).get(diseaseConfig.getUniqueName()));
  158. }
  159. diseaseConfig.setCreator(userId);
  160. diseaseConfig.setGmtCreate(now);
  161. }
  162. if (diseaseConfig.getIsDeleted() == null) {
  163. diseaseConfig.setIsDeleted(IsDeleteEnum.N.getKey());
  164. }
  165. });
  166. //删除已存在映射关系
  167. IdListVO idListVO = new IdListVO();
  168. idListVO.setIds(deleteIds);
  169. deleteRecords(idListVO);
  170. diseaseConfigService.saveOrUpdateBatch(diseaseConfigList);
  171. return true;
  172. }
  173. /**
  174. * 删除记录-单条
  175. *
  176. * @param idVO
  177. * @return
  178. */
  179. public Boolean deleteRecord(IdVO idVO) {
  180. diseaseConfigService.removeById(idVO.getId());
  181. return true;
  182. }
  183. /**
  184. * 删除记录-批量
  185. *
  186. * @param idListVO
  187. * @return
  188. */
  189. public Boolean deleteRecords(IdListVO idListVO) {
  190. if (ListUtil.isEmpty(idListVO.getIds())) {
  191. return false;
  192. }
  193. diseaseConfigService.removeByIds(idListVO.getIds());
  194. return true;
  195. }
  196. /**
  197. * 分页查询
  198. *
  199. * @param diseaseConfigPageVO
  200. * @return
  201. */
  202. public IPage<DiseaseConfig> getPage(DiseaseConfigPageVO diseaseConfigPageVO) {
  203. return diseaseConfigService.getPage(diseaseConfigPageVO);
  204. }
  205. /**
  206. * 数据导入
  207. *
  208. * @param file
  209. * @param hospitalIdVO
  210. */
  211. public void importExcel(MultipartFile file, HospitalIdVO hospitalIdVO) {
  212. List<DiseaseConfig> diseaseConfigList = ExcelUtils.importExcel(file, 0, 1, DiseaseConfig.class);
  213. if (ListUtil.isNotEmpty(diseaseConfigList)) {
  214. diseaseConfigList.forEach(diseaseConfig -> {
  215. diseaseConfig.setHospitalId(hospitalIdVO.getHospitalId());
  216. });
  217. importExcelRecords(diseaseConfigList, hospitalIdVO);
  218. } else {
  219. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "校验失败,导入数据不能为空");
  220. }
  221. }
  222. /**
  223. * 数据导入
  224. *
  225. * @param diseaseConfigList
  226. * @return
  227. */
  228. public Boolean importExcelRecords(List<DiseaseConfig> diseaseConfigList, HospitalIdVO hospitalIdVO) {
  229. Long hospitalId = hospitalIdVO.getHospitalId();
  230. String userId = UserUtils.getCurrentPrincipleID();
  231. Date now = DateUtil.now();
  232. //1、数据完整性校验
  233. //2、去除前后空格
  234. //过滤空数据,保留重复数据,方便计行
  235. diseaseConfigList = diseaseConfigList.stream()
  236. .filter(i -> StringUtil.isNotBlank(i.getHisName())
  237. || StringUtil.isNotBlank(i.getIcdCode())
  238. || StringUtil.isNotBlank(i.getUniqueName()))
  239. .collect(Collectors.toList());
  240. if (ListUtil.isEmpty(diseaseConfigList)) {
  241. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "校验失败,导入数据不能为空");
  242. }
  243. List<String> emptyNumList = Lists.newLinkedList();
  244. for (int i = 0; i < diseaseConfigList.size(); i++) {
  245. if (StringUtil.isBlank(diseaseConfigList.get(i).getHisName())
  246. || StringUtil.isBlank(diseaseConfigList.get(i).getUniqueName())) {
  247. emptyNumList.add(String.valueOf(i + 2));
  248. }
  249. if (StringUtil.isNotBlank(diseaseConfigList.get(i).getHisName())) {
  250. diseaseConfigList.get(i).setHisName(diseaseConfigList.get(i).getHisName().trim());
  251. }
  252. if (StringUtil.isNotBlank(diseaseConfigList.get(i).getUniqueName())) {
  253. diseaseConfigList.get(i).setUniqueName(diseaseConfigList.get(i).getUniqueName().trim());
  254. }
  255. if (StringUtil.isNotBlank(diseaseConfigList.get(i).getIcdCode())) {
  256. diseaseConfigList.get(i).setIcdCode(diseaseConfigList.get(i).getIcdCode().trim());
  257. } else {
  258. diseaseConfigList.get(i).setIcdCode(null);
  259. }
  260. }
  261. if (ListUtil.isNotEmpty(emptyNumList)) {
  262. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "以下行数(不计入空行)存在不完整数据:"
  263. + emptyNumList.stream().collect(Collectors.joining("、"))
  264. + "。导入取消,请修改后再试。\n");
  265. }
  266. // 验证数据是否已存在,已存在的先删除
  267. // 没id的删除重新插入,有id的更新
  268. List<Long> deleteIds = Lists.newLinkedList();
  269. Map<String, Map<String, Long>> configMap
  270. = getConfigMap(Long.valueOf(hospitalId), null, null);
  271. diseaseConfigList.forEach(diseaseConfig -> {
  272. diseaseConfig.setHospitalId(Long.valueOf(hospitalId));
  273. diseaseConfig.setModifier(userId);
  274. diseaseConfig.setGmtModified(now);
  275. if (diseaseConfig.getId() == null) {
  276. if (configMap.containsKey(diseaseConfig.getHisName())) {
  277. deleteIds.add(configMap.get(diseaseConfig.getHisName()).get(diseaseConfig.getUniqueName()));
  278. }
  279. diseaseConfig.setCreator(userId);
  280. diseaseConfig.setGmtCreate(now);
  281. }
  282. if (diseaseConfig.getIsDeleted() == null) {
  283. diseaseConfig.setIsDeleted(IsDeleteEnum.N.getKey());
  284. }
  285. });
  286. //标准术语校验
  287. List<String> errorNumList = Lists.newLinkedList();
  288. List<String> uniqueNames = diseaseConfigList.stream()
  289. .map(i -> i.getUniqueName())
  290. .distinct()
  291. .collect(Collectors.toList());
  292. ConceptVO conceptVO = new ConceptVO();
  293. conceptVO.setNames(uniqueNames);
  294. conceptVO.setType(ConceptTypeEnum.Disease.getKey());
  295. RespDTO<List<String>> respDTO = cdssCoreClient.getConceptNames(conceptVO);
  296. RespDTOUtil.respNGDealCover(respDTO, "标准术语校验失败");
  297. List<String> names = respDTO.data;
  298. for (int i = 0; i < diseaseConfigList.size(); i++) {
  299. if (!names.contains(diseaseConfigList.get(i).getUniqueName())) {
  300. errorNumList.add(String.valueOf(i + 2));
  301. }
  302. }
  303. if (ListUtil.isNotEmpty(errorNumList)) {
  304. throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
  305. "以下行数(不计入空行)标准术语与数据库术语不匹配:"
  306. + errorNumList.stream().collect(Collectors.joining("、"))
  307. + "。导入取消,请修改后再试。");
  308. }
  309. //重复数据过滤
  310. diseaseConfigList = diseaseConfigList
  311. .stream()
  312. .distinct()
  313. .collect(Collectors.toList());
  314. //删除已存在映射关系
  315. IdListVO idListVO = new IdListVO();
  316. idListVO.setIds(deleteIds);
  317. deleteRecords(idListVO);
  318. diseaseConfigService.saveOrUpdateBatch(diseaseConfigList);
  319. return true;
  320. }
  321. /**
  322. * 获取映射关系-公表名
  323. *
  324. * @param hospitalId
  325. * @param hisNames
  326. * @param uniqueNames
  327. * @return
  328. */
  329. public Map<String, Map<String, Long>> getConfigMap(Long hospitalId, List<String> hisNames, List<String> uniqueNames) {
  330. Map<String, Map<String, Long>> retMap = new HashMap<>();
  331. QueryWrapper<DiseaseConfig> queryWrapper = new QueryWrapper<>();
  332. queryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
  333. .eq("hospital_id", hospitalId);
  334. if (ListUtil.isNotEmpty(hisNames)) {
  335. queryWrapper.in("his_name", hisNames);
  336. }
  337. if (ListUtil.isNotEmpty(uniqueNames)) {
  338. queryWrapper.in("unique_name", uniqueNames);
  339. }
  340. List<DiseaseConfig> records = diseaseConfigService.list(queryWrapper);
  341. if (ListUtil.isEmpty(records)) {
  342. return retMap;
  343. }
  344. Map<String, List<DiseaseConfig>> configMap = EntityUtil.makeEntityListMap(records, "hisName");
  345. for (Map.Entry<String, List<DiseaseConfig>> entry : configMap.entrySet()) {
  346. if (ListUtil.isNotEmpty(entry.getValue())) {
  347. retMap.put(entry.getKey(), EntityUtil.makeMapWithKeyValue(entry.getValue(), "uniqueName", "id"));
  348. }
  349. }
  350. return retMap;
  351. }
  352. /**
  353. * 数据导出
  354. *
  355. * @param response
  356. * @param hospitalIdVO
  357. */
  358. public void exportExcel(HttpServletResponse response, HospitalIdVO hospitalIdVO) {
  359. QueryWrapper<DiseaseConfig> queryWrapper = new QueryWrapper<>();
  360. queryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
  361. .eq("hospital_id", hospitalIdVO.getHospitalId())
  362. .orderByDesc("gmt_modified");
  363. List<DiseaseConfig> records = diseaseConfigService.list(queryWrapper);
  364. String fileName = "疾病映射.xls";
  365. ExcelUtils.exportExcel(records, null, "sheet1", DiseaseConfig.class, fileName, response, 12.8f);
  366. }
  367. /**
  368. * 各医院映射关系数列表
  369. *
  370. * @param hosRelationNumPageVO
  371. * @return
  372. */
  373. public IPage<HosRelationNumDTO> getRelationNumPage(HosRelationNumPageVO hosRelationNumPageVO) {
  374. return diseaseConfigService.getRelationNumPage(hosRelationNumPageVO);
  375. }
  376. /**
  377. * 数据导入模板导出
  378. *
  379. * @param response
  380. */
  381. public void exportExcelModule(HttpServletResponse response) {
  382. String fileName = "疾病映射模板.xls";
  383. ExcelUtils.exportExcel(new ArrayList<>(), null, "sheet1", DiseaseConfig.class, fileName, response, 12.8f);
  384. }
  385. /**
  386. * 导入数据预匹配
  387. * @param file
  388. * @param response
  389. */
  390. public void precDataMatch(MultipartFile file,HttpServletResponse response) {
  391. List<DiseaseConfig> retList = Lists.newLinkedList();
  392. List<DiseaseConfig> originList = ExcelUtils.importExcel(file, 0, 1, DiseaseConfig.class);
  393. Map<String, List<DiseaseConfig>> allMap = getAll();
  394. if (ListUtil.isNotEmpty(originList)) {
  395. for (DiseaseConfig originItem : originList) {
  396. if (allMap.containsKey(originItem.getHisName())) {
  397. retList.addAll(allMap.get(originItem.getHisName()));
  398. } else {
  399. retList.add(originItem);
  400. }
  401. }
  402. }
  403. String fileName = "诊断关联数据(预匹配).xls";
  404. ExcelUtils.exportExcel(retList, null, "sheet1", DiseaseConfig.class, fileName, response, 12.8f);
  405. }
  406. /**
  407. * 获取所有医院映射数据
  408. * @return
  409. */
  410. public Map<String,List<DiseaseConfig>> getAll() {
  411. Map<String, List<DiseaseConfig>> retMap = new HashMap<>();
  412. List<DiseaseConfig> records = diseaseConfigService.list();
  413. if (ListUtil.isEmpty(records)) {
  414. return retMap;
  415. }
  416. records.forEach(record -> {
  417. record.setHospitalId(null);
  418. record.setId(null);
  419. record.setIcdCode(StringUtils.isBlank(record.getIcdCode()) ? null : record.getIcdCode());
  420. });
  421. records = records
  422. .stream()
  423. .filter(record -> record.getIsDeleted().equals(IsDeleteEnum.N.getKey()))
  424. .distinct()
  425. .collect(Collectors.toList());
  426. if (ListUtil.isEmpty(records)) {
  427. return retMap;
  428. }
  429. retMap = EntityUtil.makeEntityListMap(records, "hisName");
  430. return retMap;
  431. }
  432. }