初始化

master
linjj 2 months ago
parent 755f92ac1e
commit c886392ae9

@ -6,75 +6,82 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version> <version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> </parent>
<groupId>com.shibofu.spring</groupId>
<artifactId>ECG</artifactId> <groupId>com.example</groupId>
<artifactId>LZ-scan</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>demo</name> <name>demo</name>
<description>Demo project for Spring Boot</description> <description>Demo project for Spring Boot</description>
<properties> <properties>
<java.version>1.8</java.version> <java.version>1.8</java.version>
</properties> </properties>
<dependencies> <dependencies>
<!-- Java Native Access (JNA) -->
<dependency> <dependency>
<groupId>net.java.dev.jna</groupId> <groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId> <artifactId>jna</artifactId>
<version>5.13.0</version> <version>5.13.0</version>
</dependency> </dependency>
<dependency>
<dependency> <groupId>net.java.dev.jna</groupId>
<groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId>
<artifactId>jna-platform</artifactId> <version>5.13.0</version>
<version>5.13.0</version> </dependency>
</dependency> <!-- oracle -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4</version>
</dependency>
<!-- springfox-swagger2Swagger的核心库 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- springfox-swagger-uiSwagger的UI界面 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</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> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId> <artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId> <artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1</version> <version>3.3.1</version>
</dependency> </dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId> <artifactId>spring-boot-starter-quartz</artifactId>
</dependency> </dependency>
<!-- sqlserver相关依赖 -->
<dependency> <dependency>
<groupId>com.microsoft.sqlserver</groupId> <groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId> <artifactId>sqljdbc4</artifactId>
@ -92,16 +99,12 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId> <artifactId>spring-boot-test</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>commons-io</groupId> <groupId>commons-io</groupId>
<artifactId>commons-io</artifactId> <artifactId>commons-io</artifactId>
<version>2.6</version> <version>2.6</version>
</dependency> </dependency>
</dependencies> </dependencies>
<build> <build>
<plugins> <plugins>
<plugin> <plugin>
@ -110,6 +113,4 @@
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
</project> </project>

@ -1,4 +1,4 @@
package com.shibofu.spring; package com.example;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;

@ -1,4 +1,4 @@
package com.shibofu.spring.config; package com.example.config;
import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionFactoryBean;
@ -14,12 +14,9 @@ import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource; import javax.sql.DataSource;
/**
* @author potter.fu
* @date 2018-12-07 15:30
*/
@Configuration @Configuration
@MapperScan(basePackages = "com.shibofu.spring.db2.dao", sqlSessionTemplateRef = "db2SqlSessionTemplate") @MapperScan(basePackages = "com.example.db2.dao", sqlSessionTemplateRef = "db2SqlSessionTemplate")
public class DataSource2Config { public class DataSource2Config {
@Bean(name = "db2DataSource") @Bean(name = "db2DataSource")

@ -0,0 +1,40 @@
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.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @ClassName SwaggerConfig
* @Description swagger
* @Author linjj
* @Date 2024/12/10 21:18
* @Version 1.0
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build()
.apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("连州人医API文档")
.description("连州人医接口文档")
.version("1.0.0")
.build();
}
}

@ -0,0 +1,33 @@
package com.example.controller;
import com.example.service.ArchiveService;
import com.example.util.CommonResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName ArchiveController
* @Description
* @Author linjj
* @Date 2024/12/13 13:21
* @Version 1.0
*/
@RestController
@RequestMapping("/archive")
@Api(tags = "归档测试接口", description = "Example API Description")
public class ArchiveController {
@Autowired
private ArchiveService archiveService;
@GetMapping("/archivePdf")
@ApiOperation(value = "pdf归档测试接口")
public CommonResult<?> archivePdf() {
archiveService.archive();
return CommonResult.success("执行完成");
}
}

@ -0,0 +1,32 @@
package com.example.controller;
import com.example.service.QualityService;
import com.example.util.CommonResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName QualityController
* @Description
* @Author linjj
* @Date 2025/1/14 16:32
* @Version 1.0
*/
@RestController
@RequestMapping("/quality")
@Api(tags = "质检测试接口", description = "Example API Description")
public class QualityController {
@Autowired
private QualityService qualityService;
@GetMapping("/qualityPdf")
@ApiOperation(value = "pdf质检测试接口")
public CommonResult<?> qualityPdf() {
qualityService.Quality();
return CommonResult.success("执行完成");
}
}

@ -0,0 +1,24 @@
package com.example.db1.dao;
import com.example.dto.AddDetailDto;
import com.example.vo.ArchiveDetailVo;
import lombok.Data;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @InterfaceName ArchiveDetailrDao
* @Description
* @Author linjj
* @Date 2024/12/12 16:33
* @Version 1.0
*/
@Mapper
public interface ArchiveDetailDao {
boolean addArchiveDetail(@Param("list") List<AddDetailDto> list);
List<String> getPdfPath(String masterId);
}

@ -0,0 +1,45 @@
package com.example.db1.dao;
import com.example.dto.AddMasterDto;
import com.example.dto.GetMasterIdDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @InterfaceName ArchiveMasterDao
* @Description
* @Author linjj
* @Date 2024/12/11 15:17
* @Version 1.0
*/
@Mapper
public interface ArchiveMasterDao {
/**
* @description: idid
* @params: GetMasterIdDto
* @return: id
* @author linjj
* @date: 2024/12/11 15:19
*/
List<String> getMasterId(GetMasterIdDto getMasterIdDto);
/**
* @description:
* @params: AddMasterDto
* @return: int
* @author linjj
* @date: 2024/12/11 16:48
*/
Boolean addArchiveMaster(AddMasterDto dto);
/**
* @description: id
* @params: id
* @return: Boolean
* @author linjj
* @date: 2024/12/12 16:10
*/
Boolean delMasterById(@Param("id") String id);
}

@ -0,0 +1,52 @@
package com.example.db1.dao;
import com.example.dto.AddCommonTableDto;
import com.example.dto.UpIsPdfDto;
import com.example.vo.QualityVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @InterfaceName CommonTableDao
* @Description CommonTable
* @Author linjj
* @Date 2024/12/13 16:31
* @Version 1.0
*/
@Mapper
public interface CommonTableDao {
/**
* @description: CommonTable
* @params: AddCommonTable
* @return: Boolean
* @author linjj
* @date: 2024/12/13 16:32
*/
Boolean addCommonTable(AddCommonTableDto addCommonTableDto);
/**
* @description: id
* @params: id
* @return: Boolean
* @author linjj
* @date: 2024/12/13 16:35
*/
Boolean delCommonTableById(String id);
/**
* @description:
* @author linjj
* @date: 2025/1/14 15:36
*/
List<QualityVo> getCommonTableId();
/**
* @description: isPDF
* @params: UpIsPdfDto
* @return: Boolean
* @author linjj
* @date: 2025/1/14 16:22
*/
Boolean updateIsPDFByIds(@Param("list") List<UpIsPdfDto> list);
}

@ -0,0 +1,27 @@
package com.example.db2.dao;
import com.example.dto.GetMedicalDto;
import com.example.vo.ArchiveMasterVo;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @InterfaceName ArchiveMasterDao
* @Description
* @Author linjj
* @Date 2024/12/11 14:05
* @Version 1.0
*/
@Mapper
public interface MedicalDao {
/**
* @description:
* @params: GetMedicalDto
* @return: ArchiveMasterVo
* @author linjj
* @date: 2024/12/11 14:08
*/
List<ArchiveMasterVo> GetMedicalInfo(GetMedicalDto getMedicalDto);
}

@ -0,0 +1,50 @@
package com.example.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @ClassName AddCommonTable
* @Description CommonTable
* @Author linjj
* @Date 2024/12/13 16:18
* @Version 1.0
*/
@Data
public class AddCommonTableDto {
@ApiModelProperty(value = "patientId")
private String patientId;
@ApiModelProperty(value = "*病案ID号")
private String admissId;
@ApiModelProperty(value = "*住院次数")
private String admissTimes;
@ApiModelProperty(value = "*病案号")
private String inpatientNo;
@ApiModelProperty(value = "患者姓名")
private String name;
@ApiModelProperty(value = "患者性别")
private String sex;
@ApiModelProperty(value = "*入院日期")
private String admissDate;
@ApiModelProperty(value = "出院日期")
private String disDate;
@ApiModelProperty(value = "出院科室")
private String disDept;
@ApiModelProperty(value = "*主治医师")
private String attending;
@ApiModelProperty(value = "*住院医师")
private String admissDoctor;
@ApiModelProperty(value = "出院科室名称")
private String disDeptName;
@ApiModelProperty(value = "身份证号")
private String idCard;
@ApiModelProperty(value = "标识")
private String splitName;
@ApiModelProperty(value = "盘号")
private String ph;
@ApiModelProperty(value = "光点号")
private String gdh;
}

@ -0,0 +1,51 @@
package com.example.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @ClassName AddDetailDto
* @Description
* @Author linjj
* @Date 2024/12/12 13:04
* @Version 1.0
*/
@Data
public class AddDetailDto {
@ApiModelProperty(value = "文件id")
private String ID;
@ApiModelProperty(value = "文件路径")
private String PDF_PATH;
@ApiModelProperty(value = "MasterID")
private String MasterID;
@ApiModelProperty(value = "更新时间")
private Date UpLoadDateTime;
@ApiModelProperty(value = "分段id")
private String AssortID;
@ApiModelProperty(value = "来源")
private String Source;
@ApiModelProperty(value = "分段信息")
private String SubAssort;
@ApiModelProperty(value = "文件名")
private String Title;
@ApiModelProperty(value = "标识")
private String flag;
@ApiModelProperty(value = "标识")
private String Sys;
@ApiModelProperty(value = "标识")
private String splitName;
}

