InspectionsService.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. package thyyxxk.wxservice_server.service;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.apache.cxf.endpoint.Client;
  4. import org.apache.cxf.endpoint.Endpoint;
  5. import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
  6. import org.apache.cxf.service.model.BindingInfo;
  7. import org.apache.cxf.service.model.BindingOperationInfo;
  8. import org.dom4j.Document;
  9. import org.dom4j.DocumentException;
  10. import org.dom4j.DocumentHelper;
  11. import org.dom4j.Element;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.scheduling.annotation.Async;
  14. import org.springframework.stereotype.Service;
  15. import thyyxxk.wxservice_server.config.exception.ExceptionEnum;
  16. import thyyxxk.wxservice_server.dao.InspectionsDao;
  17. import thyyxxk.wxservice_server.pojo.ResultVo;
  18. import thyyxxk.wxservice_server.pojo.inspections.CheckExamParam;
  19. import thyyxxk.wxservice_server.pojo.inspections.ExamIndexResult;
  20. import thyyxxk.wxservice_server.pojo.inspections.detail.*;
  21. import thyyxxk.wxservice_server.utils.ResultVoUtil;
  22. import thyyxxk.wxservice_server.utils.StringUtil;
  23. import javax.xml.namespace.QName;
  24. import java.lang.reflect.Field;
  25. import java.lang.reflect.Method;
  26. import java.text.SimpleDateFormat;
  27. import java.util.*;
  28. import java.util.concurrent.CompletableFuture;
  29. @Slf4j
  30. @Service
  31. public class InspectionsService {
  32. private static final String SOAP_URL = "http://172.16.32.178:622/pushservice.asmx?wsdl";
  33. private final InspectionsDao dao;
  34. @Autowired
  35. public InspectionsService(InspectionsDao dao) {
  36. this.dao = dao;
  37. }
  38. @Async("asyncTask")
  39. public CompletableFuture<ResultVo<List<ExamIndexResult>>> getExamIndex(CheckExamParam param) {
  40. final String tjNo = dao.selectTjNo(param.getPatientId());
  41. final String inpatientNo = dao.selectInpatientNo(param.getPatientId());
  42. String sendHead1 = "<message><PATIENT_TYPE>0</PATIENT_TYPE><PTNT_NO>" + param.getPatientId() + "</PTNT_NO>";
  43. String sendHead2 = null;
  44. String sendHead3 = null;
  45. if (StringUtil.notBlank(tjNo)) {
  46. sendHead2 = "<message><PTNT_NO>" + tjNo + "</PTNT_NO>";
  47. }
  48. if (StringUtil.notBlank(inpatientNo)) {
  49. sendHead3 = "<message><PATIENT_TYPE>1</PATIENT_TYPE><PTNT_NO>" + inpatientNo + "</PTNT_NO>";
  50. }
  51. String sendEnd = "<START_TIME>" + param.getStart() + "</START_TIME><END_TIME>" + param.getEnd() + "</END_TIME></message>";
  52. String send1 = sendHead1 + sendEnd;
  53. String xml1 = invokeRemoteMethod("GetLabReportIndex", new Object[]{send1});
  54. List<ExamIndexResult> list1 = analyzeExamIndex(xml1.substring(1, xml1.length() - 1));
  55. if (null != sendHead2) {
  56. String send2 = sendHead2 + sendEnd;
  57. String xml2 = invokeRemoteMethod("GetLabReportIndex", new Object[]{send2});
  58. List<ExamIndexResult> list2 = analyzeExamIndex(xml2.substring(1, xml2.length() - 1));
  59. list1.addAll(list2);
  60. }
  61. if (null != sendHead3) {
  62. String send3 = sendHead3 + sendEnd;
  63. String xml3 = invokeRemoteMethod("GetLabReportIndex", new Object[]{send3});
  64. List<ExamIndexResult> list3 = analyzeExamIndex(xml3.substring(1, xml3.length() - 1));
  65. list1.addAll(list3);
  66. }
  67. return CompletableFuture.completedFuture(ResultVoUtil.success(list1));
  68. }
  69. @Async("asyncTask")
  70. public CompletableFuture<ResultVo<List<ExamIndexResult>>> checkAllIndexBySocialNo(String socialNo) {
  71. SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
  72. Date date = new Date();
  73. String start = df.format(date.getTime() - 15L * 24 * 60 * 60 * 1000);
  74. String end = df.format(date);
  75. String xmlEnd = "<START_TIME>" + start + "</START_TIME><END_TIME>" + end + "</END_TIME></message>";
  76. List<String> tjNos = dao.selectTjNos(socialNo);
  77. List<String> mzNos = dao.selectMzNos(socialNo);
  78. List<String> zyNos = dao.selectZyNos(socialNo);
  79. List<ExamIndexResult> results = new ArrayList<>();
  80. if (null != tjNos && tjNos.size() > 0) {
  81. for (String tjNo : tjNos) {
  82. String tjHead = "<message><PTNT_NO>" + tjNo + "</PTNT_NO>";
  83. String xml = invokeRemoteMethod("GetLabReportIndex", new Object[]{tjHead+xmlEnd});
  84. List<ExamIndexResult> list = analyzeExamIndex(xml.substring(1, xml.length() - 1));
  85. recognitionCovidExam(results, list);
  86. }
  87. }
  88. if (null != mzNos && mzNos.size() > 0) {
  89. for (String mzNo : mzNos) {
  90. String mzHead = "<message><PATIENT_TYPE>0</PATIENT_TYPE><PTNT_NO>" + mzNo + "</PTNT_NO>";
  91. String xml = invokeRemoteMethod("GetLabReportIndex", new Object[]{mzHead+xmlEnd});
  92. List<ExamIndexResult> list = analyzeExamIndex(xml.substring(1, xml.length() - 1));
  93. recognitionCovidExam(results, list);
  94. }
  95. }
  96. if (null != zyNos && zyNos.size() > 0) {
  97. for (String zyNo : zyNos) {
  98. String zyHead = "<message><PATIENT_TYPE>1</PATIENT_TYPE><PTNT_NO>" + zyNo + "</PTNT_NO>";
  99. String xml = invokeRemoteMethod("GetLabReportIndex", new Object[]{zyHead+xmlEnd});
  100. List<ExamIndexResult> list = analyzeExamIndex(xml.substring(1, xml.length() - 1));
  101. recognitionCovidExam(results, list);
  102. }
  103. }
  104. return CompletableFuture.completedFuture(ResultVoUtil.success(results));
  105. }
  106. private void recognitionCovidExam(List<ExamIndexResult> results, List<ExamIndexResult> list) {
  107. if (null != list) {
  108. for (ExamIndexResult index : list) {
  109. if (isCovidExam(index.getAPLY_CTNT())) {
  110. results.add(index);
  111. }
  112. }
  113. }
  114. }
  115. private boolean isCovidExam(String name) {
  116. return name.startsWith("新") && name.contains("冠") && name.endsWith("核酸检测");
  117. }
  118. @Async("asyncTask")
  119. public CompletableFuture<ResultVo<ExamDetailResult>> getExamDetail(String orderId) {
  120. if (StringUtil.isBlank(orderId) || "undefined".equals(orderId.trim())) {
  121. return CompletableFuture.completedFuture(ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "报告ID不能为空!"));
  122. }
  123. String send = "<message><ORDR_ID>" + orderId + "</ORDR_ID></message>";
  124. String xml = invokeRemoteMethod("GetLabReport", new Object[]{send});
  125. return CompletableFuture.completedFuture(analyzeExamDetail(xml.substring(1, xml.length() - 1)));
  126. }
  127. private String invokeRemoteMethod(String operation, Object[] parameters) {
  128. log.info("查询检验报告:方法:{},参数:{}", operation, parameters[0]);
  129. JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
  130. Client client = dcf.createClient(SOAP_URL);
  131. //处理webService接口和实现类namespace不同的情况,CXF动态客户端在处理此问题时,会报No operation was found with the name的异常
  132. Endpoint endpoint = client.getEndpoint();
  133. QName opName = new QName(endpoint.getService().getName().getNamespaceURI(), operation);
  134. BindingInfo bindingInfo = endpoint.getEndpointInfo().getBinding();
  135. if (bindingInfo.getOperation(opName) == null) {
  136. for (BindingOperationInfo operationInfo : bindingInfo.getOperations()) {
  137. if (operation.equals(operationInfo.getName().getLocalPart())) {
  138. opName = operationInfo.getName();
  139. break;
  140. }
  141. }
  142. }
  143. Object[] res = null;
  144. try {
  145. res = client.invoke(opName, parameters);
  146. } catch (Exception e) {
  147. e.printStackTrace();
  148. }
  149. return Arrays.toString(res);
  150. }
  151. private Element getReturnElement(String xml) {
  152. try {
  153. Document document = DocumentHelper.parseText(xml);
  154. Element root = document.getRootElement();
  155. return root.element("return");
  156. } catch (DocumentException e) {
  157. e.printStackTrace();
  158. }
  159. return null;
  160. }
  161. private List<ExamIndexResult> analyzeExamIndex(String xml) {
  162. Element retEle = getReturnElement(xml);
  163. if (retEle == null) {
  164. return new ArrayList<>();
  165. }
  166. Element codeEl = retEle.element("Code");
  167. String code = codeEl.getStringValue();
  168. if ("1".equals(code)) {
  169. List<ExamIndexResult> examList = new ArrayList<>();
  170. Element resEl = retEle.element("Result");
  171. List<Element> reports = resEl.elements("ReportList");
  172. reports.forEach(item -> {
  173. ExamIndexResult pojo = new ExamIndexResult();
  174. Field[] fields = pojo.getClass().getDeclaredFields();
  175. for (Field field : fields) {
  176. try {
  177. field.setAccessible(true);
  178. String name = field.getName();
  179. Method m = pojo.getClass().getMethod("set" + name, String.class);
  180. m.invoke(pojo, item.elementTextTrim(name));
  181. } catch (Exception e) {
  182. e.printStackTrace();
  183. }
  184. }
  185. examList.add(pojo);
  186. });
  187. return examList;
  188. } else {
  189. Element errorMsgEl = retEle.element("ErrorMsg");
  190. log.info("查询检验报告列表出错,{}", errorMsgEl.getStringValue());
  191. return new ArrayList<>();
  192. }
  193. }
  194. private ResultVo<ExamDetailResult> analyzeExamDetail(String xml) {
  195. Element retEle = getReturnElement(xml);
  196. ExamDetailResult detail = new ExamDetailResult();
  197. if (retEle == null) {
  198. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "结果集为空!");
  199. }
  200. String code = retEle.elementTextTrim("Code");
  201. if ("0".equals(code)) {
  202. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, retEle.elementTextTrim("ErrorMsg"));
  203. }
  204. Element reportListEle = retEle.element("Result").element("ReportList");
  205. ReportHeader header = new ReportHeader();
  206. detail.setReportHeader((ReportHeader) reflect(header, reportListEle.element("ReportHeader")));
  207. List<ReportItem> reportItems = new ArrayList<>();
  208. List<Element> reportItemElements = reportListEle.elements("ReportItem");
  209. reportItemElements.forEach(reportItemElement -> {
  210. ReportItem reportItem = new ReportItem();
  211. reflect(reportItem, reportItemElement);
  212. List<Element> bacteriaResultElements = reportItemElement.elements("BacteriaResult");
  213. if (bacteriaResultElements.size() > 0) {
  214. List<BacteriaResult> bacteriaResults = new ArrayList<>();
  215. bacteriaResultElements.forEach(bacterialResultElement -> {
  216. BacteriaResult bacteriaResult = new BacteriaResult();
  217. reflect(bacteriaResult, bacterialResultElement);
  218. List<Element> antibioticResultElements = bacterialResultElement.elements("AntibioticResult");
  219. if (antibioticResultElements.size() > 0) {
  220. List<AntibioticResult> antibioticResults = new ArrayList<>();
  221. antibioticResultElements.forEach(antibioticResultElement -> {
  222. AntibioticResult antibioticResult = new AntibioticResult();
  223. antibioticResults.add((AntibioticResult) reflect(antibioticResult, antibioticResultElement));
  224. });
  225. bacteriaResult.setAntibioticResults(antibioticResults);
  226. }
  227. if (StringUtil.notBlank(bacteriaResult.getBAC_ID())) {
  228. bacteriaResults.add(bacteriaResult);
  229. }
  230. });
  231. reportItem.setBacteriaResults(bacteriaResults);
  232. }
  233. if (StringUtil.notBlank(reportItem.getITM_VALUE()) || StringUtil.notBlank(reportItem.getITM_STR_VALUE())
  234. || reportItem.getBacteriaResults().size() > 0) {
  235. reportItems.add(reportItem);
  236. }
  237. });
  238. detail.setReportItems(reportItems);
  239. return ResultVoUtil.success(detail);
  240. }
  241. private Object reflect(Object pojo, Element element) {
  242. Field[] fields = pojo.getClass().getDeclaredFields();
  243. for (Field field : fields) {
  244. try {
  245. String name = field.getName();
  246. if ("bacteriaResults".equals(name) || "antibioticResults".equals(name)) {
  247. continue;
  248. }
  249. Method m = pojo.getClass().getMethod("set" + name, String.class);
  250. m.invoke(pojo, element.elementTextTrim(name));
  251. } catch (Exception e) {
  252. e.printStackTrace();
  253. }
  254. }
  255. return pojo;
  256. }
  257. }