Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/nfykdxnfyy/DatasyncConstant.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/nfykdxnfyy/DatasyncConstant.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/nfykdxnfyy/DatasyncConstant.java (revision 29499) @@ -0,0 +1,36 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.nfykdxnfyy; + +/** + * 南方医院接口相关常量 + * @author ZhouPeiMian + * @since 2020-11-05 + * + */ +public class DatasyncConstant { + + /** + * Webservice地址 + */ + public final static String WebserviceAddress = "http://192.168.128.170/csp/hsb/DHC.Published.PUB0028.BS.PUB0028.CLS?WSDL=1"; + + /** + * 按病人ID号查询病人信息的服务编码 + */ + public final static String ServiceCode_PATPatientID = "S0096"; + + /** + * 按病人就诊号查询手术信息的服务编码 + */ + public final static String ServiceCode_AdmNo = "MES0033"; + + /** + * 病人信息查询成功标识 + */ + public final static Integer ResultCode_Success = 0; + + /** + * 病人信息查询失败标识 + */ + public final static Integer ResultCode_Fail = -1; + +} Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/nfykdxnfyy/FindPatientInfoByTreatmentNumDaoImpl.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/nfykdxnfyy/FindPatientInfoByTreatmentNumDaoImpl.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/nfykdxnfyy/FindPatientInfoByTreatmentNumDaoImpl.java (revision 29499) @@ -0,0 +1,32 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.nfykdxnfyy; + +import org.apache.log4j.Logger; + +import com.forgon.disinfectsystem.datasynchronization.dao.FindPatientInfoByHospitalNumDao; +import com.forgon.disinfectsystem.datasynchronization.dao.FindPatientInfoByTreatmentNumDao; +import com.forgon.disinfectsystem.datasynchronization.model.PatientInfoVO; + +/** + * 根据诊疗号查询病人信息(南方医院) + * @author ZhouPeiMian + * @since 2020-11-05 + * + */ +public class FindPatientInfoByTreatmentNumDaoImpl implements + FindPatientInfoByTreatmentNumDao { + + Logger logger = Logger.getLogger(FindPatientInfoByTreatmentNumDaoImpl.class); + + private FindPatientInfoByHospitalNumDao findPatientInfoByHospitalNumDao; + + public void setFindPatientInfoByHospitalNumDao( + FindPatientInfoByHospitalNumDao findPatientInfoByHospitalNumDao) { + this.findPatientInfoByHospitalNumDao = findPatientInfoByHospitalNumDao; + } + + @Override + public PatientInfoVO[] findPatientInfoByTreatmentNum(String clinicNumber) { + return findPatientInfoByHospitalNumDao.findPatientInfoByHospitalNum(clinicNumber); + } + +} Index: ssts-web/src/main/webapp/disinfectsystem/config/nfykdxnfyy/spring/HIS.xml =================================================================== diff -u -r29491 -r29499 --- ssts-web/src/main/webapp/disinfectsystem/config/nfykdxnfyy/spring/HIS.xml (.../HIS.xml) (revision 29491) +++ ssts-web/src/main/webapp/disinfectsystem/config/nfykdxnfyy/spring/HIS.xml (.../HIS.xml) (revision 29499) @@ -60,31 +60,6 @@ - - - - - - - - - - - - - - - - - - - - - - - @@ -115,5 +90,10 @@ - + + + + + + \ No newline at end of file Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/nfykdxnfyy/WebServiceClientHelper.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/nfykdxnfyy/WebServiceClientHelper.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/nfykdxnfyy/WebServiceClientHelper.java (revision 29499) @@ -0,0 +1,111 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.nfykdxnfyy; + +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.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.vo.LoginUserData; +import com.forgon.tools.date.DateTools; + +/** + * 南方医院webservice帮助类 + * @author ZhouPeiMian + * @since 2020-11-05 + * + */ +public class WebServiceClientHelper { + + public static Logger logger = Logger.getLogger(WebServiceClientHelper.class); + + /** + * 构造接口输入参数 + * @param serviceCode + * @param arg + * @return + */ + public static String buildInputString(String serviceCode, String... arg){ + String inputXml = ""; + LoginUserData loginUserData = AcegiHelper.getLoginUser(); + String ExtUserID = loginUserData.getUserName(); + if(StringUtils.equals(serviceCode, DatasyncConstant.ServiceCode_PATPatientID)){ + StringBuffer inputXmlSB = new StringBuffer(); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append("" + serviceCode + ""); + inputXmlSB.append("丁香软件" + arg[0] + "" + ExtUserID + "" + DateTools.getFormatDateStr(new Date(), "yyyy-MM-dd") + "" + DateTools.getCurrentYearEnd() + "]]>"); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXml = inputXmlSB.toString(); + }else if(StringUtils.equals(serviceCode, DatasyncConstant.ServiceCode_AdmNo)){ + StringBuffer inputXmlSB = new StringBuffer(); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append("" + serviceCode + ""); + inputXmlSB.append("丁香软件" + ExtUserID + "" + arg[0] + "]]>"); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXml = inputXmlSB.toString(); + }else { + throw new RuntimeException("服务编码错误:" + serviceCode); + } + return inputXml; + } + + /** + * 使用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", "HIPMessageServer"); + 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(">", ">"); + 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/nfykdxnfyy/FindPatientInfoByHospitalNumDaoImpl.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/nfykdxnfyy/FindPatientInfoByHospitalNumDaoImpl.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/nfykdxnfyy/FindPatientInfoByHospitalNumDaoImpl.java (revision 29499) @@ -0,0 +1,350 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.nfykdxnfyy; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Date; +import java.util.List; + +import net.sf.json.JSON; +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import net.sf.json.xml.XMLSerializer; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; + +import com.forgon.disinfectsystem.datasynchronization.dao.FindPatientInfoByHospitalNumDao; +import com.forgon.disinfectsystem.datasynchronization.model.PatientInfoVO; + +/** + * 根据住院号查询病人信息(南方医院) + * @author ZhouPeiMian + * @since 2020-11-05 + * + */ +public class FindPatientInfoByHospitalNumDaoImpl implements + FindPatientInfoByHospitalNumDao { + + Logger logger = Logger.getLogger(FindPatientInfoByHospitalNumDaoImpl.class); + + @Override + public PatientInfoVO[] findPatientInfoByHospitalNum(String hospitalNum) { + try { + String inputXml = WebServiceClientHelper.buildInputString(DatasyncConstant.ServiceCode_PATPatientID, hospitalNum); + logger.info("病人信息同步接口请求信息:" + inputXml); + String result = WebServiceClientHelper.doPostSoap1_2(DatasyncConstant.WebserviceAddress, inputXml, ""); + /*String result = "" + + "" + + "" + + "" + + "" + + "0" + + "2" + + "" + + "" + + "10356076" + + "001622496" + + "张剑萍" + + "" + + "63岁9月9天" + + "15360328272" + + "440726195701133727" + + "I" + + "住院" + + "SNYD" + + "省内异地" + + "220402" + + "创伤骨外科病房" + + "0405" + + "林昂如" + + "2020-09-14 18:13:56" + + "2020-09-30 10:38:01" + + "xp1" + + "项平" + + "2020-09-30 10:38:04" + + "" + + "" + + "]]>" + + "" + + "" + + "" + + "";*/ + logger.info("病人信息同步接口返回信息:" + result); + int startIndex = result.indexOf(""); + if(startIndex == -1){ + return null; + } + int endIndex = result.indexOf(""); + if(endIndex == -1 || endIndex < startIndex){ + return null; + } + String xmlString = result.substring(startIndex + "".length(), endIndex); + XMLSerializer xmlSerializer = new XMLSerializer(); + JSON json = xmlSerializer.read("" + xmlString + ""); + JSONObject patientInfos = json.isArray() ? ((JSONArray)json).getJSONObject(0) : (JSONObject)json; + if(patientInfos != null){ + Integer status = patientInfos.optInt("ResultCode", -1); + if(DatasyncConstant.ResultCode_Success.intValue() != status.intValue()){ + logger.info("根据病人ID号查询病人信息失败:ResultCode = " + status + "; Message = " + patientInfos.optString("ErrorMsg")); + return null; + } + Object patientInfoObj = patientInfos.opt("AdmNoList"); + JSONArray patientInfoArr = null; + if(patientInfoObj instanceof JSONArray){ + patientInfoArr = (JSONArray) patientInfoObj; + }else if(patientInfoObj instanceof JSONObject){ + patientInfoArr = new JSONArray(); + patientInfoArr.add(patientInfoObj); + } + if(patientInfoArr != null && patientInfoArr.size() > 0){ + List patientInfoVOList = new ArrayList(); + for (Object object : patientInfoArr) { + JSONObject patientObject = (JSONObject) object; + JSONObject patientInfo = patientObject.optJSONObject("AdmNoInfo"); + Object tNumber = patientInfo.opt("PATPatientID"); + Object patientName = patientInfo.opt("Name"); + Object patientAge = patientInfo.opt("Age"); + Object patientSex = patientInfo.opt("Sex"); + Object patientIDCard = patientInfo.opt("CreditID"); + // 临时存储病人就诊号,用于查询手术信息 + Object AdmNo = patientInfo.opt("AdmNo"); + Object remark = patientInfo.opt("remark"); + Object updateTime = patientInfo.opt("UpdateTime"); + + PatientInfoVO vo = new PatientInfoVO(); + vo.setPatientNumber(tNumber instanceof String ? (String)tNumber : ""); + vo.setHospitalNumber(vo.getPatientNumber()); + vo.setPatientName(patientName instanceof String ? (String)patientName : ""); + vo.setPatientAge(patientAge instanceof String ? (String)patientAge : ""); + vo.setPatientSex(patientSex instanceof String ? ((String)patientSex).trim() : ""); + vo.setPatientIDCard(patientIDCard instanceof String ? (String)patientIDCard : ""); + vo.setAdmNo(AdmNo instanceof String ? (String)AdmNo : ""); + vo.setRemark(remark instanceof String ? (String)remark : ""); + vo.setOperationTime(updateTime instanceof String ? (String)updateTime : ""); + + patientInfoVOList.add(vo); + } + if (CollectionUtils.isNotEmpty(patientInfoVOList)) { + // 根据记录手术时间operationTime排序,只取最新记录 + patientInfoVOList.sort(new Comparator() { + @Override + public int compare(PatientInfoVO o1, PatientInfoVO o2) { + if (StringUtils.isBlank(o1.getOperationTime()) && StringUtils.isNotBlank(o2.getOperationTime())) { + return -1; + } + if (StringUtils.isBlank(o2.getOperationTime()) && StringUtils.isNotBlank(o1.getOperationTime())) { + return 1; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + Date date1 = sdf.parse(o1.getOperationTime()); + Date date2 = sdf.parse(o2.getOperationTime()); + return date2.compareTo(date1); + } catch (ParseException e) { + logger.debug("病人信息排序出错(手术时间【operationTime】字段格式错误)!"); + e.printStackTrace(); + } + return 0; + } + }); + // 只取最新录入的一条记录 + logger.debug("完成解析病人信息,病人ID号为:" + patientInfoVOList.get(0).getHospitalNumber()); + PatientInfoVO patientInfoVO = patientInfoVOList.get(0); + // 根据患者就诊号查询手术信息 + findOperationInfoByPatientInfoVO(patientInfoVO); + PatientInfoVO[] patientInfoArray = {patientInfoVO}; + return patientInfoArray; + } + return null; + } + } + } catch (Exception e) { + logger.error("根据病人ID号查询病人信息失败" + e); + e.printStackTrace(); + } + return null; + } + + /** + * 根据患者就诊号查询手术信息 + * @param patientInfoVO + */ + private void findOperationInfoByPatientInfoVO(PatientInfoVO patientInfoVO) { + if(patientInfoVO == null || StringUtils.isBlank(patientInfoVO.getAdmNo())){ + return; + } + String AdmNo = patientInfoVO.getAdmNo(); + try { + String inputXml = WebServiceClientHelper.buildInputString(DatasyncConstant.ServiceCode_AdmNo, AdmNo); + logger.info("手术信息同步接口请求信息:" + inputXml); + String result = WebServiceClientHelper.doPostSoap1_2(DatasyncConstant.WebserviceAddress, inputXml, ""); + /*String result = "" + + "" + + "" + + "" + + "" + + "0" + + "1" + + "" + + "" + + "" + + "" + + "6165550" + + "34130972" + + "895307" + + "10356076" + + "I" + + "102954" + + "78.6101" + + "锁骨内固定装置去除术" + + "400902" + + "聚焦刀门诊" + + "58" + + "2020-09-23 09:20:51" + + "2020-09-24 11:20:00" + + "2020-09-24 12:29:00" + + "221103" + + "03" + + "3" + + "二级手术" + + "220402" + + "创伤骨外科病房" + + "2180" + + "相大勇" + + "余斌" + + "" + + "" + + "全麻" + + "廖志婕" + + "" + + "10" + + "0" + + "I级" + + "" + + "" + + "1" + + "1" + + "1" + + "" + + "" + + "" + + "" + + "]]>" + + "" + + "" + + "" + + "";*/ + logger.info("手术信息同步接口返回信息:" + result); + int startIndex = result.indexOf(""); + if(startIndex == -1){ + return; + } + int endIndex = result.indexOf(""); + if(endIndex == -1 || endIndex < startIndex){ + return; + } + String xmlString = result.substring(startIndex + "".length(), endIndex); + XMLSerializer xmlSerializer = new XMLSerializer(); + JSON json = xmlSerializer.read("" + xmlString + ""); + JSONObject opeartionInfos = json.isArray() ? ((JSONArray)json).getJSONObject(0) : (JSONObject)json; + if(opeartionInfos != null){ + Integer status = opeartionInfos.optInt("ResultCode", -1); + if(DatasyncConstant.ResultCode_Success.intValue() != status.intValue()){ + logger.info("根据病人就诊号查询手术信息失败:ResultCode = " + status + "; Message = " + opeartionInfos.optString("ErrorMsg")); + return; + } + Object opeartionInfoObj = opeartionInfos.opt("OperationAppInfoList"); + JSONArray opeartionInfoArr = null; + if(opeartionInfoObj instanceof JSONArray){ + opeartionInfoArr = (JSONArray) opeartionInfoObj; + }else if(opeartionInfoObj instanceof JSONObject){ + opeartionInfoArr = new JSONArray(); + opeartionInfoArr.add(opeartionInfoObj); + } + if(opeartionInfoArr != null && opeartionInfoArr.size() > 0){ + List opeartionInfoVOList = new ArrayList(); + for (Object object : opeartionInfoArr) { + JSONObject opeartionObject = (JSONObject) object; + JSONObject opeartionInfo = opeartionObject.optJSONObject("OperationAppInfo"); + Object OperRoom = opeartionInfo.opt("OperRoom"); + Object doctorName = opeartionInfo.opt("DoctorDesc"); + Object operation = opeartionInfo.opt("OperDesc"); + Object DeptDesc = opeartionInfo.opt("DeptDesc"); + Object operationTime = opeartionInfo.opt("ScheduledST");// + //Object patientArea = opeartionInfo.opt("patientArea"); + Object bedNumber = opeartionInfo.opt("BedNo"); + Object roomNumber = opeartionInfo.opt("OperRoomNo"); + + Object washHandNurse = opeartionInfo.opt("FirstAss"); + Object circuitNurse = opeartionInfo.opt("SecondAss"); + + PatientInfoVO vo = new PatientInfoVO(); + vo.setDoctorName(doctorName instanceof String ? (String)doctorName : ""); + vo.setOperation(operation instanceof String ? (String)operation : ""); + vo.setOpRoomId(OperRoom instanceof String ? (String)OperRoom : ""); + vo.setOperationTime(operationTime instanceof String ? ((String)operationTime).replace(".", "-") : ""); + //vo.setPatientArea(patientArea instanceof String ? (String)patientArea : ""); + vo.setBedNumber(bedNumber instanceof String ? (String)bedNumber : ""); + vo.setRoomNumber(roomNumber instanceof String ? (String)roomNumber : ""); + + vo.setWashHandNurse(washHandNurse instanceof String ? (String)washHandNurse : ""); + vo.setCircuitNurse(circuitNurse instanceof String ? (String)circuitNurse : ""); + vo.setAscriptionDepartment(DeptDesc instanceof String ? (String)DeptDesc : ""); + opeartionInfoVOList.add(vo); + } + if (CollectionUtils.isNotEmpty(opeartionInfoVOList)) { + // 根据记录手术时间operationTime排序,只取最新记录 + opeartionInfoVOList.sort(new Comparator() { + @Override + public int compare(PatientInfoVO o1, PatientInfoVO o2) { + if (StringUtils.isBlank(o1.getOperationTime()) && StringUtils.isNotBlank(o2.getOperationTime())) { + return -1; + } + if (StringUtils.isBlank(o2.getOperationTime()) && StringUtils.isNotBlank(o1.getOperationTime())) { + return 1; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + Date date1 = sdf.parse(o1.getOperationTime()); + Date date2 = sdf.parse(o2.getOperationTime()); + return date2.compareTo(date1); + } catch (ParseException e) { + logger.debug("病人手术信息排序出错(手术时间【operationTime】字段格式错误)!"); + e.printStackTrace(); + } + return 0; + } + }); + // 只取最新录入的一条记录 + PatientInfoVO operationInfo = opeartionInfoVOList.get(0); + patientInfoVO.setDoctorName(operationInfo.getDoctorName()); + patientInfoVO.setOperation(operationInfo.getOperation()); + patientInfoVO.setOpRoomId(operationInfo.getOpRoomId()); + patientInfoVO.setOperationTime(operationInfo.getOperationTime()); + //vo.setPatientArea(patientArea instanceof String ? (String)patientArea : ""); + patientInfoVO.setBedNumber(operationInfo.getBedNumber()); + patientInfoVO.setRoomNumber(operationInfo.getRoomNumber()); + + patientInfoVO.setWashHandNurse(operationInfo.getWashHandNurse()); + patientInfoVO.setCircuitNurse(operationInfo.getCircuitNurse()); + patientInfoVO.setAscriptionDepartment(operationInfo.getAscriptionDepartment()); + logger.debug("完成解析住院病人信息,病人ID号为:" + patientInfoVO.getPatientNumber()); + } + } + } + } catch (Exception e) { + logger.error("根据病人就诊号查询手术信息失败" + e); + e.printStackTrace(); + } + } + + @Override + public PatientInfoVO[] findPatientInfoByHospitalNumBeforeOperation( + String hospitalNum) { + return findPatientInfoByHospitalNum(hospitalNum); + } + +}