@ -0,0 +1,50 @@
package com.example.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @ClassName AddArchiveMasterDto
* @Description
* @Author linjj
* @Date 2024/12/11 15:28
* @Version 1.0
*/
@Data
public class AddMasterDto {
@ApiModelProperty(value = "主键id")
private String id;
@ApiModelProperty(value = "病人id")
private String patientId;
@ApiModelProperty(value = "住院号")
private String inpNo;
@ApiModelProperty(value = "住院次数")
private String visitId;
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "性别")
private String sex;
@ApiModelProperty(value = "出院科室")
private String deptName;
@ApiModelProperty(value = "出院时间")
private String dischargeDateTime;
@ApiModelProperty(value = "归档状态")
private String ArchiveState;
@ApiModelProperty(value = "住院时间")
private String admissionDateTime;
@ApiModelProperty(value = "住院科室")
private String deptAdmissionTo;
@ApiModelProperty(value = "确认开始时间")
private Date checkDatetime;
@ApiModelProperty(value = "确认开始结束时间")
private Date checkedDatetime;
@ApiModelProperty(value = "主治医生")
private String DOCTOR_IN_CHARGE;
@ApiModelProperty(value = "身份证号")
private String ID_NO;
@ApiModelProperty(value = "标识")
private String splitName;
}

@ -0,0 +1,25 @@
package com.example.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @ClassName GetMasterDto
* @Description ArchiveMasterId dto
* @Author linjj
* @Date 2024/12/11 15:10
* @Version 1.0
*/
@Data
public class GetMasterIdDto {
@ApiModelProperty(value = "病人id")
private String patientId;
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "住院号")
private String inpNo;
}

@ -0,0 +1,24 @@
package com.example.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @ClassName GetMedicalDto
* @Description
* @Author linjj
* @Date 2024/12/11 14:09
* @Version 1.0
*/
@Data
public class GetMedicalDto {
@ApiModelProperty(value = "病人id")
private String SICK_ID;
@ApiModelProperty(value = "姓名")
private String NAME;
@ApiModelProperty(value = "住院号")
private String RESIDENCE_NO;
}

@ -0,0 +1,18 @@
package com.example.dto;
import lombok.Data;
/**
* @ClassName UpIsPdfDto
* @Description CommonTable isPdf
* @Author linjj
* @Date 2025/1/14 16:04
* @Version 1.0
*/
@Data
public class UpIsPdfDto {
private String patientId;
private int isPdf;
}

@ -0,0 +1,28 @@
package com.example.quartz;
import com.example.service.ArchiveService;
import org.quartz.JobExecutionContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
import javax.annotation.Resource;
/**
* @description:
* @author linjj
* @date: 2024/12/13 9:22
*/
public class ArchiveQuartz extends QuartzJobBean {
@Resource
private ArchiveService archiveService;
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) {
archiveService.archive();
}
}

