DiagnoseFacade.java 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  1. package com.diagbot.facade;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  4. import com.baomidou.mybatisplus.core.metadata.IPage;
  5. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6. import com.diagbot.client.NeoServiceClient;
  7. import com.diagbot.dto.ConceptBaseDTO;
  8. import com.diagbot.dto.DiagnoseDetailSaveDTO;
  9. import com.diagbot.dto.DiagnosePageDTO;
  10. import com.diagbot.dto.RespDTO;
  11. import com.diagbot.dto.VerifyDataDTO;
  12. import com.diagbot.entity.CommonParam;
  13. import com.diagbot.entity.Diagnose;
  14. import com.diagbot.entity.DiagnoseDetail;
  15. import com.diagbot.entity.DiagnoseDetailSave;
  16. import com.diagbot.entity.DiagnoseQuestion;
  17. import com.diagbot.entity.LibraryInfo;
  18. import com.diagbot.entity.wrapper.DiagnoseWrapper;
  19. import com.diagbot.enums.DiagnoseFeatureTypeEnum;
  20. import com.diagbot.enums.DiagnoseFieldEnum;
  21. import com.diagbot.enums.DiagnoseTypeEnum;
  22. import com.diagbot.enums.HasQuestionEnum;
  23. import com.diagbot.enums.InsertOrUpdateEnum;
  24. import com.diagbot.enums.IsDeleteEnum;
  25. import com.diagbot.enums.LexiconTypeEnum;
  26. import com.diagbot.exception.CommonErrorCode;
  27. import com.diagbot.exception.CommonException;
  28. import com.diagbot.service.DiagnoseDetailService;
  29. import com.diagbot.service.DiagnoseQuestionService;
  30. import com.diagbot.service.DiagnoseService;
  31. import com.diagbot.service.impl.DiagnoseServiceImpl;
  32. import com.diagbot.util.BeanUtil;
  33. import com.diagbot.util.DateUtil;
  34. import com.diagbot.util.DiagnoseTypeConvertUtil;
  35. import com.diagbot.util.EntityUtil;
  36. import com.diagbot.util.ListUtil;
  37. import com.diagbot.util.RespDTOUtil;
  38. import com.diagbot.util.StringUtil;
  39. import com.diagbot.util.VerifyUtil;
  40. import com.diagbot.vo.DeleteDiagnoseVO;
  41. import com.diagbot.vo.DiagnosePageVO;
  42. import com.diagbot.vo.DiseaseIndexVO;
  43. import com.diagbot.vo.GetDiagnoseDetailVO;
  44. import com.diagbot.vo.NeoParamVO;
  45. import com.diagbot.vo.UpdateDiagnoseVO;
  46. import org.springframework.beans.factory.annotation.Autowired;
  47. import org.springframework.beans.factory.annotation.Qualifier;
  48. import org.springframework.stereotype.Component;
  49. import java.util.ArrayList;
  50. import java.util.Arrays;
  51. import java.util.Date;
  52. import java.util.List;
  53. import java.util.Map;
  54. import java.util.Set;
  55. import java.util.stream.Collectors;
  56. @Component
  57. public class DiagnoseFacade extends DiagnoseServiceImpl {
  58. public static boolean verifyFlag = true; // true:执行完毕,false:正在执行
  59. @Autowired
  60. ConceptFacade conceptFacade;
  61. @Autowired
  62. @Qualifier("diagnoseServiceImpl")
  63. DiagnoseService diagnoseService;
  64. @Autowired
  65. @Qualifier("diagnoseDetailServiceImpl")
  66. DiagnoseDetailService diagnoseDetailService;
  67. @Autowired
  68. @Qualifier("diagnoseQuestionServiceImpl")
  69. DiagnoseQuestionService diagnoseQuestionService;
  70. @Autowired
  71. DiagnoseDetailFacade diagnoseDetailFacade;
  72. @Autowired
  73. LibraryInfoFacade libraryInfoFacade;
  74. @Autowired
  75. NeoServiceClient neoServiceClient;
  76. /**
  77. * 诊断依据分页
  78. *
  79. * @param diagnosePageVO
  80. * @return
  81. */
  82. public IPage<DiagnosePageDTO> getListFac(DiagnosePageVO diagnosePageVO) {
  83. IPage<DiagnosePageDTO> res = this.getList(diagnosePageVO);
  84. if (res.getTotal() <= 0) {
  85. return res;
  86. }
  87. return res;
  88. }
  89. /**
  90. * 诊断依据删除
  91. *
  92. * @param deleteDiagnoseVO
  93. * @return
  94. */
  95. public void delete(DeleteDiagnoseVO deleteDiagnoseVO) {
  96. if (!(IsDeleteEnum.N.getKey().equals(deleteDiagnoseVO.getIsDeleted())
  97. || IsDeleteEnum.Y.getKey().equals(deleteDiagnoseVO.getIsDeleted()))) {
  98. throw new CommonException(CommonErrorCode.STATUS_IS_ERROR, "状态值错误【Y】或【N】");
  99. }
  100. // 删除图谱数据
  101. NeoParamVO neoParamVO = new NeoParamVO();
  102. neoParamVO.setId(deleteDiagnoseVO.getId());
  103. neoServiceClient.deleteNeo(neoParamVO);
  104. RespDTO<Boolean> respDTO = neoServiceClient.deleteNeo(neoParamVO);
  105. RespDTOUtil.respNGDeal(respDTO, "删除图谱数据失败【远程调用】");
  106. Date now = DateUtil.now();
  107. this.update(new Diagnose(), new UpdateWrapper<Diagnose>()
  108. .eq("id", deleteDiagnoseVO.getId())
  109. .set("gmt_modified", now)
  110. .set("modifier", deleteDiagnoseVO.getModifier())
  111. .set("is_deleted", deleteDiagnoseVO.getIsDeleted())
  112. .set("neo_update", now)
  113. .set("remark", deleteDiagnoseVO.getRemark()));
  114. // 删除明细(逻辑删除)
  115. diagnoseDetailFacade.update(new DiagnoseDetail(), new UpdateWrapper<DiagnoseDetail>()
  116. .eq("diagnose_id", deleteDiagnoseVO.getId())
  117. .set("gmt_modified", now)
  118. .set("modifier", deleteDiagnoseVO.getModifier())
  119. .set("is_deleted", deleteDiagnoseVO.getIsDeleted()));
  120. // 删除问题词列表(物理删除)
  121. diagnoseQuestionService.remove(new QueryWrapper<DiagnoseQuestion>()
  122. .eq("diagnose_id", deleteDiagnoseVO.getId()));
  123. }
  124. /**
  125. * 诊断检索,过滤已添加的诊断
  126. *
  127. * @param diseaseIndexVO
  128. * @return
  129. */
  130. public List<ConceptBaseDTO> indexFac(DiseaseIndexVO diseaseIndexVO) {
  131. // 设置量表类型
  132. diseaseIndexVO.setLibType(LexiconTypeEnum.DIAGNOSIS.getKey());
  133. return this.index(diseaseIndexVO);
  134. }
  135. public String addTest() {
  136. StringBuffer sb = new StringBuffer();
  137. List<Diagnose> diagnoseList = this.list(new QueryWrapper<Diagnose>()
  138. .eq("is_deleted", IsDeleteEnum.N.getKey())
  139. );
  140. List<String> disName = diagnoseList.stream().map(row -> row.getDisName()).collect(Collectors.toList());
  141. List<LibraryInfo> diagnoses = libraryInfoFacade.page(
  142. new Page().setSize(100L), new QueryWrapper<LibraryInfo>()
  143. .eq("type_id", 18)
  144. .eq("is_deleted", IsDeleteEnum.N.getKey())
  145. .eq("is_concept", 1)
  146. .notIn("name", disName)
  147. ).getRecords();
  148. List<Diagnose> diagnoseData = new ArrayList<>();
  149. for (LibraryInfo diagnose : diagnoses) {
  150. Diagnose bean = new Diagnose();
  151. bean.setDisName(diagnose.getName());
  152. bean.setCreator("测试9");
  153. bean.setModifier("测试9");
  154. diagnoseData.add(bean);
  155. }
  156. Long time1 = System.currentTimeMillis();
  157. diagnoseService.saveBatch(diagnoseData);
  158. Long time2 = System.currentTimeMillis();
  159. sb.append("添加主表测试数据:" + (time2-time1)/1000.00 + "秒");
  160. List<DiagnoseDetail> diagnoseDetailList = new ArrayList<>();
  161. List<DiagnoseDetail> diagnoseDetailData = diagnoseDetailFacade.list(new QueryWrapper<DiagnoseDetail>().eq("diagnose_id", 7L));
  162. for (Diagnose diagnose : diagnoseData) {
  163. for (DiagnoseDetail detail : diagnoseDetailData) {
  164. DiagnoseDetail newDiagDetail = new DiagnoseDetail();
  165. BeanUtil.copyProperties(detail, newDiagDetail);
  166. newDiagDetail.setId(null);
  167. newDiagDetail.setDiagnoseId(diagnose.getId());
  168. newDiagDetail.setDisName(diagnose.getDisName());
  169. newDiagDetail.setIsDeleted(IsDeleteEnum.N.getKey());
  170. diagnoseDetailList.add(newDiagDetail);
  171. }
  172. }
  173. diagnoseDetailService.saveBatch(diagnoseDetailList);
  174. return sb.toString();
  175. }
  176. /**
  177. * 诊断依据获取详情
  178. *
  179. * @param getDiagnoseDetailVO
  180. * @return
  181. */
  182. public DiagnoseDetailSaveDTO getDetail(GetDiagnoseDetailVO getDiagnoseDetailVO) {
  183. DiagnoseDetailSaveDTO res = new DiagnoseDetailSaveDTO();
  184. List<DiagnoseDetail> detailList = diagnoseDetailFacade.list(new QueryWrapper<DiagnoseDetail>()
  185. .eq("diagnose_id", getDiagnoseDetailVO.getId())
  186. .eq("is_deleted", IsDeleteEnum.N.getKey())
  187. .orderByAsc("order_no")
  188. );
  189. for (DiagnoseDetail detail : detailList) {
  190. if (DiagnoseTypeEnum.Confirmed.getKey() == detail.getType() ||
  191. DiagnoseTypeEnum.Examination.getKey() == detail.getType() ||
  192. DiagnoseTypeEnum.Vigilant.getKey() == detail.getType()
  193. ) {
  194. res.getDisformula().add(detail);
  195. } else {
  196. res.getDisFeature().add(detail);
  197. }
  198. }
  199. return res;
  200. }
  201. /**
  202. * 诊断依据校验数据,新增或更新主表信息,覆盖明细表和问题词表
  203. *
  204. * @param diagnoseWrapper
  205. */
  206. public VerifyDataDTO verifyData(DiagnoseWrapper diagnoseWrapper) {
  207. VerifyDataDTO verifyDataDTO = new VerifyDataDTO();
  208. CommonParam param = initCommonParam();
  209. param.setPerson(diagnoseWrapper.getModifier());
  210. // 更新主表业务(同时删除明细表和问题词表)
  211. Long id = insertOrUpdateDiagnose(diagnoseWrapper, param);
  212. diagnoseWrapper.setId(id);
  213. verifyDataDTO.setId(id); //设置主键返回
  214. // 加载词库数据
  215. // List<LibraryForDiagnoseDTO> libraryForDiagnoseDTOS = libraryInfoFacade.getLibraryForDiagnose();
  216. // Set<String> set = libraryForDiagnoseDTOS.stream().map(row -> row.getName()+ "_"+row.getTypeId()).collect(Collectors.toSet());
  217. Set<String> set = libraryInfoFacade.getLibraryForDiagnose2();
  218. // 明细数据
  219. List<DiagnoseDetail> diagnoseDetailList = new ArrayList<>();
  220. List<DiagnoseDetail> disFeature = new ArrayList<>(); // 诊断特征
  221. List<DiagnoseDetail> disformula = new ArrayList<>(); // 诊断公式
  222. // 问题词数据
  223. List<DiagnoseQuestion> diagnoseQuestionList = new ArrayList<>();
  224. // 处理诊断特征业务(校验编码|标准词|关联词|结果)
  225. doDisFuture(diagnoseWrapper, param, set, disFeature, diagnoseQuestionList);
  226. // 处理诊断公式业务(校验公式)
  227. doDisFormula(diagnoseWrapper, param, disformula, diagnoseQuestionList);
  228. diagnoseDetailList.addAll(disFeature);
  229. diagnoseDetailList.addAll(disformula);
  230. // 保存明细
  231. diagnoseDetailService.saveBatch(diagnoseDetailList);
  232. // 保存问题词
  233. if (ListUtil.isNotEmpty(diagnoseQuestionList)) {
  234. // 新增问题词数据
  235. diagnoseQuestionService.saveBatch(diagnoseQuestionList);
  236. }
  237. // 更新主表状态
  238. this.update(new UpdateWrapper<Diagnose>()
  239. .set("has_question", param.getFlag())
  240. .eq("id", diagnoseWrapper.getId())
  241. );
  242. verifyDataDTO.setHasQuestion(param.getFlag());
  243. verifyDataDTO.setDisFeature(disFeature);
  244. verifyDataDTO.setDisformula(disformula);
  245. return verifyDataDTO;
  246. }
  247. /**
  248. * 诊断依据校验全部数据(不用修改操作人和时间)
  249. *
  250. */
  251. public String verifyAllData() {
  252. StringBuffer res = new StringBuffer();
  253. Long time1 = System.currentTimeMillis();
  254. if (!verifyFlag) {
  255. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "其他人正在执行此操作,请稍后再试!");
  256. }
  257. try {
  258. verifyFlag = false;
  259. CommonParam param = initCommonParam();
  260. // 获取所有主表信息
  261. List<Diagnose> diagnoseListWithDB = this.list(new QueryWrapper<Diagnose>()
  262. .eq("is_deleted", IsDeleteEnum.N.getKey())
  263. );
  264. // 获取所有明细信息
  265. List<DiagnoseDetail> diagnoseDetailWithDB = diagnoseDetailFacade.list(new QueryWrapper<DiagnoseDetail>()
  266. .eq("is_deleted", IsDeleteEnum.N.getKey())
  267. );
  268. Map<String, List<DiagnoseDetail>> map = EntityUtil.makeEntityListMap(diagnoseDetailWithDB, "disName");
  269. Long time2 = System.currentTimeMillis();
  270. res.append("加载全部主表和明细表:" + (time2-time1)/1000.0).append("秒,");
  271. // 明细数据
  272. List<DiagnoseDetail> diagnoseDetailList = new ArrayList<>();
  273. // 问题词数据
  274. List<DiagnoseQuestion> diagnoseQuestionList = new ArrayList<>();
  275. // 加载词库数据
  276. // List<LibraryForDiagnoseDTO> libraryForDiagnoseDTOS = libraryInfoFacade.getLibraryForDiagnose();
  277. // Set<String> set = libraryForDiagnoseDTOS.stream().map(row -> row.getName()+ "_"+row.getTypeId()).collect(Collectors.toSet());
  278. Set<String> set = libraryInfoFacade.getLibraryForDiagnose2();
  279. Long time3 = System.currentTimeMillis();
  280. res.append("加载词库:" + (time3-time2)/1000.0).append("秒,");
  281. Boolean flag = true;
  282. List<Integer> typeList = new ArrayList<>();
  283. // 校验明细数据
  284. for (String key : map.keySet()) {
  285. List<DiagnoseDetail> detail = map.get(key);
  286. int j = 0;
  287. if (ListUtil.isNotEmpty(detail)) {
  288. // 判断诊断名称是否在词库中
  289. flag = verifyExist(set, detail.get(0).getDisName(), Arrays.asList(LexiconTypeEnum.DIAGNOSIS.getKey()));
  290. if (!flag) {
  291. DiagnoseQuestion diagnoseQuestion1 = createDiagnoseQuestion(detail.get(0).getId(), detail.get(0).getDisName(), DiagnoseFeatureTypeEnum.Dis.getKey(),
  292. detail.get(0).getDisName(), DiagnoseFieldEnum.disName.getKey(), initCommonParam(), ++j);
  293. diagnoseQuestionList.add(diagnoseQuestion1);
  294. }
  295. for (DiagnoseDetail bean : detail) {
  296. boolean updateFlag = false;
  297. if (DiagnoseTypeEnum.Confirmed.getKey() == bean.getType() || (DiagnoseTypeEnum.Examination.getKey() == bean.getType() || (DiagnoseTypeEnum.Vigilant.getKey() == bean.getType()))) {
  298. // 不需要校验公式
  299. } else {
  300. // 校验编码
  301. // if (StringUtil.isNotEmpty(bean.getCode())) {
  302. // flag = VerifyUtil.verifyCode(String.valueOf(bean.getType()), bean.getCode());
  303. // if (!flag) {
  304. // bean.setVerifyCode(bean.getCode());
  305. // DiagnoseQuestion diagnoseQuestion = createDiagnoseQuestion(bean.getDiagnoseId(), bean.getDisName(), bean.getType(),
  306. // bean.getCode(), DiagnoseFieldEnum.code.getKey(), param, ++j);
  307. // diagnoseQuestionList.add(diagnoseQuestion);
  308. // } else {
  309. // bean.setVerifyCode(""); // 将原值清空
  310. // }
  311. // }
  312. // 校验标准词
  313. if (StringUtil.isNotEmpty(bean.getStandard())) {
  314. String oldVerifyStandard = bean.getVerifyStandard();
  315. typeList = DiagnoseTypeConvertUtil.diagnoseType2LibType(bean.getType(), DiagnoseFieldEnum.standard.getKey());
  316. flag = verifyExist(set, bean.getStandard(), typeList);
  317. if (!flag) {
  318. bean.setVerifyStandard(bean.getStandard());
  319. DiagnoseQuestion diagnoseQuestion = createDiagnoseQuestion(bean.getDiagnoseId(), bean.getDisName(), bean.getType(),
  320. bean.getStandard(), DiagnoseFieldEnum.standard.getKey(), param, ++j);
  321. diagnoseQuestionList.add(diagnoseQuestion);
  322. } else {
  323. bean.setVerifyStandard(""); // 将原值清空
  324. }
  325. if (!oldVerifyStandard.equals(bean.getVerifyStandard())) {
  326. updateFlag = true;
  327. }
  328. }
  329. // 校验关联词
  330. if (StringUtil.isNotEmpty(bean.getRelation())) {
  331. String oldVerifyRelation = bean.getVerifyRelation();
  332. String[] arr = bean.getRelation().split("、");
  333. StringBuffer sb = new StringBuffer();
  334. for (String s : arr) {
  335. typeList = DiagnoseTypeConvertUtil.diagnoseType2LibType(bean.getType(), DiagnoseFieldEnum.relation.getKey());
  336. flag = verifyExist(set, s.trim(), typeList);
  337. if (!flag) {
  338. sb.append(s).append("、");
  339. bean.setVerifyRelation(bean.getRelation());
  340. DiagnoseQuestion diagnoseQuestion = createDiagnoseQuestion(bean.getDiagnoseId(), bean.getDisName(), bean.getType(),
  341. s.trim(), DiagnoseFieldEnum.relation.getKey(), param, ++j);
  342. diagnoseQuestionList.add(diagnoseQuestion);
  343. }
  344. }
  345. String errWord = sb.toString();
  346. if (StringUtil.isNotEmpty(errWord)) {
  347. bean.setVerifyRelation(errWord.substring(0, errWord.length() - 1));
  348. } else {
  349. bean.setVerifyRelation(""); // 将原值清空
  350. }
  351. if (!oldVerifyRelation.equals(bean.getVerifyRelation())) {
  352. updateFlag = true;
  353. }
  354. }
  355. // 校验结果
  356. if (StringUtil.isNotEmpty(bean.getResult())) {
  357. String oldVerifyResult = bean.getVerifyResult();
  358. typeList = DiagnoseTypeConvertUtil.diagnoseType2LibType(bean.getType(), DiagnoseFieldEnum.result.getKey());
  359. flag = verifyExist(set, bean.getResult(), typeList);
  360. if (!flag) {
  361. bean.setVerifyResult(bean.getResult());
  362. DiagnoseQuestion diagnoseQuestion = createDiagnoseQuestion(bean.getDiagnoseId(), bean.getDisName(), bean.getType(),
  363. bean.getStandard(), DiagnoseFieldEnum.standard.getKey(), param, ++j);
  364. diagnoseQuestionList.add(diagnoseQuestion);
  365. } else {
  366. bean.setVerifyResult(""); // 将原值清空
  367. }
  368. if (!oldVerifyResult.equals(bean.getVerifyResult())) {
  369. updateFlag = true;
  370. }
  371. }
  372. }
  373. if (updateFlag) {
  374. diagnoseDetailList.add(bean);
  375. }
  376. }
  377. }
  378. }
  379. Long time4 = System.currentTimeMillis();
  380. res.append("校验问题词:" + (time4-time3)/1000.0).append("秒,");
  381. // 更新明细
  382. if (ListUtil.isNotEmpty(diagnoseDetailList)) {
  383. // diagnoseDetailService.updateBatchById(diagnoseDetailList);
  384. diagnoseDetailService.updateBatch(diagnoseDetailList);
  385. }
  386. Long time5 = System.currentTimeMillis();
  387. res.append("更新明细"+diagnoseDetailList.size()+"条:" + (time5-time4)/1000.0).append("秒,");
  388. // 删除全部的问题词数据
  389. diagnoseQuestionService.remove(new QueryWrapper<DiagnoseQuestion>());
  390. // 新增问题词
  391. if (ListUtil.isNotEmpty(diagnoseQuestionList)) {
  392. // 新增问题词数据
  393. diagnoseQuestionService.saveBatch(diagnoseQuestionList);
  394. }
  395. Long time6 = System.currentTimeMillis();
  396. res.append("新增问题词:" + (time6-time5)/1000.0).append("秒,");
  397. List<String> disNameList = diagnoseQuestionList.stream().map(row -> row.getDisName()).distinct().collect(Collectors.toList());
  398. // 修改问题词表的状态
  399. for (Diagnose diagnose : diagnoseListWithDB) {
  400. if (disNameList.contains(diagnose.getDisName())) {
  401. diagnose.setHasQuestion(String.valueOf(HasQuestionEnum.HAS_QUESTION.getKey()));
  402. } else {
  403. diagnose.setHasQuestion(String.valueOf(HasQuestionEnum.NO_QUESTION.getKey()));
  404. }
  405. }
  406. // 更新主表信息
  407. diagnoseService.updateBatchById(diagnoseListWithDB);
  408. Long time7 = System.currentTimeMillis();
  409. res.append("更新主表状态:" + (time7-time6)/1000.0).append("秒,");
  410. res.append("总计花费时间:" + (time7-time1)/1000.0).append("秒。");
  411. } catch (Exception e) {
  412. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, e.getMessage());
  413. } finally {
  414. verifyFlag = true;
  415. }
  416. return res.toString();
  417. }
  418. /**
  419. * 处理诊断特征业务(校验诊断名称|编码|标准词|关联词|结果)
  420. *
  421. * @param diagnoseWrapper
  422. * @param param
  423. * @return
  424. */
  425. public void doDisFuture(DiagnoseWrapper diagnoseWrapper, CommonParam param, Set<String> set, List<DiagnoseDetail> diagnoseDetailList, List<DiagnoseQuestion> diagnoseQuestionList) {
  426. int i = param.getI();
  427. int j = param.getJ();
  428. // 判断诊断名称是否在词库中
  429. boolean flag = true;
  430. flag = verifyExist(set, diagnoseWrapper.getDisName(), Arrays.asList(LexiconTypeEnum.DIAGNOSIS.getKey()));
  431. if (!flag) {
  432. DiagnoseQuestion diagnoseQuestion1 = createDiagnoseQuestion(diagnoseWrapper.getId(), diagnoseWrapper.getDisName(), DiagnoseFeatureTypeEnum.Dis.getKey(),
  433. diagnoseWrapper.getDisName(), DiagnoseFieldEnum.disName.getKey(), initCommonParam(), ++j);
  434. diagnoseQuestionList.add(diagnoseQuestion1);
  435. }
  436. // 遍历诊断特征
  437. for (DiagnoseDetailSave bean : diagnoseWrapper.getDisFeature()) {
  438. DiagnoseDetail diagnoseDetail = new DiagnoseDetail();
  439. BeanUtil.copyProperties(bean, diagnoseDetail);
  440. diagnoseDetail.setDiagnoseId(diagnoseWrapper.getId());
  441. diagnoseDetail.setCreator(param.getPerson());
  442. diagnoseDetail.setGmtCreate(param.getNow());
  443. diagnoseDetail.setModifier(param.getPerson());
  444. diagnoseDetail.setGmtModified(param.getNow());
  445. diagnoseDetail.setDisName(diagnoseWrapper.getDisName());
  446. diagnoseDetail.setOrderNo(++i);
  447. List<Integer> typeList = new ArrayList<>();
  448. // 校验编码
  449. if (StringUtil.isNotEmpty(bean.getCode())) {
  450. flag = VerifyUtil.verifyCode(String.valueOf(bean.getType()), bean.getCode());
  451. if (!flag) {
  452. diagnoseDetail.setVerifyCode(bean.getCode());
  453. DiagnoseQuestion diagnoseQuestion = createDiagnoseQuestion(diagnoseWrapper.getId(), diagnoseWrapper.getDisName(), bean.getType(),
  454. bean.getCode(), DiagnoseFieldEnum.code.getKey(), param, ++j);
  455. diagnoseQuestionList.add(diagnoseQuestion);
  456. }
  457. }
  458. // 校验标准词
  459. if (StringUtil.isNotEmpty(bean.getStandard())) {
  460. typeList = DiagnoseTypeConvertUtil.diagnoseType2LibType(bean.getType(), DiagnoseFieldEnum.standard.getKey());
  461. flag = verifyExist(set, bean.getStandard(), typeList);
  462. if (!flag) {
  463. diagnoseDetail.setVerifyStandard(bean.getStandard());
  464. DiagnoseQuestion diagnoseQuestion = createDiagnoseQuestion(diagnoseWrapper.getId(), diagnoseWrapper.getDisName(), bean.getType(),
  465. bean.getStandard(), DiagnoseFieldEnum.standard.getKey(), param, ++j);
  466. diagnoseQuestionList.add(diagnoseQuestion);
  467. }
  468. }
  469. // 校验关联词
  470. if (StringUtil.isNotEmpty(bean.getRelation())) {
  471. String[] arr = bean.getRelation().split("、");
  472. StringBuffer sb = new StringBuffer();
  473. for (String s : arr) {
  474. typeList = DiagnoseTypeConvertUtil.diagnoseType2LibType(bean.getType(), DiagnoseFieldEnum.relation.getKey());
  475. flag = verifyExist(set, s.trim(), typeList);
  476. if (!flag) {
  477. sb.append(s).append("、");
  478. DiagnoseQuestion diagnoseQuestion = createDiagnoseQuestion(diagnoseWrapper.getId(), diagnoseWrapper.getDisName(), bean.getType(),
  479. s.trim(), DiagnoseFieldEnum.relation.getKey(), param, ++j);
  480. diagnoseQuestionList.add(diagnoseQuestion);
  481. }
  482. }
  483. String errWord = sb.toString();
  484. if (StringUtil.isNotEmpty(errWord)) {
  485. diagnoseDetail.setVerifyRelation(errWord.substring(0, errWord.length()-1));
  486. }
  487. }
  488. // 校验结果
  489. if (StringUtil.isNotEmpty(bean.getResult())) {
  490. typeList = DiagnoseTypeConvertUtil.diagnoseType2LibType(bean.getType(), DiagnoseFieldEnum.result.getKey());
  491. flag = verifyExist(set, bean.getResult(), typeList);
  492. if (!flag) {
  493. diagnoseDetail.setVerifyResult(bean.getResult());
  494. DiagnoseQuestion diagnoseQuestion = createDiagnoseQuestion(diagnoseWrapper.getId(), diagnoseWrapper.getDisName(), bean.getType(),
  495. bean.getStandard(), DiagnoseFieldEnum.standard.getKey(), param, ++j);
  496. diagnoseQuestionList.add(diagnoseQuestion);
  497. }
  498. }
  499. diagnoseDetailList.add(diagnoseDetail);
  500. }
  501. param.setI(i);
  502. param.setJ(j);
  503. if (ListUtil.isNotEmpty(diagnoseQuestionList)) {
  504. param.setFlag(HasQuestionEnum.HAS_QUESTION.getKey());
  505. }
  506. }
  507. /**
  508. * 处理诊断公式业务(校验公式)
  509. *
  510. * @param diagnoseWrapper
  511. * @param param
  512. * @return
  513. */
  514. public void doDisFormula(DiagnoseWrapper diagnoseWrapper, CommonParam param, List<DiagnoseDetail> diagnoseDetailList, List<DiagnoseQuestion> diagnoseQuestionList) {
  515. List<String> codeList = diagnoseWrapper.getDisFeature().stream().map(row -> row.getCode()).distinct().collect(Collectors.toList());
  516. int i = param.getI();
  517. int j = param.getJ();
  518. // 遍历诊断公式
  519. for (DiagnoseDetailSave bean : diagnoseWrapper.getDisformula()) {
  520. DiagnoseDetail diagnoseDetail = new DiagnoseDetail();
  521. BeanUtil.copyProperties(bean, diagnoseDetail);
  522. diagnoseDetail.setDiagnoseId(diagnoseWrapper.getId());
  523. diagnoseDetail.setCreator(param.getPerson());
  524. diagnoseDetail.setGmtCreate(param.getNow());
  525. diagnoseDetail.setModifier(param.getPerson());
  526. diagnoseDetail.setGmtModified(param.getNow());
  527. diagnoseDetail.setDisName(diagnoseWrapper.getDisName());
  528. diagnoseDetail.setOrderNo(++i);
  529. // 校验公式
  530. String errMsg = VerifyUtil.verifyFormula(codeList, bean.getFormula());
  531. if (StringUtil.isNotEmpty(errMsg)) {
  532. diagnoseDetail.setVerifyFormula(errMsg);
  533. param.setFlag(HasQuestionEnum.HAS_QUESTION.getKey());
  534. } else {
  535. diagnoseDetail.setVerifyFormula("");
  536. }
  537. diagnoseDetailList.add(diagnoseDetail);
  538. }
  539. param.setI(i);
  540. param.setJ(j);
  541. }
  542. /**
  543. * 更新主表业务(同时删除明细表和问题词表)
  544. *
  545. * @param diagnoseWrapper
  546. * @param param
  547. * @return
  548. */
  549. public Long insertOrUpdateDiagnose(DiagnoseWrapper diagnoseWrapper, CommonParam param) {
  550. // 先校验诊断名称是否存在,多人同时点击
  551. QueryWrapper<Diagnose> queryWrapper = new QueryWrapper<>();
  552. queryWrapper.eq("dis_name", diagnoseWrapper.getDisName())
  553. .eq("is_deleted", IsDeleteEnum.N.getKey());
  554. if (diagnoseWrapper.getId() != null) {
  555. queryWrapper.ne("id", diagnoseWrapper.getId());
  556. }
  557. // Diagnose bean = this.getOne(queryWrapper);
  558. if (this.count(queryWrapper) > 0) {
  559. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR,"当前疾病的诊断依据已存在!");
  560. }
  561. Diagnose diagnose = new Diagnose();
  562. BeanUtil.copyProperties(diagnoseWrapper, diagnose);
  563. if (diagnoseWrapper.getId() == null) { //新增
  564. diagnose.setCreator(param.getPerson());
  565. diagnose.setGmtCreate(param.getNow());
  566. } else { // 修改
  567. // 明细删除
  568. diagnoseDetailService.remove(new QueryWrapper<DiagnoseDetail>()
  569. .eq("diagnose_id", diagnoseWrapper.getId())
  570. );
  571. // 删除问题词
  572. diagnoseQuestionService.remove(new QueryWrapper<DiagnoseQuestion>()
  573. .eq("diagnose_id", diagnoseWrapper.getId())
  574. );
  575. param.setInsertOrUpdate(InsertOrUpdateEnum.Update.getKey());
  576. }
  577. diagnose.setGmtModified(param.getNow());
  578. this.saveOrUpdate(diagnose);
  579. return diagnose.getId();
  580. }
  581. /**
  582. * 更新图谱(先校验,再更新)
  583. *
  584. * @param updateDiagnoseVO
  585. * @return
  586. */
  587. public void updateNeo(UpdateDiagnoseVO updateDiagnoseVO) {
  588. // VerifyDataDTO verifyDataDTO = verifyData(diagnoseWrapper);
  589. // if (HasQuestionEnum.HAS_QUESTION.getKey() == verifyDataDTO.getHasQuestion()) {
  590. // throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "有问题词存在或公式错误,不能更新图谱");
  591. // }
  592. // 更新图谱对接接口
  593. NeoParamVO neoParamVO = new NeoParamVO();
  594. neoParamVO.setId(updateDiagnoseVO.getId());
  595. RespDTO<Boolean> respDTO = neoServiceClient.updateNeo(neoParamVO);
  596. RespDTOUtil.respNGDeal(respDTO, "更新图谱数据失败【远程调用】");
  597. // 更新时间
  598. this.update(new UpdateWrapper<Diagnose>()
  599. .eq("id", updateDiagnoseVO.getId())
  600. .set("modifier", updateDiagnoseVO.getModifier())
  601. .set("neo_update", new Date())
  602. );
  603. }
  604. /**
  605. * 初始化参数
  606. *
  607. * @return
  608. */
  609. public CommonParam initCommonParam() {
  610. CommonParam param = new CommonParam();
  611. param.setNow(DateUtil.now());
  612. param.setInsertOrUpdate(InsertOrUpdateEnum.Insert.getKey());
  613. return param;
  614. }
  615. /**
  616. * 校验词库中是否存在
  617. *
  618. * @param set 词库数据
  619. * @param name 界面输入
  620. * @param type 转换类型
  621. * @return 校验结果
  622. */
  623. public boolean verifyExist(Set<String> set, String name, List<Integer> type) {
  624. for(Integer integer : type) {
  625. if (set.contains(name + "_" + integer)) {
  626. return true;
  627. }
  628. }
  629. return false;
  630. }
  631. /**
  632. * 生成问题词
  633. *
  634. * @param disName
  635. * @param type
  636. * @param questionName
  637. * @param commonParam
  638. * @return
  639. */
  640. public DiagnoseQuestion createDiagnoseQuestion(Long diagnoseId, String disName, Integer type, String questionName, Integer questionType, CommonParam commonParam, Integer orderNo) {
  641. DiagnoseQuestion dq = new DiagnoseQuestion();
  642. dq.setCreator(commonParam.getPerson());
  643. dq.setGmtCreate(commonParam.getNow());
  644. dq.setModifier(commonParam.getPerson());
  645. dq.setGmtModified(commonParam.getNow());
  646. dq.setDisName(disName);
  647. dq.setDiagnoseId(diagnoseId);
  648. dq.setType(type);
  649. dq.setQuestionName(questionName);
  650. dq.setQuestionType(questionType);
  651. dq.setOrderNo(orderNo);
  652. return dq;
  653. }
  654. }