diff --git a/src/main/java/com/docus/demo/config/DbSqlserver2Config.java b/src/main/java/com/docus/demo/config/DbSqlserver2Config.java new file mode 100644 index 0000000..7cdeb19 --- /dev/null +++ b/src/main/java/com/docus/demo/config/DbSqlserver2Config.java @@ -0,0 +1,45 @@ +package com.docus.demo.config; + +import com.alibaba.druid.pool.DruidDataSource; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; + +import javax.sql.DataSource; + +@Configuration +@MapperScan(basePackages = DbSqlserver2Config.PACKAGE, sqlSessionFactoryRef = "sqlserver2SqlSessionFactory") +public class DbSqlserver2Config { + // 这里一定要指定精准 否则后果不堪设想 + static final String PACKAGE = "com.docus.demo.mapper.sqlserver2"; + static final String MAPPER_LOCATION = "classpath:mapper/sqlserver2/*.xml"; + + @Bean(name = "sqlserver2DataSource") + @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.sqlserver2") + public DataSource secondDataSource(){ + return new DruidDataSource(); + } + + /*注入事务*/ + @Bean(name = "sqlserver2TransactionManager") + public DataSourceTransactionManager secondTransactionManager() { + return new DataSourceTransactionManager(secondDataSource()); + } + + @Bean(name = "sqlserver2SqlSessionFactory") + public SqlSessionFactory secondSqlSessionFactory(@Qualifier("sqlserver2DataSource") DataSource secondDataSource) + throws Exception { + final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); + sessionFactory.setDataSource(secondDataSource); + sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver() + .getResources(DbSqlserver2Config.MAPPER_LOCATION)); + return sessionFactory.getObject(); + } + +} diff --git a/src/main/java/com/docus/demo/controller/SyncBasicDataController.java b/src/main/java/com/docus/demo/controller/SyncBasicDataController.java index 27ef38a..f5cec04 100644 --- a/src/main/java/com/docus/demo/controller/SyncBasicDataController.java +++ b/src/main/java/com/docus/demo/controller/SyncBasicDataController.java @@ -30,13 +30,15 @@ public class SyncBasicDataController { return syncBasicDataService.syncBasicData(syncBasicDataDto); } - @ApiOperation("同步基础数据") - @PostMapping("/syncBasicFile") - public CommonResult syncBasicFile(@RequestBody SyncFileDto syncFileDto){ - return syncBasicFileService.syncBasicFile(syncFileDto); + + @ApiOperation("同步儿童医院101份数据") + @PostMapping("/syncChildren") + public CommonResult syncChildren(){ + return syncBasicFileService.syncChildren(); } + @ApiOperation("test") @GetMapping("/test") public CommonResult test(){ diff --git a/src/main/java/com/docus/demo/entity/sqlserver2/BasicInfo.java b/src/main/java/com/docus/demo/entity/sqlserver2/BasicInfo.java new file mode 100644 index 0000000..238b46d --- /dev/null +++ b/src/main/java/com/docus/demo/entity/sqlserver2/BasicInfo.java @@ -0,0 +1,20 @@ +package com.docus.demo.entity.sqlserver2; + +import lombok.Data; + +import java.util.Date; + +@Data +public class BasicInfo { + + private String id; + + private String patientId; + + private String inpatientNo; + + private Date disDate; + + private int admissTimes; + +} diff --git a/src/main/java/com/docus/demo/entity/sqlserver2/Tscan.java b/src/main/java/com/docus/demo/entity/sqlserver2/Tscan.java new file mode 100644 index 0000000..a772549 --- /dev/null +++ b/src/main/java/com/docus/demo/entity/sqlserver2/Tscan.java @@ -0,0 +1,15 @@ +package com.docus.demo.entity.sqlserver2; + +import lombok.Data; + +@Data +public class Tscan { + + private String patientId; + + private String assortId; + + private String scanPage; + + private int upState; +} diff --git a/src/main/java/com/docus/demo/facade/ISyncBasicFileService.java b/src/main/java/com/docus/demo/facade/ISyncBasicFileService.java index f10aab7..7a12701 100644 --- a/src/main/java/com/docus/demo/facade/ISyncBasicFileService.java +++ b/src/main/java/com/docus/demo/facade/ISyncBasicFileService.java @@ -6,10 +6,6 @@ import com.docus.demo.entity.CommonResult; public interface ISyncBasicFileService { - /** - * 根据条件同步文件信息 - * @param syncFileDto - * @return - */ - CommonResult syncBasicFile(SyncFileDto syncFileDto); + + CommonResult syncChildren(); } diff --git a/src/main/java/com/docus/demo/mapper/sqlserver/PictureMapper.java b/src/main/java/com/docus/demo/mapper/sqlserver/PictureMapper.java index 7c4a44b..f3ff32f 100644 --- a/src/main/java/com/docus/demo/mapper/sqlserver/PictureMapper.java +++ b/src/main/java/com/docus/demo/mapper/sqlserver/PictureMapper.java @@ -2,6 +2,8 @@ package com.docus.demo.mapper.sqlserver; import com.baomidou.dynamic.datasource.annotation.DS; import com.docus.demo.entity.TPicture; +import com.docus.demo.entity.sqlserver2.BasicInfo; +import com.docus.demo.entity.sqlserver2.Tscan; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -18,5 +20,11 @@ public interface PictureMapper { */ List getPictureInfoByCid(@Param("cuid") String cuid); + /** + * 获取101份未同步的病案 + * @return + */ + List getBasicInfoList(); + } diff --git a/src/main/java/com/docus/demo/mapper/sqlserver2/TscanMapper.java b/src/main/java/com/docus/demo/mapper/sqlserver2/TscanMapper.java index 787191a..596d7d0 100644 --- a/src/main/java/com/docus/demo/mapper/sqlserver2/TscanMapper.java +++ b/src/main/java/com/docus/demo/mapper/sqlserver2/TscanMapper.java @@ -1,11 +1,16 @@ package com.docus.demo.mapper.sqlserver2; +import com.docus.demo.entity.sqlserver2.BasicInfo; +import com.docus.demo.entity.sqlserver2.Tscan; +import org.apache.ibatis.annotations.Param; +import java.util.List; public interface TscanMapper { + List getOldScanListByPid(@Param("id")String patientId); - + void insertScanList(List insertList); } diff --git a/src/main/java/com/docus/demo/service/SyncBasicFileImpl.java b/src/main/java/com/docus/demo/service/SyncBasicFileImpl.java index 936085e..697a9bd 100644 --- a/src/main/java/com/docus/demo/service/SyncBasicFileImpl.java +++ b/src/main/java/com/docus/demo/service/SyncBasicFileImpl.java @@ -1,19 +1,16 @@ package com.docus.demo.service; import cn.hutool.core.util.ObjectUtil; -import com.docus.demo.dto.BasicSelectDto; -import com.docus.demo.dto.SyncFileDto; import com.docus.demo.entity.CommonResult; -import com.docus.demo.entity.ScanAssort; import com.docus.demo.entity.TPicture; -import com.docus.demo.entity.ZdAssort; +import com.docus.demo.entity.sqlserver2.BasicInfo; +import com.docus.demo.entity.sqlserver2.Tscan; import com.docus.demo.facade.ISyncBasicFileService; import com.docus.demo.mapper.mysql.BasicMapper; import com.docus.demo.mapper.mysql.ScanAssortMapper; import com.docus.demo.mapper.sqlserver.PictureMapper; +import com.docus.demo.mapper.sqlserver2.TscanMapper; import com.docus.demo.utils.ImageUtils; -import com.docus.demo.utils.SnowflakeIdWorker; -import com.docus.demo.vo.BasicVo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -22,12 +19,7 @@ import org.springframework.stereotype.Service; import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; import java.util.List; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.stream.Collectors; @Slf4j @@ -40,112 +32,63 @@ public class SyncBasicFileImpl implements ISyncBasicFileService { private PictureMapper pictureMapper; @Autowired private ScanAssortMapper scanAssortMapper; + @Autowired + private TscanMapper tscanMapper; private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); - private final ExecutorService executor = Executors.newFixedThreadPool(7); - - @Override - 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()); - for (BasicVo basicVo : basicVoList) { - System.out.println("当前病案 " +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 "); - } - } - System.out.println("开始插入数据" +updateOrInsertList.size() ); - scanAssortMapper.insertOrUpdateBatch(updateOrInsertList); - System.out.println("插入数据结束" ); + public CommonResult syncChildren() { + //1.查询出101份的病案Pid 病案号 住院次数 + List basicInfos = pictureMapper.getBasicInfoList(); + //2.代入到联众数据库 查询图片信息 + //3.根据id查询出文件信息 + for (BasicInfo basicInfo: basicInfos) { + List oldScanList = tscanMapper.getOldScanListByPid(basicInfo.getPatientId()); + //4.文件数据同步-> 路径 病案号 +病案id主键 + List syncScanList = this.doSyncFile(basicInfo); + List insertList = this.getInsertList(oldScanList,syncScanList); + if (ObjectUtil.isNotEmpty(insertList)){ + //5.数据入库tsacn + tscanMapper.insertScanList(insertList); } - - },executor); -// System.out.println("执行了一个任务" +syncFileDto.getStartDate() +" " +syncFileDto.getEndDate()); + } return CommonResult.success("同步成功"); } - - private List handleUpdateOrInsert(List oldScanAssort, List scanAssortList) { - //如果没有旧数据 做全量插入 - if (ObjectUtil.isEmpty(oldScanAssort)){ - return scanAssortList; - } - - List updateOrInsertList = scanAssortList.stream().map(m->{ - //根据路径和文件名称去旧数据做判断 如果存在则需要做更新 - ScanAssort scanAssort = oldScanAssort.stream() - .filter(f->ObjectUtil.equal(m.getImagePath(),f.getImagePath())&&ObjectUtil.equal(m.getScanPage(),f.getScanPage())) - .findAny() + private List getInsertList(List oldScanList, List syncScanList) { + return syncScanList.stream().filter(f->{ + Tscan oldScan =oldScanList.stream() + .filter(old->ObjectUtil.equal(old.getPatientId(),f.getPatientId())&&ObjectUtil.equal(old.getScanPage(),f.getScanPage())) + .findFirst() .orElse(null); - if (scanAssort!=null){ - m.setId(scanAssort.getId()); - } - return m; + return oldScan==null; }).collect(Collectors.toList()); - //做新增或者插入 - return updateOrInsertList; } - private List doSyncFile(BasicVo basicVo) { - String[] disDate = dateFormat.format(basicVo.getDisDate()).split("-"); + + private List doSyncFile(BasicInfo basicInfo) { + List tscanList = new ArrayList<>(1000); + //010 00 09590 19990405 + String[] disDate = dateFormat.format(basicInfo.getDisDate()).split("-"); String cyYear = disDate[0]; String cyMonth = disDate[1]; String cyDay = disDate[2]; - StringBuilder inpatientNo = new StringBuilder(basicVo.getInpatientNo()); - for (int s =inpatientNo.length() ;s<8;s++){ - inpatientNo.insert(0, "0"); - } + String inpatientNo = basicInfo.getInpatientNo(); + + String pid = basicInfo.getId(); + // + String rootDir = "E:\\ServerE01"+File.separator + +cyYear+File.separator + +cyYear+cyMonth+ File.separator; - String rootDir = "Z:\\" - + cyYear + File.separator - + cyYear + cyMonth + File.separator - + cyYear + cyMonth + cyDay + File.separator - + inpatientNo + cyYear + cyMonth + cyDay + File.separator; - String outDir = "F:\\lianzhong" + File.separator - + cyYear + File.separator - + cyMonth + File.separator - + cyDay + File.separator - + basicVo.getInpatientNo(); + String outDir = "E:\\docus"+File.separator+inpatientNo+File.separator+pid ; - String cuid = basicVo.getBColumn5(); - List scanAssortList = new ArrayList<>(100); // 2.根据cid查询联众表t_picture 走索引大概零点几秒 - List tPictureList = pictureMapper.getPictureInfoByCid(cuid); + List tPictureList = pictureMapper.getPictureInfoByCid(pid); // 2.1根据病案信息拼接地址 - int sort = 0; + for (TPicture tpicture : tPictureList) { String picName = tpicture.getPicName().split(".jpg")[0]; @@ -167,50 +110,27 @@ public class SyncBasicFileImpl implements ISyncBasicFileService { rotateFlag = true; } - // 2.4组合文件信息 - ScanAssort scanAssort = new ScanAssort(); - scanAssort.setId(SnowflakeIdWorker.idWorker.nextId()); - scanAssort.setPatientId(basicVo.getPatientId()); - scanAssort.setAssortId(tpicture.getPicKind()); - scanAssort.setFileTitle(picName); - scanAssort.setImagePath(outDir); - scanAssort.setCreateTime(new Date()); - scanAssort.setScanPage(picName + ".jpg"); - scanAssort.setSort(sort); - scanAssort.setFileSource(2); - scanAssort.setFileStorageType(1); - scanAssort.setFilePages(1); - + Tscan tscan = new Tscan(); + tscan.setPatientId(pid); + tscan.setAssortId(tpicture.getPicKind()); + tscan.setScanPage(picName+".jpg"); if (savePicFlag&&rotateFlag){ - scanAssort.setCreater("auto2"); + tscan.setUpState(200); }else if (savePicFlag){ - scanAssort.setCreater("auto3"); + tscan.setUpState(102); //需要记录创建人为auto3表示同步失败的文件 }else { - scanAssort.setCreater("auto4"); + tscan.setUpState(404); } + tscanList.add(tscan); - - scanAssortList.add(scanAssort); - sort+=1; } - return scanAssortList; + return tscanList; } - private BasicSelectDto getBaiscSelectDto(SyncFileDto syncFileDto) { - - List inpatientNoList = Arrays.asList(syncFileDto.getInpatientNo().split(",")); - - BasicSelectDto basicSelectDto = new BasicSelectDto(); - basicSelectDto.setStartDate(syncFileDto.getStartDate()); - basicSelectDto.setEndDate(syncFileDto.getEndDate()); - basicSelectDto.setInpatientNoList(inpatientNoList); - - return basicSelectDto; - } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 8e9faba..5b93286 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -92,3 +92,47 @@ spring: test-on-borrow: false test-on-return: false validation-query: select 1 + #联众数据库 + sqlserver: + driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + username: sa + password: 17931 + url: jdbc:sqlserver://192.168.8.74:1433;DatabaseName=u_medrecord + # 初始化配置 + initial-size: 3 + # 最小连接数 + min-idle: 3 + # 最大连接数 + max-active: 15 + # 获取连接超时时间 + max-wait: 5000 + # 连接有效性检测时间 + time-between-eviction-runs-millis: 90000 + # 最大空闲时间 + min-evictable-idle-time-millis: 1800000 + test-while-idle: true + test-on-borrow: false + test-on-return: false + validation-query: select 1 + #2.0数据库 + sqlserver1: + driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + username: JSuser + password: 123456 + url: jdbc:sqlserver://172.18.0.227:1433;DatabaseName=etyyrecord + # 初始化配置 + initial-size: 3 + # 最小连接数 + min-idle: 3 + # 最大连接数 + max-active: 15 + # 获取连接超时时间 + max-wait: 5000 + # 连接有效性检测时间 + time-between-eviction-runs-millis: 90000 + # 最大空闲时间 + min-evictable-idle-time-millis: 1800000 + test-while-idle: true + test-on-borrow: false + test-on-return: false + validation-query: select 1 \ No newline at end of file diff --git a/src/main/resources/mapper/sqlserver/PictureMapper.xml b/src/main/resources/mapper/sqlserver/PictureMapper.xml index b2020a9..da74e0f 100644 --- a/src/main/resources/mapper/sqlserver/PictureMapper.xml +++ b/src/main/resources/mapper/sqlserver/PictureMapper.xml @@ -13,5 +13,24 @@ T_picture where cuid = #{cuid} + + \ No newline at end of file diff --git a/src/main/resources/mapper/sqlserver2/TsacnMapper.xml b/src/main/resources/mapper/sqlserver2/TsacnMapper.xml index eb26deb..0071f8c 100644 --- a/src/main/resources/mapper/sqlserver2/TsacnMapper.xml +++ b/src/main/resources/mapper/sqlserver2/TsacnMapper.xml @@ -3,6 +3,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + insert into t_scan_assort + (patient_id,assort_id,scan_page,file_source,file_pages,creater,create_time) + values + + (#{item.patientId},#{item.assortId},#{item.scanPage},#{item.fileSource},#{item.filePages},#{item.creater},#{item.createTime}) + + + + \ No newline at end of file