From 01ae4444d62fbd0c09942ffbd66c79bac2057ca9 Mon Sep 17 00:00:00 2001
From: java110 <928255095@qq.com>
Date: 星期日, 29 一月 2023 16:32:50 +0800
Subject: [PATCH] optimize config item

---
 java110-service/src/main/java/com/java110/service/smo/impl/QueryServiceSMOImpl.java |  420 ++++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 312 insertions(+), 108 deletions(-)

diff --git a/java110-service/src/main/java/com/java110/service/smo/impl/QueryServiceSMOImpl.java b/java110-service/src/main/java/com/java110/service/smo/impl/QueryServiceSMOImpl.java
old mode 100644
new mode 100755
index 0d1882d..0072da3
--- a/java110-service/src/main/java/com/java110/service/smo/impl/QueryServiceSMOImpl.java
+++ b/java110-service/src/main/java/com/java110/service/smo/impl/QueryServiceSMOImpl.java
@@ -4,21 +4,33 @@
 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.alibaba.fastjson.parser.Feature;
 import com.java110.core.factory.DataTransactionFactory;
-import com.java110.common.log.LoggerEngine;
-import com.java110.common.util.Assert;
-import com.java110.common.util.StringUtil;
-import com.java110.entity.service.DataQuery;
+import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.db.dao.IQueryServiceDAO;
+import com.java110.dto.logSystemError.LogSystemErrorDto;
 import com.java110.entity.service.ServiceSql;
-import com.java110.service.dao.IQueryServiceDAO;
+import com.java110.po.logSystemError.LogSystemErrorPo;
+import com.java110.service.context.DataQuery;
 import com.java110.service.smo.IQueryServiceSMO;
