feat: 广东省中医珠海,采集任务 添加

master
WenYongbin 1 week ago
parent 1827da2efc
commit 7bee510298

@ -2,26 +2,26 @@
"PACS": { "PACS": {
"collectorId": "PACS", "collectorId": "PACS",
"assortId": "PACS-ASSORT", "assortId": "PACS-ASSORT",
"listUrl": "", "listUrl": "http://172.16.99.220:7801/Ewell_WS_S02?wsdl",
"listOperationName": "", "listOperationName": "OperationA",
"listNamespaceUri": "", "listNamespaceUri": "",
"detailUrl": "", "detailUrl": "http://172.16.99.220:7801/Ewell_WS_S02?wsdl",
"detailOperationName": "", "detailOperationName": "OperationA",
"detailNamespaceUri": "", "detailNamespaceUri": "",
"filterReport": "" "filterReport": ""
}, },
"LIS": { "LIS": {
"collectorId": "", "collectorId": "",
"assortId": "", "assortId": "",
"listUrl": "", "listUrl": "http://172.16.56.150:8304/XingHePlatform.asmx?wsdl",
"listOperationName": "", "listOperationName": "CallInterface",
"listNamespaceUri": "", "listNamespaceUri": "",
"detailUrl": "", "detailUrl": "http://172.16.56.150:8304/XingHePlatform.asmx?wsdl",
"detailOperationName": "", "detailOperationName": "CallInterface",
"detailNamespaceUri": "", "detailNamespaceUri": "",
"filterReport": "" "filterReport": ""
}, },
"DyECG": { "ECG": {
"collectorId": "", "collectorId": "",
"assortId": "", "assortId": "",
"filterReport": "" "filterReport": ""
@ -31,7 +31,7 @@
"assortId": "", "assortId": "",
"filterReport": "" "filterReport": ""
}, },
"MaZui": { "ShouMa": {
"collectorId": "", "collectorId": "",
"assortId": "", "assortId": "",
"filterReport": "" "filterReport": ""

@ -8,7 +8,9 @@
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<properties>
<selenium.version>3.141.59</selenium.version>
</properties>
<artifactId>docus-collect-file-data</artifactId> <artifactId>docus-collect-file-data</artifactId>
<dependencies> <dependencies>
@ -201,6 +203,26 @@
<version>2.1.1</version> <version>2.1.1</version>
</dependency> </dependency>
<!-- Selenium 3.141.59 -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
<!-- CDP4J - Chrome DevTools Protocol Java 客户端(支持 JDK 8 -->
<dependency>
<groupId>io.webfolder</groupId>
<artifactId>cdp4j</artifactId>
<version>3.0.3</version>
</dependency>
<!-- winp - CDP4J 3.0+ 在 Windows 上需要 -->
<dependency>
<groupId>org.jvnet.winp</groupId>
<artifactId>winp</artifactId>
<version>1.28</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
<resources> <resources>

@ -0,0 +1,36 @@
package com.docus.server.archive.entity;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
*
* : docus_archivefile.af_collect_patient_log
*/
@Data
public class AfCollectPatientLog implements Serializable {
private static final long serialVersionUID = 1L;
/**
*
*/
private String patientId;
/**
* id
*/
private String collectId;
/**
*
*/
private Date lastCollectTime;
/**
*
*/
private Integer fileCount;
}

@ -2,6 +2,7 @@ package com.docus.server.archive.mapper;
import com.docus.server.archive.dto.PatientState; import com.docus.server.archive.dto.PatientState;
import com.docus.server.archive.entity.AfCollectPatientLog;
import com.docus.server.archive.entity.AfCollectTask; import com.docus.server.archive.entity.AfCollectTask;
import com.docus.server.archive.entity.BasicExtend; import com.docus.server.archive.entity.BasicExtend;
import com.docus.server.archive.entity.TBasic; import com.docus.server.archive.entity.TBasic;
@ -14,18 +15,18 @@ import java.util.List;
public interface TBasicMapper { public interface TBasicMapper {
int invalidFileBySource(@Param("patientId") String patientId,@Param("collectorId") String collectorId); int invalidFileBySource(@Param("patientId") String patientId, @Param("collectorId") String collectorId);
List<TBasic> getTbasicByReportTimeAndInpNoOrIdCard(@Param("sendDateStr") String sendDateStr,@Param("idCard") String idCard,@Param("inpatientNo") String inpatientNo); List<TBasic> getTbasicByReportTimeAndInpNoOrIdCard(@Param("sendDateStr") String sendDateStr, @Param("idCard") String idCard, @Param("inpatientNo") String inpatientNo);
List<TBasic> getTbasicByPatientIds(@Param("patientIds") List<String> patientIds); List<TBasic> getTbasicByPatientIds(@Param("patientIds") List<String> patientIds);
int deleteTaskByPatAndSource(@Param("patientId")String patientId, @Param("collectorId")String collectorId); int deleteTaskByPatAndSource(@Param("patientId") String patientId, @Param("collectorId") String collectorId);
int flushPatTaskEndTime(@Param("patientId")String patientId,@Param("dateTime")String dateTime); int flushPatTaskEndTime(@Param("patientId") String patientId, @Param("dateTime") String dateTime);
List<AfCollectTask> getCollectTaskByPatAndSource(@Param("patientId")String patientId, @Param("collectorId") String collectorId); List<AfCollectTask> getCollectTaskByPatAndSource(@Param("patientId") String patientId, @Param("collectorId") String collectorId);
int delTaskById(@Param("id") Long id); int delTaskById(@Param("id") Long id);
@ -33,7 +34,7 @@ public interface TBasicMapper {
int updateTaskById(@Param("task") AfCollectTask task); int updateTaskById(@Param("task") AfCollectTask task);
List<String> findFailedTaskPatId(@Param("collectorId") String collectorId,@Param("startDate") String startDateStr); List<String> findFailedTaskPatId(@Param("collectorId") String collectorId, @Param("startDate") String startDateStr);
List<BasicExtend> getZyPatientIdsByYzyJzh(@Param("preJzhs") List<String> preJzhs); List<BasicExtend> getZyPatientIdsByYzyJzh(@Param("preJzhs") List<String> preJzhs);
@ -41,11 +42,30 @@ public interface TBasicMapper {
List<String> getYzyPatientIdFromScanAssort(); List<String> getYzyPatientIdFromScanAssort();
List<TBasic> getNoTaskPatientByDisDate(@Param("startDateTime") String startDateTime,@Param("collectorId") String collectorId); List<TBasic> getNoTaskPatientByDisDate(@Param("startDateTime") String startDateTime, @Param("collectorId") String collectorId);
int cancelTask(@Param("patientId") String patientId, @Param("sysflag") String collectorId); int cancelTask(@Param("patientId") String patientId, @Param("sysflag") String collectorId);
PatientState getPatientState(@Param("patientId") String patientId); PatientState getPatientState(@Param("patientId") String patientId);
int updateTaskRemarkById(@Param("id") Long id,@Param("remark") String remark); int updateTaskRemarkById(@Param("id") Long id, @Param("remark") String remark);
int saveOrUpdateCollectLog(@Param("cpLog") AfCollectPatientLog afCollectPatientLog);
/**
*
* @param offsetTime yyyy-MM-dd HH:mm:ss,
*/
AfCollectPatientLog getCollectLog(@Param("patientId") String patientId, @Param("collectorId") String collectorId, @Param("offsetTime") String offsetTime);
/**
*
* @param disDateStart yyyy-MM-dd HH:mm:ss
* @param disDateEnd yyyy-MM-dd HH:mm:ss
*/
List<String> getPatientIdsByDisDate(@Param("disDateStart") String disDateStart,@Param("disDateEnd") String disDateEnd);
List<String> getNoCollectPatientIds(@Param("collectorId") String collectorId);
} }

@ -35,4 +35,44 @@ public class ReportCollectController {
} }
return CommonResult.success("采集完成!"); return CommonResult.success("采集完成!");
} }
@PostMapping("/collect/lis")
@ApiOperation("采集LIS报告")
public CommonResult<String> collectLis(@RequestBody List<String> patientIds) {
if (Func.isNotEmpty(patientIds)) {
Log.info("LIS报告采集接口参数{}", patientIds);
reportCollectService.collectLis(patientIds);
}
return CommonResult.success("采集完成!");
}
@PostMapping("/collect/icu")
@ApiOperation("采集ICU报告")
public CommonResult<String> collectIcu(@RequestBody List<String> patientIds) {
if (Func.isNotEmpty(patientIds)) {
Log.info("ICU报告采集接口参数{}", patientIds);
reportCollectService.collectIcu(patientIds);
}
return CommonResult.success("采集完成!");
}
@PostMapping("/collect/ecg")
@ApiOperation("采集ECG报告")
public CommonResult<String> collectEcg(@RequestBody List<String> patientIds) {
if (Func.isNotEmpty(patientIds)) {
Log.info("ECG报告采集接口参数{}", patientIds);
reportCollectService.collectEcg(patientIds);
}
return CommonResult.success("采集完成!");
}
@PostMapping("/collect/shouMa")
@ApiOperation("采集ECG报告")
public CommonResult<String> collectShouMa(@RequestBody List<String> patientIds) {
if (Func.isNotEmpty(patientIds)) {
Log.info("ShouMa报告采集接口参数{}", patientIds);
reportCollectService.collectShouMa(patientIds);
}
return CommonResult.success("采集完成!");
}
} }

