diff --git a/.idea/compiler.xml b/.idea/compiler.xml index d5dd6ac..8e4bc37 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -16,7 +16,7 @@ \ No newline at end of file diff --git a/src/main/java/com/docus/demo/controller/SyncBasicDataController.java b/src/main/java/com/docus/demo/controller/SyncBasicDataController.java index 011c7dc..0d80e5b 100644 --- a/src/main/java/com/docus/demo/controller/SyncBasicDataController.java +++ b/src/main/java/com/docus/demo/controller/SyncBasicDataController.java @@ -1,10 +1,13 @@ package com.docus.demo.controller; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; 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.SyncLabReportDto; import com.docus.demo.dto.UploadJpgFileParam; import com.docus.demo.entity.CommonResult; import com.docus.demo.facade.ISyncBasicDataService; @@ -14,10 +17,17 @@ 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.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAdjusters; import java.util.Collections; import java.util.List; @@ -35,45 +45,46 @@ public class SyncBasicDataController { @Autowired private IWebService webService; - private static final ConcurrentHashMap SYNC_BASIC_DATA_BLOCK_MAP = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap SYNC_BASIC_DATA_BLOCK_MAP = new ConcurrentHashMap<>(); @ApiOperation("去除文件不存在的数据") @PostMapping("/deleteSync") - public CommonResult deleteSync(@RequestBody SyncBasicDataDto syncBasicDataDto){ + public CommonResult deleteSync(@RequestBody SyncBasicDataDto syncBasicDataDto) { return syncBasicFileService.deleteSync(syncBasicDataDto); } @ApiOperation("省厅-同步基础数据") @PostMapping("/syncBasicData") - public CommonResult syncBasicData(@RequestBody SyncBasicDataDto syncBasicDataDto){ - if(syncBasicDataDto == null){ + public CommonResult syncBasicData(@RequestBody SyncBasicDataDto syncBasicDataDto) { + if (syncBasicDataDto == null) { return CommonResult.failed("无效的请求参数!"); } - String blockKey="syncBasicData:"+ JSON.toJSONString(syncBasicDataDto); + String blockKey = "syncBasicData:" + JSON.toJSONString(syncBasicDataDto); if (SYNC_BASIC_DATA_BLOCK_MAP.containsKey(blockKey)) { return CommonResult.failed("有正在同步的任务!"); } - SYNC_BASIC_DATA_BLOCK_MAP.put(blockKey,0); + SYNC_BASIC_DATA_BLOCK_MAP.put(blockKey, 0); try { return syncBasicDataService.syncBasicData(syncBasicDataDto); - }catch (Exception ex){ + } catch (Exception ex) { return CommonResult.failed("同步失败!"); - }finally { + } finally { SYNC_BASIC_DATA_BLOCK_MAP.remove(blockKey); } } + @ApiOperation("省厅-同步单个患者基础数据") @GetMapping("/syncSingleBasicData") - public CommonResult syncSingleBasicData(@RequestParam(name = "disDate") String disDate,@RequestParam(name = "inpatientNo") String inpatientNo){ + public CommonResult syncSingleBasicData(@RequestParam(name = "disDate") String disDate, @RequestParam(name = "inpatientNo") String inpatientNo) { log.info("省厅-同步单个患者基础数据,disDate={},inpatientNo={}", disDate, inpatientNo); - String blockKey="syncSingleBasicData:"+ inpatientNo+":"+disDate; + String blockKey = "syncSingleBasicData:" + inpatientNo + ":" + disDate; if (SYNC_BASIC_DATA_BLOCK_MAP.containsKey(blockKey)) { return CommonResult.failed("有正在同步的任务!"); } - SYNC_BASIC_DATA_BLOCK_MAP.put(blockKey,0); + SYNC_BASIC_DATA_BLOCK_MAP.put(blockKey, 0); try { LocalDate localDate = LocalDate.parse(disDate); SyncBasicDataDto dto = new SyncBasicDataDto(); @@ -82,9 +93,9 @@ public class SyncBasicDataController { dto.setInpatientNoList(Collections.singletonList(inpatientNo)); dto.setLimit(100); return syncBasicDataService.syncBasicData(dto); - }catch (Exception ex){ + } catch (Exception ex) { return CommonResult.failed("同步失败!"); - }finally { + } finally { SYNC_BASIC_DATA_BLOCK_MAP.remove(blockKey); } } @@ -92,12 +103,12 @@ public class SyncBasicDataController { @ApiOperation("省厅-同步上个月基础数据") @GetMapping("/syncLastMonthBasicData") - public CommonResult syncLastMonthBasicData(){ - String blockKey="syncLastMonthBasicData"; + public CommonResult syncLastMonthBasicData() { + String blockKey = "syncLastMonthBasicData"; if (SYNC_BASIC_DATA_BLOCK_MAP.containsKey(blockKey)) { return CommonResult.failed("有正在同步的任务!"); } - SYNC_BASIC_DATA_BLOCK_MAP.put(blockKey,0); + SYNC_BASIC_DATA_BLOCK_MAP.put(blockKey, 0); try { LocalDate today = LocalDate.now(); LocalDate firstDayOfLastMonth = today.minusMonths(1).with(TemporalAdjusters.firstDayOfMonth()); @@ -108,9 +119,9 @@ public class SyncBasicDataController { dto.setEndDate(lastDayOfLastMonth.toString()); dto.setLimit(1000); return syncBasicDataService.syncBasicData(dto); - }catch (Exception ex){ + } catch (Exception ex) { return CommonResult.failed("同步失败!"); - }finally { + } finally { SYNC_BASIC_DATA_BLOCK_MAP.remove(blockKey); } } @@ -122,16 +133,71 @@ public class SyncBasicDataController { return webService.syncInspection(syncBasicDataDto); } + + @ApiOperation("同步检验图片数据(V2)") + @PostMapping("/syncLabReport") + public CommonResult syncLabReport(@RequestBody SyncLabReportDto syncLabReportDto) { + try { + validateAndSet(syncLabReportDto); + webService.syncLabReport(syncLabReportDto); + return CommonResult.success("同步检验数据成功"); + } catch (Exception ex) { + log.error("同步检验图片数据,出错了," + ex.getMessage(), ex); + return CommonResult.failed("同步检验数据出错," + ex.getMessage()); + } + } + + private void validateAndSet(SyncLabReportDto syncLabReportDto) { + List basicDtoList = syncLabReportDto.getBasicDtoList(); + if (CollUtil.isEmpty(basicDtoList)) { + throw new RuntimeException("患者基础数据为空!"); + } + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + for (SyncLabReportDto.SyncLabReportBasicDto basicDto : basicDtoList) { + + if (StrUtil.isBlank(basicDto.getInpatientNo()) || StrUtil.isBlank(basicDto.getDisDate())) { + throw new RuntimeException("患者基础数据病案号或出院日期为空!"); + } + LocalDate.parse(basicDto.getDisDate(), dateTimeFormatter); + } + + final String startDefault = "2018-01-01"; + final String endDefault = LocalDate.now().toString() ; + + + String startDate = syncLabReportDto.getStartDate(); + String endDate = syncLabReportDto.getEndDate(); + if (StrUtil.isBlank(startDate)) { + startDate = startDefault; + } + if (StrUtil.isBlank(endDate)) { + endDate = endDefault; + } + + + LocalDate startLocalDate = LocalDate.parse(startDate, dateTimeFormatter); + LocalDate endLocalDate = LocalDate.parse(endDate, dateTimeFormatter); + if (startLocalDate.isAfter(endLocalDate)) { + throw new RuntimeException("三方查询接口开始时间不合法!"); + } + + + syncLabReportDto.setStartDate(startLocalDate + " 00:00:00"); + syncLabReportDto.setEndDate(endLocalDate + " 23:59:59"); + } + + @ApiOperation("联众-同步基础数据") @PostMapping("/syncLzBasicData") - public CommonResult syncLzBasicData(@RequestBody SyncBasicDataDto syncBasicDataDto){ + public CommonResult syncLzBasicData(@RequestBody SyncBasicDataDto syncBasicDataDto) { return syncBasicDataService.syncLzBasicData(syncBasicDataDto); } @ApiOperation("同步文件数据") @PostMapping("/syncBasicFile") - public CommonResult syncBasicFile(@RequestBody SyncFileDto syncFileDto){ + public CommonResult syncBasicFile(@RequestBody SyncFileDto syncFileDto) { return syncBasicFileService.syncBasicFile(syncFileDto); } @@ -198,12 +264,9 @@ public class SyncBasicDataController { } - - - @ApiOperation("根据 病案号、姓名、出院日期、住院次数 进行筛选数据保留一条") @GetMapping("/choose") - public CommonResult choose(){ + public CommonResult choose() { log.info("根据 病案号、姓名、出院日期、住院次数 进行筛选数据保留一条"); try { syncBasicDataService.choose(); @@ -218,7 +281,7 @@ public class SyncBasicDataController { @ApiOperation("根据 病案号、姓名、出院日期、住院次数 进行筛选数据保留一条") @PostMapping("/chooseByInpatientNo") - public CommonResult chooseByInpatientNo(@RequestBody List inpatientNos){ + public CommonResult chooseByInpatientNo(@RequestBody List inpatientNos) { log.info("根据 病案号、姓名、出院日期、住院次数 进行筛选数据保留一条"); try { syncBasicDataService.choose(inpatientNos); @@ -232,7 +295,7 @@ public class SyncBasicDataController { @ApiOperation("厦门中医院异地扫描导入数据,根据 病案号、姓名、出院日期 进行 入院日期,性别,科室补充,被选择的改为未归档状态") @GetMapping("/xmzyyYidi/choose") - public CommonResult xmzyyYidiChoose(){ + public CommonResult xmzyyYidiChoose() { log.info("厦门中医院异地扫描导入数据,根据 病案号、姓名、出院日期 进行 入院日期,性别,科室补充"); try { syncBasicDataService.xmzyyYidiChoose(); diff --git a/src/main/java/com/docus/demo/dto/SyncLabReportDto.java b/src/main/java/com/docus/demo/dto/SyncLabReportDto.java new file mode 100644 index 0000000..79e1359 --- /dev/null +++ b/src/main/java/com/docus/demo/dto/SyncLabReportDto.java @@ -0,0 +1,32 @@ +package com.docus.demo.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author YongBin Wen + * @date 2025/4/16 0016 17:05 + */ +@ApiModel("检验报告同步参数") +@Data +public class SyncLabReportDto { + @ApiModelProperty("三方查询接口开始时间,接口格式为 yyyy-MM-dd,后端转带时分秒格式,为空默认为 2018-01-01 00:00:00") + private String startDate; + @ApiModelProperty("三方查询接口开始时间,接口格式为 yyyy-MM-dd,后端转带时分秒格式,为空默认为 接口调用时间") + private String endDate; + + @ApiModelProperty("患者基础数据") + private List basicDtoList; + + @Data + @ApiModel("检验报告同步患者基础数据参数") + public static class SyncLabReportBasicDto { + @ApiModelProperty("病案号") + private String inpatientNo; + @ApiModelProperty("出院日期,格式为 yyyy-MM-dd") + private String disDate; + } +} diff --git a/src/main/java/com/docus/demo/facade/IWebService.java b/src/main/java/com/docus/demo/facade/IWebService.java index 154c362..e7f0b1a 100644 --- a/src/main/java/com/docus/demo/facade/IWebService.java +++ b/src/main/java/com/docus/demo/facade/IWebService.java @@ -1,12 +1,13 @@ package com.docus.demo.facade; import com.docus.demo.dto.SyncBasicDataDto; +import com.docus.demo.dto.SyncLabReportDto; import com.docus.demo.entity.CommonResult; -import java.io.IOException; - public interface IWebService { CommonResult syncInspection(SyncBasicDataDto syncBasicDataDto); + + void syncLabReport(SyncLabReportDto syncLabReportDto); } diff --git a/src/main/java/com/docus/demo/service/WebServiceImpl.java b/src/main/java/com/docus/demo/service/WebServiceImpl.java index ae65b76..b5efa7d 100644 --- a/src/main/java/com/docus/demo/service/WebServiceImpl.java +++ b/src/main/java/com/docus/demo/service/WebServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.XmlUtil; import cn.hutool.http.webservice.SoapClient; import com.docus.demo.dto.SyncBasicDataDto; +import com.docus.demo.dto.SyncLabReportDto; import com.docus.demo.entity.CommonResult; import com.docus.demo.entity.PatientListResult; import com.docus.demo.entity.PatientReportResult; @@ -23,6 +24,7 @@ import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -46,14 +48,13 @@ public class WebServiceImpl implements IWebService { @Override public CommonResult syncInspection(SyncBasicDataDto syncBasicDataDto) { - try { - //页码 int current; //每页1000条数据 int limit = syncBasicDataDto.getLimit(); - + String StartDate = "2018-01-01 00:00:00"; + String EndDate = "2025-01-01 00:00:00"; for (current = 1; ; current++) { //查询基础数据 List tbasicList = basicMapper.getOldBasicListLimit((current - 1) * limit, limit, syncBasicDataDto.getInpatientNoList(), syncBasicDataDto); @@ -61,98 +62,118 @@ public class WebServiceImpl implements IWebService { if (tbasicList.size() == 0) { break; } + for (int j = 0; j < tbasicList.size(); j++) { + Tbasic tbasic = tbasicList.get(j); + syncInspection(tbasic, StartDate, EndDate); + } + log.info("业务结束"); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return CommonResult.success("同步检验数据成功"); + } - for (int j = 0; j < tbasicList.size(); j++) { + @Override + public void syncLabReport(SyncLabReportDto syncLabReportDto) { + //页码 + int offset = 0; + //每页1000条数据 + int limit = 1000; + String startDate = syncLabReportDto.getStartDate(); + String endDate = syncLabReportDto.getEndDate(); + + List basicDtoList = syncLabReportDto.getBasicDtoList(); + for (SyncLabReportDto.SyncLabReportBasicDto syncLabReportBasicDto : basicDtoList) { + String disDate = syncLabReportBasicDto.getDisDate(); + String inpatientNo = syncLabReportBasicDto.getInpatientNo(); + SyncBasicDataDto syncBasicDataDto = new SyncBasicDataDto(); + syncBasicDataDto.setStartDate(disDate + " 00:00:00"); + syncBasicDataDto.setEndDate(disDate + " 23:59:59"); + List tbasicList = basicMapper.getOldBasicListLimit(offset, limit, Collections.singletonList(inpatientNo), syncBasicDataDto); + for (Tbasic tbasic : tbasicList) { + syncInspection(tbasic, startDate, endDate); + } + } + } - Tbasic tbasic = tbasicList.get(j); - log.info("正在同步" + tbasic.getInpatientNo() + " " + tbasic.getAdmissTimes()); - List oldScanAssortList = scanAssortMapper.getListByAssortId("A5A7AA6796D1715A2F1E35699C706C84", tbasic.getPatientId()); - log.info("旧数据" + oldScanAssortList.size()); - if (oldScanAssortList.size()>0){ - log.info("跳过同步" + tbasic.getInpatientNo() + " " + tbasic.getAdmissTimes()); - continue; - } + public void syncInspection(Tbasic tbasic, String startDate, String endDate) { + log.info("正在同步" + tbasic.getInpatientNo() + " " + tbasic.getAdmissTimes()); + List oldScanAssortList = scanAssortMapper.getListByAssortId("A5A7AA6796D1715A2F1E35699C706C84", tbasic.getPatientId()); + log.info("旧数据" + oldScanAssortList.size()); + if (oldScanAssortList.size() > 0) { + log.info("跳过同步" + tbasic.getInpatientNo() + " " + tbasic.getAdmissTimes()); + return; + } - String pNo = tbasic.getInpatientNo(); - String times = tbasic.getAdmissTimes().toString(); + String pNo = tbasic.getInpatientNo(); + String times = tbasic.getAdmissTimes().toString(); // String StartDate = sdf.format(tbasic.getAdmissDate()); // String EndDate = sdf.format(tbasic.getDisDate()); - String StartDate = "2018-01-01 00:00:00"; - String EndDate = "2025-01-01 00:00:00"; - String patientId = tbasic.getPatientId(); - //获取所有的报告列表 - PatientListResult patientListResult = getCommonResult(pNo, times, StartDate, EndDate); + String patientId = tbasic.getPatientId(); + + //获取所有的报告列表 + PatientListResult patientListResult = getCommonResult(pNo, times, startDate, endDate); // log.info("返回结果"+patientListResult); - if (patientListResult == null) { - log.error(pNo + " " + times + "调用失败"); - continue; - } + if (patientListResult == null) { + log.error(pNo + " " + times + "调用失败"); + return; + } - List scanAssortList = new ArrayList<>(); + List scanAssortList = new ArrayList<>(); - for (int i = 0; i < patientListResult.getResult().getPidReportMain().size(); i++) { - //根据旧数据判断是否需要做同步 - PatientListResult.Result.ReportInfo item = patientListResult.getResult().getPidReportMain().get(i); + for (int i = 0; i < patientListResult.getResult().getPidReportMain().size(); i++) { + //根据旧数据判断是否需要做同步 + PatientListResult.Result.ReportInfo item = patientListResult.getResult().getPidReportMain().get(i); // ScanAssort oldAssort = oldScanAssortList.stream() // .filter(f -> f.getFileTitle().equals(item.getPidComName())).findAny().orElse(null); - String root = "F:\\jianyan" + File.separator - + tbasic.getInpatientNo() + File.separator - + tbasic.getAdmissTimes(); + String root = "F:\\jianyan" + File.separator + + tbasic.getInpatientNo() + File.separator + + tbasic.getAdmissTimes(); // log.info("开始转换"+root); - //时间段内如果查询到住院次数相同的数据 则数据入库 - if (item.getPidAddmissTimes().equals(times) && item.getPidInNo().equalsIgnoreCase(pNo)) { - log.info("正在同步" + item.getPidComName() + i); + //时间段内如果查询到住院次数相同的数据 则数据入库 + if (item.getPidAddmissTimes().equals(times) && item.getPidInNo().equalsIgnoreCase(pNo)) { + log.info("正在同步" + item.getPidComName() + i); // log.info("进入条件"); - PatientReportResult patientReportResult = this.getReportResult(item.getRepId()); - String base64Result = patientReportResult.getResult().getPatient().getPatientReport(); - List addScanList = new ArrayList<>(); - try { - log.info("开始转换"); - addScanList = PDFFileUtils.base64StringToPDF(base64Result, root, item.getRepId(), item.getPidComName(), i); - log.info("转换结束"); - } catch (IOException e) { - log.error("检验pdf转化出错" + e.getMessage(),e); - } - addScanList.forEach(scanAssort -> { - ScanAssort oldAssort = oldScanAssortList.stream() - .filter(f -> f.getScanPage().equals(scanAssort.getScanPage())).findAny().orElse(null); - if (oldAssort != null) { - scanAssort.setId(oldAssort.getId()); - } else { - scanAssort.setId(snowflakeIdWorker.nextId()); - } - scanAssort.setPatientId(patientId); - scanAssortList.add(scanAssort); - log.info("结果" + scanAssort); - }); - } - } - - //数据写入到3.0 - if (ObjectUtil.isNotEmpty(scanAssortList)) { - log.info("开始写入" + scanAssortList.size()); - scanAssortMapper.insertOrUpdateBatch(scanAssortList); - log.info("写入结束" + scanAssortList.size()); - } + PatientReportResult patientReportResult = this.getReportResult(item.getRepId()); + String base64Result = patientReportResult.getResult().getPatient().getPatientReport(); + List addScanList = new ArrayList<>(); + try { + log.info("开始转换"); + addScanList = PDFFileUtils.base64StringToPDF(base64Result, root, item.getRepId(), item.getPidComName(), i); + log.info("转换结束"); + } catch (IOException e) { + log.error("检验pdf转化出错" + e.getMessage(), e); } - log.info("业务结束"); - + addScanList.forEach(scanAssort -> { + ScanAssort oldAssort = oldScanAssortList.stream() + .filter(f -> f.getScanPage().equals(scanAssort.getScanPage())).findAny().orElse(null); + if (oldAssort != null) { + scanAssort.setId(oldAssort.getId()); + } else { + scanAssort.setId(snowflakeIdWorker.nextId()); + } + scanAssort.setPatientId(patientId); + scanAssortList.add(scanAssort); + log.info("结果" + scanAssort); + }); } - - } catch (Exception e) { - log.error(e.getMessage(), e); } - - return CommonResult.success("同步检验数据成功"); + //数据写入到3.0 + if (ObjectUtil.isNotEmpty(scanAssortList)) { + log.info("开始写入" + scanAssortList.size()); + scanAssortMapper.insertOrUpdateBatch(scanAssortList); + log.info("写入结束" + scanAssortList.size()); + } } private PatientReportResult getReportResult(String repID) {