@ -1,4 +1,4 @@
package com.shibofu.spring.quartz; package com.example.quartz;
import org.quartz.*; import org.quartz.*;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
@ -7,9 +7,8 @@ import org.springframework.context.annotation.Configuration;
/** /**
* @ClassName QuartzConfig * @ClassName QuartzConfig
* @Description
* @Author linjj * @Author linjj
* @Date 2023/8/14 15:47 * @Date 2024/12/13 15:47
* @Version 1.0 * @Version 1.0
*/ */
@Configuration @Configuration
@ -22,7 +21,7 @@ public class QuartzConfig {
@Bean @Bean
public JobDetail teatQuartzDetail() { public JobDetail teatQuartzDetail() {
return JobBuilder.newJob(ECGQuartz.class).withIdentity("ECGQuartz").storeDurably().build(); return JobBuilder.newJob(ArchiveQuartz.class).withIdentity("ArchiveQuartz").storeDurably().build();
} }

@ -0,0 +1,19 @@
package com.example.service;
/**
* @InterfaceName ArchiveService
* @Description
* @Author linjj
* @Date 2024/12/13 13:14
* @Version 1.0
*/
public interface ArchiveService {
/**
* @description:
* @author linjj
* @date: 2025/1/14 15:34
*/
boolean archive();
}

@ -0,0 +1,18 @@
package com.example.service;
/**
* @InterfaceName QualityService
* @Description
* @Author linjj
* @Date 2025/1/14 15:30
* @Version 1.0
*/
public interface QualityService {
/**
* @description:
* @author linjj
* @date: 2025/1/14 15:34
*/
Boolean Quality();
}

@ -0,0 +1,346 @@
package com.example.serviceImpl;
import com.example.db1.dao.ArchiveDetailDao;
import com.example.db1.dao.ArchiveMasterDao;
import com.example.db1.dao.CommonTableDao;
import com.example.db1.dao.ZdAssortDao;
import com.example.db2.dao.MedicalDao;
import com.example.dto.*;
import com.example.service.ArchiveService;
import com.example.vo.ArchiveMasterVo;
import com.example.vo.GetZdAssortVo;
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.StringUtils;
import java.io.File;
import java.nio.file.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @ClassName ArchiveServiceImpl
* @Description
* @Author linjj
* @Date 2024/12/13 13:15
* @Version 1.0
*/
@Service
@Slf4j
public class ArchiveServiceImpl implements ArchiveService {
@Value("${emr_pdf_files}")
private String emr_pdf_files;
@Value("${save_pdf_files}")
private String save_pdf_files;
@Autowired
private MedicalDao medicalDao;
@Autowired
private ArchiveMasterDao archiveMasterDao;
@Autowired
private ZdAssortDao zdAssortDao;
@Autowired
private ArchiveDetailDao archiveDetailDao;
@Autowired
private CommonTableDao commonTableDao;
@Override
public boolean archive() {
//获取最早的文件名
String fileName = getEarlyFileName();
//若返回空说明没有文件直接return
if (fileName == null) return false;
//-----------------------判断该病案是否上传完成代码---------------------------------
//将文件姓名解析 使用下划线 "_" 分割字符串
String[] parts = fileName.split("_");
GetMedicalDto getMedicalDto = new GetMedicalDto();
getMedicalDto.setNAME(parts[0]);
getMedicalDto.setSICK_ID(parts[1]);
getMedicalDto.setRESIDENCE_NO(parts[2]);
//存储患者基本信息
AddMasterDto addMasterDto = new AddMasterDto();
//查询该患者在视图中完成状态是否为1
List<ArchiveMasterVo> archiveMasterVos = medicalDao.GetMedicalInfo(getMedicalDto);
if (archiveMasterVos.isEmpty()) {
log.info("该病案还未上传完成:" + fileName);
return false;
}
//判断该病案是否存在归档数据库存在更新不存在新增,捕获到异常返回false直接return
if (!updateMedical(fileName, getMedicalDto, archiveMasterVos, addMasterDto)) return false;
//-----------------------将文件复制代码(将本次查询出来最早的文件备份后操作)---------------------------------
Path sourcePath = Paths.get(emr_pdf_files + File.separatorChar + fileName); // 源目录路径
Path targetPath = Paths.get(save_pdf_files + File.separatorChar + fileName); // 目标目录路径
try {
copyDirectory(sourcePath, targetPath); // 调用复制目录的方法
log.info("该病历图像已经复制完成:" + fileName);
} catch (Exception e) {
log.error("复制源文件到目标路径下失败,异常处理" + e, e.getMessage());
return false;
}
//将新地址插入数据库
addArchiveDetail(fileName, addMasterDto);
return true;
}
/**
* @description:
* @params: fileName
* @params: addMasterDto
* @author linjj
* @date: 2024/12/12 16:43
*/
private void addArchiveDetail(String fileName, AddMasterDto addMasterDto) {
// 创建File对象新地址
File newFile = new File(save_pdf_files + File.separatorChar + fileName);
// 获取目录下的所有文件(包括子目录中的文件)
File[] newFiles = newFile.listFiles();
//保存文件的数据
List<AddDetailDto> addDetailDtos = new ArrayList<AddDetailDto>();
if (newFiles.length == 0) {
log.info("新地址目录为空异常处理:" + fileName);
return;
}
for (File file : newFiles) {
//组织数据
AddDetailDto addDetailDto = new AddDetailDto();
addDetailDto.setPDF_PATH(file.getPath());
addDetailDto.setMasterID(addMasterDto.getId());
addDetailDto.setUpLoadDateTime(new Date());
List<GetZdAssortVo> zdAssort = zdAssortDao.getZdAssort();
String newFileName = file.getName();
//将文件姓名解析 使用下划线 "_" 分割字符串
String[] newParts = newFileName.split("_");
// 调用方法查找name为"Item2"的id
String assortId = assortIdByName(zdAssort, newParts[0]);
if (StringUtils.isEmpty(assortId)) {
assortId = "C7C73CD034B440F6B33A79E382A5610F";
}
addDetailDto.setAssortID(assortId);
addDetailDto.setSource("后台");
addDetailDto.setSubAssort(newParts[0]);
addDetailDto.setTitle(newParts[0]);
addDetailDto.setFlag("0");
addDetailDto.setSys("2");
addDetailDto.setSplitName("guiDang");
addDetailDtos.add(addDetailDto);
}
if (archiveDetailDao.addArchiveDetail(addDetailDtos)) {
log.info("加入文件表完成:" + fileName);
} else {
log.info("加入文件表失败异常处理:" + fileName);
}
}
/**
* @description:
* @params: zdAssortDto
* @params: name
* @return: assortId
* @author linjj
* @date: 2024/12/12 16:25
*/
public static String assortIdByName(List<GetZdAssortVo> zdAssortDto, String name) {
return zdAssortDto.stream()
.filter(item -> item.getAssortName().equals(name))
.map(GetZdAssortVo::getAssortId)
.findFirst()
.orElse(null);
}
/**
* @description:
* @params: fileName
* @params: getMedicalDto
* @params: ArchiveMasterVo
* @return: boolean
* @author linjj
* @date: 2024/12/12 12:07
*/
private boolean updateMedical(String fileName, GetMedicalDto getMedicalDto, List<ArchiveMasterVo> archiveMasterVos, AddMasterDto addMasterDto) {
//判断是否存在该患者信息基础表
try {
GetMasterIdDto getMasterIdDto = new GetMasterIdDto();
//使用时间生成一个id
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmssSSS");
//获取今天日期
String id = fmt.format(new Date());
getMasterIdDto.setName(getMedicalDto.getNAME());
getMasterIdDto.setPatientId(getMedicalDto.getSICK_ID());
getMasterIdDto.setInpNo(getMedicalDto.getRESIDENCE_NO());
List<String> masterIds = archiveMasterDao.getMasterId(getMasterIdDto);
//不存在新增
if (masterIds.isEmpty()) {
//组织需要保存归档基础信息表的数据,不存在时使用当前时间为患者id
addMasterDto.setId(id);
addMasterDto.setPatientId(archiveMasterVos.get(0).getSICK_ID());
addMasterDto.setInpNo(archiveMasterVos.get(0).getRESIDENCE_NO());
addMasterDto.setVisitId(archiveMasterVos.get(0).getVISIT_NUMBER());
addMasterDto.setName(archiveMasterVos.get(0).getNAME());
addMasterDto.setSex(archiveMasterVos.get(0).getSEX());
addMasterDto.setDeptName(archiveMasterVos.get(0).getDEPT_CODE());
addMasterDto.setDischargeDateTime(archiveMasterVos.get(0).getDISCHARGE_TIME());
addMasterDto.setArchiveState("已归档");
addMasterDto.setAdmissionDateTime(archiveMasterVos.get(0).getADMISSION_TIME());
addMasterDto.setDeptAdmissionTo(archiveMasterVos.get(0).getADMISSION_DEPT_CODE());
addMasterDto.setCheckDatetime(new Date());
addMasterDto.setCheckedDatetime(new Date());
addMasterDto.setDOCTOR_IN_CHARGE(archiveMasterVos.get(0).getDOCTOR());
addMasterDto.setID_NO(archiveMasterVos.get(0).getID_CARD_NO());
addMasterDto.setSplitName("guiDang");
if (archiveMasterDao.addArchiveMaster(addMasterDto)) {
log.info("同步基础信息成功:" + fileName);
}
//不存是时同样在CommonTable插入新数据
AddCommonTableDto addCommonTableDto =new AddCommonTableDto();
addCommonTableDto.setPatientId(id);
addCommonTableDto.setAdmissId(archiveMasterVos.get(0).getSICK_ID());
addCommonTableDto.setAdmissTimes(archiveMasterVos.get(0).getVISIT_NUMBER());
addCommonTableDto.setInpatientNo(archiveMasterVos.get(0).getRESIDENCE_NO());
addCommonTableDto.setName(archiveMasterVos.get(0).getNAME());
addCommonTableDto.setSex(archiveMasterVos.get(0).getSEX());
addCommonTableDto.setAdmissDate(archiveMasterVos.get(0).getADMISSION_TIME());
addCommonTableDto.setDisDate(archiveMasterVos.get(0).getDISCHARGE_TIME());
addCommonTableDto.setDisDept(archiveMasterVos.get(0).getDEPT_CODE());
addCommonTableDto.setAttending(archiveMasterVos.get(0).getDOCTOR());
addCommonTableDto.setDisDeptName(archiveMasterVos.get(0).getDETP_NAME());
addCommonTableDto.setIdCard(archiveMasterVos.get(0).getID_CARD_NO());
addCommonTableDto.setAdmissDoctor(archiveMasterVos.get(0).getDOCTOR());
addCommonTableDto.setSplitName("guiDang");
addCommonTableDto.setPh("-");
addCommonTableDto.setGdh("-");
if (commonTableDao.addCommonTable(addCommonTableDto)) {
log.info("同步基础信息到CommonTable表成功:" + fileName);
}
//存在时先删除后使用原masterIds赋值
} else {
addMasterDto.setId(masterIds.get(0));
addMasterDto.setPatientId(archiveMasterVos.get(0).getSICK_ID());
addMasterDto.setInpNo(archiveMasterVos.get(0).getRESIDENCE_NO());
addMasterDto.setVisitId(archiveMasterVos.get(0).getVISIT_NUMBER());
addMasterDto.setName(archiveMasterVos.get(0).getNAME());
addMasterDto.setSex(archiveMasterVos.get(0).getSEX());
addMasterDto.setDeptName(archiveMasterVos.get(0).getDEPT_CODE());
addMasterDto.setDischargeDateTime(archiveMasterVos.get(0).getDISCHARGE_TIME());
addMasterDto.setArchiveState("已归档");
addMasterDto.setAdmissionDateTime(archiveMasterVos.get(0).getADMISSION_TIME());
addMasterDto.setDeptAdmissionTo(archiveMasterVos.get(0).getADMISSION_DEPT_CODE());
addMasterDto.setCheckDatetime(new Date());
addMasterDto.setCheckedDatetime(new Date());
addMasterDto.setDOCTOR_IN_CHARGE(archiveMasterVos.get(0).getDOCTOR());
addMasterDto.setID_NO(archiveMasterVos.get(0).getID_CARD_NO());
addMasterDto.setSplitName("guiDang");
if (archiveMasterDao.delMasterById(masterIds.get(0))) {
if (archiveMasterDao.addArchiveMaster(addMasterDto)) {
log.info("同步基础信息成功:" + fileName);
}
}
//存在时同样删除CommonTable数据
AddCommonTableDto addCommonTableDto =new AddCommonTableDto();
addCommonTableDto.setPatientId(masterIds.get(0));
addCommonTableDto.setAdmissId(archiveMasterVos.get(0).getSICK_ID());
addCommonTableDto.setAdmissTimes(archiveMasterVos.get(0).getVISIT_NUMBER());
addCommonTableDto.setInpatientNo(archiveMasterVos.get(0).getRESIDENCE_NO());
addCommonTableDto.setName(archiveMasterVos.get(0).getNAME());
addCommonTableDto.setSex(archiveMasterVos.get(0).getSEX());
addCommonTableDto.setAdmissDate(archiveMasterVos.get(0).getADMISSION_TIME());
addCommonTableDto.setDisDate(archiveMasterVos.get(0).getDISCHARGE_TIME());
addCommonTableDto.setDisDept(archiveMasterVos.get(0).getDEPT_CODE());
addCommonTableDto.setAttending(archiveMasterVos.get(0).getDOCTOR());
addCommonTableDto.setDisDeptName(archiveMasterVos.get(0).getDETP_NAME());
addCommonTableDto.setIdCard(archiveMasterVos.get(0).getID_CARD_NO());
addCommonTableDto.setAdmissDoctor(archiveMasterVos.get(0).getDOCTOR());
addCommonTableDto.setSplitName("guiDang");
addCommonTableDto.setPh("-");
addCommonTableDto.setGdh("-");
if (commonTableDao.delCommonTableById(masterIds.get(0))){
if (commonTableDao.addCommonTable(addCommonTableDto)) {
log.info("同步基础信息到CommonTable表成功:" + fileName);
}
}
}
} catch (Exception e) {
log.info("同步基础信息失败请异常处理:" + fileName + "异常信息:" + e, e.getMessage());
return false;
}
return true;
}
/**
* @description:
* @return: fileName
* @author linjj
* @date: 2024/12/12 11:36
*/
private String getEarlyFileName() {
// 创建File对象代表指定的目录
File directory = new File(emr_pdf_files);
// 确保目录存在
if (!directory.isDirectory()) {
System.out.println("目录不存在");
log.info("目录不存在");
return null;
}
// 获取目录下所有文件和文件夹
File[] files = directory.listFiles(file -> file.isDirectory());
if (files.length == 0) {
log.info("文件夹为空");
return null;
}
// 初始化最早文件夹和最早时间戳
File oldestFile = null;
long oldestTime = Long.MAX_VALUE;
// 遍历所有文件夹
for (File folder : files) {
// 获取文件夹的最后修改时间
long lastModified = folder.lastModified();
// 如果当前文件夹的修改时间更早,则更新最早文件夹和时间戳
if (lastModified < oldestTime) {
oldestTime = lastModified;
oldestFile = folder;
}
}
// 输出创建时间最早的文件信息
if (oldestFile == null) {
log.info("没有找到复合条件的文件信息");
return null;
}
//最早的文件名
String fileName = oldestFile.getName();
log.info("当前操作文件夹信息为:" + fileName);
return fileName;
}
/**
* @description:
* @params: source
* @params: target
* @author linjj
* @date: 2024/12/12 16:06
*/
public static void copyDirectory(Path source, Path target) throws Exception {
// 如果目标目录不存在,则创建它
if (!Files.exists(target)) {
Files.createDirectories(target);
}
// 使用DirectoryStream遍历源目录中的所有文件和子目录
try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(source)) {
for (Path path : directoryStream) {
Path targetPath = target.resolve(source.relativize(path));
//存在相同文件时REPLACE_EXISTING会替换掉相同的文件夹
Files.copy(path, targetPath, StandardCopyOption.REPLACE_EXISTING);
//在复制完成后删除对应的源文件
Files.delete(path); // 删除源文件
}
//复制成功后将源地址文件删除
Files.delete(source);
}
}
}

