feat:广东省中医珠海,添加PACS采集逻辑

master
WenYongbin 2 weeks ago
parent b54954f810
commit 1827da2efc

@ -0,0 +1,39 @@
{
"PACS": {
"collectorId": "PACS",
"assortId": "PACS-ASSORT",
"listUrl": "",
"listOperationName": "",
"listNamespaceUri": "",
"detailUrl": "",
"detailOperationName": "",
"detailNamespaceUri": "",
"filterReport": ""
},
"LIS": {
"collectorId": "",
"assortId": "",
"listUrl": "",
"listOperationName": "",
"listNamespaceUri": "",
"detailUrl": "",
"detailOperationName": "",
"detailNamespaceUri": "",
"filterReport": ""
},
"DyECG": {
"collectorId": "",
"assortId": "",
"filterReport": ""
},
"ICU": {
"collectorId": "",
"assortId": "",
"filterReport": ""
},
"MaZui": {
"collectorId": "",
"assortId": "",
"filterReport": ""
}
}

@ -0,0 +1,38 @@
package com.docus.server.gdszyzh.controller;
import com.docus.core.util.Func;
import com.docus.infrastructure.web.api.CommonResult;
import com.docus.server.gdszyzh.service.ReportCollectService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import jline.internal.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
*
* @author YongBin Wen
* @date 2026/4/7 16:35
*/
@RestController
@RequestMapping("/gdszyzh")
@Api(tags = "广东省中医珠海文件接口")
public class ReportCollectController {
@Autowired
private ReportCollectService reportCollectService;
@PostMapping("/collect/pacs")
@ApiOperation("采集PACS报告")
public CommonResult<String> collectPacs(@RequestBody List<String> patientIds) {
if (Func.isNotEmpty(patientIds)) {
Log.info("PACS报告采集接口参数{}", patientIds);
reportCollectService.collectPacs(patientIds);
}
return CommonResult.success("采集完成!");
}
}

@ -0,0 +1,25 @@
package com.docus.server.gdszyzh.entity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
*
* @author YongBin Wen
* @date 2026/4/7 17:05
*/
@Data
public class ReportDataView {
@ApiModelProperty("报告号")
private String reportNo;
@ApiModelProperty("报告标题")
private String reportTitle;
@ApiModelProperty("报告分类")
private String reportClass;
@ApiModelProperty("报告时间")
private Date reportTime;
@ApiModelProperty("报告地址")
private String reportUrl;
}

@ -0,0 +1,36 @@
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,16 @@
package com.docus.server.gdszyzh.service;
import java.util.List;
/**
*
* @author YongBin Wen
* @date 2026/4/7 16:28
*/
public interface ReportCollectService {
/**
* PACS
* @param patientIds
*/
void collectPacs(List<String> patientIds);
}

@ -0,0 +1,105 @@
package com.docus.server.gdszyzh.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.docus.core.util.Func;
import com.docus.server.archive.entity.TBasic;
import com.docus.server.archive.mapper.TBasicMapper;
import com.docus.server.gdszyzh.service.ReportCollectService;
import com.docus.server.rpc.DownPlatformService;
import com.docus.server.rpc.GdSzyZhReportService;
import com.docus.server.rpc.dto.GdSzyZhReportDetailDto;
import com.docus.server.rpc.dto.GdSzyZhReportListDto;
import com.docus.server.rpc.dto.ReportDownDto;
import com.docus.server.rpc.dto.ReportDownPatientDto;
import com.docus.server.rpc.dto.ReportDownScanFileDto;
import com.docus.server.util.TableJsonRead;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* @author YongBin Wen
* @date 2026/4/7 16:28
*/
@Slf4j
@Service
public class ReportCollectServiceImpl implements ReportCollectService {
@Autowired
private GdSzyZhReportService gdSzyZhReportService;
@Autowired
private TBasicMapper tBasicMapper;
@Autowired
private DownPlatformService downPlatformService;
@Override
public void collectPacs(List<String> patientIds) {
List<TBasic> basicList = tBasicMapper.getTbasicByPatientIds(patientIds);
for (TBasic basic : basicList) {
collectPacs(basic);
}
}
private void collectPacs(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("采集Pacs报告患者{},住院流水号:{},入院、出院时间empId有空数据无法采集", basic.getInpatientNo(), jzh);
return;
}
String beginDate = Func.formatDate(admissDate);
String endDate = Func.formatDate(disDate);
GdSzyZhReportListDto pacsList = gdSzyZhReportService.pacsList(empId, jzh, beginDate, endDate);
List<GdSzyZhReportListDto.Report> reportList = pacsList.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) {
String reportNo = report.getReportNo();
GdSzyZhReportDetailDto pacsDetail = gdSzyZhReportService.pacsDetail(reportNo);
ReportDownScanFileDto reportDownScanFileDto = new ReportDownScanFileDto();
reportDownScanFileDto.setDownurl(pacsDetail.getReportUrl());
reportDownScanFileDto.setFiletitle(report.getReportTitle());
reportDownScanFileDto.setSerialnum(reportNo);
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 pacsWsConfig = configOjb.getJSONObject("PACS");
String collectorId = pacsWsConfig.getString("collectorId");
String assortId = pacsWsConfig.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);
}
public static void main(String[] args) {
}
}

