|
|
|
@ -2,8 +2,18 @@ package com.docus.demo.service;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
|
|
import com.docus.demo.dto.*;
|
|
|
|
|
import com.docus.demo.entity.*;
|
|
|
|
|
import com.docus.demo.dto.BasicSelectDto;
|
|
|
|
|
import com.docus.demo.dto.FileUploadJpgDto;
|
|
|
|
|
import com.docus.demo.dto.LianZhongUploadInfo;
|
|
|
|
|
import com.docus.demo.dto.SyncBasicDataDto;
|
|
|
|
|
import com.docus.demo.dto.SyncFileDto;
|
|
|
|
|
import com.docus.demo.dto.UploadJpgFileParam;
|
|
|
|
|
import com.docus.demo.entity.CommonResult;
|
|
|
|
|
import com.docus.demo.entity.ScanAssort;
|
|
|
|
|
import com.docus.demo.entity.TCardInfo;
|
|
|
|
|
import com.docus.demo.entity.TPicture;
|
|
|
|
|
import com.docus.demo.entity.Tbasic;
|
|
|
|
|
import com.docus.demo.entity.TbasicSub;
|
|
|
|
|
import com.docus.demo.facade.BasicDeptService;
|
|
|
|
|
import com.docus.demo.facade.ISyncBasicFileService;
|
|
|
|
|
import com.docus.demo.mapper.mysql.BasicMapper;
|
|
|
|
@ -11,7 +21,6 @@ import com.docus.demo.mapper.mysql.ScanAssortMapper;
|
|
|
|
|
import com.docus.demo.mapper.sqlserver.PictureMapper;
|
|
|
|
|
import com.docus.demo.utils.SnowflakeIdWorker;
|
|
|
|
|
import com.docus.demo.vo.BasicVo;
|
|
|
|
|
|
|
|
|
|
import com.github.xiaoymin.knife4j.core.util.StrUtil;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
@ -24,8 +33,16 @@ import javax.annotation.Resource;
|
|
|
|
|
import java.io.File;
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.text.SimpleDateFormat;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.concurrent.*;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Collections;
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Objects;
|
|
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
|
|
import java.util.concurrent.ExecutorService;
|
|
|
|
|
import java.util.concurrent.LinkedBlockingQueue;
|
|
|
|
|
import java.util.concurrent.ThreadPoolExecutor;
|
|
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
@Slf4j
|
|
|
|
@ -407,6 +424,167 @@ public class SyncBasicFileImpl implements ISyncBasicFileService {
|
|
|
|
|
return CommonResult.success("上传完成");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void lianZhongBatchFileUploadJpg(MultipartFile[] files, LianZhongUploadInfo lianZhongUploadInfo) {
|
|
|
|
|
final String source = "lianzhong";
|
|
|
|
|
|
|
|
|
|
LianZhongUploadInfo.PatientInfo patientInfo = lianZhongUploadInfo.getPatientInfo();
|
|
|
|
|
List<LianZhongUploadInfo.FileInfo> fileInfos = lianZhongUploadInfo.getFileInfos();
|
|
|
|
|
|
|
|
|
|
//解析文件上传参数
|
|
|
|
|
if (fileInfos.size() != files.length) {
|
|
|
|
|
throw new RuntimeException("文件上传数量与参数不一致!");
|
|
|
|
|
}
|
|
|
|
|
// 参数不含上传的,不匹配
|
|
|
|
|
List<String> originalFileNames = fileInfos.stream().map(item -> String.valueOf(item.getUploadFileName())).collect(Collectors.toList());
|
|
|
|
|
for (MultipartFile file : files) {
|
|
|
|
|
if (!originalFileNames.contains(file.getOriginalFilename())) {
|
|
|
|
|
throw new RuntimeException("文件名:" + file.getOriginalFilename() + "与病案号:" + patientInfo.getInpatientNo() + "集合中中文名不匹配");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Tbasic oldBasic = getOldTbasic(patientInfo);
|
|
|
|
|
Tbasic tbasic = oldBasic;
|
|
|
|
|
if (oldBasic == null) {
|
|
|
|
|
ArrayList<Tbasic> tbasics = new ArrayList<>();
|
|
|
|
|
//组织基础数据
|
|
|
|
|
Tbasic addTbasic = getTbasic(patientInfo);
|
|
|
|
|
tbasics.add(addTbasic);
|
|
|
|
|
basicDeptService.handleDept(tbasics);
|
|
|
|
|
basicMapper.addBasic(tbasics);
|
|
|
|
|
tbasic = addTbasic;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 删除旧的存在的同名的联众文件数据、图像
|
|
|
|
|
if (oldBasic != null) {
|
|
|
|
|
List<ScanAssort> scanAssort = scanAssortMapper.getScanAssort(oldBasic.getPatientId(), source);
|
|
|
|
|
if (!CollectionUtils.isEmpty(scanAssort)) {
|
|
|
|
|
for (MultipartFile file : files) {
|
|
|
|
|
String originalFilename = file.getOriginalFilename();
|
|
|
|
|
for (ScanAssort assort : scanAssort) {
|
|
|
|
|
if (originalFilename.equals(assort.getScanPage())) {
|
|
|
|
|
File oldFile = new File(assort.getImagePath() + File.separatorChar + assort.getScanPage());
|
|
|
|
|
try {
|
|
|
|
|
oldFile.delete(); // 删除照片
|
|
|
|
|
scanAssortMapper.delScanAssortById(assort.getId());
|
|
|
|
|
break;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 保存文件和文件数据
|
|
|
|
|
String filePathdir = createDirectory(tbasic);
|
|
|
|
|
//保存文件
|
|
|
|
|
ArrayList<ScanAssort> scanAssorts = new ArrayList<>();
|
|
|
|
|
for (MultipartFile file : files) {
|
|
|
|
|
for (LianZhongUploadInfo.FileInfo fileInfo : fileInfos) {
|
|
|
|
|
//上传原文件名与实际文件名一致
|
|
|
|
|
if (fileInfo.getUploadFileName().equals(file.getOriginalFilename())) {
|
|
|
|
|
//记录排序
|
|
|
|
|
final int[] sort = {0};
|
|
|
|
|
ScanAssort tScanAssortDto = addScanAssort(tbasic.getPatientId(), filePathdir, file, fileInfo);
|
|
|
|
|
if (Objects.isNull(tScanAssortDto)) {
|
|
|
|
|
log.info("批次病案主键:" + tbasic.getPatientId() + "中" + fileInfo.getFileTitle() + "中保存失败");
|
|
|
|
|
} else {
|
|
|
|
|
tScanAssortDto.setSource(source);
|
|
|
|
|
scanAssorts.add(tScanAssortDto);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!scanAssortMapper.addScanAssort(scanAssorts)) {
|
|
|
|
|
throw new RuntimeException(tbasic.getPatientId() + "保存文件数据库失败");
|
|
|
|
|
}
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
|
log.info("联众同步文件上传,本次批次传输成功病案号码为:{}({})" + tbasic.getInpatientNo(), sdf.format(tbasic.getDisDate()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private ScanAssort addScanAssort(String patientId, String filePathdir, MultipartFile file, LianZhongUploadInfo.FileInfo fileInfo) {
|
|
|
|
|
|
|
|
|
|
//文件保存地址
|
|
|
|
|
String toJpgFilePath = filePathdir + File.separatorChar + fileInfo.getUploadFileName();
|
|
|
|
|
try {
|
|
|
|
|
file.transferTo(new File(toJpgFilePath));
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
log.error("将jpg文件保存本地失败:" + fileInfo.getUploadFileName() + "," + e.getMessage(), e);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
//组织新数据
|
|
|
|
|
ScanAssort scanAssort = new ScanAssort();
|
|
|
|
|
scanAssort.setId(SnowflakeIdWorker.idWorker.nextId());
|
|
|
|
|
scanAssort.setPatientId(patientId);
|
|
|
|
|
scanAssort.setAssortId(fileInfo.getAssortId());
|
|
|
|
|
scanAssort.setFileTitle(fileInfo.getFileTitle());
|
|
|
|
|
scanAssort.setImagePath(filePathdir);
|
|
|
|
|
scanAssort.setCreateTime(new Date());
|
|
|
|
|
scanAssort.setScanPage(fileInfo.getUploadFileName());
|
|
|
|
|
scanAssort.setSort(fileInfo.getSort());
|
|
|
|
|
scanAssort.setFileSource(2);
|
|
|
|
|
scanAssort.setFileStorageType(1);
|
|
|
|
|
scanAssort.setFilePages(1);
|
|
|
|
|
scanAssort.setCreater("lianzhong-sync");
|
|
|
|
|
return scanAssort;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String createDirectory(Tbasic tbasic) {
|
|
|
|
|
//根据年/月/日/住院号/patientId生成目录
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
|
Date disDate = tbasic.getDisDate();
|
|
|
|
|
String inpatientNo = tbasic.getInpatientNo();
|
|
|
|
|
String patientId = tbasic.getPatientId();
|
|
|
|
|
String disDateTime = sdf.format(disDate);
|
|
|
|
|
String[] parts = disDateTime.split("-");
|
|
|
|
|
String year = parts[0];
|
|
|
|
|
String month = parts[1];
|
|
|
|
|
String day = parts[2];
|
|
|
|
|
//文件保存目录
|
|
|
|
|
String filePathdir = savePath
|
|
|
|
|
+ File.separatorChar + year
|
|
|
|
|
+ File.separatorChar + month
|
|
|
|
|
+ File.separatorChar + day
|
|
|
|
|
+ File.separatorChar + inpatientNo
|
|
|
|
|
+ File.separatorChar + inpatientNo
|
|
|
|
|
+ patientId;
|
|
|
|
|
File filePath = new File(filePathdir);
|
|
|
|
|
//判断文件夹是否存在不存在创建文件夹
|
|
|
|
|
if (!filePath.exists()) {
|
|
|
|
|
filePath.mkdirs();
|
|
|
|
|
}
|
|
|
|
|
return filePathdir;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Tbasic getOldTbasic(LianZhongUploadInfo.PatientInfo patientInfo) {
|
|
|
|
|
try {
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
|
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
String inpatientNo = patientInfo.getInpatientNo();
|
|
|
|
|
Date disDate = sdf2.parse(patientInfo.getDisDate());
|
|
|
|
|
String name = patientInfo.getName();
|
|
|
|
|
|
|
|
|
|
List<String> inpatientNos = Collections.singletonList(inpatientNo);
|
|
|
|
|
SyncBasicDataDto dto = new SyncBasicDataDto();
|
|
|
|
|
List<Tbasic> oldBasicList = basicMapper.getOldBasicList(inpatientNos, dto);
|
|
|
|
|
for (Tbasic tbasic : oldBasicList) {
|
|
|
|
|
// 名字,病案号,出院日期 相同 ,认为是一个数据
|
|
|
|
|
if (ObjectUtil.equals(tbasic.getName(), name)
|
|
|
|
|
&& tbasic.getInpatientNo().equalsIgnoreCase(inpatientNo)
|
|
|
|
|
&& sdf.format(disDate).equals(sdf.format(tbasic.getDisDate()))) {
|
|
|
|
|
return tbasic;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
} catch (Exception ex) {
|
|
|
|
|
throw new RuntimeException(ex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Tbasic getOldTbasic(FileUploadJpgDto fileUploadJpgDto) {
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
|
// String admissId = fileUploadJpgDto.getAdmissId();
|
|
|
|
@ -421,7 +599,6 @@ public class SyncBasicFileImpl implements ISyncBasicFileService {
|
|
|
|
|
SyncBasicDataDto dto = new SyncBasicDataDto();
|
|
|
|
|
List<Tbasic> oldBasicList = basicMapper.getOldBasicList(inpatientNos, dto);
|
|
|
|
|
for (Tbasic tbasic : oldBasicList) {
|
|
|
|
|
|
|
|
|
|
// 名字,病案号,住院次数,出院时间 相同 ,人为是一个数据
|
|
|
|
|
if (ObjectUtil.equals(tbasic.getName(), fileUploadJpgDto.getName())
|
|
|
|
|
&& tbasic.getInpatientNo().equalsIgnoreCase(jpgDtoInpatientNo)
|
|
|
|
@ -488,6 +665,40 @@ public class SyncBasicFileImpl implements ISyncBasicFileService {
|
|
|
|
|
return scanAssort;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Tbasic getTbasic(LianZhongUploadInfo.PatientInfo patientInfo) {
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
Tbasic addTbasic = new Tbasic();
|
|
|
|
|
addTbasic.setPatientId(String.valueOf(SnowflakeIdWorker.idWorker.nextId()));
|
|
|
|
|
addTbasic.setAdmissTimes(patientInfo.getAdmissTimes());
|
|
|
|
|
addTbasic.setInpatientNo(patientInfo.getInpatientNo());
|
|
|
|
|
addTbasic.setName(patientInfo.getName());
|
|
|
|
|
addTbasic.setSex(patientInfo.getSex());
|
|
|
|
|
addTbasic.setSexName(patientInfo.getSexName());
|
|
|
|
|
addTbasic.setAge(patientInfo.getAge());
|
|
|
|
|
addTbasic.setIdCard(patientInfo.getIdCard());
|
|
|
|
|
try {
|
|
|
|
|
addTbasic.setAdmissDate(cn.hutool.core.util.StrUtil.isBlank(patientInfo.getAdmissDate()) ? null : sdf.parse(patientInfo.getAdmissDate()));
|
|
|
|
|
addTbasic.setDisDate(sdf.parse(patientInfo.getDisDate()));
|
|
|
|
|
} catch (Exception ex) {
|
|
|
|
|
throw new RuntimeException(ex);
|
|
|
|
|
}
|
|
|
|
|
addTbasic.setAdmissDeptName(patientInfo.getAdmissDeptName());
|
|
|
|
|
addTbasic.setDisDeptName(patientInfo.getDisDeptName());
|
|
|
|
|
addTbasic.setMainDiagName(patientInfo.getMainDiagName());
|
|
|
|
|
addTbasic.setMainDiagCode(patientInfo.getMainDiagCode());
|
|
|
|
|
addTbasic.setMainOperateName(patientInfo.getMainOperateName());
|
|
|
|
|
addTbasic.setMainOperateCode(patientInfo.getMainOperateCode());
|
|
|
|
|
addTbasic.setBColumn8(1);
|
|
|
|
|
addTbasic.setIsArchive(1);
|
|
|
|
|
addTbasic.setArchiveFileStorageType(2);
|
|
|
|
|
addTbasic.setCreateTime(new Date());
|
|
|
|
|
addTbasic.setFileSource(3);
|
|
|
|
|
addTbasic.setScanSource("1");
|
|
|
|
|
addTbasic.setScanUploadState(1);
|
|
|
|
|
return addTbasic;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Tbasic getTbasic(List<FileUploadJpgDto> fileUploadJpg) {
|
|
|
|
|
FileUploadJpgDto fileUploadJpgDto = fileUploadJpg.get(0);
|
|
|
|
|
Tbasic addTbasic = new Tbasic();
|
|
|
|
|