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