package com.java110.core.factory; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONPath; import com.java110.utils.constant.MappingConstant; import com.java110.utils.constant.OrderTypeCdConstant; import com.java110.utils.constant.ResponseConstant; import com.java110.utils.constant.StatusConstant; import com.java110.utils.util.DateUtil; import com.java110.utils.util.StringUtil; import com.java110.core.context.DataFlow; import com.java110.core.context.DataFlowContext; import com.java110.core.context.PageData; import java.util.Date; import java.util.Map; /** * 请求信息封装工厂类 * Created by wuxw on 2018/4/28. */ public class DataTransactionFactory { /** * 创建 通用返回结果模板 * @param transactionId 交易流水 * @param code 错误 * @param message 错误信息 * @param business 业务信息 * @return */ public static JSONObject createCommonResponseJson(String transactionId, String code, String message, JSONArray business){ JSONObject responseInfo = JSONObject.parseObject("{\"orders\":{\"response\":{}}}"); JSONObject orderInfo = responseInfo.getJSONObject("orders"); orderInfo.put("transactionId",transactionId); orderInfo.put("responseTime",DateUtil.getDefaultFormateTimeString(new Date())); JSONObject orderResponseInfo = orderInfo.getJSONObject("response"); orderResponseInfo.put("code",code); orderResponseInfo.put("message",message); if (business != null && business.size() > 0){ responseInfo.put("business",business); } return responseInfo; } /** * 业务是否都成功了 * @param response true 成功 false 失败 * @return */ public static boolean isSuccessBusiness(JSONObject response){ Object obj = JSONPath.eval(response,"$.orders.response.code"); if(obj != null && obj instanceof String && ResponseConstant.RESULT_CODE_SUCCESS.equals(obj.toString())){ Object businessObj = JSONPath.eval(response,"$.business"); if(businessObj == null){ return true; } if(businessObj instanceof JSONObject){ JSONObject businessJson = (JSONObject) businessObj; if(!businessJson.containsKey("response")){ //这里返回协议错误,我们认为是成功 return true; } if(businessJson.getJSONObject("response").containsKey("code") && ResponseConstant.RESULT_CODE_SUCCESS.equals(businessJson.getJSONObject("response").getString("code"))){ return true; } } if(businessObj instanceof JSONArray){ JSONArray businessJsons = (JSONArray) businessObj; if(businessJsons == null || businessJsons.size() == 0){ return true; } JSONObject businessJson = null; for (int businessIndex = 0;businessIndex < businessJsons.size();businessIndex++) { businessJson = businessJsons.getJSONObject(businessIndex); if (!businessJson.containsKey("response")) { //这里返回协议错误,我们认为是成功 continue; } if (businessJson.getJSONObject("response").containsKey("code") && !ResponseConstant.RESULT_CODE_SUCCESS.equals(businessJson.getJSONObject("response").getString("code"))) { return false; } } return true; } } return false; } /** * 返回模板 只有Order信息 * @param transactionId * @param code * @param message * @return */ public static JSONObject createOrderResponseJson(String transactionId,String code,String message){ return createCommonResponseJson(transactionId,code,message,null); } /** * 组装返回报文 * @param dataFlow 数据流 * @return */ public static JSONObject createCommonResponseJson(DataFlow dataFlow){ return dataFlow.getResponseBusinessJson(); } /** * 组装返回报文 * @param dataFlow 数据流 * @return */ public static String createCommonResData(DataFlow dataFlow){ return dataFlow.getResData(); } /** * 业务系统返回报文模板 * @param code * @param message * @param * @return */ public static JSONObject createBusinessResponseJson(String code, String message){ return createBusinessResponseJson(code, message,null); } /** * 在 BusinessServiceDataFlow 中获取不到 bId 和 businessType 时 * 从报文中获取,如果报文中也获取不到,说明 报文不对 返回空,也无妨 * @param req * @param code * @param message * @param info * @return */ public static JSONObject createNoBusinessTypeBusinessResponseJson(String req,String code, String message, JSONObject info){ String bId = ""; String businessType = ""; String transactionId = ""; String orderTypeCd = ""; String dataFlowId = ""; String serviceCode = ""; try{ JSONObject reqJson = JSONObject.parseObject(req); businessType = reqJson.getJSONObject("orders").getString("businessType"); transactionId = reqJson.getJSONObject("orders").getString("transactionId"); orderTypeCd = reqJson.getJSONObject("orders").getString("orderTypeCd"); dataFlowId = reqJson.getJSONObject("orders").getString("dataFlowId"); bId = reqJson.getJSONObject("business").getString("bId"); serviceCode = reqJson.getJSONObject("business").getString("serviceCode"); }catch (Exception e){ bId = "-1"; businessType = ""; transactionId = "-1"; orderTypeCd ="Q"; dataFlowId ="-1"; } return createBusinessResponseJson(code,message,transactionId,bId,businessType,orderTypeCd,dataFlowId,serviceCode,info); } /** * 业务系统返回报文模板 * @param code * @param message * @param info * @return */ public static JSONObject createBusinessResponseJson(String code, String message, JSONObject info){ return createBusinessResponseJson(code,message,"-1","-1", "",StatusConstant.REQUEST_BUSINESS_TYPE,"-1","",info); } public static JSONObject createBusinessResponseJson(DataFlowContext dataFlowContext, String code,String message,Map info){ return createBusinessResponseJson(code,message,dataFlowContext.getOrder().getTransactionId(), dataFlowContext.getbId(),dataFlowContext.getOrder().getBusinessType(),dataFlowContext.getOrder().getOrderTypeCd(), dataFlowContext.getOrder().getDataFlowId(),dataFlowContext.getCurrentBusiness().getServiceCode(),info); } public static JSONObject createBusinessResponseJson(String code, String message,String transactionId, String bId,String businessType, String orderTypeCd, String dataFlowId, String serviceCode, Map info){ JSONObject responseMessage = JSONObject.parseObject("{\"response\":{}}"); JSONObject response = responseMessage.getJSONObject("response"); response.put("code",code); response.put("message",message); if(info != null) { responseMessage.putAll(info); } responseMessage.put("bId",bId); responseMessage.put("businessType",businessType); responseMessage.put("responseTime",DateUtil.getDefaultFormateTimeString(new Date())); responseMessage.put("transactionId",transactionId); responseMessage.put("orderTypeCd",orderTypeCd); responseMessage.put("dataFlowId",dataFlowId); responseMessage.put("serviceCode",serviceCode); return responseMessage; } /*public static JSONObject createBusinessResponseJson(String code, String message,String bId,String businessType, JSONObject info){ return createBusinessResponseJson(code,message,bId, businessType,info); }*/ /** * 创建查询 请求 centerService json 报文 * @param appId * @param userId * @param sign * @param business * @return */ public static String createQueryOneCenterServiceRequestJson(String appId,String userId,String sign, JSONObject business){ JSONArray businesses = new JSONArray(); businesses.add(business); return createCenterServiceRequestJson(appId,userId, OrderTypeCdConstant.ORDER_TYPE_CD_QUERY,sign,"",null,businesses); } /** * 创建查询 请求 centerService json 报文 * @param appId * @param userId * @param sign * @param businesses * @return */ public static String createQueryCenterServiceRequestJson(String appId,String userId,String sign, JSONArray businesses){ return createCenterServiceRequestJson(appId,userId, OrderTypeCdConstant.ORDER_TYPE_CD_QUERY,sign,"",null,businesses); } /** * 查询一个服务请求报文 * @param serviceCode * @param serviceName * @param paramIn * @return */ public static JSONObject createQueryOneBusinessRequestJson(String serviceCode,String serviceName,Map paramIn){ JSONObject business = JSONObject.parseObject("{\"datas\":{}}"); business.put("serviceCode",serviceCode); business.put("serviceName",serviceName); business.getJSONObject("datas").put("params",paramIn); return business; } /** * 创建请求 order 报文 分装成JSON * @param appId * @return */ public static String createCenterServiceRequestJson(String appId,String userId,String orderTypeCd,String sign,String remark, JSONArray orderAttrs,JSONArray businesses){ JSONObject paramIn = JSONObject.parseObject("{\"orders\":{},\"business\":[]}"); JSONObject orders = paramIn.getJSONObject("orders"); orders.put("appId",appId); orders.put("transactionId", GenerateCodeFactory.getTransactionId()); orders.put("userId",userId); orders.put("orderTypeCd",orderTypeCd); orders.put("requestTime",DateUtil.getNowDefault()); orders.put("remark",remark); if(orderAttrs != null && orderAttrs.size()>0) { orders.put("attrs", orderAttrs); } JSONArray businessArray = paramIn.getJSONArray("business"); businessArray.addAll(businesses); if(!StringUtil.isNullOrNone(sign)) { orders.put("sign", AuthenticationFactory.md5(orders.getString("transactionId"), orders.getString("appId"), businessArray.toJSONString(), sign)); } return paramIn.toJSONString(); } /** * 获取Business 内容 * @return */ public static JSONArray getBusinessFromCenterServiceResponseJson(String resJson){ JSONObject paramOut = JSONObject.parseObject(resJson); return paramOut.getJSONArray("business"); } public static JSONObject getOneBusinessFromCenterServiceResponseJson(String resJson){ JSONArray paramOut = getBusinessFromCenterServiceResponseJson(resJson); if(paramOut != null && paramOut.size() > 0){ JSONObject business = paramOut.getJSONObject(0); if(!"0000".equals(business.getJSONObject("response").getString("code"))){ return null; } return business; } return null; } /** * 数据加密 * @param reqInfo * @param keySize * @return * @throws Exception */ public static String encrypt(String reqInfo,int keySize) throws Exception { return new String(AuthenticationFactory.encrypt(reqInfo.getBytes("UTF-8"), AuthenticationFactory.loadPubKey(MappingConstant.KEY_OUT_PUBLIC_STRING) ,keySize),"UTF-8"); } /** * 数据解密 * @param resInfo * @param keySize * @return * @throws Exception */ public static String decrypt(String resInfo,int keySize) throws Exception{ return new String(AuthenticationFactory.decrypt(resInfo.getBytes("UTF-8"), AuthenticationFactory.loadPrivateKey(MappingConstant.KEY_OUT_PRIVATE_STRING) ,keySize),"UTF-8"); } /** * 页面返回报文封装 * * { "meta":{ "code":"",//主要用于,日志记录 "message":"", "responseTime":"", "transactionId":"请求流水" //由系统返回 }, "data":{ //这里是返回参数 } } * @return * @throws Exception */ public static String pageResponseJson(String transactionId,String code,String message,JSONObject data){ JSONObject paramOut = JSONObject.parseObject("{\"meta\":{}}"); JSONObject metaObj = paramOut.getJSONObject("meta"); metaObj.put("transactionId",transactionId); metaObj.put("code",code); metaObj.put("message",message); metaObj.put("responseTime",DateUtil.getNowDefault()); if(data != null) { paramOut.put("data", data); } return paramOut.toJSONString(); } /** * 页面返回封装 * @param code 编码 * @param message 信息 * @param data 数据 * @return * @throws Exception */ public static String pageResponseJson(String code,String message,JSONObject data){ return pageResponseJson(ResponseConstant.NO_TRANSACTION_ID,code,message,data); } /** * 页面返回封装 * @param code 编码 * @param message 信息 * @param data 数据 * @return * @throws Exception */ public static String pageResponseJson(PageData pd,String code, String message, JSONObject data){ return pageResponseJson(pd == null || StringUtil.isNullOrNone(pd.getTransactionId()) ? ResponseConstant.NO_TRANSACTION_ID:pd.getTransactionId(),code,message,data); } /** * 页面处理成功信息封装 * @param transactionId * @return * @throws Exception */ public static String pageResponseJson(String transactionId){ return pageResponseJson(transactionId,ResponseConstant.RESULT_CODE_SUCCESS,"成功",null); } /** * ID生成返回报文 * @param transactionId * @param id * @param code * @param message * @return */ public static JSONObject createCodeResponseJson(String transactionId, String id, String code,String message){ JSONObject paramOut = JSONObject.parseObject("{}"); paramOut.put("transactionId",transactionId); paramOut.put("code",code); paramOut.put("message",message); paramOut.put("responseTime",DateUtil.getNowDefault()); paramOut.put("id",id); return paramOut; } /** * ID生成请求报文 * @param transactionId * @return */ public static JSONObject createCodeRequestJson(String transactionId, String prefix,String name){ JSONObject paramOut = JSONObject.parseObject("{}"); paramOut.put("transactionId",transactionId); paramOut.put("prefix",prefix); paramOut.put("name",name); paramOut.put("requestTime",DateUtil.getNowDefault()); return paramOut; } }