|
@ -3,19 +3,21 @@ 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.adapter.AdapterDictEntry;
|
|
|
import com.yihu.ehr.crawler.model.config.SysConfig;
|
|
|
import com.yihu.ehr.crawler.model.patient.Patient;
|
|
|
import com.yihu.ehr.framework.constrant.Constants;
|
|
|
import com.yihu.ehr.framework.model.DictItem;
|
|
|
import com.yihu.ehr.framework.model.Result;
|
|
|
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.AdapterDictEntryModel;
|
|
|
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 net.sf.json.JSONObject;
|
|
|
import org.apache.logging.log4j.LogManager;
|
|
|
import org.apache.logging.log4j.Logger;
|
|
|
|
|
@ -28,51 +30,44 @@ public class CrawlerManager {
|
|
|
|
|
|
private static Logger logger = LogManager.getLogger(CrawlerManager.class);
|
|
|
|
|
|
private static volatile CrawlerManager instance;
|
|
|
private static DataCollectDispatcher dispatch;
|
|
|
private static DataCollectDispatcher dispatch = DataCollectDispatcher.getInstance();
|
|
|
private static Map<String, Map<String, AdapterDataSet>> adapterDataSetVersionMap = new HashMap<>();
|
|
|
private Map<String, AdapterDataSet> adapterDataSetMap;
|
|
|
private Boolean adapterFlg = false;
|
|
|
private String schemeVersion;
|
|
|
private List<DictItem> datasetList;
|
|
|
public CrawlerManager(List datasetList, String schemeVersion) {
|
|
|
this.datasetList = datasetList;
|
|
|
this.schemeVersion = schemeVersion;
|
|
|
}
|
|
|
public CrawlerManager() {
|
|
|
dispatch = DataCollectDispatcher.getInstance();
|
|
|
}
|
|
|
|
|
|
public void finalize() throws Throwable {
|
|
|
|
|
|
}
|
|
|
|
|
|
public static CrawlerManager getInstance() {
|
|
|
if (instance == null) {
|
|
|
synchronized (CrawlerManager.class) {
|
|
|
if (instance == null) {
|
|
|
try {
|
|
|
instance = new CrawlerManager();
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return instance;
|
|
|
}
|
|
|
|
|
|
public String dataCrawler(Map<String, Object> condition) {
|
|
|
Integer count = 0;
|
|
|
Integer totalCount = 0;
|
|
|
String message;
|
|
|
datasetList = (List<DictItem>) condition.get("datasetList");
|
|
|
/**
|
|
|
* 适配基本数据准备
|
|
|
*/
|
|
|
if (!getDataForPrepare()) {
|
|
|
message = "适配数据尚未准备";
|
|
|
logger.error(message);
|
|
|
return message;
|
|
|
}
|
|
|
|
|
|
List<Patient> patientList = dispatch.getPatientList(condition, adapterDataSetMap);
|
|
|
if (!CollectionUtil.isEmpty(patientList)) {
|
|
|
totalCount = patientList.size();
|
|
|
for (Patient patient : patientList) {
|
|
|
collectProcess(patient);
|
|
|
Boolean result = collectProcess(patient);
|
|
|
if (result) {
|
|
|
count++;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
message = "本次采集病人共" + totalCount + "条,成功采集信息"+ count + "条";
|
|
@ -81,28 +76,24 @@ public class CrawlerManager {
|
|
|
}
|
|
|
|
|
|
//单个病人采集上传
|
|
|
public String collectProcess(Patient patient) {
|
|
|
String message;
|
|
|
public Boolean collectProcess(Patient patient) {
|
|
|
if (!getDataForPrepare()) {
|
|
|
message = "适配数据尚未准备";
|
|
|
logger.error(message);
|
|
|
return message;
|
|
|
logger.error("适配数据尚未准备");
|
|
|
return false;
|
|
|
}
|
|
|
patient.setReUploadFlg(StringUtil.toString(false));
|
|
|
logger.trace("采集->注册->打包上传,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo());
|
|
|
try {
|
|
|
//getToken
|
|
|
if (!dispatch.getToken()) {
|
|
|
message = "token获取失败";
|
|
|
logger.error(message);
|
|
|
return message;
|
|
|
logger.error("token获取失败");
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
//getRemoteVersion
|
|
|
if (!dispatch.getRemoteVersion(patient.getOrgCode())) {
|
|
|
message = "远程版本获取失败";
|
|
|
logger.error(message);
|
|
|
return message;
|
|
|
logger.error("远程版本获取失败");
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
Map<String, AdapterDataSet> dataSetMap = new HashMap<>();
|
|
@ -111,6 +102,7 @@ public class CrawlerManager {
|
|
|
/**
|
|
|
* 获取数据
|
|
|
*/
|
|
|
logger.info("获取病人档案数据");
|
|
|
AdapterDataSet adapterDataSet = adapterDataSetMap.get(key);
|
|
|
String data = dispatch.fecthData(patient, adapterDataSet);
|
|
|
if (StringUtil.isEmpty(data)) {
|
|
@ -120,10 +112,13 @@ public class CrawlerManager {
|
|
|
JsonNode jsonObject = objectMapper.readTree(data);
|
|
|
dataSetMap.put(adapterDataSet.getAdapterDataSetT().getStdDatasetCode(), adapterDataSet);
|
|
|
dataMap.put(key, jsonObject);
|
|
|
/**
|
|
|
* 注册病人
|
|
|
*/
|
|
|
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
|
|
|
logger.info("注册病人");
|
|
|
dispatch.register(patient, data);
|
|
|
}
|
|
|
}
|
|
@ -131,62 +126,90 @@ public class CrawlerManager {
|
|
|
}
|
|
|
logger.info("采集病人成功,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo());
|
|
|
//上传档案
|
|
|
logger.info("上传病人档案");
|
|
|
try {
|
|
|
if (!CollectionUtil.isEmpty(dataMap.keySet())) {
|
|
|
if (!dispatch.upload(dataMap, patient, dataSetMap)) {
|
|
|
message = "上传档案失败";
|
|
|
logger.error(message);
|
|
|
return message;
|
|
|
logger.error("上传档案失败");
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
message = "上传档案失败";
|
|
|
logger.error("档案上传失败,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo());
|
|
|
return message;
|
|
|
return false;
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
message = "采集病人失败";
|
|
|
logger.error("采集病人失败,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo(), e);
|
|
|
return message;
|
|
|
return false;
|
|
|
}
|
|
|
return Constants.EMPTY;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
public Boolean getDataForPrepare() {
|
|
|
if (!adapterFlg) {
|
|
|
try {
|
|
|
adapterDataSetMap = new HashMap<>();
|
|
|
logger.info("适配基本相关数据准备");
|
|
|
if (adapterFlg) {
|
|
|
return true;
|
|
|
}
|
|
|
try {
|
|
|
adapterDataSetMap = new HashMap<>();
|
|
|
AdapterVersion adapterVersion = null;
|
|
|
AdapterDatasetService adapterDatasetService = SpringBeanUtil.getService(AdapterDatasetService.BEAN_ID);
|
|
|
List<AdapterDatasetModel> adapterDataSetModelList = new ArrayList<>();
|
|
|
if (!CollectionUtil.isEmpty(datasetList)) {
|
|
|
/**
|
|
|
* 拉模式接口调用,由任务配置决定适配版本
|
|
|
*/
|
|
|
adapterVersion = new AdapterVersion(schemeVersion);
|
|
|
List<Integer> datasetIdList = new ArrayList<>();
|
|
|
for (DictItem dictItem : datasetList) {
|
|
|
datasetIdList.add(Integer.parseInt(dictItem.getCode()));
|
|
|
}
|
|
|
adapterDataSetModelList = adapterDatasetService.getAdapterDatasetByAdapterIdList(adapterVersion, datasetIdList);
|
|
|
} else {
|
|
|
/**
|
|
|
* 推模式接口调用,默认只使用最新版本的适配
|
|
|
*/
|
|
|
AdapterSchemeVersionService adapterSchemeVersionService = SpringBeanUtil.getService(AdapterSchemeVersionService.BEAN_ID);
|
|
|
AdapterSchemeVersionModel adapterSchemeVersionModel = adapterSchemeVersionService.getEhrAdapterVersionLasted();
|
|
|
if (adapterSchemeVersionModel == null) {
|
|
|
logger.error("获取最新ehr适配版本错误");
|
|
|
return false;
|
|
|
} else {
|
|
|
this.schemeVersion = adapterSchemeVersionModel.getVersion();
|
|
|
adapterVersion = new AdapterVersion(schemeVersion);
|
|
|
}
|
|
|
String version = adapterSchemeVersionModel.getVersion();
|
|
|
AdapterVersion adapterVersion = new AdapterVersion(version);
|
|
|
AdapterDatasetService adapterDatasetService = SpringBeanUtil.getService(AdapterDatasetService.BEAN_ID);
|
|
|
Map<String, String> condition = new HashMap<>();
|
|
|
condition.put("column", "adapter_dataset_code");
|
|
|
JSONObject jsonpObject = JSONObject.fromObject(condition);
|
|
|
List<AdapterDatasetModel> adapterDataSetModelList = adapterDatasetService.getAdapterDatasetNotNullList(adapterVersion, jsonpObject.toString());
|
|
|
List<Integer> datasetIdList = new ArrayList<>();
|
|
|
if (!CollectionUtil.isEmpty(datasetList)) {
|
|
|
for (DictItem dictItem : datasetList) {
|
|
|
datasetIdList.add(Integer.parseInt(dictItem.getCode()));
|
|
|
}
|
|
|
if (adapterDataSetVersionMap.get(schemeVersion) != null) {
|
|
|
adapterDataSetMap = adapterDataSetVersionMap.get(schemeVersion);
|
|
|
adapterFlg = true;
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
for (AdapterDatasetModel adapterDatasetModel : adapterDataSetModelList) {
|
|
|
if (CollectionUtil.isEmpty(datasetIdList) || datasetIdList.contains(adapterDatasetModel.getAdapterDatasetId())) {
|
|
|
adapterDataSetMap.put(adapterDatasetModel.getStdDatasetCode(), new AdapterDataSet(adapterDatasetModel, adapterVersion));
|
|
|
}
|
|
|
/**
|
|
|
* 字典项初始化
|
|
|
*/
|
|
|
List<AdapterDictEntryModel> adapterDictEntryModelList = adapterDatasetService.getList(AdapterDictEntryModel.class, adapterVersion.getDictEntryTableName(), null, null, null, null);
|
|
|
Map<Integer, List<AdapterDictEntryModel>> adapterDictEntryModelMap = new HashMap<>();
|
|
|
for (AdapterDictEntryModel adapterDictEntryModel : adapterDictEntryModelList) {
|
|
|
List<AdapterDictEntryModel> entryModelList = adapterDictEntryModelMap.get(adapterDictEntryModel.getStdDictId());
|
|
|
if (CollectionUtil.isEmpty(entryModelList)) {
|
|
|
entryModelList = new ArrayList<>();
|
|
|
}
|
|
|
SysConfig.getInstance().setVersionMap(new HashMap<>());
|
|
|
adapterFlg = true;
|
|
|
} catch (Exception e) {
|
|
|
adapterFlg = false;
|
|
|
entryModelList.add(adapterDictEntryModel);
|
|
|
adapterDictEntryModelMap.put(adapterDictEntryModel.getStdDictId(), entryModelList);
|
|
|
}
|
|
|
/**
|
|
|
* 数据集初始化
|
|
|
*/
|
|
|
for (AdapterDatasetModel adapterDatasetModel : adapterDataSetModelList) {
|
|
|
adapterDataSetMap.put(adapterDatasetModel.getStdDatasetCode(), new AdapterDataSet(adapterDatasetModel, adapterVersion, adapterDictEntryModelMap));
|
|
|
}
|
|
|
adapterDataSetVersionMap.put(schemeVersion, adapterDataSetMap);
|
|
|
adapterFlg = true;
|
|
|
return true;
|
|
|
} catch (Exception e) {
|
|
|
return false;
|
|
|
}
|
|
|
return adapterFlg;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@ -206,7 +229,11 @@ public class CrawlerManager {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public void setAdapterFlg(Boolean adapterFlg) {
|
|
|
this.adapterFlg = adapterFlg;
|
|
|
public void setSchemeVersion(String schemeVersion) {
|
|
|
this.schemeVersion = schemeVersion;
|
|
|
}
|
|
|
|
|
|
public void setDatasetList(List<DictItem> datasetList) {
|
|
|
this.datasetList = datasetList;
|
|
|
}
|
|
|
}
|