package com.java110.api.bmo; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.java110.core.context.DataFlowContext; import com.java110.core.factory.DataFlowFactory; import com.java110.entity.center.AppService; import com.java110.core.event.service.api.ServiceDataFlowEvent; import com.java110.utils.constant.CommonConstant; import com.java110.utils.constant.ServiceCodeConstant; import com.java110.utils.util.BeanConvertUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; import org.springframework.web.client.HttpStatusCodeException; import org.springframework.web.client.RestTemplate; import java.util.Map; public class ApiBaseBMO implements IApiBaseBMO{ protected static final int DEFAULT_ORDER = 1; //默认序列 protected static final int DEFAULT_SEQ = 1; @Autowired private RestTemplate restTemplate; @Autowired private RestTemplate outRestTemplate; /** * 调用下游服务 * * @param event * @return */ public ResponseEntity callService(ServiceDataFlowEvent event) { DataFlowContext dataFlowContext = event.getDataFlowContext(); AppService service = event.getAppService(); return callService(dataFlowContext, service, dataFlowContext.getReqJson()); } /** * 调用下游服务 * * @param context * @param serviceCode 下游服务 * @return */ public ResponseEntity callService(DataFlowContext context, String serviceCode,JSONArray businesses) { context.getRequestCurrentHeaders().put(CommonConstant.HTTP_ORDER_TYPE_CD, "D"); JSONObject paramInObj = restToCenterProtocol(businesses, context.getRequestCurrentHeaders()); return callService(context,serviceCode,paramInObj); } /** * 调用下游服务 * * @param context * @param serviceCode 下游服务 * @return */ public ResponseEntity callService(DataFlowContext context, String serviceCode,JSONObject paramInObj) { //将 rest header 信息传递到下层服务中去 HttpHeaders header = new HttpHeaders(); freshHttpHeader(header, context.getRequestCurrentHeaders()); ResponseEntity responseEntity = null; AppService appService = DataFlowFactory.getService(context.getAppId(), serviceCode); if (appService == null) { responseEntity = new ResponseEntity("当前没有权限访问" + ServiceCodeConstant.SERVICE_CODE_QUERY_STORE_USERS, HttpStatus.UNAUTHORIZED); context.setResponseEntity(responseEntity); return responseEntity; } return callService(context, appService, paramInObj); } /** * 调用下游服务 * * @param context * @param appService 下游服务 * @return */ public ResponseEntity callService(DataFlowContext context, AppService appService, Map paramIn) { context.getRequestCurrentHeaders().put(CommonConstant.HTTP_ORDER_TYPE_CD, "D"); ResponseEntity responseEntity = null; if (paramIn == null || paramIn.isEmpty()) { paramIn = context.getReqJson(); } RestTemplate tmpRestTemplate = appService.getServiceCode().startsWith("out.") ? outRestTemplate : restTemplate; String serviceUrl = appService.getUrl(); HttpEntity httpEntity = null; HttpHeaders header = new HttpHeaders(); for (String key : context.getRequestCurrentHeaders().keySet()) { if (CommonConstant.HTTP_SERVICE.toLowerCase().equals(key.toLowerCase())) { continue; } header.add(key, context.getRequestCurrentHeaders().get(key)); } header.add(CommonConstant.HTTP_SERVICE.toLowerCase(), appService.getServiceCode()); try { if (CommonConstant.HTTP_METHOD_GET.equals(appService.getMethod())) { serviceUrl += "?"; for (Object key : paramIn.keySet()) { serviceUrl += (key + "=" + paramIn.get(key) + "&"); } if (serviceUrl.endsWith("&")) { serviceUrl = serviceUrl.substring(0, serviceUrl.lastIndexOf("&")); } httpEntity = new HttpEntity("", header); responseEntity = tmpRestTemplate.exchange(serviceUrl, HttpMethod.GET, httpEntity, String.class); } else if (CommonConstant.HTTP_METHOD_PUT.equals(appService.getMethod())) { httpEntity = new HttpEntity(JSONObject.toJSONString(paramIn), header); responseEntity = tmpRestTemplate.exchange(serviceUrl, HttpMethod.PUT, httpEntity, String.class); } else if (CommonConstant.HTTP_METHOD_DELETE.equals(appService.getMethod())) { httpEntity = new HttpEntity(JSONObject.toJSONString(paramIn), header); responseEntity = tmpRestTemplate.exchange(serviceUrl, HttpMethod.DELETE, httpEntity, String.class); } else { httpEntity = new HttpEntity(JSONObject.toJSONString(paramIn), header); responseEntity = tmpRestTemplate.exchange(serviceUrl, HttpMethod.POST, httpEntity, String.class); } } catch (HttpStatusCodeException e) { //这里spring 框架 在4XX 或 5XX 时抛出 HttpServerErrorException 异常,需要重新封装一下 responseEntity = new ResponseEntity( e.getResponseBodyAsString(), e.getStatusCode()); } return responseEntity; } /** * 将rest 协议转为 订单协议 * * @param businesses 多个业务 * @param headers 订单头信息 * @return */ public JSONObject restToCenterProtocol(JSONArray businesses, Map headers) { JSONObject centerProtocol = JSONObject.parseObject("{\"orders\":{},\"business\":[]}"); freshOrderProtocol(centerProtocol.getJSONObject("orders"), headers); centerProtocol.put("business", businesses); return centerProtocol; } /** * 将rest 协议转为 订单协议 * * @param business * @return */ public JSONObject restToCenterProtocol(JSONObject business, Map headers) { JSONObject centerProtocol = JSONObject.parseObject("{\"orders\":{},\"business\":[]}"); freshOrderProtocol(centerProtocol.getJSONObject("orders"), headers); centerProtocol.getJSONArray("business").add(business); return centerProtocol; } /** * 刷入order信息 * * @param orders 订单信息 * @param headers 头部信息 */ public void freshOrderProtocol(JSONObject orders, Map headers) { for (String key : headers.keySet()) { if (CommonConstant.HTTP_APP_ID.equals(key)) { orders.put("appId", headers.get(key)); } if (CommonConstant.HTTP_TRANSACTION_ID.equals(key)) { orders.put("transactionId", headers.get(key)); } if (CommonConstant.HTTP_SIGN.equals(key)) { orders.put("sign", headers.get(key)); } if (CommonConstant.HTTP_REQ_TIME.equals(key)) { orders.put("requestTime", headers.get(key)); } if (CommonConstant.HTTP_ORDER_TYPE_CD.equals(key)) { orders.put("orderTypeCd", headers.get(key)); } if (CommonConstant.HTTP_USER_ID.equals(key)) { orders.put("userId", headers.get(key)); } if(CommonConstant.ORDER_PROCESS.equals(key)){ orders.put("orderProcess", headers.get(CommonConstant.ORDER_PROCESS)); } if(CommonConstant.O_ID.equals(key)){ orders.put("oId", headers.get(CommonConstant.O_ID)); } } } /** * 刷入order信息 * * @param httpHeaders http 头信息 * @param headers 头部信息 */ public void freshHttpHeader(HttpHeaders httpHeaders, Map headers) { for (String key : headers.keySet()) { if (CommonConstant.HTTP_APP_ID.equals(key)) { httpHeaders.add("app_id", headers.get(key)); } if (CommonConstant.HTTP_TRANSACTION_ID.equals(key)) { httpHeaders.add("transaction_id", headers.get(key)); } if (CommonConstant.HTTP_REQ_TIME.equals(key)) { httpHeaders.add("req_time", headers.get(key)); } if (CommonConstant.HTTP_USER_ID.equals(key)) { httpHeaders.add("user_id", headers.get(key)); } } } /** * 新增数据方法 * * @param context 上下文对象 * @param param po对象 */ public void insert(DataFlowContext context, Object param, String businessType) { JSONObject business = JSONObject.parseObject("{\"datas\":{}}"); business.put(CommonConstant.HTTP_BUSINESS_TYPE_CD, businessType); business.put(CommonConstant.HTTP_SEQ, DEFAULT_SEQ); business.put(CommonConstant.HTTP_INVOKE_MODEL, CommonConstant.HTTP_INVOKE_MODEL_S); JSONObject businessObj = new JSONObject(); businessObj = JSONObject.parseObject(JSONObject.toJSONString(BeanConvertUtil.beanCovertMap(param))); JSONArray businessArr = new JSONArray(); businessArr.add(businessObj); business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put(param.getClass().getSimpleName(), businessArr); context.addServiceBusiness(business); } /** * 新增数据方法 * * { * HTTP_BUSINESS_TYPE_CD:''. * HTTP_SEQ:1, * HTTP_INVOKE_MODEL:'s', * data:[{ * ps:Id * xxxxx * xxxx * * }] * } * * @param context 上下文对象 * @param param po对象 */ public void update(DataFlowContext context, Object param, String businessType) { JSONObject business = JSONObject.parseObject("{\"datas\":{}}"); business.put(CommonConstant.HTTP_BUSINESS_TYPE_CD, businessType); business.put(CommonConstant.HTTP_SEQ, DEFAULT_SEQ); business.put(CommonConstant.HTTP_INVOKE_MODEL, CommonConstant.HTTP_INVOKE_MODEL_S); JSONObject businessObj = new JSONObject(); businessObj = JSONObject.parseObject(JSONObject.toJSONString(BeanConvertUtil.beanCovertMap(param))); JSONArray businessArr = new JSONArray(); businessArr.add(businessObj); business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put(param.getClass().getSimpleName(), businessArr); context.addServiceBusiness(business); } /** * 新增数据方法 * * @param context 上下文对象 * @param param po对象 */ public void delete(DataFlowContext context, Object param, String businessType) { JSONObject business = JSONObject.parseObject("{\"datas\":{}}"); business.put(CommonConstant.HTTP_BUSINESS_TYPE_CD, businessType); business.put(CommonConstant.HTTP_SEQ, DEFAULT_SEQ); business.put(CommonConstant.HTTP_INVOKE_MODEL, CommonConstant.HTTP_INVOKE_MODEL_S); JSONObject businessObj = new JSONObject(); businessObj = JSONObject.parseObject(JSONObject.toJSONString(BeanConvertUtil.beanCovertMap(param))); JSONArray businessArr = new JSONArray(); businessArr.add(businessObj); business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put(param.getClass().getSimpleName(), businessArr); context.addServiceBusiness(business); } }