初始化模板

master
linjj 1 month ago
commit f864ece658

@ -0,0 +1,53 @@
# springboot-mybatis2datasource-demo
[![996.icu](https://img.shields.io/badge/link-996.icu-red.svg)](https://996.icu)
Spring Boot整合MyBatis双数据源Demo
该程序使用方法
1.copy一个联众的原基础表取名 t_card_info_upload加了个状态字段state。
0代表要同步的基础数据程序每次取1000个修改状态为1代表正在同步的同步成功的状态改为2失败的改为3没有图片数据的图片表没有数据的 状态改为5。
SELECT * into t_card_info_upload from T_card_info ;
ALTER TABLE [dbo].[t_card_info_upload] ADD [state] tinyint NULL;
CREATE NONCLUSTERED INDEX [index_state]
ON [dbo].[t_card_info_upload] (
[state]
)
CREATE NONCLUSTERED INDEX [index_outdate]
ON [dbo].[t_card_info_upload] (
[outdate]
)
2.设置一个目录用来存放图片,比如 每个患者那个id 当次级目录,最后把基础信息和文件信息传这个接口。
3.将Debug程序放在本目录下
4.不需要在代码中插入基本信息将t_card_info_upload表直接导入到我们的基础信息中省去add的步骤
5.使用UPDATE t_card_info_upload
SET t_card_info_upload.state = 5
FROM t_card_info_upload
LEFT JOIN T_picture ON t_card_info_upload.id = T_picture.FileId
WHERE T_picture.FileId IS NULL;
先将没有数据的基本信息状态改为2减少检索内存
6.将联众分段表数据导入我们的分段表中
7.导入基础数据查询sql
SELECT
id,
patno,
patname,
outdate,
outdeptname,
patsex,
indate,
indeptname,
fource,
'Z:\pic\' + CAST(id AS VARCHAR(50)) AS path
FROM
t_card_info_upload
WHERE
state !=5
8.使用sqlserver自带的导入工具将对应的文件表导入到我们文件表中这是导入sql
Select a.FileId as patient_id,'lz'+PicKind as assort_id,a.PicName as scan_pagem,'lz' as source_flag from dbo.T_picture a left join t_card_info_upload t on t.id=a.FileId AND t.state=0

@ -0,0 +1,130 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
</parent>
<groupId>com.example</groupId>
<artifactId>LianzhongCollect</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springbootDemo</name>
<description>springbootDemo</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- Apache Commons Lang -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<!-- Apache HttpClient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<!-- swaggerui相关依赖 -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>2.0.9</version>
</dependency>
<!-- oracle -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4</version>
</dependency>
<!-- Apache PDFBox的依赖 -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.27</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.plugin</groupId>
<artifactId>spring-plugin-core</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.plugin</groupId>
<artifactId>spring-plugin-metadata</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<!-- sqlserver相关依赖 -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>4.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!-- Jackson Json处理工具包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

@ -0,0 +1,16 @@
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author potter.fu
* @date 2018-12-07 15:40
*/
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}

@ -0,0 +1,58 @@
package com.example.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.example.db1.dao", sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class DataSource1Config {
/**
* . @Primary
*/
@Bean(name = "db1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.hikari.db1")
@Primary
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
}
/**
* SqlSessionFactory
*/
@Bean(name = "db1SqlSessionFactory")
@Primary
public SqlSessionFactory testSqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db1/*.xml"));
return bean.getObject();
}
/**
*
*/
@Bean(name = "db1TransactionManager")
@Primary
public DataSourceTransactionManager testTransactionManager(@Qualifier("db1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "db1SqlSessionTemplate")
@Primary
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}

@ -0,0 +1,45 @@
package com.example.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
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 = "com.example.db2.dao", sqlSessionTemplateRef = "db2SqlSessionTemplate")
public class DataSource2Config {
@Bean(name = "db2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.hikari.db2")
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "db2SqlSessionFactory")
public SqlSessionFactory testSqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db2/*.xml"));
return bean.getObject();
}
@Bean(name = "db2TransactionManager")
public DataSourceTransactionManager testTransactionManager(@Qualifier("db2DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "db2SqlSessionTemplate")
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}

@ -0,0 +1,57 @@
package com.example.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
import java.util.ArrayList;
import java.util.List;
@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfiguration {
/**
* controller
*/
String controllerPackagePath = "com.example";
@Bean(value = "defaultApi2")
public Docket defaultApi2() {
List<Parameter> pars = new ArrayList<>();
ParameterBuilder tokenPar = new ParameterBuilder();
tokenPar.name("token")
.description("用户token")
.defaultValue("")
.modelRef(new ModelRef("string"))
.parameterType("header")
.required(false)
.build();
pars.add(tokenPar.build());
//添加head参数end
Docket docket=new Docket(DocumentationType.SWAGGER_2)
.apiInfo(new ApiInfoBuilder()
//.title("swagger-bootstrap-ui-demo RESTful APIs")
.description("# swagger-bootstrap-ui-demo RESTful APIs")
.termsOfServiceUrl("www.codeleader.top")
.version("1.0")
.build())
.globalOperationParameters(pars)
//分组名称
.groupName("2.X版本")
.select()
//这里指定Controller扫描包路径
.apis(RequestHandlerSelectors.basePackage(controllerPackagePath))
.paths(PathSelectors.any())
.build();
return docket;
}
}