+import com.java110.service.smo.ISaveSystemErrorSMO;
+import com.java110.utils.cache.ServiceSqlCache;
+import com.java110.utils.constant.CommonConstant;
+import com.java110.utils.constant.ResponseConstant;
+import com.java110.utils.exception.BusinessException;
+import com.java110.utils.log.LoggerEngine;
+import com.java110.utils.util.Assert;
+import com.java110.utils.util.ExceptionUtil;
+import com.java110.utils.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.ognl.Ognl;
+import org.apache.ibatis.ognl.OgnlContext;
+import org.apache.ibatis.ognl.OgnlException;
+import org.dom4j.DocumentException;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import com.java110.core.log.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -38,11 +50,14 @@
 public class QueryServiceSMOImpl extends LoggerEngine implements IQueryServiceSMO {
 
 
-    private final static Logger logger = LoggerFactory.getLogger(QueryServiceSMOImpl.class);
+    private static Logger logger = LoggerFactory.getLogger(QueryServiceSMOImpl.class);
 
 
     @Autowired
     private IQueryServiceDAO queryServiceDAOImpl;
+
+    @Autowired(required = false)
+    private ISaveSystemErrorSMO saveSystemErrorSMOImpl;
 
     @Override
     public void commonQueryService(DataQuery dataQuery) throws BusinessException {
@@ -51,77 +66,108 @@
         try {
             ServiceSql currentServiceSql = ServiceSqlCache.getServiceSql(dataQuery.getServiceCode());
             if (currentServiceSql == null) {
-                throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"鏈彁渚涜鏈嶅姟 serviceCode = " + dataQuery.getServiceCode());
+                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,璇疯仈绯荤鐞嗗憳");
+                throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR, "閰嶇疆鏈嶅姟 serviceCode = " + dataQuery.getServiceCode() + " 閿欒锛屾湭閰嶇疆QueryModel,璇疯仈绯荤鐞嗗憳");
             }
             //璇锋眰鍙傛暟鏍¢獙
             List<String> sysParams = currentServiceSql.getParamList();
-            for(String param : sysParams) {
-                if(!dataQuery.getRequestParams().containsKey(param)){
-                    throw new BusinessException(ResponseConstant.RESULT_PARAM_ERROR,"璇锋眰鍙傛暟閿欒锛岃姹傛姤鏂囦腑鏈寘鍚弬鏁� " + param + " 淇℃伅");
+            for (String param : sysParams) {
+                if (!dataQuery.getRequestParams().containsKey(param)) {
+                    //2019-04-10 杩欓噷淇敼涓轰笉鎶涘嚭寮傚父鑰屾槸鍐欎负绌哄瓧绗︿覆
+                    //throw new BusinessException(ResponseConstant.RESULT_PARAM_ERROR,"璇锋眰鍙傛暟閿欒锛岃姹傛姤鏂囦腑鏈寘鍚弬鏁� " + param + " 淇℃伅");
+                    dataQuery.getRequestParams().put(param, "");
                 }
             }
             dataQuery.setServiceSql(currentServiceSql);
             if (CommonConstant.QUERY_MODEL_SQL.equals(currentServiceSql.getQueryModel())) {
                 doExecuteSql(dataQuery);
-            }else if(CommonConstant.QUERY_MODE_JAVA.equals(currentServiceSql.getQueryModel())){
+            } else if (CommonConstant.QUERY_MODE_JAVA.equals(currentServiceSql.getQueryModel())) {
                 doExecuteJava(dataQuery);
-            }else {
+            } else {
                 doExecuteProc(dataQuery);
             }
             responseEntity = new ResponseEntity<String>(dataQuery.getResponseInfo().toJSONString(), HttpStatus.OK);
-        }catch (BusinessException e){
-            logger.error("鍏敤鏌ヨ寮傚父锛�",e);
+        } catch (BusinessException e) {
+            logger.error("鍏敤鏌ヨ寮傚父锛�", e);
             /*dataQuery.setResponseInfo(DataTransactionFactory.createBusinessResponseJson(ResponseConstant.RESULT_PARAM_ERROR,
                     e.getMessage()));*/
-            responseEntity = new ResponseEntity<String>("璇锋眰鍙戠敓寮傚父锛�"+e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
-        }finally {
+            responseEntity = new ResponseEntity<String>("璇锋眰鍙戠敓寮傚父锛�" + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
+        } finally {
             dataQuery.setResponseEntity(responseEntity);
         }
 
 
     }
+
     @Override
     public void commonDoService(DataQuery dataQuery) throws BusinessException {
         //鏌ヨ缂撳瓨鏌ヨ 瀵瑰簲澶勭悊鐨凷erviceSql
         try {
             ServiceSql currentServiceSql = ServiceSqlCache.getServiceSql(dataQuery.getServiceCode());
             if (currentServiceSql == null) {
-                throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"鏈彁渚涜鏈嶅姟 serviceCode = " + dataQuery.getServiceCode());
+                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,璇疯仈绯荤鐞嗗憳");
+                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())){
+            } else if (CommonConstant.QUERY_MODE_JAVA.equals(currentServiceSql.getQueryModel())) {
                 doExecuteJava(dataQuery);
-                return ;
+                return;
             }
             doExecuteUpdateProc(dataQuery);
-        }catch (BusinessException e){
-            logger.error("鍏敤鏌ヨ寮傚父锛�",e);
+        } catch (BusinessException e) {
+            logger.error("鍏敤鏌ヨ寮傚父锛�", e);
             dataQuery.setResponseInfo(DataTransactionFactory.createBusinessResponseJson(ResponseConstant.RESULT_PARAM_ERROR,
                     e.getMessage()));
         }
 
     }
 
+    @Override
+    public ResponseEntity<String> fallBack(String fallBackInfo) throws BusinessException {
+
+        JSONArray params = JSONArray.parseArray(fallBackInfo);
+        String sql = "";
+        for (int paramIndex = 0; paramIndex < params.size(); paramIndex++) {
+            try {
+                JSONObject param = params.getJSONObject(paramIndex);
+                sql =  param.getString("fallBackSql");
+                if (StringUtil.isEmpty(sql)) {
+                    return new ResponseEntity<String>("鏈寘鍚玸ql淇℃伅", HttpStatus.BAD_REQUEST);
+                }
+                int flag = queryServiceDAOImpl.updateSql(sql, null);
+            }catch (Exception e){
+                LogSystemErrorPo logSystemErrorPo = new LogSystemErrorPo();
+                logSystemErrorPo.setErrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_errId));
+                logSystemErrorPo.setErrType(LogSystemErrorDto.ERR_TYPE_JOB);
+                logSystemErrorPo.setMsg(sql+ExceptionUtil.getStackTrace(e));
+                saveSystemErrorSMOImpl.saveLog(logSystemErrorPo);
+            }
+
+        }
+        return new ResponseEntity<String>("鍥為��鎴愬姛", HttpStatus.OK);
+
+    }
+
+
     /**
      * {"PARAM:"{
-     "param1": "$.a.#A#Object",
-     "param2": "$.a.b.A#B#Array",
-     "param3": "$.a.b.c.A.B#C#Array"
-     },"TEMPLATE":"{}"
-     }
+     * "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{
+    private void doExecuteUpdateSql(DataQuery dataQuery) throws BusinessException {
         JSONObject business = null;
         try {
             JSONObject params = dataQuery.getRequestParams();
@@ -130,7 +176,7 @@
             business = JSONObject.parseObject(templateObj.getString("TEMPLATE"));
             List<Object> currentParams = new ArrayList<Object>();
             String currentSql = "";
-            for(String key : sqlObj.keySet()) {
+            for (String key : sqlObj.keySet()) {
                 currentSql = sqlObj.getString(key);
                 String[] sqls = currentSql.split("#");
                 String currentSqlNew = "";
@@ -144,61 +190,56 @@
                     //currentSqlNew += params.get(sqls[sqlIndex]) instanceof Integer ? params.getInteger(sqls[sqlIndex]) : "'" + params.getString(sqls[sqlIndex]) + "'";
                 }
 
-                int flag = queryServiceDAOImpl.updateSql(currentSqlNew,currentParams.toArray());
+                int flag = queryServiceDAOImpl.updateSql(currentSqlNew, currentParams.toArray());
 
                 if (flag < 1) {
                     throw new BusinessException(ResponseConstant.RESULT_PARAM_ERROR, "鏁版嵁浜や簰澶辫触");
                 }
             }
 
-        }catch (Exception e){
-            logger.error("鏁版嵁浜や簰寮傚父锛�",e);
-            throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"鏁版嵁浜や簰寮傚父銆傘�傘��");
+        } catch (Exception e) {
+            logger.error("鏁版嵁浜や簰寮傚父锛�", e);
+            throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR, "鏁版嵁浜や簰寮傚父銆傘�傘��");
         }
 
         dataQuery.setResponseInfo(DataTransactionFactory.createBusinessResponseJson(ResponseConstant.RESULT_CODE_SUCCESS,
-                "鎴愬姛",business));
+                "鎴愬姛", business));
     }
 
     /**
      * 鎵цjava鑴氭湰
+     *
      * @param dataQuery
      * @throws BusinessException
      */