@ -0,0 +1,137 @@
package com.example.serviceImpl;
import com.example.db1.dao.ArchiveDetailDao;
import com.example.db1.dao.CommonTableDao;
import com.example.dto.UpIsPdfDto;
import com.example.service.QualityService;
import com.example.util.ListUtil;
import com.example.vo.ArchiveDetailVo;
import com.example.vo.QualityVo;
import io.swagger.annotations.ApiModelProperty;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.ListUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.management.remote.rmi._RMIConnection_Stub;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName QualityServiceImpl
* @Description
* @Author linjj
* @Date 2025/1/14 15:30
* @Version 1.0
*/
@Service
@Slf4j
public class QualityServiceImpl implements QualityService {
@Autowired
private CommonTableDao commonTableDao;
@Autowired
private ArchiveDetailDao archiveDetailDao;
@Override
public Boolean Quality() {
try {
//查询所有需要质检的主键id
List<QualityVo> commonTableList = commonTableDao.getCommonTableId();
//masterIds集合
List<String> masterIdList = ListUtil.distinctSelect(commonTableList, QualityVo::getPatientId);
//每次取出100条
List<List<String>> batchList = ListUtils.partition(masterIdList, 100);
//记录CommonTable表中isPdf字段1代表没有内容0表示有内容
List<UpIsPdfDto> isPdfs = new ArrayList<>();
//循环执行所有批次
for (List<String> masterIds : batchList) {
//循环执行本次批次中所有的masterId
for (String masterId : masterIds) {
log.info("开始质检的id为" + masterId);
UpIsPdfDto upIsPdfDto = new UpIsPdfDto();
//查询是否存在图像
List<String> pdfPaths = archiveDetailDao.getPdfPath(masterId);
//如果大于100条记录属于问题病案
if (pdfPaths.size() > 100) {
//记录CommonTable表中isPdf字段1代表没有内容0表示有内容
upIsPdfDto.setPatientId(masterId);
upIsPdfDto.setIsPdf(1);
isPdfs.add(upIsPdfDto);
log.info("病案主键id为" + masterId + "文件里超过100条记录");
} else if (!pdfPaths.isEmpty() && pdfPaths.size() < 100) {
//查询所有文件是否可以正常使用返回false为pdf存在问题
if (!isPDFValid(pdfPaths)) {
//记录CommonTable表中isPdf字段1代表没有内容0表示有内容
upIsPdfDto.setPatientId(masterId);
upIsPdfDto.setIsPdf(1);
isPdfs.add(upIsPdfDto);
log.info("病案主键id为" + masterId + "没有文件图像异常");
} else {
//记录CommonTable表中isPdf字段1代表没有内容0表示有内容
upIsPdfDto.setPatientId(masterId);
upIsPdfDto.setIsPdf(0);
isPdfs.add(upIsPdfDto);
}
} else if (pdfPaths.isEmpty()) {
//记录CommonTable表中isPdf字段1代表没有内容0表示有内容
upIsPdfDto.setPatientId(masterId);
upIsPdfDto.setIsPdf(1);
isPdfs.add(upIsPdfDto);
log.info("病案主键id为" + masterId + "没有文件图像信息");
}
}
//修改CommonTable表中isPdf字段
commonTableDao.updateIsPDFByIds(isPdfs);
log.info("执行完成:" + masterIds.size() + "条数据");
//清空isPdfs中数据
isPdfs.clear();
}
log.info("质检完成");
} catch (Exception e) {
log.error("系统异常处理" + e, e.getMessage());
}
return true;
}
/**
* @description:
* @params: filePath
* @return: boolean
* @author linjj
* @date: 2025/1/14 16:12
*/
public boolean isPDFValid(List<String> filePaths) {
for (String filePath : filePaths) {
File file = new File(filePath);
if (!file.exists()) {
return false;
}
try (PDDocument document = PDDocument.load(file)) {
// 检查PDF文件的页数
int numberOfPages = document.getNumberOfPages();
if (numberOfPages <= 0) {
return false;
}
// 尝试读取每一页的内容
PDFTextStripper pdfTextStripper = new PDFTextStripper();
for (int i = 0; i < numberOfPages; i++) {
String text = pdfTextStripper.getText(document);
if (text == null || text.isEmpty()) {
return false;
}
}
} catch (Exception e) {
return false;
}
}
return true;
}
}

