feat: 添加job补偿人工部分

厦门中医院联众-XiaMenZhongLianZhong
wyb 5 months ago
parent dc62b04aee
commit eb30e54eef

@ -2,44 +2,52 @@ package com.jiashi;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.jiashi.service.FormField; import com.jiashi.service.FormField;
import okhttp3.*; import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class FileUploader { public class FileUploader {
public static CommonResult uploadFilesWithParams(List<File> files, String uploadUrl, List<FormField> params) throws IOException { public static CommonResult uploadFilesWithParams(List<File> files, String uploadUrl, List<FormField> params) {
OkHttpClient client = new OkHttpClient.Builder() try {
.connectTimeout(6000, TimeUnit.SECONDS) OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(6000, TimeUnit.SECONDS) .connectTimeout(6000, TimeUnit.SECONDS)
.writeTimeout(6000, TimeUnit.SECONDS) .readTimeout(6000, TimeUnit.SECONDS)
.build(); .writeTimeout(6000, TimeUnit.SECONDS)
MultipartBody.Builder builder = new MultipartBody.Builder(); .build();
for (File file : files) { MultipartBody.Builder builder = new MultipartBody.Builder();
RequestBody body = RequestBody.create(MediaType.parse("multipart/form-data"), file); for (File file : files) {
RequestBody body = RequestBody.create(MediaType.parse("multipart/form-data"), file);
// RequestBody body = RequestBody.create(MediaType.parse("image/jpeg"), file); // RequestBody body = RequestBody.create(MediaType.parse("image/jpeg"), file);
builder.addFormDataPart("files", file.getName(), body); builder.addFormDataPart("files", file.getName(), body);
} }
for(FormField formField:params){ for(FormField formField:params){
builder.addFormDataPart(formField.getKey(), formField.getValue()); builder.addFormDataPart(formField.getKey(), formField.getValue());
} }
// 下行是上传的json的对象其中上面的fileName和下行的fromData需和后台接口名字一致 // 下行是上传的json的对象其中上面的fileName和下行的fromData需和后台接口名字一致
RequestBody requestBody = builder.setType(MultipartBody.FORM).build(); RequestBody requestBody = builder.setType(MultipartBody.FORM).build();
final Request request = new Request.Builder() final Request request = new Request.Builder()
.url(uploadUrl) .url(uploadUrl)
.post(requestBody) .post(requestBody)
.build(); .build();
Response response = client.newCall(request).execute();
String responseBody = response.body().string();
CommonResult commonResult = new Gson().fromJson(responseBody, CommonResult.class);
return commonResult;
Response response = client.newCall(request).execute();
String responseBody = response.body().string();
CommonResult commonResult = new Gson().fromJson(responseBody, CommonResult.class);
return commonResult;
}catch (Exception ex){
throw new RuntimeException(ex);
}
} }
public static void deleteFolder(File folder) { public static void deleteFolder(File folder) {
@ -54,6 +62,33 @@ public class FileUploader {
folder.delete(); folder.delete();
} }
public static void main(String[] args) {
FileUploader fileUploader = new FileUploader();
ExecutorService syncExecutors = Executors.newFixedThreadPool(2);
syncExecutors.execute(fileUploader::t1);
try {
syncExecutors.execute(fileUploader::t2);
}catch (Exception ex){
ex.printStackTrace();
}
}
public void t1(){
for (int i = 0; i < 10; i++) {
System.out.println("t1 >>>> "+i);
try {
Thread.sleep(3*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void t2(){
for (int i = 0; i < 10; i++) {
System.out.println("t2 >>>> "+i);
}
}
// public static void main(String[] args) throws IOException { // public static void main(String[] args) throws IOException {
// List<File> files = new ArrayList<>(); // 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\\16763947060057863381.jpg"));

@ -29,7 +29,7 @@ public class LianZhongSyncController {
updateService.sycDirNotExists(); updateService.sycDirNotExists();
return CommonResult.success("补偿完毕!"); return CommonResult.success("补偿完毕!");
} catch (Exception ex) { } catch (Exception ex) {
log.error("补偿异常 "); log.error("补偿异常 "+ex.getMessage(),ex);
return CommonResult.failed("补偿异常!"); return CommonResult.failed("补偿异常!");
} }
} }

@ -68,6 +68,14 @@ public class UpdateService {
@PostConstruct @PostConstruct
public void upload() { public void upload() {
initLianZhongPatPicDir(); initLianZhongPatPicDir();
ExecutorService syncExecutors = Executors.newFixedThreadPool(2);
syncExecutors.execute(this::syncNotStart);
syncExecutors.execute(this::sycDirNotExistsJob);
}
public void syncNotStart(){
log.info("联众同步数据启动>>>>>>>>>>>>>>>>>>>>"); log.info("联众同步数据启动>>>>>>>>>>>>>>>>>>>>");
String syncDir = FilePathUtil.currentPath() + File.separator + "lianzhong-sync"; String syncDir = FilePathUtil.currentPath() + File.separator + "lianzhong-sync";
FilePathUtil.mkdirs(syncDir); FilePathUtil.mkdirs(syncDir);
@ -236,6 +244,131 @@ public class UpdateService {
log.error("联众同步数据异常:" + ex.getMessage(), ex); log.error("联众同步数据异常:" + ex.getMessage(), ex);
} }
} }
public void sycDirNotExistsJob() {
while (true){
try {
sycDirNotExists();
TimeUnit.SECONDS.sleep(600);
}catch (Exception ex){
log.error("补偿异常 "+ex.getMessage(),ex);
}
}
}
public void sycDirNotExists() {
log.info("联众补偿数据启动>>>>>>>>>>>>>>>>>>>>");
String syncDir = FilePathUtil.currentPath() + File.separator + "lianzhong-makeup-sync";
FilePathUtil.mkdirs(syncDir);
List<CardInfo> cardInfos = dataQuery.dateQuery(4);
if (!CollectionUtils.isEmpty(cardInfos)) {
for (CardInfo cardInfo : cardInfos) {
String picDir = syncDir + File.separator + cardInfo.getId();
FilePathUtil.mkdirs(picDir);
List<Picture> pictures = dataQuery.getPictures(cardInfo.getId());
String lianZhongDir = cardInfo.getFindpicpath();
if (lianZhongDir == null) {
FilePathUtil.deleteDir(picDir);
continue;
}
for (Picture picture : pictures) {
String tifFilePath = lianZhongDir + File.separator + removeFileExtension(picture.getPicname()) + ".tif";
File tifFile = new File(tifFilePath);
if (tifFile.exists()) {
try {
BufferedImage read = ImageIO.read(tifFile);
Thumbnails.of(read)
.scale(1)
.outputFormat("jpg")
.rotate(picture.getRotatedegree())
.toFile(picDir + File.separator + removeFileExtension(picture.getPicname()) + ".jpg");
read.flush();
} catch (IOException e) {
log.error("补偿转换文件失败pictureId=" + picture.getPicid() + "," + e.getMessage(), e);
}
}
}
LianZhongUploadInfo.PatientInfo patientInfo = convert(cardInfo);
List<LianZhongUploadInfo.FileInfo> fileInfos = new ArrayList<>();
List<String> faultFileNames = new ArrayList<>();
List<File> files = new ArrayList<>();
for (Picture picture : pictures) {
File pictureFile = new File(picDir + File.separator + removeFileExtension(picture.getPicname()) + ".jpg");
if (!pictureFile.exists()) {
faultFileNames.add(picture.getPicname());
continue;
}
files.add(pictureFile);
LianZhongUploadInfo.FileInfo fileInfo = new LianZhongUploadInfo.FileInfo();
fileInfo.setFileTitle(picture.getPicname());
fileInfo.setUploadFileName(pictureFile.getName());
fileInfo.setAssortId(picture.getPickind());
fileInfo.setSort(picture.getPicno());
fileInfos.add(fileInfo);
}
if (files.isEmpty()) {
dataQuery.updateBatchState(cardInfo, 2, "未获取到图片!");
// 删除文件
FilePathUtil.deleteDir(picDir);
continue;
}
LianZhongUploadInfo uploadInfo = new LianZhongUploadInfo();
uploadInfo.setPatientInfo(patientInfo);
uploadInfo.setFileInfos(fileInfos);
uploadInfo.setDelAllFile(1);
Map<String, LianZhongUploadInfo.FileInfo> fileInfoMap = fileInfos.stream()
.collect(Collectors.toMap(LianZhongUploadInfo.FileInfo::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<LianZhongUploadInfo.FileInfo> uploadFileInfoList = new ArrayList<>();
// 计算当前批次的结束索引
int end = Math.min(i + batchSize, totalSize);
for (int j = i; j < end; j++) {
batch.add(files.get(j));
uploadFileInfoList.add(fileInfoMap.get(files.get(j).getName()));
}
uploadInfo.setFileInfos(uploadFileInfoList);
// 额外的表单字段参数
List<FormField> params = new ArrayList<>();
String s = new Gson().toJson(uploadInfo);
params.add(new FormField("uploadFileParams", s));
CommonResult commonResult = FileUploader.uploadFilesWithParams(batch, uploadUrl, params);
boolean res = commonResult.getCode() == 0;
success = success && res;
uploadInfo.setDelAllFile(0);
}
} else {
// 额外的表单字段参数
List<FormField> params = new ArrayList<>();
String s = new Gson().toJson(uploadInfo);
params.add(new FormField("uploadFileParams", s));
CommonResult commonResult = FileUploader.uploadFilesWithParams(files, uploadUrl, params);
success = commonResult.getCode() == 0;
}
if (success) {
dataQuery.updateBatchState(cardInfo, 3);
}
if (!faultFileNames.isEmpty()) {
// 不完整
dataQuery.updateBatchState(cardInfo, 2, String.join(",", faultFileNames + " 无法转换jpg图片"));
}
// 删除文件
FilePathUtil.deleteDir(picDir);
}
}
}
public static void main(String[] args) { public static void main(String[] args) {
UpdateService updateService = new UpdateService(); UpdateService updateService = new UpdateService();
@ -434,119 +567,6 @@ public class UpdateService {
} }
public void sycDirNotExists() throws Exception {
initLianZhongPatPicDir();
log.info("联众补偿数据启动>>>>>>>>>>>>>>>>>>>>");
String syncDir = FilePathUtil.currentPath() + File.separator + "lianzhong-makeup-sync";
FilePathUtil.mkdirs(syncDir);
List<CardInfo> cardInfos = dataQuery.dateQuery(4);
if (!CollectionUtils.isEmpty(cardInfos)) {
for (CardInfo cardInfo : cardInfos) {
String picDir = syncDir + File.separator + cardInfo.getId();
FilePathUtil.mkdirs(picDir);
List<Picture> pictures = dataQuery.getPictures(cardInfo.getId());
String lianZhongDir = cardInfo.getFindpicpath();
if (lianZhongDir == null) {
FilePathUtil.deleteDir(picDir);
continue;
}
for (Picture picture : pictures) {
String tifFilePath = lianZhongDir + File.separator + removeFileExtension(picture.getPicname()) + ".tif";
File tifFile = new File(tifFilePath);
if (tifFile.exists()) {
try {
BufferedImage read = ImageIO.read(tifFile);
Thumbnails.of(read)
.scale(1)
.outputFormat("jpg")
.rotate(picture.getRotatedegree())
.toFile(picDir + File.separator + removeFileExtension(picture.getPicname()) + ".jpg");
read.flush();
} catch (IOException e) {
log.error("补偿转换文件失败pictureId=" + picture.getPicid() + "," + e.getMessage(), e);
}
}
}
LianZhongUploadInfo.PatientInfo patientInfo = convert(cardInfo);
List<LianZhongUploadInfo.FileInfo> fileInfos = new ArrayList<>();
List<String> faultFileNames = new ArrayList<>();
List<File> files = new ArrayList<>();
for (Picture picture : pictures) {
File pictureFile = new File(picDir + File.separator + removeFileExtension(picture.getPicname()) + ".jpg");
if (!pictureFile.exists()) {
faultFileNames.add(picture.getPicname());
continue;
}
files.add(pictureFile);
LianZhongUploadInfo.FileInfo fileInfo = new LianZhongUploadInfo.FileInfo();
fileInfo.setFileTitle(picture.getPicname());
fileInfo.setUploadFileName(pictureFile.getName());
fileInfo.setAssortId(picture.getPickind());
fileInfo.setSort(picture.getPicno());
fileInfos.add(fileInfo);
}
if (files.isEmpty()) {
dataQuery.updateBatchState(cardInfo, 2, "未获取到图片!");
// 删除文件
FilePathUtil.deleteDir(picDir);
continue;
}
LianZhongUploadInfo uploadInfo = new LianZhongUploadInfo();
uploadInfo.setPatientInfo(patientInfo);
uploadInfo.setFileInfos(fileInfos);
uploadInfo.setDelAllFile(1);
Map<String, LianZhongUploadInfo.FileInfo> fileInfoMap = fileInfos.stream()
.collect(Collectors.toMap(LianZhongUploadInfo.FileInfo::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<LianZhongUploadInfo.FileInfo> uploadFileInfoList = new ArrayList<>();
// 计算当前批次的结束索引
int end = Math.min(i + batchSize, totalSize);
for (int j = i; j < end; j++) {
batch.add(files.get(j));
uploadFileInfoList.add(fileInfoMap.get(files.get(j).getName()));
}
uploadInfo.setFileInfos(uploadFileInfoList);
// 额外的表单字段参数
List<FormField> params = new ArrayList<>();
String s = new Gson().toJson(uploadInfo);
params.add(new FormField("uploadFileParams", s));
CommonResult commonResult = FileUploader.uploadFilesWithParams(batch, uploadUrl, params);
boolean res = commonResult.getCode() == 0;
success = success && res;
uploadInfo.setDelAllFile(0);
}
} else {
// 额外的表单字段参数
List<FormField> params = new ArrayList<>();
String s = new Gson().toJson(uploadInfo);
params.add(new FormField("uploadFileParams", s));
CommonResult commonResult = FileUploader.uploadFilesWithParams(files, uploadUrl, params);
success = commonResult.getCode() == 0;
}
if (success) {
dataQuery.updateBatchState(cardInfo, 3);
}
if (!faultFileNames.isEmpty()) {
// 不完整
dataQuery.updateBatchState(cardInfo, 2, String.join(",", faultFileNames + " 无法转换jpg图片"));
}
// 删除文件
FilePathUtil.deleteDir(picDir);
}
}
}
} }

Loading…
Cancel
Save