|  | @ -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;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | }
 |