diff --git a/data-config/sdry-report-system.json b/data-config/sdry-report-system.json index e080057..2fa2536 100644 --- a/data-config/sdry-report-system.json +++ b/data-config/sdry-report-system.json @@ -1,4 +1,15 @@ { - "blocking": ["xdxt","yx","jc"], - "notHandled":["lis","bl","nh"] + "blocking": [ + "xdxt", + "yx", + "jc" + ], + "notHandled": [ + "lis", + "bl", + "nh" + ], + "fetchBase64": [ + "cta" + ] } \ No newline at end of file diff --git a/src/main/java/com/docus/server/AppRunBootstrap.java b/src/main/java/com/docus/server/AppRunBootstrap.java index 3fa4302..8cff404 100644 --- a/src/main/java/com/docus/server/AppRunBootstrap.java +++ b/src/main/java/com/docus/server/AppRunBootstrap.java @@ -7,6 +7,8 @@ import com.docus.infrastructure.web.api.CommonResult; import com.docus.server.api.HospitalSubmitNodeServiceApi; import com.docus.server.api.dto.HospitalSubmitNodeLogAddDTO; 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 org.mybatis.spring.annotation.MapperScan; 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"); 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(){ HospitalSubmitNodeServiceApi hospitalSubmitNodeServiceApi = SpringUtils.getBean(HospitalSubmitNodeServiceApi.class); HospitalSubmitNodeLogAddDTO dto = new HospitalSubmitNodeLogAddDTO(); diff --git a/src/main/java/com/docus/server/common/entity/RemoteCallResult.java b/src/main/java/com/docus/server/common/entity/RemoteCallResult.java new file mode 100644 index 0000000..85f0e08 --- /dev/null +++ b/src/main/java/com/docus/server/common/entity/RemoteCallResult.java @@ -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; + + /** + * 请求参数存储类型 0表,1本地磁盘 + */ + private Integer requestStorageType; + + /** + * 请求参数存储类型 0表,1本地磁盘 + */ + private Integer responseStorageType; + + /** + * 调用情况 1正常,2连接异常,3业务异常 + */ + private Integer callStatus; + + /** + * 调用开始时间 + */ + private Date callStartTime; + + /** + * 调用结束时间 + */ + private Date callEndTime; + + public RemoteCallResult() { + } +} \ No newline at end of file diff --git a/src/main/java/com/docus/server/common/mapper/RemoteCallResultMapper.java b/src/main/java/com/docus/server/common/mapper/RemoteCallResultMapper.java new file mode 100644 index 0000000..0f43145 --- /dev/null +++ b/src/main/java/com/docus/server/common/mapper/RemoteCallResultMapper.java @@ -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); +} diff --git a/src/main/java/com/docus/server/common/service/RemoteCallResultService.java b/src/main/java/com/docus/server/common/service/RemoteCallResultService.java new file mode 100644 index 0000000..cc1aedf --- /dev/null +++ b/src/main/java/com/docus/server/common/service/RemoteCallResultService.java @@ -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); + +} diff --git a/src/main/java/com/docus/server/common/service/impl/RemoteCallResultServiceImpl.java b/src/main/java/com/docus/server/common/service/impl/RemoteCallResultServiceImpl.java new file mode 100644 index 0000000..687f4aa --- /dev/null +++ b/src/main/java/com/docus/server/common/service/impl/RemoteCallResultServiceImpl.java @@ -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); + } +} diff --git a/src/main/java/com/docus/server/common/util/FileUtil.java b/src/main/java/com/docus/server/common/util/FileUtil.java new file mode 100644 index 0000000..48ca817 --- /dev/null +++ b/src/main/java/com/docus/server/common/util/FileUtil.java @@ -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); + } +} diff --git a/src/main/java/com/docus/server/report/api/impl/ShunDePeopleServiceImpl.java b/src/main/java/com/docus/server/report/api/impl/ShunDePeopleServiceImpl.java index 5ee9e1f..1def689 100644 --- a/src/main/java/com/docus/server/report/api/impl/ShunDePeopleServiceImpl.java +++ b/src/main/java/com/docus/server/report/api/impl/ShunDePeopleServiceImpl.java @@ -6,13 +6,17 @@ import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.docus.core.util.DateUtil; +import com.docus.core.util.ExceptionUtils; import com.docus.core.util.Func; 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.dto.*; import com.docus.server.report.api.vo.SdRyBloodReportVO; import com.docus.server.report.client.JaxWsDynamicClient; 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.TableJsonRead; import com.docus.server.report.util.XmlUtil; @@ -22,10 +26,7 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -47,6 +48,10 @@ public class ShunDePeopleServiceImpl implements ShunDePeopleService { @Resource private SdRyReportQueryConfig sdRyReportQueryConfig; + @Resource + private ReportJob reportJob; + @Resource + private RemoteCallResultService remoteCallResultService; @Override @@ -141,18 +146,51 @@ public class ShunDePeopleServiceImpl implements ShunDePeopleService { // 参数3(FunctionType):传空,暂未启用 // 参数4(Caller):服务调用者名称,由PACS提供,验证令牌时 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(); try { String result = JaxWsDynamicClient.send(url, namespaceUri, operationName, param); if (interval > 0) { 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; } catch (Exception 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; } finally { PACS_PDF_LOCK.unlock(); + } } diff --git a/src/main/java/com/docus/server/report/config/SdRyReportHandledConfig.java b/src/main/java/com/docus/server/report/config/SdRyReportHandledConfig.java index ab885a4..0d7bd2b 100644 --- a/src/main/java/com/docus/server/report/config/SdRyReportHandledConfig.java +++ b/src/main/java/com/docus/server/report/config/SdRyReportHandledConfig.java @@ -8,49 +8,73 @@ import java.util.List; /** * 应用业务配置 + * * @author wyb */ public class SdRyReportHandledConfig { - private final SdRyReportSystem sdRyReportSystem; + private final static TableJsonRead JSON_READ = new TableJsonRead(); + @Data - private static class SdRyReportSystem{ + private static class SdRyReportSystem { /** - * 需要阻塞的报告来源系统 + * 需要阻塞的报告来源系统,报告和描述信息分开推送 */ - private List blocking = new ArrayList<>(); + private List blocking = new ArrayList<>(); /** - * 不处理的报告来源系统 + * 不处理的报告来源系统,job处理 */ private List notHandled = new ArrayList<>(); + + /** + * 需要获取base64的报告来源系统,原job处理的直接移动过来 + */ + private List fetchBase64 = new ArrayList<>(); } - public SdRyReportHandledConfig(){ - TableJsonRead jsonRead = new TableJsonRead(); - this.sdRyReportSystem= jsonRead.Read("data-config", "sdry-report-system.json", SdRyReportSystem.class); + + public SdRyReportHandledConfig() { + } - public boolean isBlocking(String systemName){ - if(this.sdRyReportSystem!=null){ - List blocking = this.sdRyReportSystem.getBlocking(); + + public SdRyReportSystem getSdRyReportSystem() { + return JSON_READ.Read("data-config", "sdry-report-system.json", SdRyReportSystem.class); + } + + public boolean isBlocking(String systemName) { + SdRyReportSystem sdRyReportSystem = getSdRyReportSystem(); + if (sdRyReportSystem != null) { + List blocking = sdRyReportSystem.getBlocking(); return blocking.contains(systemName); } return false; } - public boolean isNotHandled(String systemName){ - if(this.sdRyReportSystem!=null){ - List notHandled = this.sdRyReportSystem.getNotHandled(); + public boolean isNotHandled(String systemName) { + SdRyReportSystem sdRyReportSystem = getSdRyReportSystem(); + if (sdRyReportSystem != null) { + List notHandled = sdRyReportSystem.getNotHandled(); return notHandled.contains(systemName); } return false; } + public boolean isFetchBase64(String systemName) { + SdRyReportSystem sdRyReportSystem = getSdRyReportSystem(); + if (sdRyReportSystem != null) { + List getBase64System = sdRyReportSystem.getFetchBase64(); + return getBase64System.contains(systemName); + } + return false; + } + public static void main(String[] args) { 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("yx")); System.out.println(sdRyReportHandledConfig.isBlocking("yx")); System.out.println(sdRyReportHandledConfig.isBlocking("lis")); + System.out.println(sdRyReportHandledConfig.isFetchBase64("cta")); } } diff --git a/src/main/java/com/docus/server/report/job/ReportJob.java b/src/main/java/com/docus/server/report/job/ReportJob.java index a237694..fb53254 100644 --- a/src/main/java/com/docus/server/report/job/ReportJob.java +++ b/src/main/java/com/docus/server/report/job/ReportJob.java @@ -657,7 +657,7 @@ public class ReportJob { } - private String saveBase64(String base64) { + public String saveBase64(String base64) { String dir = createBase64SaveDir(); String base64File = dir + File.separator + idService.getDateSeq() + ".txt"; 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 { XmlUtil xmlUtil = XmlUtil.of(xml); Node codeNode = xmlUtil.getNode("/Result/Code"); diff --git a/src/main/java/com/docus/server/report/webservice/impl/HIP1008InspectionReportAdditionHandler.java b/src/main/java/com/docus/server/report/webservice/impl/HIP1008InspectionReportAdditionHandler.java index c72eae2..a5a84f7 100644 --- a/src/main/java/com/docus/server/report/webservice/impl/HIP1008InspectionReportAdditionHandler.java +++ b/src/main/java/com/docus/server/report/webservice/impl/HIP1008InspectionReportAdditionHandler.java @@ -3,9 +3,11 @@ package com.docus.server.report.webservice.impl; import com.docus.core.util.DateUtil; import com.docus.core.util.Func; 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.config.SdRyReportHandledConfig; 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.util.IdUtil; import com.docus.server.report.util.XmlUtil; @@ -20,6 +22,7 @@ import java.util.Date; /** * HIP1008-检查报告新增服务处理 + * * @author jiahsi */ @Service(WebserviceMessageType.HIP1008) @@ -27,6 +30,11 @@ import java.util.Date; public class HIP1008InspectionReportAdditionHandler implements WebserviceReceiveServerHandler { @Resource private ReportService reportService; + @Resource + private ShunDePeopleService shunDePeopleService; + @Resource + private ReportJob reportJob; + @Override public String handle(String receiveMessage) { @@ -46,11 +54,18 @@ public class HIP1008InspectionReportAdditionHandler implements WebserviceReceive if (sdRyReportHandledConfig.isNotHandled(sysFlag)) { return insertSuccess(msgId, sender, receiver); } - if(sdRyReportHandledConfig.isBlocking(sysFlag)){ + if (sdRyReportHandledConfig.isBlocking(sysFlag)) { reportDto.setDownUrl(null); reportService.reportBuffer(reportDto); 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); return insertSuccess(msgId, sender, receiver); } catch (BaseException baseException) { @@ -61,12 +76,72 @@ public class HIP1008InspectionReportAdditionHandler implements WebserviceReceive 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) { Node senderNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1008/sender/device/id/item/@extension"); String sender = senderNode.getNodeValue(); String zdAssortId = ZdAssortConfig.getZdAssortId(sender); - if(Func.isBlank(zdAssortId)){ - zdAssortId=ZdAssortConfig.getOtherAssortId(); + if (Func.isBlank(zdAssortId)) { + zdAssortId = ZdAssortConfig.getOtherAssortId(); } 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) { String createTime = Func.format(new Date(), DateUtil.PATTERN_DATETIME_MINI); return "" + - "" + - "" + + "" + + "" + "" + "" + "" + @@ -142,7 +217,7 @@ public class HIP1008InspectionReportAdditionHandler implements WebserviceReceive "" + "" + "" + - "" + + "" + "" + "" + "" + @@ -193,8 +268,8 @@ public class HIP1008InspectionReportAdditionHandler implements WebserviceReceive String createTime = Func.format(new Date(), DateUtil.PATTERN_DATETIME_MINI); return "" + - "" + - "" + + "" + + "" + "" + "" + "" + @@ -215,10 +290,10 @@ public class HIP1008InspectionReportAdditionHandler implements WebserviceReceive "" + "" + "" + - "" + + "" + "" + "" + - "" + + "" + "" + "" + ""; diff --git a/src/main/java/com/docus/server/report/webservice/impl/HIP1009InspectionReportUpdatesHandler.java b/src/main/java/com/docus/server/report/webservice/impl/HIP1009InspectionReportUpdatesHandler.java index f037ae7..65069d5 100644 --- a/src/main/java/com/docus/server/report/webservice/impl/HIP1009InspectionReportUpdatesHandler.java +++ b/src/main/java/com/docus/server/report/webservice/impl/HIP1009InspectionReportUpdatesHandler.java @@ -3,9 +3,11 @@ package com.docus.server.report.webservice.impl; import com.docus.core.util.DateUtil; import com.docus.core.util.Func; 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.config.SdRyReportHandledConfig; 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.util.IdUtil; import com.docus.server.report.util.XmlUtil; @@ -20,6 +22,7 @@ import java.util.Date; /** * HIP1009-检查报告更新服务 + * * @author jiahsi */ @Service(WebserviceMessageType.HIP1009) @@ -27,6 +30,10 @@ import java.util.Date; public class HIP1009InspectionReportUpdatesHandler implements WebserviceReceiveServerHandler { @Resource private ReportService reportService; + @Resource + private ShunDePeopleService shunDePeopleService; + @Resource + private ReportJob reportJob; @Override public String handle(String receiveMessage) { @@ -46,11 +53,18 @@ public class HIP1009InspectionReportUpdatesHandler implements WebserviceReceiveS if (sdRyReportHandledConfig.isNotHandled(sysFlag)) { return updateSuccess(msgId, sender, receiver); } - if(sdRyReportHandledConfig.isBlocking(sysFlag)){ + if (sdRyReportHandledConfig.isBlocking(sysFlag)) { reportDto.setDownUrl(null); reportService.reportBuffer(reportDto); 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); return updateSuccess(msgId, sender, receiver); } 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) { Node senderNode = inspectionUpdateXmlUtil.getNode("/POOR_HIP1009/sender/device/id/item/@extension"); String sender = senderNode.getNodeValue(); String zdAssortId = ZdAssortConfig.getZdAssortId(sender); - if(Func.isBlank(zdAssortId)){ - zdAssortId=ZdAssortConfig.getOtherAssortId(); + if (Func.isBlank(zdAssortId)) { + zdAssortId = ZdAssortConfig.getOtherAssortId(); } 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); return "" + - "" + - "" + + "" + + "" + "" + "" + "" + @@ -148,7 +219,7 @@ public class HIP1009InspectionReportUpdatesHandler implements WebserviceReceiveS "" + "" + "" + - "" + + "" + "" + "" + "" + @@ -200,8 +271,8 @@ public class HIP1009InspectionReportUpdatesHandler implements WebserviceReceiveS public String updateFailed(String msgId, String sender, String receiver, String failedMessage) { String createTime = Func.format(new Date(), DateUtil.PATTERN_DATETIME_MINI); return "" + - "" + - "" + + "" + + "" + "" + "" + "" + @@ -222,10 +293,10 @@ public class HIP1009InspectionReportUpdatesHandler implements WebserviceReceiveS "" + "" + "" + - "" + + "" + "" + "" + - "" + + "" + "" + "" + ""; diff --git a/src/main/resources/mapper/RemoteCallResultMapper.xml b/src/main/resources/mapper/RemoteCallResultMapper.xml new file mode 100644 index 0000000..6bc0223 --- /dev/null +++ b/src/main/resources/mapper/RemoteCallResultMapper.xml @@ -0,0 +1,11 @@ + + + + + + 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}) + +