feat: 梅州中医院手麻报告采集

master
wyb 4 months ago
parent 8894f7527a
commit ea7719cb6c

@ -0,0 +1,55 @@
{
"shouMa": {
"notCollect": [
"手术登记",
"手术费用明细",
"处方单",
"医用材料登记",
"一次性医用耗材标签粘贴单",
"仪器设备使用登记"
],
"defaultAssort":"DB5E7DA78A7E480991D65B8C2A8E2850",
"assort": [
{
"title": "麻醉记录",
"assortId": "DB5E7DA78A7E480991D65B8C2A8E2848"
},
{
"title": "手术安全核查",
"assortId": "15E7FE7803F545CB81390BC88E725240"
},
{
"title": "手术风险评估",
"assortId": "15E7FE7803F545CB81390BC88E725240"
},
{
"title": "麻醉恢复室记录单",
"assortId": "EABEEB5D628449A7930F4C0A9953A754"
},
{
"title": "PACU|麻醉恢复室记录单",
"assortId": "EABEEB5D628449A7930F4C0A9953A754"
},
{
"title": "三方核查(介入使用)|手术安全核查表",
"assortId": "EABEEB5D628449A7930F4C0A9953A754"
},
{
"title": "压疮风险评估表|手术风险评估表",
"assortId": "EABEEB5D628449A7930F4C0A9953A754"
},
{
"title": "麻醉知情同意|麻醉同意书",
"assortId": "EABEEB5D628449A7930F4C0A9953A754"
},
{
"title": "器械清点|器材清点|器械、敷料核对表",
"assortId": "EABEEB5D628449A7930F4C0A9953A754"
},
{
"title": "无痛舒适|无痛舒适检查麻醉同意书",
"assortId": "EABEEB5D628449A7930F4C0A9953A754"
}
]
}
}

@ -1,11 +1,18 @@
{ {
"lis":{ "lis": {
"collectorId":"1", "collectorId": "1",
"assortId":"lis", "assortId": "lis",
"url": "http://199.168.91.176:9001/NeuLisExportPDFService.asmx?wsdl", "url": "http://199.168.91.176:9001/NeuLisExportPDFService.asmx?wsdl",
"namespaceUri": "", "namespaceUri": "",
"pdfListOperationName": "GetTestFormPDF", "pdfListOperationName": "GetTestFormPDF",
"RTBase64OperationName": "ExportTestFormPDF_GMForNoPaper", "RTBase64OperationName": "ExportTestFormPDF_GMForNoPaper",
"GMBase64OperationName": "ExportTestFormPDF_GMForNoPaper" "GMBase64OperationName": "ExportTestFormPDF_GMForNoPaper"
} },
"shouMa": {
"collectorId": "shouma",
"hospCode": "#hospital",
"branchCode": "#branch",
"documentInfoListUrl": "http://199.168.91.78:80/odbip/api/outer/medicalDocument/queryMedicalDocumentInfoList",
"documentFileForBase64Url": "http://199.168.91.78:80/odbip/api/outer/medicalDocument/getMedicalDocumentFileForBase64"
}
} }

@ -21,6 +21,8 @@ public class StaticResourceWebConfig implements WebMvcConfigurer {
// 静态资源映射 // 静态资源映射
registry.addResourceHandler("/"+ StaticResourceMapping.LIS +"/**") registry.addResourceHandler("/"+ StaticResourceMapping.LIS +"/**")
.addResourceLocations("file:"+ TableJsonRead.currentPath(StaticResourceMapping.STATIC_RESOURCE_PREFIX+ File.separator+StaticResourceMapping.LIS)+File.separator); .addResourceLocations("file:"+ TableJsonRead.currentPath(StaticResourceMapping.STATIC_RESOURCE_PREFIX+ File.separator+StaticResourceMapping.LIS)+File.separator);
registry.addResourceHandler("/"+ StaticResourceMapping.SHOU_MA +"/**")
.addResourceLocations("file:"+ TableJsonRead.currentPath(StaticResourceMapping.STATIC_RESOURCE_PREFIX+ File.separator+StaticResourceMapping.SHOU_MA)+File.separator);
} }
} }

