123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323 |
- package com.yihu.hos.crawler.service;
- import com.fasterxml.jackson.databind.JsonNode;
- import com.fasterxml.jackson.databind.ObjectMapper;
- import com.yihu.hos.core.datatype.CollectionUtil;
- import com.yihu.hos.core.datatype.StringUtil;
- import com.yihu.hos.core.log.Logger;
- import com.yihu.hos.core.log.LoggerFactory;
- import com.yihu.hos.crawler.dao.CrawlerDatasetDao;
- import com.yihu.hos.crawler.dao.CrawlerFlowDao;
- import com.yihu.hos.crawler.dao.CrawlerFlowHeadDao;
- import com.yihu.hos.crawler.model.adapter.AdapterDataSet;
- import com.yihu.hos.crawler.model.config.SysConfig;
- import com.yihu.hos.crawler.model.flow.CrawlerDataSetModel;
- import com.yihu.hos.crawler.model.flow.CrawlerFlowHeadModel;
- import com.yihu.hos.crawler.model.flow.CrawlerFlowModel;
- import com.yihu.hos.crawler.model.patient.Patient;
- import com.yihu.hos.standard.model.adapter.AdapterDatasetModel;
- import com.yihu.hos.standard.model.adapter.AdapterDictEntryModel;
- import com.yihu.hos.standard.model.adapter.AdapterSchemeVersionModel;
- import com.yihu.hos.standard.service.adapter.AdapterDatasetService;
- import com.yihu.hos.standard.service.adapter.AdapterSchemeVersionService;
- import com.yihu.hos.standard.service.bo.AdapterVersion;
- import com.yihu.hos.web.framework.model.DictItem;
- import com.yihu.hos.web.framework.util.springutil.SpringBeanUtil;
- import java.util.*;
- public class CrawlerFlowManager {
- private static Logger logger = LoggerFactory.getLogger(CrawlerFlowManager.class);
- private static DataCollectDispatcher dispatch = DataCollectDispatcher.getInstance();
- private static SysConfig sysConfig = SysConfig.getInstance();
- private Map<String, AdapterDataSet> adapterDataSetMap;
- private List<CrawlerFlowHeadModel> crawlerFlowHeadModelList;
- private Map<String, List<CrawlerFlowModel>> crawlerFlowDatasetMap;
- private Map<String, List<CrawlerFlowModel>> crawlerFlowMetadataMap;
- private Boolean adapterFlg = false;
- private List<DictItem> datasetList;
- private String schemeVersion;
- public CrawlerFlowManager(List datasetList, String schemeVersion) {
- this.datasetList = datasetList;
- this.schemeVersion = schemeVersion;
- }
- public CrawlerFlowManager() {
- }
- public void finalize() throws Throwable {
- }
- public String dataCrawler(Map<String, Object> condition) {
- Integer count = 0;
- Integer totalCount = 0;
- String message;
- /**
- * 适配基本数据准备
- */
- 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) {
- boolean result = collectProcess(patient);
- if (result) {
- count++;
- }
- }
- }
- message = "本次采集病人共" + totalCount + "条,成功采集信息" + count + "条";
- return message;
- }
- public boolean collectProcess(Patient patient) {
- if (!getDataForPrepare()) {
- logger.error("适配数据尚未准备完毕");
- return false;
- }
- patient.setReUploadFlg(StringUtil.toString(false));
- logger.trace("采集->注册->打包上传,任务ID:,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo());
- try {
- /**
- * 获取token
- */
- if (!dispatch.getToken()) {
- logger.error("token获取失败");
- return false;
- }
- /**
- * 获取远程版本
- */
- // if (!dispatch.getRemoteVersion(patient.getOrgCode())) {
- // logger.error("远程版本获取失败");
- // return false;
- // }
- /**
- * 获取版本
- */
- if (StringUtil.isEmpty(sysConfig.getVersionMap().get(patient.getOrgCode()))) {
- logger.error("版本获取失败");
- return false;
- }
- Map<String, JsonNode> dataMap = new HashMap<>();
- for (CrawlerFlowHeadModel crawlerFlowHeadModel : crawlerFlowHeadModelList) {
- /**
- * 采集信息
- */
- String datasetCode = crawlerFlowHeadModel.getDatasetCode();
- AdapterDataSet adapterDataSet = adapterDataSetMap.get(datasetCode);
- JsonNode data = dispatch.fecthData(patient, adapterDataSet);
- if (StringUtil.isEmpty(data)) {
- continue;
- }
- dataMap.put(datasetCode, data);
- /**
- * 根据采集流程递归查询
- */
- getDataByCrawlerFlow(datasetCode, patient, dataMap);
- if (sysConfig.getRegisterDataSet().equals(adapterDataSet.getAdapterDataSetT().getStdDatasetCode())) {
- if (!StringUtil.isEmpty(data.get("data")) && !StringUtil.isEmpty(data.get("data").get(0))) {
- if (!StringUtil.isEmpty(data.get("data").get(0).get(SysConfig.getInstance().getRegisterIdCardNo()))) {
- logger.info("注册病人");
- dispatch.register(patient, data.toString());
- }
- }
- }
- }
- logger.info("采集病人成功,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo());
- /**
- * 上传档案
- */
- try {
- if (!CollectionUtil.isEmpty(dataMap.keySet())) {
- if (!dispatch.upload(dataMap, patient, adapterDataSetMap)) {
- logger.error("上传档案失败");
- return false;
- }
- }
- } catch (Exception e) {
- logger.error("档案上传失败,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo());
- return false;
- }
- } catch (Exception e) {
- logger.error("采集病人失败,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo(), e);
- return false;
- }
- return true;
- }
- 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();
- metadataCode = StringUtil.substring(metadataCode, metadataCode.indexOf("-") + 1, metadataCode.length());
- String inputMetadataCode = crawlerFlowMetadata.getInputMetadataCode();
- inputMetadataCode = StringUtil.substring(inputMetadataCode, inputMetadataCode.indexOf("-") + 1, inputMetadataCode.length());
- Iterator<JsonNode> array = preData.get("data").iterator();
- while (array.hasNext()) {
- JsonNode dataNode = array.next();
- relationValueMap.put(metadataCode, dataNode.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) {
- return true;
- }
- logger.info("适配基本相关数据准备");
- try {
- adapterDataSetMap = new HashMap<>();
- AdapterVersion adapterVersion;
- List<Integer> datasetIdList = new ArrayList<>();
- /**
- * 推模式接口调用,默认只使用最新版本的适配
- */
- AdapterSchemeVersionService adapterSchemeVersionService = SpringBeanUtil.getService(AdapterSchemeVersionService.BEAN_ID);
- AdapterSchemeVersionModel adapterSchemeVersionModel;
- if (datasetList.isEmpty()) {
- adapterSchemeVersionModel = adapterSchemeVersionService.getEhrAdapterVersionLasted();
- if (adapterSchemeVersionModel == null) {
- logger.error("获取最新ehr适配版本错误");
- return false;
- } else {
- this.schemeVersion = adapterSchemeVersionModel.getVersion();
- adapterVersion = new AdapterVersion(schemeVersion);
- }
- /**
- * 获取该版本下数据集
- */
- CrawlerDatasetDao crawlerDatasetDao = SpringBeanUtil.getService(CrawlerDatasetDao.BEAN_ID);
- List<CrawlerDataSetModel> crawlerDataSetModelList = crawlerDatasetDao.getCrawlerDatasetList(adapterSchemeVersionModel.getId());
- if (CollectionUtil.isEmpty(crawlerDataSetModelList)) {
- return false;
- }
- for (CrawlerDataSetModel crawlerDataSetModel : crawlerDataSetModelList) {
- datasetIdList.add(crawlerDataSetModel.getDatasetId());
- }
- } else {
- /**
- * 拉模式接口调用,由任务配置决定适配版本
- */
- adapterSchemeVersionModel = adapterSchemeVersionService.getByVersion(schemeVersion);
- adapterVersion = new AdapterVersion(schemeVersion);
- for (DictItem dictItem : datasetList) {
- datasetIdList.add(Integer.valueOf(dictItem.getCode()));
- }
- }
- AdapterDatasetService adapterDatasetService = SpringBeanUtil.getService(AdapterDatasetService.BEAN_ID);
- /**
- * 字典项初始化
- */
- 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<>();
- }
- entryModelList.add(adapterDictEntryModel);
- adapterDictEntryModelMap.put(adapterDictEntryModel.getStdDictId(), entryModelList);
- }
- /**
- * 数据集初始化
- */
- List<AdapterDatasetModel> adapterDataSetModelList = adapterDatasetService.getListByAdapterDatasetIdList(adapterVersion, datasetIdList);
- for (AdapterDatasetModel adapterDatasetModel : adapterDataSetModelList) {
- adapterDataSetMap.put(adapterDatasetModel.getStdDatasetCode(), new AdapterDataSet(adapterDatasetModel, adapterVersion, adapterDictEntryModelMap));
- }
- /**
- * 获取采集流程表头
- */
- CrawlerFlowHeadDao crawlerFlowHeadDao = SpringBeanUtil.getService(CrawlerFlowHeadDao.BEAN_ID);
- CrawlerFlowDao crawlerFlowDao = SpringBeanUtil.getService(CrawlerFlowDao.BEAN_ID);
- crawlerFlowHeadModelList = crawlerFlowHeadDao.getCrawlerFlowHeadList(adapterSchemeVersionModel.getId());
- List<CrawlerFlowModel> crawlerFlowModelList = crawlerFlowDao.getCrawlerFlowList(adapterSchemeVersionModel.getId());
- 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);
- crawlerFlowDatasetMap.put(inputDatasetCode, datasetList);
- if (crawlerFlowMetadataMap.containsKey(datasetCode)) {
- metadataList = crawlerFlowMetadataMap.get(datasetCode);
- }
- metadataList.add(crawlerFlowModel);
- crawlerFlowMetadataMap.put(datasetCode, metadataList);
- }
- // SysConfig.getInstance().setVersionMap(new HashMap<>());
- adapterFlg = true;
- return true;
- } catch (Exception e) {
- adapterFlg = false;
- return false;
- }
- }
- /**
- * 解析病人索引信息
- *
- * @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) {
- logger.error("patient参数错误:" + patientInfo, e);
- return null;
- }
- }
- public void setAdapterFlg(Boolean adapterFlg) {
- this.adapterFlg = adapterFlg;
- }
- }
|