@ -0,0 +1,34 @@
package com.example.config;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.example.mapper.db1", sqlSessionFactoryRef = "sqlSessionFactoryDb1")
@MapperScan(basePackages = "com.example.mapper.db2", sqlSessionFactoryRef = "sqlSessionFactoryDb2")
public class MyBatisPlusConfig {
@Bean(name = "sqlSessionFactoryDb1")
public SqlSessionFactory sqlSessionFactoryDb1(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:mapper/db1/*.xml"));
return factoryBean.getObject();
}
@Bean(name = "sqlSessionFactoryDb2")
public SqlSessionFactory sqlSessionFactoryDb2(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:mapper/db2/*.xml"));
return factoryBean.getObject();
}
}

@ -0,0 +1,34 @@
package com.example.controller;
import com.example.service.CollectService;
import com.example.util.CommonResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @ClassName MedRecordController
* @Description
* @Author linjj
* @Date 2025/3/25 16:45
* @Version 1.0
*/
@RestController
@RequestMapping("/task")
@Api(value = "重耗材任务接口", tags = "重耗材任务对外接口")
@Slf4j
public class MedRecordController {
@Autowired
private CollectService collectService;
@PostMapping("/getTask")
@ApiOperation("获取任务接口")
@ResponseBody
public CommonResult<?> GetTask() {
collectService.LianZhongConllect();
return CommonResult.success("1");
}
}

@ -0,0 +1,27 @@
package com.example.db1.dao;
import com.example.db2.dao.LianZhongDao;
import com.example.dto.TscanAssortDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @InterfaceName Tscan_assort
* @Description
* @Author linjj
* @Date 2025/6/5 10:25
* @Version 1.0
*/
@Mapper
public interface TscanAssortDao {
/**
* @description:
* @params: TscanAssortDto
* @return: boolean
* @author linjj
* @date: 2025/6/5 10:28
*/
boolean addTscanAssortDto(@Param("list") List<TscanAssortDto> list);
}

@ -0,0 +1,51 @@
package com.example.db2.dao;
import com.example.vo.CardInfoVo;
import com.example.vo.Picture;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @InterfaceName LianZhongDao
* @Description dao
* @Author linjj
* @Date 2025/6/4 13:15
* @Version 1.0
*/
@Mapper
public interface LianZhongDao {
/**
* @description:
* @params: state
* @return: Integer
* @author linjj
* @date: 2025/6/4 13:17
*/
Integer getCollectNum(Integer state);
/**
* @description: 1000
* @params: start end
* @return: CardInfoVo
* @author linjj
* @date: 2025/6/4 14:55
*/
List<CardInfoVo>getCardInfoVo(@Param("start") Integer start, @Param("end") Integer end);
/**
* @description: id
* @params: fileid
* @return: Picture
* @author linjj
* @date: 2025/6/4 15:25
*/
List<Picture>getPicture(String fileid);
/**
* @description:
* @params:
* @return:
* @author linjj
* @date: 2025/6/5 10:32
*/
Boolean updateState(@Param("id") String id,@Param("state") Integer state);
}

@ -0,0 +1,27 @@
package com.example.dto;
import lombok.Data;
/**
* @ClassName TscanAssort
* @Description
* @Author linjj
* @Date 2025/6/5 10:12
* @Version 1.0
*/
@Data
public class TscanAssortDto {
//病案id
private String patientId;
//分段id
private String assortId;
//文件名
private String scanPage;
//来源
private String source;
//是否删除0否
private String isDel;
//来源标识
private String sourceFlag;
}

@ -0,0 +1,17 @@
package com.example.service;
/**
* @InterfaceName CollectService
* @Description
* @Author linjj
* @Date 2025/6/4 13:11
* @Version 1.0
*/
public interface CollectService {
/**
* @description:
* @author linjj
* @date: 2025/6/4 13:13
*/
void LianZhongConllect();
}

@ -0,0 +1,173 @@
package com.example.service.serviceImpl;
import com.example.db1.dao.TscanAssortDao;
import com.example.db2.dao.LianZhongDao;
import com.example.service.CollectService;
import com.example.vo.CardInfoVo;
import com.example.vo.Picture;
import com.example.dto.TscanAssortDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @ClassName CollectServiceImpl
* @Description
* @Author linjj
* @Date 2025/6/4 13:12
* @Version 1.0
*/
@Service
@Slf4j
public class CollectServiceImpl implements CollectService {
@Value("${savePath}")
private String savePath;
@Autowired
private LianZhongDao lianZhongDao;
@Autowired
private TscanAssortDao tscanAssortDao;
private final ExecutorService executorService = Executors.newFixedThreadPool(2); // 创建一个包含两个线程的线程池
private final String uniUrl = "http://10.1.1.128";
@Override
public void LianZhongConllect() {
//查询所有联众需要同步数据未开始状态为0正在同步为1完成为2失败为3不存在文件为5
Integer collectNum = lianZhongDao.getCollectNum(5);
log.info("需要同步: " + collectNum + "条数据");
// 计算需要轮询的次数
int totalLoops = (collectNum + 999) / 1000; // 向上取整
// 使用AtomicInteger来记录当前任务的编号
AtomicInteger currentTask = new AtomicInteger(0);
// 使用CountDownLatch来控制任务的执行顺序
CountDownLatch latch = new CountDownLatch(1);
// 提交所有任务到线程池
for (int i = 0; i < totalLoops; i++) {
final int taskNum = i;
executorService.submit(() -> {
try {
// 等待前一个任务完成
latch.await();
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 重新设置中断状态
}
// 计算当前任务处理的数据范围
int start = taskNum * 1000;
int end = Math.min(start + 999, collectNum); // 确保不超过总条数
//执行任务
conllect(taskNum, start, end);
// 通知下一个任务可以开始
latch.countDown();
});
// 每两个任务提交后,释放一个计数器,允许下一个任务开始
if (currentTask.incrementAndGet() % 2 == 0) {
latch.countDown();
}
}
// 等待所有任务完成
try {
executorService.shutdown();
if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
executorService.shutdownNow();
}
} catch (InterruptedException e) {
executorService.shutdownNow();
Thread.currentThread().interrupt();
}
}
/**
* @description:
* @author linjj
* @date: 2025/6/4 13:33
*/
private void conllect(int taskNum, int start, int end) {
log.info("轮询第 " + (taskNum + 1) + " 次,处理数据范围: " + start + " 到 " + end);
//根据start跟end查询记录保证数据不会重复
List<CardInfoVo> cardInfoVo = lianZhongDao.getCardInfoVo(start, end);
//每个患者进行轮询
for (CardInfoVo list : cardInfoVo) {
try {
// //用于存储数码影像数据
// ArrayList<TscanAssortDto> tscanAssortDtos = new ArrayList<>();
log.info("当前同步患者id为:" + list.getId());
//查询患者当前文件信息
List<Picture> pictures = lianZhongDao.getPicture(list.getId());
if (ObjectUtils.isEmpty(pictures)) {
log.info("当前患者没有文件:" + list.getId());
continue;
}
//组织cmd命令
for (Picture picture : pictures) {
try {
//保存目录
String dir = savePath + File.separatorChar + list.getId();
//保存地址
String savePath = dir + File.separatorChar + picture.getPicname();
// 创建File对象
File directory = new File(dir);
// 判断目录是否存在
if (!directory.exists()) {
// 目录不存在,创建目录
boolean created = directory.mkdirs();
if (created) {
log.info("目录创建成功:" + dir);
} else {
log.info("目录创建失败:" + dir);
}
}
//组织cmd命令(D:\js\Debug\Debug\lianzhong.exe为路径,10.1.1.128为联众弟子)
String cmd = "D:\\js\\Debug\\Debug\\lianzhong.exe 003 10.1.1.128 " + list.getId() + " " + picture.getPicid() + " " + list.getPatno() + " " + list.getOutdateStr() + " " + picture.getPicname() + " " + savePath + " " + uniUrl + " " + picture.getRotatedegree();
log.info("CMD:" + cmd);
Process process = Runtime.getRuntime().exec(cmd);//执行命令生成cube
process.waitFor();
} catch (Exception e) {
log.info("患者同步失败:" + list.getId());
log.error(e.getMessage(), e);
}
// //完成后保存文件表
// TscanAssortDto tscanAssortDto =new TscanAssortDto();
// tscanAssortDto.setPatientId(list.getId());
// tscanAssortDto.setAssortId("lz"+picture.getPickind());
// tscanAssortDto.setScanPage(picture.getPicname());
// tscanAssortDto.setSource("1");
// tscanAssortDto.setIsDel("0");
// tscanAssortDto.setSourceFlag("lz");
// tscanAssortDtos.add(tscanAssortDto);
}
// //保存文件根据返修改改状态成功2失败3
// if (tscanAssortDao.addTscanAssortDto(tscanAssortDtos)){
// lianZhongDao.updateState(list.getId(),2);
// log.info("患者同步完成:"+list.getId());
// }else {
// lianZhongDao.updateState(list.getId(),3);
// log.info("患者同步失败:"+list.getId());
// }
} catch (Exception e) {
lianZhongDao.updateState(list.getId(), 3);
log.info("患者同步失败:" + list.getId());
log.error(e.getMessage(), e);
continue;
}
lianZhongDao.updateState(list.getId(), 2);
log.info("患者同步完成:" + list.getId());
}
}
}

@ -0,0 +1,43 @@
package com.example.text;
import com.example.MainApplication;
import com.example.service.CollectService;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* @ClassName test
* @Description
* @Author linjj
* @Date 2024/1/18 9:54
* @Version 1.0
*/
@SpringBootTest(classes = MainApplication.class)
@RunWith(SpringRunner.class)
@Slf4j
public class test {
@Value("${savePath}")
private String savePath;
private final static Logger logger = LoggerFactory.getLogger(test.class);
@Autowired
private CollectService collectService;
@Test
public void testDemo() {
collectService.LianZhongConllect();
}
}

@ -0,0 +1,26 @@
package com.example.util;
/**
* @description:
* @author: ChenJ
* @date: 2022/5/9 17:29
* @param:
* @return:
**/
public class BusinessException extends Exception {
/**
* ,codemsg
*/
private final ExceptionCode exceptionCode;
public ExceptionCode getExceptionCode() {
return exceptionCode;
}
public BusinessException(ExceptionCode exceptionCode) {
super(exceptionCode.getMessage());
this.exceptionCode = exceptionCode;
}
}

@ -0,0 +1,152 @@
package com.example.util;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
*
* @author docus
* @date 2020/3/28 16:23
*/
@Data
@ApiModel("响应")
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult<T> {
@ApiModelProperty("响应码")
private Integer code;
@ApiModelProperty("响应消息")
private String msg;
@ApiModelProperty("响应实体")
private T data;
public CommonResult(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
/**
*
*
* @param data
* @param <T>
* @return
*/
public static <T> CommonResult<T> success(T data) {
return new CommonResult<T>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);
}
/**
*
*
* @param data
* @param message
* @param <T>
* @return
*/
public static <T> CommonResult<T> success(T data, String message) {
return new CommonResult<T>(ResultCode.SUCCESS.getCode(), message, data);
}
/**
*
*
* @param errorCode
* @param <T>
* @return
*/
public static <T> CommonResult<T> failed(IErrorCode errorCode) {
return new CommonResult<T>(errorCode.getCode(), errorCode.getMessage(), null);
}
/**
*
*
* @param errorCode
* @param message
* @param <T>
* @return
*/
public static <T> CommonResult<T> failed(IErrorCode errorCode, String message) {
return new CommonResult<T>(errorCode.getCode(), message, null);
}
/**
*
*
* @param message
* @param <T>
* @return
*/
public static <T> CommonResult<T> failed(String message) {
return new CommonResult<T>(ResultCode.FAILED.getCode(), message, null);
}
/**
*
*
* @param <T>
* @return
*/
public static <T> CommonResult<T> failed() {
return failed(ResultCode.FAILED);
}
/**
*
*
* @param <T>
* @return
*/
public static <T> CommonResult<T> validateFailed() {
return failed(ResultCode.VALIDATE_FAILED);
}
/**
*
*
* @param message
* @param <T>
* @return
*/
public static <T> CommonResult<T> validateFailed(String message) {
return new CommonResult<T>(ResultCode.VALIDATE_FAILED.getCode(), message, null);
}
/**
*
*
* @param data
* @param <T>
* @return
*/
public static <T> CommonResult<T> unauthorized(T data) {
return new CommonResult<T>(ResultCode.UNAUTHORIZED.getCode(), ResultCode.UNAUTHORIZED.getMessage(), data);
}
/**
*
*
* @param data
* @param <T>
* @return
*/
public static <T> CommonResult<T> preventreplay(T data) {
return new CommonResult<T>(ResultCode.PREVENT_REPLAY.getCode(), ResultCode.PREVENT_REPLAY.getMessage(), data);
}
/**
*
*
* @param data
* @param <T>
* @return
*/
public static <T> CommonResult<T> forbidden(T data) {
return new CommonResult<T>(ResultCode.FORBIDDEN.getCode(), ResultCode.FORBIDDEN.getMessage(), data);
}
}

@ -0,0 +1,26 @@
package com.example.util;
public enum ExceptionCode {
/**
*
*/
WRONG_PARAMS("参数不对", 1001);
private final String message;
private final Integer code;
ExceptionCode(String message, int code) {
this.message = message;
this.code = code;
}
public String getMessage() {
return message;
}
public Integer getCode() {
return code;
}
}

@ -0,0 +1,12 @@
package com.example.util;
/**
* @Description API
* @Author JacksonTu
* @Date 2020/3/28 16:26
*/
public interface IErrorCode {
Integer getCode();
String getMessage();
}

@ -0,0 +1,51 @@
package com.example.util;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* fastJSON/jackson
*/
public class JsonResult implements Serializable {
private Map<String, Object> dataMap = new HashMap<>(3);
public JsonResult() {
}
public String getCode() {
return dataMap.get("code").toString();
}
public void setCode(String code) {
this.dataMap.put("code", code);
}
public String getMsg() {
return dataMap.get("msg").toString();
}
public void setMsg(String msg) {
this.dataMap.put("msg", msg);
}
public Object getData() {
return dataMap.get("data");
}
public void setData(Object data) {
this.dataMap.put("data", data);
}
public Map<String, Object> getDataMap() {
return dataMap;
}
public void setDataMap(Map<String, Object> dataMap) {
this.dataMap = dataMap;
}
public void put(String name, Object value) {
this.dataMap.put(name, value);
}
}

@ -0,0 +1,71 @@
/**
*
*/
package com.example.util;
import java.util.HashMap;
import java.util.Map;
/**
* <p>Title:Msg </p>
* <p>Description:common return class </p>
* <p>Company: </p>
* @author hu
* @date
*/
public class Msg {
//state:100-success 200-fail
private int code;
//提示信息
private String msg;
//用户要返回给浏览器的数据
private Map<String,Object> extend=new HashMap<String,Object>();
public static Msg fail(String msg){
Msg result=new Msg();
result.setCode(100);
result.setMsg(msg);
return result;
}
public static Msg success(String msg){
Msg result=new Msg();
result.setCode(200);
result.setMsg(msg);
return result;
}
public Msg add(String key, Object value){
this.getExtend().put(key, value);
return this;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Map<String, Object> getExtend() {
return extend;
}
public void setExtend(Map<String, Object> extend) {
this.extend = extend;
}
}

@ -0,0 +1,208 @@
package com.example.util;
import lombok.SneakyThrows;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public class MyDateUtil {
//获取之前的年限
public static String getBeforeAgeYear(int age) {
Calendar calBegin = Calendar.getInstance();
calBegin.setTime(new Date());
calBegin.add(Calendar.YEAR, -age);
Date time = calBegin.getTime();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return format.format(time);
}
//计算两个日期相差年数
public static int yearDateDiff(String startDate, Date endDate) {
Calendar calBegin = Calendar.getInstance(); //获取日历实例
Calendar calEnd = Calendar.getInstance();
calBegin.setTime(stringTodate(startDate, "yyyy-MM-dd")); //字符串按照指定格式转化为日期
calEnd.setTime(endDate);
return calEnd.get(Calendar.YEAR) - calBegin.get(Calendar.YEAR);
}
/**
*    *
*/
@SneakyThrows
public static int daysBetween(String smdate, String bdate) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Calendar cal = Calendar.getInstance();
cal.setTime(sdf.parse(smdate));
long time1 = cal.getTimeInMillis();
cal.setTime(sdf.parse(bdate));
long time2 = cal.getTimeInMillis();
long between_days = (time2 - time1) / (1000 * 3600 * 24);
return Integer.parseInt(String.valueOf(between_days));
}
@SneakyThrows
public static int daysBetween(Date smdate, Date bdate) {
Calendar cal = Calendar.getInstance();
cal.setTime(smdate);
long time1 = cal.getTimeInMillis();
cal.setTime(bdate);
long time2 = cal.getTimeInMillis();
long between_days = (time2 - time1) / (1000 * 3600 * 24);
return Integer.parseInt(String.valueOf(between_days));
}
public static int hoursBetween(Date smdate, Date bdate) {
Calendar cal = Calendar.getInstance();
cal.setTime(smdate);
long time1 = cal.getTimeInMillis();
cal.setTime(bdate);
long time2 = cal.getTimeInMillis();
long between_days = (time2 - time1) / (1000 * 3600);
return Integer.parseInt(String.valueOf(between_days));
}
//字符串按照指定格式转化为日期
public static Date stringTodate(String dateStr, String formatStr) {
// 如果时间为空则默认当前时间
Date date = null;
SimpleDateFormat format = new SimpleDateFormat(formatStr);
if (dateStr != null && !dateStr.equals("")) {
String time = "";
try {
Date dateTwo = format.parse(dateStr);
time = format.format(dateTwo);
date = format.parse(time);
} catch (ParseException e) {
e.printStackTrace();
}
} else {
String timeTwo = format.format(new Date());
try {
date = format.parse(timeTwo);
} catch (ParseException e) {
e.printStackTrace();
}
}
return date;
}
@SneakyThrows
public static String getYearAgoAndAfter(int year, int y) {
DateFormat df = new SimpleDateFormat("yyyy");
Date date = df.parse(String.valueOf(year));
Calendar instance = Calendar.getInstance();
instance.setTime(date);
instance.add(Calendar.YEAR, y);
Date time = instance.getTime();
DateFormat yyyyMMdd = new SimpleDateFormat("yyyyMMdd");
return yyyyMMdd.format(time);
}
@SneakyThrows
public static String getyyyyAgoAndAfter(int year, int y) {
DateFormat df = new SimpleDateFormat("yyyy");
Date date = df.parse(String.valueOf(year));
Calendar instance = Calendar.getInstance();
instance.setTime(date);
instance.add(Calendar.YEAR, y);
Date time = instance.getTime();
return df.format(time);
}
@SneakyThrows
public static boolean isTodayTrade(Date currDate, Date tradeDate) {
//判断当前时间是否大于当天2100 ,如果是是在今天内。
//判断当前时间是否大于昨天2100则不在当天内
Calendar calendar = Calendar.getInstance(Locale.CHINA);
calendar.setTime(currDate);
calendar.add(Calendar.DAY_OF_YEAR, -1);
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String yyyyMMddYestoday = df.format(calendar.getTime());
String yes21 = yyyyMMddYestoday + " 21:00:00";
DateFormat yyyyMMddHHmmss = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date yes21Date = yyyyMMddHHmmss.parse(yes21);
String yyyyMMddToday = df.format(currDate);
String today21 = yyyyMMddToday + " 21:00:00";
Date toy21Date = yyyyMMddHHmmss.parse(today21);
//交易时间小于昨天的21点一定是昨天开的仓
if (tradeDate.before(yes21Date)) {
return false;
}
//交易时间大于昨天的21点。交易时间小于今天的21点。且当前时间小于今天的21点。
if (tradeDate.after(yes21Date) && tradeDate.before(toy21Date) && currDate.before(toy21Date)) {
return true;
}
//交易时间大与今天的21点。
if (tradeDate.after(toy21Date) && currDate.after(toy21Date)) {
return true;
}
return false;
}
public static String dateToString(Date date, String format) {
DateFormat df = new SimpleDateFormat(format);
return df.format(date);
}
/**
*
*
* @param date
* @param timeStr1
* @param timeStr2
* @return
*/
public static boolean dateBetweenTime1AndTime2(Date date, String timeStr1, String timeStr2) {
String formatStr = "HH:mm:ss";
Date date1 = stringTodate(timeStr1, formatStr);
Date date2 = stringTodate(timeStr2, formatStr);
Date curdate = stringTodate(dateToString(date, formatStr), formatStr);
if ((date1.before(curdate) || date1.equals(curdate)) && (curdate.before(date2) || curdate.equals(date2))) {
return true;
}
return false;
}
public static boolean dateBetweenTime1AndTime3(Date date, String timeStr1, String timeStr2) {
String formatStr = "HH:mm:ss";
Date date1 = stringTodate(timeStr1, formatStr);
Date date2 = stringTodate(timeStr2, formatStr);
Date curdate = stringTodate(dateToString(date, formatStr), formatStr);
if ((date1.before(curdate) && (curdate.before(date2) || curdate.equals(date2)))) {
return true;
}
return false;
}
public static boolean dateBefore(String timeStr1, String timeStr2) {
String formatStr = "HH:mm:ss";
Date date1 = stringTodate(timeStr1, formatStr);
Date date2 = stringTodate(timeStr2, formatStr);
return date1.before(date2);
}
}

@ -0,0 +1,42 @@
package com.example.util;
/**
* @Description API
* @Author JacksonTu
* @Date 2020/3/28 16:26
*/
public enum ResultCode implements IErrorCode {
SUCCESS(0, "操作成功"),
FAILED(500, "操作失败"),
VALIDATE_FAILED(404, "参数检验失败"),
UNAUTHORIZED(401, "暂未登录或token已经过期"),
FORBIDDEN(403, "没有相关权限"),
PREVENT_REPLAY(405,"重复请求"),
NOT_EXIST(601,"数据不存在"),
NOT_ENABLE(600,"数据未启用");
private Integer code;
private String message;
private ResultCode(Integer code, String message) {
this.code = code;
this.message = message;
}
@Override
public Integer getCode() {
return code;
}
@Override
public String getMessage() {
return message;
}
}

@ -0,0 +1,49 @@
package com.example.vo;
import com.example.util.MyDateUtil;
import lombok.Data;
import java.util.Date;
/**
* @ClassName CardInfo
* @Description
* @Author linjj
* @Date 2025/6/4 15:05
* @Version 1.0
*/
@Data
public class CardInfoVo {
private String id;
//住院号
private String patno;
//患者姓名
private String patname;
//出院时间
private Date outdate;
//出院科室
private String outdeptname;
//性别
private String patsex;
//住院时间
private Date indate;
//住院科室
private String indeptname;
//同步状态0未开始 2完成 3失败 5缺失
private Integer state;
public String getOutdateStr(){
return MyDateUtil.dateToString(this.outdate,"yyyy-MM-dd");
}
public String getOutdateStr2(){
return MyDateUtil.dateToString(this.outdate,"yyyy-MM-dd HH:mm:ss");
}
public String getIndateStr(){
return MyDateUtil.dateToString(this.indate,"yyyy-MM-dd HH:mm:ss");
}
}

@ -0,0 +1,21 @@
package com.example.vo;
import lombok.Data;
@Data
public class Picture {
//文件id
private String picid;
//文件名
private String picname;
//患者id
private String fileid;
//工具要用的参数 旋转角度
private Double rotatedegree;
//分段id
private String pickind;
}

@ -0,0 +1,16 @@
server.port=7998
# SQL Server
spring.datasource.hikari.db1.jdbc-url=jdbc:sqlserver://10.1.1.147:1433;DatabaseName=csssemrrcord
spring.datasource.hikari.db1.username=sa
spring.datasource.hikari.db1.password=xjgs+docus911
spring.datasource.hikari.db1.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
#SQL Server
spring.datasource.hikari.db2.jdbc-url=jdbc:sqlserver://10.1.1.128:1433;DatabaseName=u_medrecord
spring.datasource.hikari.db2.username=sa
spring.datasource.hikari.db2.password=17931
spring.datasource.hikari.db2.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
# MyBatis-Plus ??
mybatis-plus.configuration.map-underscore-to-camel=true

@ -0,0 +1,4 @@
#文件保存路径
savePath: Z:\pic
#文件保存路径
collectFlag: 6

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!--按天生成日志,即一天只生成一个文件夹和一个日志文件-->
<appender name="logFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Prudent>true</Prudent>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>
LianzhongCollect/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.log
</FileNamePattern>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} -%msg%n
</Pattern>
</layout>
</appender>
<!-- logger节点可选节点作用是指明具体的包或类的日志输出级别
以及要使用的<appender>(可以把<appender>理解为一个日志模板)。
addtivity非必写属性是否向上级loger传递打印信息。默认是true-->
<logger name="com.framework.job" additivity="false">
<appender-ref ref="console"/>
<appender-ref ref="logFile"/>
</logger>
<!--项目的整体的日志打印级别为info-->
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="logFile"/>
</root>
</configuration>

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.db1.dao.TscanAssortDao">
<insert id="addTscanAssortDto">
insert into
t_scan_assort(patient_id,assort_id,scan_page,source,is_del,source_flag)
values
<foreach collection="list" item="item" separator=",">
(#{item.patientId},#{item.assortId},#{item.scanPage},#{item.source},#{item.isDel},
#{item.sourceFlag})
</foreach>
</insert>
</mapper>

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.db2.dao.LianZhongDao">
<update id="updateState">
UPDATE t_card_info_upload SET state=#{state} WHERE id=#{id}
</update>
<select id="getCollectNum" resultType="java.lang.Integer">
SELECT COUNT(*) FROM t_card_info_upload WHERE state!=#{state}
</select>
<select id="getCardInfoVo" resultType="com.example.vo.CardInfoVo">
WITH CTE AS (
SELECT *,
ROW_NUMBER() OVER (ORDER BY id) AS RowNum
FROM t_card_info_upload
)
SELECT *
FROM CTE
WHERE RowNum BETWEEN #{start} AND #{end} AND state!=5
</select>
<select id="getPicture" resultType="com.example.vo.Picture">
SELECT * FROM T_picture WHERE FileId=#{fileid}
</select>
</mapper>
Loading…
Cancel
Save