@ -0,0 +1,32 @@
package com.docus.server.rpc;
import com.docus.server.rpc.dto.GdSzyZhReportDetailDto;
import com.docus.server.rpc.dto.GdSzyZhReportListDto;
/**
* 广
* @author YongBin Wen
* @date 2026/4/7 15:18
*/
public interface GdSzyZhReportService {
/**
* PACS
* @param beginDate yyyy-MM-dd
* @param endDate yyyy-MM-dd
*/
GdSzyZhReportListDto pacsList(String empId, String jzh, String beginDate, String endDate);
/**
* PACS
*/
GdSzyZhReportDetailDto pacsDetail(String examNo);
/**
* LIS
*/
GdSzyZhReportListDto lisList(String empId,String jzh,String beginDate,String endDate);
/**
* LIS
*/
GdSzyZhReportDetailDto lisDetail(String sampleNo);
}

@ -0,0 +1,15 @@
package com.docus.server.rpc.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
*
* @author YongBin Wen
* @date 2026/4/7 15:29
*/
@Data
public class GdSzyZhReportDetailDto {
@ApiModelProperty("报告地址")
private String reportUrl;
}

@ -0,0 +1,31 @@
package com.docus.server.rpc.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
*
* @author YongBin Wen
* @date 2026/4/7 15:28
*/
@Data
public class GdSzyZhReportListDto {
@ApiModelProperty("报告列表")
private List<Report> reportList;
@Data
public static class Report {
@ApiModelProperty("报告号")
private String reportNo;
@ApiModelProperty("报告标题")
private String reportTitle;
@ApiModelProperty("报告分类")
private String reportClass;
@ApiModelProperty("报告时间")
private Date reportTime;
}
}