@ -0,0 +1,134 @@
package com.docus.server.gdszyzh.controller;
import cn.hutool.core.io.FileUtil;
import com.docus.infrastructure.web.api.CommonResult;
import com.docus.server.archive.mapper.TBasicMapper;
import com.docus.server.gdszyzh.entity.GdSzyZhReportDataView;
import com.docus.server.gdszyzh.mapper.GdSzyZhEcgReportDataViewMapper;
import com.docus.server.gdszyzh.mapper.GdSzyZhIcuReportDataViewMapper;
import com.docus.server.gdszyzh.mapper.GdSzyZhShouMaReportDataViewMapper;
import com.docus.server.gdszyzh.util.PrintConfig;
import com.docus.server.gdszyzh.util.WebPagePrinter;
import com.docus.server.rpc.GdSzyZhReportService;
import com.docus.server.rpc.dto.GdSzyZhReportDetailDto;
import com.docus.server.rpc.dto.GdSzyZhReportListDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* @author YongBin Wen
* @date 2026/4/7 16:35
*/
@RestController
@RequestMapping("/gdszyzhtest")
@Api(tags = "广东省中医珠海测试接口")
public class TestController {
@Autowired
private GdSzyZhIcuReportDataViewMapper icuReportDataViewMapper;
@Autowired
private GdSzyZhEcgReportDataViewMapper ecgReportDataViewMapper;
@Autowired
private GdSzyZhShouMaReportDataViewMapper shouMaReportDataViewMapper;
@Autowired
private TBasicMapper tBasicMapper;
@Autowired
private GdSzyZhReportService gdSzyZhReportService;
@GetMapping("/shouma/get")
@ApiOperation("手麻视图测试数据")
public CommonResult<List<GdSzyZhReportDataView>> shoumaTest(@RequestParam("jzh") String jzh) {
List<GdSzyZhReportDataView> byJzhs = shouMaReportDataViewMapper.getByJzhs(Collections.singletonList(jzh));
return CommonResult.success(byJzhs);
}
@GetMapping("/ecg/get")
@ApiOperation("ecg视图测试数据")
public CommonResult<List<GdSzyZhReportDataView>> ecgTest(@RequestParam("jzh") String jzh) {
List<GdSzyZhReportDataView> byJzhs = ecgReportDataViewMapper.getByJzhs(Collections.singletonList(jzh));
return CommonResult.success(byJzhs);
}
@GetMapping("/icu/get")
@ApiOperation("重症视图测试数据")
public CommonResult<List<GdSzyZhReportDataView>> icuTest(@RequestParam("zyh") String inpatientNo, @RequestParam("zycs") Integer zycs) {
List<GdSzyZhReportDataView> dataViewList = icuReportDataViewMapper.getByInpatientNo(inpatientNo);
dataViewList= dataViewList.stream()
.filter(e -> e.getAdmissTimes().equals(zycs))
.collect(Collectors.toList());
return CommonResult.success(dataViewList);
}
@GetMapping("/pacsList/get")
@ApiOperation("PACS检查列表接口测试 时间格式yyyy-MM-dd")
public CommonResult<GdSzyZhReportListDto> pacsListTest(@RequestParam("empId") String empId, @RequestParam("jzh") String jzh,
@RequestParam("beginDate") String beginDate, @RequestParam("endDate") String endDate) {
GdSzyZhReportListDto dto = gdSzyZhReportService.pacsList(empId, jzh, beginDate, endDate);
return CommonResult.success(dto);
}
@GetMapping("/pacsDetail/get")
@ApiOperation("PACS检查报告明细接口测试")
public CommonResult<GdSzyZhReportDetailDto> pacsDetailTest(@RequestParam("examNo") String examNo) {
GdSzyZhReportDetailDto pacsDetail = gdSzyZhReportService.pacsDetail(examNo);
return CommonResult.success(pacsDetail);
}
@GetMapping("/lisList/get")
@ApiOperation("LIS检验列表接口测试 时间格式yyyy-MM-dd HH:mm:ss")
public CommonResult<GdSzyZhReportListDto> lisListTest(@RequestParam("empId") String empId, @RequestParam("jzh") String jzh,
@RequestParam("beginDate") String beginDate, @RequestParam("endDate") String endDate) {
GdSzyZhReportListDto dto = gdSzyZhReportService.lisList(empId, jzh, beginDate, endDate);
return CommonResult.success(dto);
}
@GetMapping("/html/print")
@ApiOperation("html打印测试")
public CommonResult<String> icuPrintTest(@RequestParam(value = "url") String url,
@RequestParam(value = "landscape", required = false) Boolean landscape,
@RequestParam(value = "displayHeaderFooter", required = false) Boolean displayHeaderFooter,
@RequestParam(value = "printBackground", required = false) Boolean printBackground,
@RequestParam(value = "scale", required = false) Double scale,
@RequestParam(value = "paperWidth", required = false) Double paperWidth,
@RequestParam(value = "paperHeight", required = false) Double paperHeight,
@RequestParam(value = "marginTop", required = false) Double marginTop,
@RequestParam(value = "marginBottom", required = false) Double marginBottom,
@RequestParam(value = "marginLeft", required = false) Double marginLeft,
@RequestParam(value = "marginRight", required = false) Double marginRight,
@RequestParam(value = "pageRanges", required = false) String pageRanges,
@RequestParam(value = "ignoreInvalidPageRanges", required = false) Boolean ignoreInvalidPageRanges,
@RequestParam(value = "headerTemplate", required = false) String headerTemplate,
@RequestParam(value = "footerTemplate", required = false) String footerTemplate,
@RequestParam(value = "preferCSSPageSize", required = false) Boolean preferCSSPageSize
) {
try (WebPagePrinter printer = new WebPagePrinter()) {
printer.init();
System.out.println(url);
PrintConfig config = new PrintConfig();
byte[] pdfBytes = printer.printToPdf(url, config, landscape, displayHeaderFooter, printBackground, scale,
paperWidth, paperHeight, marginTop, marginBottom, marginLeft, marginRight, pageRanges,
ignoreInvalidPageRanges, headerTemplate, footerTemplate, preferCSSPageSize);
String pdfPath = "urlPrintToPdf.pdf";
FileUtil.writeBytes(pdfBytes, pdfPath);
System.out.println("PDF已生成: " + pdfPath);
return CommonResult.success("成功");
} catch (Exception e) {
e.printStackTrace();
return CommonResult.failed("失败");
}
}
}

