PushFacade.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. package com.diagbot.facade;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.diagbot.client.AIServiceClient;
  4. import com.diagbot.client.bean.FeatureRate;
  5. import com.diagbot.client.bean.Response;
  6. import com.diagbot.client.bean.ResponseData;
  7. import com.diagbot.client.bean.SearchData;
  8. import com.diagbot.dto.PushDTO;
  9. import com.diagbot.dto.PushKYJDTO;
  10. import com.diagbot.dto.QuestionDTO;
  11. import com.diagbot.entity.DeptInfo;
  12. import com.diagbot.entity.DeptVital;
  13. import com.diagbot.entity.QuestionInfo;
  14. import com.diagbot.entity.VitalOrder;
  15. import com.diagbot.enums.IsDeleteEnum;
  16. import com.diagbot.enums.QuantitativeTypeEnum;
  17. import com.diagbot.enums.QuestionTypeEnum;
  18. import com.diagbot.exception.CommonErrorCode;
  19. import com.diagbot.exception.CommonException;
  20. import com.diagbot.util.EntityUtil;
  21. import com.diagbot.util.StringUtil;
  22. import com.diagbot.vo.LisKYJVO;
  23. import com.diagbot.vo.PushKYJVO;
  24. import com.diagbot.vo.PushVO;
  25. import com.diagbot.vo.QuestionVO;
  26. import com.google.common.collect.Lists;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.stereotype.Component;
  29. import java.util.Arrays;
  30. import java.util.HashSet;
  31. import java.util.LinkedHashMap;
  32. import java.util.List;
  33. import java.util.Map;
  34. import java.util.Set;
  35. /**
  36. * @Description:
  37. * @Author:zhaops
  38. * @time: 2018/11/20 11:18
  39. */
  40. @Component
  41. public class PushFacade {
  42. @Autowired
  43. private AIServiceClient aiServiceClient;
  44. @Autowired
  45. private QuestionFacade questionFacade;
  46. @Autowired
  47. private DeptInfoFacade deptInfoFacade;
  48. @Autowired
  49. private DeptVitalFacade deptVitalFacade;
  50. @Autowired
  51. private VitalOrderFacade vitalOrderFacade;
  52. /**
  53. * 推理接口
  54. *
  55. * @param pushVO
  56. * @return
  57. */
  58. public ResponseData pushAI(PushVO pushVO) {
  59. SearchData searchData = new SearchData();
  60. searchData.setAge(pushVO.getAge());
  61. searchData.setSymptom(pushVO.getSymptom());
  62. searchData.setVital(pushVO.getVital());
  63. searchData.setLis(pushVO.getLis());
  64. searchData.setPacs(pushVO.getPacs());
  65. searchData.setPast(pushVO.getPast());
  66. searchData.setOther(pushVO.getOther());
  67. searchData.setDiag(pushVO.getDiag());
  68. switch (pushVO.getSex()) {
  69. case 1:
  70. searchData.setSex("M");
  71. break;
  72. case 2:
  73. searchData.setSex("F");
  74. break;
  75. default:
  76. searchData.setSex("A");
  77. break;
  78. }
  79. searchData.setFeatureType(pushVO.getFeatureType());
  80. searchData.setSysCode("1");
  81. searchData.setLength(10);
  82. Response<ResponseData> res = aiServiceClient.bayesPageData(searchData);
  83. return res.getData();
  84. }
  85. /**
  86. * 推理接口
  87. *
  88. * @param pushVO
  89. * @return
  90. */
  91. public PushDTO pushInner(PushVO pushVO) {
  92. PushDTO pushDTO = new PushDTO();
  93. ResponseData data = pushAI(pushVO);
  94. String featureType = pushVO.getFeatureType();
  95. String[] featureTypes = featureType.split(",|,");
  96. Set<String> featureTypeSet = new HashSet(Arrays.asList(featureTypes));
  97. List<FeatureRate> symptom = data.getSymptom();
  98. List<FeatureRate> dis = data.getDis();
  99. List<FeatureRate> pacs = data.getPacs();
  100. List<FeatureRate> labs = data.getLabs();
  101. Map<String, Object> symptomMap = list2Map(symptom);
  102. Map<String, Object> disMap = list2Map(dis);
  103. Map<String, Object> labMap = list2Map(labs);
  104. Map<String, Object> pacsMap = list2Map(pacs);
  105. if (featureTypeSet.contains(String.valueOf(QuestionTypeEnum.Lis.getKey()))) {
  106. List<QuestionDTO> labDTO = getTagListByMap(labMap, pushVO, QuestionTypeEnum.Lis.getKey());
  107. pushDTO.setLab(labDTO);
  108. }
  109. if (featureTypeSet.contains(String.valueOf(QuestionTypeEnum.Pacs.getKey()))) {
  110. List<QuestionDTO> pacsDTO = getTagListByMap(labMap, pushVO, QuestionTypeEnum.Pacs.getKey());
  111. pushDTO.setPacs(pacsDTO);
  112. }
  113. //诊断 返回tagName+标签
  114. if (featureTypeSet.contains(String.valueOf(QuestionTypeEnum.Disease.getKey()))) {
  115. List<QuestionDTO> disDTO = getTagListByMap(disMap, pushVO, QuestionTypeEnum.Disease.getKey());
  116. Map<String, List<QuestionDTO>> disMapDTO = new LinkedHashMap<>();
  117. disMapDTO.put("疑似诊断:", disDTO);
  118. pushDTO.setDis(disMapDTO);
  119. }
  120. //症状(主诉 type=1;现病史 type=2) 返回 tagName+填写单
  121. if (featureTypeSet.contains(String.valueOf(QuestionTypeEnum.Symptom.getKey()))) {
  122. List<QuestionDTO> symptomDTO = getTagListByMap(symptomMap, pushVO, QuestionTypeEnum.Symptom.getKey());
  123. pushDTO.setSymptom(symptomDTO);
  124. }
  125. //查体 返回模板
  126. if (featureTypeSet.contains(String.valueOf(QuestionTypeEnum.Vital.getKey()))) {
  127. //没有推送信息时,默认取全科模板
  128. String deptName = "全科";
  129. if (dis != null && dis.size() > 0) {
  130. deptName = dis.get(0).getExtraProperty();
  131. }
  132. List<QuestionDTO> vitalDTO = getVitalModule(deptName, pushVO);
  133. pushDTO.setVital(vitalDTO);
  134. }
  135. return pushDTO;
  136. }
  137. /**
  138. * 获取返回结果标签
  139. * @param map
  140. * @param pushVO
  141. * @param type
  142. * @return
  143. */
  144. public List<QuestionDTO> getTagListByMap(Map<String, Object> map, PushVO pushVO, Integer type) {
  145. List<QuestionDTO> questionDTOList = Lists.newLinkedList();
  146. QueryWrapper<QuestionInfo> questionInfoQueryWrapper = new QueryWrapper();
  147. questionInfoQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey()).
  148. in("tag_name", map.keySet()).
  149. eq("type", type);
  150. List<QuestionInfo> questionInfoList = questionFacade.list(questionInfoQueryWrapper);
  151. Map<String, QuestionInfo> questionMap = EntityUtil.makeEntityMap(questionInfoList, "tagName");
  152. for (Map.Entry<String, Object> entry : map.entrySet()) {
  153. QuestionDTO questionDTO = new QuestionDTO();
  154. if (questionMap.get(entry.getKey()) != null) {
  155. QuestionVO questionVO = new QuestionVO();
  156. questionVO.setAge(pushVO.getAge());
  157. questionVO.setSexType(pushVO.getSex());
  158. questionVO.setId(questionMap.get(entry.getKey()).getId());
  159. questionDTO = questionFacade.getById(questionVO);
  160. if (questionDTO == null || (!questionDTO.getSubType().equals(0))) {
  161. questionDTO = new QuestionDTO();
  162. questionDTO.setTagName(entry.getKey());
  163. }
  164. } else {
  165. questionDTO.setTagName(entry.getKey());
  166. }
  167. questionDTOList.add(questionDTO);
  168. }
  169. return questionDTOList;
  170. }
  171. /**
  172. * 推理接口-快易检
  173. *
  174. * @param pushKYJVO
  175. * @return
  176. */
  177. public PushKYJDTO pushKYJ(PushKYJVO pushKYJVO) {
  178. PushVO pushVO = new PushVO();
  179. pushVO.setAge(pushKYJVO.getAge());
  180. pushVO.setSex(pushKYJVO.getSex());
  181. //参数预处理
  182. String lis = "";
  183. List<String> lisResultList = Lists.newArrayList();
  184. for (LisKYJVO lisKYJVO : pushKYJVO.getLisKYJVOList()) {
  185. lisKYJVO = resultCalculation(lisKYJVO);
  186. lisResultList.addAll(getLisInputs(lisKYJVO));
  187. }
  188. lis = String.join(",", lisResultList);
  189. pushVO.setLis(lis);
  190. ResponseData responseData = pushAI(pushVO);
  191. PushKYJDTO pushKYJDTO = new PushKYJDTO();
  192. pushKYJDTO.setLabs(responseData.getLabs());
  193. pushKYJDTO.setDis(responseData.getDis());
  194. return pushKYJDTO;
  195. }
  196. /**
  197. * 将list 转换成 map
  198. *
  199. * @param list
  200. * @return
  201. */
  202. public Map<String, Object> list2Map(List<FeatureRate> list) {
  203. Map<String, Object> map = new LinkedHashMap<>();
  204. for (FeatureRate featureRate : list) {
  205. map.put(featureRate.getFeatureName(), null);
  206. }
  207. return map;
  208. }
  209. /**
  210. * 快易检结果预处理
  211. *
  212. * @param lisKYJVO
  213. * @return
  214. */
  215. public LisKYJVO resultCalculation(LisKYJVO lisKYJVO) {
  216. if (lisKYJVO.getValue() != null) {
  217. if (lisKYJVO.getMax() != null) {
  218. Integer comResult = lisKYJVO.getValue().compareTo(lisKYJVO.getMax());
  219. if (comResult > 0) {
  220. lisKYJVO.setMultipleState(QuantitativeTypeEnum.Up.getName());
  221. if (!lisKYJVO.getMax().equals(0.0)) {
  222. lisKYJVO.setMultipleValue(lisKYJVO.getValue() / lisKYJVO.getMax());
  223. }
  224. }
  225. }
  226. if (lisKYJVO.getMin() != null) {
  227. Integer comResult = lisKYJVO.getValue().compareTo(lisKYJVO.getMax());
  228. if (comResult < 0) {
  229. lisKYJVO.setMultipleState(QuantitativeTypeEnum.Down.getName());
  230. if (!lisKYJVO.getMax().equals(0.0)) {
  231. lisKYJVO.setMultipleValue(lisKYJVO.getValue() / lisKYJVO.getMin());
  232. }
  233. }
  234. }
  235. if (StringUtil.isBlank(lisKYJVO.getMultipleState())) {
  236. lisKYJVO.setMultipleState(QuantitativeTypeEnum.Normal.getName());
  237. }
  238. }
  239. return lisKYJVO;
  240. }
  241. /**
  242. * 拼接化验项的文本结果
  243. *
  244. * @param lisKYJVO
  245. * @return
  246. */
  247. public List<String> getLisInputs(LisKYJVO lisKYJVO) {
  248. List<String> stringList = Lists.newArrayList();
  249. if (StringUtil.isBlank(lisKYJVO.getName())) {
  250. return stringList;
  251. } else if (lisKYJVO.getValue() != null) {
  252. //数值
  253. String lisText = lisKYJVO.getName() + "," + lisKYJVO.getValue() + " " + lisKYJVO.getUnits();
  254. stringList.add(lisText);
  255. //倍数
  256. if (StringUtil.isBlank(lisKYJVO.getMultipleState())) {
  257. lisText = lisKYJVO.getName() + "," + lisKYJVO.getMultipleState() + " " + lisKYJVO.getMultipleValue();
  258. stringList.add(lisText);
  259. }
  260. } else if (StringUtil.isBlank(lisKYJVO.getOtherValue())) {
  261. //阴性阳性和其他文字描述
  262. String lisText = lisKYJVO.getName() + "," + lisKYJVO.getOtherValue();
  263. stringList.add(lisText);
  264. }
  265. return stringList;
  266. }
  267. /**
  268. * 获取查体模板
  269. *
  270. * @param deptName
  271. * @param pushVO
  272. * @return
  273. */
  274. public List<QuestionDTO> getVitalModule(String deptName, PushVO pushVO) {
  275. List<QuestionDTO> vitalDTO = Lists.newLinkedList();
  276. QueryWrapper<DeptInfo> deptInfoQueryWrapper = new QueryWrapper<>();
  277. deptInfoQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey()).
  278. eq("name", deptName);
  279. DeptInfo deptInfo = deptInfoFacade.getOne(deptInfoQueryWrapper);
  280. if (deptInfo == null) {
  281. throw new CommonException(CommonErrorCode.NOT_EXISTS, "科室信息不存在");
  282. }
  283. QueryWrapper<DeptVital> deptVitalQueryWrapper = new QueryWrapper<>();
  284. deptVitalQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey()).
  285. eq("dept_id", deptInfo.getId());
  286. List<DeptVital> deptVitalList = deptVitalFacade.list(deptVitalQueryWrapper);
  287. if (deptVitalList.size() > 0) {
  288. Map<Long, DeptVital> deptVitalMap = EntityUtil.makeEntityMap(deptVitalList, "vitalId");
  289. //排序
  290. QueryWrapper<VitalOrder> vitalOrderQueryWrapper = new QueryWrapper<>();
  291. vitalOrderQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey()).
  292. in("question_id", deptVitalMap.keySet()).
  293. orderByAsc("order_no");
  294. List<VitalOrder> vitalOrderList = vitalOrderFacade.list(vitalOrderQueryWrapper);
  295. Map<Long, VitalOrder> vitalOrderMap = EntityUtil.makeEntityMap(vitalOrderList, "questionId");
  296. //标签列表
  297. for (Map.Entry<Long, VitalOrder> entry : vitalOrderMap.entrySet()) {
  298. QuestionVO questionVO = new QuestionVO();
  299. questionVO.setAge(pushVO.getAge());
  300. questionVO.setSexType(pushVO.getSex());
  301. questionVO.setId(entry.getKey());
  302. QuestionDTO questionDTO = questionFacade.getById(questionVO);
  303. if (questionDTO != null) {
  304. vitalDTO.add(questionDTO);
  305. }
  306. }
  307. }
  308. return vitalDTO;
  309. }
  310. }