|
@ -0,0 +1,256 @@
|
|
|
package com.yihu.ehr.crawler.service;
|
|
|
|
|
|
import com.fasterxml.jackson.databind.JsonNode;
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import com.yihu.ehr.crawler.model.adapter.AdapterDataSet;
|
|
|
import com.yihu.ehr.crawler.model.config.SysConfig;
|
|
|
import com.yihu.ehr.crawler.model.flow.CrawlerDataSetModel;
|
|
|
import com.yihu.ehr.crawler.model.flow.CrawlerFlowHeadModel;
|
|
|
import com.yihu.ehr.crawler.model.flow.CrawlerFlowModel;
|
|
|
import com.yihu.ehr.crawler.model.patient.Patient;
|
|
|
import com.yihu.ehr.framework.constrant.Constants;
|
|
|
import com.yihu.ehr.framework.util.log.LogService;
|
|
|
import com.yihu.ehr.framework.util.operator.CollectionUtil;
|
|
|
import com.yihu.ehr.framework.util.operator.StringUtil;
|
|
|
import com.yihu.ehr.framework.util.springutil.SpringBeanUtil;
|
|
|
import com.yihu.ehr.standard.model.adapter.AdapterDatasetModel;
|
|
|
import com.yihu.ehr.standard.model.adapter.AdapterSchemeVersionModel;
|
|
|
import com.yihu.ehr.standard.service.adapter.AdapterDatasetService;
|
|
|
import com.yihu.ehr.standard.service.adapter.AdapterSchemeVersionService;
|
|
|
import com.yihu.ehr.standard.service.bo.AdapterVersion;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
|
|
|
public class CrawlerFlowManager {
|
|
|
|
|
|
private static volatile CrawlerFlowManager instance;
|
|
|
private static DataCollectDispatcher dispatch;
|
|
|
private Map<String, AdapterDataSet> adapterDataSetMap;
|
|
|
private List<CrawlerFlowHeadModel> crawlerFlowHeadModelList;
|
|
|
private Map<String, List<CrawlerFlowModel>> crawlerFlowDatasetMap;
|
|
|
private Map<String, List<CrawlerFlowModel>> crawlerFlowMetadataMap;
|
|
|
private Boolean adapterFlg;
|
|
|
private List<Patient> patientList;
|
|
|
public CrawlerFlowManager() {
|
|
|
dispatch = DataCollectDispatcher.getInstance();
|
|
|
}
|
|
|
|
|
|
public void finalize() throws Throwable {
|
|
|
|
|
|
}
|
|
|
|
|
|
public static CrawlerFlowManager getInstance() {
|
|
|
if (instance == null) {
|
|
|
synchronized (CrawlerFlowManager.class) {
|
|
|
if (instance == null) {
|
|
|
try {
|
|
|
instance = new CrawlerFlowManager();
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return instance;
|
|
|
}
|
|
|
|
|
|
public String dataCrawler() {
|
|
|
Integer count = 0;
|
|
|
Integer totalCount = 0;
|
|
|
Map<String, Object> condition = new HashMap<>();
|
|
|
condition.put("orgCode", SysConfig.getInstance().orgCode);
|
|
|
patientList = dispatch.getPatientList(condition, adapterDataSetMap);
|
|
|
if (!CollectionUtil.isEmpty(patientList)) {
|
|
|
totalCount = patientList.size();
|
|
|
for (Patient patient : patientList) {
|
|
|
collectProcess(patient);
|
|
|
}
|
|
|
}
|
|
|
String message = "本次采集病人共" + totalCount + "条,成功采集信息"+ count + "条";
|
|
|
LogService.getLogger().info(message);
|
|
|
return message;
|
|
|
}
|
|
|
|
|
|
public String collectProcess(Patient patient) {
|
|
|
SysConfig.getInstance().setOrgCode(patient.getOrgCode());
|
|
|
String message;
|
|
|
if (!getDataForPrepare()) {
|
|
|
message = "适配数据尚未准备";
|
|
|
LogService.getLogger().error(message);
|
|
|
return message;
|
|
|
}
|
|
|
patient.setReUploadFlg(StringUtil.toString(false));
|
|
|
LogService.getLogger().trace("采集->注册->打包上传,任务ID:,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo());
|
|
|
try {
|
|
|
/**
|
|
|
* 获取token
|
|
|
*/
|
|
|
if (!dispatch.getToken()) {
|
|
|
message = "token获取失败";
|
|
|
LogService.getLogger().error(message);
|
|
|
return message;
|
|
|
}
|
|
|
|
|
|
Map<String, JsonNode> dataMap = new HashMap<>();
|
|
|
for (CrawlerFlowHeadModel crawlerFlowHeadModel : crawlerFlowHeadModelList) {
|
|
|
/**
|
|
|
* 采集信息
|
|
|
*/
|
|
|
String datasetCode = crawlerFlowHeadModel.getDatasetCode();
|
|
|
AdapterDataSet adapterDataSet = adapterDataSetMap.get(datasetCode);
|
|
|
String data = dispatch.fecthData(patient, adapterDataSet);
|
|
|
if (StringUtil.isEmpty(data)) {
|
|
|
continue;
|
|
|
}
|
|
|
ObjectMapper objectMapper = new ObjectMapper();
|
|
|
JsonNode jsonObject = objectMapper.readTree(data);
|
|
|
dataMap.put(datasetCode, jsonObject);
|
|
|
/**
|
|
|
* 根据采集流程递归查询
|
|
|
*/
|
|
|
getDataByCrawlerFlow(datasetCode, patient, dataMap);
|
|
|
|
|
|
if (SysConfig.getInstance().getRegisterDataSet().equals(adapterDataSet.getAdapterDataSetT().getStdDatasetCode())) {
|
|
|
if (!StringUtil.isEmpty(jsonObject.get("data")) && !StringUtil.isEmpty(jsonObject.get("data").get(0))) {
|
|
|
if (!StringUtil.isEmpty(jsonObject.get("data").get(0).get(SysConfig.getInstance().getRegisterIdCardNo()))) {
|
|
|
//register
|
|
|
dispatch.register(patient, data);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
LogService.getLogger().info("采集病人成功,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo());
|
|
|
/**
|
|
|
* 上传档案
|
|
|
*/
|
|
|
try {
|
|
|
if (!CollectionUtil.isEmpty(dataMap.keySet())) {
|
|
|
if (!dispatch.upload(dataMap, patient, adapterDataSetMap)) {
|
|
|
message = "上传档案失败";
|
|
|
LogService.getLogger().error(message);
|
|
|
return message;
|
|
|
}
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
message = "上传档案失败";
|
|
|
LogService.getLogger().error("档案上传失败,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo());
|
|
|
return message;
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
message = "采集病人失败";
|
|
|
LogService.getLogger().error("采集病人失败,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo(), e);
|
|
|
return message;
|
|
|
}
|
|
|
return Constants.EMPTY;
|
|
|
}
|
|
|
|
|
|
public Boolean getDataByCrawlerFlow(String preDatasetCode, Patient patient, Map<String, JsonNode> dataMap) {
|
|
|
try {
|
|
|
JsonNode preData = dataMap.get(preDatasetCode);
|
|
|
Map<String, String> relationValueMap = new HashMap<>();
|
|
|
List<CrawlerFlowModel> crawlerFlowDatasetList = crawlerFlowDatasetMap.get(preDatasetCode);
|
|
|
for (CrawlerFlowModel crawlerFlowDataset : crawlerFlowDatasetList) {
|
|
|
List<CrawlerFlowModel> crawlerFlowMetadataList = crawlerFlowMetadataMap.get(crawlerFlowDataset.getDatasetCode());
|
|
|
for (CrawlerFlowModel crawlerFlowMetadata : crawlerFlowMetadataList) {
|
|
|
String metadataCode = crawlerFlowMetadata.getMetadataCode();
|
|
|
String inputMetadataCode = crawlerFlowMetadata.getInputMetadataCode();
|
|
|
relationValueMap.put(metadataCode, preData.get(inputMetadataCode).asText());
|
|
|
}
|
|
|
String datasetCode = crawlerFlowDataset.getDatasetCode();
|
|
|
AdapterDataSet adapterDataSet = adapterDataSetMap.get(datasetCode);
|
|
|
String data = dispatch.fecthData(patient, adapterDataSet, relationValueMap);
|
|
|
if (StringUtil.isEmpty(data)) {
|
|
|
continue;
|
|
|
} else {
|
|
|
ObjectMapper objectMapper = new ObjectMapper();
|
|
|
JsonNode jsonObject = objectMapper.readTree(data);
|
|
|
dataMap.put(datasetCode, jsonObject);
|
|
|
}
|
|
|
getDataByCrawlerFlow(datasetCode, patient, dataMap);
|
|
|
}
|
|
|
return true;
|
|
|
} catch (Exception e) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public Boolean getDataForPrepare() {
|
|
|
if (!adapterFlg) {
|
|
|
/**
|
|
|
* 获取适配数据集
|
|
|
*/
|
|
|
adapterDataSetMap = new HashMap<>();
|
|
|
AdapterSchemeVersionService adapterSchemeVersionService = SpringBeanUtil.getService(AdapterSchemeVersionService.BEAN_ID);
|
|
|
AdapterSchemeVersionModel adapterSchemeVersionModel = adapterSchemeVersionService.getEhrAdapterVersionLasted();
|
|
|
if (adapterSchemeVersionModel == null) {
|
|
|
return false;
|
|
|
}
|
|
|
List<CrawlerDataSetModel> crawlerDataSetModelList = new ArrayList<>();
|
|
|
List<Integer> datasetIdList = new ArrayList<>();
|
|
|
for (CrawlerDataSetModel crawlerDataSetModel : crawlerDataSetModelList) {
|
|
|
datasetIdList.add(crawlerDataSetModel.getDatasetId());
|
|
|
}
|
|
|
String version = adapterSchemeVersionModel.getVersion();
|
|
|
AdapterVersion adapterVersion = new AdapterVersion(version);
|
|
|
AdapterDatasetService adapterDatasetService = SpringBeanUtil.getService(AdapterDatasetService.BEAN_ID);
|
|
|
List<AdapterDatasetModel> adapterDataSetModelList = adapterDatasetService.getListByAdapterDatasetIdList(adapterVersion, datasetIdList);
|
|
|
for (AdapterDatasetModel adapterDatasetModel : adapterDataSetModelList) {
|
|
|
adapterDataSetMap.put(adapterDatasetModel.getStdDatasetCode(), new AdapterDataSet(adapterDatasetModel, adapterVersion));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取采集流程表头
|
|
|
*/
|
|
|
crawlerFlowHeadModelList = new ArrayList<>();
|
|
|
List<CrawlerFlowModel> crawlerFlowModelList = new ArrayList<>();
|
|
|
crawlerFlowDatasetMap = new HashMap<>();
|
|
|
crawlerFlowMetadataMap = new HashMap<>();
|
|
|
for (CrawlerFlowModel crawlerFlowModel : crawlerFlowModelList) {
|
|
|
List<CrawlerFlowModel> datasetList = new ArrayList<>();
|
|
|
List<CrawlerFlowModel> metadataList = new ArrayList<>();
|
|
|
String inputDatasetCode = crawlerFlowModel.getInputDatasetCode();
|
|
|
String datasetCode = crawlerFlowModel.getDatasetCode();
|
|
|
if (StringUtil.isEmpty(inputDatasetCode)) {
|
|
|
continue;
|
|
|
}
|
|
|
if (crawlerFlowDatasetMap.containsKey(inputDatasetCode)) {
|
|
|
datasetList = crawlerFlowDatasetMap.get(inputDatasetCode);
|
|
|
}
|
|
|
datasetList.add(crawlerFlowModel);
|
|
|
crawlerFlowMetadataMap.put(datasetCode, datasetList);
|
|
|
if (crawlerFlowDatasetMap.containsKey(datasetCode)) {
|
|
|
metadataList = crawlerFlowDatasetMap.get(datasetCode);
|
|
|
}
|
|
|
metadataList.add(crawlerFlowModel);
|
|
|
crawlerFlowDatasetMap.put(datasetCode, metadataList);
|
|
|
}
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 解析病人索引信息
|
|
|
*
|
|
|
* @param patientInfo 病人索引信息
|
|
|
* @return
|
|
|
*/
|
|
|
public Patient parsePatient(String patientInfo) {
|
|
|
try {
|
|
|
ObjectMapper mapper = new ObjectMapper();
|
|
|
Patient patient = mapper.readValue(patientInfo, Patient.class);
|
|
|
return patient;
|
|
|
} catch (Exception e) {
|
|
|
LogService.getLogger().error("patient参数错误:" + patientInfo, e);
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public void setAdapterFlg(Boolean adapterFlg) {
|
|
|
this.adapterFlg = adapterFlg;
|
|
|
}
|
|
|
}
|