You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

229 lines
9.7 KiB
Java

package com.shibofu.spring.db1.serviceImpl;
import com.shibofu.spring.db1.dao.ArchiveDetailDao;
import com.shibofu.spring.db1.dao.ArchiveMasterDao;
import com.shibofu.spring.db1.service.PacsPollingService;
import com.shibofu.spring.db2.dao.PacsDao;
import com.shibofu.spring.dto.ArchiveDetailDto;
import com.shibofu.spring.dto.ArchiveMasterDto;
import com.shibofu.spring.util.*;
import com.shibofu.spring.vo.ArchiveDetailVo;
import com.shibofu.spring.vo.ArchiveMasterVo;
import com.shibofu.spring.vo.PacsVo;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @ClassName PollingServiceImpl
* @Description pacs轮询实现类
* @Author linjj
* @Date 2024/1/18 9:26
* @Version 1.0
*/
@Service
@Slf4j
public class PacsPollingServiceImpl implements PacsPollingService {
@Value("${savePath}")
private String savePath;
@Autowired
private ArchiveDetailDao archiveDetailDao;
private final static Logger logger = LoggerFactory.getLogger(PacsPollingServiceImpl.class);
@Autowired
private ArchiveMasterDao archiveMasterDao;
@Autowired
private PacsDao pacsDao;
@Override
public void PacsEveryDayPolling() {
List<ArchiveMasterVo> archiveMasterVos = archiveMasterDao.PollingPacs();
if (!CollectionUtils.isEmpty(archiveMasterVos)) {
logger.info("一共:"+archiveMasterVos.size()+"条病历!!!!");
gather(archiveMasterVos);
}
}
@Override
public Msg pacsAnxu() {
List<ArchiveMasterVo> archiveMasterVos = archiveMasterDao.PollingPacsAnXu();
if (CollectionUtils.isEmpty(archiveMasterVos)) {
return Msg.fail("无需采集数据");
}
gather(archiveMasterVos);
return Msg.success("采集完成");
}
@Override
public Msg PacsEveryWeekPolling() {
List<ArchiveMasterVo> archiveMasterVos = archiveMasterDao.PacsEveryWeekPolling();
if (CollectionUtils.isEmpty(archiveMasterVos)) {
return Msg.fail("无需采集数据");
}
gather(archiveMasterVos);
return Msg.success("采集完成");
}
@Override
public Msg makeUpPacsByMasterId(String masterId) {
List<ArchiveMasterVo> archiveMasterVos = archiveMasterDao.makeUpPacsByMasterId(masterId);
if (CollectionUtils.isEmpty(archiveMasterVos)) {
return Msg.fail("无需采集数据");
}
logger.info("一共:"+archiveMasterVos.size()+"条病历!!!!");
gather(archiveMasterVos);
return Msg.success("采集完成");
}
@Override
public Msg makeUpPacsPush() {
String masterId = archiveMasterDao.selectPacsPush();
List<ArchiveMasterVo> archiveMasterVos = archiveMasterDao.makeUpPacsByMasterId(masterId);
if (CollectionUtils.isEmpty(archiveMasterVos)) {
return Msg.fail("无需采集数据");
}
gather(archiveMasterVos);
archiveMasterDao.updatePacsCompenSate(masterId);
return Msg.success("采集完成");
}
private void deleteFliepath(List<ArchiveDetailVo> listPath) {
for (ArchiveDetailVo list : listPath) {
archiveDetailDao.delSubAssort(list.getId());
File file = new File(list.getPdfPath());
try {
file.delete(); // 删除照片
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void gather(List<ArchiveMasterVo> archiveMasterVos) {
// 创建 JNI 实例
PacsAutoPrintPDF.INSTANCE.setServerInfo("10.36.116.100", 204);
for (ArchiveMasterVo list : archiveMasterVos) {
try {
ArchiveMasterDto dto = new ArchiveMasterDto();
BeanUtils.copyProperties(list, dto);
//根据入院前六小时出院后六小时住院号查询要下载pdf的路径
List<PacsVo> vo = pacsDao.getVo(dto);
if (CollectionUtils.isEmpty(vo)) {
logger.info("该住院号时间内无数据" + list.getInpNo() + "住院次数为:" + list.getVisitId());
continue;
}
logger.info("住院号为:"+list.getInpNo() + "住院次数为:" + list.getVisitId()+"当前记录为:"+vo.size()+"条");
//插入文件表数据集合
List<ArchiveDetailDto> ArchiveDetailList = new ArrayList<>();
//需要同步的数据
for (PacsVo pacsList : vo) {
//查询文件是否存在,如果存在先删除后新增
List<ArchiveDetailVo> subAssort = archiveDetailDao.getSubAssort(pacsList.getAccessionnumber());
if (subAssort.size() > 0) {
deleteFliepath(subAssort);
}
//使用yyyyMMddHHmmssSSS格式作为文件名
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS");
String newDate = format.format(date);
//组织路径
String filePathdir = savePath + File.separatorChar + list.getInpNo() + File.separatorChar + list.getVisitId();
File file = new File(filePathdir);
//判断文件夹是否存在不存在创建文件夹
if (!file.exists()) {
file.mkdirs();
}
String filePath = filePathdir + File.separatorChar + newDate + ".pdf";
logger.info("-----------------文件id:" + pacsList.getAccessionnumber() + ",路径:" + filePath);
// 调用 GetPDF 函数
try {
boolean result = PacsAutoPrintPDF.INSTANCE.GetPDF(pacsList.getAccessionnumber(), filePath);
} catch (Throwable e) {
logger.info(pacsList.getAccessionnumber()+"异常处理");
continue;
}
//成功存在文件表中,不成功输出到日志中
saveArchiveDetailDto(list, dto, ArchiveDetailList, pacsList, filePath);
}
//插入文件表
boolean b = archiveDetailDao.addArchiveDetail(ArchiveDetailList);
if (b) {
ArchiveDetailList.clear();
logger.info("住院号:" + list.getInpNo() + "住院次数为:" + list.getVisitId() + "采集完成");
}
} catch (Exception e) {
logger.info(list.getId()+"异常处理");
}
}
}
private static void saveArchiveDetailDto(ArchiveMasterVo list, ArchiveMasterDto dto, List<ArchiveDetailDto> ArchiveDetailList, PacsVo pacsList, String filePath) {
//成功存在文件表中,不成功输出到日志中
if (new File(filePath).exists()) {
ArchiveDetailDto archiveDetailDto = new ArchiveDetailDto();
archiveDetailDto.setMasterId(dto.getId());
archiveDetailDto.setUploadDateTime(new Date());
String emrAssort = getEmrAssort(pacsList.getProf());
archiveDetailDto.setAssortId(emrAssort);
archiveDetailDto.setSource("pacs");
archiveDetailDto.setFlag("0");
archiveDetailDto.setTitle(pacsList.getExamItem());
archiveDetailDto.setPdfPath(filePath);
archiveDetailDto.setSubAssort(pacsList.getAccessionnumber());
ArchiveDetailList.add(archiveDetailDto);
//记录保存文件表
} else {
logger.info("-----------------住院号:" + list.getInpNo() + ",文件名:" + pacsList.getExamItem() + "解析不返回图片");
}
}
public static String getEmrAssort(String prof) {
Map<String, String> map = new HashMap<>();
map.put("1", "DA342ED81CEE4A8EA827424626F3F577");
map.put("2", "DA342ED81CEE4A8EA827424626F3F577");
map.put("3", "DA342ED81CEE4A8EA827424626F3F577");
map.put("4", "DA342ED81CEE4A8EA827424626F3F577");
map.put("5", "DA342ED81CEE4A8EA827424626F3F577");
map.put("6", "DA342ED81CEE4A8EA827424626F3F577");
map.put("7", "DA342ED81CEE4A8EA827424626F3F577");
map.put("8", "DA342ED81CEE4A8EA827424626F3F577");
map.put("9", "DA342ED81CEE4A8EA827424626F3F577");
map.put("20", "DA342ED81CEE4A8EA827424626F3F577");
map.put("22", "DA342ED81CEE4A8EA827424626F3F577");
map.put("23", "DA342ED81CEE4A8EA827424626F3F577");
map.put("24", "DA342ED81CEE4A8EA827424626F3F577");
map.put("25", "DA342ED81CEE4A8EA827424626F3F577");
map.put("26", "DA342ED81CEE4A8EA827424626F3F577");
map.put("27", "DA342ED81CEE4A8EA827424626F3F577");
map.put("28", "DA342ED81CEE4A8EA827424626F3F577");
map.put("29", "DA342ED81CEE4A8EA827424626F3F577");
map.put("30", "DE599D770E8347CCB5122BC357D96F37");
map.put("32", "DA342ED81CEE4A8EA827424626F3F577");
map.put("33", "DA342ED81CEE4A8EA827424626F3F577");
map.put("34", "DA342ED81CEE4A8EA827424626F3F577");
map.put("36", "DE599D770E8347CCB5122BC357D96F37");
map.put("37", "DE599D770E8347CCB5122BC357D96F37");
map.put("38", "DE599D770E8347CCB5122BC357D96F37");
map.put("39", "DA342ED81CEE4A8EA827424626F3F577");
return map.get(prof);
}
}