@ -3,7 +3,11 @@ package com.docus.server.mzzyy.controller;
import com.docus.infrastructure.web.api.CommonResult; import com.docus.infrastructure.web.api.CommonResult;
import com.docus.server.rpc.MzZyyLisService; import com.docus.server.rpc.MzZyyLisService;
import com.docus.server.rpc.MzZyyShouMaService;
import com.docus.server.rpc.dto.MzZyyLisExportDto; import com.docus.server.rpc.dto.MzZyyLisExportDto;
import com.docus.server.rpc.dto.MzZyyShouMaMedicalDocumentFileForBase64Dto;
import com.docus.server.rpc.dto.MzZyyShouMaMedicalDocumentInfoDto;
import com.docus.server.rpc.dto.MzZyyShouMaQueryMedicalDocumentInfoDto;
import com.docus.server.rpc.dto.MzZyyTestDto; import com.docus.server.rpc.dto.MzZyyTestDto;
import com.docus.server.rpc.enums.MzZyyLisType; import com.docus.server.rpc.enums.MzZyyLisType;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
@ -25,6 +29,9 @@ import java.util.List;
public class MzZyyApiController { public class MzZyyApiController {
@Autowired @Autowired
private MzZyyLisService mzZyyLisService; private MzZyyLisService mzZyyLisService;
@Autowired
private MzZyyShouMaService mzZyyShouMaService;
/** /**
* *
@ -52,6 +59,34 @@ public class MzZyyApiController {
return CommonResult.success(files); return CommonResult.success(files);
} }
/**
*
*/
@GetMapping("/shouma/getMedicalDocumentFileForBase64Test")
@ApiOperation("手麻文书base64获取测试")
public CommonResult<Object> getMedicalDocumentFileForBase64Test(@RequestParam(name = "reportNo") String reportNo) {
MzZyyShouMaMedicalDocumentFileForBase64Dto fileForBase64 = mzZyyShouMaService.getMedicalDocumentFileForBase64(reportNo);
return CommonResult.success(fileForBase64);
}
/**
*
*/
@GetMapping("/shouma/queryMedicalDocumentInfoListTest")
@ApiOperation("手麻文书信息列表获取测试")
public CommonResult<Object> queryMedicalDocumentInfoListTest(@RequestParam(name = "jzh") String jzh,
@RequestParam(name = "hospCode") String hospCode,
@RequestParam(name = "branchCode") String branchCode) {
MzZyyShouMaQueryMedicalDocumentInfoDto mzZyyShouMaQueryMedicalDocumentInfoDto = new MzZyyShouMaQueryMedicalDocumentInfoDto();
mzZyyShouMaQueryMedicalDocumentInfoDto.setHospCode(hospCode);
mzZyyShouMaQueryMedicalDocumentInfoDto.setBranchCode(branchCode);
mzZyyShouMaQueryMedicalDocumentInfoDto.setInPatientSeqNo(jzh);
MzZyyShouMaMedicalDocumentInfoDto mzZyyShouMaMedicalDocumentInfoDto = mzZyyShouMaService.queryMedicalDocumentInfoList(mzZyyShouMaQueryMedicalDocumentInfoDto);
return CommonResult.success(mzZyyShouMaMedicalDocumentInfoDto);
}
public static void main(String[] args) { public static void main(String[] args) {
System.out.println(new MzZyyLisExportDto()); System.out.println(new MzZyyLisExportDto());
} }

@ -1,6 +1,7 @@
package com.docus.server.mzzyy.job; package com.docus.server.mzzyy.job;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSONArray;
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.infrastructure.web.api.CommonResult; import com.docus.infrastructure.web.api.CommonResult;
@ -8,8 +9,12 @@ import com.docus.infrastructure.web.api.ResultCode;
import com.docus.server.archive.mapper.TBasicMapper; import com.docus.server.archive.mapper.TBasicMapper;
import com.docus.server.rpc.DownPlatformService; import com.docus.server.rpc.DownPlatformService;
import com.docus.server.rpc.MzZyyLisService; import com.docus.server.rpc.MzZyyLisService;
import com.docus.server.rpc.MzZyyShouMaService;
import com.docus.server.rpc.TaskDistributeService; import com.docus.server.rpc.TaskDistributeService;
import com.docus.server.rpc.dto.MzZyyLisExportDto; import com.docus.server.rpc.dto.MzZyyLisExportDto;
import com.docus.server.rpc.dto.MzZyyShouMaMedicalDocumentFileForBase64Dto;
import com.docus.server.rpc.dto.MzZyyShouMaMedicalDocumentInfoDto;
import com.docus.server.rpc.dto.MzZyyShouMaQueryMedicalDocumentInfoDto;
import com.docus.server.rpc.dto.MzZyyTestDto; import com.docus.server.rpc.dto.MzZyyTestDto;
import com.docus.server.rpc.dto.ReportDownDto; import com.docus.server.rpc.dto.ReportDownDto;
import com.docus.server.rpc.dto.ReportDownPatientDto; import com.docus.server.rpc.dto.ReportDownPatientDto;
@ -33,6 +38,7 @@ import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects;
/** /**
* @author YongBin Wen * @author YongBin Wen
@ -48,6 +54,8 @@ public class MzZyyReportCollectJob {
@Autowired @Autowired
private MzZyyLisService mzZyyLisService; private MzZyyLisService mzZyyLisService;
@Autowired @Autowired
private MzZyyShouMaService mzZyyShouMaService;
@Autowired
private TBasicMapper tBasicMapper; private TBasicMapper tBasicMapper;
@XxlJob("MzZyyLisCollectJob") @XxlJob("MzZyyLisCollectJob")
@ -126,7 +134,7 @@ public class MzZyyReportCollectJob {
List<ReportDownScanFileDto> scanFiles = Collections.singletonList(reportDownScanFileDto); List<ReportDownScanFileDto> scanFiles = Collections.singletonList(reportDownScanFileDto);
reportDownDto.setAssortid(assortId); reportDownDto.setAssortid(assortId);
reportDownDto.setScanfiles(scanFiles); reportDownDto.setScanfiles(scanFiles);
tBasicMapper.invalidFileBySource(patientId,collectorId); tBasicMapper.invalidFileBySource(patientId, collectorId);
downPlatformService.report(reportDownDto); downPlatformService.report(reportDownDto);
} }
@ -136,15 +144,137 @@ public class MzZyyReportCollectJob {
String configName = "mzzyy-ws-config"; String configName = "mzzyy-ws-config";
TableJsonRead jsonReader = new TableJsonRead(); TableJsonRead jsonReader = new TableJsonRead();
JSONObject configOjb = jsonReader.Read(configPath, configName, JSONObject.class); JSONObject configOjb = jsonReader.Read(configPath, configName, JSONObject.class);
JSONObject lisWsConfig = configOjb.getJSONObject("shouMa"); JSONObject shouMaConfig = configOjb.getJSONObject("shouMa");
String collectorId = lisWsConfig.getString("collectorId"); String collectorId = shouMaConfig.getString("collectorId");
String assortId = lisWsConfig.getString("assortId"); String hospCode = shouMaConfig.getString("hospCode");
String branchCode = shouMaConfig.getString("branchCode");
CommonResult<ReportDownTwoDto> commonResult = taskDistributeService.getNoViewTaskByCollectorId(collectorId); CommonResult<ReportDownTwoDto> commonResult = taskDistributeService.getNoViewTaskByCollectorId(collectorId);
if (!ResultCode.SUCCESS.getCode().equals(commonResult.getCode()) if (!ResultCode.SUCCESS.getCode().equals(commonResult.getCode())
|| commonResult.getData() == null) { || commonResult.getData() == null) {
return; return;
} }
ReportDownTwoDto downTwoDto = commonResult.getData();
ReportTaskTwoDto task = downTwoDto.getTasks().get(0);
log.info(">>>>>>>>>>>>>>>>>>>>>> 梅州中医院手麻采集任务,获取了任务:{}", Func.toJson(task));
ReportPatientTwoDto reportPatientTwoDto = downTwoDto.getPatient();
String jzh = downTwoDto.getJzh();
String patientId = downTwoDto.getPatientId();
String inpatientNo = reportPatientTwoDto.getInpatientNo();
String formatDate = Func.formatDate(new Date());
String fileDirPath = TableJsonRead.currentPath(StaticResourceMapping.STATIC_RESOURCE_PREFIX + File.separator + StaticResourceMapping.SHOU_MA)
+ File.separator + formatDate
+ File.separator + patientId;
MzZyyShouMaQueryMedicalDocumentInfoDto queryMedicalDocumentInfoDto = new MzZyyShouMaQueryMedicalDocumentInfoDto();
queryMedicalDocumentInfoDto.setHospCode(hospCode);
queryMedicalDocumentInfoDto.setBranchCode(branchCode);
queryMedicalDocumentInfoDto.setInPatientSeqNo(jzh);
MzZyyShouMaMedicalDocumentInfoDto queryMedicalDocumentInfoList = mzZyyShouMaService.queryMedicalDocumentInfoList(queryMedicalDocumentInfoDto);
// 查询文书列表,为空|状态不为ok|数据为空 结束
if (Objects.isNull(queryMedicalDocumentInfoList) ||
!"ok".equals(queryMedicalDocumentInfoList.getStatus()) ||
Func.isEmpty(queryMedicalDocumentInfoList.getData())) {
if (!Objects.isNull(queryMedicalDocumentInfoList)) {
log.info("住院号:{},住院流水号:{},查询手麻医疗文书列表为空,返回信息为:{}。", inpatientNo, jzh, Func.toJson(queryMedicalDocumentInfoList));
}
return;
}
List<ReportDownScanFileDto> scanFiles = new ArrayList<>();
List<MzZyyShouMaMedicalDocumentInfoDto.Data> documentInfoListData = queryMedicalDocumentInfoList.getData();
for (MzZyyShouMaMedicalDocumentInfoDto.Data documentInfoListDatum : documentInfoListData) {
String reportId = documentInfoListDatum.getReportId();
String reportTypeName = documentInfoListDatum.getReportTypeName();
MzZyyShouMaMedicalDocumentFileForBase64Dto medicalDocumentFileForBase64 = mzZyyShouMaService.getMedicalDocumentFileForBase64(reportId);
if (Objects.isNull(medicalDocumentFileForBase64) ||
!"ok".equals(medicalDocumentFileForBase64.getStatus()) ||
Objects.isNull(medicalDocumentFileForBase64.getData())) {
if (!Objects.isNull(medicalDocumentFileForBase64)) {
log.info("手麻医疗文书,reportId:{} 获取pdf为空返回信息为{}。", reportId, Func.toJson(medicalDocumentFileForBase64));
}
continue;
}
MzZyyShouMaMedicalDocumentFileForBase64Dto.Data base64Data = medicalDocumentFileForBase64.getData();
String fileBase64 = base64Data.getFileBase64();
String fileType = base64Data.getFileType();
String filePath = fileDirPath + File.separator + reportId + "." + fileType.toLowerCase(Locale.ROOT);
String httpUrl = "http://127.0.0.1:9010/shouma/" + formatDate + "/" + patientId + "/" + reportId + "." + fileType.toLowerCase(Locale.ROOT);
byte[] decode = Base64.getDecoder().decode(fileBase64);
FileUtil.writeBytes(decode, filePath);
ReportDownScanFileDto scanFileDto = new ReportDownScanFileDto();
scanFileDto.setFiletype(1);
scanFileDto.setDownurl(httpUrl);
scanFileDto.setFiletitle(reportTypeName);
scanFileDto.setSerialnum(reportId);
scanFileDto.setFilesource(1);
scanFileDto.setFilestoragetype(1);
scanFileDto.setTaskid(task.getTaskId());
scanFiles.add(scanFileDto);
}
if (Func.isNotEmpty(scanFiles)) {
ReportDownPatientDto patient = new ReportDownPatientDto();
patient.setPatientid(patientId);
ReportDownDto reportDownDto = new ReportDownDto();
reportDownDto.setCollectorid(collectorId);
reportDownDto.setIp("java-shouma-job");
reportDownDto.setPatient(patient);
tBasicMapper.invalidFileBySource(patientId, collectorId);
for (ReportDownScanFileDto scanFile : scanFiles) {
List<ReportDownScanFileDto> scanFileDtos = Collections.singletonList(scanFile);
String assortId = getShouMaAssortId(scanFile.getFiletitle());
if (Objects.isNull(assortId)) {
continue;
}
reportDownDto.setAssortid(assortId);
reportDownDto.setScanfiles(scanFileDtos);
downPlatformService.report(reportDownDto);
}
}
}
/**
*
*
* @param fileTitle
* @return
*/
private String getShouMaAssortId(String fileTitle) {
String configPath = "data-config";
String configName = "mzzyy-assort-config";
TableJsonRead jsonReader = new TableJsonRead();
JSONObject configOjb = jsonReader.Read(configPath, configName, JSONObject.class);
JSONObject shouMa = configOjb.getJSONObject("shouMa");
String defaultAssort = shouMa.getString("defaultAssort");
JSONArray notCollect = shouMa.getJSONArray("notCollect");
List<String> notCollectTitles = notCollect.toJavaList(String.class);
JSONArray assort = shouMa.getJSONArray("assort");
List<JSONObject> assortConfigs = assort.toJavaList(JSONObject.class);
for (String notCollectTitle : notCollectTitles) {
if (fileTitle.contains(notCollectTitle)) {
return null;
}
}
for (JSONObject assortConfig : assortConfigs) {
String title = assortConfig.getString("title");
String assortId = assortConfig.getString("assortId");
String[] titles = title.split("\\|");
for (String t : titles) {
if (fileTitle.toLowerCase(Locale.ROOT).contains(t.toLowerCase(Locale.ROOT))) {
return assortId;
}
}
}
return defaultAssort;
}
public static void main(String[] args) {
System.out.println(new MzZyyReportCollectJob().getShouMaAssortId("手术登记"));
} }
} }

