From 6bfbbc623a595caaeb03de206fef28e2aa0acad4 Mon Sep 17 00:00:00 2001
From: wuxw7 <wuxw7@asiainfo.com>
Date: 星期六, 26 五月 2018 17:01:34 +0800
Subject: [PATCH] 加入 接口透传功能

---
 CenterService/src/main/java/com/java110/center/smo/impl/CenterServiceSMOImpl.java |  170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 170 insertions(+), 0 deletions(-)

diff --git a/CenterService/src/main/java/com/java110/center/smo/impl/CenterServiceSMOImpl.java b/CenterService/src/main/java/com/java110/center/smo/impl/CenterServiceSMOImpl.java
index 9afb662..eef7768 100644
--- a/CenterService/src/main/java/com/java110/center/smo/impl/CenterServiceSMOImpl.java
+++ b/CenterService/src/main/java/com/java110/center/smo/impl/CenterServiceSMOImpl.java
@@ -21,6 +21,8 @@
 import com.java110.service.smo.IQueryServiceSMO;
 import org.apache.commons.lang3.math.NumberUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.client.RestTemplate;
@@ -41,6 +43,9 @@
 
     @Autowired
     private RestTemplate restTemplate;
+
+    @Autowired
+    private RestTemplate restTemplateNoLoadBalanced;
 
     @Autowired
     private IQueryServiceSMO queryServiceSMOImpl;
@@ -133,6 +138,93 @@
 
         }
 
+    }
+
+    /**
+     * 閫忎紶澶勭悊
+     * @param reqJson
+     * @param headers
+     * @return
+     * @throws SMOException
+     */
+    @Override
+    public String serviceTransfer(String reqJson, Map<String, String> headers) throws SMOException {
+        DataFlow dataFlow = null;
+
+        String  responseData = null;
+
+        String resJson = "";
+
+        try {
+            reqJson = decrypt(reqJson,headers);
+            //1.0 鍒涘缓鏁版嵁娴�
+            dataFlow = DataFlowFactory.newInstance(DataFlow.class).builderTransfer(reqJson, headers);
+            //2.0 鍔犺浇閰嶇疆淇℃伅
+            initConfigData(dataFlow);
+            //3.0 鏍¢獙 APPID鏄惁鏈夋潈闄愭搷浣渟erviceCode
+            judgeAuthority(dataFlow);
+            //4.0 璋冪敤瑙勫垯鏍¢獙
+            ruleValidate(dataFlow);
+            //5.0 淇濆瓨璁㈠崟鍜屼笟鍔¢」 c_orders c_order_attrs c_business c_business_attrs
+            //saveOrdersAndBusiness(dataFlow);
+            //6.0 璋冪敤涓嬫父绯荤粺
+            transferInvokeBusinessSystem(dataFlow);
+
+            responseData = DataTransactionFactory.createCommonResData(dataFlow);
+
+        } catch (DecryptException e){ //瑙e瘑寮傚父
+            responseData =  DataTransactionFactory.createOrderResponseJson(ResponseConstant.NO_TRANSACTION_ID,
+                    e.getResult().getCode(), e.getMessage()).toJSONString();
+        } catch (RuleException e) {
+            responseData =  DataTransactionFactory.createOrderResponseJson(dataFlow.getTransactionId(),
+                    e.getResult().getCode(), e.getMessage()).toJSONString();
+        } catch (NoAuthorityException e) {
+            responseData =  DataTransactionFactory.createOrderResponseJson(dataFlow.getTransactionId(),
+                    e.getResult().getCode(), e.getMessage()).toJSONString();
+        } catch (InitConfigDataException e){
+            responseData =  DataTransactionFactory.createOrderResponseJson(dataFlow.getTransactionId(),
+                    e.getResult().getCode(), e.getMessage()).toJSONString();
+        }catch (Exception e) {
+            logger.error("鍐呴儴寮傚父浜嗭細",e);
+            responseData =  DataTransactionFactory.createOrderResponseJson(dataFlow == null
+                            ? ResponseConstant.NO_TRANSACTION_ID
+                            : dataFlow.getTransactionId(),
+                    ResponseConstant.RESULT_CODE_INNER_ERROR, "鍐呴儴寮傚父浜嗭細" + e.getMessage() + e.getLocalizedMessage()).toJSONString();
+        } finally {
+            if(dataFlow != null) {
+                //杩欓噷璁板綍鏃ュ織
+                Date endDate = DateUtil.getCurrentDate();
+
+                dataFlow.setEndDate(endDate);
+                dataFlow.setResData(responseData);
+                //娣诲姞鑰楁椂
+                DataFlowFactory.addCostTime(dataFlow, "service", "涓氬姟澶勭悊鎬昏�楁椂", dataFlow.getStartDate(), dataFlow.getEndDate());
+
+                //杩欓噷淇濆瓨鑰楁椂锛屼互鍙婃棩蹇�
+                saveLogMessage(dataFlow.getReqJson(), dataFlow.getResJson());
+
+                //淇濆瓨鑰楁椂
+                saveCostTimeLogMessage(dataFlow);
+
+                //缁勮杩斿洖澶翠俊鎭�
+                putResponseHeader(dataFlow,headers);
+
+                //澶勭悊杩斿洖鎶ユ枃閴存潈
+                AuthenticationFactory.putSign(dataFlow, headers);
+            }
+            resJson = encrypt(responseData,headers);
+            return resJson;
+
+        }
+    }
+
+    /**
+     * 鎶掑啓杩斿洖澶翠俊鎭�
+     * @param dataFlow
+     */
+    private void putResponseHeader(DataFlow dataFlow,Map<String,String> headers) {
+        headers.put("responseTime", DateUtil.getDefaultFormateTimeString(new Date()));
+        headers.put("transactionId",dataFlow.getTransactionId());
     }
 
     /**
@@ -375,6 +467,40 @@
 
         DataFlowFactory.addCostTime(dataFlow, "invokeBusinessSystem", "璋冪敤涓嬫父绯荤粺鑰楁椂", startDate);
     }
+
+
+    /**
+     * 6.0 璋冪敤涓嬫父绯荤粺
+     *
+     * @param dataFlow
+     * @throws BusinessException
+     */
+    private void transferInvokeBusinessSystem(DataFlow dataFlow) throws BusinessException {
+        Date startDate = DateUtil.getCurrentDate();
+   /*     if(MappingCache.getValue(MappingConstant.KEY_NO_INVOKE_BUSINESS_SYSTEM) != null
+                &&MappingCache.getValue(MappingConstant.KEY_NO_INVOKE_BUSINESS_SYSTEM).contains(dataFlow.getOrderTypeCd())){
+            //涓嶇敤璋冪敤 涓嬫父绯荤粺鐨勯厤缃�(涓�鑸笉瀛樺湪杩欑鎯呭喌锛岃繖閲屼富瑕佹槸鍦ㄦ病鏈変笅娓哥郴缁熺殑鎯呭喌涓嬫祴璇曚腑蹇冩湇鍔$敤)
+            DataFlowFactory.addCostTime(dataFlow, "invokeBusinessSystem", "璋冪敤涓嬫父绯荤粺鑰楁椂", startDate);
+            dataFlow.setResponseBusinessJson(DataTransactionFactory.createCommonResponseJson(dataFlow.getTransactionId(),
+                    ResponseConstant.RESULT_CODE_SUCCESS, "鎴愬姛",null));
+            return ;
+        }*/
+
+        //6.1 鍏堝鐞嗗悓姝ユ柟寮忕殑鏈嶅姟锛屾瘡涓�鍚屾鍚庡彂甯冧簨浠跺箍鎾�
+        AppService  service = DataFlowFactory.getService(dataFlow,dataFlow.getCurrentBusiness().getServiceCode());
+
+
+        String responseJson = doTransferRequestBusinessSystem(dataFlow, service, dataFlow.getCurrentBusiness().getTransferData());
+
+        dataFlow.setResData(responseJson);
+
+        DataFlowFactory.addCostTime(dataFlow,dataFlow.getCurrentBusiness().getServiceCode(), "璋冪敤"+dataFlow.getCurrentBusiness().getServiceCode()+"鑰楁椂", startDate);
+        saveLogMessage(dataFlow.getCurrentBusiness().getTransferData(),dataFlow.getResData());
+
+
+        DataFlowFactory.addCostTime(dataFlow, "invokeBusinessSystem", "璋冪敤涓嬫父绯荤粺鑰楁椂", startDate);
+    }
+
 
 
 