@ -0,0 +1,201 @@
package com.docus.server.rpc.impl;
import com.alibaba.fastjson.JSONObject;
import com.docus.core.util.Func;
import com.docus.server.rpc.GdSzyZhReportService;
import com.docus.server.rpc.dto.GdSzyZhReportDetailDto;
import com.docus.server.rpc.dto.GdSzyZhReportListDto;
import com.docus.server.util.JaxWsDynamicClientUtil;
import com.docus.server.util.TableJsonRead;
import com.docus.server.util.XmlUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author YongBin Wen
* @date 2026/4/7 15:18
*/
@Slf4j
@Service
public class GdSzyZhReportServiceImpl implements GdSzyZhReportService {
final String configPath = "data-config";
final String configName = "gdszyzh-collect-config";
@Override
public GdSzyZhReportListDto pacsList(String empId, String jzh, String beginDate, String endDate) {
TableJsonRead jsonReader = new TableJsonRead();
JSONObject configOjb = jsonReader.Read(configPath, configName, JSONObject.class);
JSONObject pacsWsConfig = configOjb.getJSONObject("PACS");
String wsUrl = pacsWsConfig.getString("listUrl");
String namespaceUri = pacsWsConfig.getString("listNamespaceUri");
String method = pacsWsConfig.getString("listOperationName");
String param = pacsListParam(empId, jzh, beginDate, endDate);
String[] params = {param};
Object resultObj = JaxWsDynamicClientUtil.send(wsUrl, namespaceUri, method, params);
String result = String.valueOf(resultObj);
log.info("PACS查询报告列表地址{},方法:{},参数:{} 调用成功,得到结果为:{}", wsUrl, method, param, result);
return parsePacsListResult(result);
}
@Override
public GdSzyZhReportDetailDto pacsDetail(String examNo) {
TableJsonRead jsonReader = new TableJsonRead();
JSONObject configOjb = jsonReader.Read(configPath, configName, JSONObject.class);
JSONObject pacsWsConfig = configOjb.getJSONObject("PACS");
String wsUrl = pacsWsConfig.getString("detailUrl");
String namespaceUri = pacsWsConfig.getString("detailNamespaceUri");
String method = pacsWsConfig.getString("detailOperationName");
String param = pacsDetailParam(examNo);
String[] params = {param};
Object resultObj = JaxWsDynamicClientUtil.send(wsUrl, namespaceUri, method, params);
String result = String.valueOf(resultObj);
log.info("PACS查询报告详情地址{},方法:{},参数:{} 调用成功,得到结果为:{}", wsUrl, method, param, result);
return parsePacsDetailResult(result);
}
private static String pacsListParam(String empId, String jzh, String beginDate, String endDate) {
return "<ESBEntry>" +
"<AccessControl>" +
"<SysFlag>1</SysFlag>" +
"<UserName>HIS_ZY</UserName>" +
"<Password>HIS_ZY_0330</Password>" +
"<Fid>BS04002</Fid>" +
"<OrderNo>BS04002S02001</OrderNo>" +
"<SUBOR_HOSPITAL_DISTRICT>ZH</SUBOR_HOSPITAL_DISTRICT>" +
"</AccessControl>" +
"<MessageHeader>" +
"<Fid>BS04002</Fid>" +
"<OrderNo>BS04002S02001</OrderNo>" +
"<SourceSysCode>S02</SourceSysCode>" +
"<TargetSysCode>S00</TargetSysCode>" +
"<MsgDate>2020-04-27 23:41:09</MsgDate>" +
"</MessageHeader>" +
"<RequestOption>" +
"<triggerData>0</triggerData>" +
"<dataAmount>500</dataAmount>" +
"</RequestOption>" +
"<MsgInfo flag=\"1\">" +
"<Msg/>" +
"<distinct value=\"0\"/>" +
"<query item=\"WS_INPUT\" compy=\"=\" value=\"WS\" splice=\"AND\"/>" +
"<query_ws action=\"queueReportList\">" +
"<content>" +
"<Request>" +
"<Msg>" +
"<VUID>001</VUID>" +
"<OUTHOSP_INDEX_NO/>" +
"<OUTHOSP_NO>" + jzh + "</OUTHOSP_NO>" +
"<INHOSP_INDEX_NO/>" +
"<INHOSP_NO/>" +
"<EMPI_ID>" + empId + "</EMPI_ID>" +
"<BEGIN_DATE>" + beginDate + "</BEGIN_DATE>" +
"<END_DATE>" + endDate + "</END_DATE>" +
"<EXAM_CATEG_CODE>PACS.CS,PACS.CT,PACS.FS</EXAM_CATEG_CODE>" +
"</Msg>" +
"</Request>" +
"</content>" +
"</query_ws>" +
"</MsgInfo>" +
"<GroupInfo flag=\"0\">" +
"<AS ID=\"\" linkField=\"\"/>" +
"</GroupInfo>" +
"</ESBEntry>";
}
private static GdSzyZhReportListDto parsePacsListResult(String result) {
XmlUtil xmlUtil = XmlUtil.of(result);
NodeList examInfoList = xmlUtil.getNodeList("/Response/MsgInfo/Msg/ExamInfo");
int length = examInfoList.getLength();
List<GdSzyZhReportListDto.Report> reportList = new ArrayList<>();
for (int i = 1; i <= length; i++) {
Node examNoNode = xmlUtil.getNode("/Response/MsgInfo/Msg/ExamInfo[" + i + "]/EXAM_NO");
Node examClassNode = xmlUtil.getNode("/Response/MsgInfo/Msg/ExamInfo[" + i + "]/EXAM_CATEG_CODE");
Node examDateNode = xmlUtil.getNode("/Response/MsgInfo/Msg/ExamInfo[" + i + "]/EXAM_DATE");
Node examTimeNode = xmlUtil.getNode("/Response/MsgInfo/Msg/ExamInfo[" + i + "]/EXAM_TIME");
Node examItemNameNode = xmlUtil.getNode("/Response/MsgInfo/Msg/ExamInfo[" + i + "]/ExamItemInfo/EXAM_ITEM_NAME");
String examDateTime = examDateNode.getTextContent() + " " + examTimeNode.getTextContent();
GdSzyZhReportListDto.Report report = new GdSzyZhReportListDto.Report();
report.setReportNo(examNoNode.getTextContent());
report.setReportTitle(examItemNameNode.getTextContent());
report.setReportClass(examClassNode.getTextContent());
report.setReportTime(Func.parseDate(examDateTime,"yyyy-MM-dd HH:mm:ss"));
reportList.add(report);
}
GdSzyZhReportListDto dto = new GdSzyZhReportListDto();
dto.setReportList(reportList);
return dto;
}
private static String pacsDetailParam(String examNo) {
return "<ESBEntry>" +
"<AccessControl>" +
"<SysFlag>1</SysFlag>" +
"<UserName>HIS_ZY</UserName>" +
"<Password>HIS_ZY_0330</Password>" +
"<Fid>BS04002</Fid>" +
"<OrderNo>BS04002S02001</OrderNo>" +
"<SUBOR_HOSPITAL_DISTRICT>ZH</SUBOR_HOSPITAL_DISTRICT>" +
"</AccessControl>" +
"<MessageHeader>" +
"<Fid>BS04002</Fid>" +
"<OrderNo>BS04002S02001</OrderNo>" +
"<SourceSysCode>S02</SourceSysCode>" +
"<TargetSysCode>S00</TargetSysCode>" +
"<MsgDate>2020-04-27 23:41:09</MsgDate>" +
"</MessageHeader>" +
"<RequestOption>" +
"<triggerData>0</triggerData>" +
"<dataAmount>500</dataAmount>" +
"</RequestOption>" +
"<MsgInfo flag=\"1\">" +
"<Msg/>" +
"<distinct value=\"0\"/>" +
"<query item=\"WS_INPUT\" compy=\"=\" value=\"WS\" splice=\"AND\"/>" +
"<query_ws action=\"queueReportInfo\">" +
"<content>" +
"<Request>" +
"<Msg>" +
"<EXAM_NO>" + examNo + "</EXAM_NO>" +
"</Msg>" +
"</Request>" +
"</content>" +
"</query_ws>" +
"</MsgInfo>" +
"<GroupInfo flag=\"0\">" +
"<AS ID=\"\" linkField=\"\"/>" +
"</GroupInfo>" +
"</ESBEntry>";
}
private static GdSzyZhReportDetailDto parsePacsDetailResult(String result) {
XmlUtil xmlUtil = XmlUtil.of(result);
Node reportUrlNode = xmlUtil.getNode("/Response/MsgInfo/Msg/ReportInfo/REPORT_URL2");
String reportUrl = reportUrlNode.getTextContent();
GdSzyZhReportDetailDto dto = new GdSzyZhReportDetailDto();
dto.setReportUrl(reportUrl);
return dto;
}
@Override
public GdSzyZhReportListDto lisList(String empId, String jzh, String beginDate, String endDate) {
// TODO wyb 接口未测试
return null;
}
@Override
public GdSzyZhReportDetailDto lisDetail(String sampleNo) {
// TODO wyb 接口未测试
return null;
}
}

@ -69,7 +69,8 @@
admiss_date as admissDate,
dis_date as disDate,
id_card as idCard,
jzh
jzh,
emp_id as empId
from docus_medicalrecord.t_basic
where patient_id in
<foreach collection="patientIds" open="(" close=")" separator="," item="patientId">

Loading…
Cancel
Save