@ -0,0 +1,303 @@
package com.example.text;
import com.example.MainApplication;
import com.example.db1.dao.ArchiveDetailDao;
import com.example.db1.dao.ArchiveMasterDao;
import com.example.db1.dao.ZdAssortDao;
import com.example.db2.dao.MedicalDao;
import com.example.dto.*;
import com.example.vo.ArchiveMasterVo;
import com.example.vo.GetZdAssortVo;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
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;
import org.springframework.util.StringUtils;
import java.io.File;
import java.nio.file.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @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("${emr_pdf_files}")
private String emr_pdf_files;
@Value("${save_pdf_files}")
private String save_pdf_files;
@Autowired
private MedicalDao medicalDao;
@Autowired
private ArchiveMasterDao archiveMasterDao;
@Autowired
private ZdAssortDao zdAssortDao;
@Autowired
private ArchiveDetailDao archiveDetailDao;
@Test
public void testDemo() {
//获取最早的文件名
String fileName = getEarlyFileName();
//若返回空说明没有文件直接return
if (fileName == null) return;
//-----------------------判断该病案是否上传完成代码---------------------------------
//将文件姓名解析 使用下划线 "_" 分割字符串
String[] parts = fileName.split("_");
GetMedicalDto getMedicalDto = new GetMedicalDto();
getMedicalDto.setNAME(parts[0]);
getMedicalDto.setSICK_ID(parts[1]);
getMedicalDto.setRESIDENCE_NO(parts[2]);
//存储患者基本信息
AddMasterDto addMasterDto = new AddMasterDto();
//查询该患者在视图中完成状态是否为1
List<ArchiveMasterVo> archiveMasterVos = medicalDao.GetMedicalInfo(getMedicalDto);
if (archiveMasterVos.isEmpty()) {
log.info("该病案还未上传完成:" + fileName);
return;
}
//判断该病案是否存在归档数据库存在更新不存在新增,捕获到异常返回false直接return
if (!updateMedical(fileName, getMedicalDto, archiveMasterVos, addMasterDto)) return;
//-----------------------将文件复制代码(将本次查询出来最早的文件备份后操作)---------------------------------
Path sourcePath = Paths.get(emr_pdf_files + File.separatorChar + fileName); // 源目录路径
Path targetPath = Paths.get(save_pdf_files + File.separatorChar + fileName); // 目标目录路径
try {
copyDirectory(sourcePath, targetPath); // 调用复制目录的方法
log.info("该病历图像已经复制完成:" + fileName);
} catch (Exception e) {
log.error("复制源文件到目标路径下失败,异常处理" + e, e.getMessage());
return;
}
//将新地址插入数据库
addArchiveDetail(fileName, addMasterDto);
}
/**
* @description:
* @params: fileName
* @params: addMasterDto
* @author linjj
* @date: 2024/12/12 16:43
*/
private void addArchiveDetail(String fileName, AddMasterDto addMasterDto) {
// 创建File对象新地址
File newFile = new File(save_pdf_files + File.separatorChar + fileName);
// 获取目录下的所有文件(包括子目录中的文件)
File[] newFiles = newFile.listFiles();
//保存文件的数据
List<AddDetailDto> addDetailDtos = new ArrayList<AddDetailDto>();
if (newFiles.length == 0) {
log.info("新地址目录为空异常处理:" + fileName);
return;
}
for (File file : newFiles) {
//组织数据
AddDetailDto addDetailDto = new AddDetailDto();
addDetailDto.setPDF_PATH(file.getPath());
addDetailDto.setMasterID(addMasterDto.getId());
addDetailDto.setUpLoadDateTime(new Date());
List<GetZdAssortVo> zdAssort = zdAssortDao.getZdAssort();
String newFileName = file.getName();
//将文件姓名解析 使用下划线 "_" 分割字符串
String[] newParts = newFileName.split("_");
// 调用方法查找name为"Item2"的id
String assortId = assortIdByName(zdAssort, newParts[0]);
if (StringUtils.isEmpty(assortId)) {
assortId = "其他";
}
addDetailDto.setAssortID(assortId);
addDetailDto.setSource("后台");
addDetailDto.setSubAssort(newParts[0]);
addDetailDto.setTitle(newParts[0]);
addDetailDto.setFlag("0");
addDetailDto.setSys("2");
addDetailDto.setSplitName("guiDang");
addDetailDtos.add(addDetailDto);
}
if (archiveDetailDao.addArchiveDetail(addDetailDtos)) {
log.info("加入文件表完成:" + fileName);
} else {
log.info("加入文件表失败异常处理:" + fileName);
}
}
/**
* @description:
* @params: zdAssortDto
* @params: name
* @return: assortId
* @author linjj
* @date: 2024/12/12 16:25
*/
public static String assortIdByName(List<GetZdAssortVo> zdAssortDto, String name) {
return zdAssortDto.stream()
.filter(item -> item.getAssortName().equals(name))
.map(GetZdAssortVo::getAssortId)
.findFirst()
.orElse(null);
}
/**
* @description:
* @params: fileName
* @params: getMedicalDto
* @params: ArchiveMasterVo
* @return: boolean
* @author linjj
* @date: 2024/12/12 12:07
*/
private boolean updateMedical(String fileName, GetMedicalDto getMedicalDto, List<ArchiveMasterVo> archiveMasterVos, AddMasterDto addMasterDto) {
//判断是否存在该患者信息基础表
try {
GetMasterIdDto getMasterIdDto = new GetMasterIdDto();
//使用时间生成一个id
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmssSSS");
//获取今天日期
String id = fmt.format(new Date());
getMasterIdDto.setName(getMedicalDto.getNAME());
getMasterIdDto.setPatientId(getMedicalDto.getSICK_ID());
getMasterIdDto.setInpNo(getMedicalDto.getRESIDENCE_NO());
List<String> masterIds = archiveMasterDao.getMasterId(getMasterIdDto);
//不存在新增
if (masterIds.isEmpty()) {
//组织需要保存归档基础信息表的数据,不存在时使用当前时间为患者id
addMasterDto.setId(id);
addMasterDto.setPatientId(archiveMasterVos.get(0).getSICK_ID());
addMasterDto.setInpNo(archiveMasterVos.get(0).getRESIDENCE_NO());
addMasterDto.setVisitId(archiveMasterVos.get(0).getVISIT_NUMBER());
addMasterDto.setName(archiveMasterVos.get(0).getNAME());
addMasterDto.setSex(archiveMasterVos.get(0).getSEX());
addMasterDto.setDeptName(archiveMasterVos.get(0).getDEPT_CODE());
addMasterDto.setDischargeDateTime(archiveMasterVos.get(0).getDISCHARGE_TIME());
addMasterDto.setArchiveState("已归档");
addMasterDto.setAdmissionDateTime(archiveMasterVos.get(0).getADMISSION_TIME());
addMasterDto.setDeptAdmissionTo(archiveMasterVos.get(0).getADMISSION_DEPT_CODE());
addMasterDto.setCheckDatetime(new Date());
addMasterDto.setCheckedDatetime(new Date());
addMasterDto.setDOCTOR_IN_CHARGE(archiveMasterVos.get(0).getDOCTOR());
addMasterDto.setID_NO(archiveMasterVos.get(0).getID_CARD_NO());
addMasterDto.setSplitName("guiDang");
if (archiveMasterDao.addArchiveMaster(addMasterDto)) {
log.info("同步基础信息成功:" + fileName);
}
//存在时先删除后使用原masterIds赋值
} else {
addMasterDto.setId(masterIds.get(0));
addMasterDto.setPatientId(archiveMasterVos.get(0).getSICK_ID());
addMasterDto.setInpNo(archiveMasterVos.get(0).getRESIDENCE_NO());
addMasterDto.setVisitId(archiveMasterVos.get(0).getVISIT_NUMBER());
addMasterDto.setName(archiveMasterVos.get(0).getNAME());
addMasterDto.setSex(archiveMasterVos.get(0).getSEX());
addMasterDto.setDeptName(archiveMasterVos.get(0).getDEPT_CODE());
addMasterDto.setDischargeDateTime(archiveMasterVos.get(0).getDISCHARGE_TIME());
addMasterDto.setArchiveState("已归档");
addMasterDto.setAdmissionDateTime(archiveMasterVos.get(0).getADMISSION_TIME());
addMasterDto.setDeptAdmissionTo(archiveMasterVos.get(0).getADMISSION_DEPT_CODE());
addMasterDto.setCheckDatetime(new Date());
addMasterDto.setCheckedDatetime(new Date());
addMasterDto.setDOCTOR_IN_CHARGE(archiveMasterVos.get(0).getDOCTOR());
addMasterDto.setID_NO(archiveMasterVos.get(0).getID_CARD_NO());
addMasterDto.setSplitName("guiDang");
if (archiveMasterDao.delMasterById(masterIds.get(0))) {
if (archiveMasterDao.addArchiveMaster(addMasterDto)) {
log.info("同步基础信息成功:" + fileName);
}
}
}
} catch (Exception e) {
log.info("同步基础信息失败请异常处理:" + fileName + "异常信息:" + e, e.getMessage());
return false;
}
return true;
}
/**
* @description:
* @return: fileName
* @author linjj
* @date: 2024/12/12 11:36
*/
private String getEarlyFileName() {
// 创建File对象代表指定的目录
File directory = new File(emr_pdf_files);
// 确保目录存在
if (!directory.isDirectory()) {
System.out.println("目录不存在");
log.info("目录不存在");
return null;
}
// 获取目录下所有文件和文件夹
File[] files = directory.listFiles(file -> file.isDirectory());
if (files.length == 0) {
log.info("文件夹为空");
return null;
}
// 初始化最早文件夹和最早时间戳
File oldestFile = null;
long oldestTime = Long.MAX_VALUE;
// 遍历所有文件夹
for (File folder : files) {
// 获取文件夹的最后修改时间
long lastModified = folder.lastModified();
// 如果当前文件夹的修改时间更早,则更新最早文件夹和时间戳
if (lastModified < oldestTime) {
oldestTime = lastModified;
oldestFile = folder;
}
}
// 输出创建时间最早的文件信息
if (oldestFile == null) {
log.info("没有找到复合条件的文件信息");
return null;
}
//最早的文件名
String fileName = oldestFile.getName();
log.info("当前操作文件夹信息为:" + fileName);
return fileName;
}
/**
* @description:
* @params: source
* @params: target
* @author linjj
* @date: 2024/12/12 16:06
*/
public static void copyDirectory(Path source, Path target) throws Exception {
// 如果目标目录不存在,则创建它
if (!Files.exists(target)) {
Files.createDirectories(target);
}
// 使用DirectoryStream遍历源目录中的所有文件和子目录
try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(source)) {
for (Path path : directoryStream) {
Path targetPath = target.resolve(source.relativize(path));
//存在相同文件时REPLACE_EXISTING会替换掉相同的文件夹
Files.copy(path, targetPath, StandardCopyOption.REPLACE_EXISTING);
//在复制完成后删除对应的源文件
Files.delete(path); // 删除源文件
}
//复制成功后将源地址文件删除
Files.delete(source);
}
}
}

@ -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);
}
}

@ -1,4 +1,4 @@
package com.shibofu.spring.util; package com.example.util;
public enum ExceptionCode { public enum ExceptionCode {

@ -0,0 +1,12 @@
package com.example.util;
/**
* @InterfaceName FieldSelector
* @Description
* @Author linjj
* @Date 2023/6/29 16:41
* @Version 1.0
*/
public interface FieldSelector<Type, FieldType> {
FieldType select(Type type);
}

@ -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();
}

@ -1,4 +1,4 @@
package com.shibofu.spring.util; package com.example.util;
import java.io.Serializable; import java.io.Serializable;
import java.util.HashMap; import java.util.HashMap;

@ -0,0 +1,73 @@
package com.example.util;
import org.springframework.util.CollectionUtils;
import java.util.*;
public final class ListUtil {
public static <T, K> Map<K, T> toMap(List<T> list, FieldSelector<T, K> selector) {
if (CollectionUtils.isEmpty(list)) return Collections.emptyMap();
Map<K, T> map = new HashMap<>(list.size());
for (T t : list) {
K key = selector.select(t);
if (key != null) map.put(key, t);
}
return map;
}
public static <T, K> Map<K, List<T>> groupBy(List<T> list, FieldSelector<T, K> selector) {
if (CollectionUtils.isEmpty(list)) return Collections.emptyMap();
Map<K, List<T>> map = new HashMap<>();
for (T t : list) {
K key = selector.select(t);
if (key == null) continue;
if (!map.containsKey(key)) {
map.put(key, new ArrayList<T>());
}
map.get(key).add(t);
}
return map;
}
public static <T, K> List<K> select(List<T> list, FieldSelector<T, K> selector) {
if (CollectionUtils.isEmpty(list)) return Collections.emptyList();
List<K> filedList = new ArrayList<>(list.size());
for (T t : list) {
K key = selector.select(t);
if (key != null) filedList.add(key);
}
return filedList;
}
public static <T, K> List<K> distinctSelect(List<T> list, FieldSelector<T, K> selector) {
if (CollectionUtils.isEmpty(list)) return Collections.emptyList();
Set<K> filedSet = new HashSet<>();
for (T t : list) {
K key = selector.select(t);
if (key != null) filedSet.add(key);
}
return new ArrayList<>(filedSet);
}
@SafeVarargs
public static <T> List<T> unionWithoutDuplicate(List<T>... values) {
if (null == values || values.length <= 0) return Collections.emptyList();
Set<T> unionFiledSet = new HashSet<>();
for (List<T> value : values) {
if (!CollectionUtils.isEmpty(value)) {
unionFiledSet.addAll(value);
}
}
return new ArrayList<>(unionFiledSet);
}
public static <T, K> List<T> skipDuplicateKey(List<T> list, FieldSelector<T, K> selector) {
if (CollectionUtils.isEmpty(list)) return Collections.emptyList();
List<T> filedList = new ArrayList<>(list.size());
Map<K, T> map = toMap(list, selector);
for (K key : map.keySet()) {
filedList.add(map.get(key));
}
return filedList;
}
}

@ -1,7 +1,7 @@
/** /**
* *
*/ */
package com.shibofu.spring.util; package com.example.util;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;

@ -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;
}
}

