Просмотр исходного кода

开发HttpApi service 接口未完成,目前完成数据封装到DataFlow对象

wuxw7 лет назад: 8
Родитель
Сommit
f4b8bf9cd3

+ 15 - 15
CenterService/doc/request_protocol.json

@@ -1,27 +1,27 @@
 {
   "orders": {
-    "AppId": "外系统ID,分配得到",
-    "TransactionId": "100000000020180409224736000001",
-    "UserId": "用户ID",
-    "OrderTypeCd": "订单类型,查询,受理",
-    "RequestTime": "20180409224736",
-    "Remark":"备注",
+    "appId": "外系统ID,分配得到",
+    "transactionId": "100000000020180409224736000001",
+    "userId": "用户ID",
+    "orderTypeCd": "订单类型,查询,受理",
+    "requestTime": "20180409224736",
+    "remark":"备注",
     "sign": "这个服务是否要求MD5签名",
-    "Attrs": [{
-      "SpecCd": "配置的字段ID",
-      "Value": "具体值"
+    "attrs": [{
+      "specCd": "配置的字段ID",
+      "value": "具体值"
     }]
   },
   "business": [{
-    "ServiceCode": "queryCustInfo",
-    "ServiceName": "查询客户",
-    "Remark": "备注",
+    "serviceCode": "queryCustInfo",
+    "serviceName": "查询客户",
+    "remark": "备注",
     "datas": [{
       //这里是具体业务
     }],
-    "Attrs": [{
-      "SpecCd": "配置的字段ID",
-      "Value": "具体值"
+    "attrs": [{
+      "specCd": "配置的字段ID",
+      "value": "具体值"
     }]
   }]
 }

+ 0 - 1
CenterService/doc/response_protocol.json

@@ -2,7 +2,6 @@
   "orders": {
     "TransactionId": "100000000020180409224736000001",
     "ResponseTime": "20180409224736",
-    "Remark":"备注",
     "sign": "这个服务是否要求MD5签名",
     "response": {//这个是centerOrder 返回的状态结果
       "code": "1999",

+ 0 - 0
CenterService/doc/~$nterService.docx


+ 0 - 13
CenterService/src/main/java/com/java110/App.java

@@ -1,13 +0,0 @@
-package com.java110;
-
-/**
- * Hello world!
- *
- */
-public class App 
-{
-    public static void main( String[] args )
-    {
-        System.out.println( "Hello World!" );
-    }
-}

+ 19 - 7
CenterService/src/main/java/com/java110/center/rest/HttpApi.java

@@ -1,12 +1,13 @@
 package com.java110.center.rest;
 
+import com.java110.center.smo.ICenterServiceSMO;
 import com.java110.common.constant.ResponseConstant;
 import com.java110.common.util.ResponseTemplateUtil;
 import com.java110.core.base.controller.BaseController;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
 
 /**
  * 中心http服务 统一服务类
@@ -16,14 +17,25 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 public class HttpApi extends BaseController {
 
+    @Autowired
+    private ICenterServiceSMO centerServiceSMOImpl;
+
     @RequestMapping(path = "/httpApi/service",method= RequestMethod.GET)
-    public String serviceGet(@RequestParam("orderInfo") String orderInfo) {
+    public String serviceGet(HttpServletRequest request) {
         return ResponseTemplateUtil.createOrderResponseJson(ResponseConstant.NO_TRANSACTION_ID,
                 ResponseConstant.NO_NEED_SIGN,ResponseConstant.RESULT_CODE_ERROR,"不支持Get方法请求");
     }
 
     @RequestMapping(path = "/httpApi/service",method= RequestMethod.POST)
-    public String servicePost(@RequestParam("orderInfo") String orderInfo) {
-        return "";
+    public String servicePost(@RequestBody String orderInfo, HttpServletRequest request) {
+        return centerServiceSMOImpl.service(orderInfo, request);
+    }
+
+    public ICenterServiceSMO getCenterServiceSMOImpl() {
+        return centerServiceSMOImpl;
+    }
+
+    public void setCenterServiceSMOImpl(ICenterServiceSMO centerServiceSMOImpl) {
+        this.centerServiceSMOImpl = centerServiceSMOImpl;
     }
 }

+ 17 - 0
CenterService/src/main/java/com/java110/center/smo/ICenterServiceSMO.java

@@ -0,0 +1,17 @@
+package com.java110.center.smo;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 中心服务 SMO 业务逻辑接口
+ * Created by wuxw on 2018/4/13.
+ */
+public interface ICenterServiceSMO {
+
+    /**
+     * 业务统一处理服务方法
+     * @param reqJson 请求报文json
+     * @return
+     */
+    public String service(String reqJson, HttpServletRequest request) ;
+}

+ 54 - 0
CenterService/src/main/java/com/java110/center/smo/impl/CenterServiceSMOImpl.java

@@ -0,0 +1,54 @@
+package com.java110.center.smo.impl;
+
+import com.java110.center.smo.ICenterServiceSMO;
+import com.java110.common.constant.ResponseConstant;
+import com.java110.common.factory.DataFlowFactory;
+import com.java110.common.util.DateUtil;
+import com.java110.common.util.ResponseTemplateUtil;
+import com.java110.entity.center.DataFlow;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+
+/**
+ * 中心服务处理类
+ * Created by wuxw on 2018/4/13.
+ */
+@Service("centerServiceSMOImpl")
+@Transactional
+public class CenterServiceSMOImpl implements ICenterServiceSMO {
+
+
+    @Override
+    public String service(String reqJson, HttpServletRequest request) {
+
+        DataFlow dataFlow = null;
+
+        try{
+            //1.0 创建消息流
+            dataFlow = DataFlowFactory.newInstance().builder(reqJson, request);
+
+        }catch (Exception e){
+            return ResponseTemplateUtil.createOrderResponseJson(dataFlow == null
+                            ?ResponseConstant.NO_TRANSACTION_ID
+                            :dataFlow.getTransactionId(),
+                    ResponseConstant.NO_NEED_SIGN,ResponseConstant.RESULT_CODE_INNER_ERROR,"内部异常了:"+e.getMessage()+e.getLocalizedMessage());
+        }finally {
+            //这里记录日志
+            Date endDate = DateUtil.getCurrentDate();
+            if(dataFlow == null){ //说明异常了
+                return null;
+            }
+            dataFlow.setEndDate(endDate);
+            //添加耗时
+            DataFlowFactory.addCostTime(dataFlow,"service","业务处理总耗时",dataFlow.getStartDate(),dataFlow.getEndDate());
+
+            //这里保存耗时,以及日志
+
+            return ResponseTemplateUtil.createCommonResponseJson(dataFlow);
+        }
+
+    }
+}

+ 1 - 0
CodingLog.txt

@@ -2,4 +2,5 @@
 1、重新调整结构,每个服务必须要有doc(文档),docker和src目录,启用v0.2版
 2、分支管理说明,test为最新代码未测试代码(主要为了防止本地代码遗失),master 为最新测试过代码(待产品化),product 为产品化代码
 3、网友反映OrderService提供的协议过于复杂,则加入CenterService服务简化协议处理服务(文档设计实际已经完成,请查看CenterService/doc/centerService.docx,待开发)
+4、开发HttpApi service 接口未完成,目前完成数据封装到DataFlow对象。
 

+ 112 - 0
java110-bean/src/main/java/com/java110/entity/center/Business.java

@@ -0,0 +1,112 @@
+package com.java110.entity.center;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+/**
+ * 业务数据
+ * Created by wuxw on 2018/4/13.
+ */
+public class Business {
+
+    private String bId;
+
+    //业务编码
+    private String serviceCode;
+
+    private String serviceName;
+
+    private String remark;
+
+    private JSONArray datas;
+
+    private JSONArray attrs;
+    //返回 编码
+    private String code;
+
+    private String message;
+
+
+    public String getbId() {
+        return bId;
+    }
+
+    public void setbId(String bId) {
+        this.bId = bId;
+    }
+
+    public String getServiceCode() {
+        return serviceCode;
+    }
+
+    public void setServiceCode(String serviceCode) {
+        this.serviceCode = serviceCode;
+    }
+
+    public String getServiceName() {
+        return serviceName;
+    }
+
+    public void setServiceName(String serviceName) {
+        this.serviceName = serviceName;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public JSONArray getDatas() {
+        return datas;
+    }
+
+    public void setDatas(JSONArray datas) {
+        this.datas = datas;
+    }
+
+    public JSONArray getAttrs() {
+        return attrs;
+    }
+
+    public void setAttrs(JSONArray attrs) {
+        this.attrs = attrs;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    /**
+     * 构建成对象
+     * @return
+     * @throws Exception
+     */
+    public Business builder(JSONObject businessObj) throws Exception{
+
+        try{
+            this.setServiceCode(businessObj.getString("serviceCode"));
+            this.setServiceName(businessObj.getString("serviceName"));
+            this.setRemark(businessObj.getString("remark"));
+            this.setDatas(businessObj.getJSONArray("datas"));
+            this.setAttrs(businessObj.getJSONArray("attrs"));
+        }catch (Exception e){
+            throw e;
+        }
+        return this;
+    }
+}

+ 387 - 0
java110-bean/src/main/java/com/java110/entity/center/DataFlow.java

@@ -0,0 +1,387 @@
+package com.java110.entity.center;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+/**
+ * 主要用于离散成对象 httpApi service 请求过程消息记录和返回记录
+ * Created by wuxw on 2018/4/13.
+ */
+public class DataFlow {
+
+    private String oId;
+
+    //交易流水
+    private String transactionId;
+
+    private String appId;
+
+    private String userId;
+
+    private String orderTypeCd;
+
+    private String requestTime;
+
+    private String remark;
+
+    private String reqSign;
+
+    private JSONObject reqOrders;
+
+    private JSONArray reqBusiness;
+
+    private String responseTime;
+
+    private String resSign;
+
+    private String code;
+
+    private String message;
+
+    private JSONObject resOrders;
+
+    private JSONArray resBusiness;
+
+    //请求开始时间
+    private Date startDate;
+
+    //请求完成时间
+    private Date endDate;
+
+    private String reqJson;
+
+    private String resJson;
+
+    private List<Business> businesses;
+
+    private String requestURL;
+
+    private List<DataFlowLinksCost> linksCostDatas = new ArrayList<DataFlowLinksCost>();
+
+    private Map<String,String> headers = new HashMap<String,String>();
+
+    public String getoId() {
+        return oId;
+    }
+
+    public void setoId(String oId) {
+        this.oId = oId;
+    }
+
+    public List<Business> getBusinesses() {
+        return businesses;
+    }
+
+
+
+    public void setBusinesses(List<Business> businesses) {
+        this.businesses = businesses;
+    }
+
+
+    //public DataFlow(){}
+
+    public DataFlow(Date startDate,String code){
+        this.setStartDate(startDate);
+        this.setCode(code);
+    }
+
+
+    public void setTransactionId(String transactionId) {
+        this.transactionId = transactionId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public void setOrderTypeCd(String orderTypeCd) {
+        this.orderTypeCd = orderTypeCd;
+    }
+
+    public void setRequestTime(String requestTime) {
+        this.requestTime = requestTime;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public void setReqSign(String reqSign) {
+        this.reqSign = reqSign;
+    }
+
+    public void setReqOrders(JSONObject reqOrders) {
+        this.reqOrders = reqOrders;
+    }
+
+    public void setReqBusiness(JSONArray reqBusiness) {
+        this.reqBusiness = reqBusiness;
+    }
+
+    public void setResponseTime(String responseTime) {
+        this.responseTime = responseTime;
+    }
+
+    public void setResSign(String resSign) {
+        this.resSign = resSign;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public void setResOrders(JSONObject resOrders) {
+        this.resOrders = resOrders;
+    }
+
+    public void setResBusiness(JSONArray resBusiness) {
+        this.resBusiness = resBusiness;
+    }
+
+    public String getTransactionId() {
+        return transactionId;
+    }
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public String getOrderTypeCd() {
+        return orderTypeCd;
+    }
+
+    public String getRequestTime() {
+        return requestTime;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public String getReqSign() {
+        return reqSign;
+    }
+
+    public JSONObject getReqOrders() {
+        return reqOrders;
+    }
+
+    public JSONArray getReqBusiness() {
+        return reqBusiness;
+    }
+
+    public String getResponseTime() {
+        return responseTime;
+    }
+
+    public String getResSign() {
+        return resSign;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public JSONObject getResOrders() {
+        return resOrders;
+    }
+
+    public JSONArray getResBusiness() {
+        return resBusiness;
+    }
+
+
+    public Date getStartDate() {
+        return startDate;
+    }
+
+    public void setStartDate(Date startDate) {
+        this.startDate = startDate;
+    }
+
+    public Date getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(Date endDate) {
+        this.endDate = endDate;
+    }
+
+    public String getReqJson() {
+        return reqJson;
+    }
+
+    public void setReqJson(String reqJson) {
+        this.reqJson = reqJson;
+    }
+
+    public String getResJson() {
+        return resJson;
+    }
+
+    public void setResJson(String resJson) {
+        this.resJson = resJson;
+    }
+
+    public String getRequestURL() {
+        return requestURL;
+    }
+
+    public void setRequestURL(String requestURL) {
+        this.requestURL = requestURL;
+    }
+
+    public Map<String, String> getHeaders() {
+        return headers;
+    }
+
+    /**
+     * 添加各个环节的耗时
+     * @param dataFlowLinksCost
+     */
+    public void addLinksCostDatas(DataFlowLinksCost dataFlowLinksCost){
+        this.linksCostDatas.add(dataFlowLinksCost);
+    }
+
+    public DataFlow builder(String reqInfo, HttpServletRequest request) throws Exception{
+
+        try{
+            Business business = null;
+            JSONObject reqInfoObj = JSONObject.parseObject(reqInfo);
+            JSONObject orderObj = reqInfoObj.getJSONObject("orders");
+            JSONArray businessArray = reqInfoObj.getJSONArray("business");
+            this.setAppId(orderObj.getString("appId"));
+            this.setAppId(orderObj.getString("transactionId"));
+            this.setUserId(orderObj.getString("userId"));
+            this.setOrderTypeCd(orderObj.getString("orderTypeCd"));
+            this.setRemark(orderObj.getString("remark"));
+            this.setReqSign(orderObj.getString("sign"));
+            this.setRequestTime(orderObj.getString("requestTime"));
+            this.setReqOrders(orderObj);
+            this.setReqBusiness(businessArray);
+            this.businesses = new ArrayList<Business>();
+            if(businessArray != null && businessArray.size() > 0){
+                for(int businessIndex = 0;businessIndex < businessArray.size();businessIndex++) {
+                    business = new Business().builder(businessArray.getJSONObject(businessIndex));
+                    businesses.add(business);
+                }
+            }
+
+            //将url参数写到header map中
+            initUrlParam(request);
+
+            //将 header 写到header map中
+            initHeadParam(request);
+        }catch (Exception e){
+            throw e;
+        }
+        return this;
+    }
+
+
+    /**
+     * 将url参数写到header map中
+     * @param request
+     */
+    private void initUrlParam(HttpServletRequest request) {
+		/*put real ip address*/
+
+
+
+        Map readOnlyMap = request.getParameterMap();
+
+        StringBuffer queryString = new StringBuffer(request.getRequestURL()!=null?request.getRequestURL():"");
+
+        if (readOnlyMap != null && !readOnlyMap.isEmpty()) {
+            queryString.append("?");
+            Set<String> keys = readOnlyMap.keySet();
+            for (Iterator it = keys.iterator(); it.hasNext();) {
+                String key = (String) it.next();
+                String[] value = (String[]) readOnlyMap.get(key);
+//                String[] value = (String[]) readOnlyMap.get(key);
+                if(value.length>1) {
+                    headers.put(key, value[0]);
+                    for(int j =0 ;j<value.length;j++){
+                        queryString.append(key);
+                        queryString.append("=");
+                        queryString.append(value[j]);
+                        queryString.append("&");
+                    }
+
+                } else {
+                    headers.put(key, value[0]);
+                    queryString.append(key);
+                    queryString.append("=");
+                    queryString.append(value[0]);
+                    queryString.append("&");
+                }
+            }
+        }
+
+		/*put requst url*/
+        if (readOnlyMap != null && !readOnlyMap.isEmpty()){
+            this.setRequestURL(queryString.toString().substring(0, queryString.toString().length() - 1));
+        }else{
+            this.setRequestURL(queryString.toString());
+        }
+
+    }
+
+    private void initHeadParam(HttpServletRequest request) {
+
+        headers.put("IP",getIpAddr(request));
+
+        Enumeration reqHeaderEnum = request.getHeaderNames();
+
+        while( reqHeaderEnum.hasMoreElements() ) {
+            String headerName = (String)reqHeaderEnum.nextElement();
+            headers.put(headerName, request.getHeader(headerName));
+        }
+    }
+
+    /**
+     * 获取IP地址
+     * @param request
+     * @return
+     */
+    private String getIpAddr(HttpServletRequest request) {
+        String ip = request.getHeader("X-Forwarded-For");
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_CLIENT_IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddr();
+        }
+
+        return ip;
+    }
+}

+ 44 - 0
java110-bean/src/main/java/com/java110/entity/center/DataFlowLinksCost.java

@@ -0,0 +1,44 @@
+package com.java110.entity.center;
+
+import java.util.Date;
+
+/**
+ * Created by wuxw on 2018/4/13.
+ */
+public class DataFlowLinksCost {
+
+    //环节编码
+    private String LinksCode;
+
+    private String LinksName;
+
+    private Date startDate;
+
+    private Date endDate;
+
+
+
+    public Date getStartDate() {
+        return startDate;
+    }
+
+    public void setStartDate(Date startDate) {
+        this.startDate = startDate;
+    }
+
+    public Date getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(Date endDate) {
+        this.endDate = endDate;
+    }
+
+    public DataFlowLinksCost builder(String LinksCode, String LinksName, Date startDate, Date endDate){
+        this.LinksCode = LinksCode;
+        this.LinksName = LinksName;
+        this.startDate = startDate;
+        this.endDate = endDate;
+        return this;
+    }
+}

+ 34 - 0
java110-common/src/main/java/com/java110/common/factory/DataFlowFactory.java

@@ -0,0 +1,34 @@
+package com.java110.common.factory;
+
+import com.java110.common.constant.ResponseConstant;
+import com.java110.common.util.DateUtil;
+import com.java110.entity.center.DataFlow;
+import com.java110.entity.center.DataFlowLinksCost;
+
+import java.util.Date;
+
+/**
+ * 数据流工厂类
+ * Created by wuxw on 2018/4/13.
+ */
+public class DataFlowFactory {
+
+    public static DataFlow newInstance(){
+        return new DataFlow(DateUtil.getCurrentDate(), ResponseConstant.RESULT_CODE_SUCCESS);
+    }
+
+    /**
+     * 添加耗时
+     * @param dataFlow 数据流
+     * @param linksCode 环节编码
+     * @param linksName 环节名称
+     * @param startDate 开始时间
+     * @param endDate 结束时间
+     * @return
+     */
+    public static DataFlow addCostTime(DataFlow dataFlow, String linksCode, String linksName, Date startDate, Date endDate){
+        DataFlowLinksCost dataFlowLinksCost = new DataFlowLinksCost().builder(linksCode, linksName, startDate, endDate);
+        dataFlow.addLinksCostDatas(dataFlowLinksCost);
+        return dataFlow;
+    }
+}

+ 8 - 2
java110-common/src/main/java/com/java110/common/util/DateUtil.java

@@ -55,8 +55,14 @@ public class DateUtil {
     }
 
 
-
-
+    /**
+     * 获取当前时间
+     * @return
+     */
+    public static Date getCurrentDate(){
+        Calendar calendar = Calendar.getInstance();
+        return calendar.getTime();
+    }
 
     public static String getFormatTimeString(Date date, String pattern)
     {

+ 14 - 0
java110-common/src/main/java/com/java110/common/util/ResponseTemplateUtil.java

@@ -3,6 +3,7 @@ package com.java110.common.util;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.java110.common.constant.ResponseConstant;
+import com.java110.entity.center.DataFlow;
 
 import java.util.Date;
 
@@ -71,4 +72,17 @@ public class ResponseTemplateUtil {
     public static String createOrderResponseJson(String transactionId, String sign,String code,String message){
         return createCommonResponseJson(transactionId,sign,code,message,null);
     }
+
+    /**
+     * 组装返回报文
+     * @param dataFlow 数据流
+     * @return
+     */
+    public static String createCommonResponseJson(DataFlow dataFlow){
+        return createCommonResponseJson(dataFlow.getTransactionId(),
+                dataFlow.getResSign(),
+                dataFlow.getCode(),
+                dataFlow.getMessage(),
+                dataFlow.getResBusiness());
+    }
 }