@ -11,7 +11,7 @@ import java.util.Date;
* @date 2026/4/7 17:05 * @date 2026/4/7 17:05
*/ */
@Data @Data
public class ReportDataView { public class GdSzyZhReportDataView {
@ApiModelProperty("报告号") @ApiModelProperty("报告号")
private String reportNo; private String reportNo;
@ApiModelProperty("报告标题") @ApiModelProperty("报告标题")
@ -22,4 +22,10 @@ public class ReportDataView {
private Date reportTime; private Date reportTime;
@ApiModelProperty("报告地址") @ApiModelProperty("报告地址")
private String reportUrl; private String reportUrl;
@ApiModelProperty("住院流水号")
private String jzh;
@ApiModelProperty("住院号")
private String inpatientNo;
@ApiModelProperty("住院次数")
private Integer admissTimes;
} }

@ -0,0 +1,73 @@
package com.docus.server.gdszyzh.job;
import com.alibaba.fastjson.JSONObject;
import com.docus.server.archive.mapper.TBasicMapper;
import com.docus.server.gdszyzh.service.ReportCollectService;
import com.docus.server.util.TableJsonRead;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.util.List;
/**
*
* @author YongBin Wen
* @date 2026/4/7 16:25
*/
@Slf4j
@Component
public class GdSzyZhEcgCollectJob {
@Autowired
private ReportCollectService reportCollectService;
@Autowired
private TBasicMapper basicMapper;
@XxlJob("GdSzyZhEcgCollectJob")
public void gdSzyZhEcgCollectJob() {
log.info("广东省中医珠海,动态心电血压采集任务开始!");
LocalDate localDate = LocalDate.now();
try {
String jobParam = XxlJobHelper.getJobParam();
String[] days;
if (jobParam == null) {
days = new String[]{"3"};
} else {
days = jobParam.split(",");
}
for (String day : days) {
LocalDate disDateRange = localDate.plusDays(-Integer.parseInt(day));
String disDateStart = disDateRange + " 00:00:00";
String disDateEnd = disDateRange + " 23:59:59";
log.info("广东省中医珠海,动态心电血压采集,患者出院时间:{} 至 {}", disDateStart, disDateEnd);
List<String> patientIds = basicMapper.getPatientIdsByDisDate(disDateStart, disDateEnd);
reportCollectService.collectEcg(patientIds);
}
log.info("广东省中医珠海,动态心电血压采集任务结束!");
} catch (Exception e) {
log.error("广东省中医珠海,动态心电血压采集任务出现异常!" + e.getMessage(), e);
}
}
@XxlJob("GdSzyZhEcgQueryNoCollectJob")
public void gdSzyZhEcgQueryNoCollectJob() {
log.info("广东省中医珠海,检索动态心电血压未采集患者采集任务开始!");
try {
final String configPath = "data-config";
final String configName = "gdszyzh-collect-config";
TableJsonRead jsonReader = new TableJsonRead();
JSONObject configOjb = jsonReader.Read(configPath, configName, JSONObject.class);
JSONObject lisWsConfig = configOjb.getJSONObject("ECG");
String collectorId = lisWsConfig.getString("collectorId");
List<String> patientIds = basicMapper.getNoCollectPatientIds(collectorId);
reportCollectService.collectEcg(patientIds);
log.info("广东省中医珠海,检索动态心电血压未采集患者采集任务结束!");
} catch (Exception e) {
log.info("广东省中医珠海,检索动态心电血压未采集患者采集任务异常!" + e.getMessage(), e);
}
}
}

@ -0,0 +1,75 @@
package com.docus.server.gdszyzh.job;
import com.alibaba.fastjson.JSONObject;
import com.docus.server.archive.mapper.TBasicMapper;
import com.docus.server.gdszyzh.service.ReportCollectService;
import com.docus.server.util.TableJsonRead;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.util.List;
/**
*
* @author YongBin Wen
* @date 2026/4/7 16:25
*/
@Slf4j
@Component
public class GdSzyZhIcuCollectJob {
@Autowired
private ReportCollectService reportCollectService;
@Autowired
private TBasicMapper basicMapper;
@XxlJob("GdSzyZhIcuCollectJob")
public void gdSzyZhIcuCollectJob() {
log.info("广东省中医珠海,重症采集任务开始!");
LocalDate localDate = LocalDate.now();
try {
String jobParam = XxlJobHelper.getJobParam();
String[] days;
if (jobParam == null) {
days = new String[]{"3"};
} else {
days = jobParam.split(",");
}
for (String day : days) {
LocalDate disDateRange = localDate.plusDays(-Integer.parseInt(day));
String disDateStart = disDateRange + " 00:00:00";
String disDateEnd = disDateRange + " 23:59:59";
log.info("广东省中医珠海,重症采集,患者出院时间:{} 至 {}", disDateStart, disDateEnd);
List<String> patientIds = basicMapper.getPatientIdsByDisDate(disDateStart, disDateEnd);
reportCollectService.collectIcu(patientIds);
}
log.info("广东省中医珠海,重症采集任务结束!");
} catch (Exception e) {
log.error("广东省中医珠海,重症采集任务出现异常!" + e.getMessage(), e);
}
}
@XxlJob("GdSzyZhIcuQueryNoCollectJob")
public void gdSzyZhIcuQueryNoCollectJob() {
log.info("广东省中医珠海,检索重症未采集患者采集任务开始!");
try {
final String configPath = "data-config";
final String configName = "gdszyzh-collect-config";
TableJsonRead jsonReader = new TableJsonRead();
JSONObject configOjb = jsonReader.Read(configPath, configName, JSONObject.class);
JSONObject lisWsConfig = configOjb.getJSONObject("ICU");
String collectorId = lisWsConfig.getString("collectorId");
List<String> patientIds = basicMapper.getNoCollectPatientIds(collectorId);
reportCollectService.collectIcu(patientIds);
log.info("广东省中医珠海,检索重症未采集患者采集任务结束!");
} catch (Exception e) {
log.info("广东省中医珠海,检索重症未采集患者采集任务异常!" + e.getMessage(), e);
}
}
}

@ -0,0 +1,74 @@
package com.docus.server.gdszyzh.job;
import com.alibaba.fastjson.JSONObject;
import com.docus.server.archive.mapper.TBasicMapper;
import com.docus.server.gdszyzh.service.ReportCollectService;
import com.docus.server.util.TableJsonRead;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.util.List;
/**
*
* @author YongBin Wen
* @date 2026/4/7 16:25
*/
@Slf4j
@Component
public class GdSzyZhLisCollectJob {
@Autowired
private ReportCollectService reportCollectService;
@Autowired
private TBasicMapper basicMapper;
@XxlJob("GdSzyZhLisCollectJob")
public void gdSzyZhLisCollectJob() {
log.info("广东省中医珠海LIS检验采集任务开始");
LocalDate localDate = LocalDate.now();
try {
String jobParam = XxlJobHelper.getJobParam();
String[] days;
if (jobParam == null) {
days = new String[]{"3"};
} else {
days = jobParam.split(",");
}
for (String day : days) {
LocalDate disDateRange = localDate.plusDays(-Integer.parseInt(day));
String disDateStart = disDateRange + " 00:00:00";
String disDateEnd = disDateRange + " 23:59:59";
log.info("广东省中医珠海LIS检验采集患者出院时间{} 至 {}", disDateStart, disDateEnd);
List<String> patientIds = basicMapper.getPatientIdsByDisDate(disDateStart, disDateEnd);
reportCollectService.collectLis(patientIds);
}
log.info("广东省中医珠海LIS检验采集任务结束");
} catch (Exception e) {
log.error("广东省中医珠海LIS检验采集任务出现异常" + e.getMessage(), e);
}
}
@XxlJob("GdSzyZhLisQueryNoCollectJob")
public void gdSzyZhLisQueryNoCollectJob() {
log.info("广东省中医珠海检索LIS检验未采集患者采集任务开始");
try {
final String configPath = "data-config";
final String configName = "gdszyzh-collect-config";
TableJsonRead jsonReader = new TableJsonRead();
JSONObject configOjb = jsonReader.Read(configPath, configName, JSONObject.class);
JSONObject lisWsConfig = configOjb.getJSONObject("LIS");
String collectorId = lisWsConfig.getString("collectorId");
List<String> patientIds = basicMapper.getNoCollectPatientIds(collectorId);
reportCollectService.collectLis(patientIds);
log.info("广东省中医珠海检索LIS检验未采集患者采集任务结束");
} catch (Exception e) {
log.info("广东省中医珠海检索LIS检验未采集患者采集任务异常" + e.getMessage(), e);
}
}
}

@ -0,0 +1,73 @@
package com.docus.server.gdszyzh.job;
import com.alibaba.fastjson.JSONObject;
import com.docus.server.archive.mapper.TBasicMapper;
import com.docus.server.gdszyzh.service.ReportCollectService;
import com.docus.server.util.TableJsonRead;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.util.List;
/**
*
* @author YongBin Wen
* @date 2026/4/7 16:25
*/
@Slf4j
@Component
public class GdSzyZhPacsCollectJob {
@Autowired
private ReportCollectService reportCollectService;
@Autowired
private TBasicMapper basicMapper;
@XxlJob("GdSzyZhPacsCollectJob")
public void gdSzyZhPacsCollectJob() {
log.info("广东省中医珠海PACS检查采集任务开始");
LocalDate localDate = LocalDate.now();
try {
String jobParam = XxlJobHelper.getJobParam();
String[] days;
if (jobParam == null) {
days = new String[]{"3"};
} else {
days = jobParam.split(",");
}
for (String day : days) {
LocalDate disDateRange = localDate.plusDays(-Integer.parseInt(day));
String disDateStart = disDateRange + " 00:00:00";
String disDateEnd = disDateRange + " 23:59:59";
log.info("广东省中医珠海PACS检查采集患者出院时间{} 至 {}", disDateStart, disDateEnd);
List<String> patientIds = basicMapper.getPatientIdsByDisDate(disDateStart, disDateEnd);
reportCollectService.collectPacs(patientIds);
}
log.info("广东省中医珠海PACS检查采集任务结束");
} catch (Exception e) {
log.error("广东省中医珠海PACS检查采集任务出现异常" + e.getMessage(), e);
}
}
@XxlJob("GdSzyZhPacsQueryNoCollectJob")
public void gdSzyZhPacsQueryNoCollectJob() {
log.info("广东省中医珠海检索PACS检查未采集患者采集任务开始");
try {
final String configPath = "data-config";
final String configName = "gdszyzh-collect-config";
TableJsonRead jsonReader = new TableJsonRead();
JSONObject configOjb = jsonReader.Read(configPath, configName, JSONObject.class);
JSONObject lisWsConfig = configOjb.getJSONObject("PACS");
String collectorId = lisWsConfig.getString("collectorId");
List<String> patientIds = basicMapper.getNoCollectPatientIds(collectorId);
reportCollectService.collectPacs(patientIds);
log.info("广东省中医珠海检索PACS检查未采集患者采集任务结束");
} catch (Exception e) {
log.info("广东省中医珠海检索PACS检查未采集患者采集任务异常" + e.getMessage(), e);
}
}
}

@ -0,0 +1,74 @@
package com.docus.server.gdszyzh.job;
import com.alibaba.fastjson.JSONObject;
import com.docus.server.archive.mapper.TBasicMapper;
import com.docus.server.gdszyzh.service.ReportCollectService;
import com.docus.server.util.TableJsonRead;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.util.List;
/**
*
* @author YongBin Wen
* @date 2026/4/7 16:25
*/
@Slf4j
@Component
public class GdSzyZhShouMaCollectJob {
@Autowired
private ReportCollectService reportCollectService;
@Autowired
private TBasicMapper basicMapper;
@XxlJob("GdSzyZhShouMaCollectJob")
public void gdSzyZhShouMaCollectJob() {
log.info("广东省中医珠海,手麻采集任务开始!");
LocalDate localDate = LocalDate.now();
try {
String jobParam = XxlJobHelper.getJobParam();
String[] days;
if (jobParam == null) {
days = new String[]{"3"};
} else {
days = jobParam.split(",");
}
for (String day : days) {
LocalDate disDateRange = localDate.plusDays(-Integer.parseInt(day));
String disDateStart = disDateRange + " 00:00:00";
String disDateEnd = disDateRange + " 23:59:59";
log.info("广东省中医珠海,手麻采集,患者出院时间:{} 至 {}", disDateStart, disDateEnd);
List<String> patientIds = basicMapper.getPatientIdsByDisDate(disDateStart, disDateEnd);
reportCollectService.collectShouMa(patientIds);
}
log.info("广东省中医珠海,手麻采集任务结束!");
} catch (Exception e) {
log.error("广东省中医珠海,手麻采集任务出现异常!" + e.getMessage(), e);
}
}
@XxlJob("GdSzyZhShouMaQueryNoCollectJob")
public void gdSzyZhShouMaQueryNoCollectJob() {
log.info("广东省中医珠海,检索手麻未采集患者采集任务开始!");
try {
final String configPath = "data-config";
final String configName = "gdszyzh-collect-config";
TableJsonRead jsonReader = new TableJsonRead();
JSONObject configOjb = jsonReader.Read(configPath, configName, JSONObject.class);
JSONObject lisWsConfig = configOjb.getJSONObject("PACS");
String collectorId = lisWsConfig.getString("collectorId");
List<String> patientIds = basicMapper.getNoCollectPatientIds(collectorId);
reportCollectService.collectShouMa(patientIds);
log.info("广东省中医珠海,检索手麻未采集患者采集任务结束!");
} catch (Exception e) {
log.info("广东省中医珠海,检索手麻未采集患者采集任务异常!" + e.getMessage(), e);
}
}
}

@ -1,36 +0,0 @@
package com.docus.server.gdszyzh.job;
import com.docus.server.gdszyzh.service.ReportCollectService;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author YongBin Wen
* @date 2026/4/7 16:25
*/
@Slf4j
@Component
public class PacsCollectJob {
@Autowired
private ReportCollectService reportCollectService;
@XxlJob("GdSzyZhPacsCollectJob")
public void gdSzyZhPacsCollectJob() throws Exception {
log.info("广东省中医珠海PACS采集任务开始");
try {
// todo wyb 需要采集的患者
List<String> patientIds = new ArrayList<>();
reportCollectService.collectPacs(patientIds);
log.info("广东省中医珠海PACS采集任务结束");
} catch (Exception e) {
log.error("广东省中医珠海PACS采集任务出现异常" + e.getMessage(), e);
}
}
}

@ -0,0 +1,19 @@
package com.docus.server.gdszyzh.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.docus.server.gdszyzh.entity.GdSzyZhReportDataView;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
*
* @author YongBin Wen
* @date 2026/4/8 9:00
*/
@DS("gdszyzh-ecg")
@Mapper
public interface GdSzyZhEcgReportDataViewMapper {
List<GdSzyZhReportDataView> getByJzhs(@Param("jzhs") List<String> jzhs);
}

@ -0,0 +1,20 @@
package com.docus.server.gdszyzh.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.docus.server.gdszyzh.entity.GdSzyZhReportDataView;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
*
* @author YongBin Wen
* @date 2026/4/8 9:00
*/
@DS("gdszyzh-icu")
@Mapper
public interface GdSzyZhIcuReportDataViewMapper {
List<GdSzyZhReportDataView> getByInpatientNo(@Param("inpatientNo") String inpatientNo);
}

@ -0,0 +1,19 @@
package com.docus.server.gdszyzh.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.docus.server.gdszyzh.entity.GdSzyZhReportDataView;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
*
* @author YongBin Wen
* @date 2026/4/8 9:00
*/
@DS("gdszyzh-shouma")
@Mapper
public interface GdSzyZhShouMaReportDataViewMapper {
List<GdSzyZhReportDataView> getByJzhs(@Param("jzhs") List<String> jzhs);
}

@ -9,8 +9,29 @@ import java.util.List;
*/ */
public interface ReportCollectService { public interface ReportCollectService {
/** /**
* PACS * PACS
* @param patientIds * @param patientIds
*/ */
void collectPacs(List<String> patientIds); void collectPacs(List<String> patientIds);
/**
* LIS
* @param patientIds
*/
void collectLis(List<String> patientIds);
/**
*
* @param patientIds
*/
void collectEcg(List<String> patientIds);
/**
*
* @param patientIds
*/
void collectIcu(List<String> patientIds);
/**
*
* @param patientIds
*/
void collectShouMa(List<String> patientIds);
} }

@ -2,8 +2,13 @@ package com.docus.server.gdszyzh.service.impl;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.docus.core.util.Func; import com.docus.core.util.Func;
import com.docus.server.archive.entity.AfCollectPatientLog;
import com.docus.server.archive.entity.TBasic; import com.docus.server.archive.entity.TBasic;
import com.docus.server.archive.mapper.TBasicMapper; import com.docus.server.archive.mapper.TBasicMapper;
import com.docus.server.gdszyzh.entity.GdSzyZhReportDataView;
import com.docus.server.gdszyzh.mapper.GdSzyZhEcgReportDataViewMapper;
import com.docus.server.gdszyzh.mapper.GdSzyZhIcuReportDataViewMapper;
import com.docus.server.gdszyzh.mapper.GdSzyZhShouMaReportDataViewMapper;
import com.docus.server.gdszyzh.service.ReportCollectService; import com.docus.server.gdszyzh.service.ReportCollectService;
import com.docus.server.rpc.DownPlatformService; import com.docus.server.rpc.DownPlatformService;
import com.docus.server.rpc.GdSzyZhReportService; import com.docus.server.rpc.GdSzyZhReportService;
@ -18,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -37,6 +43,12 @@ public class ReportCollectServiceImpl implements ReportCollectService {
private TBasicMapper tBasicMapper; private TBasicMapper tBasicMapper;
@Autowired @Autowired
private DownPlatformService downPlatformService; private DownPlatformService downPlatformService;
@Autowired
private GdSzyZhEcgReportDataViewMapper ecgReportDataViewMapper;
@Autowired
private GdSzyZhIcuReportDataViewMapper icuReportDataViewMapper;
@Autowired
private GdSzyZhShouMaReportDataViewMapper shouMaReportDataViewMapper;
@Override @Override
public void collectPacs(List<String> patientIds) { public void collectPacs(List<String> patientIds) {
@ -46,6 +58,39 @@ public class ReportCollectServiceImpl implements ReportCollectService {
} }
} }
@Override
public void collectLis(List<String> patientIds) {
List<TBasic> basicList = tBasicMapper.getTbasicByPatientIds(patientIds);
for (TBasic basic : basicList) {
collectLis(basic);
}
}
@Override
public void collectEcg(List<String> patientIds) {
List<TBasic> basicList = tBasicMapper.getTbasicByPatientIds(patientIds);
for (TBasic basic : basicList) {
collectEcg(basic);
}
}
@Override
public void collectShouMa(List<String> patientIds) {
List<TBasic> basicList = tBasicMapper.getTbasicByPatientIds(patientIds);
for (TBasic basic : basicList) {
collectShouMa(basic);
}
}
@Override
public void collectIcu(List<String> patientIds) {
List<TBasic> basicList = tBasicMapper.getTbasicByPatientIds(patientIds);
for (TBasic basic : basicList) {
collectIcu(basic);
}
}
private void collectPacs(TBasic basic) { private void collectPacs(TBasic basic) {
Date admissDate = basic.getAdmissDate(); Date admissDate = basic.getAdmissDate();
Date disDate = basic.getDisDate(); Date disDate = basic.getDisDate();
@ -97,9 +142,217 @@ public class ReportCollectServiceImpl implements ReportCollectService {
reportDownDto.setAssortid(assortId); reportDownDto.setAssortid(assortId);
reportDownDto.setScanfiles(scanFiles); reportDownDto.setScanfiles(scanFiles);
downPlatformService.report(reportDownDto); downPlatformService.report(reportDownDto);
long count = scanFiles.stream().map(ReportDownScanFileDto::getSerialnum).distinct().count();
saveOrUpdateCollectLog(patientId, collectorId, (int) count);
} }
public static void main(String[] args) {
private void collectLis(TBasic basic) {
Date admissDate = basic.getAdmissDate();
Date disDate = basic.getDisDate();
String jzh = basic.getJzh();
String empId = basic.getEmpId();
String patientId = basic.getPatientId();
if (Func.isBlank(empId) || Func.isEmpty(admissDate) || Func.isEmpty(disDate)) {
log.error("采集LIS报告患者{},住院流水号:{},入院、出院时间empId有空数据无法采集", basic.getInpatientNo(), jzh);
return;
}
String beginDate = Func.formatDate(admissDate);
String endDate = Func.formatDate(disDate);
GdSzyZhReportListDto lisList = gdSzyZhReportService.lisList(empId, jzh, beginDate, endDate);
List<GdSzyZhReportListDto.Report> reportList = lisList.getReportList();
reportList = reportList.stream()
.sorted(Comparator.comparing(GdSzyZhReportListDto.Report::getReportClass)
.thenComparing(GdSzyZhReportListDto.Report::getReportTime))
.collect(Collectors.toList());
int sort = 0;
List<ReportDownScanFileDto> scanFiles = new ArrayList<>();
for (GdSzyZhReportListDto.Report report : reportList) {
ReportDownScanFileDto reportDownScanFileDto = new ReportDownScanFileDto();
reportDownScanFileDto.setDownurl(report.getReporPath());
reportDownScanFileDto.setFiletitle(report.getReportTitle());
reportDownScanFileDto.setSerialnum(report.getReportNo());
reportDownScanFileDto.setFilesource(1);
reportDownScanFileDto.setFiletype(1);
reportDownScanFileDto.setFilestoragetype(1);
reportDownScanFileDto.setTaskid(-1L);
reportDownScanFileDto.setSort(++sort);
}
final String configPath = "data-config";
final String configName = "gdszyzh-collect-config";
TableJsonRead jsonReader = new TableJsonRead();
JSONObject configOjb = jsonReader.Read(configPath, configName, JSONObject.class);
JSONObject lisWsConfig = configOjb.getJSONObject("LIS");
String collectorId = lisWsConfig.getString("collectorId");
String assortId = lisWsConfig.getString("assortId");
ReportDownPatientDto patient = new ReportDownPatientDto();
patient.setPatientid(patientId);
ReportDownDto reportDownDto = new ReportDownDto();
reportDownDto.setCollectorid(collectorId);
reportDownDto.setIp("");
reportDownDto.setPatient(patient);
reportDownDto.setAssortid(assortId);
reportDownDto.setScanfiles(scanFiles);
downPlatformService.report(reportDownDto);
long count = scanFiles.stream().map(ReportDownScanFileDto::getSerialnum).distinct().count();
saveOrUpdateCollectLog(patientId, collectorId, (int) count);
}
private void collectEcg(TBasic basic) {
String jzh = basic.getJzh();
String patientId = basic.getPatientId();
List<GdSzyZhReportDataView> dataViewList = ecgReportDataViewMapper.getByJzhs(Collections.singletonList(jzh));
dataViewList = dataViewList.stream()
.sorted(Comparator.comparing(GdSzyZhReportDataView::getReportClass)
.thenComparing(GdSzyZhReportDataView::getReportTime))
.collect(Collectors.toList());
int sort = 0;
List<ReportDownScanFileDto> scanFiles = new ArrayList<>();
for (GdSzyZhReportDataView dataView : dataViewList) {
ReportDownScanFileDto reportDownScanFileDto = new ReportDownScanFileDto();
reportDownScanFileDto.setDownurl(dataView.getReportUrl());
reportDownScanFileDto.setFiletitle(dataView.getReportTitle());
reportDownScanFileDto.setSerialnum(dataView.getReportNo());
reportDownScanFileDto.setFilesource(1);
reportDownScanFileDto.setFiletype(1);
reportDownScanFileDto.setFilestoragetype(1);
reportDownScanFileDto.setTaskid(-1L);
reportDownScanFileDto.setSort(++sort);
}
final String configPath = "data-config";
final String configName = "gdszyzh-collect-config";
TableJsonRead jsonReader = new TableJsonRead();
JSONObject configOjb = jsonReader.Read(configPath, configName, JSONObject.class);
JSONObject lisWsConfig = configOjb.getJSONObject("ECG");
String collectorId = lisWsConfig.getString("collectorId");
String assortId = lisWsConfig.getString("assortId");
ReportDownPatientDto patient = new ReportDownPatientDto();
patient.setPatientid(patientId);
ReportDownDto reportDownDto = new ReportDownDto();
reportDownDto.setCollectorid(collectorId);
reportDownDto.setIp("");
reportDownDto.setPatient(patient);
reportDownDto.setAssortid(assortId);
reportDownDto.setScanfiles(scanFiles);
downPlatformService.report(reportDownDto);
long count = scanFiles.stream().map(ReportDownScanFileDto::getSerialnum).distinct().count();
saveOrUpdateCollectLog(patientId, collectorId, (int) count);
}
private void collectShouMa(TBasic basic) {
String jzh = basic.getJzh();
String patientId = basic.getPatientId();
List<GdSzyZhReportDataView> dataViewList = shouMaReportDataViewMapper.getByJzhs(Collections.singletonList(jzh));
dataViewList = dataViewList.stream()
.sorted(Comparator.comparing(GdSzyZhReportDataView::getReportClass)
.thenComparing(GdSzyZhReportDataView::getReportTime))
.collect(Collectors.toList());
int sort = 0;
List<ReportDownScanFileDto> scanFiles = new ArrayList<>();
for (GdSzyZhReportDataView dataView : dataViewList) {
ReportDownScanFileDto reportDownScanFileDto = new ReportDownScanFileDto();
reportDownScanFileDto.setDownurl(dataView.getReportUrl());
reportDownScanFileDto.setFiletitle(dataView.getReportTitle());
reportDownScanFileDto.setSerialnum(dataView.getReportNo());
reportDownScanFileDto.setFilesource(1);
reportDownScanFileDto.setFiletype(1);
reportDownScanFileDto.setFilestoragetype(1);
reportDownScanFileDto.setTaskid(-1L);
reportDownScanFileDto.setSort(++sort);
}
final String configPath = "data-config";
final String configName = "gdszyzh-collect-config";
TableJsonRead jsonReader = new TableJsonRead();
JSONObject configOjb = jsonReader.Read(configPath, configName, JSONObject.class);
JSONObject lisWsConfig = configOjb.getJSONObject("ShouMa");
String collectorId = lisWsConfig.getString("collectorId");
String assortId = lisWsConfig.getString("assortId");
ReportDownPatientDto patient = new ReportDownPatientDto();
patient.setPatientid(patientId);
ReportDownDto reportDownDto = new ReportDownDto();
reportDownDto.setCollectorid(collectorId);
reportDownDto.setIp("");
reportDownDto.setPatient(patient);
reportDownDto.setAssortid(assortId);
reportDownDto.setScanfiles(scanFiles);
downPlatformService.report(reportDownDto);
long count = scanFiles.stream().map(ReportDownScanFileDto::getSerialnum).distinct().count();
saveOrUpdateCollectLog(patientId, collectorId, (int) count);
}
private void collectIcu(TBasic basic) {
String patientId = basic.getPatientId();
Integer admissTimes = basic.getAdmissTimes();
List<GdSzyZhReportDataView> dataViewList = icuReportDataViewMapper.getByInpatientNo(basic.getInpatientNo());
dataViewList = dataViewList.stream()
.filter(d -> admissTimes.equals(d.getAdmissTimes()))
.sorted(Comparator.comparing(GdSzyZhReportDataView::getReportClass)
.thenComparing(GdSzyZhReportDataView::getReportTime))
.collect(Collectors.toList());
int sort = 0;
List<ReportDownScanFileDto> scanFiles = new ArrayList<>();
for (GdSzyZhReportDataView dataView : dataViewList) {
String reportUrl = dataView.getReportUrl();
// 替换本地地址为ftp代理地址
reportUrl = reportUrl.replace("\\", "/")
.replace("D:/DocareDocArchived", "ftp://10.0.57.90:21");
ReportDownScanFileDto reportDownScanFileDto = new ReportDownScanFileDto();
reportDownScanFileDto.setDownurl(reportUrl);
reportDownScanFileDto.setFiletitle(dataView.getReportTitle());
reportDownScanFileDto.setSerialnum(dataView.getReportNo());
reportDownScanFileDto.setFilesource(1);
reportDownScanFileDto.setFiletype(1);
reportDownScanFileDto.setFilestoragetype(1);
reportDownScanFileDto.setTaskid(-1L);
reportDownScanFileDto.setSort(++sort);
}
final String configPath = "data-config";
final String configName = "gdszyzh-collect-config";
TableJsonRead jsonReader = new TableJsonRead();
JSONObject configOjb = jsonReader.Read(configPath, configName, JSONObject.class);
JSONObject lisWsConfig = configOjb.getJSONObject("ICU");
String collectorId = lisWsConfig.getString("collectorId");
String assortId = lisWsConfig.getString("assortId");
ReportDownPatientDto patient = new ReportDownPatientDto();
patient.setPatientid(patientId);
ReportDownDto reportDownDto = new ReportDownDto();
reportDownDto.setCollectorid(collectorId);
reportDownDto.setIp("");
reportDownDto.setPatient(patient);
reportDownDto.setAssortid(assortId);
reportDownDto.setScanfiles(scanFiles);
downPlatformService.report(reportDownDto);
long count = scanFiles.stream().map(ReportDownScanFileDto::getSerialnum).distinct().count();
saveOrUpdateCollectLog(patientId, collectorId, (int) count);
}
private void saveOrUpdateCollectLog(String patientId, String collectorId, int fileCount) {
AfCollectPatientLog collectPatientLog = new AfCollectPatientLog();
collectPatientLog.setPatientId(patientId);
collectPatientLog.setCollectId(collectorId);
collectPatientLog.setFileCount(fileCount);
collectPatientLog.setLastCollectTime(new Date());
tBasicMapper.saveOrUpdateCollectLog(collectPatientLog);
}
public static void main(String[] args) {
String path = "D:\\DocareDocArchived\\24315539643249459211\\CARE_DOC_GDZY_PDF\\5d7b59066b804affb61d74bfe399c6ce_24315539643249459211_1.PDF";
path = path.replace("\\", "/")
.replace("D:/DocareDocArchived", "ftp://10.0.57.90:21");
System.out.println(path);
} }
} }