@ -0,0 +1,27 @@
package com.docus.server.rpc;
import com.docus.server.rpc.dto.MzZyyShouMaMedicalDocumentFileForBase64Dto;
import com.docus.server.rpc.dto.MzZyyShouMaMedicalDocumentInfoDto;
import com.docus.server.rpc.dto.MzZyyShouMaQueryMedicalDocumentInfoDto;
/**
* @author YongBin Wen
* @date 2025/3/18 9:27
*/
public interface MzZyyShouMaService {
/**
*
*
* @param dto
* @return
*/
MzZyyShouMaMedicalDocumentInfoDto queryMedicalDocumentInfoList(MzZyyShouMaQueryMedicalDocumentInfoDto dto);
/**
* PDF
*
* @param reportNo reportId
* @return base64
*/
MzZyyShouMaMedicalDocumentFileForBase64Dto getMedicalDocumentFileForBase64(String reportNo);
}

@ -0,0 +1,27 @@
package com.docus.server.rpc.dto;
import lombok.Data;
/**
* @author YongBin Wen
* @date 2025/3/27 10:19
*/
@Data
public class MzZyyShouMaMedicalDocumentFileForBase64Dto {
/**
* ok ng
*/
private String status;
private String code;
private String message;
private Data data;
@lombok.Data
public static class Data{
private String fileBase64;
/**
*
* PDFpdf,PDF
*/
private String fileType;
}
}