@ -1,4 +1,4 @@
package com.shibofu.spring.vo; package com.example.vo;
import lombok.Data; import lombok.Data;

@ -0,0 +1,44 @@
package com.example.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @ClassName ArchiveMasterVo
* @Description
* @Author linjj
* @Date 2024/12/11 13:57
* @Version 1.0
*/
@Data
public class ArchiveMasterVo {
@ApiModelProperty(value = "病人id")
private String SICK_ID;
@ApiModelProperty(value = "住院号")
private String RESIDENCE_NO;
@ApiModelProperty(value = "住院次数")
private String VISIT_NUMBER;
@ApiModelProperty(value = "姓名")
private String NAME;
@ApiModelProperty(value = "性别")
private String SEX;
@ApiModelProperty(value = "入院时间")
private String ADMISSION_TIME;
@ApiModelProperty(value = "出院时间")
private String DISCHARGE_TIME;
@ApiModelProperty(value = "出院科室")
private String DETP_NAME;
@ApiModelProperty(value = "出院科室编码")
private String DEPT_CODE;
@ApiModelProperty(value = "入院科室编码")
private String ADMISSION_DEPT_CODE;
@ApiModelProperty(value = "身份证号")
private String ID_CARD_NO;
@ApiModelProperty(value = "主管医生")
private String DOCTOR;
@ApiModelProperty(value = "状态")
private String STATUS;
}

@ -0,0 +1,20 @@
package com.example.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @ClassName GetZdAssortVo
* @Description id
* @Author linjj
* @Date 2024/12/12 16:52
* @Version 1.0
*/
@Data
public class GetZdAssortVo {
@ApiModelProperty(value = "分段名称")
private String assortName;
@ApiModelProperty(value = "分段Id")
private String assortId;
}

@ -0,0 +1,16 @@
package com.example.vo;
import lombok.Data;
/**
* @ClassName QualityVo
* @Description
* @Author linjj
* @Date 2025/1/14 15:44
* @Version 1.0
*/
@Data
public class QualityVo {
private String patientId;
}

@ -1,40 +0,0 @@
package com.shibofu.spring.controller;
import com.shibofu.spring.db1.service.ECGPollingService;
import com.shibofu.spring.db1.serviceImpl.ECGPollingServiceImpl;
import com.shibofu.spring.util.Msg;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author potter.fu
* @date 2018-12-07 15:38
*/
@RestController
@RequestMapping("/makeUp")
public class MoneyController {
@Autowired
private ECGPollingService ecgPollingService;
@GetMapping("/makeUpECG")
public Msg makeUpByNeed() {
Msg msg = ecgPollingService.ECGDayPolling();
return msg;
}
@GetMapping("/makeUpECGByPatientId")
public Msg makeUpECGByPatientId(String patientId) {
Msg msg = ecgPollingService.ECGDayPollingByPatientId(patientId);
return msg;
}
@GetMapping("/makeUpTime")
public Msg makeUp() {
return ecgPollingService.makeUp();
}
}

@ -1,26 +0,0 @@
package com.shibofu.spring.db1.dao;
import com.shibofu.spring.dto.ArchiveDetailDto;
import com.shibofu.spring.vo.ArchiveDetailVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @InterfaceName ArchiveDetailDao
* @Description
* @Author linjj
* @Date 2024/1/19 9:01
* @Version 1.0
*/
@Mapper
public interface ArchiveDetailDao {
boolean addArchiveDetail(@Param("list") List<ArchiveDetailDto> list);
List<ArchiveDetailVo> getArchiveDetailBySourceAndMid(@Param("source")String source,@Param("mid")String mid);
boolean delDetailBySourceAndMid(@Param("source")String source,@Param("mid")String mid);
}

@ -1,24 +0,0 @@
package com.shibofu.spring.db1.dao;
import com.shibofu.spring.vo.ArchiveMasterVo;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @InterfaceName ArchiveMasterDao
* @Description
* @Author linjj
* @Date 2024/1/18 9:47
* @Version 1.0
*/
@Mapper
public interface ArchiveMasterDao {
//查询24小时内出院病历
List<ArchiveMasterVo> PollingECG();
//根据记帐号查询病历
List<ArchiveMasterVo> PollingECGByPatientId(String patientId);
//整年心电数据补偿
List<ArchiveMasterVo> makeUp();
}

@ -1,25 +0,0 @@
package com.shibofu.spring.db1.service;
import com.shibofu.spring.util.Msg;
/**
* @InterfaceName ECGPollingService
* @Description
* @Author linjj
* @Date 2024/7/8 8:55
* @Version 1.0
*/
public interface ECGPollingService {
/**
* @description:
* @author linjj
* @date: 2024/1/18 9:29
*/
Msg ECGDayPolling() ;
Msg ECGDayPollingByPatientId(String patientId);
Msg makeUp();
}