@ -0,0 +1,12 @@
package com.docus.server.gdszyzh.util;
/**
*
* @author YongBin Wen
* @date 2026/4/8 12:56
*/
public class IcuHtmlPrinter {
}

@ -0,0 +1,12 @@
package com.docus.server.gdszyzh.util;
import lombok.Data;
/**
* @author wyb
*/
@Data
public class PrintConfig {
private Long waitTimeMs = 1000L;
}

@ -0,0 +1,107 @@
package com.docus.server.gdszyzh.util;
import io.webfolder.cdp.Launcher;
import io.webfolder.cdp.command.Page;
import io.webfolder.cdp.session.Session;
import io.webfolder.cdp.session.SessionFactory;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
public class WebPagePrinter implements AutoCloseable {
private Launcher launcher;
private SessionFactory factory;
private Session session;
/**
* Chrome
*/
public void init() {
// 启动 Chrome传入 headless 和 disable-gpu 参数 [^51^]
// String chromePath="C:\\Users\\Lenovo\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe";
String chromePath = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";
List<String> args = Arrays.asList("--headless", "--disable-gpu");
this.launcher = new Launcher();
this.factory = launcher.launch(chromePath, args);
}
/**
* PDF - 使 CDP4J Page.printToPDF() [^51^]
*/
public byte[] printToPdf(String url, PrintConfig config,
Boolean landscape,
Boolean displayHeaderFooter,
Boolean printBackground,
Double scale,
Double paperWidth,
Double paperHeight,
Double marginTop,
Double marginBottom,
Double marginLeft,
Double marginRight,
String pageRanges,
Boolean ignoreInvalidPageRanges,
String headerTemplate,
String footerTemplate,
Boolean preferCSSPageSize
) throws IOException {
if (factory == null) {
init();
}
// 创建浏览器上下文(可选,用于隔离)
String context = factory.createBrowserContext();
try (Session session = factory.create(context)) {
this.session = session;
// 导航到页面
session.navigate(url);
session.waitDocumentReady();
// 额外等待确保内容加载
try {
Thread.sleep(config.getWaitTimeMs());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
// 获取 Page 命令接口
Page page = session.getCommand().getPage();
// 执行打印 - 无参方法,返回 byte[] [^51^]
byte[] pdfBytes = page.printToPDF(landscape,
displayHeaderFooter,
printBackground,
scale,
paperWidth,
paperHeight,
marginTop,
marginBottom,
marginLeft,
marginRight,
pageRanges,
ignoreInvalidPageRanges,
headerTemplate,
footerTemplate,
preferCSSPageSize);
return pdfBytes;
}
}
@Override
public void close() {
if (factory != null) {
factory.close();
}
}
}

@ -23,10 +23,12 @@ public interface GdSzyZhReportService {
/** /**
* LIS * LIS
* @param beginDate yyyy-MM-dd HH:mm:ss
* @param endDate yyyy-MM-dd HH:mm:ss
*/ */
GdSzyZhReportListDto lisList(String empId,String jzh,String beginDate,String endDate); GdSzyZhReportListDto lisList(String empId,String jzh,String beginDate,String endDate);
/** /**
* LIS * LIS, 使
*/ */
GdSzyZhReportDetailDto lisDetail(String sampleNo); Object lisDetail(String sampleNo);
} }

