From 7f41fe15ec1a742620c074da949748e54e5eac70 Mon Sep 17 00:00:00 2001
From: wyb <1977763549@qq.com>
Date: Tue, 9 Sep 2025 15:47:33 +0800
Subject: [PATCH] =?UTF-8?q?imp:=20=E4=BD=BF=E7=94=A8=E5=A4=9A=E7=BA=BF?=
=?UTF-8?q?=E7=A8=8B=E5=90=8C=E6=AD=A5=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.idea/jarRepositories.xml | 20 ++-
.../demo/job/GzFirstLabReportSyncJob.java | 20 ++-
.../docus/demo/mapper/mysql/BasicMapper.java | 2 +-
.../docus/demo/service/WebServiceImpl.java | 131 +++++++++---------
.../com/docus/demo/utils/PDFFileUtils.java | 19 +--
src/main/resources/application.yml | 3 +-
.../resources/mapper/mysql/BasicMapper.xml | 9 ++
7 files changed, 120 insertions(+), 84 deletions(-)
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index 5bf8b57..08b77b6 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -11,16 +11,16 @@
-
-
-
-
-
+
+
+
+
+
@@ -31,6 +31,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/com/docus/demo/job/GzFirstLabReportSyncJob.java b/src/main/java/com/docus/demo/job/GzFirstLabReportSyncJob.java
index 46371f6..3f091f3 100644
--- a/src/main/java/com/docus/demo/job/GzFirstLabReportSyncJob.java
+++ b/src/main/java/com/docus/demo/job/GzFirstLabReportSyncJob.java
@@ -6,12 +6,16 @@ import com.docus.demo.facade.IWebService;
import com.docus.demo.mapper.mysql.BasicMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.util.List;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
/**
@@ -28,13 +32,23 @@ public class GzFirstLabReportSyncJob {
@Resource
private BasicMapper basicMapper;
+ @Value("${labSyncDisDateStart:2018-01-01}")
+ private String labSyncDisDateStart;
+
private AtomicBoolean isAllRunning = new AtomicBoolean(false);
private AtomicBoolean isThreeRunning = new AtomicBoolean(false);
+ private static final int coreThreads = Runtime.getRuntime().availableProcessors() - 1;
+ private static final ThreadPoolExecutor LAB_SYNC_EXECUTOR = new ThreadPoolExecutor(coreThreads,
+ coreThreads + 1,
+ 30, TimeUnit.SECONDS,
+ new ArrayBlockingQueue<>(200),
+ new ThreadPoolExecutor.CallerRunsPolicy());
+
@Scheduled(cron = "0 0 3 1 * ?")
public void syncAllLabReport() {
LocalDate today = LocalDate.now();
- LocalDate syncDisDate = LocalDate.parse("2018-01-01");
+ LocalDate syncDisDate = LocalDate.parse(labSyncDisDateStart);
String startDateTime = "2018-01-01 00:00:00";
String endDateTime = today + " 23:59:59";
if (isAllRunning.compareAndSet(false, true)) {
@@ -47,7 +61,7 @@ public class GzFirstLabReportSyncJob {
if (CollUtil.isNotEmpty(tbasicList)) {
for (Tbasic tbasic : tbasicList) {
- iWebService.syncInspection(tbasic, startDateTime, endDateTime);
+ LAB_SYNC_EXECUTOR.execute(() -> iWebService.syncInspection(tbasic, startDateTime, endDateTime));
}
}
@@ -83,7 +97,7 @@ public class GzFirstLabReportSyncJob {
break;
}
for (Tbasic tbasic : tbasicList) {
- iWebService.syncInspection(tbasic, startDateTime, endDateTime);
+ LAB_SYNC_EXECUTOR.execute(() -> iWebService.syncInspection(tbasic, startDateTime, endDateTime));
}
offset = offset + limit;
}
diff --git a/src/main/java/com/docus/demo/mapper/mysql/BasicMapper.java b/src/main/java/com/docus/demo/mapper/mysql/BasicMapper.java
index c1cacdf..94971d5 100644
--- a/src/main/java/com/docus/demo/mapper/mysql/BasicMapper.java
+++ b/src/main/java/com/docus/demo/mapper/mysql/BasicMapper.java
@@ -61,6 +61,6 @@ public interface BasicMapper {
int updateNotArchive(@Param("patientId")String patientId);
-
+ int addLabSync(@Param("patientId") String patientId,@Param("status") Integer status);
}
diff --git a/src/main/java/com/docus/demo/service/WebServiceImpl.java b/src/main/java/com/docus/demo/service/WebServiceImpl.java
index d5bba0f..5c63ae9 100644
--- a/src/main/java/com/docus/demo/service/WebServiceImpl.java
+++ b/src/main/java/com/docus/demo/service/WebServiceImpl.java
@@ -25,11 +25,13 @@ import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
@Slf4j
@Service
@@ -100,88 +102,93 @@ public class WebServiceImpl implements IWebService {
@Override
public void syncInspection(Tbasic tbasic, String startDate, String endDate) {
- log.info("正在同步" + tbasic.getInpatientNo() + " " + tbasic.getAdmissTimes());
- List oldScanAssortList = scanAssortMapper.getListByAssortId("A5A7AA6796D1715A2F1E35699C706C84", tbasic.getPatientId());
- log.info("旧数据" + oldScanAssortList.size());
- if (oldScanAssortList.size() > 0) {
- log.info("跳过同步" + tbasic.getInpatientNo() + " " + tbasic.getAdmissTimes());
- return;
+ Date admissDate = tbasic.getAdmissDate();
+ // 如果报告的开始时间大于入院时间,则开始时间取入院时间
+ if (admissDate != null) {
+ try {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ Date startDateParse = sdf.parse(startDate);
+ if (startDateParse.getTime() > admissDate.getTime()) {
+ startDate = sdf.format(admissDate);
+ }
+ } catch (Exception ignored) {
+ }
}
-
- String pNo = tbasic.getInpatientNo();
+ String inpatientNo = tbasic.getInpatientNo();
String times = tbasic.getAdmissTimes().toString();
-// String StartDate = sdf.format(tbasic.getAdmissDate());
-// String EndDate = sdf.format(tbasic.getDisDate());
-
String patientId = tbasic.getPatientId();
-
+ log.info("同步检验报告,病案号:{},住院次数:{}", inpatientNo, times);
+ List oldScanAssortList = scanAssortMapper.getListByAssortId("A5A7AA6796D1715A2F1E35699C706C84", patientId);
+ int size = oldScanAssortList.size();
+ if (size > 0) {
+ log.info("同步检验报告跳过同步,病案号:{},住院次数:{} 已经存在 {} 份检验报告", inpatientNo, times, size);
+ return;
+ }
+ basicMapper.addLabSync(patientId,0);
//获取所有的报告列表
- PatientListResult patientListResult = getCommonResult(pNo, times, startDate, endDate);
-
-// log.info("返回结果"+patientListResult);
+ PatientListResult patientListResult = getCommonResult(inpatientNo, times, startDate, endDate);
if (patientListResult == null) {
- log.error(pNo + " " + times + "调用失败");
+ log.warn("同步检验报告,病案号:{},住院次数:{},开始时间:{},结束时间:{} 未查到报告!", inpatientNo, times, startDate, endDate);
+ return;
+ }
+ // 匹配患者的报告列表
+ List reportInfoList = patientListResult.getResult().getPidReportMain();
+ reportInfoList = reportInfoList.stream()
+ .filter(reportInfo -> reportInfo.getPidAddmissTimes().equals(times) && reportInfo.getPidInNo().equalsIgnoreCase(inpatientNo))
+ .collect(Collectors.toList());
+ if (reportInfoList.isEmpty()) {
+ log.warn("同步检验报告,病案号:{},住院次数:{},开始时间:{},结束时间:{} 未查到报告!", inpatientNo, times, startDate, endDate);
return;
}
List scanAssortList = new ArrayList<>();
-
-
- for (int i = 0; i < patientListResult.getResult().getPidReportMain().size(); i++) {
+ for (int sortIndex = 0; sortIndex < reportInfoList.size(); sortIndex++) {
//根据旧数据判断是否需要做同步
- PatientListResult.Result.ReportInfo item = patientListResult.getResult().getPidReportMain().get(i);
-// ScanAssort oldAssort = oldScanAssortList.stream()
-// .filter(f -> f.getFileTitle().equals(item.getPidComName())).findAny().orElse(null);
-
-
+ PatientListResult.Result.ReportInfo item = reportInfoList.get(sortIndex);
String root = "F:\\jianyan" + File.separator
- + tbasic.getInpatientNo() + File.separator
- + tbasic.getAdmissTimes();
-
-// log.info("开始转换"+root);
- //时间段内如果查询到住院次数相同的数据 则数据入库
- if (item.getPidAddmissTimes().equals(times) && item.getPidInNo().equalsIgnoreCase(pNo)) {
- log.info("正在同步" + item.getPidComName() + i);
-// log.info("进入条件");
+ + inpatientNo + File.separator
+ + times;
+
+ log.info("同步检验报告,病案号:{},住院次数:{},同步:{} - {}", inpatientNo, times, item.getRepId(), item.getPidComName());
+ List addScanList = new ArrayList<>();
+ String base64Result;
+ try {
+ PatientReportResult patientReportResult = this.getReportResult(item.getRepId());
+ base64Result = patientReportResult.getResult().getPatient().getPatientReport();
+ } catch (Exception ex) {
+ log.error("同步检验报告,病案号:{},住院次数:{},检验报告id:{} 获取报告出错了!", inpatientNo, times, item.getRepId());
+ continue;
+ }
+ try {
+ log.info("同步检验报告,病案号:{},住院次数:{},开始转换:{} - {}", inpatientNo, times, item.getRepId(), item.getPidComName());
+ addScanList = PDFFileUtils.base64StringToPDF(base64Result, root, item.getRepId(), item.getPidComName(), sortIndex);
+ log.info("同步检验报告,病案号:{},住院次数:{},{} - {} 转换结束", inpatientNo, times, item.getRepId(), item.getPidComName());
+ } catch (IOException e) {
+ String msg = "同步检验报告,病案号:" + inpatientNo + ",住院次数:" + times + "," + item.getRepId() + " - " + item.getPidComName() + " 转换出错了!";
+ log.error(msg, e);
+ }
- List addScanList = new ArrayList<>();
- String base64Result;
- try {
- PatientReportResult patientReportResult = this.getReportResult(item.getRepId());
- base64Result = patientReportResult.getResult().getPatient().getPatientReport();
- } catch (Exception ex) {
- log.error("检验报告id:{} 获取报告出错了!", item.getRepId());
- continue;
+ for (ScanAssort scanAssort : addScanList) {
+ ScanAssort oldAssort = oldScanAssortList.stream()
+ .filter(f -> f.getScanPage().equals(scanAssort.getScanPage()))
+ .findAny().orElse(null);
+ if (oldAssort != null) {
+ scanAssort.setId(oldAssort.getId());
+ } else {
+ scanAssort.setId(snowflakeIdWorker.nextId());
}
-
- try {
- log.info("开始转换");
- addScanList = PDFFileUtils.base64StringToPDF(base64Result, root, item.getRepId(), item.getPidComName(), i);
- log.info("转换结束");
- } catch (IOException e) {
- log.error("检验pdf转化出错" + e.getMessage(), e);
- }
- addScanList.forEach(scanAssort -> {
- ScanAssort oldAssort = oldScanAssortList.stream()
- .filter(f -> f.getScanPage().equals(scanAssort.getScanPage())).findAny().orElse(null);
- if (oldAssort != null) {
- scanAssort.setId(oldAssort.getId());
- } else {
- scanAssort.setId(snowflakeIdWorker.nextId());
- }
- scanAssort.setPatientId(patientId);
- scanAssortList.add(scanAssort);
- log.info("结果" + scanAssort);
- });
+ scanAssort.setPatientId(patientId);
+ scanAssortList.add(scanAssort);
}
+
}
//数据写入到3.0
if (ObjectUtil.isNotEmpty(scanAssortList)) {
- log.info("开始写入" + scanAssortList.size());
+ log.info("同步检验报告,病案号:{},住院次数:{},同步 {} 份文件。", inpatientNo, times,scanAssortList.size() );
scanAssortMapper.insertOrUpdateBatch(scanAssortList);
- log.info("写入结束" + scanAssortList.size());
+ basicMapper.addLabSync(patientId,1);
}
}
diff --git a/src/main/java/com/docus/demo/utils/PDFFileUtils.java b/src/main/java/com/docus/demo/utils/PDFFileUtils.java
index 789bd9c..8d87609 100644
--- a/src/main/java/com/docus/demo/utils/PDFFileUtils.java
+++ b/src/main/java/com/docus/demo/utils/PDFFileUtils.java
@@ -21,7 +21,7 @@ public class PDFFileUtils {
* @param rootPath
* @param repId
*/
- public static List base64StringToPDF(String base64Content, String rootPath, String repId,String fileTitle,int index) throws IOException {
+ public static synchronized List base64StringToPDF(String base64Content, String rootPath, String repId,String fileTitle,int index) throws IOException {
BASE64Decoder decoder = new BASE64Decoder();
List addScanList = new ArrayList<>();
PDDocument document =null ;
@@ -29,23 +29,23 @@ public class PDFFileUtils {
//1.base64编码内容转换为字节数组
byte[] bytes = decoder.decodeBuffer(base64Content);
//2.生成jpg图片
- document = PDDocument.load(new ByteArrayInputStream(bytes));
+ document = PDDocument.load(new ByteArrayInputStream(bytes));
PDFRenderer renderer = new PDFRenderer(document);
// Iterate over each page and save it as an image
for (int pageIndex = 0; pageIndex < document.getNumberOfPages(); pageIndex++) {
- // Render the page as an image
- BufferedImage image = renderer.renderImageWithDPI(pageIndex, 300); // Set DPI value as needed
- // Save the image to a file
- String outputFilePath = rootPath +File.separator+ repId +pageIndex+ ".jpg"; // Output file path
+ // Render the page as an image,Set DPI value as needed
+ BufferedImage image = renderer.renderImageWithDPI(pageIndex, 300);
+ // Save the image to a file ,Output file path
+ String outputFilePath = rootPath +File.separator+ repId +pageIndex+ ".jpg";
//判断父级目录是否存在 不存在需要创建
File file = new File(outputFilePath);
+
String parentPath = file.getParent();
File dir = new File(parentPath);
if (!dir.exists()) {
dir.mkdirs();
}
ImageIO.write(image, "jpg", new File(outputFilePath));
-
ScanAssort scanAssort = new ScanAssort();
scanAssort.setFileTitle(fileTitle);
scanAssort.setScanPage(repId +pageIndex+ ".jpg");
@@ -60,17 +60,12 @@ public class PDFFileUtils {
scanAssort.setSort((index+1)*1000+pageIndex);
scanAssort.setAssortId("A5A7AA6796D1715A2F1E35699C706C84");
scanAssort.setTaskId("-1");
-
addScanList.add(scanAssort);
}
- // Close the PDF document
-
}finally {
-
if (document!=null){
document.close();
}
-
}
return addScanList;
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 38b2ef2..1451d73 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -99,4 +99,5 @@ spring:
#文件保存路径
-savePath: F:\jiashi\lianzhong
\ No newline at end of file
+savePath: F:\jiashi\lianzhong
+labSyncDisDateStart: 2018-01-01
\ No newline at end of file
diff --git a/src/main/resources/mapper/mysql/BasicMapper.xml b/src/main/resources/mapper/mysql/BasicMapper.xml
index 81f90ff..e27c429 100644
--- a/src/main/resources/mapper/mysql/BasicMapper.xml
+++ b/src/main/resources/mapper/mysql/BasicMapper.xml
@@ -64,6 +64,12 @@
)
+
+ insert into docus_medicalrecord.lab_sync_patient (patient_id,status)
+ values (#{patientId},#{status})
+ ON DUPLICATE KEY UPDATE status = VALUES(status)
+
+
update docus_medicalrecord.t_basic
set scan_source = 1,
@@ -231,6 +237,9 @@
WHERE dis_date between #{startDisDateTime} and #{endDisDateTime}
AND is_cancel = 0
AND scan_source = '1'
+ AND NOT EXISTS(
+ SELECT patient_id FROM docus_medicalrecord.lab_sync_patient WHERE lab_sync_patient.patient_id=t_basic.patient_id
+ )
ORDER BY dis_date ASC