PushItemAggregate.java 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  1. package com.diagbot.aggregate;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.diagbot.biz.push.entity.FeatureRate;
  5. import com.diagbot.biz.push.entity.MedicalIndication;
  6. import com.diagbot.biz.push.entity.MedicalIndicationDetail;
  7. import com.diagbot.biz.push.entity.ResponseData;
  8. import com.diagbot.biz.push.enums.FeatureTypeEnum;
  9. import com.diagbot.client.bean.CalculateData;
  10. import com.diagbot.client.bean.HosCodeVO;
  11. import com.diagbot.config.CryptConfiguer;
  12. import com.diagbot.dto.ConceptPushDTO;
  13. import com.diagbot.dto.PushDTO;
  14. import com.diagbot.entity.Concept;
  15. import com.diagbot.entity.KlSymptom;
  16. import com.diagbot.enums.ConceptTypeEnum;
  17. import com.diagbot.enums.LexiconTypeEnum;
  18. import com.diagbot.enums.SysTypeEnum;
  19. import com.diagbot.facade.ClinicalFacade;
  20. import com.diagbot.facade.ConceptFacade;
  21. import com.diagbot.facade.TranEnDeFacade;
  22. import com.diagbot.util.CryptUtil;
  23. import com.diagbot.util.EntityUtil;
  24. import com.diagbot.util.FastJsonUtils;
  25. import com.diagbot.util.ListUtil;
  26. import com.diagbot.util.ParamConvertUtil;
  27. import com.diagbot.util.StringUtil;
  28. import com.diagbot.vo.ConceptBaseVO;
  29. import com.diagbot.vo.LisConfigVO;
  30. import com.google.common.collect.Lists;
  31. import io.github.lvyahui8.spring.annotation.DataConsumer;
  32. import io.github.lvyahui8.spring.annotation.DataProvider;
  33. import io.github.lvyahui8.spring.annotation.InvokeParameter;
  34. import org.springframework.beans.factory.annotation.Autowired;
  35. import org.springframework.stereotype.Component;
  36. import java.util.HashMap;
  37. import java.util.LinkedHashMap;
  38. import java.util.List;
  39. import java.util.Map;
  40. import java.util.Set;
  41. import java.util.stream.Collectors;
  42. /**
  43. * @Description:
  44. * @author: gaodm
  45. * @time: 2019/10/17 11:32
  46. */
  47. @Component
  48. public class PushItemAggregate {
  49. @Autowired
  50. private ConceptFacade conceptFacade;
  51. @Autowired
  52. private TranEnDeFacade tranEnDeFacade;
  53. @Autowired
  54. private ClinicalFacade clinicalFacade;
  55. @Autowired
  56. CryptConfiguer cryptConfiguer;
  57. @DataProvider("setAll")
  58. public PushDTO setAll(
  59. @InvokeParameter("pushDTO") PushDTO pushDTO,
  60. @DataConsumer("getDept") ConceptPushDTO dept,
  61. @DataConsumer("setSymptom") List<ConceptPushDTO> symptom,
  62. @DataConsumer("setVital") List<ConceptPushDTO> vital,
  63. @DataConsumer("setLab") List<ConceptPushDTO> lab,
  64. @DataConsumer("setRetPacs") List<ConceptPushDTO> pacs,
  65. @DataConsumer("setDis") Map<String, List<ConceptPushDTO>> dis,
  66. @DataConsumer("setMedicalIndications") List<MedicalIndication> medicalIndications) {
  67. if (pushDTO == null) {
  68. pushDTO = new PushDTO();
  69. }
  70. if (null != dept) {
  71. pushDTO.setDept(dept);
  72. }
  73. if (ListUtil.isNotEmpty(symptom)) {
  74. pushDTO.setSymptom(symptom);
  75. }
  76. if (ListUtil.isNotEmpty(vital)) {
  77. pushDTO.setVital(vital);
  78. }
  79. if (ListUtil.isNotEmpty(lab)) {
  80. pushDTO.setLab(lab);
  81. }
  82. if (ListUtil.isNotEmpty(pacs)) {
  83. pushDTO.setPacs(pacs);
  84. }
  85. if (null != dis) {
  86. pushDTO.setDis(dis);
  87. }
  88. if (ListUtil.isNotEmpty(medicalIndications)) {
  89. pushDTO.setMedicalIndications(medicalIndications);
  90. }
  91. return pushDTO;
  92. }
  93. /**
  94. * 根据诊断推送确定科室
  95. *
  96. * @param data
  97. * @return
  98. */
  99. @DataProvider("getDept")
  100. public ConceptPushDTO getDept(@InvokeParameter("data") ResponseData data) {
  101. List<FeatureRate> dis = data.getDis();
  102. String deptName = "";
  103. if (ListUtil.isNotEmpty(dis)) {
  104. for (FeatureRate featureRate : dis) {
  105. if (StringUtil.isNotBlank(featureRate.getExtraProperty())) {
  106. deptName = featureRate.getExtraProperty();
  107. break;
  108. }
  109. }
  110. }
  111. //没有推送信息时,默认取全科模板
  112. if (StringUtil.isBlank(deptName)) {
  113. deptName = "全科";
  114. if (cryptConfiguer.cryptFlag) {
  115. deptName = CryptUtil.encrypt_char(deptName);
  116. }
  117. }
  118. ConceptBaseVO conceptBaseVO = new ConceptBaseVO();
  119. conceptBaseVO.setName(deptName);
  120. conceptBaseVO.setLibType(LexiconTypeEnum.DEPARTMENT.getKey());
  121. ConceptPushDTO deptDTO = new ConceptPushDTO();
  122. Concept dept = conceptFacade.getConcept(conceptBaseVO);
  123. if (dept == null) {
  124. if (cryptConfiguer.cryptFlag) {
  125. if (deptName.equals(CryptUtil.encrypt_char("全科")) == false) {
  126. deptName = CryptUtil.encrypt_char("全科");
  127. }
  128. } else {
  129. if (deptName.equals("全科") == false) {
  130. deptName = "全科";
  131. }
  132. }
  133. conceptBaseVO.setName(deptName);
  134. dept = conceptFacade.getConcept(conceptBaseVO);
  135. }
  136. if (dept != null) {
  137. deptDTO.setName(deptName);
  138. deptDTO.setConceptId(dept.getId());
  139. deptDTO.setLibType(ConceptTypeEnum.DEPARTMENT.getKey());
  140. }
  141. return deptDTO;
  142. }
  143. @DataProvider("setSymptom")
  144. public List<ConceptPushDTO> setSymptom(@InvokeParameter("featureTypeSet") Set<String> featureTypeSet,
  145. @InvokeParameter("data") ResponseData data,
  146. @InvokeParameter("sysType") Integer sysType) {
  147. List<ConceptPushDTO> symptomRes = ListUtil.newArrayList();
  148. //症状 概念列表
  149. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Feature_Type_Symptom.getKey()))) {
  150. List<FeatureRate> symptom = data.getSymptom();
  151. if (ListUtil.isNotEmpty(symptom)) {
  152. List<String> nameList = symptom
  153. .stream()
  154. .map(featureRate -> featureRate.getFeatureName())
  155. .collect(Collectors.toList());
  156. if (ListUtil.isNotEmpty(nameList)) {
  157. symptomRes = getConceptDTOList(nameList, LexiconTypeEnum.SYMPTOM.getKey());
  158. if (sysType.equals(SysTypeEnum.TRIAGE_SERVICE.getKey())
  159. || sysType.equals(SysTypeEnum.PREC_SERVICE.getKey())) {
  160. Map<String, KlSymptom> klSymptomMap
  161. = conceptFacade.getSymptomWithExplain(nameList, LexiconTypeEnum.SYMPTOM.getKey());
  162. if (klSymptomMap != null) {
  163. symptomRes.forEach(conceptPushDTO -> {
  164. if (klSymptomMap.containsKey(conceptPushDTO.getName())) {
  165. conceptPushDTO
  166. .setDescription(klSymptomMap.get(conceptPushDTO.getName()).getDescription());
  167. conceptPushDTO
  168. .setExplains(klSymptomMap.get(conceptPushDTO.getName()).getExplains());
  169. if (StringUtil.isBlank(klSymptomMap.get(conceptPushDTO.getName()).getExplains())) {
  170. conceptPushDTO.setHasExplain(0);
  171. } else {
  172. conceptPushDTO.setHasExplain(1);
  173. }
  174. }
  175. });
  176. }
  177. }
  178. }
  179. }
  180. }
  181. return symptomRes;
  182. }
  183. @DataProvider("setVital")
  184. public List<ConceptPushDTO> setVital(@InvokeParameter("featureTypeSet") Set<String> featureTypeSet,
  185. @InvokeParameter("data") ResponseData data) {
  186. List<ConceptPushDTO> vitalRes = ListUtil.newArrayList();
  187. //查体 查体结果
  188. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Feature_Type_Vital_Result.getKey()))) {
  189. List<FeatureRate> vital = data.getVitals();
  190. if (ListUtil.isNotEmpty(vital)) {
  191. List<String> nameList = vital
  192. .stream()
  193. .map(featureRate -> featureRate.getFeatureName())
  194. .collect(Collectors.toList());
  195. if (ListUtil.isNotEmpty(nameList)) {
  196. vitalRes = getConceptDTOList(nameList, LexiconTypeEnum.VITAL_RESULT.getKey());
  197. }
  198. }
  199. }
  200. //查体 查体指标
  201. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Feature_Type_Vital_Index.getKey()))) {
  202. List<FeatureRate> vital = data.getVitals();
  203. if (ListUtil.isNotEmpty(vital)) {
  204. List<String> nameList = vital
  205. .stream()
  206. .map(featureRate -> featureRate.getFeatureName())
  207. .collect(Collectors.toList());
  208. if (ListUtil.isNotEmpty(nameList)) {
  209. vitalRes = getConceptDTOList(nameList, LexiconTypeEnum.VITAL_INDEX.getKey());
  210. }
  211. }
  212. }
  213. return vitalRes;
  214. }
  215. @DataProvider("setLab")
  216. public List<ConceptPushDTO> setLab(@InvokeParameter("featureTypeSet") Set<String> featureTypeSet,
  217. @InvokeParameter("data") ResponseData data,
  218. @InvokeParameter("isConnect") Boolean isConnect,
  219. @InvokeParameter("hosCode") String hosCode) {
  220. List<ConceptPushDTO> labRes = ListUtil.newArrayList();
  221. //化验 概念列表-公表项
  222. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Feature_Type_Lis.getKey()))) {
  223. List<FeatureRate> lis = data.getLabs();
  224. if (ListUtil.isNotEmpty(lis)) {
  225. List<String> nameList = lis
  226. .stream()
  227. .map(featureRate -> featureRate.getFeatureName())
  228. .collect(Collectors.toList());
  229. if (ListUtil.isNotEmpty(nameList)) {
  230. List<ConceptPushDTO> lisDTO = getConceptDTOList(nameList, LexiconTypeEnum.LIS_PACKAGE.getKey());
  231. if (isConnect) {
  232. lisDTO = addClientName(lisDTO, hosCode, ConceptTypeEnum.Lis.getKey());
  233. }
  234. labRes = lisDTO;
  235. }
  236. }
  237. }
  238. return labRes;
  239. }
  240. @DataProvider("setRetPacs")
  241. public List<ConceptPushDTO> setRetPacs(@InvokeParameter("featureTypeSet") Set<String> featureTypeSet,
  242. @InvokeParameter("data") ResponseData data,
  243. @InvokeParameter("isConnect") Boolean isConnect,
  244. @InvokeParameter("hosCode") String hosCode) {
  245. List<ConceptPushDTO> labRes = ListUtil.newArrayList();
  246. //辅检 概念列表
  247. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Feature_Type_Pacs.getKey()))) {
  248. List<FeatureRate> pacs = data.getPacs();
  249. if (ListUtil.isNotEmpty(pacs)) {
  250. List<String> nameList = pacs
  251. .stream()
  252. .map(featureRate -> featureRate.getFeatureName())
  253. .collect(Collectors.toList());
  254. if (ListUtil.isNotEmpty(nameList)) {
  255. List<ConceptPushDTO> pacsDTO = getConceptDTOList(nameList, LexiconTypeEnum.PACS_ITEMS.getKey());
  256. if (isConnect) {
  257. pacsDTO = addClientName(pacsDTO, hosCode, ConceptTypeEnum.Pacs.getKey());
  258. }
  259. labRes = pacsDTO;
  260. }
  261. }
  262. }
  263. return labRes;
  264. }
  265. @DataProvider("setDis")
  266. public Map<String, List<ConceptPushDTO>> setDis(@InvokeParameter("featureTypeSet") Set<String> featureTypeSet,
  267. @InvokeParameter("data") ResponseData data,
  268. @InvokeParameter("isConnect") Boolean isConnect,
  269. @InvokeParameter("hosCode") String hosCode) {
  270. List<FeatureRate> dis = data.getDis();
  271. Map<String, List<ConceptPushDTO>> disRes = new HashMap<>();
  272. //诊断 map
  273. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Feature_Type_Disease.getKey()))) {
  274. if (ListUtil.isNotEmpty(dis)) {
  275. Map<String, List<ConceptPushDTO>> disMapDTO = new LinkedHashMap<>();
  276. Map<String, List<FeatureRate>> disFeatureMap = new LinkedHashMap<>();
  277. //诊断分类
  278. for (FeatureRate featureRate : dis) {
  279. if (StringUtil.isBlank(featureRate.getDesc())) {
  280. featureRate.setDesc("{\"可能诊断\":\"\"}");
  281. }
  282. Map<String, Object> descMap = FastJsonUtils.getJsonToMap(featureRate.getDesc());
  283. for (String disClass : descMap.keySet()) {
  284. List<FeatureRate> featureRateList = Lists.newLinkedList();
  285. if (disFeatureMap.get(disClass) != null) {
  286. featureRateList = disFeatureMap.get(disClass);
  287. }
  288. featureRateList.add(featureRate);
  289. disFeatureMap.put(disClass, featureRateList);
  290. }
  291. }
  292. for (Map.Entry<String, List<FeatureRate>> entry : disFeatureMap.entrySet()) {
  293. List<String> nameListByDisClass = entry.getValue()
  294. .stream()
  295. .map(featureRate -> featureRate.getFeatureName())
  296. .collect(Collectors.toList());
  297. if (ListUtil.isNotEmpty(nameListByDisClass)) {
  298. List<ConceptPushDTO> disDTO
  299. = getConceptDTOList(nameListByDisClass, LexiconTypeEnum.DIAGNOSIS.getKey());
  300. if (isConnect) {
  301. disDTO = addClientName(disDTO, hosCode, ConceptTypeEnum.Disease.getKey());
  302. }
  303. disMapDTO.put(entry.getKey(), disDTO);
  304. }
  305. }
  306. disRes = disMapDTO;
  307. }
  308. }
  309. //诊断转成明文
  310. if (cryptConfiguer.cryptFlag) {
  311. for (Map.Entry<String, List<ConceptPushDTO>> entry : disRes.entrySet()) {
  312. if (ListUtil.isNotEmpty(entry.getValue())) {
  313. for (ConceptPushDTO conceptPushDTO : entry.getValue()) {
  314. conceptPushDTO.setName(CryptUtil.decrypt_char(conceptPushDTO.getName()));
  315. }
  316. disRes.put(entry.getKey(), entry.getValue());
  317. }
  318. }
  319. }
  320. return disRes;
  321. }
  322. @DataProvider("setMedicalIndications")
  323. public List<MedicalIndication> setMedicalIndications(@InvokeParameter("featureTypeSet") Set<String> featureTypeSet,
  324. @InvokeParameter("data") ResponseData data) {
  325. List<MedicalIndication> medicalIndicationRes = ListUtil.newArrayList();
  326. //核心指标 list
  327. if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Feature_Type_Indication.getKey()))) {
  328. List<MedicalIndication> medicalIndicationList = data.getMedicalIndications();
  329. ConceptBaseVO conceptBaseVO = new ConceptBaseVO();
  330. if (ListUtil.isNotEmpty(medicalIndicationList)) {
  331. for (MedicalIndication medicalIndication : medicalIndicationList) {
  332. medicalIndication.setLibType(LexiconTypeEnum.CORE_INDICATORS.getKey());
  333. medicalIndication.setType(ConceptTypeEnum.Indication.getKey());
  334. //关联概念,增加概念id
  335. conceptBaseVO.setName(medicalIndication.getName());
  336. conceptBaseVO.setLibType(LexiconTypeEnum.CORE_INDICATORS.getKey());
  337. Concept medConcept = conceptFacade.getConcept(conceptBaseVO);
  338. if (medConcept != null) {
  339. medicalIndication.setConceptId(medConcept.getId());
  340. }
  341. if (ListUtil.isNotEmpty(medicalIndication.getDetails())) {
  342. for (MedicalIndicationDetail detail : medicalIndication.getDetails()) {
  343. //量表,增加概念id;其他类型保留图谱返回结果
  344. if (detail.getType().equals(1)) {
  345. JSONObject scaleJson = detail.getContent();
  346. if (null != scaleJson.get("name")) {
  347. String scaleName = scaleJson.get("name").toString();
  348. if (cryptConfiguer.cryptFlag) {
  349. scaleName = CryptUtil.encrypt_char(scaleName);
  350. }
  351. conceptBaseVO.setName(scaleName);
  352. conceptBaseVO.setLibType(LexiconTypeEnum.GAUGE.getKey());
  353. Concept scaleConcept = conceptFacade.getConcept(conceptBaseVO);
  354. scaleJson.put("libType", LexiconTypeEnum.GAUGE.getKey());
  355. scaleJson.put("type", ConceptTypeEnum.Scale.getKey());
  356. if (scaleConcept != null) {
  357. scaleJson.put("conceptId", scaleConcept.getId());
  358. } else {
  359. scaleJson.put("conceptId", null);
  360. }
  361. detail.setContent(scaleJson);
  362. }
  363. } else if (detail.getType().equals(2)) {
  364. JSONObject calcJson = detail.getContent();
  365. CalculateData calcData = new CalculateData();
  366. calcData.setData(JSON.parseObject(FastJsonUtils.getBeanToJson(detail)));
  367. calcData.setType(2);
  368. Map<String, Object> resultMap = clinicalFacade.scaleCalc(calcData);
  369. if (resultMap.containsKey("result") && calcJson != null) {
  370. calcJson.put("result", resultMap.get("result"));
  371. detail.setContent(calcJson);
  372. }
  373. }
  374. }
  375. }
  376. }
  377. medicalIndicationRes = medicalIndicationList;
  378. }
  379. }
  380. return medicalIndicationRes;
  381. }
  382. /**
  383. * 推理返回概念
  384. *
  385. * @param nameList
  386. * @param libType
  387. * @return
  388. */
  389. public List<ConceptPushDTO> getConceptDTOList(List<String> nameList, Integer libType) {
  390. List<Concept> concepts = conceptFacade.getListByNamesAndType(nameList, libType);
  391. Map<String, Concept> conceptMap = EntityUtil.makeEntityMap(concepts, "libName");
  392. List<ConceptPushDTO> conceptDTOS = Lists.newLinkedList();
  393. for (String name : nameList) {
  394. ConceptPushDTO conceptDTO = new ConceptPushDTO();
  395. conceptDTO.setName(name);
  396. conceptDTO.setLibType(libType);
  397. conceptDTO.setType(ParamConvertUtil.libConvert2Concept(libType));
  398. if (conceptMap.containsKey(name) && conceptMap.get(name) != null) {
  399. Concept concept = conceptMap.get(name);
  400. conceptDTO.setConceptId(concept.getId());
  401. }
  402. conceptDTOS.add(conceptDTO);
  403. }
  404. return conceptDTOS;
  405. }
  406. /**
  407. * 添加外部名称(调用方)
  408. *
  409. * @param concepts
  410. * @param hosCode
  411. * @param type
  412. * @return
  413. */
  414. public List<ConceptPushDTO> addClientName(List<ConceptPushDTO> concepts, String hosCode, Integer type) {
  415. HosCodeVO hosCodeVO = new HosCodeVO();
  416. hosCodeVO.setHosCode(hosCode);
  417. LisConfigVO lisConfigVO = new LisConfigVO();
  418. lisConfigVO.setHosCode(hosCode);
  419. List<String> uniqueNameList = concepts
  420. .stream()
  421. .map(concept -> concept.getName())
  422. .collect(Collectors.toList());
  423. //加密情况下,转成原文调trans层接口
  424. if (cryptConfiguer.cryptFlag) {
  425. CryptUtil.decryptList(uniqueNameList);
  426. }
  427. lisConfigVO.setUniqueNameList(uniqueNameList);
  428. if (type.equals(ConceptTypeEnum.Lis.getKey())) {
  429. Map<String, List<String>> lisMappingByUniqueName = tranEnDeFacade.getLisConfigByUniqueNameAndHosCode(lisConfigVO);
  430. for (ConceptPushDTO concept : concepts) {
  431. List<String> clientNames = Lists.newLinkedList();
  432. if (cryptConfiguer.cryptFlag) {
  433. clientNames = lisMappingByUniqueName.get(CryptUtil.decrypt_char(concept.getName()));
  434. } else {
  435. clientNames = lisMappingByUniqueName.get(concept.getName());
  436. }
  437. if (ListUtil.isNotEmpty(clientNames)) {
  438. concept.setClientNames(clientNames);
  439. }
  440. }
  441. } else if (type.equals(ConceptTypeEnum.Pacs.getKey())) {
  442. Map<String, List<String>> pacsConfigMapByUniqueName = tranEnDeFacade.getPacsConfigByUniqueNameAndHosCode(hosCodeVO);
  443. for (ConceptPushDTO concept : concepts) {
  444. List<String> clientNames = Lists.newLinkedList();
  445. if (cryptConfiguer.cryptFlag) {
  446. clientNames = pacsConfigMapByUniqueName.get(CryptUtil.decrypt_char(concept.getName()));
  447. } else {
  448. clientNames = pacsConfigMapByUniqueName.get(concept.getName());
  449. }
  450. if (ListUtil.isNotEmpty(clientNames)) {
  451. concept.setClientNames(clientNames);
  452. }
  453. }
  454. } else if (type.equals(ConceptTypeEnum.Disease.getKey())) {
  455. Map<String, String> disMap = tranEnDeFacade.getDiseaseIcdByHosCode(hosCodeVO);
  456. for (ConceptPushDTO concept : concepts) {
  457. String clientName = "";
  458. if (cryptConfiguer.cryptFlag) {
  459. clientName = disMap.get(CryptUtil.decrypt_char(concept.getName()));
  460. } else {
  461. clientName = disMap.get(concept.getName());
  462. }
  463. if (StringUtil.isNotBlank(clientName)) {
  464. List<String> clientNames = Lists.newLinkedList();
  465. clientNames.add(clientName);
  466. concept.setClientNames(clientNames);
  467. }
  468. }
  469. }
  470. return concepts;
  471. }
  472. }