From b3863354f9b97793bcdcccbf00030ead6e4f9aa7 Mon Sep 17 00:00:00 2001 From: wyb <1977763549@qq.com> Date: Wed, 7 Jun 2023 17:34:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A8=E9=80=81pdf=20Webservice=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/report/api/dto/ReportDto.java | 19 ++- .../report/entity/AfReportRecordBuffer.java | 22 ++- .../report/mapper/AfReportRecordMapper.java | 65 +++++++-- .../server/report/service/ReportService.java | 7 + .../service/impl/ReportServiceImpl.java | 48 ++++++- .../report/webservice/IReportServer.java | 7 + .../webservice/impl/SdryReportServerImpl.java | 129 +++++++++++++++++- .../resources/mapper/AfReportRecordMapper.xml | 40 ++++++ 8 files changed, 321 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/docus/server/report/api/dto/ReportDto.java b/src/main/java/com/docus/server/report/api/dto/ReportDto.java index 748e681..bf26e50 100644 --- a/src/main/java/com/docus/server/report/api/dto/ReportDto.java +++ b/src/main/java/com/docus/server/report/api/dto/ReportDto.java @@ -1,5 +1,6 @@ package com.docus.server.report.api.dto; +import com.docus.server.report.entity.AfReportRecordBuffer; import lombok.Data; /** @@ -64,11 +65,27 @@ public class ReportDto { /** * 下载路径类型 1:url,2:base64,3:url base64,4:共享文件,5:本地文件base64 */ - private Integer downtype=1; + private Integer downtype = 1; /** * 检查报告单号,用于顺德人医推送 报告信息和报告地址的关联 */ private String reportSn; + + public ReportDto() { + } + + public ReportDto(AfReportRecordBuffer buffer) { + this.jzh = buffer.getJzh(); + this.inpatientNo = buffer.getInpatientNo(); + this.admisstimes = buffer.getAdmissTimes(); + this.assortId = buffer.getZdAssortId(); + this.serialnum = buffer.getSerialnum(); + this.fileTitle = buffer.getFileName(); + this.fileSource = "1"; + this.filestoragetype = "1"; + this.downtype = buffer.getDownType(); + this.reportSn = buffer.getReportSn(); + } } diff --git a/src/main/java/com/docus/server/report/entity/AfReportRecordBuffer.java b/src/main/java/com/docus/server/report/entity/AfReportRecordBuffer.java index 9ff7801..9bcedba 100644 --- a/src/main/java/com/docus/server/report/entity/AfReportRecordBuffer.java +++ b/src/main/java/com/docus/server/report/entity/AfReportRecordBuffer.java @@ -42,10 +42,6 @@ public class AfReportRecordBuffer implements Serializable { */ private Integer downType; - /** - * 状态 0 未开始,可用于补偿,1 已发送下载 - */ - private Integer state; /** * 报告唯一id @@ -103,4 +99,22 @@ public class AfReportRecordBuffer implements Serializable { this.downType = reportDto.getDowntype(); this.reportSn=reportDto.getReportSn(); } + + public void setFileInfo(ReportDto reportDto) { + this.jzh = reportDto.getJzh(); + this.admissTimes = reportDto.getAdmisstimes(); + this.inpatientNo = reportDto.getInpatientNo(); + this.sysflag = reportDto.getSysFlag(); + this.zdAssortId = reportDto.getAssortId(); + this.serialnum = reportDto.getSerialnum(); + this.fileName = reportDto.getFileTitle(); + this.reportSn=reportDto.getReportSn(); + } + + + public void setFileUrl(ReportDto reportDto) { + this.downUrl = reportDto.getDownUrl(); + this.downType = reportDto.getDowntype(); + this.reportSn=reportDto.getReportSn(); + } } \ No newline at end of file diff --git a/src/main/java/com/docus/server/report/mapper/AfReportRecordMapper.java b/src/main/java/com/docus/server/report/mapper/AfReportRecordMapper.java index 8c74b50..2198ed1 100644 --- a/src/main/java/com/docus/server/report/mapper/AfReportRecordMapper.java +++ b/src/main/java/com/docus/server/report/mapper/AfReportRecordMapper.java @@ -1,17 +1,20 @@ package com.docus.server.report.mapper; import com.docus.server.report.entity.AfReportRecord; +import com.docus.server.report.entity.AfReportRecordBuffer; import org.apache.ibatis.annotations.Param; import java.util.List; /** * 上报记录保存表 + * * @author wyb */ public interface AfReportRecordMapper { /** * 保存报告推送记录 + * * @param afReportRecord 报告推送记录 * @return 数据库操作结果 */ @@ -19,23 +22,26 @@ public interface AfReportRecordMapper { /** * 根据文件唯一号 住院号 住院次数 系统标识 得到唯一推送记录 - * @param serialnum 报告唯一号 + * + * @param serialnum 报告唯一号 * @param inpatientNo 住院号 * @param admisstimes 住院次数 - * @param sysFlag 系统标识 + * @param sysFlag 系统标识 * @return 报告推送记录 */ - AfReportRecord getRecordBySerialnumAndInpatientNoAndSysFlag(@Param("serialnum") String serialnum, @Param("inpatientNo")String inpatientNo,@Param("admisstimes") Integer admisstimes, @Param("sysFlag")String sysFlag); + AfReportRecord getRecordBySerialnumAndInpatientNoAndSysFlag(@Param("serialnum") String serialnum, @Param("inpatientNo") String inpatientNo, @Param("admisstimes") Integer admisstimes, @Param("sysFlag") String sysFlag); /** * 更新报告推送 主要更新 下载地址,下载类型,文件名称 + * * @param afReportRecord 报告推送记录 * @return 数据库操作结果 */ - int updateRecordByTaskId(@Param("reportRecord")AfReportRecord afReportRecord); + int updateRecordByTaskId(@Param("reportRecord") AfReportRecord afReportRecord); /** * 更新记录的状态 + * * @param taskId 任务id * @return 数据库操作结果 */ @@ -45,6 +51,7 @@ public interface AfReportRecordMapper { /** * 根据任务id查询有patientId数据的任务id + * * @param taskIds 任务id集合 * @return 数据有patientId的任务id集合 */ @@ -52,17 +59,59 @@ public interface AfReportRecordMapper { /** * 获取未开始的报告记录 - * @param page 分页页码 + * + * @param page 分页页码 * @param pageSize 一页条数 * @return 未开始的报告记录 */ - List getStartStateReportRecord(@Param("page") int page,@Param("pageSize") int pageSize); + List getStartStateReportRecord(@Param("page") int page, @Param("pageSize") int pageSize); /** * 根据任务id更新病案主键 + * * @param patientId 病案主键 - * @param taskId 任务id + * @param taskId 任务id + * @return 数据库操作结果 + */ + int updateReportRecordPatientId(@Param("patientId") String patientId, @Param("taskId") Long taskId); + + /** + * 报告流水号 + * + * @param reportSn 报告流水号 + * @return 缓存表 + */ + AfReportRecordBuffer getReportRecordBufferInfo(@Param("reportSn") String reportSn); + + /** + * 保存临时文件记录表文件信息 不含地址 + * + * @param bufferInfo 临时信息 + * @return 数据库操作结果 + */ + int saveRecordBufferFileInfo(@Param("bufferInfo") AfReportRecordBuffer bufferInfo); + + /** + * 保存临时文件记录表文件信息地址 + * + * @param bufferInfo 临时信息 * @return 数据库操作结果 */ - int updateReportRecordPatientId(@Param("patientId") String patientId,@Param("taskId") Long taskId); + int saveRecordBufferFileUrl(@Param("bufferInfo") AfReportRecordBuffer bufferInfo); + + /** + * 阻塞通过 + * + * @param id 临时记录表id + * @return 数据库更新结果 + */ + int cancelBlocking(@Param("id") Long id); + + /** + * 更新缓存临时记录表信息 + * + * @param bufferInfo 缓存临时记录表信息 + * @return 数据库更新结果 + */ + int updateRecordBuffer(@Param("bufferInfo") AfReportRecordBuffer bufferInfo); } \ No newline at end of file diff --git a/src/main/java/com/docus/server/report/service/ReportService.java b/src/main/java/com/docus/server/report/service/ReportService.java index aae0928..86ff3fe 100644 --- a/src/main/java/com/docus/server/report/service/ReportService.java +++ b/src/main/java/com/docus/server/report/service/ReportService.java @@ -16,9 +16,16 @@ public interface ReportService { */ void report(ReportDto reportDto); + /** + * 上报文件,顺德人医的报告信息和报告地址是两个接口推送的,做了一层等待 + * @param reportDto 上报文件参数 + */ + void reportBuffer(ReportDto reportDto); + /** * 根据任务id集合补偿下载 * @param taskIds 任务id集合 */ void makeupThreePartyPushReportByTaskIds(List taskIds) throws Exception; + } diff --git a/src/main/java/com/docus/server/report/service/impl/ReportServiceImpl.java b/src/main/java/com/docus/server/report/service/impl/ReportServiceImpl.java index 9d5a8a8..2137c15 100644 --- a/src/main/java/com/docus/server/report/service/impl/ReportServiceImpl.java +++ b/src/main/java/com/docus/server/report/service/impl/ReportServiceImpl.java @@ -6,11 +6,11 @@ import com.docus.server.collection.mapper.TBasicMapper; import com.docus.server.report.api.dto.ReportDto; import com.docus.server.report.entity.AfCollectTask; import com.docus.server.report.entity.AfReportRecord; +import com.docus.server.report.entity.AfReportRecordBuffer; import com.docus.server.report.event.TaskConsumptionReportDownEvent; import com.docus.server.report.event.ThreePartyPushReportDownEvent; import com.docus.server.report.mapper.AfCollectTaskMapper; import com.docus.server.report.mapper.AfReportRecordMapper; - import com.docus.server.report.service.ReportService; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; @@ -19,6 +19,8 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; /** * 报告服务实现类 @@ -28,7 +30,7 @@ import java.util.concurrent.TimeUnit; @Slf4j @Service public class ReportServiceImpl implements ReportService { - + private static final Lock REPORT_BUFFER_LOCK = new ReentrantLock(); @Resource private ApplicationContext applicationContext; @Resource @@ -50,6 +52,48 @@ public class ReportServiceImpl implements ReportService { threePartyPushReports(reportDto); } + @Override + public void reportBuffer(ReportDto reportDto) { + // 根据地址判断推送的是文件信息还是地址 + String downUrl = reportDto.getDownUrl(); + boolean isSaveOrUpdateDownloadUrl = Func.isNotBlank(downUrl); + // 当前一个服务,以后有需要可以用分布式锁 + REPORT_BUFFER_LOCK.lock(); + try { + AfReportRecordBuffer bufferInfo = afReportRecordMapper.getReportRecordBufferInfo(reportDto.getReportSn()); + if (bufferInfo == null) { + bufferInfo = new AfReportRecordBuffer(reportDto); + bufferInfo.setId(idService.getDateSeq()); + // 保存文件地址或者文件信息 + if (isSaveOrUpdateDownloadUrl) { + bufferInfo.setFileUrl(reportDto); + afReportRecordMapper.saveRecordBufferFileInfo(bufferInfo); + } else { + bufferInfo.setFileInfo(reportDto); + afReportRecordMapper.saveRecordBufferFileUrl(bufferInfo); + } + return; + } + String bufferDownUrl = bufferInfo.getDownUrl(); + // 设置地址或者文件信息 + if (isSaveOrUpdateDownloadUrl) { + bufferInfo.setFileUrl(reportDto); + } else { + bufferInfo.setFileInfo(reportDto); + } + afReportRecordMapper.updateRecordBuffer(bufferInfo); + // 文件信息和地址都有,可以上报文件 + boolean canReport = (isSaveOrUpdateDownloadUrl && Func.isBlank(bufferDownUrl)) || (!isSaveOrUpdateDownloadUrl && Func.isNotBlank(bufferDownUrl)); + if (canReport) { + afReportRecordMapper.cancelBlocking(bufferInfo.getId()); + ReportDto dto = new ReportDto(bufferInfo); + report(dto); + } + } finally { + REPORT_BUFFER_LOCK.unlock(); + } + } + private void taskConsumptionReport(ReportDto reportDto) { applicationContext.publishEvent(new TaskConsumptionReportDownEvent(this, reportDto)); try { diff --git a/src/main/java/com/docus/server/report/webservice/IReportServer.java b/src/main/java/com/docus/server/report/webservice/IReportServer.java index 89a8e34..b7a061b 100644 --- a/src/main/java/com/docus/server/report/webservice/IReportServer.java +++ b/src/main/java/com/docus/server/report/webservice/IReportServer.java @@ -43,4 +43,11 @@ public interface IReportServer { * @return 成功或者异常信息 */ String pushUpdateInspectionReport(String inspectionReportMessage); + + /** + * HIP1166-pdf件上传服务 顺德人医 ,和检查报告配合 + * @param uploadMessage pdf上传信息 + * @return 成功或者异常信息 + */ + String pdfUpload(String uploadMessage); } diff --git a/src/main/java/com/docus/server/report/webservice/impl/SdryReportServerImpl.java b/src/main/java/com/docus/server/report/webservice/impl/SdryReportServerImpl.java index 75bb37b..4057ae8 100644 --- a/src/main/java/com/docus/server/report/webservice/impl/SdryReportServerImpl.java +++ b/src/main/java/com/docus/server/report/webservice/impl/SdryReportServerImpl.java @@ -4,6 +4,7 @@ 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.dto.ReportDto; +import com.docus.server.report.config.SdRyReportHandledConfig; import com.docus.server.report.config.ZdAssortConfig; import com.docus.server.report.service.ReportService; import com.docus.server.report.util.IdUtil; @@ -223,8 +224,17 @@ public class SdryReportServerImpl implements IReportServer { msgId = xmlUtil.getNode("/POOR_HIP1008/id/@extension").getNodeValue(); sender = xmlUtil.getNode("/POOR_HIP1008/sender/device/id/item/@extension").getNodeValue(); receiver = xmlUtil.getNode("/POOR_HIP1008/receiver/device/id/item/@extension").getNodeValue(); - + SdRyReportHandledConfig sdRyReportHandledConfig = new SdRyReportHandledConfig(); ReportDto reportDto = getReportDtoByInspectionInsert(xmlUtil); + String sysFlag = reportDto.getSysFlag(); + if (sdRyReportHandledConfig.isNotHandled(sysFlag)) { + return insertSuccess(msgId, sender, receiver); + } + if(sdRyReportHandledConfig.isBlocking(sysFlag)){ + reportDto.setDownUrl(null); + reportService.reportBuffer(reportDto); + return insertSuccess(msgId, sender, receiver); + } verifyReportDto(reportDto); reportService.report(reportDto); return insertSuccess(msgId, sender, receiver); @@ -264,6 +274,123 @@ public class SdryReportServerImpl implements IReportServer { } + @Override + public String pdfUpload(String uploadMessage) { + log.info("收到pdf上传信息{}", uploadMessage); + String msgId = ""; + String sender = ""; + String receiver = ""; + try { + XmlUtil xmlUtil = XmlUtil.of(uploadMessage); + msgId = xmlUtil.getNode("/POOR_HIP1166/id/@extension").getNodeValue(); + sender = xmlUtil.getNode("/POOR_HIP1166/sender/device/id/item/@extension").getNodeValue(); + receiver = xmlUtil.getNode("/POOR_HIP1166/receiver/device/id/item/@extension").getNodeValue(); + ReportDto reportDto = getReportDtoByPdfUpload(xmlUtil); + reportService.reportBuffer(reportDto); + return uploadSuccess(msgId, sender, receiver); + } catch (BaseException baseException) { + log.error(baseException.getMessage(), baseException); + return uploadFailed(msgId, sender, receiver, baseException.getMessage()); + } catch (Exception ex) { + log.error(ex.getMessage(), ex); + return uploadFailed(msgId, sender, receiver, "系统错误!"); + } + + } + + private String uploadFailed(String msgId, String sender, String receiver, String message) { + String createTime = Func.format(new Date(), DateUtil.PATTERN_DATETIME_MINI); + return "\n" + + "\t\n" + + "\t\n" + + "\t\n" + + "\t\n" + + "\t\n" + + "\t\n" + + "\t\n" + + "\t\t\n" + + "\t\t\t\n" + + "\t\t\t\t\n" + + "\t\t\t\n" + + "\t\t\n" + + "\t\n" + + "\t\n" + + "\t\t\n" + + "\t\t\t\n" + + "\t\t\t\t\n" + + "\t\t\t\n" + + "\t\t\n" + + "\t\n" + + "\t\n" + + "\t\t\n" + + "\t\t\n" + + "\t\t\t\n" + + "\t\t\n" + + "\t\t\n" + + "\t\t\n" + + "\t\t\t\n" + + "\t\t\t\t\n" + + "\t\t\t\n" + + "\t\t\n" + + "\t\n" + + ""; + } + + private String uploadSuccess(String msgId, String sender, String receiver) { + String createTime = Func.format(new Date(), DateUtil.PATTERN_DATETIME_MINI); + return "\n" + + "\t\n" + + "\t\n" + + "\t\n" + + "\t\n" + + "\t\n" + + "\t\n" + + "\t\n" + + "\t\t\n" + + "\t\t\t\n" + + "\t\t\t\t\n" + + "\t\t\t\n" + + "\t\t\n" + + "\t\n" + + "\t\n" + + "\t\t\n" + + "\t\t\t\n" + + "\t\t\t\t\n" + + "\t\t\t\n" + + "\t\t\n" + + "\t\n" + + "\t\n" + + "\t\t\n" + + "\t\t\n" + + "\t\t\t\n" + + "\t\t\n" + + "\t\t\n" + + "\t\t\n" + + "\t\t\t\n" + + "\t\t\t\t\n" + + "\t\t\t\n" + + "\t\t\n" + + "\t\n" + + "\n"; + } + + private ReportDto getReportDtoByPdfUpload(XmlUtil xmlUtil) { + // 检查报告单号标识 + Node reportSnNode = xmlUtil.getNode("/POOR_HIP1166/controlActProcess/component/structuredBody/component[@displayName='文档描述信息']/section/entry/reportInfomation/reportSn/@extension"); + String reportSn = reportSnNode.getNodeValue(); + + Node downUrlNode = xmlUtil.getNode("/POOR_HIP1166/controlActProcess/component/structuredBody/component[@displayName='文档描述信息']/section/entry/reportInfomation/reportPath/@extension"); + String downUrl = downUrlNode.getTextContent(); + + ReportDto reportDto = new ReportDto(); + reportDto.setReportSn(reportSn); + reportDto.setDowntype(1); + reportDto.setDownUrl(downUrl); + return reportDto; + } + + + /** * 验证上报文件的信息 * diff --git a/src/main/resources/mapper/AfReportRecordMapper.xml b/src/main/resources/mapper/AfReportRecordMapper.xml index a31ed23..783d538 100644 --- a/src/main/resources/mapper/AfReportRecordMapper.xml +++ b/src/main/resources/mapper/AfReportRecordMapper.xml @@ -13,6 +13,23 @@ #{reportRecord.sysflag}, #{reportRecord.zdAssortId}, now(), now(), #{reportRecord.fileName}, #{reportRecord.patientId}); + + + + INSERT INTO `docus_archivefile`.`af_report_record_buffer`(`id`, `inpatient_no`, `jzh`, `admiss_times`, + `serialnum`, `sysflag`, `zd_assort_id`, `create_time`, + `update_time`, `file_name`, `report_sn`, `blocking`) + VALUES (#{bufferInfo.id}, #{bufferInfo.inpatientNo}, #{bufferInfo.jzh}, #{bufferInfo.admissTimes}, + #{bufferInfo.serialnum}, #{bufferInfo.sysflag}, #{bufferInfo.zdAssortId}, now(), now(), + #{bufferInfo.fileName}, #{bufferInfo.reportSn}, 0); + + + INSERT INTO `docus_archivefile`.`af_report_record_buffer`(`id`, `down_url`, `down_type`, + `report_sn`, `blocking`,create_time,update_time) + VALUES (#{bufferInfo.id}, #{bufferInfo.downUrl},#{bufferInfo.downType}, #{bufferInfo.reportSn}, 0,now(),now()); + + + update `docus_archivefile`.`af_report_record` set `down_url`=#{reportRecord.downUrl}, @@ -34,6 +51,25 @@ set `patient_id`= #{patientId} where `task_id` = #{taskId} + + UPDATE `docus_archivefile`.`af_report_record_buffer` SET `blocking` = 1 WHERE `id` = #{id}; + + + UPDATE `docus_archivefile`.`af_report_record_buffer` + SET `inpatient_no` = #{bufferInfo.inpatientNo}, + `jzh` = #{bufferInfo.jzh}, + `admiss_times` = #{bufferInfo.admissTimes}, + `down_url` = #{bufferInfo.downUrl}, + `down_type` = #{bufferInfo.downType}, + `serialnum` = #{bufferInfo.serialnum}, + `sysflag` = #{bufferInfo.sysflag}, + `zd_assort_id` = #{bufferInfo.zdAssortId}, + `update_time` = now(), + `file_name` = #{bufferInfo.fileName}, + `report_sn` = #{bufferInfo.reportSn} + WHERE + `id` = #{bufferInfo.id}; + +