@ -1,233 +0,0 @@
package com.shibofu.spring.db1.serviceImpl;
import com.shibofu.spring.db1.dao.ArchiveDetailDao;
import com.shibofu.spring.db1.dao.ArchiveMasterDao;
import com.shibofu.spring.db1.service.ECGPollingService;
import com.shibofu.spring.db2.dao.ECGDao;
import com.shibofu.spring.dto.ArchiveDetailDto;
import com.shibofu.spring.util.Msg;
import com.shibofu.spring.vo.ArchiveDetailVo;
import com.shibofu.spring.vo.ArchiveMasterVo;
import com.shibofu.spring.vo.ECGVo;
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.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @ClassName ECGPollingServiceImpl
* @Description
* @Author linjj
* @Date 2024/7/8 8:55
* @Version 1.0
*/
@Service
@Slf4j
public class ECGPollingServiceImpl implements ECGPollingService {
@Autowired
private ArchiveMasterDao archiveMasterDao;
@Autowired
private ECGDao ecgDao;
@Value("${savePath}")
private String savePath;
@Autowired
private ArchiveDetailDao archiveDetailDao;
@Override
public Msg ECGDayPolling() {
//查询当前时间24小时内需要采集数据
List<ArchiveMasterVo> archiveMasters = archiveMasterDao.PollingECG();
if (CollectionUtils.isEmpty(archiveMasters)) {
log.info("当前时间段查询不到心跳数据");
return Msg.success("当前时间段查询不到心跳数据");
}
log.info("--------------------------------------------当前时间段心电需要采集:" + archiveMasters.size() + "个患者--------------------------------------------");
//循环所有患者采集
for (ArchiveMasterVo list : archiveMasters) {
log.info("---------------------开始采集记帐号为:" + list.getPatientId() + "的患者---------------------");
List<ECGVo> ecgs = ecgDao.getECG(list.getPatientId());
if (CollectionUtils.isEmpty(ecgs)) {
log.info("记帐号为:" + list.getPatientId() + "的患者没有心电数据");
continue;
}
//获取需要插入archiveDetai表数据
ArrayList<ArchiveDetailDto> archiveDetailList = getArchiveDetailDtos(list, ecgs);
if (CollectionUtils.isEmpty(archiveDetailList)) {
log.info("记帐号为:" + list.getPatientId()+"没有保存文件表数据");
continue;
}
//更新文件表
updateArchiveDetail(list, archiveDetailList);
}
log.info("--------------------------------------------此时间段采集完成--------------------------------------------");
return Msg.success("此时间段采集完成");
}
@Override
public Msg ECGDayPollingByPatientId(String patientId){
List<ArchiveMasterVo> archiveMasters = archiveMasterDao.PollingECGByPatientId(patientId);
if (CollectionUtils.isEmpty(archiveMasters)) {
log.info("当前时间段查询不到心跳数据");
return Msg.success("当前时间段查询不到心跳数据");
}
log.info("--------------------------------------------心电按需:" + archiveMasters.size() + "个患者--------------------------------------------");
//循环所有患者采集
for (ArchiveMasterVo list : archiveMasters) {
log.info("---------------------开始采集记帐号为:" + list.getPatientId() + "的患者---------------------");
List<ECGVo> ecgs = ecgDao.getECG(list.getPatientId());
if (CollectionUtils.isEmpty(ecgs)) {
log.info("记帐号为:" + list.getPatientId() + "的患者没有心电数据");
continue;
}
//获取需要插入archiveDetai表数据
ArrayList<ArchiveDetailDto> archiveDetailList = getArchiveDetailDtos(list, ecgs);
if (CollectionUtils.isEmpty(archiveDetailList)) {
log.info("记帐号为:" + list.getPatientId()+"没有保存文件表数据");
continue;
}
//更新文件表
updateArchiveDetail(list, archiveDetailList);
}
log.info("--------------------------------------------心电按需采集完成--------------------------------------------");
return Msg.success("心电按需采集完成");
}
@Override
public Msg makeUp() {
List<ArchiveMasterVo> archiveMasters = archiveMasterDao.makeUp();
if (CollectionUtils.isEmpty(archiveMasters)) {
log.info("当前时间段查询不到心跳数据");
return Msg.success("当前时间段查询不到心跳数据");
}
log.info("--------------------------------------------心电补偿:" + archiveMasters.size() + "个患者--------------------------------------------");
//循环所有患者采集
for (ArchiveMasterVo list : archiveMasters) {
log.info("---------------------开始采集记帐号为:" + list.getPatientId() + "的患者---------------------");
List<ECGVo> ecgs = ecgDao.getECG(list.getPatientId());
if (CollectionUtils.isEmpty(ecgs)) {
log.info("记帐号为:" + list.getPatientId() + "的患者没有心电数据");
continue;
}
//获取需要插入archiveDetai表数据
ArrayList<ArchiveDetailDto> archiveDetailList = getArchiveDetailDtos(list, ecgs);
if (CollectionUtils.isEmpty(archiveDetailList)) {
log.info("记帐号为:" + list.getPatientId()+"没有保存文件表数据");
continue;
}
//更新文件表
updateArchiveDetail(list, archiveDetailList);
}
log.info("--------------------------------------------心电补偿采集完成--------------------------------------------");
return Msg.success("心电补偿采集完成");
}
//更新文件表数据
private void updateArchiveDetail(ArchiveMasterVo list, ArrayList<ArchiveDetailDto> archiveDetailList) {
//判断是否存在数据,存在删除并且删除原文件
List<ArchiveDetailVo> ecgList = archiveDetailDao.getArchiveDetailBySourceAndMid("ECG", list.getId());
if (!CollectionUtils.isEmpty(ecgList)) {
archiveDetailDao.delDetailBySourceAndMid("ECG", list.getId());
//删除原文件数据
deleteFliepath(ecgList);
}
if (archiveDetailDao.addArchiveDetail(archiveDetailList)){
log.info("记帐号为:" + list.getPatientId()+"采集了"+ archiveDetailList.size()+"张图像");
}
}
private ArrayList<ArchiveDetailDto> getArchiveDetailDtos(ArchiveMasterVo list, List<ECGVo> ecgs) {
ArrayList<ArchiveDetailDto> archiveDetailList = null;
try {
String filePathdir;
//文件保存目录
filePathdir = savePath + File.separatorChar + list.getPatientId();
// 本地磁盘的路径
Path localPath = Paths.get(filePathdir);
//确保目录存在
if (createDirectory(localPath)) return null;
//保存文件表集合
archiveDetailList = new ArrayList<>();
//患者所有心电记录采集到本地磁盘
for (ECGVo ecg : ecgs) {
String newPath;
String pPath = ecg.getPPath();
//使用yyyyMMddHHmmssSSS格式作为文件名
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS");
String newDate = format.format(date);
String savaPath = filePathdir + File.separatorChar + newDate + ".PDF";
if (pPath.contains("E:\\ecgdata\\ECG")) {
newPath = pPath.replace("E:\\ecgdata\\ECG", "Z:");
} else {
newPath = pPath.replace("E:\\ECGDATA\\ECG", "Z:");
}
// 构建网络文件的完整路径
Path networkFilePath = Paths.get(newPath);
// 从网络磁盘拷贝文件到本地磁盘
try {
Files.copy(networkFilePath, Paths.get(savaPath));
} catch (Exception e) {
log.error("记帐号为:" + list.getPatientId() + "的病历文件名为:" + networkFilePath.getFileName() + "的文件拷贝失败", e);
continue;
}
if (new File(savaPath).exists()) {
//组织保存文件表数据
ArchiveDetailDto archiveDetailDto = new ArchiveDetailDto();
archiveDetailDto.setMasterId(list.getId());
archiveDetailDto.setUploadDateTime(new Date());
archiveDetailDto.setAssortId("DA342ED81CEE4A8EA827424626F3F577");
archiveDetailDto.setSource("ECG");
archiveDetailDto.setFlag("0");
archiveDetailDto.setSys("ECG");
archiveDetailDto.setTitle("心电图报告");
archiveDetailDto.setPdfPath(savaPath);
archiveDetailList.add(archiveDetailDto);
}else {
log.error("记帐号为:" + list.getPatientId() + "的病历文件名为:" + networkFilePath.getFileName() + "为损坏文件");
}
}
} catch (Exception e) {
log.error("记帐号为:" + list.getPatientId() + "的病历异常处理");
return null;
}
return archiveDetailList;
}
private void deleteFliepath(List<ArchiveDetailVo> ecgList) {
for (ArchiveDetailVo list : ecgList) {
File file = new File(list.getPdfPath());
try {
file.delete(); // 删除照片
} catch (Exception e) {
e.printStackTrace();
}
}
}
private static boolean createDirectory(Path localPath) {
try {
if (!Files.exists(localPath)) {
Files.createDirectories(localPath);
}
} catch (IOException e) {
log.error(e.getMessage());
return true;
}
return false;
}
}

@ -1,20 +0,0 @@
package com.shibofu.spring.db2.dao;
import com.shibofu.spring.vo.ECGVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @ClassName ECGDao
* @Description
* @Author linjj
* @Date 2024/7/8 9:05
* @Version 1.0
*/
@Mapper
public interface ECGDao {
List<ECGVo> getECG(@Param("patientID") String patientID);
}

@ -1,15 +0,0 @@
package com.shibofu.spring.db2.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author potter.fu
* @date 2018-12-07 15:34
*/
@Service
public class MoneyService {
}

@ -1,34 +0,0 @@
package com.shibofu.spring.dto;
import lombok.Data;
import java.util.Date;
/**
* @ClassName ArchiveDetailDto
* @Description dto
* @Author linjj
* @Date 2024/1/18 17:29
* @Version 1.0
*/
@Data
public class ArchiveDetailDto {
//文件id
private String id;
//文件路径
private String pdfPath;
//病案id
private String masterId;
//生成时间
private Date uploadDateTime;
//分段id
private String assortId;
//来源
private String source;
//来源id
private String subAssort;
//文件名
private String title;
private String flag;
private String sys;
}

@ -1,26 +0,0 @@
package com.shibofu.spring.dto;
import lombok.Data;
/**
* @ClassName ArchiveMasterVo
* @Description
* @Author linjj
* @Date 2024/1/18 9:33
* @Version 1.0
*/
@Data
public class ArchiveMasterDto {
//病案id
private String id;
//患者姓名
private String name;
//住院次数
private String visitId;
//住院号
private String inpNo;
//入院时间
private String admissionDateTime;
//出院时间
private String dischargeDateTime;
}

@ -1,28 +0,0 @@
package com.shibofu.spring.quartz;
import com.shibofu.spring.db1.service.ECGPollingService;
import org.quartz.JobExecutionContext;
import org.springframework.scheduling.quartz.QuartzJobBean;
import javax.annotation.Resource;
/**
* @description: pacs
* @author linjj
* @date: 2024/1/18 9:22
*/
public class ECGQuartz extends QuartzJobBean {
@Resource
private ECGPollingService ecgPollingService;
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) {
//每天轮询查询昨天数据进来采集
ecgPollingService.ECGDayPolling();
}
}

@ -1,50 +0,0 @@
package com.shibofu.spring.text;
import com.shibofu.spring.MainApplication;
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;
import java.io.File;
/**
* @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);
@Test
public void testDemo() {
String newPath;
String path = "E:\\ecgdata\\ECG\\2024-02-28\\1.2.826.0.1.3680043.2.377.114.21.20240228005228255.141737_1.PDF";
if (path.contains("E:\\ecgdata\\ECG")) {
newPath = path.replace("E:\\ecgdata\\ECG", "Z:");
} else {
newPath = path.replace("E:\\ECGDATA\\ECG", "Z:");
}
System.out.println("newPath" + newPath);
}
}

@ -1,30 +0,0 @@
package com.shibofu.spring.vo;
import lombok.Data;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @ClassName ArchiveMasterVo
* @Description
* @Author linjj
* @Date 2024/1/18 9:33
* @Version 1.0
*/
@Data
public class ArchiveMasterVo {
//病案id
private String id;
//患者姓名
private String name;
//住院次数
private String visitId;
//住院号
private String inpNo;
//入院时间
private String admissionDateTime;
//出院时间
private String dischargeDateTime;
//记帐号
private String patientId;
}

@ -1,19 +0,0 @@
package com.shibofu.spring.vo;
import lombok.Data;
/**
* @ClassName ECGVo
* @Description
* @Author linjj
* @Date 2024/7/8 9:09
* @Version 1.0
*/
@Data
public class ECGVo {
private String patientId;
private String WriteDateTime;
private String PPath;
}