@@ -925,6 +1051,24 @@
         return responseJson;
     }
 
+    private String doTransferRequestBusinessSystem(DataFlow dataFlow, AppService service, String reqData) {
+        String responseMessage;
+        if(service.getMethod() == null || "".equals(service.getMethod())) {//post鏂瑰紡
+            //http://user-service/test/sayHello
+            HttpHeaders header = new HttpHeaders();
+            for(String key : dataFlow.getHeaders().keySet()){
+                header.add(key,dataFlow.getHeaders().get(key));
+            }
+            HttpEntity<String> httpEntity = new HttpEntity<String>(reqData, header);
+            responseMessage = restTemplateNoLoadBalanced.postForObject(service.getUrl(),httpEntity,String.class);
+        }else{//webservice鏂瑰紡
+            responseMessage = (String) WebServiceAxisClient.callWebService(service.getUrl(),service.getMethod(),
+                    new Object[]{dataFlow.getRequestBusinessJson().toJSONString()},
+                    service.getTimeOut());
+        }
+        return responseMessage;
+    }
+
     /**
      * 鏁版嵁淇濆瓨鍒癇usinessTable 涓�
      * @param dataFlow
@@ -1010,6 +1154,24 @@
     }
 
     /**
+     * 淇濆瓨鏃ュ織淇℃伅
+     * @param requestJson
+     */
+    private void saveLogMessage(String requestJson,String responseJson){
+
+        try{
+            if(MappingConstant.VALUE_ON.equals(MappingCache.getValue(MappingConstant.KEY_LOG_ON_OFF))){
+                JSONObject log = new JSONObject();
+                log.put("request",requestJson);
+                log.put("response",responseJson);
+                KafkaFactory.sendKafkaMessage(KafkaConstant.TOPIC_LOG_NAME,"",log.toJSONString());
+            }
+        }catch (Exception e){
+            logger.error("鎶ラ敊鏃ュ織鍑洪敊浜嗭紝",e);
+        }
+    }
+
+    /**
      * 淇濆瓨鑰楁椂淇℃伅
      * @param dataFlow
      */
@@ -1071,4 +1233,12 @@
     public void setQueryServiceSMOImpl(IQueryServiceSMO queryServiceSMOImpl) {
         this.queryServiceSMOImpl = queryServiceSMOImpl;
     }
+
+    public RestTemplate getRestTemplateNoLoadBalanced() {
+        return restTemplateNoLoadBalanced;
+    }
+
+    public void setRestTemplateNoLoadBalanced(RestTemplate restTemplateNoLoadBalanced) {
+        this.restTemplateNoLoadBalanced = restTemplateNoLoadBalanced;
+    }
 }

--
Gitblit v1.8.0