package com.java110.service.smo.impl; import bsh.Interpreter; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONPath; import com.java110.common.cache.ServiceSqlCache; import com.java110.common.constant.CommonConstant; import com.java110.common.constant.ResponseConstant; import com.java110.common.exception.BusinessException; import com.java110.common.log.LoggerEngine; import com.java110.common.util.Assert; import com.java110.common.util.ResponseTemplateUtil; import com.java110.entity.service.DataQuery; import com.java110.entity.service.ServiceSql; import com.java110.service.dao.IQueryServiceDAO; import com.java110.service.smo.IQueryServiceSMO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; /** * Created by wuxw on 2018/4/19. */ @Service("queryServiceSMOImpl") @Transactional public class QueryServiceSMOImpl extends LoggerEngine implements IQueryServiceSMO { @Autowired private IQueryServiceDAO queryServiceDAOImpl; @Override public void commonQueryService(DataQuery dataQuery) throws BusinessException { //查询缓存查询 对应处理的ServiceSql try { ServiceSql currentServiceSql = ServiceSqlCache.getServiceSql(dataQuery.getServiceCode()); if (currentServiceSql == null) { throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"未提供该服务 serviceCode = " + dataQuery.getServiceCode()); } if ("".equals(currentServiceSql.getQueryModel())) { throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"配置服务 serviceCode = " + dataQuery.getServiceCode() + " 错误,未配置QueryModel,请联系管理员"); } dataQuery.setServiceSql(currentServiceSql); if (CommonConstant.QUERY_MODEL_SQL.equals(currentServiceSql.getQueryModel())) { doExecuteSql(dataQuery); return; }else if(CommonConstant.QUERY_MODE_JAVA.equals(currentServiceSql.getQueryModel())){ doExecuteJava(dataQuery); return ; } doExecuteProc(dataQuery); }catch (BusinessException e){ logger.error("公用查询异常:",e); dataQuery.setResponseInfo(ResponseTemplateUtil.createBusinessResponseJson(ResponseConstant.RESULT_PARAM_ERROR, e.getMessage())); } } @Override public void commonDoService(DataQuery dataQuery) throws BusinessException { //查询缓存查询 对应处理的ServiceSql try { ServiceSql currentServiceSql = ServiceSqlCache.getServiceSql(dataQuery.getServiceCode()); if (currentServiceSql == null) { throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"未提供该服务 serviceCode = " + dataQuery.getServiceCode()); } if ("".equals(currentServiceSql.getQueryModel())) { throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"配置服务 serviceCode = " + dataQuery.getServiceCode() + " 错误,未配置QueryModel,请联系管理员"); } dataQuery.setServiceSql(currentServiceSql); if (CommonConstant.QUERY_MODEL_SQL.equals(currentServiceSql.getQueryModel())) { doExecuteUpdateSql(dataQuery); return; }else if(CommonConstant.QUERY_MODE_JAVA.equals(currentServiceSql.getQueryModel())){ doExecuteJava(dataQuery); return ; } doExecuteUpdateProc(dataQuery); }catch (BusinessException e){ logger.error("公用查询异常:",e); dataQuery.setResponseInfo(ResponseTemplateUtil.createBusinessResponseJson(ResponseConstant.RESULT_PARAM_ERROR, e.getMessage())); } } /** * {"PARAM:"{ "param1": "$.a.#A#Object", "param2": "$.a.b.A#B#Array", "param3": "$.a.b.c.A.B#C#Array" },"TEMPLATE":"{}" } * 执行sql * @param dataQuery */ private void doExecuteUpdateSql(DataQuery dataQuery) throws BusinessException{ try { JSONObject params = dataQuery.getRequestParams(); JSONObject sqlObj = JSONObject.parseObject(dataQuery.getServiceSql().getSql()); String currentSql = ""; for(String key : sqlObj.keySet()) { currentSql = sqlObj.getString(key); String[] sqls = currentSql.split("#"); String currentSqlNew = ""; for (int sqlIndex = 0; sqlIndex < sqls.length; sqlIndex++) { if (sqlIndex % 2 == 0) { currentSqlNew += sqls[sqlIndex]; continue; } currentSqlNew += params.get(sqls[sqlIndex]) instanceof Integer ? params.getInteger(sqls[sqlIndex]) : "'" + params.getString(sqls[sqlIndex]) + "'"; } int flag = queryServiceDAOImpl.updateSql(currentSqlNew); if (flag < 1) { throw new BusinessException(ResponseConstant.RESULT_PARAM_ERROR, "调用接口失败"); } } }catch (Exception e){ logger.error("数据交互异常:",e); throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"数据交互异常。。。"); } } /** * 执行java脚本 * @param dataQuery * @throws BusinessException */ private void doExecuteJava(DataQuery dataQuery) throws BusinessException{ try { JSONObject params = dataQuery.getRequestParams(); String javaCode = dataQuery.getServiceSql().getJavaScript(); Interpreter interpreter = new Interpreter(); interpreter.eval(javaCode); String param = ""; for(String key : params.keySet()){ param += (params.getString(key) + ","); } if(param.endsWith(",")){ param = param.substring(0,param.length()-1); } dataQuery.setResponseInfo(ResponseTemplateUtil.createBusinessResponseJson(ResponseConstant.RESULT_CODE_SUCCESS, "成功",JSONObject.parseObject(interpreter.eval("execute("+param+")").toString()))); }catch (Exception e){ logger.error("数据交互异常:",e); throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"数据交互异常。。。"); } } /** * {"PARAM:"{ "param1": "$.a.#A#Object", "param2": "$.a.b.A#B#Array", "param3": "$.a.b.c.A.B#C#Array" },"TEMPLATE":"{}" } * 执行sql * @param dataQuery */ private void doExecuteSql(DataQuery dataQuery) throws BusinessException{ JSONObject templateObj = JSONObject.parseObject(dataQuery.getServiceSql().getTemplate()); JSONObject templateParams = templateObj.getJSONObject("PARAM"); JSONObject business = JSONObject.parseObject(templateObj.getString("TEMPLATE")); String template = ""; String[] values = null; JSONObject currentJsonObj = null; JSONArray currentJsonArr = null; for(String key:templateParams.keySet()){ template = templateParams.getString(key); if(!template.startsWith("$.")){ throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"template 配置 不正确,value 必须以$.开头"); } values = template.split("#"); if(values == null || values.length != 3){ throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"template 配置 不正确,value 必须有两个#号"); } Object o = JSONPath.eval(business,values[0]); dataQuery.setTemplateKey(key); if(o instanceof JSONObject){ currentJsonObj = (JSONObject)o; doJsonObject(currentJsonObj,dataQuery,values); }else if(o instanceof JSONArray){ currentJsonArr = (JSONArray) o; doJsonArray(currentJsonArr,dataQuery,values); }else{ throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"template 配置 不正确,value 值 和 TEMPLATE 配置不一致"); } } dataQuery.setResponseInfo(ResponseTemplateUtil.createBusinessResponseJson(ResponseConstant.RESULT_CODE_SUCCESS, "成功",business)); } /** * 处理 jsonObject * @param obj * @param dataQuery * @param values */ private void doJsonObject(JSONObject obj,DataQuery dataQuery,String[] values){ try { JSONObject params = dataQuery.getRequestParams(); JSONObject sqlObj = JSONObject.parseObject(dataQuery.getServiceSql().getSql()); String currentSql = sqlObj.getString(dataQuery.getTemplateKey()); String[] sqls = currentSql.split("#"); String currentSqlNew = ""; for (int sqlIndex = 0; sqlIndex < sqls.length; sqlIndex++) { if (sqlIndex % 2 == 0) { currentSqlNew += sqls[sqlIndex]; continue; } if (sqls[sqlIndex].startsWith("PARENT_")) { for (String key : obj.keySet()) { if (sqls[sqlIndex].substring("PARENT_".length()).equals(key)) { currentSqlNew += obj.get(key) instanceof Integer ? obj.getInteger(key) : "'" + obj.getString(key) + "'"; continue; } } } else { currentSqlNew += params.get(sqls[sqlIndex]) instanceof Integer ? params.getInteger(sqls[sqlIndex]) : "'" + params.getString(sqls[sqlIndex]) + "'"; } } List results = queryServiceDAOImpl.executeSql(currentSqlNew); if (results == null || results.size() == 0) { obj.put(values[1], new JSONObject()); return; } if (values[2].equals("Object")) { obj.put(values[1], JSONObject.parseObject(JSONObject.toJSONString(results.get(0)))); } else if (values[2].equals("Array")) { obj.put(values[1], JSONArray.parseArray(JSONArray.toJSONString(results))); } }catch (Exception e){ logger.error("数据交互异常:",e); throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"数据交互异常。。。"); } } /** * 处理JSONArray * @param objs * @param dataQuery * @param values */ private void doJsonArray(JSONArray objs,DataQuery dataQuery,String[] values){ for (int objIndex = 0 ; objIndex < objs.size();objIndex ++){ doJsonObject(objs.getJSONObject(objIndex),dataQuery,values); } } /** * 执行存储 * @param dataQuery */ private void doExecuteUpdateProc(DataQuery dataQuery){ Map info = new TreeMap(); info.put("procName",dataQuery.getServiceSql().getProc()); JSONObject params = dataQuery.getRequestParams(); info.putAll(params); String jsonStr = queryServiceDAOImpl.updateProc(info); if(!Assert.isJsonObject(jsonStr)){ throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"存储过程 procName = " + dataQuery.getServiceSql().getProc() + " 返回结果不是Json格式"); } dataQuery.setResponseInfo(ResponseTemplateUtil.createBusinessResponseJson(ResponseConstant.RESULT_CODE_SUCCESS, "成功",JSONObject.parseObject(jsonStr))); } /** * 执行存储 * @param dataQuery */ private void doExecuteProc(DataQuery dataQuery){ Map info = new TreeMap(); info.put("procName",dataQuery.getServiceSql().getProc()); JSONObject params = dataQuery.getRequestParams(); info.putAll(params); String jsonStr = queryServiceDAOImpl.executeProc(info); if(!Assert.isJsonObject(jsonStr)){ throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"存储过程 procName = " + dataQuery.getServiceSql().getProc() + " 返回结果不是Json格式"); } dataQuery.setResponseInfo(ResponseTemplateUtil.createBusinessResponseJson(ResponseConstant.RESULT_CODE_SUCCESS, "成功",JSONObject.parseObject(jsonStr))); } public IQueryServiceDAO getQueryServiceDAOImpl() { return queryServiceDAOImpl; } public void setQueryServiceDAOImpl(IQueryServiceDAO queryServiceDAOImpl) { this.queryServiceDAOImpl = queryServiceDAOImpl; } }