Index: ssts-web/src/main/webapp/disinfectsystem/config/jmszxyy/spring/HIS.xml
===================================================================
diff -u -r29371 -r38602
--- ssts-web/src/main/webapp/disinfectsystem/config/jmszxyy/spring/HIS.xml (.../HIS.xml) (revision 29371)
+++ ssts-web/src/main/webapp/disinfectsystem/config/jmszxyy/spring/HIS.xml (.../HIS.xml) (revision 38602)
@@ -67,34 +67,10 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/jmszxyy/FindPatientInfoByTreatmentNumDaoImpl.java
===================================================================
diff -u
--- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/jmszxyy/FindPatientInfoByTreatmentNumDaoImpl.java (revision 0)
+++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/jmszxyy/FindPatientInfoByTreatmentNumDaoImpl.java (revision 38602)
@@ -0,0 +1,177 @@
+package com.forgon.disinfectsystem.mq.dao.jmszxyy;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.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.FindPatientInfoByTreatmentNumDao;
+import com.forgon.disinfectsystem.datasynchronization.model.PatientInfoVO;
+import com.forgon.tools.date.DateTools;
+
+/**
+ * 查询 BS10085 诊疗卡信息JMSZXYY-105
+ */
+public class FindPatientInfoByTreatmentNumDaoImpl implements FindPatientInfoByTreatmentNumDao {
+
+ private Logger logger = Logger.getLogger(this.getClass());
+
+ @Override
+ public PatientInfoVO[] findPatientInfoByTreatmentNum(String treatmentNum) {
+ if(StringUtils.isBlank(treatmentNum)){
+ logger.debug("诊疗号为空!");
+ return null;
+ }
+
+ List patientInfoVOList = null;
+ try {
+ //请求响应消费方:一次请求,一条响应 或者 推送发送方:一次推送,一条推送结果(EHSB平台提供的平台接入方法)
+ logger.debug(String.format("开始查询%s诊疗卡信息(诊疗卡信息接口)接口", MQHelper.treatmentNumFID));
+ //请求信息
+ String msgbody = buildTreatmentNumMsgbody(treatmentNum);
+ logger.debug(String.format("%s诊疗卡信息(诊疗卡信息接口)接口请求信息:%s", MQHelper.treatmentNumFID, msgbody));
+ //调用接口
+ String responce = MQHelper.composePutAndGetMsg(msgbody);
+ /*StringBuffer responceBuf = new StringBuffer();
+ responceBuf.append("BS10085BS10085S90001S00S90JMZX2024-07-09 16:18:47.630");
+ responceBuf.append("1query success1 1");
+ responceBuf.append("-391259204039202023-07-17T18:38:42");
+ responceBuf.append("20403920测试病人1男1994-03-23156");
+ responceBuf.append("中国01汉族U未知99");
+ responceBuf.append("不详或不便分类的其他劳动者19925503991广东省江门市蓬江区白沙街道440701199403230323");
+ responceBuf.append("N
]]>");
+ String responce = responceBuf.toString();*/
+
+ logger.debug(String.format("成功接收%s诊疗卡信息(诊疗卡信息接口)接口返回信息:%s", MQHelper.treatmentNumFID, responce));
+ //解析返回参数
+ patientInfoVOList = buildTreatmentPatientInfoVO(responce);
+ if(CollectionUtils.isEmpty(patientInfoVOList)){
+ logger.debug(String.format("不存在诊疗号为%s的%s诊疗卡信息", treatmentNum, MQHelper.treatmentNumFID));
+ }else{
+ PatientInfoVO[] array = new PatientInfoVO[patientInfoVOList.size()];
+ for(int i=0;i buildTreatmentPatientInfoVO(String responce) throws Exception {
+
+ if(StringUtils.isBlank(responce)){
+ throw new RuntimeException("接口返回的参数为空!");
+ }
+
+ // 开始解析
+ Document doc = DocumentHelper.parseText(responce);
+ // 查询结果返回状态
+ String RetCodeXpath = "/ESBEntry/RetInfo/RetCode";
+ String RetCode = MQHelper.processDataByXpath(doc, RetCodeXpath);
+ String RetConXpath = "/ESBEntry/RetInfo/RetCon";
+ String RetCon = MQHelper.processDataByXpath(doc, RetConXpath);
+ if (!MQHelper.RET_CODE_SUCCESS.equals(RetCode)) {
+ throw new RuntimeException("接口返回信息为" + RetCon);
+ }
+ // 解析住院病人信息并入库
+ String MsgXpath = "/ESBEntry/MsgInfo/Msg"; // 返回结果可能存在多条住院病人信息
+ XPath xpath = doc.createXPath(MsgXpath);
+ List nodeList2 = xpath.selectNodes(doc, xpath);
+ if (nodeList2 == null || nodeList2.size() == 0) {
+ throw new RuntimeException("查询返回的数据不包含/ESBEntry/MsgInfo/Msg节点!");
+ }
+ List patientInfoVOList = new LinkedList();
+ // 解析返回信息中所有住院病人信息
+ for (int i = 1; i <= nodeList2.size(); i++) {
+ String msgXpath = "/ESBEntry/MsgInfo/Msg[" + i + "]";
+ String patientInfo = MQHelper.processDataByXpath(doc, msgXpath); // 住院病人信息
+ if (StringUtils.isNotBlank(patientInfo)) {
+ Document document = DocumentHelper.parseText(patientInfo);
+
+ String clinicNumberXpath = "/msg/body/row/TREAT_CARD_NO";
+ String patientNameXpath = "/msg/body/row/PAT_NAME";
+ String patientSexXpath = "/msg/body/row/PHYSI_SEX_NAME";
+ String patientIDCardXpath = "/msg/body/row/ID_NUMBER";
+
+ String clinicNumber = MQHelper.processDataByXpath(document, clinicNumberXpath);
+ String patientName = MQHelper.processDataByXpath(document, patientNameXpath);
+ String patientSex = MQHelper.processDataByXpath(document, patientSexXpath);
+ String patientIDCard = MQHelper.processDataByXpath(document, patientIDCardXpath);
+
+
+ PatientInfoVO vo = new PatientInfoVO();
+ vo.setClinicNumber(clinicNumber);
+ vo.setPatientName(patientName);
+ vo.setPatientSex(patientSex);
+ vo.setPatientIDCard(patientIDCard);
+
+ patientInfoVOList.add(vo);
+ }
+ }
+
+ if(CollectionUtils.isEmpty(patientInfoVOList)){
+ throw new RuntimeException("返回的诊疗好患者信息为空!");
+ }
+
+ return patientInfoVOList;
+ }
+
+ /**
+ * 构建BS10085 诊疗卡信息接口请求信息
+ * @param treatmentNum
+ * @return
+ */
+ private String buildTreatmentNumMsgbody(String treatmentNum) {
+ StringBuffer msgbody = new StringBuffer();
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("1");
+ msgbody.append("" + MQHelper.userName + "");
+ msgbody.append("" + MQHelper.password + "");
+ msgbody.append("" + MQHelper.treatmentNumFID + "");
+ msgbody.append("" + MQHelper.treatmentNumOrderNo + "");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("" + MQHelper.treatmentNumFID + "");
+ msgbody.append("" + MQHelper.treatmentNumOrderNo + "");
+ msgbody.append("S90");
+ msgbody.append("S00");
+ msgbody.append("JMZX");
+ //2024-06-28 09:08:04
+ msgbody.append("" + DateTools.getCurrentDayByFormat(DateTools.COMMON_DATE_HMS) + "");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("0");
+ msgbody.append("500");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ return msgbody.toString();
+ }
+
+}
Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/jmszxyy/MQHelper.java
===================================================================
diff -u
--- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/jmszxyy/MQHelper.java (revision 0)
+++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/jmszxyy/MQHelper.java (revision 38602)
@@ -0,0 +1,93 @@
+package com.forgon.disinfectsystem.mq.dao.jmszxyy;
+
+import org.apache.commons.lang3.StringUtils;
+import org.dom4j.Document;
+import org.dom4j.Node;
+import org.dom4j.XPath;
+
+import com.ewell.sdk.business.EwellServiceTool;
+import com.ewell.sdk.domain.MessageEntity;
+import com.ewell.sdk.exception.SDKException;
+
+/**
+ * 百慧MQ信息队列服务的患者信息接口开发JMSZXYY-105
+ */
+public class MQHelper {
+
+ public static final String queueManagerName = "QMGR.S90";
+
+ public static final String RET_CODE_SUCCESS = "1";
+
+ public static final String userName = "XDGY";
+
+ public static final String password = "XDGY123456";
+
+ /**
+ * BS30005 手术申请单信息接口
+ */
+ public static final String hospitalNumFID = "BS30005";
+
+ public static final String hospitalNumOrderNo = "BS30005S90001";
+
+ /**
+ * BS10091 在院患者信息接口
+ */
+ public static final String patientInfoFID = "BS10091";
+
+ public static final String patientInfoOrderNo = "BS10091S90001";
+
+ /**
+ * BS10085诊疗卡信息的fid
+ */
+ public static final String treatmentNumFID = "BS10085";
+
+ public static final String treatmentNumOrderNo = "BS10085S90001";
+
+ /**
+ * 调用接口获取返回信息
+ * @param msgbody
+ * @return
+ */
+ public static String composePutAndGetMsg(String msgbody) {
+ String responce = null;
+ EwellServiceTool ewellServiceTool = null;
+ try {
+ ewellServiceTool = new EwellServiceTool();
+ MessageEntity messageEntity = ewellServiceTool.composePutAndGetMsg(queueManagerName, null, 5000, msgbody);
+ if(messageEntity != null){
+ responce = messageEntity.getMsg();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new RuntimeException(e.getMessage());
+ } finally {
+ if(ewellServiceTool != null){
+ try {
+ ewellServiceTool.disconnect();
+ } catch (SDKException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return responce;
+ }
+
+ /**
+ * 根据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;
+ }
+
+}
Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/jmszxyy/FindPatientInfoByHospitalNumDaoImpl.java
===================================================================
diff -u
--- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/jmszxyy/FindPatientInfoByHospitalNumDaoImpl.java (revision 0)
+++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/jmszxyy/FindPatientInfoByHospitalNumDaoImpl.java (revision 38602)
@@ -0,0 +1,435 @@
+package com.forgon.disinfectsystem.mq.dao.jmszxyy;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+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;
+import com.forgon.tools.date.DateTools;
+
+/**
+ * 先查询 BS30005 手术申请单信息(手术患者信息接口),查不到手术申请单信息再查询 BS10091 在院患者信息JMSZXYY-105
+ */
+public class FindPatientInfoByHospitalNumDaoImpl implements FindPatientInfoByHospitalNumDao {
+
+ private Logger logger = Logger.getLogger(this.getClass());
+
+ @Override
+ public PatientInfoVO[] findPatientInfoByHospitalNum(String hospitalNum) {
+ if (StringUtils.isBlank(hospitalNum)) {
+ logger.debug("住院号为空!");
+ return null;
+ }
+ List patientInfoVOList = null;
+ try {
+ //请求响应消费方:一次请求,一条响应 或者 推送发送方:一次推送,一条推送结果(EHSB平台提供的平台接入方法)
+ logger.debug(String.format("开始查询%s手术申请单信息(住院病人)接口", MQHelper.hospitalNumFID));
+ //请求信息
+ String msgbody = buildOperationApplyMsgbody(hospitalNum);
+ logger.debug(String.format("%s手术申请单信息(住院病人)接口请求信息:%s", MQHelper.hospitalNumFID, msgbody));
+ //调用接口
+ String responce = MQHelper.composePutAndGetMsg(msgbody);
+ /*StringBuffer responceBuf = new StringBuffer();
+ responceBuf.append("BS30005BS30005S90001S00S90JMZX2024-07-09 17:32:14.350");
+ responceBuf.append("1query success11");
+ responceBuf.append("2228628610000071000007100000712024-0449353-0-22511733605544269462024-06-23T08:00:0051.1104腹腔镜下胆总管探查术1E+0门诊1E+0NO_SCHEDULE14243三级手术53545354测试医生53545354测试医生ZYCS1ZYCS1住院测试科室创伤性膀胱破裂44072219410718111X测试");
+ responceBuf.append("2女1989-01-01T00:00:0001汉族U未知2024-06-22T09:15:492024-06-24T08:12:2708麻醉中心2024-06-23T08:00:00手术30101手术间5354江门市中心医院01ZYCS01,0808-2251173010029静脉麻醉0001双侧鼻孔N
]]>");
+ responceBuf.append("2228628610000071000007100000712024-0449353-0-22511733601944106132024-06-04T08:00:0053.1401双侧腹股沟直疝无张力修补术1E+0门诊1E+0NO_SCHEDULE打号机3三级手术53545354测试医生53545354测试医生ZYCS1ZYCS1住院测试科室创伤性膀胱破裂44072219410718111X测试");
+ responceBuf.append("2女1989-01-01T00:00:0001汉族U未知2024-06-03T08:24:082024-06-03T10:54:5008手术中心2024-06-04T08:00:00手术301手术间5354江门市中心医院01ZYCS01,0808-2251173010028吸入麻醉9999其他N
]]>");
+ responceBuf.append("2228628610000071000007100000712024-0449353-0-22511733602544137552024-06-06T08:00:0053.2100x001腹腔镜下单侧股疝无张力修补术1E+0门诊1E+0NO_SCHEDULE是的是的2二级手术53545354测试医生53545354测试医生ZYCS1ZYCS1住院测试科室创伤性膀胱破裂44072219410718111X测试");
+ responceBuf.append("2女1989-01-01T00:00:0001汉族U未知2024-06-05T15:05:302024-06-05T17:05:5508手术中心2024-06-06T08:00:00手术301手术间P23001江门市中心医院01ZYCS01,0808-2251173010028吸入麻醉0001双侧鼻孔N
]]>");
+ responceBuf.append("2228628610000071000007100000712024-0449353-0-22511733605544269462024-06-23T08:00:0053.2101单侧股疝无张力修补术1E+0门诊1E+0NO_SCHEDULE14243三级手术53545354测试医生53545354测试医生ZYCS1ZYCS1住院测试科室创伤性膀胱破裂44072219410718111X测试");
+ responceBuf.append("2女1989-01-01T00:00:0001汉族U未知2024-06-22T09:15:492024-06-24T08:12:2708麻醉中心2024-06-23T08:00:00手术30101手术间5354江门市中心医院01ZYCS01,0808-2251173010029静脉麻醉0001双侧鼻孔N
]]>");
+ responceBuf.append("");
+ String responce = responceBuf.toString();*/
+ logger.debug(String.format("成功接收%s手术申请单信息(住院病人)接口返回信息:%s", MQHelper.hospitalNumFID, responce));
+ //解析返回参数
+ patientInfoVOList = buildHospitalNumberPatientInfoVO(responce);
+ if(CollectionUtils.isEmpty(patientInfoVOList)){
+ logger.debug(String.format("不存在住院号为%s的%s手术申请单信息", hospitalNum, MQHelper.hospitalNumFID));
+ }else{
+ PatientInfoVO[] array = new PatientInfoVO[patientInfoVOList.size()];
+ for(int i=0;iBS10091BS10091S90001S00S9010001422024-07-09 17:51:14.106");
+ responceBuf.append("1query success11");
+ responceBuf.append("");
+ responceBuf.append("7656044072219410718111X雷柏森1男1941-07-1801汉族2已婚居民身份证44072219410718111X156中国70无业人员广东省江门市台山市大江镇@河木肿闸村23--1号广东省江门市台山市大江镇@河木肿闸村23--1号广东省江门市无无1370227846813702278468广东省江门市台山市大江镇@13702278468广东省江门市台山市大江镇@大江镇河木中闸村23-1号");
+ responceBuf.append("0本人或户主雷柏森广东省江门市台山市大江镇@13702278468100014210001423001694612024-0651074-030016946141国家江门城乡医保3住院2Ⅱ级护理3E+0一般E11.9002型糖尿病E11.9002型糖尿病E11.9002型糖尿病");
+ responceBuf.append("2024-06-28 15:19:2533其他医疗机构转入01江门中心医院210306210306内分泌科2103060121030601内分泌科病区病室06280628062801江门中心医院210418210418烧伤整形与创面修复科2104180121041801烧伤整形与创面修复科病区");
+ responceBuf.append("17010170101701001江门中心医院210418210418烧伤整形与创面修复科2104180121041801烧伤整形与创面修复科病区17010170101701011771177余文昊11771177余文昊");
+ responceBuf.append("212105212105林丽秋11771177余文昊2024-06-28 15:03:322024-07-08 11:45:3282岁1000.003
]]>");
+ String responce = responceBuf.toString();*/
+ logger.debug(String.format("成功接收%s在院患者信息:%s", MQHelper.patientInfoFID, responce));
+ //解析
+ patientInfoVOList = buildPatientInfoVO(responce);
+ if(CollectionUtils.isEmpty(patientInfoVOList)){
+ logger.debug(String.format("不存在住院号为%s的%s住院患者信息", hospitalNum, MQHelper.patientInfoFID));
+ }else{
+ PatientInfoVO[] array = new PatientInfoVO[patientInfoVOList.size()];
+ for(int i=0;i");
+ msgbody.append("");
+ msgbody.append("1");
+ msgbody.append("" + MQHelper.userName + "");
+ msgbody.append("" + MQHelper.password + "");
+ msgbody.append("" + MQHelper.hospitalNumFID + "");
+ msgbody.append("" + MQHelper.hospitalNumOrderNo + "");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("" + MQHelper.hospitalNumFID + "");
+ msgbody.append("" + MQHelper.hospitalNumOrderNo + "");
+ msgbody.append("S90");
+ msgbody.append("S00");
+ msgbody.append("JMZX");
+ //2024-06-28 09:08:04
+ msgbody.append("" + DateTools.getCurrentDayByFormat(DateTools.COMMON_DATE_HMS) + "");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("0");
+ msgbody.append("500");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ return msgbody.toString();
+ }
+
+ /**
+ * BS10091 在院患者信息的请求参数
+ * @param hospitalNum
+ * @return
+ */
+ private String buildPatientInfoMsgBody(String hospitalNum) {
+ StringBuffer msgbody = new StringBuffer();
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("1");
+ msgbody.append("" + MQHelper.userName + "");
+ msgbody.append("" + MQHelper.password + "");
+ msgbody.append("" + MQHelper.patientInfoFID + "");
+ msgbody.append("" + MQHelper.patientInfoOrderNo + "");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("" + MQHelper.patientInfoFID + "");
+ msgbody.append("" + MQHelper.patientInfoOrderNo + "");
+ msgbody.append("S90");
+ msgbody.append("S00");
+ msgbody.append("JMZX");
+ //2024-06-28 09:08:04
+ msgbody.append("" + DateTools.getCurrentDayByFormat(DateTools.COMMON_DATE_HMS) + "");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("0");
+ msgbody.append("500");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ msgbody.append("");
+ return msgbody.toString();
+ }
+
+ /**
+ * 解析并返回BS10091 在院患者信息
+ * @param responce
+ * @return
+ * @throws Exception
+ */
+ @SuppressWarnings("unchecked")
+ private List buildPatientInfoVO(String responce) throws Exception {
+
+ if(StringUtils.isBlank(responce)){
+ throw new RuntimeException("接口返回的参数为空!");
+ }
+
+ // 开始解析
+ Document doc = DocumentHelper.parseText(responce);
+ // 查询结果返回状态
+ String RetCodeXpath = "/ESBEntry/RetInfo/RetCode";
+ String RetCode = MQHelper.processDataByXpath(doc, RetCodeXpath);
+ String RetConXpath = "/ESBEntry/RetInfo/RetCon";
+ String RetCon = MQHelper.processDataByXpath(doc, RetConXpath);
+ if (!MQHelper.RET_CODE_SUCCESS.equals(RetCode)) {
+ throw new RuntimeException("接口返回信息为" + RetCon);
+ }
+ // 解析住院病人信息并入库
+ String MsgXpath = "/ESBEntry/MsgInfo/Msg"; // 返回结果可能存在多条住院病人信息
+ XPath xpath = doc.createXPath(MsgXpath);
+ List nodeList2 = xpath.selectNodes(doc, xpath);
+ if (nodeList2 == null || nodeList2.size() == 0) {
+ throw new RuntimeException("查询返回的数据不包含/ESBEntry/MsgInfo/Msg节点!");
+ }
+ List patientInfoVOList = new LinkedList();
+ // 解析返回信息中所有住院病人信息
+ for (int i = 1; i <= nodeList2.size(); i++) {
+ String msgXpath = "/ESBEntry/MsgInfo/Msg[" + i + "]";
+ String patientInfo = MQHelper.processDataByXpath(doc, msgXpath); // 住院病人信息
+ if (StringUtils.isNotBlank(patientInfo)) {
+ Document document = DocumentHelper.parseText(patientInfo);
+ // 解析住院病人信息并入库
+ String hospitalNumberXpath = "/msg/body/row/INHOSP_INDEX_NO";
+ String clinicNumberXpath = "/msg/body/row/VISIT_CARD_NO";
+ String patientNameXpath = "/msg/body/row/PAT_NAME";
+ String patientAgeXpath = "/msg/body/row/AGE";
+
+ String patientSexXpath = "/msg/body/row/PHYSI_SEX_NAME";
+ String patientAreaXpath = "/msg/body/row/ADMIT_WARD_NAME";
+ String ascriptionDepartmentXpath = "/msg/body/row/ADMIT_DEPT_NAME";
+ String roomNumberXpath = "/msg/body/row/ADMIT_SICKROOM_CODE";
+
+ String bedNumberXpath = "/msg/body/row/ADMIT_BED_CODE";
+ String patientIDCardXpath = "/msg/body/row/ID_NUMBER";
+
+ String hospitalNumber = MQHelper.processDataByXpath(document, hospitalNumberXpath);
+ String clinicNumber = MQHelper.processDataByXpath(document, clinicNumberXpath);
+ String patientName = MQHelper.processDataByXpath(document, patientNameXpath);
+ String patientAge = MQHelper.processDataByXpath(document, patientAgeXpath);
+
+ String patientSex = MQHelper.processDataByXpath(document, patientSexXpath);
+ String patientArea = MQHelper.processDataByXpath(document, patientAreaXpath);
+ String ascriptionDepartment = MQHelper.processDataByXpath(document, ascriptionDepartmentXpath);
+ String roomNumber = MQHelper.processDataByXpath(document, roomNumberXpath);
+
+ String bedNumber = MQHelper.processDataByXpath(document, bedNumberXpath);
+ String patientIDCard = MQHelper.processDataByXpath(document, patientIDCardXpath);
+
+ PatientInfoVO vo = new PatientInfoVO();
+ vo.setHospitalNumber(hospitalNumber);
+ vo.setClinicNumber(clinicNumber);
+ vo.setPatientName(patientName);
+ vo.setPatientAge(patientAge);
+ vo.setPatientSex(patientSex);
+ vo.setPatientArea(patientArea);
+ vo.setAscriptionDepartment(ascriptionDepartment);
+ vo.setRoomNumber(roomNumber);
+ vo.setBedNumber(bedNumber);
+ vo.setPatientIDCard(patientIDCard);
+
+ patientInfoVOList.add(vo);
+ }
+ }
+
+ if(CollectionUtils.isEmpty(patientInfoVOList)){
+ throw new RuntimeException("返回的住院患者信息为空!");
+ }
+
+ return patientInfoVOList;
+ }
+
+ /**
+ * 解析并返回BS30005手术申请单患者信息
+ * @return
+ * @throws Exception
+ */
+ @SuppressWarnings("unchecked")
+ private List buildHospitalNumberPatientInfoVO(String responce) throws Exception {
+
+ if(StringUtils.isBlank(responce)){
+ throw new RuntimeException("接口返回的参数为空!");
+ }
+
+ // 开始解析
+ Document doc = DocumentHelper.parseText(responce);
+ // 查询结果返回状态
+ String RetCodeXpath = "/ESBEntry/RetInfo/RetCode";
+ String RetCode = MQHelper.processDataByXpath(doc, RetCodeXpath);
+ String RetConXpath = "/ESBEntry/RetInfo/RetCon";
+ String RetCon = MQHelper.processDataByXpath(doc, RetConXpath);
+ if (!MQHelper.RET_CODE_SUCCESS.equals(RetCode)) {
+ throw new RuntimeException("接口返回信息为" + RetCon);
+ }
+ // 解析住院病人信息并入库
+ String MsgXpath = "/ESBEntry/MsgInfo/Msg"; // 返回结果可能存在多条住院病人信息
+ XPath xpath = doc.createXPath(MsgXpath);
+ List nodeList2 = xpath.selectNodes(doc, xpath);
+ if (nodeList2 == null || nodeList2.size() == 0) {
+ throw new RuntimeException("查询返回的数据不包含/ESBEntry/MsgInfo/Msg节点!");
+ }
+ List patientInfoVOList = new LinkedList();
+ // 解析返回信息中所有住院病人信息
+ for (int i = 1; i <= nodeList2.size(); i++) {
+ String msgXpath = "/ESBEntry/MsgInfo/Msg[" + i + "]";
+ String patientInfo = MQHelper.processDataByXpath(doc, msgXpath); // 住院病人信息
+ if (StringUtils.isNotBlank(patientInfo)) {
+ Document document = DocumentHelper.parseText(patientInfo);
+ // 解析住院病人信息并入库
+ String hospitalNumberXpath = "/msg/body/row/INHOSP_INDEX_NO";
+ String operationRoomXpath = "/msg/body/row/SURGERY_ROOM_NO";
+ String patientNameXpath = "/msg/body/row/PAT_NAME";
+ String patientBirthdayXpath = "/msg/body/row/DATE_BIRTH";
+
+ String patientSexXpath = "/msg/body/row/PHYSI_SEX_NAME";
+ String bedNumberXpath = "/msg/body/row/BED_NO";
+ String patientIDCardXpath = "/msg/body/row/ID_NUMBER";
+ String doctorNameXpath = "/msg/body/row/SURGEON_CODE";
+
+ String operationXpath = "/msg/body/row/SURGERY_OPER_NAME";
+ String operationScheduleIdXpath = "/msg/body/row/ELECTR_REQUISITION_NO";
+ String operationTimeXpath = "/msg/body/row/RESERVE_DATE";
+
+ String hospitalNumber = MQHelper.processDataByXpath(document, hospitalNumberXpath);
+ String opRoomId = MQHelper.processDataByXpath(document, operationRoomXpath);
+ String patientName = MQHelper.processDataByXpath(document, patientNameXpath);
+ String patientBirthday = MQHelper.processDataByXpath(document, patientBirthdayXpath);
+
+ String patientSex = MQHelper.processDataByXpath(document, patientSexXpath);
+ String bedNumber = MQHelper.processDataByXpath(document, bedNumberXpath);
+ String patientIDCard = MQHelper.processDataByXpath(document, patientIDCardXpath);
+ String doctorName = MQHelper.processDataByXpath(document, doctorNameXpath);
+
+ String operation = MQHelper.processDataByXpath(document, operationXpath);
+ String operationScheduleId = MQHelper.processDataByXpath(document, operationScheduleIdXpath);
+ String operationTime = MQHelper.processDataByXpath(document, operationTimeXpath);
+ if(StringUtils.isNotBlank(operationTime)){
+ operationTime= operationTime.replace("T", " ");
+ }
+
+ PatientInfoVO patientInfoVO = new PatientInfoVO();
+ patientInfoVO.setHospitalNumber(hospitalNumber);
+ patientInfoVO.setOpRoomId(opRoomId);
+ patientInfoVO.setPatientName(patientName);
+ patientInfoVO.setPatientAge(birthdayToAge(patientBirthday));
+
+ patientInfoVO.setPatientSex(patientSex);
+ patientInfoVO.setBedNumber(bedNumber);
+ patientInfoVO.setPatientIDCard(patientIDCard);
+ patientInfoVO.setDoctorName(doctorName);
+
+ patientInfoVO.setOperation(operation);
+ patientInfoVO.setOperationScheduleId(operationScheduleId);
+ patientInfoVO.setOperationTime(operationTime);
+
+ patientInfoVOList.add(patientInfoVO);
+ }
+ }
+
+ if(CollectionUtils.isEmpty(patientInfoVOList)){
+ throw new RuntimeException("返回的住院患者信息为空!");
+ }
+
+ // 根据记录手术时间排序,只取最新记录
+ 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(String.format("%s手术申请单信息(住院病人)排序出错(录入时间【RECORD_DATE】字段格式错误)!", MQHelper.hospitalNumFID));
+ e.printStackTrace();
+ }
+ return 0;
+ }
+ });
+ return patientInfoVOList;
+ }
+
+ /**
+ * 患者年龄处理:
+ * 根据患者出生日期(yyyy-MM-ddTHH:mm:ss)计算年龄(1989-01-01T00:00:00)
+ * @param birthday(yyyy-MM-ddTHH:mm:ss)
+ * @return age
+ */
+ private static String birthdayToAge(String birthday) {
+ if(StringUtils.isNotBlank(birthday)) {
+ if (StringUtils.isNotBlank(birthday)) {
+ birthday = birthday.replace("T", " ");
+ }
+ String[] arr = birthday.split("-");
+ Integer year = Integer.parseInt(arr[0]);
+ Integer month = Integer.parseInt(arr[1]);
+ Integer day = Integer.parseInt(arr[2].split(" ")[0]);
+ Calendar now = Calendar.getInstance();
+ Integer currentYear = now.get(Calendar.YEAR);
+ Integer currentMonth = now.get(Calendar.MONTH) + 1;
+ Integer currentDay = now.get(Calendar.DAY_OF_MONTH);
+ Integer age = currentYear - year;
+ if(currentMonth == month) {
+ if(currentDay < day) {
+ age -= 1;
+ }
+ } else if(currentMonth < month) {
+ age -= 1;
+ }
+ return age.toString();
+ }
+ return null;
+ }
+
+ @Override
+ public PatientInfoVO[] findPatientInfoByHospitalNumBeforeOperation(String hospitalNum) {
+ return this.findPatientInfoByHospitalNum(hospitalNum);
+ }
+
+}