PushFacade.java 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. package com.diagbot.facade;
  2. import com.diagbot.client.PushNewServiceClient;
  3. import com.diagbot.dto.PushBaseDTO;
  4. import com.diagbot.dto.PushDTO;
  5. import com.diagbot.dto.PushNewDTO;
  6. import com.diagbot.dto.PushPlanDTO;
  7. import com.diagbot.dto.WordCrfDTO;
  8. import com.diagbot.enums.DiagnoseTypeEnum;
  9. import com.diagbot.enums.DiseasePushTypeEnum;
  10. import com.diagbot.enums.RedisEnum;
  11. import com.diagbot.exception.CommonErrorCode;
  12. import com.diagbot.exception.CommonException;
  13. import com.diagbot.process.PushProcess;
  14. import com.diagbot.util.CoreUtil;
  15. import com.diagbot.util.ListUtil;
  16. import com.diagbot.util.ParamUtil;
  17. import com.diagbot.util.RedisUtil;
  18. import com.diagbot.util.StringUtil;
  19. import com.diagbot.vo.PushNewVO;
  20. import com.diagbot.vo.PushPlanVO;
  21. import com.diagbot.vo.PushVO;
  22. import com.diagbot.vo.StandConvert;
  23. import com.google.common.collect.Lists;
  24. import io.github.lvyahui8.spring.facade.DataFacade;
  25. import org.springframework.beans.factory.annotation.Autowired;
  26. import org.springframework.stereotype.Component;
  27. import java.util.HashMap;
  28. import java.util.Iterator;
  29. import java.util.LinkedHashMap;
  30. import java.util.List;
  31. import java.util.Map;
  32. /**
  33. * @Description: 推送facade
  34. * @author: zhoutg
  35. * @time: 2018/8/6 9:11
  36. */
  37. @Component
  38. public class PushFacade {
  39. @Autowired
  40. PushProcess pushProcess;
  41. @Autowired
  42. CommonFacade commonFacade;
  43. @Autowired
  44. NeoFacade neoFacade;
  45. @Autowired
  46. FollowupPlanInfoFacade followupPlanInfoFacade;
  47. @Autowired
  48. TranHospitalInfoFacade tranHospitalInfoFacade;
  49. @Autowired
  50. PushNewServiceClient pushNewServiceClient;
  51. @Autowired
  52. RedisUtil redisUtil;
  53. /**
  54. * 推送fac(兼容新版和5.0)
  55. *
  56. * @param pushVO
  57. * @return
  58. */
  59. public PushDTO pushFac(PushVO pushVO) {
  60. String pushVersion = redisUtil.getByKeyAndField(RedisEnum.pushVersion.getName(),
  61. RedisEnum.hospitalId_.getName() + pushVO.getHospitalId());
  62. if (StringUtil.isNotBlank(pushVersion) && "old".equals(pushVersion)) {
  63. // 使用5.0推送
  64. return processAggreate(pushVO);
  65. } else {
  66. // 使用新版推送
  67. return pushNewFac(pushVO);
  68. }
  69. }
  70. public PushDTO processAggreate(PushVO pushVo) {
  71. // 年龄容错处理
  72. if (pushVo.getAgeNum() == null) {
  73. pushVo.setAgeNum(CoreUtil.convertAge(pushVo.getAge()));
  74. }
  75. PushDTO pushDTO = new PushDTO();
  76. Integer pushMode = tranHospitalInfoFacade.getPushMode(pushVo.getHospitalId());
  77. //全科推送,走5.0
  78. if (pushMode.equals(DiseasePushTypeEnum.gp.getKey())) {
  79. pushDTO = this.pushFacIcss(pushVo);
  80. } else if (pushMode.equals(DiseasePushTypeEnum.specialty.getKey())) {
  81. //专科推送,走6.0
  82. //pushDTO = this.pushFac(pushVo);
  83. // 2021/2/22 同老楼确认专科也走5.0
  84. pushDTO = this.pushFacIcss(pushVo);
  85. }
  86. return pushDTO;
  87. }
  88. /**
  89. * 推送调icss5.0接口
  90. *
  91. * @param pushVo
  92. * @return
  93. */
  94. public PushDTO pushFacIcss(PushVO pushVo) {
  95. Map<String, Object> debug = new LinkedHashMap<>();
  96. long pushStart = System.currentTimeMillis();
  97. PushDTO pushDTO = pushProcess.processIcss(pushVo);
  98. CoreUtil.getDebugStr(pushStart, "推送耗时", debug);
  99. pushDTO.setDebug(debug);
  100. return pushDTO;
  101. }
  102. /**
  103. * 推送业务6.0
  104. *
  105. * @param
  106. * @return
  107. */
  108. public PushDTO pushNewFac(PushVO pushVo) {
  109. PushDTO pushDTO = new PushDTO();
  110. Map<String, Object> debug = new LinkedHashMap<>();
  111. // 模型处理数据
  112. long start = System.currentTimeMillis();
  113. WordCrfDTO wordCrfDTO = commonFacade.crf_process(pushVo);
  114. CoreUtil.getDebugStr(start, "模型处理耗时", debug);
  115. // 标准词转换
  116. long standStart = System.currentTimeMillis();
  117. StandConvert standConvert = commonFacade.dataTypeGet(wordCrfDTO);
  118. Map<String, Map<String, String>> standConvertMap = neoFacade.standConvertCrf(standConvert);
  119. commonFacade.dataTypeSet(wordCrfDTO, standConvertMap);
  120. CoreUtil.getDebugStr(standStart, "标准词转换耗时", debug);
  121. ParamUtil.dealLis(wordCrfDTO.getLis());
  122. // 是否有界面诊断
  123. boolean hasDiseaseFlag = ListUtil.isNotEmpty(wordCrfDTO.getDiag()) ? true : false;
  124. // 无界面诊断,走诊断依据和大数据推理
  125. if (!hasDiseaseFlag) {
  126. try {
  127. Map<String, Object> invokeParams = new HashMap<>();
  128. invokeParams.put("wordCrfDTO", wordCrfDTO);
  129. invokeParams.put("pushNewVO", generatePushVo(wordCrfDTO));
  130. pushDTO = DataFacade.get("pushAll", invokeParams, PushDTO.class);
  131. } catch (Exception e) {
  132. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "推送服务出错" + e.getMessage());
  133. }
  134. // 诊断去重、合并处理
  135. dealDisease(pushDTO);
  136. }
  137. // 通过诊断反推
  138. long reverseStart = System.currentTimeMillis();
  139. pushProcess.process(pushDTO, pushVo, wordCrfDTO);
  140. CoreUtil.getDebugStr(reverseStart, "反推业务耗时", debug);
  141. CoreUtil.getDebugStr(start, "总计耗时", debug);
  142. CoreUtil.getDebugObject("数据", debug, wordCrfDTO);
  143. pushDTO.getDebug().putAll(debug);
  144. return pushDTO;
  145. }
  146. /**
  147. * 诊断去重、合并处理
  148. * @param pushDTO
  149. */
  150. public void dealDisease(PushDTO pushDTO) {
  151. Map<String, List<PushBaseDTO>> dis = pushDTO.getDis();
  152. List<PushBaseDTO> possibleUnion = Lists.newArrayList(); // 可能诊断 = 确诊 + 拟诊 + 大数据推送诊断
  153. List<PushBaseDTO> definite = dis.get(DiagnoseTypeEnum.definite.getName()); // 确诊
  154. List<PushBaseDTO> protocol = dis.get(DiagnoseTypeEnum.protocol.getName()); // 拟诊
  155. List<PushBaseDTO> bigDataPush = dis.get(DiagnoseTypeEnum.bigDataPush.getName()); // 大数据推送诊断
  156. // 合并可能诊断
  157. if (ListUtil.isNotEmpty(definite)) {
  158. possibleUnion.addAll(definite);
  159. }
  160. if (ListUtil.isNotEmpty(protocol)) {
  161. possibleUnion.addAll(protocol);
  162. }
  163. if (ListUtil.isNotEmpty(bigDataPush)) {
  164. possibleUnion.addAll(bigDataPush);
  165. }
  166. // 去重
  167. if (ListUtil.isNotEmpty(possibleUnion)) {
  168. List<String> diseaseNameList = Lists.newArrayList();
  169. Iterator<PushBaseDTO> it = possibleUnion.iterator();
  170. while (it.hasNext()) {
  171. PushBaseDTO bean = it.next();
  172. if (diseaseNameList.contains(bean.getName())) {
  173. it.remove();
  174. } else {
  175. diseaseNameList.add(bean.getName());
  176. }
  177. }
  178. // 添加可能诊断
  179. dis.put(DiagnoseTypeEnum.possibleUnion.getName(), possibleUnion);
  180. // 如果需要删除诊断,就用以下代码
  181. // dis.put(DiagnoseTypeEnum.possibleUnion.getName(), BeanUtil.listCopyTo(possibleUnion, PushDTO.class));
  182. }
  183. }
  184. /**
  185. * 生成新版推送入参
  186. *
  187. * @param wordCrfDTO
  188. * @return
  189. */
  190. public PushNewVO generatePushVo(WordCrfDTO wordCrfDTO) {
  191. PushNewVO pushNewVO = new PushNewVO();
  192. pushNewVO.setChief(wordCrfDTO.getChief());
  193. pushNewVO.setPresent(wordCrfDTO.getSymptom());
  194. pushNewVO.setAge(wordCrfDTO.getAgeNum());
  195. pushNewVO.setSex(wordCrfDTO.getSex());
  196. String pushType = redisUtil.getByKeyAndField(RedisEnum.hospitalPushType.getName(), String.valueOf(wordCrfDTO.getHospitalId()));
  197. if (StringUtil.isNotBlank(pushType)) {
  198. pushNewVO.setHospitalType(pushType);
  199. }
  200. return pushNewVO;
  201. }
  202. /**
  203. * 手术随访计划(持续检验检查)推送
  204. *
  205. * @param pushPlanVO
  206. * @return
  207. */
  208. public PushPlanDTO pushPlan(PushPlanVO pushPlanVO) {
  209. Map<String, Object> debug = new LinkedHashMap<>();
  210. long l1 = System.currentTimeMillis();
  211. PushPlanDTO pushPlanDTO = new PushPlanDTO();
  212. if (pushPlanVO.getOperationName() != null) {
  213. WordCrfDTO wordCrfDTO = new WordCrfDTO();
  214. wordCrfDTO.setOperationName(pushPlanVO.getOperationName());
  215. // 标准词转换
  216. long standStart = System.currentTimeMillis();
  217. StandConvert standConvert = commonFacade.dataTypeGet(wordCrfDTO);
  218. Map<String, Map<String, String>> standConvertMap = neoFacade.standConvertCrf(standConvert);
  219. commonFacade.dataTypeSet(wordCrfDTO, standConvertMap);
  220. CoreUtil.getDebugStr(standStart, "标准词转换耗时", debug);
  221. // 推送随访计划
  222. long pushStart = System.currentTimeMillis();
  223. pushPlanDTO = followupPlanInfoFacade.getFollowUpPlans(pushPlanVO.getOperationName(), pushPlanVO.getHospitalId());
  224. CoreUtil.getDebugStr(pushStart, "推送耗时", debug);
  225. pushPlanDTO.setDebug(debug);
  226. }
  227. CoreUtil.getDebugStr(l1, "本次调用总计耗时", debug);
  228. return pushPlanDTO;
  229. }
  230. /**
  231. * 测试新版推送
  232. *
  233. * @param pushNewVO
  234. * @return
  235. */
  236. public PushNewDTO testPushFac(PushNewVO pushNewVO) {
  237. return pushNewServiceClient.pushNew(pushNewVO);
  238. }
  239. }