DataCollectDispatcher.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. package com.yihu.hos.crawler.service;
  2. import com.fasterxml.jackson.databind.JsonNode;
  3. import com.fasterxml.jackson.databind.ObjectMapper;
  4. import com.fasterxml.jackson.databind.node.ArrayNode;
  5. import com.fasterxml.jackson.databind.node.ObjectNode;
  6. import com.yihu.hos.core.datatype.DateUtil;
  7. import com.yihu.hos.core.datatype.StringUtil;
  8. import com.yihu.hos.core.file.FileUtil;
  9. import com.yihu.hos.core.log.Logger;
  10. import com.yihu.hos.core.log.LoggerFactory;
  11. import com.yihu.hos.crawler.format.DataSetTransformer;
  12. import com.yihu.hos.crawler.model.adapter.AdapterDataSet;
  13. import com.yihu.hos.crawler.model.adapter.AdapterMetaData;
  14. import com.yihu.hos.crawler.model.config.SysConfig;
  15. import com.yihu.hos.crawler.model.patient.Patient;
  16. import com.yihu.hos.crawler.model.patient.PatientIdentity;
  17. import com.yihu.hos.crawler.model.transform.EhrCondition;
  18. import com.yihu.hos.crawler.model.transform.LogicValues;
  19. import com.yihu.hos.standard.model.adapter.AdapterMetadataModel;
  20. import com.yihu.hos.web.framework.constrant.SqlConstants;
  21. import java.io.IOException;
  22. import java.text.SimpleDateFormat;
  23. import java.util.*;
  24. public class DataCollectDispatcher {
  25. private static DataCollectDispatcher ourInstance = new DataCollectDispatcher();
  26. private static Logger logger = LoggerFactory.getLogger(DataCollectDispatcher.class);
  27. private String token;
  28. private DataCollectDispatcher() {
  29. }
  30. public static DataCollectDispatcher getInstance() {
  31. return ourInstance;
  32. }
  33. public void finalize() throws Throwable {
  34. }
  35. public Boolean getToken() {
  36. try {
  37. token = EsbHttp.getToken();
  38. if (StringUtil.isEmpty(token)) {
  39. return false;
  40. }
  41. return true;
  42. } catch (Exception e) {
  43. logger.error("本次任务执行失败,获取token失败!");
  44. return false;
  45. }
  46. }
  47. public Boolean getRemoteVersion(String orgCode) {
  48. try {
  49. if (StringUtil.isEmpty(SysConfig.getInstance().getVersionMap().get(orgCode))) {
  50. String stdVersion = EsbHttp.getRemoteVersion(orgCode);
  51. if (StringUtil.isEmpty(stdVersion)) {
  52. return false;
  53. }
  54. SysConfig.getInstance().getVersionMap().put(orgCode, stdVersion);
  55. }
  56. return true;
  57. } catch (Exception e) {
  58. logger.error("本次任务执行失败,获取token失败!");
  59. return false;
  60. }
  61. }
  62. /**
  63. * 获取病人列表
  64. *
  65. * @param condition
  66. * @return List<PatientT>
  67. */
  68. public List<Patient> getPatientList(Map<String, Object> condition, Map<String, AdapterDataSet> adapterDataSetMap) {
  69. ArrayList<Patient> patientList = new ArrayList<>();
  70. SimpleDateFormat df = new SimpleDateFormat(DateUtil.DEFAULT_YMDHMSDATE_FORMAT);
  71. for (String key : adapterDataSetMap.keySet()) {
  72. PatientIdentity patientIdentity = SysConfig.getInstance().getPatientIdentity(key);
  73. if (patientIdentity == null) {
  74. continue;
  75. }
  76. try {
  77. //获取病人列表字段检验
  78. Map<String, String> propertyMap = getItemList(adapterDataSetMap.get(key));
  79. if (propertyMap == null) {
  80. return patientList;
  81. }
  82. //请求参数
  83. Date beginDate = (Date) condition.get("beginDate");
  84. String beginTime = df.format(beginDate);
  85. Date endDate = (Date) condition.get("endDate");
  86. String endTime = df.format(endDate);
  87. List<EhrCondition> queryParams = new ArrayList<>();
  88. queryParams.add(new EhrCondition(" > ", patientIdentity.getRefTimeCode(), beginTime));
  89. queryParams.add(new EhrCondition(" < ", patientIdentity.getRefTimeCode(), endTime));
  90. //Rest 接口请求
  91. String rootStr = EsbHttp.getPatientList(adapterDataSetMap.get(key), queryParams);
  92. if (StringUtil.isEmpty(rootStr)) {
  93. return null;
  94. }
  95. ObjectMapper mapper = new ObjectMapper();
  96. JsonNode resultNode = mapper.readValue(rootStr, JsonNode.class);
  97. JsonNode patientNode = resultNode.path("detailModelList");
  98. boolean isArr = patientNode.isArray();
  99. if (isArr) {
  100. Iterator<JsonNode> array = patientNode.iterator();
  101. while (array.hasNext()) {
  102. JsonNode node = array.next();
  103. Patient patient = new Patient();
  104. String patientId = node.path(propertyMap.get(SqlConstants.PATIENT_ID)).asText();
  105. String eventNo = node.path(propertyMap.get(SqlConstants.EVENT_NO)).asText();
  106. String refTime = node.path(propertyMap.get(SqlConstants.EVENT_TIME)).asText();
  107. String orgCode = node.path(SqlConstants.ORG_CODE.toUpperCase()).asText();
  108. patient.setPatientId(patientId);
  109. patient.setEventNo(eventNo);
  110. patient.setReferenceTime(refTime);
  111. patient.setOrgCode(orgCode);
  112. patientList.add(patient);
  113. }
  114. }
  115. } catch (Exception e) {
  116. logger.error("采集病人失败", e);
  117. }
  118. }
  119. return patientList;
  120. }
  121. public Map<String, String> getItemList(AdapterDataSet adapterDataSet) throws Exception {
  122. Map<String, String> propertyMap = new HashMap<>();
  123. PatientIdentity patientIdentity = SysConfig.getInstance().getPatientIdentity(adapterDataSet.getAdapterDataSetT().getStdDatasetCode());
  124. if (adapterDataSet.isHavePatientID()) {
  125. AdapterMetaData adapterMetaData = adapterDataSet.getAdapterMetaDataMap().get(PatientIdentity.getPatientIDCode());
  126. propertyMap.put(SqlConstants.PATIENT_ID, adapterMetaData.getAdapterMetadataModel().getStdMetadataCode().toUpperCase());
  127. } else {
  128. logger.error("", new Exception("采集病人列表数据集必须有patient_id."));
  129. return null;
  130. }
  131. if (adapterDataSet.isHaveEventNo()) {
  132. AdapterMetaData adapterMetaData = adapterDataSet.getAdapterMetaDataMap().get(patientIdentity.getEventNoCode());
  133. propertyMap.put(SqlConstants.EVENT_NO, adapterMetaData.getAdapterMetadataModel().getStdMetadataCode().toUpperCase());
  134. } else {
  135. logger.error("采集病人列表数据集必须有event_no.");
  136. return null;
  137. }
  138. AdapterMetaData adapterRefMetaData = adapterDataSet.getAdapterMetaDataMap().get(patientIdentity.getRefTimeCode());
  139. if (adapterRefMetaData == null) {
  140. logger.error("采集病人列表数据集必须有采集时间.");
  141. return null;
  142. }
  143. propertyMap.put(SqlConstants.EVENT_TIME, adapterRefMetaData.getAdapterMetadataModel().getStdMetadataCode().toUpperCase());
  144. return propertyMap;
  145. }
  146. public String fecthData(Patient patient, AdapterDataSet adapterDataSet, List<EhrCondition> queryParams) {
  147. try {
  148. ObjectMapper mapper = new ObjectMapper();
  149. ObjectNode paramsNode = mapper.createObjectNode();
  150. paramsNode.put("tableCode", adapterDataSet.getAdapterDataSetT().getStdDatasetCode());
  151. paramsNode.put("condition", mapper.writeValueAsString(queryParams));
  152. Map<String, String> formParams = new HashMap<>();
  153. // formParams.add(new BasicNameValuePair("secret", secret));
  154. formParams.put("api", "collectionData");
  155. formParams.put("param", mapper.writeValueAsString(paramsNode));
  156. //调用资源服务网关
  157. String rootStr = EsbHttp.getFecthData(formParams);
  158. JsonNode resultNode = mapper.readValue(rootStr, JsonNode.class);
  159. JsonNode result = resultNode.path("detailModelList");
  160. JsonNode data = matchAdapterData(result, adapterDataSet);
  161. ObjectNode jsonObject = mapper.createObjectNode();
  162. if (data != null && data.size() > 0) {
  163. jsonObject.set("data", data);
  164. jsonObject.put("code", adapterDataSet.getAdapterDataSetT().getStdDatasetCode());
  165. jsonObject.put("patient_id", patient.getPatientId());
  166. jsonObject.put("event_no", patient.getEventNo());
  167. String agencyCode = patient.getOrgCode();
  168. jsonObject.put("org_code", agencyCode);
  169. jsonObject.put("inner_version", SysConfig.getInstance().getVersionMap().get(patient.getOrgCode()));
  170. jsonObject.put("create_date", DateUtil.toString(new Date(), DateUtil.DEFAULT_YMDHMSDATE_FORMAT));
  171. jsonObject.put("event_time", patient.getReferenceTime());//DateUtil.toString(patient.getReferenceTime(), DateUtil.DEFAULT_YMDHMSDATE_FORMAT)
  172. if (StringUtil.isEmpty(patient.getReUploadFlg())) {
  173. jsonObject.put("reUploadFlg", LogicValues.LOGIC_FALSE);
  174. } else {
  175. jsonObject.put("reUploadFlg", patient.getReUploadFlg());
  176. }
  177. return jsonObject.toString();
  178. } else {
  179. return SqlConstants.EMPTY;
  180. }
  181. } catch (Exception e) {
  182. return SqlConstants.EMPTY;
  183. }
  184. }
  185. public String fecthData(Patient patient, AdapterDataSet adapterDataSet, Map<String, String> relationValueMap) {
  186. List<EhrCondition> queryParams = new ArrayList<>();
  187. for (String key : relationValueMap.keySet()) {
  188. queryParams.add(new EhrCondition(" = ", key, relationValueMap.get(key)));
  189. }
  190. return fecthData(patient, adapterDataSet, queryParams);
  191. }
  192. /**
  193. * 根据编排任务进行采集
  194. *
  195. * @param patient
  196. * @param adapterDataSet
  197. * @return
  198. */
  199. public JsonNode fecthData(Patient patient, AdapterDataSet adapterDataSet) {
  200. try {
  201. ObjectMapper mapper = new ObjectMapper();
  202. List<EhrCondition> queryParams = new ArrayList<>();
  203. boolean patientId = true;
  204. if (adapterDataSet.isHavePatientID()) {
  205. AdapterMetaData adapterMetaData = adapterDataSet.getAdapterMetaDataMap().get(PatientIdentity.getPatientIDCode());
  206. queryParams.add(new EhrCondition(" = ", adapterMetaData.getAdapterMetadataModel().getStdMetadataCode(), patient.getPatientId()));
  207. } else {
  208. patientId = false;
  209. }
  210. boolean eventNo = true;
  211. if (adapterDataSet.isHaveEventNo()) {
  212. AdapterMetaData adapterMetaData = adapterDataSet.getAdapterMetaDataMap().get(adapterDataSet.getEventNoCode());
  213. queryParams.add(new EhrCondition(" = ", adapterMetaData.getAdapterMetadataModel().getStdMetadataCode(), patient.getEventNo()));
  214. } else {
  215. eventNo = false;
  216. }
  217. if (!patientId && !eventNo) {
  218. logger.error("采集病人数据集至少需要一项病人标识.数据集名:" + adapterDataSet.getAdapterDataSetT().getStdDatasetCode());
  219. return null;
  220. }
  221. ObjectNode paramsNode = mapper.createObjectNode();
  222. paramsNode.put("tableCode", adapterDataSet.getAdapterDataSetT().getStdDatasetCode());
  223. paramsNode.put("condition", mapper.writeValueAsString(queryParams));
  224. Map<String, String> formParams = new HashMap<>();
  225. // formParams.add(new BasicNameValuePair("secret", secret));
  226. formParams.put("api", "collectionData");
  227. formParams.put("param", mapper.writeValueAsString(paramsNode));
  228. //调用资源服务网关
  229. String rootStr = EsbHttp.getFecthData(formParams);
  230. JsonNode resultNode = mapper.readValue(rootStr, JsonNode.class);
  231. JsonNode result = resultNode.path("detailModelList");
  232. JsonNode data = matchAdapterData(result, adapterDataSet);
  233. ObjectNode jsonObject = mapper.createObjectNode();
  234. if (data != null && data.size() > 0) {
  235. jsonObject.set("data", data);
  236. jsonObject.put("code", adapterDataSet.getAdapterDataSetT().getStdDatasetCode());
  237. jsonObject.put("patient_id", patient.getPatientId());
  238. jsonObject.put("event_no", patient.getEventNo());
  239. String agencyCode = patient.getOrgCode();
  240. jsonObject.put("org_code", agencyCode);
  241. jsonObject.put("inner_version", SysConfig.getInstance().getVersionMap().get(patient.getOrgCode()));
  242. jsonObject.put("create_date", DateUtil.toString(new Date(), DateUtil.DEFAULT_YMDHMSDATE_FORMAT));
  243. jsonObject.put("event_time", patient.getReferenceTime());//DateUtil.toString(patient.getReferenceTime(), DateUtil.DEFAULT_YMDHMSDATE_FORMAT)
  244. if (StringUtil.isEmpty(patient.getReUploadFlg())) {
  245. jsonObject.put("reUploadFlg", LogicValues.LOGIC_FALSE);
  246. } else {
  247. jsonObject.put("reUploadFlg", patient.getReUploadFlg());
  248. }
  249. return jsonObject;
  250. } else {
  251. return null;
  252. }
  253. } catch (Exception e) {
  254. logger.error("", e);
  255. }
  256. return null;
  257. }
  258. public JsonNode matchAdapterData(JsonNode data, AdapterDataSet adapterDataSet) {
  259. ObjectMapper mapper = new ObjectMapper();
  260. ArrayNode result = mapper.createArrayNode();
  261. Iterator<JsonNode> array = data.iterator();
  262. while (array.hasNext()) {
  263. JsonNode dataNode = array.next();
  264. ObjectNode jsonNode = mapper.createObjectNode();
  265. for (AdapterMetaData adapterMetaData : adapterDataSet.getAdapterMetaDataList()) {
  266. AdapterMetadataModel adapterMetadataModel = adapterMetaData.getAdapterMetadataModel();
  267. String orgMetaDataCode = adapterMetadataModel.getAdapterMetadataCode();
  268. String stdMetaDataCode = adapterMetadataModel.getStdMetadataCode();
  269. if (!StringUtil.isEmpty(orgMetaDataCode)) {
  270. jsonNode.put(orgMetaDataCode, dataNode.path(stdMetaDataCode).asText());
  271. }
  272. }
  273. result.add(jsonNode);
  274. }
  275. return result;
  276. }
  277. public Boolean register(Patient patient, String data) {
  278. return EsbHttp.register(patient, data, token);
  279. }
  280. public Boolean upload(Map<String, JsonNode> dataMap, Patient patient, Map<String, AdapterDataSet> dataSetMap) {
  281. Boolean result = true;
  282. try {
  283. DataSetTransformer dataTransformer = new DataSetTransformer();
  284. for (String key : dataMap.keySet()) {
  285. dataTransformer.setData(dataMap.get(key));
  286. if (!toFile(dataTransformer, patient, "origin")) {
  287. logger.info("存储原始文件失败:patient_id=" + patient.getPatientId()
  288. + "event_no=" + patient.getEventNo());
  289. result = false;
  290. break;
  291. }
  292. dataTransformer.transfer(dataSetMap);
  293. if (!toFile(dataTransformer, patient, "standard")) {
  294. logger.info("存储标准文件失败:patient_id=" + patient.getPatientId()
  295. + "event_no=" + patient.getEventNo());
  296. result = false;
  297. break;
  298. }
  299. }
  300. PatientCDAUpload patientCDAUpload = new PatientCDAUpload();
  301. if (!patientCDAUpload.upload(patient, token)) {
  302. result = false;
  303. }
  304. } catch (Exception e) {
  305. result = false;
  306. }
  307. return result;
  308. }
  309. public boolean toFile(DataSetTransformer dataTransformer, Patient patient, String fileName) {
  310. JsonNode jsonObject = dataTransformer.getJsonObject();
  311. PatientCDAIndex patientCDAIndex = new PatientCDAIndex(patient);
  312. String filePath = patientCDAIndex.createDataIndex(fileName, PatientCDAIndex.FileType.JSON);
  313. boolean writeFile = false;
  314. try {
  315. writeFile = FileUtil.writeFile(filePath, jsonObject.toString(), "UTF-8");
  316. } catch (IOException e) {
  317. logger.info("存储临时文件失败.");
  318. logger.error("", e);
  319. }
  320. return writeFile;
  321. }
  322. /**
  323. * 解析token内容
  324. *
  325. * @param responToken
  326. * @return
  327. */
  328. public Map<String, Object> parseToken(String responToken) {
  329. ObjectMapper mapper = new ObjectMapper();
  330. Map<String, Object> tokenMap = null;
  331. try {
  332. Map<String, Object> map = mapper.readValue(responToken, Map.class);
  333. String code = (String) map.get("code");
  334. if (SqlConstants.OK.equals(code)) {
  335. tokenMap = (Map<String, Object>) map.get("result");
  336. }
  337. } catch (IOException e) {
  338. e.printStackTrace();
  339. }
  340. return tokenMap;
  341. }
  342. }//end DataCollectDispatcher