package com.yihu.hos.crawler.service; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.yihu.hos.core.datatype.StringUtil; import com.yihu.hos.core.encrypt.MD5; import com.yihu.hos.core.http.HTTPResponse; import com.yihu.hos.core.http.HttpClientKit; import com.yihu.hos.core.log.Logger; import com.yihu.hos.core.log.LoggerFactory; import com.yihu.hos.crawler.model.adapter.AdapterDataSet; import com.yihu.hos.crawler.model.config.SysConfig; import com.yihu.hos.crawler.model.patient.Patient; import com.yihu.hos.crawler.model.transform.EhrCondition; import com.yihu.hos.web.framework.constant.SqlConstants; import org.json.JSONObject; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.core.io.support.EncodedResource; import org.springframework.core.io.support.PropertiesLoaderUtils; import sun.misc.BASE64Encoder; import java.io.File; import java.util.*; /** * Created by hzp on 2016/3/10. */ public class EsbHttp { public static String defaultHttpUrl; public static String clientId; public static String clientKey; public static String httpGateway; public static String defaultHttpUser; public static String defaultHttpPassword; public static String sslKeyStore; public static String sslPassword; private static Logger logger = LoggerFactory.getLogger(EsbHttp.class); static { //默认配置 try { Resource resource = new ClassPathResource("config/http.properties"); EncodedResource encRes = new EncodedResource(resource, "UTF-8"); Properties props = PropertiesLoaderUtils.loadProperties(encRes); defaultHttpUrl = props.getProperty("httpUrl"); defaultHttpUser = props.getProperty("httpUser"); defaultHttpPassword = props.getProperty("httpPassword"); clientId = props.getProperty("clientId"); clientKey = props.getProperty("clientKey"); sslKeyStore = props.getProperty("sslKeystore"); sslPassword = props.getProperty("sslPassword"); } catch (Exception e) { System.out.print(e.getMessage()); } } /***************************** 用户接口 *********************************************/ /** * 用户登录验证 */ public static HTTPResponse loginAction(String user, String password) throws Exception { String loginAction = defaultHttpUrl + "/authorizations/users/" + user; Map header = new HashMap<>(); String auth = new BASE64Encoder().encode((user + ":" + password).getBytes()); header.put("Authorization", "Basic " + auth); return HttpClientKit.put(loginAction, null, header); } /* * 获取用户信息 * */ public static HTTPResponse getUserInfo(String user, String token) { String url = defaultHttpUrl + "/users/" + user; Map params = new HashMap<>(); params.put("token", token); params.put("user", user); return HttpClientKit.get(url, params); } /***************************** 应用接口 *********************************************/ /** * 获取本机指纹 * * @return */ private static String GetFingerprint() { try { return UUID.randomUUID().toString(); } catch (Exception e) { System.out.print(e.getMessage()); return ""; } } /** * 应用登录验证 */ public static String getToken() { try { String loginAction = defaultHttpUrl + "/authorizations/clients/" + clientId; Map header = new HashMap<>(); header.put("Authorization", "Basic " + clientKey); //本地指纹 Map params = new HashMap<>(); params.put("info", "{\"fingerprint\": \"" + GetFingerprint() + "\"}"); HTTPResponse response = HttpClientKit.put(loginAction, params, header); if (response != null && response.getStatusCode() == 200) { JSONObject obj = new JSONObject(response.getBody()); //判断是否成功 if (obj.has("token")) { return obj.getString("token"); } else { logger.info("返回未包含token。"); return null; } } else { String msg = "获取Token失败。"; if (response != null) { msg += "(错误代码:" + response.getStatusCode() + ",错误信息:" + response.getBody() + ")"; } logger.info(msg); return null; } } catch (Exception ex) { logger.info("获取Token失败," + ex.getMessage()); return null; } } /** * 获取病人列表 */ public static String getPatientList(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.put("api", "collectionData"); String params = mapper.writeValueAsString(paramsNode); formParams.put("param", params); HTTPResponse response = HttpClientKit.post(httpGateway, formParams); if (response == null || response.getStatusCode() != 200) { logger.error("获取病人列表错误,请求HTTP错误,请检查配置或HTTP是否可用."); return ""; } JsonNode responseNode = mapper.readValue(response.getBody(), JsonNode.class); String code = responseNode.path("responseCode").asText(); if (StringUtil.isEmpty(code) || !code.equals("10000")) { logger.error("获取病人列表错误,请求HTTP错误,请检查集成平台网关是否可用."); return ""; } String rootStr = responseNode.path("responseResult").asText(); if ("".equals(rootStr)) { logger.error("获取病人列表错误,集成平台获取病人列表失败."); return ""; } return rootStr; } catch (Exception e) { logger.error("获取病人列表失败!", e); return ""; } } public static String getFecthData(Map formParams) { try { HTTPResponse response = HttpClientKit.post(httpGateway, formParams); if (response == null || response.getStatusCode() != 200) { logger.info("获取病人数据错误,请求HTTP错误,请检查配置或HTTP是否可用."); return SqlConstants.EMPTY; } ObjectMapper mapper = new ObjectMapper(); JsonNode responseNode = mapper.readValue(response.getBody(), JsonNode.class); String code = responseNode.path("responseCode").asText(); if (StringUtil.isEmpty(code) || !code.equals("10000")) { logger.info("获取病人数据错误,请求HTTP错误,请检查集成平台网关是否可用."); return SqlConstants.EMPTY; } String rootStr = responseNode.path("responseResult").asText(); if (SqlConstants.EMPTY.equals(rootStr)) { logger.info("获取病人数据错误,集成平台获取病人数据失败."); return SqlConstants.EMPTY; } return rootStr; } catch (Exception e) { logger.error("获取病人数据失败.", e); return SqlConstants.EMPTY; } } /** * 获取公钥 */ public static String getPublicKey(String orgCode) { try { String token = getToken(); if (!StringUtil.isEmpty(SysConfig.getInstance().getPublicKeyMap().get(orgCode))) { return SysConfig.getInstance().getPublicKeyMap().get(orgCode); } Map header = new HashMap<>(); header.put("Authorization", "Basic " + clientKey); Map paramMap = new HashMap<>(); paramMap.put("org_code", orgCode); paramMap.put("token", token); String publicKeyMethod = defaultHttpUrl + "/organizations/" + orgCode + "/key"; HTTPResponse response = HttpClientKit.get(publicKeyMethod, paramMap, header); if (response != null && response.getStatusCode() == 200) { JSONObject json = new JSONObject(response.getBody()); if (json.has("publicKey")) { String publicKey = json.getString("publicKey"); SysConfig.getInstance().getPublicKeyMap().put(orgCode, publicKey); return publicKey; } else { logger.info("获取公钥失败,返回未包含publicKey。"); return null; } } else { String msg = "获取公钥失败。"; if (response != null) { msg += "(错误代码:" + response.getStatusCode() + ",错误信息:" + response.getBody() + ")"; } logger.info(msg); return null; } } catch (Exception e) { logger.info(e.getMessage()); return null; } } /** * 获取健康云平台标准版本号 */ public static String getRemoteVersion(String orgCode) { try { String token = getToken(); String versionMethod = defaultHttpUrl + "/adaptions/org_plan/version"; Map header = new HashMap<>(); header.put("Authorization", "Basic " + clientKey); Map params = new HashMap<>(); params.put("org_code", orgCode); params.put("token", token); HTTPResponse response = HttpClientKit.get(versionMethod, params, header); if (response != null && response.getStatusCode() == 200) { return response.getBody(); } else { String msg = "获取健康云平台标准版本号失败"; if (response != null) { msg += "(错误代码:" + response.getStatusCode() + ",错误信息:" + response.getBody() + ")"; } logger.info(msg); return null; } } catch (Exception e) { logger.info("获取远程版本号异常"); logger.error(e.getCause().toString()); return null; } } /** * 注册病人 */ public static Boolean register(Patient patient, String data, String token) { try { JSONObject json = new JSONObject(data); String colName = SysConfig.registerIdCardNo; Map header = new HashMap<>(); header.put("Authorization", "Basic " + clientKey); header.put("User-Agent", "client " + clientId); if (json != null && json.has("data")) { JSONObject p = (JSONObject) json.getJSONArray("data").get(0); if (!p.has(colName) || StringUtil.isEmpty(p.get(colName))) { logger.info("注册病人信息请求失败:身份证号码为空,patient_id=" + patient.getPatientId() + ", event_no=" + patient.getEventNo()); return false; } else { String idCord = p.getString(colName); String registerMethod = defaultHttpUrl + "/patients/" + idCord; if (StringUtil.isEmpty(data)) { logger.info("注册病人信息请求失败:无具体病人信息,patient_id=" + patient.getPatientId() + ", event_no=" + patient.getEventNo()); return false; } Map paramMap = new HashMap<>(); paramMap.put("demographic_id", idCord); paramMap.put("json", data); paramMap.put("token", token); HTTPResponse response = HttpClientKit.post(registerMethod, paramMap, header); if (response != null && response.getStatusCode() == 200) { logger.info("注册病人信息成功。patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo()); return true; } else { String msg = "注册病人信息请求失败。patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo(); if (response != null) { msg += "(错误代码:" + response.getStatusCode() + ",错误信息:" + response.getBody() + ")"; } logger.info(msg); return false; } } } else { logger.info("注册病人信息请求失败:传入数据无效,patient_id=" + patient.getPatientId() + ", event_no=" + patient.getEventNo()); return false; } } catch (Exception e) { logger.info("注册病人信息请求失败." + e.getMessage()); return false; } } /** * 上传病人档案 */ public static boolean upload(Patient patient, File file, String encryptPwd, String token) { try { String uploadMethod = defaultHttpUrl + "/packages"; String fileMd5 = MD5.getMd5ByFile(file); Map formParams = new HashMap<>(); formParams.put("md5", fileMd5); formParams.put("package_crypto", encryptPwd); formParams.put("org_code", patient.getOrgCode()); formParams.put("token", token); Map header = new HashMap<>(); header.put("Authorization", "Basic " + clientKey); header.put("User-Agent", "client " + clientId); HTTPResponse response = HttpClientKit.postFile(uploadMethod, file.getAbsolutePath(), formParams, header); if (response != null && response.getStatusCode() == 200) { logger.info("上传病人档案成功,patient_id:" + patient.getPatientId() + ",event_no:" + patient.getEventNo()); return true; } else { String msg = "上传病人档案请求失败,patient_id:" + patient.getPatientId() + ",event_no:" + patient.getEventNo(); if (response != null) { msg += "(错误代码:" + response.getStatusCode() + ",错误信息:" + response.getBody() + ")"; } logger.info(msg); return false; } } catch (Exception e) { logger.info("上传病人档案异常,patient_id:" + patient.getPatientId() + ",event_no:" + patient.getEventNo()); logger.error(e.getCause().toString()); return false; } } /** * 下载标准包 */ public static HTTPResponse download(String remoteVersion, String orgCode) { try { String token = getToken(); String downLoadMethod = defaultHttpUrl + "/adaptions/" + orgCode + "/source"; Map params = new HashMap<>(); params.put("version_code", remoteVersion); params.put("org_code", orgCode); params.put("token", token); Map header = new HashMap<>(); header.put("Authorization", "Basic " + clientKey); HTTPResponse response = HttpClientKit.get(downLoadMethod, params, header); return response; } catch (Exception e) { logger.info("下载标准包异常:"); logger.error(e.getCause().toString()); return null; } } }