@ -0,0 +1,52 @@
package com.docus.server.rpc.dto;
import lombok.Data;
import java.util.List;
/**
* @author YongBin Wen
* @date 2025/3/27 10:04
*/
@Data
public class MzZyyShouMaMedicalDocumentInfoDto {
/**
* ok ng
*/
private String status;
private String code;
private String message;
private List<Data> data;
@lombok.Data
public static class Data {
/**
*
*/
private String reportId;
/**
*
*/
private String hospCode;
/**
*
*/
private String branchCode;
/**
*
*/
private String reportTypeName;
/**
*
*/
private String reportTypeCode;
/**
* yyyy-MM-dd HH:mm:ss
*/
private String archiveTime;
/**
* PDF url 访http://ip:port/odbip”,如果没配置,看到的地址为不带前缀的内部服务地址,需要联系手麻工程师调整配置,以免影响正常访问。
*/
private String pdfUrl;
}
}

@ -0,0 +1,23 @@
package com.docus.server.rpc.dto;
import lombok.Data;
/**
* @author YongBin Wen
* @date 2025/3/27 10:04
*/
@Data
public class MzZyyShouMaQueryMedicalDocumentInfoDto {
/**
*
*/
private String hospCode;
/**
*
*/
private String branchCode;
/**
* jzh
*/
private String inPatientSeqNo;
}

