Compare commits

...

16 Commits

Author SHA1 Message Date
wyb c316a76c66 feat: 添加分批次调用 7 months ago
wyb 79593b9a9d fix:检查成功修复未删除文件 8 months ago
wyb cdbe3d579e fix:检查添加结果日志 8 months ago
wyb 470192354a feat: 市一联众添加检查接口 8 months ago
wyb 46499927e1 feat: 市一联众添加接口修改状态 10 months ago
wyb 03eb85f2f9 feat: 市一联众同步添加web,可以补偿同步 10 months ago
zhanghai 966e66abec 修改注释 12 months ago
zhanghai 15462c6a27 修改文件的上传超时时间,
修改线程数
12 months ago
zhanghai 9fdc6a8dbc 1. 打印日志
2. 调整同时并发上传参数。
3. 调整上传内容
1 year ago
zhanghai 2dcd666b7c 1. 打印日志
2. 调整同时并发上传参数。
3. 调整上传内容
1 year ago
zhanghai befeed1979 1. 打印日志
2. 调整同时并发上传参数。
3. 调整上传内容
1 year ago
zhanghai 7ad3f4f7b9 上传联众代码 1 year ago
zhanghai 26d841d833 上传联众代码 1 year ago
zhanghai 768bf819d4 打开配置信息 1 year ago
zhanghai 5f6feb7a57 修改为广州市市一 1 year ago
zhanghai aaf6559e4d 修改为广州市市一 1 year ago

@ -2,6 +2,7 @@
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile default="true" name="Default" enabled="true" />
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />

@ -13,8 +13,48 @@
<version>2.4.9</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!-- RESTful APIs swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.21</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.5.21</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.9.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
@ -35,6 +75,11 @@
<artifactId>spring-boot-starter</artifactId>
</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>
@ -75,6 +120,7 @@
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<swagger.version>2.9.2</swagger.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

@ -21,4 +21,19 @@ public class CommonResult<T> {
private T data;
public static <T> CommonResult<T> success(T data){
CommonResult commonResult = new CommonResult();
commonResult.setCode(0);
commonResult.setMsg("操作成功");
commonResult.setData(data);
return commonResult;
}
public static <T> CommonResult<T> failed(T data){
CommonResult commonResult = new CommonResult();
commonResult.setCode(500);
commonResult.setMsg("操作失败");
commonResult.setData(data);
return commonResult;
}
}

@ -15,9 +15,9 @@ public class FileUploader {
public static CommonResult uploadFilesWithParams(List<File> files, String uploadUrl, List<FormField> params) throws IOException {
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(600, TimeUnit.SECONDS)
.readTimeout(600, TimeUnit.SECONDS)
.writeTimeout(600, TimeUnit.SECONDS)
.connectTimeout(6000, TimeUnit.SECONDS)
.readTimeout(6000, TimeUnit.SECONDS)
.writeTimeout(6000, TimeUnit.SECONDS)
.build();
MultipartBody.Builder builder = new MultipartBody.Builder();
for (File file : files) {
@ -54,28 +54,29 @@ public class FileUploader {
folder.delete();
}
public static void main(String[] args) throws IOException {
List<File> files = new ArrayList<>();
files.add(new File("C:\\jiahsi-saomiao\\413425_刘燊杨_20221009_004624\\16763947060057863381.jpg"));
// files.add(new File("C:\\jiahsi-saomiao\\413425_刘燊杨_20221009_004624\\16763947060420811242.jpg"));
// 额外的表单字段参数
List<FormField> params = new ArrayList<>();
params.add(new FormField("uploadFileParams", "[ {\"inpatientNo\":\"35131\", \"disDate\":\"2020-07-30 00:00:00.000\", \"fileTitle\":\"16763947060057863381.jpg\", \"uploadFileName\":\"16763947060057863381.jpg\", \"assortId\":\"078F7675CB0048EDBE586D59831C57B0\" ,\n" +
"\"patientId\":\"12312312\",\n" +
"\"name\":\"长三\",\n" +
"\"admissDate\":\"2022-02-01\",\n" +
"\"sex\":\"男女\"\n" +
"}\n" +
"]"));
// 上传URL
String uploadUrl = "http://192.168.16.116:8711/api/downplatform/fileUploadJpg";
// 执行批量上传
uploadFilesWithParams(files, uploadUrl, params);
}
// public static void main(String[] args) throws IOException {
// List<File> files = new ArrayList<>();
// files.add(new File("C:\\jiahsi-saomiao\\413425_刘燊杨_20221009_004624\\16763947060057863381.jpg"));
//// files.add(new File("C:\\jiahsi-saomiao\\413425_刘燊杨_20221009_004624\\16763947060420811242.jpg"));
//
//
// // 额外的表单字段参数
// List<FormField> params = new ArrayList<>();
// params.add(new FormField("uploadFileParams", "[ {\"inpatientNo\":\"35132331\", \"admiss_id\":\"12312342342312\",\"admiss_times\":\"1\",\"disDate\":\"2020-07-30 00:00:00.000\", \"fileTitle\":\"16763947060057863381.jpg\", \"uploadFileName\":\"16763947060057863381.jpg\", \"assortId\":\"078F7675CB0048EDBE586D59831C57B0\" ,\n" +
// "\"patientId\":\"12323432412312\",\n" +
// "\"name\":\"长三\",\n" +
// "\"admissDate\":\"2022-02-01\",\n" +
// "\"sex\":\"男\"\n" +
// "}\n" +
// "]"));
//
// // 上传URL
// String uploadUrl = "http://192.168.16.116:9511/fileUploadJpg";
//
// // 执行批量上传
// CommonResult commonResult = uploadFilesWithParams(files, uploadUrl, params);
// System.out.println(new Gson().toJson(commonResult));
// }
}

@ -0,0 +1,45 @@
package com.jiashi.config;
import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI;
import com.google.common.base.Predicates;
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.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* api /swagger-ui.html
* @author Zheng Jie
* @date 2018-11-23
*/
@Configuration
@EnableSwagger2
@EnableSwaggerBootstrapUI
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
ParameterBuilder ticketPar = new ParameterBuilder();
return new Docket(DocumentationType.SWAGGER_2)
.enable(true)
.apiInfo(apiInfo())
.select()
.paths(Predicates.not(PathSelectors.regex("/error.*")))
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("接口文档")
.version("1.0")
.build();
}
}

