feat:联众采集服务端

lianzhong-receive
wyb 5 months ago
parent b8364c024b
commit 32794d0791

@ -2,6 +2,7 @@ package com.docus.demo.controller;
import com.alibaba.fastjson.JSON;
import com.docus.demo.dto.LianZhongUploadInfo;
import com.docus.demo.dto.SyncBasicDataDto;
import com.docus.demo.dto.SyncFileDto;
import com.docus.demo.dto.UploadJpgFileParam;
@ -23,7 +24,7 @@ import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
@Api(value = "数据同步接口", tags = "数据同步接口")
@RestController("/sync")
@RestController
@Slf4j
public class SyncBasicDataController {
@ -175,6 +176,29 @@ public class SyncBasicDataController {
}
/**
* @description:
* @params: files
* @params: uploadBatchFileParam
* @author linjj
* @date: 2024/6/28 10:38
*/
@ApiOperation("标准版联众同步文件上传,相同名字的删除,不同的添加,用于个别单次无法上传完毕的")
@PostMapping(value = "/lianzhong/batchFileUploadJpg")
@ResponseBody
public CommonResult<?> lianZhongBatchFileUploadJpg(@RequestPart("files") MultipartFile[] files, UploadJpgFileParam uploadJpgFileParam) {
try {
LianZhongUploadInfo lianZhongUploadInfo = JSON.parseObject(uploadJpgFileParam.getUploadFileParams(), LianZhongUploadInfo.class);
syncBasicFileService.lianZhongBatchFileUploadJpg(files, lianZhongUploadInfo);
return CommonResult.success("成功!");
} catch (Exception e) {
log.error("联众同步文件上传,保存失败!异常处理" + e.getMessage(), e);
return CommonResult.failed("保存失败!异常处理" + e.getMessage());
}
}
@ApiOperation("根据 病案号、姓名、出院日期、住院次数 进行筛选数据保留一条")

@ -0,0 +1,108 @@
package com.docus.demo.dto;
import lombok.Data;
import java.util.List;
/**
*
*/
@Data
public class LianZhongUploadInfo {
/**
*
*
*/
@Data
public static class PatientInfo {
/**
*
*/
private String inpatientNo;
/**
*
*/
private Integer admissTimes;
/**
*
*/
private String name;
/**
* 12
*/
private String sex;
/**
*
*/
private String sexName;
/**
* -
*/
private Integer age;
/**
* yyyy-MM-dd HH:mm:ss
*/
private String admissDate;
/**
* yyyy-MM-dd HH:mm:ss
*/
private String disDate;
/**
*
*/
private String admissDeptName;
/**
*
*/
private String disDeptName;
/**
*
*/
private String idCard;
/**
*
*/
private String mainDiagCode;
/**
*
*/
private String mainDiagName;
/**
*
*/
private String mainOperateCode;
/**
*
*/
private String mainOperateName;
}
/**
*
*
*/
@Data
public static class FileInfo {
/**
* id
*/
private String assortId;
/**
*
*/
private String fileTitle;
/**
*
*/
private String uploadFileName;
/**
*
*/
private int sort;
}
private PatientInfo patientInfo;
private List<FileInfo> fileInfos;
}

@ -1,5 +1,6 @@
package com.docus.demo.facade;
import com.docus.demo.dto.LianZhongUploadInfo;
import com.docus.demo.dto.SyncBasicDataDto;
import com.docus.demo.dto.SyncFileDto;
import com.docus.demo.dto.UploadJpgFileParam;
@ -22,4 +23,6 @@ public interface ISyncBasicFileService {
CommonResult<?>fileUploadJpg(MultipartFile[] files, UploadJpgFileParam uploadJpgFileParam);
CommonResult<String> batchFileUploadJpg(MultipartFile[] files, UploadJpgFileParam uploadJpgFileParam);
void lianZhongBatchFileUploadJpg(MultipartFile[] files, LianZhongUploadInfo lianZhongUploadInfo);
}

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

@ -21,31 +21,11 @@
<fileNamePattern>${log.path}%d.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>500MB</maxFileSize>
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
</appender>
<appender name="external-interface" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<!-- 指定日志输出格式 -->
<pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%X{traceId}] [%L] [%-5p] %m%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 指定收集策略:滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--指定生成日志保存地址 -->
<fileNamePattern>${log.path}external%d.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>500MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
</appender>
<logger name="com.docus.services.system.service.ClientGetBasicServiceImpl" level="DEBUG" additivity="false">
<appender-ref ref="external-interface" />
</logger>
<root level="INFO">

@ -45,7 +45,7 @@
<insert id="addBasic">
insert into docus_medicalrecord.t_basic
(patient_id,admiss_times,inpatient_no,admiss_id,
name,sex_name,age,id_card,
name,sex,sex_name,age,id_card,
admiss_date,admiss_dept,admiss_dept_name,dis_date,
dis_dept,dis_dept_name,main_diag_code,main_diag_name,
main_operate_code,main_operate_name,create_time,is_archive,
@ -55,7 +55,7 @@
values
<foreach collection="list" item="item" separator=",">
(#{item.patientId},#{item.admissTimes},#{item.inpatientNo},#{item.admissId},
#{item.name},#{item.sex},#{item.age},#{item.idCard},
#{item.name},#{item.sex},#{item.sexName},#{item.age},#{item.idCard},
#{item.admissDate},#{item.admissDept},#{item.admissDeptName},#{item.disDate},
#{item.disDept},#{item.disDeptName},#{item.mainDiagCode},#{item.mainDiagName},
#{item.mainOperateCode},#{item.mainOperateName},#{item.createTime},#{item.isArchive},

Loading…
Cancel
Save