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 archiveMasterVos = archiveMasterDao.PollingPacs(); if (!CollectionUtils.isEmpty(archiveMasterVos)) { logger.info("一共:"+archiveMasterVos.size()+"条病历!!!!"); gather(archiveMasterVos); } } @Override public Msg pacsAnxu() { List archiveMasterVos = archiveMasterDao.PollingPacsAnXu(); if (CollectionUtils.isEmpty(archiveMasterVos)) { return Msg.fail("无需采集数据"); } gather(archiveMasterVos); return Msg.success("采集完成"); } @Override public Msg PacsEveryWeekPolling() { List archiveMasterVos = archiveMasterDao.PacsEveryWeekPolling(); if (CollectionUtils.isEmpty(archiveMasterVos)) { return Msg.fail("无需采集数据"); } gather(archiveMasterVos); return Msg.success("采集完成"); } @Override public Msg makeUpPacsByMasterId(String masterId) { List 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 archiveMasterVos = archiveMasterDao.makeUpPacsByMasterId(masterId); if (CollectionUtils.isEmpty(archiveMasterVos)) { return Msg.fail("无需采集数据"); } gather(archiveMasterVos); archiveMasterDao.updatePacsCompenSate(masterId); return Msg.success("采集完成"); } private void deleteFliepath(List 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 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 vo = pacsDao.getVo(dto); if (CollectionUtils.isEmpty(vo)) { logger.info("该住院号时间内无数据" + list.getInpNo() + "住院次数为:" + list.getVisitId()); continue; } logger.info("住院号为:"+list.getInpNo() + "住院次数为:" + list.getVisitId()+"当前记录为:"+vo.size()+"条"); //插入文件表数据集合 List ArchiveDetailList = new ArrayList<>(); //需要同步的数据 for (PacsVo pacsList : vo) { //查询文件是否存在,如果存在先删除后新增 List 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 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 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); } }