@ -0,0 +1,329 @@
package com.jiashi.controller;
import com.google.gson.Gson;
import com.jiashi.CommonResult;
import com.jiashi.FileUploader;
import com.jiashi.dao.DataQuery;
import com.jiashi.service.CardInfo;
import com.jiashi.service.FormField;
import com.jiashi.service.Picture;
import com.jiashi.service.UploadInfo;
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.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author YongBin Wen
* @date 2024/9/26 15:32
*/
@RestController
@Slf4j
@Api(tags = "广州市一联众同步接口")
@RequestMapping("/gzsy/lianzhong")
public class LianZhongSyncController {
@Autowired
private DataQuery dataQuery;
ExecutorService executor = Executors.newFixedThreadPool(10);
@ApiOperation(value = "根据病案号和出院日期(yyyy-MM-dd)同步联众文件数据 ")
@GetMapping("/sync/byInpNoAndDisDate")
public CommonResult<String> syncByInpNoAndDisDate(@RequestParam("inpatientNo") String inpatientNo, @RequestParam("disDate") String disDate) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<CardInfo> cardInfos = dataQuery.dateQueryByInpNo(inpatientNo);
CardInfo cardInfo = null;
for (CardInfo info : cardInfos) {
if (disDate.equals(sdf.format(info.getOutdate()))) {
cardInfo = info;
break;
}
}
if (Objects.isNull(cardInfo)) {
return CommonResult.failed("未找到 cardInfo 信息!");
}
sync(cardInfo);
return CommonResult.success("同步完成!");
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return CommonResult.failed(ex.getMessage());
}
}
@ApiOperation(value = "联众图片数据同步检查")
@GetMapping("/sync/checkReport")
public CommonResult<String> syncCheckReport() {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<CardInfo> cardInfos = dataQuery.dateQuery(2);
if (CollectionUtils.isEmpty(cardInfos)) {
return CommonResult.success("没有可检查的患者,状态=2");
}
StringBuilder stringBuilder = new StringBuilder();
List<Future<String>> futures=new ArrayList<>();
for (CardInfo cardInfo : cardInfos) {
Future<String> future = executor.submit(() -> check(cardInfo));
futures.add(future);
}
for (Future<String> future : futures) {
String result = future.get();
if (!ObjectUtils.isEmpty(result)) {
stringBuilder.append(result).append(";\n");
}
}
log.info("检查结果:{}",stringBuilder);
return CommonResult.success(stringBuilder.toString());
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return CommonResult.failed(ex.getMessage());
}
}
private String check(CardInfo cardInfo) throws IOException {
String dir = "c:\\pic-check\\" + cardInfo.getId();
// 创建File对象
File directory = new File(dir);
try {
String uniUrl = "http://192.168.8.74";
List<Picture> pictures = dataQuery.getPictures(cardInfo.getId());
// 判断目录是否存在
if (!directory.exists()) {
// 目录不存在,创建目录
boolean created = directory.mkdirs();
if (created) {
log.info("目录创建成功:" + dir);
} else {
log.info("目录创建失败:" + dir);
}
}
List<String> faultNames = new ArrayList<>();
for (Picture picture : pictures) {
String cmd = "C:\\Debug\\lianzhong.exe 003 192.168.8.74 " + cardInfo.getId() + " " + picture.getPicid() + " " + cardInfo.getPatno() + " " + cardInfo.getOutdateStr() + " " + picture.getPicname() + " " + picture.getCheckUpFileUrl() + " " + uniUrl + " " + picture.getRotatedegree();
File pictureFile = new File(picture.getCheckUpFileUrl());
int tryNum = 0;
while (tryNum <= 3) {
tryNum++;
try {
getPic(cmd);
if (pictureFile.exists()) {
break;
}
} catch (Exception ex) {
// no
}
}
if (!pictureFile.exists()) {
faultNames.add(picture.getPicname());
}
}
// 删除文件
FileUploader.deleteFolder(directory);
if (faultNames.isEmpty()) {
return null;
}
String join = String.join(",", faultNames);
String result = "id" + cardInfo.getId() + ",住院号:" + cardInfo.getPatno() + ",出院日期:" + cardInfo.getOutdateStr() + ",文件:" + join + " 缺失";
return result;
} catch (Exception ex) {
log.error("检查出错:" + ex.getMessage(), ex);
FileUploader.deleteFolder(directory);
return "住院号:" + cardInfo.getPatno() + " 出院日期:" + cardInfo.getOutdateStr() + " 检查失败!";
}
}
private void getPic(String cmd) throws Exception {
java.lang.Process process = java.lang.Runtime.getRuntime().exec(cmd);//执行命令生成cube
process.waitFor();
}
@ApiOperation(value = "根据病案号和出院日期(yyyy-MM-dd)更新联众文件数据状态为0 ,需要重新同步 ")
@GetMapping("/updateState/byInpNoAndDisDate")
public CommonResult<String> updateStateByInpNoAndDisDate(@RequestParam("inpatientNo") String inpatientNo, @RequestParam("disDate") String disDate) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<CardInfo> cardInfos = dataQuery.dateQueryByInpNo(inpatientNo);
CardInfo cardInfo = null;
for (CardInfo info : cardInfos) {
if (disDate.equals(sdf.format(info.getOutdate()))) {
cardInfo = info;
break;
}
}
if (Objects.isNull(cardInfo)) {
return CommonResult.failed("未找到 cardInfo 信息!");
}
dataQuery.updateBatchState(cardInfo, 0);
return CommonResult.success("更新完成!");
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return CommonResult.failed(ex.getMessage());
}
}
public void sync(CardInfo cardInfo) throws IOException {
String dir = "c:\\pic-makup\\" + cardInfo.getId();
// 创建File对象
File directory = new File(dir);
try {
String uniUrl = "http://192.168.8.74";
List<Picture> pictures = dataQuery.getPictures(cardInfo.getId());
if (pictures == null || pictures.size() == 0) {
//如果是空的则不同步
dataQuery.updateBatchState(cardInfo, 5);
return;
}
// 判断目录是否存在
if (!directory.exists()) {
// 目录不存在,创建目录
boolean created = directory.mkdirs();
if (created) {
log.info("目录创建成功:" + dir);
} else {
log.info("目录创建失败:" + dir);
}
}
List<Future> futures = new ArrayList<>();
for (Picture picture : pictures) {
Future future = executor.submit(() -> {
try {
String cmd = "C:\\Debug\\lianzhong.exe 003 192.168.8.74 " + cardInfo.getId() + " " + picture.getPicid() + " " + cardInfo.getPatno() + " " + cardInfo.getOutdateStr() + " " + picture.getPicname() + " " + picture.getMakeUpFileUrl() + " " + uniUrl + " " + picture.getRotatedegree();
// log.info(cmd);
java.lang.Process process = java.lang.Runtime.getRuntime().exec(cmd);//执行命令生成cube
process.waitFor();
File pictureFile = new File(picture.getMakeUpFileUrl());
if (!pictureFile.exists()) {
log.error("图片转换失败,命令为:{}", cmd);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
e.printStackTrace();
}
});
futures.add(future);
}
for (Future future : futures) {
try {
future.get();
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
}
boolean complete = true;
List<File> files = new ArrayList<>();
List<UploadInfo> uploadInfos = new ArrayList<>();
for (Picture picture : pictures) {
File pictureFile = new File(picture.getMakeUpFileUrl());
if (!pictureFile.exists()) {
complete = false;
continue;
}
files.add(pictureFile);
UploadInfo uploadInfo = new UploadInfo(cardInfo.getPatno(), cardInfo.getOutdateStr2(), picture.getPicname(), picture.getPicname(),
picture.getPickind(), cardInfo.getId(), cardInfo.getPatname(),
cardInfo.getIndateStr(), cardInfo.getPatsex(), cardInfo.getPatnum(),
cardInfo.getIcdecode11(), cardInfo.getIcdename11(), cardInfo.getMjwesticde(), cardInfo.getMjwestname(),
cardInfo.getOutdeptname(), cardInfo.getPatciticard(), cardInfo.getOutwardname(), cardInfo.getIndeptname(), cardInfo.getIndeptcode(), cardInfo.getGestno(), cardInfo.getPatbirthdayStr());
uploadInfos.add(uploadInfo);
}
if (files.isEmpty()) {
dataQuery.updateBatchState(cardInfo, 4);
// 删除文件
FileUploader.deleteFolder(directory);
return;
}
Map<String, UploadInfo> uploadInfosMap = uploadInfos.stream().collect(Collectors.toMap(UploadInfo::getUploadFileName, Function.identity()));
boolean success = true;
// 上传
int totalSize = files.size();
int batchSize = 500;
if (totalSize > batchSize) {
for (int i = 0; i < totalSize; i += batchSize) {
ArrayList<File> batch = new ArrayList<>();
List<UploadInfo> uploadInfoParams = new ArrayList<>();
// 计算当前批次的结束索引
int end = Math.min(i + batchSize, totalSize);
for (int j = i; j < end; j++) {
batch.add(files.get(j));
uploadInfoParams.add(uploadInfosMap.get(files.get(j).getName()));
}
// 额外的表单字段参数
List<FormField> params = new ArrayList<>();
String s = new Gson().toJson(uploadInfoParams);
params.add(new FormField("uploadFileParams", s));
log.info("请求参数:" + cardInfo.getPatno());
CommonResult commonResult = FileUploader.uploadFilesWithParams(batch, "http://192.168.161.102:9511/batchFileUploadJpg", params);
boolean res = commonResult.getCode() == 0;
success = success && res;
}
} else {
// 额外的表单字段参数
List<FormField> params = new ArrayList<>();
String s = new Gson().toJson(uploadInfos);
params.add(new FormField("uploadFileParams", s));
log.info("请求参数:" + cardInfo.getPatno());
CommonResult commonResult = FileUploader.uploadFilesWithParams(files, "http://192.168.161.102:9511/fileUploadJpg", params);
success = commonResult.getCode() == 0;
}
if (success) {
dataQuery.updateBatchState(cardInfo, 3);
}
if (!complete) {
// 不完整
dataQuery.updateBatchState(cardInfo, 2);
}
// 删除文件
FileUploader.deleteFolder(directory);
} catch (IOException ex) {
if (directory.exists()) {
FileUploader.deleteFolder(directory);
}
throw ex;
}
}
}

@ -34,11 +34,36 @@ public class DataQuery {
Sort.Order sortCreateTime = Sort.Order.asc("outdate");
Sort sort = Sort.by(sortCreateTime);
Pageable pageable = PageRequest.of(0, 100, sort);
Pageable pageable = PageRequest.of(0, 1000, sort);
Page<CardInfo> all = cardInfoRepository.findAll(specification, pageable);
return all.toList();
}
public List<CardInfo> dateQuery(int state){
Specification<CardInfo> specification = (root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.equal(root.<String>get("state"), state));
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
};
List<CardInfo> all = cardInfoRepository.findAll(specification);
return all;
}
public List<CardInfo> dateQueryByInpNo(String inpNo){
Specification<CardInfo> specification = (root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.equal(root.<String>get("patno"), inpNo));
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
};
Sort.Order sortCreateTime = Sort.Order.asc("outdate");
Sort sort = Sort.by(sortCreateTime);
Pageable pageable = PageRequest.of(0, 1000, sort);
Page<CardInfo> all = cardInfoRepository.findAll(specification, pageable);
return all.toList();
}
public void updateBatch(List<CardInfo> cardInfos){
for(CardInfo cardInfo:cardInfos){

@ -4,7 +4,6 @@ import com.jiashi.MyDateUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.test.autoconfigure.data.cassandra.DataCassandraTest;
import javax.persistence.Column;
import javax.persistence.Entity;
@ -32,6 +31,8 @@ public class CardInfo {
private Date outdate;
@Column(name="indate")
private Date indate;
private String outdeptcode;
@Column(name="outdeptname")
private String outdeptname;
@Column(name="patsex")
@ -40,6 +41,43 @@ public class CardInfo {
private Date patbirthday;
private Integer state;
private String icdecode11;
private String icdename11;
@Column(name="mjwesticde")
private String mjwesticde;
@Column(name="mjwestname")
private String mjwestname;
private String patciticard;
private Integer patage;
private String indeptcode;
private String indeptname;
private String outwardname;
private Integer patnum;
private String gestno;
public String getPatbirthdayStr(){
if(this.patbirthday!=null){
try{
return MyDateUtil.dateToString(this.patbirthday,"yyyy-MM-dd");
}catch (Exception e){
return "";
}
}else{
return "";
}
}
public String getOutdateStr(){
return MyDateUtil.dateToString(this.outdate,"yyyy-MM-dd");

@ -4,23 +4,22 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.*;
@Entity
@Table(name = "T_Picture")
@Data
@NoArgsConstructor
@AllArgsConstructor
@IdClass(PicturePk.class)
public class Picture {
@Id
@Column(name="picid")
private String picid;
@Id
@Column(name="picname")
private String picname;
@Id
@Column(name="fileid")
private String fileid;
@Column(name="rotatedegree")
@ -30,8 +29,17 @@ public class Picture {
private String pickind;
public String getFileUrl(){
String fileUrl = "d:/pic/" + this.getFileid() + "/" + this.getPicname();
String fileUrl = "c:/pic/" + this.getFileid() + "/" + this.getPicname();
return fileUrl;
}
public String getMakeUpFileUrl(){
String fileUrl = "c:/pic-makup/" + this.getFileid() + "/" + this.getPicname();
return fileUrl;
}
public String getCheckUpFileUrl(){
String fileUrl = "c:/pic-check/" + this.getFileid() + "/" + this.getPicname();
return fileUrl;
}
}

@ -0,0 +1,11 @@
package com.jiashi.service;
import lombok.Data;
import java.io.Serializable;
@Data
public class PicturePk implements Serializable {
private String picname;
private String fileid;
}

@ -7,18 +7,18 @@ import com.jiashi.dao.DataQuery;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.function.Function;
import java.util.stream.Collectors;
@Component
@Slf4j
@ -33,12 +33,15 @@ public class UpdateService {
return cardInfos;
}
//state 状态标识。0 未开始, 1 正在进行, 3. 已经成功。 4. 失败。5. 不需要上传的
@PostConstruct
public void upload() {
String uniUrl = "http://10.2.3.24";
String uniUrl = "http://192.168.8.74";
List<CardInfo> cardInfos = null;
ExecutorService executor2 = Executors.newFixedThreadPool(2);
ExecutorService executor = Executors.newFixedThreadPool(5);
ExecutorService executor2 = Executors.newFixedThreadPool(10);
ExecutorService executor = Executors.newFixedThreadPool(90);
do {
try{
cardInfos = this.updateData();
@ -46,6 +49,9 @@ public class UpdateService {
for (CardInfo cardInfo : cardInfos) {
log.info("开始同步"+cardInfo.getPatno());
Future future2 = executor2.submit(()->{
String dir = "c:\\pic\\"+cardInfo.getId();
// 创建File对象
File directory = new File(dir);
try{
List<Picture> pictures = dataQuery.getPictures(cardInfo.getId());
if(pictures==null||pictures.size()==0){
@ -53,28 +59,29 @@ public class UpdateService {
dataQuery.updateBatchState(cardInfo,5);
return;
}
// 判断目录是否存在
if (!directory.exists()) {
// 目录不存在,创建目录
boolean created = directory.mkdirs();
if (created) {
log.info("目录创建成功:" + dir);
} else {
log.info("目录创建失败:" + dir);
}
}
List<Future> futures = new ArrayList<>();
for (Picture picture : pictures) {
Future future = executor.submit(() -> {
try {
String dir = "d:\\pic\\"+picture.getFileid();
// 创建File对象
File directory = new File(dir);
// 判断目录是否存在
if (!directory.exists()) {
// 目录不存在,创建目录
boolean created = directory.mkdirs();
if (created) {
log.info("目录创建成功:" + dir);
} else {
log.info("目录创建失败:" + dir);
}
}
String cmd = "D:\\lianzhong\\Debug\\Debug\\lianzhong.exe 003 192.168.8.74 " + cardInfo.getId() + " " + picture.getPicid() + " " + cardInfo.getPatno() + " " + cardInfo.getOutdateStr() + " " + picture.getPicname() + " " + picture.getFileUrl() + " " + uniUrl + " " + picture.getRotatedegree();
log.info(cmd);
String cmd = "C:\\Debug\\lianzhong.exe 003 192.168.8.74 " + cardInfo.getId() + " " + picture.getPicid() + " " + cardInfo.getPatno() + " " + cardInfo.getOutdateStr() + " " + picture.getPicname() + " " + picture.getFileUrl() + " " + uniUrl + " " + picture.getRotatedegree();
// log.info(cmd);
java.lang.Process process = java.lang.Runtime.getRuntime().exec(cmd);//执行命令生成cube
process.waitFor();
File pictureFile = new File(picture.getFileUrl());
if(!pictureFile.exists()){
log.error("图片转换失败,命令为:{}",cmd);
}
} catch (Exception e) {
log.error(e.getMessage(),e);
e.printStackTrace();
@ -93,42 +100,92 @@ public class UpdateService {
}
}
boolean complete = true;
List<File> files = new ArrayList<>();
List<UploadInfo> uploadInfos = new ArrayList<>();
for(Picture picture : pictures){
files.add(new File(picture.getFileUrl()));
UploadInfo uploadInfo = new UploadInfo(cardInfo.getPatno(), cardInfo.getOutdateStr2(), picture.getPicname(), picture.getPicname(), picture.getPickind(), cardInfo.getId(), cardInfo.getPatname(), cardInfo.getIndateStr(), cardInfo.getPatsex());
File pictureFile = new File(picture.getFileUrl());
if(!pictureFile.exists()){
complete=false;
continue;
}
files.add(pictureFile);
UploadInfo uploadInfo = new UploadInfo(cardInfo.getPatno(), cardInfo.getOutdateStr2(), picture.getPicname(), picture.getPicname(),
picture.getPickind(), cardInfo.getId(), cardInfo.getPatname(),
cardInfo.getIndateStr(), cardInfo.getPatsex(),cardInfo.getPatnum(),
cardInfo.getIcdecode11(),cardInfo.getIcdename11(), cardInfo.getMjwesticde(),cardInfo.getMjwestname(),
cardInfo.getOutdeptname(),cardInfo.getPatciticard(),cardInfo.getOutwardname(),cardInfo.getIndeptname(),cardInfo.getIndeptcode(),cardInfo.getGestno(),cardInfo.getPatbirthdayStr());
uploadInfos.add(uploadInfo);
}
// 额外的表单字段参数
List<FormField> params = new ArrayList<>();
String s = new Gson().toJson(uploadInfos);
params.add(new FormField("uploadFileParams", s));
log.info("请求参数:"+s);
// 上传
if (files.isEmpty()) {
log.info("获取图片文件失败,cardInfoId:{}",cardInfo.getId());
dataQuery.updateBatchState(cardInfo,4);
// 删除文件
FileUploader.deleteFolder(directory);
return;
}
try {
CommonResult commonResult = FileUploader.uploadFilesWithParams(files, "http://10.2.130.59:8712/api/downplatform/fileUploadJpg", params);
if(commonResult.getCode()==0){
Map<String, UploadInfo> uploadInfosMap = uploadInfos.stream().collect(Collectors.toMap(UploadInfo::getUploadFileName, Function.identity()));
boolean success = true;
// 上传
int totalSize = files.size();
int batchSize = 500;
if (totalSize > batchSize) {
for (int i = 0; i < totalSize; i += batchSize) {
ArrayList<File> batch = new ArrayList<>();
List<UploadInfo> uploadInfoParams = new ArrayList<>();
// 计算当前批次的结束索引
int end = Math.min(i + batchSize, totalSize);
for (int j = i; j < end; j++) {
batch.add(files.get(j));
uploadInfoParams.add(uploadInfosMap.get(files.get(j).getName()));
}
// 额外的表单字段参数
List<FormField> params = new ArrayList<>();
String s = new Gson().toJson(uploadInfoParams);
params.add(new FormField("uploadFileParams", s));
log.info("请求参数:" + cardInfo.getPatno());
CommonResult commonResult = FileUploader.uploadFilesWithParams(batch, "http://192.168.161.102:9511/batchFileUploadJpg", params);
boolean res = commonResult.getCode() == 0;
success = success && res;
}
} else {
// 额外的表单字段参数
List<FormField> params = new ArrayList<>();
String s = new Gson().toJson(uploadInfos);
params.add(new FormField("uploadFileParams", s));
log.info("请求参数:" + cardInfo.getPatno());
CommonResult commonResult = FileUploader.uploadFilesWithParams(files, "http://192.168.161.102:9511/fileUploadJpg", params);
success = commonResult.getCode() == 0;
}
if(success){
dataQuery.updateBatchState(cardInfo,3);
}else{
dataQuery.updateBatchState(cardInfo,4);
log.error(commonResult.getMsg());
}
} catch (Exception e) {
dataQuery.updateBatchState(cardInfo,4);
log.error(e.getMessage(),e);
}
if (!complete) {
// 不完整
dataQuery.updateBatchState(cardInfo,2);
}
// 删除文件
// String dir = "d:\\pic\\"+cardInfo.getId();
// File file = new File(dir);
// FileUploader.deleteFolder(file);
FileUploader.deleteFolder(directory);
}catch (Exception e){
dataQuery.updateBatchState(cardInfo,4);
log.error(e.getMessage(),e);
e.printStackTrace();
if (directory.exists()) {
FileUploader.deleteFolder(directory);
}
}
});
futures2.add(future2);

@ -3,6 +3,8 @@ package com.jiashi.service;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.Date;
/**
* [ {"inpatientNo":"35131", "disDate":"2020-07-30 00:00:00.000", "fileTitle":"0001.jpg", "uploadFileName":"1.jpg", "assortId":"078F7675CB0048EDBE586D59831C57B0" ,
* "patientId":"12312312",
@ -25,7 +27,33 @@ public class UploadInfo {
private String admissDate;
private String sex;
public UploadInfo(String inpatientNo, String disDate, String fileTitle, String uploadFileName, String assortId, String patientId, String name, String admissDate, String sex) {
private Integer admissTimes;
private String mainDiagCode;
private String mainDiagName;
private String mainOperateCode;
private String mainOperateName;
private String admissDept;
private String admissDeptName;
private String disDeptName;
private String idCard;
private String wardPalce;
private String admissId;
private String birthday;
public UploadInfo(String inpatientNo, String disDate, String fileTitle, String uploadFileName, String assortId,
String patientId, String name, String admissDate, String sex,Integer admissTimes,String mainDiagCode,String mainDiagName, String mainOperateCode,String mainOperateName,
String disDeptName,String idCard,String wardPalce,String admissDeptName,String admissDept,String admissId,String birthday) {
this.inpatientNo = inpatientNo;
this.disDate = disDate;
this.fileTitle = fileTitle;
@ -34,114 +62,134 @@ public class UploadInfo {
this.patientId = patientId;
this.name = name;
this.admissDate = admissDate;
this.sex = sex;
this.admissTimes = admissTimes;
this.mainOperateName = mainOperateName;
this.mainDiagCode = mainDiagCode;
this.mainDiagName = mainDiagName;
this.mainOperateCode = mainOperateCode;
this.disDeptName = disDeptName;
this.idCard = idCard;
this.wardPalce = wardPalce;
this.admissDeptName = admissDeptName;
this.admissDept = admissDept;
this.admissId = admissId;
this.birthday = birthday;
this.ssAssortId();
this.changeSexName(sex);
}
public void changeSexName(String sex){
if("1".equals(sex)){
this.sex = "男";
}else{
this.sex = "女";
}
}
public void ssAssortId() {
switch (assortId) {
case "1":
this.assortId = "2111";
this.assortId = "1";
break;
case "2":
this.assortId = "2112";
this.assortId = "2";
break;
case "3":
this.assortId = "2113";
this.assortId = "3";
break;
case "4":
this.assortId = "2114";
this.assortId = "4";
break;
case "5":
this.assortId = "2115";
this.assortId = "5";
break;
case "6":
this.assortId = "2116";
this.assortId = "6";
break;
case "7":
this.assortId = "2117";
this.assortId = "7";
break;
case "8":
this.assortId = "2118";
this.assortId = "8";
break;
case "9":
this.assortId = "2119";
this.assortId = "9";
break;
case "10":
this.assortId = "21110";
this.assortId = "10";
break;
case "11":
this.assortId = "21111";
this.assortId = "11";
break;
case "12":
this.assortId = "21112";
this.assortId = "12";
break;
case "13":
this.assortId = "21113";
this.assortId = "13";
break;
case "14":
this.assortId = "21114";
this.assortId = "14";
break;
case "15":
this.assortId = "21115";
this.assortId = "15";
break;
case "16":
this.assortId = "21116";
this.assortId = "16";
break;
case "17":
this.assortId = "21117";
this.assortId = "17";
break;
case "18":
this.assortId = "21118";
this.assortId = "18";
break;
case "19":
this.assortId = "21119";
this.assortId = "19";
break;
case "20":
this.assortId = "21120";
this.assortId = "20";
break;
case "21":
this.assortId = "21121";
this.assortId = "21";
break;
case "22":
this.assortId = "21122";
this.assortId = "22";
break;
case "23":
this.assortId = "21123";
this.assortId = "23";
break;
case "24":
this.assortId = "21124";
this.assortId = "24";
break;
case "25":
this.assortId = "21125";
this.assortId = "25";
break;
case "26":
this.assortId = "21126";
this.assortId = "26";
break;
case "27":
this.assortId = "21127";
this.assortId = "27";
break;
case "28":
this.assortId = "21128";
this.assortId = "28";
break;
case "29":
this.assortId = "21129";
this.assortId = "29";
break;
case "30":
this.assortId = "21130";
this.assortId = "30";
break;
case "31":
this.assortId = "21131";
this.assortId = "31";
break;
case "32":
this.assortId = "21132";
this.assortId = "32";
break;
case "33":
this.assortId = "21133";
this.assortId = "33";
break;
default:
this.assortId = "21133";
this.assortId = "33";
}

@ -4,9 +4,9 @@ server:
spring:
datasource:
url: jdbc:sqlserver://10.2.130.59:1433;DatabaseName=u_medrecord
url: jdbc:sqlserver://192.168.8.74:1433;DatabaseName=u_medrecord
username: sa
password: admin123
password: 17931
# url: jdbc:sqlserver://10.36.116.108:1433;DatabaseName=emr_record
# username: sa
# password: xjgs+docus911

@ -12,4 +12,8 @@ ON [dbo].[t_card_info_upload] (
CREATE NONCLUSTERED INDEX [index_outdate]
ON [dbo].[t_card_info_upload] (
[outdate]
)
)
--
-- t_card_info_upload id

@ -0,0 +1,69 @@
<!-- Logback configuration. See http://logback.qos.ch/manual/index.html -->
<configuration scan="true" scanPeriod="10 seconds">
<!-- 以下配置修改自springboot -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- Simple file output -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- encoder defaults to ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
<encoder>
<pattern>${FILE_LOG_PATTERN:-%d{yyyy-MM-dd HH:mm:ss.SSS} [${HOSTNAME}]${LOG_LEVEL_PATTERN:-%5p} ${PID:- }
--- [%t] %-40.40logger{39} %L : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}
</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>log/discovery-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<!-- Safely log to the same file from multiple JVMs. Degrades performance! -->
<prudent>true</prudent>
</appender>
<appender name="FILE_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>512</queueSize>
<appender-ref ref="FILE"/>
</appender>
<!-- Console output -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder defaults to ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
<encoder>
<pattern>${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint}
[${HOSTNAME}]%clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint}
%clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %L %clr(:){faint}
%m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}
</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- Only log level WARN and above -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
</appender>
<!-- For loggers in the these namespaces, log at all levels. -->
<logger name="pedestal" level="ALL"/>
<logger name="hammock-cafe" level="ALL"/>
<logger name="user" level="ALL"/>
<!--显示日志-->
<logger name="org.springframework.jdbc.core" additivity="false" level="DEBUG">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE_ASYNC"/>
</logger>
<root level="INFO">
<appender-ref ref="FILE_ASYNC"/>
<appender-ref ref="STDOUT"/>
</root>
</configuration>

@ -59,7 +59,7 @@ public class FileUploader {
"]"));
// 上传URL
String uploadUrl = "http://192.168.16.116:8711/api/downplatform/fileUploadJpg";
String uploadUrl = "http://192.168.16.116:9511/sync/fileUploadJpg";
// 执行批量上传
uploadFilesWithParams(files, uploadUrl, params);

Loading…
Cancel
Save