package com.yihu.hos.crawler.service; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.yihu.hos.core.datatype.DateUtil; import com.yihu.hos.core.datatype.StringUtil; import com.yihu.hos.core.file.FileUtil; import com.yihu.hos.core.log.Logger; import com.yihu.hos.core.log.LoggerFactory; import com.yihu.hos.crawler.format.DataSetTransformer; import com.yihu.hos.crawler.model.adapter.AdapterDataSet; import com.yihu.hos.crawler.model.adapter.AdapterMetaData; import com.yihu.hos.crawler.model.config.SysConfig; import com.yihu.hos.crawler.model.patient.Patient; import com.yihu.hos.crawler.model.patient.PatientIdentity; import com.yihu.hos.crawler.model.transform.EhrCondition; import com.yihu.hos.crawler.model.transform.LogicValues; import com.yihu.hos.standard.model.adapter.AdapterMetadataModel; import com.yihu.hos.web.framework.constrant.SqlConstants; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.*; public class DataCollectDispatcher { private static DataCollectDispatcher ourInstance = new DataCollectDispatcher(); private static Logger logger = LoggerFactory.getLogger(DataCollectDispatcher.class); private String token; private DataCollectDispatcher() { } public static DataCollectDispatcher getInstance() { return ourInstance; } public void finalize() throws Throwable { } public Boolean getToken() { try { token = EsbHttp.getToken(); if (StringUtil.isEmpty(token)) { return false; } return true; } catch (Exception e) { logger.error("本次任务执行失败,获取token失败!"); return false; } } public Boolean getRemoteVersion(String orgCode) { try { if (StringUtil.isEmpty(SysConfig.getInstance().getVersionMap().get(orgCode))) { String stdVersion = EsbHttp.getRemoteVersion(orgCode); if (StringUtil.isEmpty(stdVersion)) { return false; } SysConfig.getInstance().getVersionMap().put(orgCode, stdVersion); } return true; } catch (Exception e) { logger.error("本次任务执行失败,获取token失败!"); return false; } } /** * 获取病人列表 * * @param condition * @return List */ public List getPatientList(Map condition, Map adapterDataSetMap) { ArrayList patientList = new ArrayList<>(); SimpleDateFormat df = new SimpleDateFormat(DateUtil.DEFAULT_YMDHMSDATE_FORMAT); for (String key : adapterDataSetMap.keySet()) { PatientIdentity patientIdentity = SysConfig.getInstance().getPatientIdentity(key); if (patientIdentity == null) { continue; } try { //获取病人列表字段检验 Map propertyMap = getItemList(adapterDataSetMap.get(key)); if (propertyMap == null) { return patientList; } //请求参数 Date beginDate = (Date) condition.get("beginDate"); String beginTime = df.format(beginDate); Date endDate = (Date) condition.get("endDate"); String endTime = df.format(endDate); List queryParams = new ArrayList<>(); queryParams.add(new EhrCondition(" > ", patientIdentity.getRefTimeCode(), beginTime)); queryParams.add(new EhrCondition(" < ", patientIdentity.getRefTimeCode(), endTime)); //Rest 接口请求 String rootStr = EsbHttp.getPatientList(adapterDataSetMap.get(key), queryParams); if (StringUtil.isEmpty(rootStr)) { return null; } ObjectMapper mapper = new ObjectMapper(); JsonNode resultNode = mapper.readValue(rootStr, JsonNode.class); JsonNode patientNode = resultNode.path("detailModelList"); boolean isArr = patientNode.isArray(); if (isArr) { Iterator array = patientNode.iterator(); while (array.hasNext()) { JsonNode node = array.next(); Patient patient = new Patient(); String patientId = node.path(propertyMap.get(SqlConstants.PATIENT_ID)).asText(); String eventNo = node.path(propertyMap.get(SqlConstants.EVENT_NO)).asText(); String refTime = node.path(propertyMap.get(SqlConstants.EVENT_TIME)).asText(); String orgCode = node.path(SqlConstants.ORG_CODE.toUpperCase()).asText(); patient.setPatientId(patientId); patient.setEventNo(eventNo); patient.setReferenceTime(refTime); patient.setOrgCode(orgCode); patientList.add(patient); } } } catch (Exception e) { logger.error("采集病人失败", e); } } return patientList; } public Map getItemList(AdapterDataSet adapterDataSet) throws Exception { Map propertyMap = new HashMap<>(); PatientIdentity patientIdentity = SysConfig.getInstance().getPatientIdentity(adapterDataSet.getAdapterDataSetT().getStdDatasetCode()); if (adapterDataSet.isHavePatientID()) { AdapterMetaData adapterMetaData = adapterDataSet.getAdapterMetaDataMap().get(PatientIdentity.getPatientIDCode()); propertyMap.put(SqlConstants.PATIENT_ID, adapterMetaData.getAdapterMetadataModel().getStdMetadataCode().toUpperCase()); } else { logger.error("", new Exception("采集病人列表数据集必须有patient_id.")); return null; } if (adapterDataSet.isHaveEventNo()) { AdapterMetaData adapterMetaData = adapterDataSet.getAdapterMetaDataMap().get(patientIdentity.getEventNoCode()); propertyMap.put(SqlConstants.EVENT_NO, adapterMetaData.getAdapterMetadataModel().getStdMetadataCode().toUpperCase()); } else { logger.error("采集病人列表数据集必须有event_no."); return null; } AdapterMetaData adapterRefMetaData = adapterDataSet.getAdapterMetaDataMap().get(patientIdentity.getRefTimeCode()); if (adapterRefMetaData == null) { logger.error("采集病人列表数据集必须有采集时间."); return null; } propertyMap.put(SqlConstants.EVENT_TIME, adapterRefMetaData.getAdapterMetadataModel().getStdMetadataCode().toUpperCase()); return propertyMap; } public String fecthData(Patient patient, AdapterDataSet adapterDataSet, List queryParams) { try { ObjectMapper mapper = new ObjectMapper(); ObjectNode paramsNode = mapper.createObjectNode(); paramsNode.put("tableCode", adapterDataSet.getAdapterDataSetT().getStdDatasetCode()); paramsNode.put("condition", mapper.writeValueAsString(queryParams)); Map formParams = new HashMap<>(); // formParams.add(new BasicNameValuePair("secret", secret)); formParams.put("api", "collectionData"); formParams.put("param", mapper.writeValueAsString(paramsNode)); //调用资源服务网关 String rootStr = EsbHttp.getFecthData(formParams); JsonNode resultNode = mapper.readValue(rootStr, JsonNode.class); JsonNode result = resultNode.path("detailModelList"); JsonNode data = matchAdapterData(result, adapterDataSet); ObjectNode jsonObject = mapper.createObjectNode(); if (data != null && data.size() > 0) { jsonObject.set("data", data); jsonObject.put("code", adapterDataSet.getAdapterDataSetT().getStdDatasetCode()); jsonObject.put("patient_id", patient.getPatientId()); jsonObject.put("event_no", patient.getEventNo()); String agencyCode = patient.getOrgCode(); jsonObject.put("org_code", agencyCode); jsonObject.put("inner_version", SysConfig.getInstance().getVersionMap().get(patient.getOrgCode())); jsonObject.put("create_date", DateUtil.toString(new Date(), DateUtil.DEFAULT_YMDHMSDATE_FORMAT)); jsonObject.put("event_time", patient.getReferenceTime());//DateUtil.toString(patient.getReferenceTime(), DateUtil.DEFAULT_YMDHMSDATE_FORMAT) if (StringUtil.isEmpty(patient.getReUploadFlg())) { jsonObject.put("reUploadFlg", LogicValues.LOGIC_FALSE); } else { jsonObject.put("reUploadFlg", patient.getReUploadFlg()); } return jsonObject.toString(); } else { return SqlConstants.EMPTY; } } catch (Exception e) { return SqlConstants.EMPTY; } } public String fecthData(Patient patient, AdapterDataSet adapterDataSet, Map relationValueMap) { List queryParams = new ArrayList<>(); for (String key : relationValueMap.keySet()) { queryParams.add(new EhrCondition(" = ", key, relationValueMap.get(key))); } return fecthData(patient, adapterDataSet, queryParams); } /** * 根据编排任务进行采集 * * @param patient * @param adapterDataSet * @return */ public JsonNode fecthData(Patient patient, AdapterDataSet adapterDataSet) { try { ObjectMapper mapper = new ObjectMapper(); List queryParams = new ArrayList<>(); boolean patientId = true; if (adapterDataSet.isHavePatientID()) { AdapterMetaData adapterMetaData = adapterDataSet.getAdapterMetaDataMap().get(PatientIdentity.getPatientIDCode()); queryParams.add(new EhrCondition(" = ", adapterMetaData.getAdapterMetadataModel().getStdMetadataCode(), patient.getPatientId())); } else { patientId = false; } boolean eventNo = true; if (adapterDataSet.isHaveEventNo()) { AdapterMetaData adapterMetaData = adapterDataSet.getAdapterMetaDataMap().get(adapterDataSet.getEventNoCode()); queryParams.add(new EhrCondition(" = ", adapterMetaData.getAdapterMetadataModel().getStdMetadataCode(), patient.getEventNo())); } else { eventNo = false; } if (!patientId && !eventNo) { logger.error("采集病人数据集至少需要一项病人标识.数据集名:" + adapterDataSet.getAdapterDataSetT().getStdDatasetCode()); return null; } ObjectNode paramsNode = mapper.createObjectNode(); paramsNode.put("tableCode", adapterDataSet.getAdapterDataSetT().getStdDatasetCode()); paramsNode.put("condition", mapper.writeValueAsString(queryParams)); Map formParams = new HashMap<>(); // formParams.add(new BasicNameValuePair("secret", secret)); formParams.put("api", "collectionData"); formParams.put("param", mapper.writeValueAsString(paramsNode)); //调用资源服务网关 String rootStr = EsbHttp.getFecthData(formParams); JsonNode resultNode = mapper.readValue(rootStr, JsonNode.class); JsonNode result = resultNode.path("detailModelList"); JsonNode data = matchAdapterData(result, adapterDataSet); ObjectNode jsonObject = mapper.createObjectNode(); if (data != null && data.size() > 0) { jsonObject.set("data", data); jsonObject.put("code", adapterDataSet.getAdapterDataSetT().getStdDatasetCode()); jsonObject.put("patient_id", patient.getPatientId()); jsonObject.put("event_no", patient.getEventNo()); String agencyCode = patient.getOrgCode(); jsonObject.put("org_code", agencyCode); jsonObject.put("inner_version", SysConfig.getInstance().getVersionMap().get(patient.getOrgCode())); jsonObject.put("create_date", DateUtil.toString(new Date(), DateUtil.DEFAULT_YMDHMSDATE_FORMAT)); jsonObject.put("event_time", patient.getReferenceTime());//DateUtil.toString(patient.getReferenceTime(), DateUtil.DEFAULT_YMDHMSDATE_FORMAT) if (StringUtil.isEmpty(patient.getReUploadFlg())) { jsonObject.put("reUploadFlg", LogicValues.LOGIC_FALSE); } else { jsonObject.put("reUploadFlg", patient.getReUploadFlg()); } return jsonObject; } else { return null; } } catch (Exception e) { logger.error("", e); } return null; } public JsonNode matchAdapterData(JsonNode data, AdapterDataSet adapterDataSet) { ObjectMapper mapper = new ObjectMapper(); ArrayNode result = mapper.createArrayNode(); Iterator array = data.iterator(); while (array.hasNext()) { JsonNode dataNode = array.next(); ObjectNode jsonNode = mapper.createObjectNode(); for (AdapterMetaData adapterMetaData : adapterDataSet.getAdapterMetaDataList()) { AdapterMetadataModel adapterMetadataModel = adapterMetaData.getAdapterMetadataModel(); String orgMetaDataCode = adapterMetadataModel.getAdapterMetadataCode(); String stdMetaDataCode = adapterMetadataModel.getStdMetadataCode(); if (!StringUtil.isEmpty(orgMetaDataCode)) { jsonNode.put(orgMetaDataCode, dataNode.path(stdMetaDataCode).asText()); } } result.add(jsonNode); } return result; } public Boolean register(Patient patient, String data) { return EsbHttp.register(patient, data, token); } public Boolean upload(Map dataMap, Patient patient, Map dataSetMap) { Boolean result = true; try { DataSetTransformer dataTransformer = new DataSetTransformer(); for (String key : dataMap.keySet()) { dataTransformer.setData(dataMap.get(key)); if (!toFile(dataTransformer, patient, "origin")) { logger.info("存储原始文件失败:patient_id=" + patient.getPatientId() + "event_no=" + patient.getEventNo()); result = false; break; } dataTransformer.transfer(dataSetMap); if (!toFile(dataTransformer, patient, "standard")) { logger.info("存储标准文件失败:patient_id=" + patient.getPatientId() + "event_no=" + patient.getEventNo()); result = false; break; } } PatientCDAUpload patientCDAUpload = new PatientCDAUpload(); if (!patientCDAUpload.upload(patient, token)) { result = false; } } catch (Exception e) { result = false; } return result; } public boolean toFile(DataSetTransformer dataTransformer, Patient patient, String fileName) { JsonNode jsonObject = dataTransformer.getJsonObject(); PatientCDAIndex patientCDAIndex = new PatientCDAIndex(patient); String filePath = patientCDAIndex.createDataIndex(fileName, PatientCDAIndex.FileType.JSON); boolean writeFile = false; try { writeFile = FileUtil.writeFile(filePath, jsonObject.toString(), "UTF-8"); } catch (IOException e) { logger.info("存储临时文件失败."); logger.error("", e); } return writeFile; } /** * 解析token内容 * * @param responToken * @return */ public Map parseToken(String responToken) { ObjectMapper mapper = new ObjectMapper(); Map tokenMap = null; try { Map map = mapper.readValue(responToken, Map.class); String code = (String) map.get("code"); if (SqlConstants.OK.equals(code)) { tokenMap = (Map) map.get("result"); } } catch (IOException e) { e.printStackTrace(); } return tokenMap; } }//end DataCollectDispatcher