123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- 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<PatientT>
- */
- public List<Patient> getPatientList(Map<String, Object> condition, Map<String, AdapterDataSet> adapterDataSetMap) {
- ArrayList<Patient> 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<String, String> 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<EhrCondition> 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<JsonNode> 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<String, String> getItemList(AdapterDataSet adapterDataSet) throws Exception {
- Map<String, String> 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<EhrCondition> queryParams) {
- try {
- ObjectMapper mapper = new ObjectMapper();
- ObjectNode paramsNode = mapper.createObjectNode();
- paramsNode.put("tableCode", adapterDataSet.getAdapterDataSetT().getStdDatasetCode());
- paramsNode.put("condition", mapper.writeValueAsString(queryParams));
- Map<String, String> 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<String, String> relationValueMap) {
- List<EhrCondition> 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<EhrCondition> 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<String, String> 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<JsonNode> 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<String, JsonNode> dataMap, Patient patient, Map<String, AdapterDataSet> 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<String, Object> parseToken(String responToken) {
- ObjectMapper mapper = new ObjectMapper();
- Map<String, Object> tokenMap = null;
- try {
- Map<String, Object> map = mapper.readValue(responToken, Map.class);
- String code = (String) map.get("code");
- if (SqlConstants.OK.equals(code)) {
- tokenMap = (Map<String, Object>) map.get("result");
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- return tokenMap;
- }
- }//end DataCollectDispatcher
|