@ -0,0 +1,45 @@
package com.docus.server.rpc.impl;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.docus.server.rpc.MzZyyShouMaService;
import com.docus.server.rpc.dto.MzZyyShouMaMedicalDocumentFileForBase64Dto;
import com.docus.server.rpc.dto.MzZyyShouMaMedicalDocumentInfoDto;
import com.docus.server.rpc.dto.MzZyyShouMaQueryMedicalDocumentInfoDto;
import com.docus.server.util.TableJsonRead;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author YongBin Wen
* @date 2025/3/18 9:27
*/
@Service
@Slf4j
public class MzZyyShouMaServiceImpl implements MzZyyShouMaService {
final String configPath = "data-config";
final String configName = "mzzyy-ws-config";
@Override
public MzZyyShouMaMedicalDocumentInfoDto queryMedicalDocumentInfoList(MzZyyShouMaQueryMedicalDocumentInfoDto dto) {
TableJsonRead jsonReader = new TableJsonRead();
JSONObject configOjb = jsonReader.Read(configPath, configName, JSONObject.class);
JSONObject shouMaConfig = configOjb.getJSONObject("shouMa");
String documentInfoListUrl = shouMaConfig.getString("documentInfoListUrl");
String bodyString = JSON.toJSONString(dto);
String resp = HttpUtil.post(documentInfoListUrl, bodyString);
return JSON.parseObject(resp, MzZyyShouMaMedicalDocumentInfoDto.class);
}
@Override
public MzZyyShouMaMedicalDocumentFileForBase64Dto getMedicalDocumentFileForBase64(String reportNo) {
TableJsonRead jsonReader = new TableJsonRead();
JSONObject configOjb = jsonReader.Read(configPath, configName, JSONObject.class);
JSONObject shouMaConfig = configOjb.getJSONObject("shouMa");
String documentFileForBase64Url = shouMaConfig.getString("documentFileForBase64Url");
String urlString = documentFileForBase64Url + "?reportNo=" + reportNo;
String resp = HttpUtil.get(urlString);
return JSON.parseObject(resp, MzZyyShouMaMedicalDocumentFileForBase64Dto.class);
}
}

@ -17,5 +17,11 @@ public interface StaticResourceMapping {
*/ */
String LIS= "lis"; String LIS= "lis";
/**
*
*/
String SHOU_MA= "shouma";
} }

Loading…
Cancel
Save