From f1e4a8298a92658bbc5f6fadf8ba28cfb0cb9c93 Mon Sep 17 00:00:00 2001 From: wyb <1977763549@qq.com> Date: Tue, 17 Oct 2023 11:24:02 +0800 Subject: [PATCH] =?UTF-8?q?pacs=20=E8=A1=A5=E5=81=BFjob=EF=BC=8C=E5=92=8C?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/entity/SdryPacsPrintExcept.java | 58 +++++++ .../mapper/SdryPacsPrintExceptMapper.java | 20 +++ .../service/SdryPacsPrintExceptService.java | 21 +++ .../impl/SdryPacsPrintExceptServiceImpl.java | 57 +++++++ .../docus/server/common/util/FileUtil.java | 30 +++- .../server/report/job/FetchPacsBase64Job.java | 160 ++++++++++++++++++ ...IP1008InspectionReportAdditionHandler.java | 15 +- ...HIP1009InspectionReportUpdatesHandler.java | 18 +- .../resources/mapper/SdryPacsPrintExcept.xml | 38 +++++ 9 files changed, 402 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/docus/server/common/entity/SdryPacsPrintExcept.java create mode 100644 src/main/java/com/docus/server/common/mapper/SdryPacsPrintExceptMapper.java create mode 100644 src/main/java/com/docus/server/common/service/SdryPacsPrintExceptService.java create mode 100644 src/main/java/com/docus/server/common/service/impl/SdryPacsPrintExceptServiceImpl.java create mode 100644 src/main/java/com/docus/server/report/job/FetchPacsBase64Job.java create mode 100644 src/main/resources/mapper/SdryPacsPrintExcept.xml diff --git a/src/main/java/com/docus/server/common/entity/SdryPacsPrintExcept.java b/src/main/java/com/docus/server/common/entity/SdryPacsPrintExcept.java new file mode 100644 index 0000000..9f97f7c --- /dev/null +++ b/src/main/java/com/docus/server/common/entity/SdryPacsPrintExcept.java @@ -0,0 +1,58 @@ +package com.docus.server.common.entity; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 顺德人医pacs接口获取base64报告出错的记录 + * @author wyb + * @date 2023-10-17 + */ +@Data +public class SdryPacsPrintExcept implements Serializable { + + private static final long serialVersionUID = 1L; + + + private Long id; + + /** + * 病案号 + */ + private String inpatientNo; + + /** + * 住院次数 + */ + private Integer admissTimes; + + /** + * 记账号/住院流水号 + */ + private String jzh; + + /** + * 推送的消息一般比较大,不存数据库,存文件中,保存文件路径 + */ + private String reportMessagePath; + + /** + * 补偿状态,1 成功,其他未成功 + */ + private Integer state; + + /** + * 创建时间 + */ + private Date createTime; + + + /** + * 推送的标识 区分新增1008和更新1009 + */ + private String serviceFlag; + + public SdryPacsPrintExcept() {} +} \ No newline at end of file diff --git a/src/main/java/com/docus/server/common/mapper/SdryPacsPrintExceptMapper.java b/src/main/java/com/docus/server/common/mapper/SdryPacsPrintExceptMapper.java new file mode 100644 index 0000000..8e86139 --- /dev/null +++ b/src/main/java/com/docus/server/common/mapper/SdryPacsPrintExceptMapper.java @@ -0,0 +1,20 @@ +package com.docus.server.common.mapper; + +import com.docus.server.common.entity.SdryPacsPrintExcept; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 顺德人医pacs接口获取base64报告出错的记录 mapper + * @author wyb + */ +public interface SdryPacsPrintExceptMapper { + int insert(@Param("except") SdryPacsPrintExcept pacsPrintExcept); + + SdryPacsPrintExcept getById(@Param("id") Long id); + + int compensateSuccuss(@Param("id") Long id); + + List getCompensateIds(@Param("beginDateTime") String beginDateTime); +} diff --git a/src/main/java/com/docus/server/common/service/SdryPacsPrintExceptService.java b/src/main/java/com/docus/server/common/service/SdryPacsPrintExceptService.java new file mode 100644 index 0000000..1049407 --- /dev/null +++ b/src/main/java/com/docus/server/common/service/SdryPacsPrintExceptService.java @@ -0,0 +1,21 @@ +package com.docus.server.common.service; + +import com.docus.server.common.entity.SdryPacsPrintExcept; + +import java.util.List; + +/** + * 顺德pacs打印出错补偿的服务 + * @author WYBDEV + */ +public interface SdryPacsPrintExceptService { + + + int insert(SdryPacsPrintExcept pacsPrintExcept); + + SdryPacsPrintExcept getById(Long id); + + int compensateSuccuss(Long id); + + List getCompensateIds(String beginDateTime); +} diff --git a/src/main/java/com/docus/server/common/service/impl/SdryPacsPrintExceptServiceImpl.java b/src/main/java/com/docus/server/common/service/impl/SdryPacsPrintExceptServiceImpl.java new file mode 100644 index 0000000..55f8225 --- /dev/null +++ b/src/main/java/com/docus/server/common/service/impl/SdryPacsPrintExceptServiceImpl.java @@ -0,0 +1,57 @@ +package com.docus.server.common.service.impl; + +import com.docus.infrastructure.redis.service.IdService; +import com.docus.server.common.entity.SdryPacsPrintExcept; +import com.docus.server.common.mapper.SdryPacsPrintExceptMapper; +import com.docus.server.common.service.SdryPacsPrintExceptService; +import com.docus.server.common.util.FileUtil; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 远程调用存储服务业务实现 + * + * @author wyb + */ +@Service +public class SdryPacsPrintExceptServiceImpl implements SdryPacsPrintExceptService { + @Resource + private IdService idService; + @Resource + private SdryPacsPrintExceptMapper sdryPacsPrintExceptMapper; + + + private final static String MESSAGE_SAVE_PATH = FileUtil.currentPath() + File.separator + "pacs-print-error"; + + @Override + public int insert(SdryPacsPrintExcept pacsPrintExcept) { + Long id = pacsPrintExcept.getId(); + id = id == null ? idService.getDateSeq() : id; + pacsPrintExcept.setId(id); + return sdryPacsPrintExceptMapper.insert(pacsPrintExcept); + } + + @Override + public SdryPacsPrintExcept getById(Long id) { + return sdryPacsPrintExceptMapper.getById(id); + } + + @Override + public int compensateSuccuss(Long id) { + return sdryPacsPrintExceptMapper.compensateSuccuss(id); + } + + @Override + public List getCompensateIds(String beginDateTime) { + List ids= sdryPacsPrintExceptMapper.getCompensateIds(beginDateTime); + if(Objects.isNull(ids)){ + return new ArrayList<>(); + } + return ids; + } +} diff --git a/src/main/java/com/docus/server/common/util/FileUtil.java b/src/main/java/com/docus/server/common/util/FileUtil.java index 48ca817..1a8b906 100644 --- a/src/main/java/com/docus/server/common/util/FileUtil.java +++ b/src/main/java/com/docus/server/common/util/FileUtil.java @@ -2,9 +2,7 @@ package com.docus.server.common.util; import com.docus.core.util.Func; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; +import java.io.*; /** * 文件工具 @@ -67,5 +65,31 @@ public class FileUtil { String path = currentPath() + File.separator + "remotecall" + File.separator + Func.randomUUID() + ".txt"; File file = new File(path); saveStrData("随便写一点东西", file); + String where = readStr(file); + System.out.println(where); + } + + public static String readStr(File file) { + BufferedReader bufferedReader = null; + try { + StringBuilder sb = new StringBuilder(); + bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file))); + String line; + while ((line = bufferedReader.readLine()) != null) { + sb.append(line); + } + return sb.toString(); + } catch (Exception ex){ + ex.printStackTrace(); + return null; + }finally { + if(bufferedReader!=null){ + try { + bufferedReader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } } } diff --git a/src/main/java/com/docus/server/report/job/FetchPacsBase64Job.java b/src/main/java/com/docus/server/report/job/FetchPacsBase64Job.java new file mode 100644 index 0000000..a2c4659 --- /dev/null +++ b/src/main/java/com/docus/server/report/job/FetchPacsBase64Job.java @@ -0,0 +1,160 @@ +package com.docus.server.report.job; + +import com.docus.core.util.Func; +import com.docus.infrastructure.redis.service.IdService; +import com.docus.infrastructure.redis.service.RedisOps; +import com.docus.server.common.entity.SdryPacsPrintExcept; +import com.docus.server.common.service.SdryPacsPrintExceptService; +import com.docus.server.common.util.FileUtil; +import com.docus.server.report.api.dto.ReportDto; +import com.docus.server.report.service.ReportService; +import com.docus.server.report.util.XmlUtil; +import com.docus.server.report.webservice.WebserviceMessageType; +import com.docus.server.report.webservice.impl.HIP1008InspectionReportAdditionHandler; +import com.docus.server.report.webservice.impl.HIP1009InspectionReportUpdatesHandler; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.io.File; +import java.time.LocalDate; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * pacs获取base64报告相关xxl-Job + * + * @author jiashi + */ +@Component +@Slf4j +public class FetchPacsBase64Job { + /** + * 从pacs获取pdf报告base64内容时间过长,异步使用队列,采用job获取 + */ + public final static String FETCH_PACS_BASE64_QUEUE_HIP1008 = "docus:sdry:pacsbase64:" + WebserviceMessageType.HIP1008; + public final static String FETCH_PACS_BASE64_QUEUE_HIP1009 = "docus:sdry:pacsbase64:" + WebserviceMessageType.HIP1009; + + @Resource + private ReportService reportService; + @Resource + private RedisOps redisOps; + @Resource + private HIP1008InspectionReportAdditionHandler hip1008; + @Resource + private HIP1009InspectionReportUpdatesHandler hip1009; + @Resource + private SdryPacsPrintExceptService sdryPacsPrintExceptService; + @Resource + private IdService idService; + + public static void main(String[] args) { + LocalDate localDate = LocalDate.now().plusMonths(-3); + String beginDateTime = localDate.toString() + " 00:00:00"; + System.out.println(beginDateTime); + } + + + @XxlJob("compensateFetchBase64ReportJob") + public void compensateFetchBase64ReportJob() { + LocalDate localDate = LocalDate.now().plusMonths(-3); + String beginDateTime = localDate.toString() + " 00:00:00"; + List compensateIds = sdryPacsPrintExceptService.getCompensateIds(beginDateTime); + log.info("补偿失败的pacs获取base64文件数据JOB开始,本次补偿 {} 条数据!", compensateIds.size()); + if (Func.isNotEmpty(compensateIds)) { + for (Long id : compensateIds) { + try { + compensateFetchBase64Report(id); + } catch (Exception ex) { + log.error("补偿失败的pacs,补偿id:" + id + " 补偿失败了。", ex); + } + } + } + log.info("补偿失败的pacs获取base64文件数据JOB结束!"); + } + + /** + * 检查报告1009更新需要获取base64报告的job + */ + @XxlJob("fetchBase64ReportHip1008Job") + public void fetchBase64ReportHip1008Job() { + String xml = redisOps.rPop(FETCH_PACS_BASE64_QUEUE_HIP1008); + ReportDto reportDto = parse(WebserviceMessageType.HIP1008, xml); + if (reportDto != null) { + reportService.report(reportDto); + return; + } + String filePath = FileUtil.currentPath() + File.separator + "fetch-base64-xml" + + File.separator + WebserviceMessageType.HIP1008 + + File.separator + Func.formatDate(LocalDate.now()) + + File.separator + idService.getDateSeq(); + FileUtil.saveStrData(xml, new File(filePath)); + ReportDto reportDto2 = hip1008.getReportDtoByInspectionInsert(XmlUtil.of(xml)); + SdryPacsPrintExcept pacsPrintExcept = new SdryPacsPrintExcept(); + pacsPrintExcept.setInpatientNo(reportDto2.getInpatientNo()); + pacsPrintExcept.setAdmissTimes(reportDto2.getAdmisstimes()); + pacsPrintExcept.setJzh(reportDto2.getJzh()); + pacsPrintExcept.setReportMessagePath(filePath); + pacsPrintExcept.setServiceFlag(WebserviceMessageType.HIP1008); + pacsPrintExcept.setState(0); + pacsPrintExcept.setCreateTime(new Date()); + sdryPacsPrintExceptService.insert(pacsPrintExcept); + } + + /** + * 检查报告1009更新需要获取base64报告的job + */ + @XxlJob("fetchBase64ReportHip1009Job") + public void fetchBase64ReportHip1009Job() { + String xml = redisOps.rPop(FETCH_PACS_BASE64_QUEUE_HIP1009); + ReportDto reportDto = parse(WebserviceMessageType.HIP1009, xml); + if (reportDto != null) { + reportService.report(reportDto); + return; + } + String filePath = FileUtil.currentPath() + File.separator + "fetch-base64-xml" + + File.separator + WebserviceMessageType.HIP1009 + + File.separator + Func.formatDate(LocalDate.now()) + + File.separator + idService.getDateSeq(); + ReportDto reportDto2 = hip1009.getReportDtoByInspectionUpdate(XmlUtil.of(xml)); + SdryPacsPrintExcept pacsPrintExcept = new SdryPacsPrintExcept(); + pacsPrintExcept.setInpatientNo(reportDto2.getInpatientNo()); + pacsPrintExcept.setAdmissTimes(reportDto2.getAdmisstimes()); + pacsPrintExcept.setJzh(reportDto2.getJzh()); + pacsPrintExcept.setReportMessagePath(filePath); + pacsPrintExcept.setServiceFlag(WebserviceMessageType.HIP1009); + pacsPrintExcept.setState(0); + pacsPrintExcept.setCreateTime(new Date()); + sdryPacsPrintExceptService.insert(pacsPrintExcept); + } + + private void compensateFetchBase64Report(Long id) { + // base64的和job的检查报告统一处理逻辑,不然会出现重复 + SdryPacsPrintExcept except = sdryPacsPrintExceptService.getById(id); + String messagePath = except.getReportMessagePath(); + String xml = FileUtil.readStr(new File(messagePath)); + if (Objects.isNull(xml)) { + log.error("文件:{},获取xml内容为空!", messagePath); + return; + } + ReportDto reportDto = parse(except.getServiceFlag(), xml); + if (reportDto != null) { + reportService.report(reportDto); + sdryPacsPrintExceptService.compensateSuccuss(id); + } + } + + private ReportDto parse(String serviceFlag, String xml) { + XmlUtil xmlUtil = XmlUtil.of(xml); + if (serviceFlag.equals(WebserviceMessageType.HIP1008)) { + return hip1008.fetchBase64Parse(xmlUtil); + } + if (serviceFlag.equals(WebserviceMessageType.HIP1009)) { + return hip1009.fetchBase64Parse(xmlUtil); + } + return null; + } + +} 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 29781e4..21633f7 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,10 +3,12 @@ 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.infrastructure.redis.service.RedisOps; 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.FetchPacsBase64Job; import com.docus.server.report.job.ReportJob; import com.docus.server.report.service.ReportService; import com.docus.server.report.util.IdUtil; @@ -34,6 +36,8 @@ public class HIP1008InspectionReportAdditionHandler implements WebserviceReceive private ShunDePeopleService shunDePeopleService; @Resource private ReportJob reportJob; + @Resource + private RedisOps redisOps; @Override @@ -48,6 +52,7 @@ public class HIP1008InspectionReportAdditionHandler implements WebserviceReceive 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(); + // 如果是获取base64的,为什么这里要解析,因为这里可以提前解析知道问题,base64另外抽出来的方法,会响应超时,为了做异步 ReportDto reportDto = getReportDtoByInspectionInsert(xmlUtil); verifyFileInfo(reportDto); String sysFlag = reportDto.getSysFlag(); @@ -60,11 +65,9 @@ public class HIP1008InspectionReportAdditionHandler implements WebserviceReceive return insertSuccess(msgId, sender, receiver); } if (sdRyReportHandledConfig.isFetchBase64(sender)) { - // base64的和job的检查报告统一处理逻辑,不然会出现重复 - reportDto = fetchBase64Parse(xmlUtil); - if (reportDto == null) { - return insertFailed(msgId, sender, receiver, "未获取到报告PDF文件BASE64信息"); - } + // 过程很长,保存队列,job慢慢消费 + redisOps.lPush(FetchPacsBase64Job.FETCH_PACS_BASE64_QUEUE_HIP1008,receiveMessage); + return insertSuccess(msgId, sender, receiver); } reportService.report(reportDto); return insertSuccess(msgId, sender, receiver); @@ -77,7 +80,7 @@ public class HIP1008InspectionReportAdditionHandler implements WebserviceReceive } } - private ReportDto fetchBase64Parse(XmlUtil inspectionInsertXmlUtil) { + public ReportDto fetchBase64Parse(XmlUtil inspectionInsertXmlUtil) { Node senderNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1008/sender/device/id/item/@extension"); String updateBy = senderNode.getNodeValue(); 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 bca0905..7162031 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,10 +3,12 @@ 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.infrastructure.redis.service.RedisOps; 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.FetchPacsBase64Job; import com.docus.server.report.job.ReportJob; import com.docus.server.report.service.ReportService; import com.docus.server.report.util.IdUtil; @@ -34,6 +36,9 @@ public class HIP1009InspectionReportUpdatesHandler implements WebserviceReceiveS private ShunDePeopleService shunDePeopleService; @Resource private ReportJob reportJob; + @Resource + private RedisOps redisOps; + @Override public String handle(String receiveMessage) { @@ -47,6 +52,7 @@ public class HIP1009InspectionReportUpdatesHandler implements WebserviceReceiveS sender = xmlUtil.getNode("/POOR_HIP1009/sender/device/id/item/@extension").getNodeValue(); receiver = xmlUtil.getNode("/POOR_HIP1009/receiver/device/id/item/@extension").getNodeValue(); SdRyReportHandledConfig sdRyReportHandledConfig = new SdRyReportHandledConfig(); + // 如果是获取base64的,为什么这里要解析,因为这里可以提前解析知道问题,base64另外抽出来的方法,会响应超时,为了做异步 ReportDto reportDto = getReportDtoByInspectionUpdate(xmlUtil); verifyFileInfo(reportDto); String sysFlag = reportDto.getSysFlag(); @@ -59,11 +65,9 @@ public class HIP1009InspectionReportUpdatesHandler implements WebserviceReceiveS return updateSuccess(msgId, sender, receiver); } if (sdRyReportHandledConfig.isFetchBase64(sender)) { - // base64的和job的检查报告统一处理逻辑,不然会出现重复 - reportDto = fetchBase64Parse(xmlUtil); - if (reportDto == null) { - return updateFailed(msgId, sender, receiver, "未获取到报告PDF文件BASE64信息"); - } + // 过程很长,保存队列,job慢慢消费 + redisOps.lPush(FetchPacsBase64Job.FETCH_PACS_BASE64_QUEUE_HIP1009,receiveMessage); + return updateSuccess(msgId, sender, receiver); } reportService.report(reportDto); return updateSuccess(msgId, sender, receiver); @@ -76,7 +80,9 @@ public class HIP1009InspectionReportUpdatesHandler implements WebserviceReceiveS } } - private ReportDto fetchBase64Parse(XmlUtil inspectionInsertXmlUtil) { + + + public ReportDto fetchBase64Parse(XmlUtil inspectionInsertXmlUtil) { Node senderNode = inspectionInsertXmlUtil.getNode("/POOR_HIP1009/sender/device/id/item/@extension"); String updateBy = senderNode.getNodeValue(); diff --git a/src/main/resources/mapper/SdryPacsPrintExcept.xml b/src/main/resources/mapper/SdryPacsPrintExcept.xml new file mode 100644 index 0000000..4817569 --- /dev/null +++ b/src/main/resources/mapper/SdryPacsPrintExcept.xml @@ -0,0 +1,38 @@ + + + + + + + INSERT INTO `docus_archivefile`.`sdry_pacs_print_except`(`id`, `inpatient_no`, `admiss_times`, `jzh`, `report_message_path`, `state`, `create_time`, `service_flag`) + VALUES (#{except.id}, #{except.inpatientNo}, #{except.admissTimes}, #{except.jzh}, #{except.reportMessagePath}, 0, #{except.createTime}, #{except.serviceFlag}); + + + update + `docus_archivefile`.`sdry_pacs_print_except` + set `state`=1 + where id=#{id} + + + +