-    private void doExecuteJava(DataQuery dataQuery) throws BusinessException{
+    private void doExecuteJava(DataQuery dataQuery) throws BusinessException {
         try {
-            JSONObject params = dataQuery.getRequestParams();
+            //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);
-            }
-
+            interpreter.set("dataQuery", dataQuery);
             dataQuery.setResponseInfo(DataTransactionFactory.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,"鏁版嵁浜や簰寮傚父銆傘�傘��");
+                    "鎴愬姛", JSONObject.parseObject(interpreter.eval("execute(dataQuery)").toString())));
+        } catch (Exception e) {
+            logger.error("鏁版嵁浜や簰寮傚父锛�", e);
+            throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR, "鏁版嵁浜や簰寮傚父," + e.getMessage());
         }
     }
+
     /**
      * {"PARAM:"{
-     "param1": "$.a.#A#Object",
-     "param2": "$.a.b.A#B#Array",
-     "param3": "$.a.b.c.A.B#C#Array"
-     },"TEMPLATE":"{}"
-     }
+     * "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{
+    private void doExecuteSql(DataQuery dataQuery) throws BusinessException {
 
         JSONObject templateObj = JSONObject.parseObject(dataQuery.getServiceSql().getTemplate());
         JSONObject templateParams = templateObj.getJSONObject("PARAM");
@@ -207,7 +248,7 @@
         String[] values = null;
         JSONObject currentJsonObj = null;
         JSONArray currentJsonArr = null;
-        for(String key:templateParams.keySet()){
+        for (String key : templateParams.keySet()) {
             template = templateParams.getString(key);
 
             values = judgeResponseTemplate(template);
@@ -215,34 +256,41 @@
             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){
+            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 閰嶇疆涓嶄竴鑷�");
+                doJsonArray(currentJsonArr, dataQuery, values);
+            } else {
+                throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR, "template 閰嶇疆 涓嶆纭紝value 鍊� 鍜� TEMPLATE 閰嶇疆涓嶄竴鑷�");
             }
         }
 
         dataQuery.setResponseInfo(DataTransactionFactory.createBusinessResponseJson(ResponseConstant.RESULT_CODE_SUCCESS,
-                "鎴愬姛",business));
+                "鎴愬姛", business));
     }
 
     /**
      * 澶勭悊 jsonObject
+     *
      * @param obj
      * @param dataQuery
      * @param values
      */
