Index: ssts-web/src/main/webapp/disinfectsystem/config/gdszyy/spring/HIS.xml =================================================================== diff -u -r28971 -r30628 --- ssts-web/src/main/webapp/disinfectsystem/config/gdszyy/spring/HIS.xml (.../HIS.xml) (revision 28971) +++ ssts-web/src/main/webapp/disinfectsystem/config/gdszyy/spring/HIS.xml (.../HIS.xml) (revision 30628) @@ -60,7 +60,7 @@ - + + + Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdszyy/WebServiceClientHelper.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdszyy/WebServiceClientHelper.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdszyy/WebServiceClientHelper.java (revision 30628) @@ -0,0 +1,167 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.gdszyy; + +import java.nio.charset.Charset; +import java.util.Date; + +import org.apache.commons.lang.StringUtils; +import org.apache.http.HttpEntity; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; +import org.apache.log4j.Logger; + +import com.forgon.tools.date.DateTools; + +/** + * 广东省中医院webservice帮助类 + * @author ZhouPeiMian + * @since 2021-02-24 + * + */ +public class WebServiceClientHelper { + + public static Logger logger = Logger.getLogger(WebServiceClientHelper.class); + + /** + * 构建请求参数 + * @param action + * @param hospitalNum + * @param surgeryPlanBeginTime + * @param surgeryPlanEndTime + * @return + */ + public static String buildInputString(String action, String hospitalNum, Date surgeryPlanBeginTime, Date surgeryPlanEndTime) { + if(StringUtils.equals(DatasyncConstant.MethodName_HospitalNumber, action)){ + StringBuffer input = new StringBuffer(); + input.append(""); + input.append(""); + input.append("1"); + input.append("XDGY"); + input.append("XDGY_0127"); + input.append("BS02004"); + input.append("BS02004S47001"); + input.append("GZ"); + input.append(""); + input.append(""); + input.append("BS02004"); + input.append("BS02004S47001"); + input.append("S47"); + input.append("S00"); + input.append("" + DateTools.getCurrentDayByFormat(DateTools.COMMON_DATE_HMS) + ""); + input.append(""); + input.append(""); + input.append("0"); + input.append("500"); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + + input.append("" + hospitalNum + ""); + + input.append(""); + input.append(""); + input.append("" + DateTools.getFormatDateStr(surgeryPlanBeginTime, DateTools.COMMON_DATE_HMS) + ""); + input.append("" + DateTools.getFormatDateStr(surgeryPlanEndTime, DateTools.COMMON_DATE_HMS) + ""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append(""); + input.append("]]>"); + + return input.toString(); + } + return null; + } + + /** + * 构建请求信息 + * @param action + * @param hospitalNum + * @return + */ + public static String buildRequestString(String action, String hospitalNum) { + Date startTime = new Date(); + Date endTime = new Date(); + // 手术计划时间范围为30天 + endTime.setTime(startTime.getTime() + 30*24*60*60*1000L); + StringBuffer request = new StringBuffer(); + request.append(""); + request.append(""); + request.append(""); + request.append(""); + request.append(""); + request.append(buildInputString(action, hospitalNum, startTime, endTime)); + request.append(""); + request.append(""); + request.append(""); + request.append(""); + return request.toString(); + } + + /** + * 使用SOAP1.2发送消息 + * @param postUrl + * @param soapXml + * @param soapAction + * @return + */ + public static String doPostSoap1_2(String postUrl, String soapXml, String soapAction) { + String retStr = ""; + // 创建HttpClientBuilder + HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); + // HttpClient + CloseableHttpClient closeableHttpClient = httpClientBuilder.build(); + HttpPost httpPost = new HttpPost(postUrl); + // 设置请求和传输超时时间 + RequestConfig requestConfig = RequestConfig.custom() + .setSocketTimeout(3000000) + .setConnectTimeout(3000000).build(); + httpPost.setConfig(requestConfig); + try { + httpPost.setHeader("Content-Type", "application/soap+xml;charset=UTF-8;"); + httpPost.setHeader("action", soapAction); + StringEntity data = new StringEntity(soapXml,Charset.forName("UTF-8")); + httpPost.setEntity(data); + CloseableHttpResponse response = closeableHttpClient.execute(httpPost); + HttpEntity httpEntity = response.getEntity(); + if (httpEntity != null) { + // 打印响应内容 + retStr = EntityUtils.toString(httpEntity, "UTF-8"); + retStr = retStr.replaceAll("<", "<"); + retStr = retStr.replaceAll(">", ">"); + } + // 释放资源 + closeableHttpClient.close(); + } catch (Exception e) { + logger.info("exception in doPostSoap1_2:" + e); + } + return retStr; + } + +} Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdszyy/DatasyncConstant.java =================================================================== diff -u -r26593 -r30628 --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdszyy/DatasyncConstant.java (.../DatasyncConstant.java) (revision 26593) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdszyy/DatasyncConstant.java (.../DatasyncConstant.java) (revision 30628) @@ -33,4 +33,16 @@ // OES的院区编号-->追溯系统的科室编号 DEPARTCODE.put("100101", "0010301902"); } + /** + * 住院号获取病人信息webservice接口 http://192.9.200.84:7829/Ewell_WS_S47 + */ + public static String WebserviceAddress = "http://192.9.200.84:7829/Ewell_WS_S47"; + /** + * 住院号获取病人信息webservice接口名称 + */ + public static String MethodName_HospitalNumber = "OperationA"; + /** + * 请求成功的提示信息: 成功 + */ + public static String Result_Success = "成功"; } Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdszyy/FindPatientInfoByHospitalNumDaoImpl.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdszyy/FindPatientInfoByHospitalNumDaoImpl.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdszyy/FindPatientInfoByHospitalNumDaoImpl.java (revision 30628) @@ -0,0 +1,275 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.gdszyy; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Comparator; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; +import org.dom4j.Node; +import org.dom4j.XPath; + +import com.forgon.disinfectsystem.datasynchronization.dao.FindPatientInfoByHospitalNumDao; +import com.forgon.disinfectsystem.datasynchronization.model.PatientInfoVO; + +/** + * 根据住院号查询病人信息(广东省中医院) + * @author ZhouPeiMian + * @since 2021-02-24 + * + */ +public class FindPatientInfoByHospitalNumDaoImpl implements + FindPatientInfoByHospitalNumDao { + + Logger logger = Logger.getLogger(FindPatientInfoByHospitalNumDaoImpl.class); + + @Override + public PatientInfoVO[] findPatientInfoByHospitalNum(String hospitalNum) { + String requestXml = WebServiceClientHelper.buildRequestString(DatasyncConstant.MethodName_HospitalNumber, hospitalNum); + logger.info("住院号病人同步接口请求信息:" + requestXml); + String responce = null; + try { + responce = WebServiceClientHelper.doPostSoap1_2(DatasyncConstant.WebserviceAddress, requestXml, ""); + logger.info("住院号病人同步接口返回信息:" + responce); + /*responce = "" + + "0成功" + + "879668867303761490376149" + + "8796325537942122597527584768田咪咪05-2521岁" + + "440102199806050236" + + "2020-05-15 14:35:41.0" + + "2020-05-15 14:35:35.02020-05-25 14:35:35.0" + + "ZYSSS0101" + + "2807赵代鑫" + + "SURG.62.3 01.00001睾丸部分切除术,单侧" + + "1337李子花1399" + + "刘晖明2200" + + "手术室2807赵代鑫" + + "8880966测试科" + + "966测试科" + + "" + + "879668867303761490376149" + + "8796325537942122597527584768田咪咪05-1821岁" + + "440102199806050236" + + "2020-05-15 14:35:41.0" + + "2020-05-15 14:35:35.02020-05-18 14:35:35.0" + + "ZYSSS0101" + + "2807赵代鑫" + + "SURG.62.3 01.00001睾丸部分切除术,单侧" + + "1337李子花1399" + + "刘晖明2200" + + "手术室2807赵代鑫" + + "8880966测试科" + + "966测试科" + + "" + + "" + + "]]>";*/ + } catch (Exception e1) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + e1.printStackTrace(new PrintStream(baos)); + String exception = baos.toString(); + logger.info("连接消息队列失败!" + exception); + } + + if (StringUtils.isNotBlank(responce)) { + int startIndex = responce.indexOf(""); + if(startIndex == -1){ + logger.info("住院病人接口返回信息没有标签!"); + return null; + } + int endIndex = responce.indexOf(""); + if(endIndex == -1 || endIndex < startIndex){ + logger.info("住院病人接口返回信息没有标签"); + return null; + } + responce = "" + responce.substring(startIndex + "".length(), endIndex) + ""; + // 开始解析 + try { + Document document = DocumentHelper.parseText(responce); + String RetConXpath = "/Response/RetInfo/RetCon"; // 查询结果返回提示信息 + String RetCodeXpath = "/Response/RetInfo/RetCode"; // 查询结果返回状态 + String RetCon = processDataByXpath(document, RetConXpath); + String RetCode = processDataByXpath(document, RetCodeXpath); + if (DatasyncConstant.Result_Success.equals(RetCon)) { + // 解析住院病人信息并入库 + String MsgXpath = "/Response/MsgInfo/Msg"; // 返回结果可能存在多条住院病人信息 + XPath xpath = document.createXPath(MsgXpath); + @SuppressWarnings("unchecked") + List nodeList2 = xpath.selectNodes(document, xpath); + if (nodeList2 != null && nodeList2.size() > 0) { + List patientInfoVOList = new LinkedList(); + // 解析返回信息中所有住院病人信息 + for (int i = 1; i <= nodeList2.size(); i++) { + String msgXpath = "/Response/MsgInfo/Msg[" + i + "]"; + // 解析住院病人信息并入库 + String hospitalNumberXpath = msgXpath + "/INHOSP_INDEX_NO"; // 住院号 + String serialNumberXpath = msgXpath + "/SURGERY_APPLY_ID"; // 手术申请ID + String visitAmountXpath = msgXpath + "/INHOSP_NUM"; // 住院次数 + String washHandNurseXpath = msgXpath + "/INSTRUMENT_NURSE_NAME"; // 洗手护士 + String circuitNurseXpath = msgXpath + "/TOUR_NURSE_NAME"; // 巡回护士 + String patientNameXpath = msgXpath + "/PAT_NAME"; // 姓名 + String ageXpath = msgXpath + "/AGE"; // 年龄 + String patientSexXpath = msgXpath + "/PHYSI_SEX_NAME"; // 性别 + String ascriptionDepartmentXpath = msgXpath + "/APPLY_DEPT_NAME";// 病人所在科室 + String bedRoomXpath = msgXpath + "/BED_NAME"; // 床位 + String patientIDCardXpath = msgXpath + "/ID_NUMBER"; // 身份证 + String doctorNameXpath = msgXpath + "/SURGERY_DR_NAME"; // 手术医生(主刀) + String operationXpath = msgXpath + "/SurgeryInfo/SURGERY_OPER_NAME";// 手术名称(主要操作) + String operationScheduleIdXpath = msgXpath + "/APPLI_FORM_NO"; // 手术单号 + String operationTimeXpath = msgXpath + "/SURGERY_DATETIME"; // 手术日期 + String opRoomIdXpath = msgXpath + "/SURGERY_ROOM_NAME"; // 手术室名称 + String visitDateXpath = msgXpath + "/SURGERY_PLAN_BEGIN_DATETIME"; + + String hospitalNumber = processDataByXpath(document, hospitalNumberXpath); + String serialNumber = processDataByXpath(document, serialNumberXpath); + String visitAmount = processDataByXpath(document, visitAmountXpath); + String washHandNurse = processDataByXpath(document, washHandNurseXpath); + String circuitNurse = processDataByXpath(document, circuitNurseXpath); + String patientName = processDataByXpath(document, patientNameXpath); + String age = processDataByXpath(document, ageXpath); + String patientSex = processDataByXpath(document, patientSexXpath); + String ascriptionDepartment = processDataByXpath(document, ascriptionDepartmentXpath); + String bedNumber = processDataByXpath(document, bedRoomXpath); + String patientIDCard = processDataByXpath(document, patientIDCardXpath); + String doctorName = processDataByXpath(document, doctorNameXpath); + String operation = processDataByXpath(document, operationXpath); + String operationScheduleId = processDataByXpath(document, operationScheduleIdXpath); + String operationTime = processDataByXpath(document, operationTimeXpath); + if (StringUtils.isNotBlank(operationTime)) { + operationTime = operationTime.replace("T", " "); + } + String opRoomId = processDataByXpath(document, opRoomIdXpath); + String visitDate = processDataByXpath(document, visitDateXpath); // 记录录入时间 + if (StringUtils.isNotBlank(visitDate)) { + visitDate = visitDate.replace("T", " "); + } + + PatientInfoVO patientInfoVO = new PatientInfoVO(); + patientInfoVO.setHospitalNumber(hospitalNumber); + patientInfoVO.setSerialNumber(serialNumber); + patientInfoVO.setVisitAmount(visitAmount); + patientInfoVO.setWashHandNurse(washHandNurse); + patientInfoVO.setCircuitNurse(circuitNurse); + patientInfoVO.setPatientName(patientName); + patientInfoVO.setPatientAge(age); + patientInfoVO.setPatientSex(patientSex); + patientInfoVO.setAscriptionDepartment(ascriptionDepartment); + patientInfoVO.setBedNumber(bedNumber); + patientInfoVO.setPatientIDCard(patientIDCard); + patientInfoVO.setDoctorName(doctorName); + patientInfoVO.setOperation(operation); + patientInfoVO.setOperationScheduleId(operationScheduleId); + patientInfoVO.setOperationTime(operationTime); + patientInfoVO.setOpRoomId(opRoomId); + patientInfoVO.setVisitDate(visitDate); + patientInfoVO.setVisitId(StringUtils.isBlank(visitAmount) ? null : Long.valueOf(visitAmount)); + + if (!checkObjAllFieldsIsNull(patientInfoVO)) { + patientInfoVOList.add(patientInfoVO); + } + } + if (CollectionUtils.isNotEmpty(patientInfoVOList)) { + // 根据记录手术时间operationTime升序排序,只取距离当前时间最近的记录 + patientInfoVOList.sort(new Comparator() { + @Override + public int compare(PatientInfoVO o1, PatientInfoVO o2) { + if (StringUtils.isBlank(o1.getVisitDate()) && StringUtils.isNotBlank(o2.getVisitDate())) { + return -1; + } + if (StringUtils.isBlank(o2.getVisitDate()) && StringUtils.isNotBlank(o1.getVisitDate())) { + return 1; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + Date date1 = sdf.parse(o1.getVisitDate()); + Date date2 = sdf.parse(o2.getVisitDate()); + return date1.compareTo(date2); + } catch (ParseException e) { + logger.debug("病人信息排序出错(手术时间【operationTime】字段格式错误)!"); + e.printStackTrace(); + } + return 0; + } + }); + // 只取最新录入的一条记录 + PatientInfoVO[] patientInfoArray = {patientInfoVOList.get(0)}; + logger.debug("完成解析住院病人信息,住院号为:" + patientInfoVOList.get(0).getHospitalNumber()); + return patientInfoArray; + } + } else { + logger.debug("查询返回的数据不包含住院病人信息!"); + return null; + } + } else { + logger.debug("查询失败!【RetCon】 = " + RetCon + ",【RetCode】= " + RetCode); + return null; + } + } catch (Exception e) { + e.printStackTrace(); + } + } else { + logger.debug("查询住院病人信息失败,未找到住院号为:【" + hospitalNum + "】的住院病人信息!"); + return null; + } + logger.debug("查询失败!"); + return null; + } + + @Override + public PatientInfoVO[] findPatientInfoByHospitalNumBeforeOperation( + String clinicNumber) { + return findPatientInfoByHospitalNum(clinicNumber); + } + + /** + * 根据document和Xpath表达式解析数据 + * @param document + * @param nameSpaceURIMap + * @param xpathExp + * @return + */ + public static String processDataByXpath(Document document, String xpathExp) { + if ((StringUtils.isNotBlank(xpathExp)) && (document != null)) { + XPath xpath = document.createXPath(xpathExp); + Node node = xpath.selectSingleNode(document); + if (node != null) { + return node.getStringValue(); + } + } + return null; + } + + /** + * 判断实体对象是否为空、对象所有非静态属性是否都为空 + * @param object + * @return + */ + public static boolean checkObjAllFieldsIsNull (Object object) { + if (null == object) { + return true; + } + try { + for (Field f : object.getClass().getDeclaredFields()) { + f.setAccessible(true); + if (f.get(object) != null && + StringUtils.isNotBlank(f.get(object).toString()) && + !Modifier.isStatic(f.getModifiers())) { + return false; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + +}