检查报告查询pacs base64日志存储,检查base64获取的配置

pacs-补偿
wyb 2 years ago
parent 5c600cae7f
commit 5404536caa

@ -1,4 +1,15 @@
{ {
"blocking": ["xdxt","yx","jc"], "blocking": [
"notHandled":["lis","bl","nh"] "xdxt",
"yx",
"jc"
],
"notHandled": [
"lis",
"bl",
"nh"
],
"fetchBase64": [
"cta"
]
} }

@ -7,6 +7,8 @@ import com.docus.infrastructure.web.api.CommonResult;
import com.docus.server.api.HospitalSubmitNodeServiceApi; import com.docus.server.api.HospitalSubmitNodeServiceApi;
import com.docus.server.api.dto.HospitalSubmitNodeLogAddDTO; import com.docus.server.api.dto.HospitalSubmitNodeLogAddDTO;
import com.docus.server.api.enums.HospitalSubmitNodeEnum; import com.docus.server.api.enums.HospitalSubmitNodeEnum;
import com.docus.server.common.entity.RemoteCallResult;
import com.docus.server.common.service.RemoteCallResultService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
@ -29,7 +31,18 @@ public class AppRunBootstrap {
System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl"); System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
SpringApplication.run(AppRunBootstrap.class, args); SpringApplication.run(AppRunBootstrap.class, args);
} }
private static void test1(){
RemoteCallResultService remoteCallResultService = SpringUtils.getBean(RemoteCallResultService.class);
StringBuilder b1=new StringBuilder();
for (int i = 0; i < 1500; i++) {
b1.append(i);
}
String b1str = b1.toString();
RemoteCallResult result = new RemoteCallResult();
result.setRequest(b1str);
result.setResponse("b1str");
remoteCallResultService.save(result);
}
private static void test(){ private static void test(){
HospitalSubmitNodeServiceApi hospitalSubmitNodeServiceApi = SpringUtils.getBean(HospitalSubmitNodeServiceApi.class); HospitalSubmitNodeServiceApi hospitalSubmitNodeServiceApi = SpringUtils.getBean(HospitalSubmitNodeServiceApi.class);
HospitalSubmitNodeLogAddDTO dto = new HospitalSubmitNodeLogAddDTO(); HospitalSubmitNodeLogAddDTO dto = new HospitalSubmitNodeLogAddDTO();

@ -0,0 +1,84 @@
package com.docus.server.common.entity;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
*
*
* @author wyb
* @date 2023-10-13
*/
@Data
public class RemoteCallResult implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
/**
*
*/
private String keyword;
/**
*
*/
private String url;
/**
*
*/
private String header;
/**
*
*/
private String request;
/**
*
*/
private String response;
/**
*
*/
private String remark;
/**
*
*/
private String description;
/**
* 01
*/
private Integer requestStorageType;
/**
* 01
*/
private Integer responseStorageType;
/**
* 123
*/
private Integer callStatus;
/**
*
*/
private Date callStartTime;
/**
*
*/
private Date callEndTime;
public RemoteCallResult() {
}
}

@ -0,0 +1,18 @@
package com.docus.server.common.mapper;
import com.docus.server.common.entity.RemoteCallResult;
import org.apache.ibatis.annotations.Param;
/**
*
* @author wyb
*
*/
public interface RemoteCallResultMapper {
/**
*
* @param remoteCallResult
* @return
*/
int save(@Param("result") RemoteCallResult remoteCallResult);
}

@ -0,0 +1,16 @@
package com.docus.server.common.service;
import com.docus.server.common.entity.RemoteCallResult;
/**
*
* @author WYBDEV
*/
public interface RemoteCallResultService {
/**
*
* @param remoteCallResult
*/
void save(RemoteCallResult remoteCallResult);
}

@ -0,0 +1,53 @@
package com.docus.server.common.service.impl;
import com.docus.core.util.Func;
import com.docus.infrastructure.redis.service.IdService;
import com.docus.server.common.entity.RemoteCallResult;
import com.docus.server.common.mapper.RemoteCallResultMapper;
import com.docus.server.common.service.RemoteCallResultService;
import com.docus.server.common.util.FileUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.File;
/**
*
*
* @author wyb
*/
@Service
public class RemoteCallResultServiceImpl implements RemoteCallResultService {
@Resource
private IdService idService;
@Resource
private RemoteCallResultMapper remoteCallResultMapper;
private final static int SAVE_DISK_DATA_LENGTH = 1024;
private final static String REMOTE_CALL_SAVE_PATH = FileUtil.currentPath() + File.separator + "remote-call";
@Override
public void save(RemoteCallResult remoteCallResult) {
remoteCallResult.setRequestStorageType(0);
remoteCallResult.setResponseStorageType(0);
Long id = remoteCallResult.getId() == null ? idService.getDateSeq() : remoteCallResult.getId();
remoteCallResult.setId(id);
String request = remoteCallResult.getRequest();
String response = remoteCallResult.getResponse();
if (Func.isNotBlank(request) && request.length() > SAVE_DISK_DATA_LENGTH) {
String saveReqPath = REMOTE_CALL_SAVE_PATH + File.separator + id + "_request";
FileUtil.saveStrData(response, new File(saveReqPath));
remoteCallResult.setRequestStorageType(1);
remoteCallResult.setRequest(saveReqPath);
}
if (Func.isNotBlank(response) && response.length() > SAVE_DISK_DATA_LENGTH) {
String saveRespPath = REMOTE_CALL_SAVE_PATH + File.separator + id + "_response";
FileUtil.saveStrData(response, new File(saveRespPath));
remoteCallResult.setResponseStorageType(1);
remoteCallResult.setResponse(saveRespPath);
}
remoteCallResultMapper.save(remoteCallResult);
}
}

@ -0,0 +1,71 @@
package com.docus.server.common.util;
import com.docus.core.util.Func;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
/**
*
*
* @author WYBDEV
*/
public class FileUtil {
/**
* @return jar
*/
public static String currentPath() {
try {
File dir = new File(".");
return dir.getCanonicalPath();
} catch (Exception e) {
return "";
}
}
/**
*
*
* @param file
* @return
*/
public static boolean mkFileDirs(File file) {
if (!file.getParentFile().exists()) {
return file.getParentFile().mkdirs();
}
return true;
}
/**
*
*
* @param data
* @param file
*/
public static void saveStrData(String data, File file) {
mkFileDirs(file);
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter(file);
fileWriter.write(data);
fileWriter.flush();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (fileWriter != null) {
try {
fileWriter.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
public static void main(String[] args) throws Exception {
String path = currentPath() + File.separator + "remotecall" + File.separator + Func.randomUUID() + ".txt";
File file = new File(path);
saveStrData("随便写一点东西", file);
}
}

@ -6,13 +6,17 @@ import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson.TypeReference;
import com.docus.core.util.DateUtil; import com.docus.core.util.DateUtil;
import com.docus.core.util.ExceptionUtils;
import com.docus.core.util.Func; import com.docus.core.util.Func;
import com.docus.infrastructure.web.api.CommonResult; import com.docus.infrastructure.web.api.CommonResult;
import com.docus.server.common.entity.RemoteCallResult;
import com.docus.server.common.service.RemoteCallResultService;
import com.docus.server.report.api.ShunDePeopleService; import com.docus.server.report.api.ShunDePeopleService;
import com.docus.server.report.api.dto.*; import com.docus.server.report.api.dto.*;
import com.docus.server.report.api.vo.SdRyBloodReportVO; import com.docus.server.report.api.vo.SdRyBloodReportVO;
import com.docus.server.report.client.JaxWsDynamicClient; import com.docus.server.report.client.JaxWsDynamicClient;
import com.docus.server.report.config.SdRyReportQueryConfig; import com.docus.server.report.config.SdRyReportQueryConfig;
import com.docus.server.report.job.ReportJob;
import com.docus.server.report.util.IdUtil; import com.docus.server.report.util.IdUtil;
import com.docus.server.report.util.TableJsonRead; import com.docus.server.report.util.TableJsonRead;
import com.docus.server.report.util.XmlUtil; import com.docus.server.report.util.XmlUtil;
@ -22,10 +26,7 @@ import org.w3c.dom.Node;
import org.w3c.dom.NodeList; import org.w3c.dom.NodeList;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList; import java.util.*;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
@ -47,6 +48,10 @@ public class ShunDePeopleServiceImpl implements ShunDePeopleService {
@Resource @Resource
private SdRyReportQueryConfig sdRyReportQueryConfig; private SdRyReportQueryConfig sdRyReportQueryConfig;
@Resource
private ReportJob reportJob;
@Resource
private RemoteCallResultService remoteCallResultService;
@Override @Override
@ -141,18 +146,51 @@ public class ShunDePeopleServiceImpl implements ShunDePeopleService {
// 参数3FunctionType传空暂未启用 // 参数3FunctionType传空暂未启用
// 参数4Caller服务调用者名称由PACS提供验证令牌时 // 参数4Caller服务调用者名称由PACS提供验证令牌时
String[] param = {functionName, inputString, functionType, caller}; String[] param = {functionName, inputString, functionType, caller};
RemoteCallResult remoteCallResult = new RemoteCallResult();
remoteCallResult.setUrl(url+" | "+namespaceUri+" | "+operationName);
remoteCallResult.setRequest(Arrays.toString(param));
remoteCallResult.setDescription("根据检查流水和报告序列号指定要获取的报告PACS将生成PDF格式的报告并将PDF文件的BASE64编码串返回。");
remoteCallResult.setKeyword(examNo + "_" + reportNo);
remoteCallResult.setCallStartTime(new Date());
PACS_PDF_LOCK.lock(); PACS_PDF_LOCK.lock();
try { try {
String result = JaxWsDynamicClient.send(url, namespaceUri, operationName, param); String result = JaxWsDynamicClient.send(url, namespaceUri, operationName, param);
if (interval > 0) { if (interval > 0) {
TimeUnit.MILLISECONDS.sleep(interval); TimeUnit.MILLISECONDS.sleep(interval);
} }
remoteCallResult.setCallStatus(1);
String base64 = reportJob.parsePacsGetBase64(result);
if(Func.isBlank(base64)){
remoteCallResult.setRemark("查询base64结果为空!");
remoteCallResult.setCallStatus(3);
}
remoteCallResult.setResponse(result);
remoteCallResult.setCallEndTime(new Date());
try {
remoteCallResultService.save(remoteCallResult);
}catch (Exception e){
e.printStackTrace();
}
return result; return result;
} catch (Exception ex) { } catch (Exception ex) {
log.error(ex.getMessage(), ex); log.error(ex.getMessage(), ex);
String exceptionMessage = ExceptionUtils.getExceptionMessage(ex);
remoteCallResult.setRemark(ex.getMessage());
remoteCallResult.setCallStatus(2);
remoteCallResult.setResponse(exceptionMessage);
remoteCallResult.setCallEndTime(new Date());
try {
remoteCallResultService.save(remoteCallResult);
}catch (Exception e){
e.printStackTrace();
}
return null; return null;
} finally { } finally {
PACS_PDF_LOCK.unlock(); PACS_PDF_LOCK.unlock();
} }
} }

@ -8,49 +8,73 @@ import java.util.List;
/** /**
* *
*
* @author wyb * @author wyb
*/ */
public class SdRyReportHandledConfig { public class SdRyReportHandledConfig {
private final SdRyReportSystem sdRyReportSystem; private final static TableJsonRead JSON_READ = new TableJsonRead();
@Data @Data
private static class SdRyReportSystem{ private static class SdRyReportSystem {
/** /**
* * ,
*/ */
private List<String> blocking = new ArrayList<>(); private List<String> blocking = new ArrayList<>();
/** /**
* * job
*/ */
private List<String> notHandled = new ArrayList<>(); private List<String> notHandled = new ArrayList<>();
/**
* base64job
*/
private List<String> fetchBase64 = new ArrayList<>();
} }
public SdRyReportHandledConfig(){
TableJsonRead jsonRead = new TableJsonRead(); public SdRyReportHandledConfig() {
this.sdRyReportSystem= jsonRead.Read("data-config", "sdry-report-system.json", SdRyReportSystem.class);
} }
public boolean isBlocking(String systemName){
if(this.sdRyReportSystem!=null){ public SdRyReportSystem getSdRyReportSystem() {
List<String> blocking = this.sdRyReportSystem.getBlocking(); return JSON_READ.Read("data-config", "sdry-report-system.json", SdRyReportSystem.class);
}
public boolean isBlocking(String systemName) {
SdRyReportSystem sdRyReportSystem = getSdRyReportSystem();
if (sdRyReportSystem != null) {
List<String> blocking = sdRyReportSystem.getBlocking();
return blocking.contains(systemName); return blocking.contains(systemName);
} }
return false; return false;
} }
public boolean isNotHandled(String systemName){ public boolean isNotHandled(String systemName) {
if(this.sdRyReportSystem!=null){ SdRyReportSystem sdRyReportSystem = getSdRyReportSystem();
List<String> notHandled = this.sdRyReportSystem.getNotHandled(); if (sdRyReportSystem != null) {
List<String> notHandled = sdRyReportSystem.getNotHandled();
return notHandled.contains(systemName); return notHandled.contains(systemName);
} }
return false; return false;
} }
public boolean isFetchBase64(String systemName) {
SdRyReportSystem sdRyReportSystem = getSdRyReportSystem();
if (sdRyReportSystem != null) {
List<String> getBase64System = sdRyReportSystem.getFetchBase64();
return getBase64System.contains(systemName);
}
return false;
}
public static void main(String[] args) { public static void main(String[] args) {
SdRyReportHandledConfig sdRyReportHandledConfig = new SdRyReportHandledConfig(); SdRyReportHandledConfig sdRyReportHandledConfig = new SdRyReportHandledConfig();
System.out.println(sdRyReportHandledConfig.sdRyReportSystem); System.out.println(sdRyReportHandledConfig.getSdRyReportSystem());
System.out.println(sdRyReportHandledConfig.isNotHandled("lis")); System.out.println(sdRyReportHandledConfig.isNotHandled("lis"));
System.out.println(sdRyReportHandledConfig.isNotHandled("yx")); System.out.println(sdRyReportHandledConfig.isNotHandled("yx"));
System.out.println(sdRyReportHandledConfig.isBlocking("yx")); System.out.println(sdRyReportHandledConfig.isBlocking("yx"));
System.out.println(sdRyReportHandledConfig.isBlocking("lis")); System.out.println(sdRyReportHandledConfig.isBlocking("lis"));
System.out.println(sdRyReportHandledConfig.isFetchBase64("cta"));
} }
} }

@ -657,7 +657,7 @@ public class ReportJob {
} }
private String saveBase64(String base64) { public String saveBase64(String base64) {
String dir = createBase64SaveDir(); String dir = createBase64SaveDir();
String base64File = dir + File.separator + idService.getDateSeq() + ".txt"; String base64File = dir + File.separator + idService.getDateSeq() + ".txt";
try (FileWriter fileWriter = new FileWriter(base64File); try (FileWriter fileWriter = new FileWriter(base64File);
@ -691,7 +691,7 @@ public class ReportJob {
} }
} }
private static String parsePacsGetBase64(String xml) { public String parsePacsGetBase64(String xml) {
try { try {
XmlUtil xmlUtil = XmlUtil.of(xml); XmlUtil xmlUtil = XmlUtil.of(xml);
Node codeNode = xmlUtil.getNode("/Result/Code"); Node codeNode = xmlUtil.getNode("/Result/Code");

@ -3,9 +3,11 @@ package com.docus.server.report.webservice.impl;
import com.docus.core.util.DateUtil; import com.docus.core.util.DateUtil;
import com.docus.core.util.Func; import com.docus.core.util.Func;
import com.docus.infrastructure.core.exception.BaseException; import com.docus.infrastructure.core.exception.BaseException;
import com.docus.server.report.api.ShunDePeopleService;
import com.docus.server.report.api.dto.ReportDto; import com.docus.server.report.api.dto.ReportDto;
import com.docus.server.report.config.SdRyReportHandledConfig; import com.docus.server.report.config.SdRyReportHandledConfig;
import com.docus.server.report.config.ZdAssortConfig; import com.docus.server.report.config.ZdAssortConfig;
import com.docus.server.report.job.ReportJob;
import com.docus.server.report.service.ReportService; import com.docus.server.report.service.ReportService;
import com.docus.server.report.util.IdUtil; import com.docus.server.report.util.IdUtil;
import com.docus.server.report.util.XmlUtil; import com.docus.server.report.util.XmlUtil;
@ -20,6 +22,7 @@ import java.util.Date;
/** /**
* HIP1008- * HIP1008-
*
* @author jiahsi * @author jiahsi
*/ */
@Service(WebserviceMessageType.HIP1008) @Service(WebserviceMessageType.HIP1008)
@ -27,6 +30,11 @@ import java.util.Date;
public class HIP1008InspectionReportAdditionHandler implements WebserviceReceiveServerHandler { public class HIP1008InspectionReportAdditionHandler implements WebserviceReceiveServerHandler {
@Resource @Resource
private ReportService reportService; private ReportService reportService;
@Resource
private ShunDePeopleService shunDePeopleService;
@Resource
private ReportJob reportJob;
@Override @Override
public String handle(String receiveMessage) { public String handle(String receiveMessage) {
@ -46,11 +54,18 @@ public class HIP1008InspectionReportAdditionHandler implements WebserviceReceive
if (sdRyReportHandledConfig.isNotHandled(sysFlag)) { if (sdRyReportHandledConfig.isNotHandled(sysFlag)) {
return insertSuccess(msgId, sender, receiver); return insertSuccess(msgId, sender, receiver);
} }
if(sdRyReportHandledConfig.isBlocking(sysFlag)){ if (sdRyReportHandledConfig.isBlocking(sysFlag)) {
reportDto.setDownUrl(null); reportDto.setDownUrl(null);
reportService.reportBuffer(reportDto); reportService.reportBuffer(reportDto);
return insertSuccess(msgId, sender, receiver); return insertSuccess(msgId, sender, receiver);
} }
if (sdRyReportHandledConfig.isFetchBase64(sender)) {
// base64的和job的检查报告统一处理逻辑不然会出现重复
reportDto = fetchBase64Parse(xmlUtil);
if (reportDto == null) {
return insertFailed(msgId, sender, receiver, "未获取到报告PDF文件BASE64信息");
}
}
reportService.report(reportDto); reportService.report(reportDto);
return insertSuccess(msgId, sender, receiver); return insertSuccess(msgId, sender, receiver);
} catch (BaseException baseException) { } catch (BaseException baseException) {
@ -61,12 +76,72 @@ public class HIP1008InspectionReportAdditionHandler implements WebserviceReceive
return insertFailed(msgId, sender, receiver, "系统错误!"); return insertFailed(msgId, sender, receiver, "系统错误!");
} }
} }
private ReportDto fetchBase64Parse(XmlUtil inspectionInsertXmlUtil) {
Node senderNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1008/sender/device/id/item/@extension");
String updateBy = senderNode.getNodeValue();
Node inpatientNoNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1008/controlActProcess/subject/recordTarget/patientRole/id[@root='2.16.156.10011.1.12']/@extension");
String inpatientNo = inpatientNoNode.getNodeValue();
Node admissTimesNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1008/controlActProcess/subject/recordTarget/patientRole/item[@root='1.2.156.112635.1.2.1.7']/@extension");
Integer admissTimes = Integer.valueOf(admissTimesNode.getNodeValue());
// 患者本次就诊唯一键患者id【12位】+就诊次数
Node visitSnNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1008/controlActProcess/subject/recordTarget/patientRole/id[@root='2.16.156.10011.1.11']/@extension");
String visitSn = visitSnNode.getNodeValue();
// 患者id
Node patientSnNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1008/controlActProcess/subject/recordTarget/patientRole/id[@root='2.16.156.10011.0.2.2']/@extension");
String patientSn = patientSnNode.getNodeValue();
// 检查报告单号标识
Node reportFlagNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1008/controlActProcess/subject/recordTarget/patientRole/id[@root='2.16.156.10011.1.32']/@extension");
String examReportSn = reportFlagNode.getNodeValue();
//电子申请单编号
Node eafNoNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1008/controlActProcess/subject/recordTarget/patientRole/id[@root='2.16.156.10011.1.24']/@extension");
String requestSn = eafNoNode.getNodeValue();
Node fileTitleNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1008/controlActProcess/subject/component/structuredBody/component[@displayName='检查报告']/section/entry[@displayName='检查报告类型']/observation/code/@displayName");
String reportName = fileTitleNode.getNodeValue();
ReportDto reportDto = new ReportDto();
reportDto.setAdmisstimes(admissTimes);
reportDto.setInpatientNo(inpatientNo);
// 确定报告唯一 报告单号+申请单号
reportDto.setSerialnum(examReportSn + requestSn);
reportDto.setFileTitle(reportName);
reportDto.setVisitSn(visitSn);
reportDto.setPatientSn(patientSn);
// 检查报告需要从Pacs接口获取base64
String[] split = examReportSn.split("_");
String fromPacs = shunDePeopleService.getBase64PdfFromPacs(split[0], split[1]);
// 从pacs打印出来
String base64 = reportJob.parsePacsGetBase64(fromPacs);
if (Func.isBlank(base64)) {
return null;
}
String url = reportJob.saveBase64(base64);
reportDto.setDownUrl(url);
reportDto.setDowntype(5);
// 根据系统来分类
reportDto.setAssortId(ZdAssortConfig.getZdAssortId(updateBy));
reportDto.setSysFlag(updateBy);
reportDto.setFileSource("1");
reportDto.setFilestoragetype("1");
return reportDto;
}
public ReportDto getReportDtoByInspectionInsert(XmlUtil inspectionInsertXmlUtil) { public ReportDto getReportDtoByInspectionInsert(XmlUtil inspectionInsertXmlUtil) {
Node senderNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1008/sender/device/id/item/@extension"); Node senderNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1008/sender/device/id/item/@extension");
String sender = senderNode.getNodeValue(); String sender = senderNode.getNodeValue();
String zdAssortId = ZdAssortConfig.getZdAssortId(sender); String zdAssortId = ZdAssortConfig.getZdAssortId(sender);
if(Func.isBlank(zdAssortId)){ if (Func.isBlank(zdAssortId)) {
zdAssortId=ZdAssortConfig.getOtherAssortId(); zdAssortId = ZdAssortConfig.getOtherAssortId();
} }
Node inpatientNoNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1008/controlActProcess/subject/recordTarget/patientRole/id[@root='2.16.156.10011.1.12']/@extension"); Node inpatientNoNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1008/controlActProcess/subject/recordTarget/patientRole/id[@root='2.16.156.10011.1.12']/@extension");
@ -120,8 +195,8 @@ public class HIP1008InspectionReportAdditionHandler implements WebserviceReceive
public String insertSuccess(String msgId, String sender, String receiver) { public String insertSuccess(String msgId, String sender, String receiver) {
String createTime = Func.format(new Date(), DateUtil.PATTERN_DATETIME_MINI); String createTime = Func.format(new Date(), DateUtil.PATTERN_DATETIME_MINI);
return "<MCCI_IN000002UV01 xmlns=\"urn:hl7-org:v3\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ITSVersion=\"XML_1.0\" xsi:schemaLocation=\"urn:hl7-org:v3 file:///E:/hl7/HL7/v3ballot_fullsite_2011MAY/v3ballot/html/processable/multicacheschemas/MCCI _IN000002UV01.xsd\">" + return "<MCCI_IN000002UV01 xmlns=\"urn:hl7-org:v3\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ITSVersion=\"XML_1.0\" xsi:schemaLocation=\"urn:hl7-org:v3 file:///E:/hl7/HL7/v3ballot_fullsite_2011MAY/v3ballot/html/processable/multicacheschemas/MCCI _IN000002UV01.xsd\">" +
"<id extension=\""+ IdUtil.standardUUID()+"\"/>" + "<id extension=\"" + IdUtil.standardUUID() + "\"/>" +
"<creationTime value=\""+createTime+"\"/>" + "<creationTime value=\"" + createTime + "\"/>" +
"<interactionId root=\"2.16.840.1.113883.1.6\" extension=\"MCCI_IN000002UV01\"/>" + "<interactionId root=\"2.16.840.1.113883.1.6\" extension=\"MCCI_IN000002UV01\"/>" +
"<processingCode code=\"P\"/>" + "<processingCode code=\"P\"/>" +
"<processingModeCode/>" + "<processingModeCode/>" +
@ -142,7 +217,7 @@ public class HIP1008InspectionReportAdditionHandler implements WebserviceReceive
"</sender>" + "</sender>" +
"<acknowledgement typeCode=\"AA\">" + "<acknowledgement typeCode=\"AA\">" +
"<targetMessage>" + "<targetMessage>" +
"<id extension=\""+msgId+"\"/>" + "<id extension=\"" + msgId + "\"/>" +
"</targetMessage>" + "</targetMessage>" +
"<acknowledgementDetail>" + "<acknowledgementDetail>" +
"<text value=\"成功\"/>" + "<text value=\"成功\"/>" +
@ -193,8 +268,8 @@ public class HIP1008InspectionReportAdditionHandler implements WebserviceReceive
String createTime = Func.format(new Date(), DateUtil.PATTERN_DATETIME_MINI); String createTime = Func.format(new Date(), DateUtil.PATTERN_DATETIME_MINI);
return "<MCCI_IN000002UV01 xmlns=\"urn:hl7-org:v3\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ITSVersion=\"XML_1.0\" xsi:schemaLocation=\"urn:hl7-org:v3 file:///E:/hl7/HL7/v3ballot_fullsite_2011MAY/v3ballot/html/processable/multicacheschemas/MCCI _IN000002UV01.xsd\">" + return "<MCCI_IN000002UV01 xmlns=\"urn:hl7-org:v3\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ITSVersion=\"XML_1.0\" xsi:schemaLocation=\"urn:hl7-org:v3 file:///E:/hl7/HL7/v3ballot_fullsite_2011MAY/v3ballot/html/processable/multicacheschemas/MCCI _IN000002UV01.xsd\">" +
"<id extension=\""+IdUtil.standardUUID()+"\"/>" + "<id extension=\"" + IdUtil.standardUUID() + "\"/>" +
"<creationTime value=\""+createTime+"\"/>" + "<creationTime value=\"" + createTime + "\"/>" +
"<interactionId root=\"2.16.840.1.113883.1.6\" extension=\"MCCI_IN000002UV01\"/>" + "<interactionId root=\"2.16.840.1.113883.1.6\" extension=\"MCCI_IN000002UV01\"/>" +
"<processingCode code=\"P\"/>" + "<processingCode code=\"P\"/>" +
"<processingModeCode/>" + "<processingModeCode/>" +
@ -215,10 +290,10 @@ public class HIP1008InspectionReportAdditionHandler implements WebserviceReceive
"</sender>" + "</sender>" +
"<acknowledgement typeCode=\"AE\">" + "<acknowledgement typeCode=\"AE\">" +
"<targetMessage>" + "<targetMessage>" +
"<id extension=\""+msgId+"\"/>" + "<id extension=\"" + msgId + "\"/>" +
"</targetMessage>" + "</targetMessage>" +
"<acknowledgementDetail>" + "<acknowledgementDetail>" +
"<text value=\""+failedMessage+"\"/>" + "<text value=\"" + failedMessage + "\"/>" +
"</acknowledgementDetail>" + "</acknowledgementDetail>" +
"</acknowledgement>" + "</acknowledgement>" +
"</MCCI_IN000002UV01>"; "</MCCI_IN000002UV01>";

@ -3,9 +3,11 @@ package com.docus.server.report.webservice.impl;
import com.docus.core.util.DateUtil; import com.docus.core.util.DateUtil;
import com.docus.core.util.Func; import com.docus.core.util.Func;
import com.docus.infrastructure.core.exception.BaseException; import com.docus.infrastructure.core.exception.BaseException;
import com.docus.server.report.api.ShunDePeopleService;
import com.docus.server.report.api.dto.ReportDto; import com.docus.server.report.api.dto.ReportDto;
import com.docus.server.report.config.SdRyReportHandledConfig; import com.docus.server.report.config.SdRyReportHandledConfig;
import com.docus.server.report.config.ZdAssortConfig; import com.docus.server.report.config.ZdAssortConfig;
import com.docus.server.report.job.ReportJob;
import com.docus.server.report.service.ReportService; import com.docus.server.report.service.ReportService;
import com.docus.server.report.util.IdUtil; import com.docus.server.report.util.IdUtil;
import com.docus.server.report.util.XmlUtil; import com.docus.server.report.util.XmlUtil;
@ -20,6 +22,7 @@ import java.util.Date;
/** /**
* HIP1009- * HIP1009-
*
* @author jiahsi * @author jiahsi
*/ */
@Service(WebserviceMessageType.HIP1009) @Service(WebserviceMessageType.HIP1009)
@ -27,6 +30,10 @@ import java.util.Date;
public class HIP1009InspectionReportUpdatesHandler implements WebserviceReceiveServerHandler { public class HIP1009InspectionReportUpdatesHandler implements WebserviceReceiveServerHandler {
@Resource @Resource
private ReportService reportService; private ReportService reportService;
@Resource
private ShunDePeopleService shunDePeopleService;
@Resource
private ReportJob reportJob;
@Override @Override
public String handle(String receiveMessage) { public String handle(String receiveMessage) {
@ -46,11 +53,18 @@ public class HIP1009InspectionReportUpdatesHandler implements WebserviceReceiveS
if (sdRyReportHandledConfig.isNotHandled(sysFlag)) { if (sdRyReportHandledConfig.isNotHandled(sysFlag)) {
return updateSuccess(msgId, sender, receiver); return updateSuccess(msgId, sender, receiver);
} }
if(sdRyReportHandledConfig.isBlocking(sysFlag)){ if (sdRyReportHandledConfig.isBlocking(sysFlag)) {
reportDto.setDownUrl(null); reportDto.setDownUrl(null);
reportService.reportBuffer(reportDto); reportService.reportBuffer(reportDto);
return updateSuccess(msgId, sender, receiver); return updateSuccess(msgId, sender, receiver);
} }
if (sdRyReportHandledConfig.isFetchBase64(sender)) {
// base64的和job的检查报告统一处理逻辑不然会出现重复
reportDto = fetchBase64Parse(xmlUtil);
if (reportDto == null) {
return updateFailed(msgId, sender, receiver, "未获取到报告PDF文件BASE64信息");
}
}
reportService.report(reportDto); reportService.report(reportDto);
return updateSuccess(msgId, sender, receiver); return updateSuccess(msgId, sender, receiver);
} catch (BaseException baseException) { } catch (BaseException baseException) {
@ -62,14 +76,71 @@ public class HIP1009InspectionReportUpdatesHandler implements WebserviceReceiveS
} }
} }
private ReportDto fetchBase64Parse(XmlUtil inspectionInsertXmlUtil) {
Node senderNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1009/sender/device/id/item/@extension");
String updateBy = senderNode.getNodeValue();
Node inpatientNoNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1009/controlActProcess/subject/recordTarget/patientRole/id[@root='2.16.156.10011.1.12']/@extension");
String inpatientNo = inpatientNoNode.getNodeValue();
Node admissTimesNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1009/controlActProcess/subject/recordTarget/patientRole/item[@root='1.2.156.112635.1.2.1.7']/@extension");
Integer admissTimes = Integer.valueOf(admissTimesNode.getNodeValue());
// 患者本次就诊唯一键患者id【12位】+就诊次数
Node visitSnNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1009/controlActProcess/subject/recordTarget/patientRole/id[@root='2.16.156.10011.1.11']/@extension");
String visitSn = visitSnNode.getNodeValue();
// 患者id
Node patientSnNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1009/controlActProcess/subject/recordTarget/patientRole/id[@root='2.16.156.10011.0.2.2']/@extension");
String patientSn = patientSnNode.getNodeValue();
// 检查报告单号标识
Node reportFlagNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1009/controlActProcess/subject/recordTarget/patientRole/id[@root='2.16.156.10011.1.32']/@extension");
String examReportSn = reportFlagNode.getNodeValue();
//电子申请单编号
Node eafNoNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1009/controlActProcess/subject/recordTarget/patientRole/id[@root='2.16.156.10011.1.24']/@extension");
String requestSn = eafNoNode.getNodeValue();
Node fileTitleNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1009/controlActProcess/subject/component/structuredBody/component[@displayName='检查报告']/section/entry[@displayName='检查报告类型']/observation/code/@displayName");
String reportName = fileTitleNode.getNodeValue();
ReportDto reportDto = new ReportDto();
reportDto.setAdmisstimes(admissTimes);
reportDto.setInpatientNo(inpatientNo);
// 确定报告唯一 报告单号+申请单号
reportDto.setSerialnum(examReportSn + requestSn);
reportDto.setFileTitle(reportName);
reportDto.setVisitSn(visitSn);
reportDto.setPatientSn(patientSn);
// 检查报告需要从Pacs接口获取base64
String[] split = examReportSn.split("_");
String fromPacs = shunDePeopleService.getBase64PdfFromPacs(split[0], split[1]);
// 从pacs打印出来
String base64 = reportJob.parsePacsGetBase64(fromPacs);
if (Func.isBlank(base64)) {
return null;
}
String url = reportJob.saveBase64(base64);
reportDto.setDownUrl(url);
reportDto.setDowntype(5);
// 根据系统来分类
reportDto.setAssortId(ZdAssortConfig.getZdAssortId(updateBy));
reportDto.setSysFlag(updateBy);
reportDto.setFileSource("1");
reportDto.setFilestoragetype("1");
return reportDto;
}
public ReportDto getReportDtoByInspectionUpdate(XmlUtil inspectionUpdateXmlUtil) { public ReportDto getReportDtoByInspectionUpdate(XmlUtil inspectionUpdateXmlUtil) {
Node senderNode = inspectionUpdateXmlUtil.getNode("/POOR_HIP1009/sender/device/id/item/@extension"); Node senderNode = inspectionUpdateXmlUtil.getNode("/POOR_HIP1009/sender/device/id/item/@extension");
String sender = senderNode.getNodeValue(); String sender = senderNode.getNodeValue();
String zdAssortId = ZdAssortConfig.getZdAssortId(sender); String zdAssortId = ZdAssortConfig.getZdAssortId(sender);
if(Func.isBlank(zdAssortId)){ if (Func.isBlank(zdAssortId)) {
zdAssortId=ZdAssortConfig.getOtherAssortId(); zdAssortId = ZdAssortConfig.getOtherAssortId();
} }
Node inpatientNoNode = inspectionUpdateXmlUtil.getNode("/POOR_HIP1009/controlActProcess/subject/recordTarget/patientRole/id[@root='2.16.156.10011.1.12']/@extension"); Node inpatientNoNode = inspectionUpdateXmlUtil.getNode("/POOR_HIP1009/controlActProcess/subject/recordTarget/patientRole/id[@root='2.16.156.10011.1.12']/@extension");
@ -126,8 +197,8 @@ public class HIP1009InspectionReportUpdatesHandler implements WebserviceReceiveS
String createTime = Func.format(new Date(), DateUtil.PATTERN_DATETIME_MINI); String createTime = Func.format(new Date(), DateUtil.PATTERN_DATETIME_MINI);
return "<MCCI_IN000002UV01 xmlns=\"urn:hl7-org:v3\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ITSVersion=\"XML_1.0\" xsi:schemaLocation=\"urn:hl7-org:v3 file:///E:/hl7/HL7/v3ballot_fullsite_2011MAY/v3ballot/html/processable/multicacheschemas/MCCI _IN000002UV01.xsd\">" + return "<MCCI_IN000002UV01 xmlns=\"urn:hl7-org:v3\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ITSVersion=\"XML_1.0\" xsi:schemaLocation=\"urn:hl7-org:v3 file:///E:/hl7/HL7/v3ballot_fullsite_2011MAY/v3ballot/html/processable/multicacheschemas/MCCI _IN000002UV01.xsd\">" +
"<id extension=\""+ IdUtil.standardUUID()+"\"/>" + "<id extension=\"" + IdUtil.standardUUID() + "\"/>" +
"<creationTime value=\""+createTime+"\"/>" + "<creationTime value=\"" + createTime + "\"/>" +
"<interactionId root=\"2.16.840.1.113883.1.6\" extension=\"MCCI_IN000002UV01\"/>" + "<interactionId root=\"2.16.840.1.113883.1.6\" extension=\"MCCI_IN000002UV01\"/>" +
"<processingCode code=\"P\"/>" + "<processingCode code=\"P\"/>" +
"<processingModeCode/>" + "<processingModeCode/>" +
@ -148,7 +219,7 @@ public class HIP1009InspectionReportUpdatesHandler implements WebserviceReceiveS
"</sender>" + "</sender>" +
"<acknowledgement typeCode=\"AA\">" + "<acknowledgement typeCode=\"AA\">" +
"<targetMessage>" + "<targetMessage>" +
"<id extension=\""+msgId+"\"/>" + "<id extension=\"" + msgId + "\"/>" +
"</targetMessage>" + "</targetMessage>" +
"<acknowledgementDetail>" + "<acknowledgementDetail>" +
"<text value=\"成功\"/>" + "<text value=\"成功\"/>" +
@ -200,8 +271,8 @@ public class HIP1009InspectionReportUpdatesHandler implements WebserviceReceiveS
public String updateFailed(String msgId, String sender, String receiver, String failedMessage) { public String updateFailed(String msgId, String sender, String receiver, String failedMessage) {
String createTime = Func.format(new Date(), DateUtil.PATTERN_DATETIME_MINI); String createTime = Func.format(new Date(), DateUtil.PATTERN_DATETIME_MINI);
return "<MCCI_IN000002UV01 xmlns=\"urn:hl7-org:v3\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ITSVersion=\"XML_1.0\" xsi:schemaLocation=\"urn:hl7-org:v3 file:///E:/hl7/HL7/v3ballot_fullsite_2011MAY/v3ballot/html/processable/multicacheschemas/MCCI _IN000002UV01.xsd\">" + return "<MCCI_IN000002UV01 xmlns=\"urn:hl7-org:v3\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ITSVersion=\"XML_1.0\" xsi:schemaLocation=\"urn:hl7-org:v3 file:///E:/hl7/HL7/v3ballot_fullsite_2011MAY/v3ballot/html/processable/multicacheschemas/MCCI _IN000002UV01.xsd\">" +
"<id extension=\""+IdUtil.standardUUID()+"\"/>" + "<id extension=\"" + IdUtil.standardUUID() + "\"/>" +
"<creationTime value=\""+createTime+"\"/>" + "<creationTime value=\"" + createTime + "\"/>" +
"<interactionId root=\"2.16.840.1.113883.1.6\" extension=\"MCCI_IN000002UV01\"/>" + "<interactionId root=\"2.16.840.1.113883.1.6\" extension=\"MCCI_IN000002UV01\"/>" +
"<processingCode code=\"P\"/>" + "<processingCode code=\"P\"/>" +
"<processingModeCode/>" + "<processingModeCode/>" +
@ -222,10 +293,10 @@ public class HIP1009InspectionReportUpdatesHandler implements WebserviceReceiveS
"</sender>" + "</sender>" +
"<acknowledgement typeCode=\"AE\">" + "<acknowledgement typeCode=\"AE\">" +
"<targetMessage>" + "<targetMessage>" +
"<id extension=\""+msgId+"\"/>" + "<id extension=\"" + msgId + "\"/>" +
"</targetMessage>" + "</targetMessage>" +
"<acknowledgementDetail>" + "<acknowledgementDetail>" +
"<text value=\""+failedMessage+"\"/>" + "<text value=\"" + failedMessage + "\"/>" +
"</acknowledgementDetail>" + "</acknowledgementDetail>" +
"</acknowledgement>" + "</acknowledgement>" +
"</MCCI_IN000002UV01>"; "</MCCI_IN000002UV01>";

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.docus.server.common.mapper.RemoteCallResultMapper">
<insert id="save">
INSERT INTO `docus_archivefile`.`remote_call_result`(`id`, `keyword`, `url`, `header`, `request`, `response`, `remark`, `description`, `request_storage_type`, `response_storage_type`, `call_status`, `call_start_time`, `call_end_time`)
VALUES (#{result.id}, #{result.keyword}, #{result.url}, #{result.header}, #{result.request}, #{result.response}, #{result.remark}, #{result.description}, #{result.requestStorageType}, #{result.responseStorageType}, #{result.callStatus}, #{result.callStartTime}, #{result.callEndTime})
</insert>
</mapper>
Loading…
Cancel
Save