From aec807a51d896b370f0c8b14d68e99677061c47e Mon Sep 17 00:00:00 2001 From: zhanglb Date: Tue, 18 Jul 2023 09:39:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=8E=E8=81=94=E4=BC=97=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E6=95=B0=E6=8D=AE=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SyncBasicDataController.java | 10 +- .../com/docus/demo/dto/SyncBasicDataDto.java | 2 + .../docus/demo/entity/sqlserver/CardInfo.java | 40 ++++++ .../demo/facade/ISyncBasicDataService.java | 2 + .../demo/mapper/sqlserver/TcardMapper.java | 18 +++ .../docus/demo/service/SyncBasicDataImpl.java | 78 ++++++++++- .../docus/demo/service/SyncBasicFileImpl.java | 126 ++++++++++++------ .../java/com/docus/demo/utils/ImageUtils.java | 20 ++- src/main/resources/logback.xml | 91 +++++++++++++ .../mapper/sqlserver/TcardMapper.xml | 37 +++++ 10 files changed, 370 insertions(+), 54 deletions(-) create mode 100644 src/main/java/com/docus/demo/entity/sqlserver/CardInfo.java create mode 100644 src/main/java/com/docus/demo/mapper/sqlserver/TcardMapper.java create mode 100644 src/main/resources/logback.xml create mode 100644 src/main/resources/mapper/sqlserver/TcardMapper.xml diff --git a/src/main/java/com/docus/demo/controller/SyncBasicDataController.java b/src/main/java/com/docus/demo/controller/SyncBasicDataController.java index 27ef38a..983d407 100644 --- a/src/main/java/com/docus/demo/controller/SyncBasicDataController.java +++ b/src/main/java/com/docus/demo/controller/SyncBasicDataController.java @@ -24,13 +24,19 @@ public class SyncBasicDataController { @Autowired private ISyncBasicFileService syncBasicFileService; - @ApiOperation("同步基础数据") + @ApiOperation("省厅-同步基础数据") @PostMapping("/syncBasicData") public CommonResult syncBasicData(@RequestBody SyncBasicDataDto syncBasicDataDto){ return syncBasicDataService.syncBasicData(syncBasicDataDto); } - @ApiOperation("同步基础数据") + @ApiOperation("联众-同步基础数据") + @PostMapping("/syncLzBasicData") + public CommonResult syncLzBasicData(@RequestBody SyncBasicDataDto syncBasicDataDto){ + return syncBasicDataService.syncLzBasicData(syncBasicDataDto); + } + + @ApiOperation("同步文件数据") @PostMapping("/syncBasicFile") public CommonResult syncBasicFile(@RequestBody SyncFileDto syncFileDto){ return syncBasicFileService.syncBasicFile(syncFileDto); diff --git a/src/main/java/com/docus/demo/dto/SyncBasicDataDto.java b/src/main/java/com/docus/demo/dto/SyncBasicDataDto.java index 7e0a629..83ff964 100644 --- a/src/main/java/com/docus/demo/dto/SyncBasicDataDto.java +++ b/src/main/java/com/docus/demo/dto/SyncBasicDataDto.java @@ -5,7 +5,9 @@ import lombok.Data; @Data public class SyncBasicDataDto { + private String startDate; + private String endDate; private int limit; } diff --git a/src/main/java/com/docus/demo/entity/sqlserver/CardInfo.java b/src/main/java/com/docus/demo/entity/sqlserver/CardInfo.java new file mode 100644 index 0000000..da0bd52 --- /dev/null +++ b/src/main/java/com/docus/demo/entity/sqlserver/CardInfo.java @@ -0,0 +1,40 @@ +package com.docus.demo.entity.sqlserver; + +import lombok.Data; + +import java.util.Date; + +@Data +public class CardInfo { + + + private long id ; + + private Integer PatNum; + + private String PatNo; + + private String PatName; + private String PatSex; + private Integer PatAge; + /**身份证**/ + private String PatCiticard; + private String UnitTele; + private Date InDate; + private String InDeptCode; + private String InDeptName; + private Date OutDate; + private String OutDeptCode; + private String OutDeptName; + + private String OperIcpm1; + private String OperName1; + private String IcdeCode11; + private String IcdeName11; + + private String cuid; + + + + +} diff --git a/src/main/java/com/docus/demo/facade/ISyncBasicDataService.java b/src/main/java/com/docus/demo/facade/ISyncBasicDataService.java index d0988cf..a40f417 100644 --- a/src/main/java/com/docus/demo/facade/ISyncBasicDataService.java +++ b/src/main/java/com/docus/demo/facade/ISyncBasicDataService.java @@ -8,4 +8,6 @@ public interface ISyncBasicDataService { CommonResult syncBasicData(SyncBasicDataDto syncBasicDataDto); + + CommonResult syncLzBasicData(SyncBasicDataDto syncBasicDataDto); } diff --git a/src/main/java/com/docus/demo/mapper/sqlserver/TcardMapper.java b/src/main/java/com/docus/demo/mapper/sqlserver/TcardMapper.java new file mode 100644 index 0000000..a3d9b64 --- /dev/null +++ b/src/main/java/com/docus/demo/mapper/sqlserver/TcardMapper.java @@ -0,0 +1,18 @@ +package com.docus.demo.mapper.sqlserver; + + +import com.docus.demo.dto.SyncBasicDataDto; +import com.docus.demo.entity.sqlserver.CardInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface TcardMapper { + + + + List getCardInfo(@Param("pageStart") int pageStart, + @Param("pageEnd") int pageEnd, + @Param("dto") SyncBasicDataDto syncBasicDataDto); + +} diff --git a/src/main/java/com/docus/demo/service/SyncBasicDataImpl.java b/src/main/java/com/docus/demo/service/SyncBasicDataImpl.java index 5a88d08..41a8cb0 100644 --- a/src/main/java/com/docus/demo/service/SyncBasicDataImpl.java +++ b/src/main/java/com/docus/demo/service/SyncBasicDataImpl.java @@ -5,11 +5,13 @@ import cn.hutool.core.util.ObjectUtil; import com.docus.demo.dto.SyncBasicDataDto; import com.docus.demo.entity.CommonResult; import com.docus.demo.entity.Tbasic; +import com.docus.demo.entity.sqlserver.CardInfo; import com.docus.demo.entity.sqlserver1.Tdiagnose; import com.docus.demo.entity.sqlserver1.Toperation; import com.docus.demo.entity.sqlserver1.Tpatientvisit; import com.docus.demo.facade.ISyncBasicDataService; import com.docus.demo.mapper.mysql.BasicMapper; +import com.docus.demo.mapper.sqlserver.TcardMapper; import com.docus.demo.mapper.sqlserver1.PaintVisitMapper; import com.docus.demo.utils.SnowflakeIdWorker; import org.springframework.beans.factory.annotation.Autowired; @@ -26,7 +28,8 @@ public class SyncBasicDataImpl implements ISyncBasicDataService { @Autowired private PaintVisitMapper paintVisitMapper; - + @Autowired + private TcardMapper tcardMapper; @Override @@ -55,6 +58,7 @@ public class SyncBasicDataImpl implements ISyncBasicDataService { return CommonResult.success("同步成功"); } + private List getTbasicList(List oldBasicList,List tpatientvisitList, List tdiagnoses, List toperations) { return tpatientvisitList.stream() @@ -122,4 +126,76 @@ public class SyncBasicDataImpl implements ISyncBasicDataService { return tbasic; }).collect(Collectors.toList()); } + + + @Override + public CommonResult syncLzBasicData(SyncBasicDataDto syncBasicDataDto) { + //页码 + int current; + //每页1000条数据 + int limit = syncBasicDataDto.getLimit(); + List cardInfoList; + for (current = 1; ; current++) { + cardInfoList = tcardMapper.getCardInfo((current-1)*limit, limit,syncBasicDataDto); + if (null == cardInfoList || cardInfoList.size() == 0) { + break; + } + List fprnList = cardInfoList.stream().map(CardInfo::getPatNo).collect(Collectors.toList()); + //数据map转换 + List oldBasicList = basicMapper.getOldBasicList(fprnList,syncBasicDataDto); + List tbasicList = this.getInsertTbasic(oldBasicList,cardInfoList); + if (ObjectUtil.isNotEmpty(tbasicList)){ + //判断数据量 如果文件数据大于五百条 需要做拆分分批次插入 + int batchSize = 1000; + // 拆分列表 + for (int i = 0; i < tbasicList.size(); i += batchSize) { + int endIndex = Math.min(i + batchSize, tbasicList.size()); + List sublist = tbasicList.subList(i, endIndex); + //数据入库 + basicMapper.insertOrUpdateByid(sublist); + } + } + } + return CommonResult.success("同步成功"); + } + + private List getInsertTbasic(List oldBasicList, List cardInfoList) { + return cardInfoList.stream().filter(f->{ + String pno = f.getPatNo(); + String name = f.getPatName(); + Integer pNum = f.getPatNum(); + Date date = f.getOutDate(); + Tbasic tbasic = oldBasicList.stream().filter(o-> + ObjectUtil.equal(o.getInpatientNo(),pno) + &&ObjectUtil.equal(name,o.getName()) + &&ObjectUtil.equal(pNum,o.getAdmissTimes()) + &&ObjectUtil.equal(date,o.getDisDate())) + .findAny() + .orElse(null); + return tbasic==null; + }).map(m->{ + //根据病案号 名称 住院次数 出院时间 去重 + Tbasic tbasic = new Tbasic(); + tbasic.setPatientId(String.valueOf(SnowflakeIdWorker.idWorker.nextId())); + tbasic.setAdmissTimes(m.getPatNum()); + tbasic.setInpatientNo(m.getPatNo()); + tbasic.setAdmissId(m.getPatNo()); + tbasic.setName(m.getPatName()); + tbasic.setSex(m.getPatSex()); + tbasic.setAge(m.getPatAge()); + tbasic.setIdCard(m.getPatCiticard()); + tbasic.setAdmissDate(m.getInDate()); + tbasic.setAdmissDept(m.getInDeptCode()); + tbasic.setAdmissDeptName(m.getInDeptName()); + tbasic.setDisDate(m.getOutDate()); + tbasic.setDisDept(m.getOutDeptCode()); + tbasic.setDisDeptName(m.getOutDeptName()); + tbasic.setMainDiagName(m.getIcdeName11()); + tbasic.setMainDiagCode(m.getIcdeCode11()); + tbasic.setMainOperateName(m.getOperName1()); + tbasic.setMainOperateCode(m.getOperIcpm1()); + return tbasic; + }).collect(Collectors.toList()); + } + } diff --git a/src/main/java/com/docus/demo/service/SyncBasicFileImpl.java b/src/main/java/com/docus/demo/service/SyncBasicFileImpl.java index 936085e..ca65bcb 100644 --- a/src/main/java/com/docus/demo/service/SyncBasicFileImpl.java +++ b/src/main/java/com/docus/demo/service/SyncBasicFileImpl.java @@ -50,47 +50,38 @@ public class SyncBasicFileImpl implements ISyncBasicFileService { public CommonResult syncBasicFile(SyncFileDto syncFileDto) { CompletableFuture.runAsync(() -> { -// System.out.println("开始执行多线程同步" +syncFileDto.getStartDate() +" " +syncFileDto.getEndDate()); //页码 int current; //每页1000条数据 int limit = syncFileDto.getLimit(); - //1.先去tbaisc查数据 查询出带cid的数据 -// System.out.println("查询基础信息组装"); BasicSelectDto basicSelectDto = this.getBaiscSelectDto(syncFileDto); List basicVoList; -// System.out.println("查询基础信息组装结束"); for (current = 1; ; current++) { -// System.out.println("查询基础"); basicVoList = basicMapper.getBasicVoList((current-1)*limit, limit, basicSelectDto); if (null == basicVoList || basicVoList.size() == 0) { break; } -// System.out.println("查询基础结束" +basicVoList.size()); - - List updateOrInsertList = new ArrayList<>(5000); - System.out.println("开始同步" +basicVoList.size()); +// List updateOrInsertList = new ArrayList<>(5000); for (BasicVo basicVo : basicVoList) { - System.out.println("当前病案 " +basicVo.getInpatientNo()); + log.info("开始同步"+basicVo.getInpatientNo()); List scanAssortList = this.doSyncFile(basicVo); //2.5数据入库 - if (scanAssortList.size() != 0) { - List oldScanAssort = scanAssortMapper.getListByPid(basicVo.getPatientId()); - //根据pid 查询数据库 根据路径和名称做匹配 如果数据存在需要做幂等 不存在需要做数据更新 - List addScanAssortList = this.handleUpdateOrInsert(oldScanAssort,scanAssortList); - updateOrInsertList.addAll(addScanAssortList); - System.out.println("syncSuccess : " + scanAssortList.size()); -// log.info("syncSuccess : " + scanAssortList.size()); - } else { - log.info(basicVo.getPatientId() + " canFindImage "); - } +// if (scanAssortList.size() != 0) { +// List oldScanAssort = scanAssortMapper.getListByPid(basicVo.getPatientId()); +// //根据pid 查询数据库 根据路径和名称做匹配 如果数据存在需要做幂等 不存在需要做数据更新 +// List addScanAssortList = this.handleUpdateOrInsert(oldScanAssort,scanAssortList); +// updateOrInsertList.addAll(addScanAssortList); +// } else { +// log.info(basicVo.getPatientId() + " canFindImage "); +// } + + log.info("结束同步"+basicVo.getInpatientNo()); } - System.out.println("开始插入数据" +updateOrInsertList.size() ); - scanAssortMapper.insertOrUpdateBatch(updateOrInsertList); - System.out.println("插入数据结束" ); +// scanAssortMapper.insertOrUpdateBatch(updateOrInsertList); } + },executor); // System.out.println("执行了一个任务" +syncFileDto.getStartDate() +" " +syncFileDto.getEndDate()); return CommonResult.success("同步成功"); @@ -152,20 +143,24 @@ public class SyncBasicFileImpl implements ISyncBasicFileService { String inPutFile = rootDir + picName + ".jp2"; String outFile = outDir + File.separator + picName + ".jpg"; - boolean savePicFlag ; - boolean rotateFlag ; - // 2.2jp2转化jpg 图片通过文件流写到挂在的盘符 - savePicFlag = ImageUtils.getInstance().savePic(inPutFile, outFile); - if (!savePicFlag){ - //需要同步tif文件成jpg过来 - savePicFlag = ImageUtils.getInstance().tifToJpg(rootDir + picName + ".tif",outFile); - } - //需要旋转一下文件 - if (tpicture.getRotateDegree()!=0){ - rotateFlag = ImageUtils.getInstance().rotateFile(outFile,outFile,tpicture.getRotateDegree()); - }else { - rotateFlag = true; + File file = new File(inPutFile); + if (!file.exists()){ + log.info(basicVo.getInpatientNo()+"文件未找到"+inPutFile); } +// boolean savePicFlag ; +// boolean rotateFlag ; +// // 2.2jp2转化jpg 图片通过文件流写到挂在的盘符 +// savePicFlag = ImageUtils.getInstance().savePic(inPutFile, outFile); +// if (!savePicFlag){ +// //需要同步tif文件成jpg过来 +// savePicFlag = ImageUtils.getInstance().tifToJpg(rootDir + picName + ".tif",outFile); +// } +// //需要旋转一下文件 +// if (tpicture.getRotateDegree()!=0){ +// rotateFlag = ImageUtils.getInstance().rotateFile(outFile,outFile,tpicture.getRotateDegree()); +// }else { +// rotateFlag = true; +// } // 2.4组合文件信息 @@ -183,14 +178,14 @@ public class SyncBasicFileImpl implements ISyncBasicFileService { scanAssort.setFilePages(1); - if (savePicFlag&&rotateFlag){ - scanAssort.setCreater("auto2"); - }else if (savePicFlag){ - scanAssort.setCreater("auto3"); - //需要记录创建人为auto3表示同步失败的文件 - }else { - scanAssort.setCreater("auto4"); - } +// if (savePicFlag&&rotateFlag){ +// scanAssort.setCreater("auto2"); +// }else if (savePicFlag){ +// scanAssort.setCreater("auto3"); +// //需要记录创建人为auto3表示同步失败的文件 +// }else { +// scanAssort.setCreater("auto4"); +// } @@ -213,4 +208,47 @@ public class SyncBasicFileImpl implements ISyncBasicFileService { return basicSelectDto; } + + private String getRootDir(BasicVo basicInfo, String cyYear, String cyMonth, String cyDay) { + String inpatientNo = basicInfo.getInpatientNo().trim(); + String rootDir = ""; + + rootDir = "Z:\\" + + cyYear + File.separator + + cyYear + cyMonth + File.separator + + cyYear + cyMonth + cyDay; + File file = new File(rootDir); + File[] subdirectories = file.listFiles(File::isDirectory); + if (subdirectories != null) { + //判断当前日期下是否有路径 + for (File subFile : subdirectories) { + if (subFile.getName().contains(inpatientNo)) { + rootDir = rootDir + File.separator + subFile.getName() + File.separator; + return rootDir; + } + } + } + + for (int day = 1; day < 32; day++) { + String otherDay = String.format("%02d", day); + rootDir = "Z:\\" + + cyYear + File.separator + + cyYear + cyMonth + File.separator + + cyYear + cyMonth + otherDay; + file = new File(rootDir); + subdirectories = file.listFiles(File::isDirectory); + if (subdirectories != null) { + //判断当前日期下是否有路径 + for (File subFile : subdirectories) { + if (subFile.getName().contains(inpatientNo)) { + rootDir = rootDir + File.separator + subFile.getName() + File.separator; + return rootDir; + } + } + } + } + + + return rootDir; + } } diff --git a/src/main/java/com/docus/demo/utils/ImageUtils.java b/src/main/java/com/docus/demo/utils/ImageUtils.java index 8977827..d526780 100644 --- a/src/main/java/com/docus/demo/utils/ImageUtils.java +++ b/src/main/java/com/docus/demo/utils/ImageUtils.java @@ -7,6 +7,7 @@ import leadtools.codecs.CodecsLoadByteOrder; import leadtools.codecs.CodecsSavePageMode; import leadtools.codecs.RasterCodecs; import leadtools.demos.DemoUtilities; +import lombok.extern.slf4j.Slf4j; import javax.imageio.ImageIO; import javax.imageio.ImageReader; @@ -16,6 +17,7 @@ import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.*; +@Slf4j public class ImageUtils { private static final ImageUtils instance = new ImageUtils(); @@ -132,12 +134,11 @@ public class ImageUtils { OutputStream outputStream = new FileOutputStream(outFile); byte[] buffer = new byte[1024]; int bytesRead; - while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } - - System.out.println("成功将TIFF文件的字节码写入到新文件!"); + log.info(inPutFile + "成功将TIFF文件的字节码写入到新文件 " +outFile); + return true; } catch (IOException e) { e.printStackTrace(); } @@ -246,11 +247,11 @@ public class ImageUtils { // Save image // System.out.println("Save image..."); rasterCodecs.save(rasterImage, demoData.outFilePath, RasterImageFormat.valueOf(demoData.outputFormat.toString()), demoData.outputBPP, 1, -1, 1, CodecsSavePageMode.OVERWRITE); - System.out.println("Image saved successfully here: " + demoData.outFilePath); - + log.info("Image saved successfully here: " + demoData.outFilePath); return true; } catch (Exception e) { // System.out.println(e.getMessage()); + return false; } finally { // Dispose the raster codecs if (rasterCodecs != null) @@ -262,8 +263,7 @@ public class ImageUtils { } } catch (Exception ex) { -// System.out.println("Error " + ex.getMessage()); - ex.printStackTrace(); + log.info(ex.getMessage()); } return false; @@ -285,4 +285,10 @@ public class ImageUtils { } +// public static void main(String[] args) { +// ImageUtils imageUtils = new ImageUtils(); +//// imageUtils.savePic("C:\\Users\\Administrator\\Desktop\\HNSET0001.jp2.jp2","C:\\Users\\Administrator\\Desktop\\HNSET0001.jp2.jpg"); +// imageUtils.tifToJpg("C:\\Users\\Administrator\\Desktop\\HNSET0001.tif","C:\\Users\\Administrator\\Desktop\\HNSET0001.jpg"); +// imageUtils.rotateFile("C:\\Users\\Administrator\\Desktop\\HNSET0001.jp2.jpg","C:\\Users\\Administrator\\Desktop\\HNSET0001.jp2.jpg",90); +// } } diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000..ced9d63 --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,91 @@ + + + docus-server-fistpage + + + + + [%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%contextName] [%thread] [%X{traceId}] %-5level %logger{36} - %msg%n + + + + + + + [%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%X{traceId}] [%L] [%-5p] %m%n + utf-8 + + + + + ${log.path}%d.%i.log + + 500MB + + 30 + + + + + + [%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%X{traceId}] [%L] [%-5p] %m%n + utf-8 + + + + + ${log.path}external%d.%i.log + + 500MB + + 30 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/sqlserver/TcardMapper.xml b/src/main/resources/mapper/sqlserver/TcardMapper.xml new file mode 100644 index 0000000..3498b9b --- /dev/null +++ b/src/main/resources/mapper/sqlserver/TcardMapper.xml @@ -0,0 +1,37 @@ + + + + + + + \ No newline at end of file