feat: 广州市一检验报告接口添加

lianzhong-receive
wyb 3 months ago
parent 56f6a984a1
commit 79ef689b6e

@ -16,7 +16,7 @@
</component>
<component name="JavacSettings">
<option name="ADDITIONAL_OPTIONS_OVERRIDE">
<module name="jp2demo" options="-parameters -extdirs C:\my\jiashi\project\jp2demo/lib" />
<module name="jp2demo" options="-parameters -extdirs F:\xiamen-jiashi\code\jp2demo/lib" />
</option>
</component>
</project>

@ -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<String,Object> SYNC_BASIC_DATA_BLOCK_MAP = new ConcurrentHashMap<>();
private static final ConcurrentHashMap<String, Object> 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<SyncLabReportDto.SyncLabReportBasicDto> 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<String> inpatientNos){
public CommonResult<?> chooseByInpatientNo(@RequestBody List<String> 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();

@ -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<SyncLabReportBasicDto> basicDtoList;
@Data
@ApiModel("检验报告同步患者基础数据参数")
public static class SyncLabReportBasicDto {
@ApiModelProperty("病案号")
private String inpatientNo;
@ApiModelProperty("出院日期,格式为 yyyy-MM-dd")
private String disDate;
}
}

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

@ -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<Tbasic> 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<SyncLabReportDto.SyncLabReportBasicDto> 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<Tbasic> 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<ScanAssort> 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<ScanAssort> 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<ScanAssort> scanAssortList = new ArrayList<>();
List<ScanAssort> 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<ScanAssort> 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<ScanAssort> 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) {

Loading…
Cancel
Save