@ -27,5 +27,7 @@ public class GdSzyZhReportListDto {
private String reportClass; private String reportClass;
@ApiModelProperty("报告时间") @ApiModelProperty("报告时间")
private Date reportTime; private Date reportTime;
@ApiModelProperty("报告地址")
private String reporPath;
} }
} }

@ -128,7 +128,7 @@ public class GdSzyZhReportServiceImpl implements GdSzyZhReportService {
report.setReportNo(examNoNode.getTextContent()); report.setReportNo(examNoNode.getTextContent());
report.setReportTitle(examItemNameNode.getTextContent()); report.setReportTitle(examItemNameNode.getTextContent());
report.setReportClass(examClassNode.getTextContent()); report.setReportClass(examClassNode.getTextContent());
report.setReportTime(Func.parseDate(examDateTime,"yyyy-MM-dd HH:mm:ss")); report.setReportTime(Func.parseDate(examDateTime, "yyyy-MM-dd HH:mm:ss"));
reportList.add(report); reportList.add(report);
} }
GdSzyZhReportListDto dto = new GdSzyZhReportListDto(); GdSzyZhReportListDto dto = new GdSzyZhReportListDto();
@ -136,7 +136,6 @@ public class GdSzyZhReportServiceImpl implements GdSzyZhReportService {
return dto; return dto;
} }
private static String pacsDetailParam(String examNo) { private static String pacsDetailParam(String examNo) {
return "<ESBEntry>" + return "<ESBEntry>" +
"<AccessControl>" + "<AccessControl>" +
@ -189,13 +188,108 @@ public class GdSzyZhReportServiceImpl implements GdSzyZhReportService {
@Override @Override
public GdSzyZhReportListDto lisList(String empId, String jzh, String beginDate, String endDate) { public GdSzyZhReportListDto lisList(String empId, String jzh, String beginDate, String endDate) {
// TODO wyb 接口未测试 TableJsonRead jsonReader = new TableJsonRead();
return null; JSONObject configOjb = jsonReader.Read(configPath, configName, JSONObject.class);
JSONObject pacsWsConfig = configOjb.getJSONObject("LIS");
String wsUrl = pacsWsConfig.getString("listUrl");
String namespaceUri = pacsWsConfig.getString("listNamespaceUri");
String method = pacsWsConfig.getString("listOperationName");
String headParam = "<Root>" +
"<MethodCode>201_Q_WS_JYBGLBCX</MethodCode>" +
"<ProductCode>HIS</ProductCode>" +
"<HospitalCode>4</HospitalCode>" +
"<Ticket>dd1f95caf9b367af90fb2849e791dfd3</Ticket>" +
"<DataFormat>XML</DataFormat>" +
"</Root>";
String bodyParam = lisListParam(empId, jzh, beginDate, endDate);
String[] params = {headParam, bodyParam};
Object resultObj = JaxWsDynamicClientUtil.send(wsUrl, namespaceUri, method, params);
String result = String.valueOf(resultObj);
log.info("LIS查询报告列表地址{},方法:{},头参数:{},主体参数:{} 调用成功,得到结果为:{}", wsUrl, method, headParam, bodyParam, result);
return parseLisListResult(result);
} }
@Override @Override
public GdSzyZhReportDetailDto lisDetail(String sampleNo) { public Object lisDetail(String sampleNo) {
// TODO wyb 接口未测试
TableJsonRead jsonReader = new TableJsonRead();
JSONObject configOjb = jsonReader.Read(configPath, configName, JSONObject.class);
JSONObject pacsWsConfig = configOjb.getJSONObject("LIS");
String wsUrl = pacsWsConfig.getString("detailUrl");
String namespaceUri = pacsWsConfig.getString("detailNamespaceUri");
String method = pacsWsConfig.getString("detailOperationName");
String headParam = "<Root>" +
"<MethodCode>201_Q_WS_JYBGJGMXCX</MethodCode>" +
"<ProductCode>HIS</ProductCode>" +
"<HospitalCode>4</HospitalCode>" +
"<Ticket>dd1f95caf9b367af90fb2849e791dfd3</Ticket>" +
"<DataFormat>XML</DataFormat>" +
"</Root>";
String bodyParam = lisDetailParam(sampleNo);
String[] params = {headParam, bodyParam};
Object resultObj = JaxWsDynamicClientUtil.send(wsUrl, namespaceUri, method, params);
String result = String.valueOf(resultObj);
log.info("LIS查询报告详情地址{},方法:{},头参数:{},主体参数:{} 调用成功,得到结果为:{}", wsUrl, method, headParam, bodyParam, result);
return parsePacsDetailResult(result);
}
private static String lisListParam(String empId, String jzh, String beginDate, String endDate) {
return "<Request>" +
"<Msg>" +
"<OUTHOSP_INDEX_NO />" +
"<OUTHOSP_NO />" +
"<INHOSP_INDEX_NO />" +
"<INHOSP_NO />" +
"<EMPI_ID>" + empId + "</EMPI_ID>" +
"<TEST_PAT_SOURCE_CODE />" +
"<BEGIN_DATE>" + beginDate + "</BEGIN_DATE>" +
"<END_DATE>" + endDate + "</END_DATE>" +
"</Msg>" +
"</Request>";
}
private static GdSzyZhReportListDto parseLisListResult(String result) {
XmlUtil xmlUtil = XmlUtil.of(result);
NodeList nodeList = xmlUtil.getNodeList("/Response/MsgInfo/Msg/ReportInfo");
int length = nodeList.getLength();
List<GdSzyZhReportListDto.Report> reportList = new ArrayList<>();
for (int i = 1; i <= length; i++) {
Node sampleNoNode = xmlUtil.getNode("/Response/MsgInfo/Msg/ReportInfo[" + i + "]/SAMPLE_NO");
Node reportPdfUrlNode = xmlUtil.getNode("/Response/MsgInfo/Msg/ReportInfo[" + i + "]/REPORT_PDF_URL");
Node testCategNameNode = xmlUtil.getNode("/Response/MsgInfo/Msg/ReportInfo[" + i + "]/TEST_CATEG_NAME");
Node sampleTypeCodeNode = xmlUtil.getNode("/Response/MsgInfo/Msg/ReportInfo[" + i + "]/SAMPLE_TYPE_CODE");
Node reportApprovalDatetimeNode = xmlUtil.getNode("/Response/MsgInfo/Msg/ReportInfo[" + i + "]/REPORT_APPROVAL_DATETIME");
GdSzyZhReportListDto.Report report = new GdSzyZhReportListDto.Report();
report.setReportNo(sampleNoNode.getTextContent());
report.setReporPath(reportPdfUrlNode.getTextContent());
report.setReportClass(sampleTypeCodeNode.getTextContent());
report.setReportTitle(testCategNameNode.getTextContent());
report.setReportTime(Func.parseDate(reportApprovalDatetimeNode.getTextContent(), "yyyy-MM-dd HH:mm:ss"));
reportList.add(report);
}
GdSzyZhReportListDto dto = new GdSzyZhReportListDto();
dto.setReportList(reportList);
return dto;
}
private static String lisDetailParam(String sampleNo) {
return "<Request>" +
"<Msg>" +
"<SAMPLE_NO>" + sampleNo + "</SAMPLE_NO>" +
"</Msg>" +
"</Request>";
}
private static Object parseLisDetailResult(String result) {
// 暂未实现
return null; return null;
} }
} }

@ -5,7 +5,7 @@ import com.docus.infrastructure.web.api.CommonResult;
import com.docus.server.archive.entity.TBasic; import com.docus.server.archive.entity.TBasic;
import com.docus.server.archive.mapper.TBasicMapper; import com.docus.server.archive.mapper.TBasicMapper;
import com.docus.server.rpc.YdZyyPacsService; import com.docus.server.rpc.YdZyyPacsService;
import com.docus.server.ydzyy.job.PacsCollectJob; import com.docus.server.ydzyy.job.YdZyyPacsCollectJob;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -23,7 +23,7 @@ public class ApiController {
@Autowired @Autowired
private YdZyyPacsService pacsService; private YdZyyPacsService pacsService;
@Autowired @Autowired
private PacsCollectJob pacsCollectJob; private YdZyyPacsCollectJob pacsCollectJob;
@Autowired @Autowired
private TBasicMapper tBasicMapper; private TBasicMapper tBasicMapper;

@ -36,7 +36,7 @@ import java.util.stream.Collectors;
*/ */
@Component @Component
@Slf4j @Slf4j
public class PacsCollectJob { public class YdZyyPacsCollectJob {
@Resource @Resource
private TBasicMapper tBasicMapper; private TBasicMapper tBasicMapper;

@ -122,6 +122,73 @@ spring:
test-on-borrow: false test-on-borrow: false
test-on-return: false test-on-return: false
validation-query: select 1 validation-query: select 1
gdszyzh-ecg:
url: jdbc:sqlserver://172.16.99.99:1433;DatabaseName=CardioScanServer
username: dmsuser
password: dmsecg@2020
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
type: com.alibaba.druid.pool.DruidDataSource
# 初始化配置
initial-size: 3
# 最小连接数
min-idle: 3
# 最大连接数
max-active: 10
# 获取连接超 时时间
max-wait: 5000
# 连接有效性检测时间
time-between-eviction-runs-millis: 90000
# 最大空闲时间
min-evictable-idle-time-millis: 1800000
test-while-idle: true
test-on-borrow: false
test-on-return: false
validation-query: select 1
gdszyzh-shouma:
url: jdbc:oracle:thin:@//172.16.99.197:1521/docare
username: medcomm
password: medcomm
driver-class-name: oracle.jdbc.driver.OracleDriver
type: com.alibaba.druid.pool.DruidDataSource
# 初始化配置
initial-size: 1
# 最小连接数
min-idle: 1
# 最大连接数
max-active: 5
# 获取连接超 时时间
max-wait: 5000
# 连接有效性检测时间
time-between-eviction-runs-millis: 90000
# 最大空闲时间
min-evictable-idle-time-millis: 1800000
test-while-idle: true
test-on-borrow: false
test-on-return: false
validation-query: select 1 from dual
gdszyzh-icu:
url: jdbc:oracle:thin:@//10.0.57.90:1521/docare
username: medcomm
password: medcomm
driver-class-name: oracle.jdbc.driver.OracleDriver
type: com.alibaba.druid.pool.DruidDataSource
# 初始化配置
initial-size: 1
# 最小连接数
min-idle: 1
# 最大连接数
max-active: 5
# 获取连接超 时时间
max-wait: 5000
# 连接有效性检测时间
time-between-eviction-runs-millis: 90000
# 最大空闲时间
min-evictable-idle-time-millis: 1800000
test-while-idle: true
test-on-borrow: false
test-on-return: false
validation-query: select 1 from dual
redis: redis:
host: redis.docus.cn host: redis.docus.cn
password: JSdocus@702 password: JSdocus@702

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.docus.server.gdszyzh.mapper.GdSzyZhEcgReportDataViewMapper">
<select id="getByJzhs" resultType="com.docus.server.gdszyzh.entity.GdSzyZhReportDataView">
select
fileId as reportNo,
fileName as reportTitle,
fileModule as reportClass,
fileTime as reportTime,
filePath as reportUrl,
jzh
from V_WZJ_GD
where
jzh in
<foreach collection="jzhs" open="(" close=")" separator="," item="jzh">
#{jzh}
</foreach>
</select>
</mapper>

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.docus.server.gdszyzh.mapper.GdSzyZhIcuReportDataViewMapper">
<select id="getByInpatientNo" resultType="com.docus.server.gdszyzh.entity.GdSzyZhReportDataView">
select
FILEID as reportNo,
FILENAME as reportTitle,
FILEMODOULENAME as reportClass,
FILETIME as reportTime,
FILEPATH as reportUrl,
JZH,
ZYH as inpatientNo,
ZYCS as admissTimes
from V_DOCUMENT_PDF
where ZYH = #{inpatientNo}
</select>
</mapper>

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.docus.server.gdszyzh.mapper.GdSzyZhShouMaReportDataViewMapper">
<select id="getByJzhs" resultType="com.docus.server.gdszyzh.entity.GdSzyZhReportDataView">
SELECT
EMR_FILE_NAME as reportNo,
FILENAME as reportTitle,
MR_SUB_CLASS as reportClass,
FILETIME as reportTime,
FILEPATH as reportUrl,
PATIENT_ID AS jzh
FROM
v_anes_pdf
WHERE PATIENT_ID in
<foreach collection="jzhs" open="(" close=")" separator="," item="jzh">
#{jzh}
</foreach>
</select>
</mapper>

@ -10,6 +10,15 @@
#{task.syncTime},#{task.c1},#{task.c2},#{task.c3},#{task.c4}, #{task.syncTime},#{task.c1},#{task.c2},#{task.c3},#{task.c4},
#{task.c5},#{task.c6},#{task.c7},#{task.t1},#{task.t2},#{task.t3},#{task.createTime}) #{task.c5},#{task.c6},#{task.c7},#{task.t1},#{task.t2},#{task.t3},#{task.createTime})
</insert> </insert>
<insert id="saveOrUpdateCollectLog">
INSERT INTO docus_archivefile.af_collect_patient_log
(patient_id, collect_id, last_collect_time, file_count)
VALUES
(#{cpLog.patientId}, #{cpLog.collectId}, #{cpLog.lastCollectTime}, #{cpLog.fileCount})
ON DUPLICATE KEY UPDATE
last_collect_time = VALUES(last_collect_time),
file_count = VALUES(file_count)
</insert>
<update id="updateTaskById"> <update id="updateTaskById">
update docus_archivefile.af_collect_task set sync_time=#{task.syncTime}, C2=#{task.c2}, C3=#{task.c3}, C4=#{task.c4}, C5=#{task.c5}, update docus_archivefile.af_collect_task set sync_time=#{task.syncTime}, C2=#{task.c2}, C3=#{task.c3}, C4=#{task.c4}, C5=#{task.c5},
C6=#{task.c6}, C7=#{task.c7},T1=#{task.t1}, T2=#{task.t2}, T3=#{task.t3} C6=#{task.c6}, C7=#{task.c7},T1=#{task.t1}, T2=#{task.t2}, T3=#{task.t3}
@ -42,6 +51,7 @@
SET remark = #{remark},end_time=now() SET remark = #{remark},end_time=now()
WHERE id = #{id} WHERE id = #{id}
</update> </update>
<select id="getTbasicByReportTimeAndInpNoOrIdCard" resultType="com.docus.server.archive.entity.TBasic"> <select id="getTbasicByReportTimeAndInpNoOrIdCard" resultType="com.docus.server.archive.entity.TBasic">
select select
patient_id as patientId, patient_id as patientId,
@ -65,6 +75,7 @@
select select
patient_id as patientId, patient_id as patientId,
inpatient_no as inpatientNo, inpatient_no as inpatientNo,
admiss_times as admissTimes,
name, name,
admiss_date as admissDate, admiss_date as admissDate,
dis_date as disDate, dis_date as disDate,
@ -146,5 +157,32 @@ and patient_id not in(
left join docus_medicalrecord.sm_storage_state state on state.patient_id = tb.patient_id left join docus_medicalrecord.sm_storage_state state on state.patient_id = tb.patient_id
where tb.patient_id = #{patientId} where tb.patient_id = #{patientId}
</select> </select>
<select id="getCollectLog" resultType="com.docus.server.archive.entity.AfCollectPatientLog">
select patient_id, collect_id, last_collect_time, file_count
from docus_archivefile.af_collect_patient_log
where patient_id = #{patientId}
and collect_id = #{collectorId}
<if test="offsetTime != null and offsetTime != ''">
and last_collect_time &lt; #{offsetTime}
</if>
</select>
<select id="getPatientIdsByDisDate" resultType="java.lang.String">
select tb.patient_id
from docus_medicalrecord.t_basic tb
where dis_date between #{disDateStart} and #{disDateEnd}
and file_source = 1
</select>
<select id="getNoCollectPatientIds" resultType="java.lang.String">
select patient_id
from docus_medicalrecord.t_basic tb
where
dis_date > '2020-01-01 00:00:00'
and file_source = 1
and not exists (
SELECT patient_id,collect_id
FROM docus_archivefile.af_collect_patient_log acpl
where acpl.patient_id = tb.patient_id and acpl.collect_id = #{collectorId}
)
</select>
</mapper> </mapper>

Loading…
Cancel
Save