-    private void doJsonObject(JSONObject obj,DataQuery dataQuery,String[] values){
+    private void doJsonObject(JSONObject obj, DataQuery dataQuery, String[] values) {
         try {
             JSONObject params = dataQuery.getRequestParams();
             JSONObject sqlObj = JSONObject.parseObject(dataQuery.getServiceSql().getSql());
             List<Object> currentParams = new ArrayList<Object>();
 
             String currentSql = sqlObj.getString(dataQuery.getTemplateKey());
+            //澶勭悊 if 鍒ゆ柇
+            logger.debug("dealSqlIf寮�濮嬪鐞唖ql涓殑<if>鑺傜偣 " + currentSql + " 鍏ュ弬:" + params.toJSONString());
+            currentSql = dealSqlIf(currentSql, params);
+            logger.debug("dealSqlIf澶勭悊瀹屾垚sql涓殑<if>鑺傜偣 " + currentSql + " 鍏ュ弬:" + params.toJSONString());
+
+
             String[] sqls = currentSql.split("#");
             String currentSqlNew = "";
             for (int sqlIndex = 0; sqlIndex < sqls.length; sqlIndex++) {
@@ -251,7 +299,7 @@
                     continue;
                 }
                 if (sqls[sqlIndex].startsWith("PARENT_")) {
-                    if(obj.isEmpty()){
+                    if (obj.isEmpty()) {
                         currentSqlNew += "?";
                         currentParams.add("''");
                         continue;
@@ -268,12 +316,12 @@
                     }
                 } else {
                     currentSqlNew += "?";
-                    Object param =  params.getString(sqls[sqlIndex]);
-                    if(params.get(sqls[sqlIndex]) instanceof Integer){
+                    Object param = params.getString(sqls[sqlIndex]);
+                    if (params.get(sqls[sqlIndex]) instanceof Integer) {
                         param = params.getInteger(sqls[sqlIndex]);
                     }
-                   //杩欓噷瀵� page 鍜� rows 鐗规畩澶勭悊 锛岀洰鍓嶆病鏈夋兂鍒板叾浠栫殑鍔炴硶
-                    if(StringUtils.isNumeric(param.toString()) && "page,rows".contains(sqls[sqlIndex])){
+                    //杩欓噷瀵� page 鍜� rows 鐗规畩澶勭悊 锛岀洰鍓嶆病鏈夋兂鍒板叾浠栫殑鍔炴硶
+                    if (StringUtils.isNumeric(param.toString()) && "page,rows,row".contains(sqls[sqlIndex])) {
                         param = Integer.parseInt(param.toString());
                     }
                     currentParams.add(param);
@@ -281,93 +329,248 @@
                 }
             }
 
-            List<Map<String,Object>> results = queryServiceDAOImpl.executeSql(currentSqlNew, currentParams.toArray());
+            List<Map<String, Object>> results = queryServiceDAOImpl.executeSql(currentSqlNew, currentParams.toArray());
 
             if (results == null || results.size() == 0) {
-                if(StringUtil.isNullOrNone(values[1])){
-                    return ;
+                if (StringUtil.isNullOrNone(values[1])) {
+                    return;
                 }
-                obj.put(values[1], values[2].equals("Object")?new JSONObject():new JSONArray());
+                obj.put(values[1], values[2].equals("Object") ? new JSONObject() : new JSONArray());
                 return;
             }
             if (values[2].equals("Object")) {
-                if(StringUtil.isNullOrNone(values[1])){
+                if (StringUtil.isNullOrNone(values[1])) {
                     obj.putAll(JSONObject.parseObject(JSONObject.toJSONString(results.get(0))));
-                    return ;
+                    return;
                 }
                 obj.put(values[1], JSONObject.parseObject(JSONObject.toJSONString(results.get(0))));
             } else if (values[2].equals("Array")) {
-                if(StringUtil.isNullOrNone(values[1])){
+                if (StringUtil.isNullOrNone(values[1])) {
                     JSONArray datas = JSONArray.parseArray(JSONArray.toJSONString(results));
-                    for(int dataIndex = 0;dataIndex < datas.size();dataIndex ++){
+                    for (int dataIndex = 0; dataIndex < datas.size(); dataIndex++) {
                         obj.putAll(datas.getJSONObject(dataIndex));
                     }
-                    return ;
+                    return;
                 }
                 obj.put(values[1], JSONArray.parseArray(JSONArray.toJSONString(results)));
             }
-        }catch (Exception e){
-            logger.error("鏁版嵁浜や簰寮傚父锛�",e);
-            throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"鏁版嵁浜や簰寮傚父銆傘�傘��");
+        } catch (Exception e) {
+            logger.error("鏁版嵁浜や簰寮傚父锛�", e);
+            throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR, "鏁版嵁浜や簰寮傚父銆傘�傘��");
         }
     }
 
     /**
+     * 鎵цjava鑴氭湰
+     *
+     * @param javaCode
+     * @throws BusinessException
+     */
+    public JSONObject execJava(JSONObject params, String javaCode) throws BusinessException {
+        try {
+            //JSONObject params = dataQuery.getRequestParams();
+            List<String> columns = new ArrayList<>();
+            Interpreter interpreter = new Interpreter();
+            interpreter.eval(javaCode);
+            interpreter.set("params", params);
+            interpreter.set("queryServiceDAOImpl",queryServiceDAOImpl);
+            JSONObject results = JSONObject.parseObject(interpreter.eval("execute(params,queryServiceDAOImpl)").toString(), Feature.OrderedField);
+
+            JSONArray data = null;
+            if (results == null || results.size() < 1) {
+                data = new JSONArray();
+            } else {
+                data = results.getJSONArray("data");
+            }
+
+            JSONArray th = new JSONArray();
+            if(data.size()>0) {
+                for (String key : data.getJSONObject(0).keySet()) {
+                    th.add(key);
+                }
+            }
+            JSONObject paramOut = new JSONObject();
+            paramOut.put("th", th);
+            paramOut.put("td", data);
+            paramOut.put("total",results.getString("total"));
+
+            return paramOut;
+        } catch (Exception e) {
+            logger.error("鏁版嵁浜や簰寮傚父锛�", e);
+            throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR, "鏁版嵁浜や簰寮傚父," + e.getMessage());
+        }
+    }
+
+    @Override
+    public JSONObject execQuerySql(JSONObject params, String currentSql) throws BusinessException {
+        List<Map<String, Object>> results = null;
+        List<String> columns = new ArrayList<>();
+        try {
+            List<Object> currentParams = new ArrayList<Object>();
+            //澶勭悊 if 鍒ゆ柇
+            logger.debug("dealSqlIf寮�濮嬪鐞唖ql涓殑<if>鑺傜偣 " + currentSql + " 鍏ュ弬:" + params.toJSONString());
+            currentSql = dealSqlIf(currentSql, params);
+            logger.debug("dealSqlIf澶勭悊瀹屾垚sql涓殑<if>鑺傜偣 " + currentSql + " 鍏ュ弬:" + params.toJSONString());
+            String[] sqls = currentSql.split("#");
+            String currentSqlNew = "";
+            for (int sqlIndex = 0; sqlIndex < sqls.length; sqlIndex++) {
+                if (sqlIndex % 2 == 0) {
+                    currentSqlNew += sqls[sqlIndex];
+                    continue;
+                }
+                currentSqlNew += "?";
+                Object param = params.getString(sqls[sqlIndex]);
+                if (params.get(sqls[sqlIndex]) instanceof Integer) {
+                    param = params.getInteger(sqls[sqlIndex]);
+                }
+                //杩欓噷瀵� page 鍜� rows 鐗规畩澶勭悊 锛岀洰鍓嶆病鏈夋兂鍒板叾浠栫殑鍔炴硶
+                if (StringUtils.isNumeric(param.toString()) && "page,rows,row".contains(sqls[sqlIndex])) {
+                    param = Integer.parseInt(param.toString());
+                }
+                currentParams.add(param);
+            }
+            results = queryServiceDAOImpl.executeSql(currentSqlNew, currentParams.toArray(), columns);
+        } catch (Exception e) {
+            logger.error("瑙f瀽sql 寮傚父", e);
+            throw new BusinessException("1999", e.getLocalizedMessage());
+        }
+        JSONArray data = null;
+        if (results == null || results.size() < 1) {
+            data = new JSONArray();
+        } else {
+            data = JSONArray.parseArray(JSONArray.toJSONString(results));
+        }
+        JSONArray th = null;
+        if (columns.size() < 1) {
+            th = new JSONArray();
+        } else {
+            th = JSONArray.parseArray(JSONArray.toJSONString(columns));
+        }
+
+
+        JSONObject paramOut = new JSONObject();
+        paramOut.put("th", th);
+        paramOut.put("td", data);
+        return paramOut;
+    }
+
+    /**
+     * 澶勭悊SQL璇彞
+     *
+     * @param oldSql select * from s_a a
+     *               where <if test="name != null && name != ''">
+     *               a.name = #name#
+     *               </if>
+     * @return
+     */
+    public String dealSqlIf(String oldSql, JSONObject requestParams) throws DocumentException, OgnlException {
+        StringBuffer newSql = new StringBuffer();
+        String tmpSql = "";
+        Boolean conditionResult = false;
+        // 鏈寘鍚� 鏉′欢璇彞
+        if (!oldSql.contains("<if")) {
+            return oldSql;
+        }
+        String[] oSqls = oldSql.split("</if>");
+        for (String oSql : oSqls) {
+            logger.debug("澶勭悊if 鑺傜偣锛屽綋鍓嶅鐞嗙殑oSql=" + oSql + "鎬荤殑oSqls = " + oSqls);
+            if (StringUtil.isNullOrNone(oSql) || !oSql.contains("<if")) {
+                newSql.append(oSql);
+                continue;
+            }
+            if (!oSql.startsWith("<if")) {
+                newSql.append(oSql.substring(0, oSql.indexOf("<if")));
+            }
+
+            tmpSql = oSql.substring(oSql.indexOf("<if")) + "</if>";
+
+            Element root = DocumentHelper.parseText(tmpSql).getRootElement();
+
+            String condition = root.attribute("test").getValue();
+
+            Object condObj = Ognl.parseExpression(condition);
+
+            OgnlContext context = new OgnlContext(null,null,new DefaultMemberAccess(true));
+
+            Object value = Ognl.getValue(condObj,context, requestParams);
+
+            if (value instanceof Boolean) {
+                conditionResult = (Boolean) value;
+            } else {
+                throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR, "閰嶇疆閿欒锛宨f璇彞閰嶇疆閿欒 " + condition);
+            }
+
+            if (conditionResult) {
+                newSql.append(root.getText());
+            }
+
+
+        }
+
+
+        return newSql.toString().replace("&gt;", ">").replace("&lt;", "<");
+
+    }
+
+    /**
      * 澶勭悊JSONArray
+     *
      * @param objs
      * @param dataQuery
      * @param values
      */
-    private void doJsonArray(JSONArray objs,DataQuery dataQuery,String[] values){
+    private void doJsonArray(JSONArray objs, DataQuery dataQuery, String[] values) {
 
-        for (int objIndex = 0 ; objIndex < objs.size();objIndex ++){
-            doJsonObject(objs.getJSONObject(objIndex),dataQuery,values);
+        for (int objIndex = 0; objIndex < objs.size(); objIndex++) {
+            doJsonObject(objs.getJSONObject(objIndex), dataQuery, values);
         }
 
     }
 
     /**
      * 鎵ц瀛樺偍
+     *
      * @param dataQuery
      */
-    private void doExecuteUpdateProc(DataQuery dataQuery){
+    private void doExecuteUpdateProc(DataQuery dataQuery) {
         Map info = new TreeMap();
-        info.put("procName",dataQuery.getServiceSql().getProc());
+        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鏍煎紡");
+        if (!Assert.isJsonObject(jsonStr)) {
+            throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR, "瀛樺偍杩囩▼ procName = " + dataQuery.getServiceSql().getProc() + " 杩斿洖缁撴灉涓嶆槸Json鏍煎紡");
         }
 
         dataQuery.setResponseInfo(DataTransactionFactory.createBusinessResponseJson(ResponseConstant.RESULT_CODE_SUCCESS,
-                "鎴愬姛",JSONObject.parseObject(jsonStr)));
+                "鎴愬姛", JSONObject.parseObject(jsonStr)));
     }
 
 
     /**
      * 鏍¢獙 杩斿洖妯℃澘
+     *
      * @param template
      * @return
      * @throws BusinessException
      */
-    private String[] judgeResponseTemplate(String template) throws BusinessException{
+    private String[] judgeResponseTemplate(String template) throws BusinessException {
 
 
-        if(!template.startsWith("$.")){
-            throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"template 閰嶇疆 涓嶆纭紝value 蹇呴』浠�$.寮�澶�");
+        if (!template.startsWith("$.")) {
+            throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR, "template 閰嶇疆 涓嶆纭紝value 蹇呴』浠�$.寮�澶�");
         }
 
         String[] values = template.split("#");
 
-        if(values == null || values.length != 3){
-            throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"template 閰嶇疆 涓嶆纭紝value 蹇呴』鏈変袱涓�#鍙�");
+        if (values == null || values.length != 3) {
+            throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR, "template 閰嶇疆 涓嶆纭紝value 蹇呴』鏈変袱涓�#鍙�");
         }
 
-        if(StringUtil.isNullOrNone(values[1]) && !"$.##Object".equals(template) && !"$.##Array".equals(template)){
-            throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"template 閰嶇疆 涓嶆纭紝鐩墠鍙敮鎸� $.##Object 鍜� $.##Array ");
+        if (StringUtil.isNullOrNone(values[1]) && !"$.##Object".equals(template) && !"$.##Array".equals(template)) {
+            throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR, "template 閰嶇疆 涓嶆纭紝鐩墠鍙敮鎸� $.##Object 鍜� $.##Array ");
         }
 
         return values;
@@ -376,22 +579,23 @@
 
     /**
      * 鎵ц瀛樺偍
+     *
      * @param dataQuery
      */
-    private void doExecuteProc(DataQuery dataQuery){
+    private void doExecuteProc(DataQuery dataQuery) {
         Map info = new TreeMap();
-        info.put("procName",dataQuery.getServiceSql().getProc());
+        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鏍煎紡");
+        if (!Assert.isJsonObject(jsonStr)) {
+            throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR, "瀛樺偍杩囩▼ procName = " + dataQuery.getServiceSql().getProc() + " 杩斿洖缁撴灉涓嶆槸Json鏍煎紡");
         }
 
         dataQuery.setResponseInfo(DataTransactionFactory.createBusinessResponseJson(ResponseConstant.RESULT_CODE_SUCCESS,
-                "鎴愬姛",JSONObject.parseObject(jsonStr)));
+                "鎴愬姛", JSONObject.parseObject(jsonStr)));
     }
 
 

--
Gitblit v1.8.0