@ -1,27 +1,24 @@
server.port=3397 server.port=3397
#sqlserver #sqlserver
#spring.datasource.hikari.db1.jdbc-url=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=yd_record #spring.datasource.hikari.db1.jdbc-url=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=lz_record
#spring.datasource.hikari.db1.username=sa #spring.datasource.hikari.db1.username=sa
#spring.datasource.hikari.db1.password=admin123 #spring.datasource.hikari.db1.password=admin123
#spring.datasource.hikari.db1.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver #spring.datasource.hikari.db1.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
###sqlserver spring.datasource.hikari.db1.jdbc-url=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=DB_PrivilegeManagement_LZRMYY
#spring.datasource.hikari.db2.jdbc-url=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=qf_record
#spring.datasource.hikari.db2.username=sa
#spring.datasource.hikari.db2.password=admin123
#spring.datasource.hikari.db2.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
#sqlserver
spring.datasource.hikari.db1.jdbc-url=jdbc:sqlserver://10.36.116.108:1433;DatabaseName=emr_record
spring.datasource.hikari.db1.username=sa spring.datasource.hikari.db1.username=sa
spring.datasource.hikari.db1.password=xjgs+docus911 spring.datasource.hikari.db1.password=docus@904
spring.datasource.hikari.db1.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver spring.datasource.hikari.db1.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
#ECG #Oracle JDBC
spring.datasource.hikari.db2.jdbc-url=jdbc:sqlserver://192.168.10.50:1433;DatabaseName=medexmemrsECG #spring.datasource.hikari.db2.jdbc-url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
spring.datasource.hikari.db2.username=sa #spring.datasource.hikari.db2.username=system
spring.datasource.hikari.db2.password=MedExSQLServerAdmin #spring.datasource.hikari.db2.password=lin589288
spring.datasource.hikari.db2.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver #spring.datasource.hikari.db2.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.hikari.db2.jdbc-url=jdbc:oracle:thin:@//10.120.120.9:1521/lzrmyy
spring.datasource.hikari.db2.username=jsgdxx
spring.datasource.hikari.db2.password=JS!@2024
spring.datasource.hikari.db2.driver-class-name=oracle.jdbc.driver.OracleDriver
# MyBatis-Plus ?? # MyBatis-Plus ??
mybatis-plus.mapper-locations=classpath:mapper/db1/*.xml,classpath:mapper/db2/*.xml mybatis-plus.mapper-locations=classpath:mapper/db1/*.xml,classpath:mapper/db2/*.xml
mybatis-plus.type-aliases-package=com.shibofu.spring.vo mybatis-plus.type-aliases-package=com.example.vo

@ -1,4 +1,8 @@
#文件保存路径 #院方保存路径
savePath: F:\ECG\reload emr_pdf_files: F:\emr_pdf_files
#定时补偿任务时间 #归档文件保存路径
quartzTime: 0 0 3 * * ? save_pdf_files: F:\jiaShi_emr_pdf_files
#定时任务时间
#quartzTime: 0 0 3 * * ?
quartzTime: 0/15 * * * * ?

@ -14,7 +14,7 @@
<Prudent>true</Prudent> <Prudent>true</Prudent>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern> <FileNamePattern>
ECGLog/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.log Lz-scan/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.log
</FileNamePattern> </FileNamePattern>
</rollingPolicy> </rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout"> <layout class="ch.qos.logback.classic.PatternLayout">

@ -0,0 +1,22 @@
<?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.ArchiveDetailDao">
<insert id="addArchiveDetail">
insert into
archive_detail(ID,PDF_PATH,MasterID,UpLoadDateTime,AssortID,Source,SubAssort,Title,flag,Sys,splitName
)
values
<foreach collection="list" item="item" separator=",">
(replace(newid(), '-', ''),#{item.PDF_PATH},#{item.MasterID},#{item.UpLoadDateTime},#{item.AssortID},#{item.Source},
#{item.SubAssort},#{item.Title},#{item.flag},#{item.Sys},#{item.splitName})
</foreach>
</insert>
<select id="getPdfPath" resultType="java.lang.String">
SELECT PDF_PATH FROM archive_detail WHERE MasterID=#{masterId}
</select>
</mapper>

@ -1,24 +0,0 @@
<?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.shibofu.spring.db1.dao.ArchiveDetailDao">
<insert id="addArchiveDetail">
insert into
archive_detail(id,PDF_PATH,MasterID,UpLoadDateTime,AssortID,Source,Title,flag,Sys
)
values
<foreach collection="list" item="item" separator=",">
(replace(newid(), '-', ''),#{item.pdfPath},#{item.masterId},#{item.uploadDateTime},#{item.assortId},#{item.source},
#{item.title},#{item.flag},#{item.sys})
</foreach>
</insert>
<delete id="delDetailBySourceAndMid">
delete from archive_detail where MasterID=#{mid} and Source=#{source}
</delete>
<select id="getArchiveDetailBySourceAndMid" resultType="com.shibofu.spring.vo.ArchiveDetailVo">
select id,PDF_PATH pdfPath from archive_detail where MasterID=#{mid} and Source=#{source}
</select>
</mapper>

@ -2,52 +2,21 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.shibofu.spring.db1.dao.ArchiveMasterDao"> <mapper namespace="com.example.db1.dao.ArchiveMasterDao">
<insert id="addArchiveMaster">
insert into Archive_Master (ID, patient_id, inp_no, visit_id, name, sex, dept_name,
discharge_date_time, ArchiveState,admission_date_time,dept_admission_to,
check_datetime,checked_datetime,DOCTOR_IN_CHARGE,ID_NO,split_name)
values (#{id}, #{patientId}, #{inpNo}, #{visitId}, #{name}, #{sex}, #{deptName},
#{dischargeDateTime},#{ArchiveState},#{admissionDateTime},#{deptAdmissionTo},#{checkDatetime},
#{checkedDatetime},#{DOCTOR_IN_CHARGE},#{ID_NO},#{splitName})
</insert>
<delete id="delMasterById">
DELETE FROM Archive_Master WHERE ID=#{id};
</delete>
<select id="PollingECG" resultType="com.shibofu.spring.vo.ArchiveMasterVo">
SELECT
id,
name,
patient_id AS patientId,
visit_id AS visitId,
inp_no AS inpNo,
admission_date_time AS admissionDateTime,
discharge_date_time AS dischargeDateTime
FROM
archive_master
WHERE
discharge_date_time BETWEEN DATEADD( hh, - 24,GETDATE() ) AND GETDATE()
order by discharge_date_time ASC
</select>
<select id="PollingECGByPatientId" resultType="com.shibofu.spring.vo.ArchiveMasterVo">
SELECT
id,
name,
patient_id AS patientId,
visit_id AS visitId,
inp_no AS inpNo,
admission_date_time AS admissionDateTime,
discharge_date_time AS dischargeDateTime
FROM
archive_master
WHERE
patient_id=#{patientId}
order by discharge_date_time ASC
</select>
<select id="makeUp" resultType="com.shibofu.spring.vo.ArchiveMasterVo">
SELECT
id,
name,
patient_id AS patientId,
visit_id AS visitId,
inp_no AS inpNo,
admission_date_time AS admissionDateTime,
discharge_date_time AS dischargeDateTime
FROM
archive_master
WHERE
discharge_date_time BETWEEN '2024-01-01 00:00:00' AND '2024-05-31 23:59:59'
order by discharge_date_time ASC
</select>
<select id="getMasterId" resultType="java.lang.String">
SELECT ID FROM Archive_Master WHERE patient_id=#{patientId} AND inp_no=#{inpNo} AND name=#{name}
</select>
</mapper> </mapper>

@ -0,0 +1,28 @@
<?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.CommonTableDao">
<insert id="addCommonTable">
insert into CommonTable (patient_id, admiss_id, admiss_times, inpatient_no, name, sex, id_card,
admiss_date, dis_date,dis_dept,attending,
dis_dept_name,admiss_doctor,splitName,ph,gdh)
values (#{patientId}, #{admissId}, #{admissTimes}, #{inpatientNo}, #{name}, #{sex}, #{idCard},
#{admissDate},#{disDate},#{disDept},#{attending},#{disDeptName},#{admissDoctor},#{splitName},#{ph},#{gdh})
</insert>
<update id="updateIsPDFByIds">
<foreach collection="list" item="dto" separator=";">
UPDATE CommonTable
SET isPdf = #{dto.isPdf}
WHERE patient_id = #{dto.patientId}
</foreach>
</update>
<delete id="delCommonTableById">
DELETE FROM CommonTable WHERE patient_id=#{id};
</delete>
<select id="getCommonTableId" resultType="com.example.vo.QualityVo">
SELECT patient_id AS patientId FROM CommonTable WHERE gdh IS NULL AND isPdf IS NULL
</select>
</mapper>

@ -0,0 +1,11 @@
<?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.ZdAssortDao">
<select id="getZdAssort" resultType="com.example.vo.GetZdAssortVo">
SELECT assort_id as assortId ,assort_name as assortName FROM zd_assort
</select>
</mapper>

@ -1,11 +0,0 @@
<?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.shibofu.spring.db2.dao.ECGDao">
<select id="getECG" resultType="com.shibofu.spring.vo.ECGVo">
select patientid AS patientId, WriteDateTime, ReportFileLocate+reportfileName 'PPath' from [dbo].[v_EMR_Report] where PatientID=#{patientID}
</select>
</mapper>

@ -0,0 +1,9 @@
<?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.MedicalDao">
<select id="GetMedicalInfo" resultType="com.example.vo.ArchiveMasterVo">
select * from V_JSBLGD where NAME=#{NAME} AND SICK_ID=#{SICK_ID} AND RESIDENCE_NO=#{RESIDENCE_NO} AND STATUS=1
</select>
</mapper>
Loading…
Cancel
Save