From 70862b9228ccb2156971a22085ac31b6c8b6d2cd Mon Sep 17 00:00:00 2001
From: java110 <928255095@qq.com>
Date: 星期二, 07 七月 2020 19:35:42 +0800
Subject: [PATCH] 优化代码

---
 java110-db/src/main/java/com/java110/db/Java110MybatisInterceptor.java |  191 ++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 176 insertions(+), 15 deletions(-)

diff --git a/java110-db/src/main/java/com/java110/db/Java110MybatisInterceptor.java b/java110-db/src/main/java/com/java110/db/Java110MybatisInterceptor.java
index 9714206..f7da7c4 100644
--- a/java110-db/src/main/java/com/java110/db/Java110MybatisInterceptor.java
+++ b/java110-db/src/main/java/com/java110/db/Java110MybatisInterceptor.java
@@ -1,30 +1,45 @@
 package com.java110.db;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.core.client.RestTemplate;
+import com.java110.core.factory.Java110TransactionalFactory;
+import com.java110.db.dao.IQueryServiceDAO;
+import com.java110.dto.order.OrderItemDto;
+import com.java110.utils.constant.ServiceConstant;
+import com.java110.utils.factory.ApplicationContextFactory;
+import com.java110.utils.util.StringUtil;
 import org.apache.ibatis.executor.Executor;
-import org.apache.ibatis.mapping.*;
+import org.apache.ibatis.mapping.BoundSql;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.ParameterMapping;
+import org.apache.ibatis.mapping.SqlCommandType;
 import org.apache.ibatis.plugin.*;
 import org.apache.ibatis.reflection.MetaObject;
 import org.apache.ibatis.session.Configuration;
 import org.apache.ibatis.type.TypeHandlerRegistry;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.http.*;
 
 import java.text.DateFormat;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-import java.util.Properties;
+import java.util.*;
 
 @Intercepts({
         @Signature(type = Executor.class, method = "update", args = {MappedStatement.class,
                 Object.class})
 })
-
 public class Java110MybatisInterceptor implements Interceptor {
     private static Logger logger = LoggerFactory.getLogger(Java110MybatisInterceptor.class);
 
+    IQueryServiceDAO queryServiceDAOImpl;
+    RestTemplate restTemplate;
+
     @Override
     public Object intercept(Invocation invocation) throws Throwable {
+        if (StringUtil.isEmpty(Java110TransactionalFactory.getOId())) { //鏈紑鍚簨鍔�
+            return invocation.proceed();
+        }
         MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
         SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
         Object parameter = null;
@@ -36,16 +51,16 @@
         Configuration configuration = mappedStatement.getConfiguration();
         //鑾峰彇sql璇彞
         String sql = showSql(configuration, boundSql);
-
+        restTemplate = ApplicationContextFactory.getBean("restTemplate", RestTemplate.class);
         switch (sqlCommandType) {
             case INSERT:
-                dealInsertSql(mappedStatement, parameter,sql);
+                dealInsertSql(mappedStatement, parameter, sql);
                 break;
             case UPDATE:
-                dealUpdateSql(mappedStatement, parameter,sql);
+                dealUpdateSql(mappedStatement, parameter, sql);
                 break;
             case DELETE:
-                dealDeleteSql(mappedStatement, parameter,sql);
+                dealDeleteSql(mappedStatement, parameter, sql);
                 break;
         }
         return invocation.proceed();
@@ -57,7 +72,46 @@
      * @param mappedStatement
      * @param parameter
      */
-    private void dealDeleteSql(MappedStatement mappedStatement, Object parameter,String sql) {
+    private void dealDeleteSql(MappedStatement mappedStatement, Object parameter, String sql) {
+
+        String tmpTable = sql.substring(sql.indexOf("into") + 4, sql.indexOf("("));
+        String tmpWhere = sql.substring(sql.indexOf("where"));
+        //鎻掑叆鎿嶄綔鏃朵箣鍓嶇殑 娌℃湁鏁版嵁 鎵�浠� preValue 涓虹┖瀵硅薄
+        JSONArray preValues = new JSONArray();
+
+        String execSql = "select * from " + tmpTable + " " + tmpWhere;
+
+        queryServiceDAOImpl = ApplicationContextFactory.getBean("queryServiceDAOImpl", IQueryServiceDAO.class);
+        List<Map<String, Object>> deleteDatas = queryServiceDAOImpl.executeSql(execSql, null);
+
+        if (deleteDatas != null && deleteDatas.size() > 0) {
+            for (Map<String, Object> map : deleteDatas) {
+                preValues.add(map);
+            }
+        }
+
+        JSONArray afterValues = new JSONArray();
+
+        JSONObject logText = new JSONObject();
+        logText.put("preValue", preValues);
+        logText.put("afterValue", afterValues);
+
+        OrderItemDto orderItemDto = new OrderItemDto();
+        orderItemDto.setbId("-1");
+        orderItemDto.setAction("DEL");
+        orderItemDto.setActionObj(tmpTable.trim());
+        orderItemDto.setLogText(logText.toJSONString());
+        orderItemDto.setServiceName(ApplicationContextFactory.getApplicationName());
+        orderItemDto.setoId(Java110TransactionalFactory.getOId());
+
+        String url = ServiceConstant.SERVICE_ORDER_URL + "/order/oIdApi/createOrderItem";
+        HttpHeaders httpHeaders = new HttpHeaders();
+        HttpEntity httpEntity = new HttpEntity(orderItemDto.toString(), httpHeaders);
+        ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class);
+
+        if (responseEntity.getStatusCode() != HttpStatus.OK) {
+            throw new IllegalArgumentException("娉ㄥ唽浜嬪姟鍥炴粴鏃ュ織澶辫触" + responseEntity);
+        }
     }
 
     /**
@@ -66,7 +120,71 @@
      * @param mappedStatement
      * @param parameter
      */
-    private void dealUpdateSql(MappedStatement mappedStatement, Object parameter,String sql) {
+    private void dealUpdateSql(MappedStatement mappedStatement, Object parameter, String sql) {
+        //RestTemplate restTemplate = ApplicationContextFactory.getBean("restTemplate", RestTemplate.class);
+
+        String tmpTable = sql.substring(sql.indexOf("update") + 6, sql.indexOf("set"));
+        String tmpWhere = sql.substring(sql.indexOf("where"));
+        String tmpKey = sql.substring(sql.indexOf("set") + 3, sql.indexOf("where"));
+        String[] tmpString = tmpKey.split(",");
+        Map tmpAfterMap = new HashMap();
+        for (String tmp : tmpString) {
+            String[] keyValues = tmp.split("=");
+            String key = "";
+            if (keyValues.length != 2) {
+                throw new IllegalArgumentException("update 璇彞鍙兘鏈夐棶棰橈紝娌℃湁 set 涓嚭閿� " + sql);
+            }
+            if (keyValues[0].contains(".")) {
+                key = keyValues[0].substring(keyValues[0].indexOf(".") + 1);
+            } else {
+                key = keyValues[0];
+            }
+            tmpAfterMap.put(key.trim(), keyValues[1].trim());
+        }
+
+
+        if (tmpString == null || tmpString.length < 1) {
+            throw new IllegalArgumentException("update 璇彞鍙兘鏈夐棶棰橈紝娌℃湁 set 鍐呭 " + sql);
+        }
+        //鎻掑叆鎿嶄綔鏃朵箣鍓嶇殑 娌℃湁鏁版嵁 鎵�浠� preValue 涓虹┖瀵硅薄
+        JSONArray preValues = new JSONArray();
+        JSONArray afterValues = new JSONArray();
+        JSONObject afterVaule = null;
+        String execSql = "select * from " + tmpTable + " " + tmpWhere;
+
+        queryServiceDAOImpl = ApplicationContextFactory.getBean("queryServiceDAOImpl", IQueryServiceDAO.class);
+        List<Map<String, Object>> deleteDatas = queryServiceDAOImpl.executeSql(execSql, null);
+
+        if (deleteDatas != null && deleteDatas.size() > 0) {
+            for (Map<String, Object> map : deleteDatas) {
+                preValues.add(map);
+                afterVaule = new JSONObject();
+                afterVaule.putAll(map);
+                afterVaule.putAll(tmpAfterMap);
+                afterValues.add(afterVaule);
+            }
+        }
+
+        JSONObject logText = new JSONObject();
+        logText.put("preValue", preValues);
+        logText.put("afterValue", afterValues);
+
+        OrderItemDto orderItemDto = new OrderItemDto();
+        orderItemDto.setbId("-1");
+        orderItemDto.setAction("MOD");
+        orderItemDto.setActionObj(tmpTable.trim());
+        orderItemDto.setLogText(logText.toJSONString());
+        orderItemDto.setServiceName(ApplicationContextFactory.getApplicationName());
+        orderItemDto.setoId(Java110TransactionalFactory.getOId());
+
+        String url = ServiceConstant.SERVICE_ORDER_URL + "/order/oIdApi/createOrderItem";
+        HttpHeaders httpHeaders = new HttpHeaders();
+        HttpEntity httpEntity = new HttpEntity(orderItemDto.toString(), httpHeaders);
+        ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class);
+
+        if (responseEntity.getStatusCode() != HttpStatus.OK) {
+            throw new IllegalArgumentException("娉ㄥ唽浜嬪姟鍥炴粴鏃ュ織澶辫触" + responseEntity);
+        }
     }
 
     /**
@@ -75,10 +193,53 @@
      * @param mappedStatement
      * @param parameter
      */
-    private void dealInsertSql(MappedStatement mappedStatement, Object parameter,String sql) {
-        String deleteSql = "delete from ";
+    private void dealInsertSql(MappedStatement mappedStatement, Object parameter, String sql) {
 
+        // RestTemplate restTemplate = ApplicationContextFactory.getBean("restTemplate", RestTemplate.class);
 
+        //鎻掑叆鎿嶄綔鏃朵箣鍓嶇殑 娌℃湁鏁版嵁 鎵�浠� preValue 涓虹┖瀵硅薄
+        JSONArray preValues = new JSONArray();
+
+        JSONArray afterValues = new JSONArray();
+        JSONObject afterValue = new JSONObject();
+        String tmpTable = sql.substring(sql.toLowerCase().indexOf("into") + 4, sql.indexOf("("));
+        String tmpKey = sql.substring(sql.indexOf("(") + 1, sql.indexOf(")"));
+        String tmpValue = sql.substring(sql.lastIndexOf("(") + 1, sql.lastIndexOf(")"));
+        String[] tmpKeys = tmpKey.split(",");
+        String[] tmpValues = tmpValue.split(",");
+
+        if (tmpKeys.length != tmpValues.length) {
+            throw new IllegalArgumentException("sql 閿欒 key 鍜寁alue 涓暟涓嶇瓑" + sql);
+        }
+
+        if (tmpKeys.length < 1) {
+            throw new IllegalArgumentException("sql 閿欒 鏈壘鍒発ey" + sql);
+        }
+        for (int keyIndex = 0; keyIndex < tmpKeys.length; keyIndex++) {
+            afterValue.put(tmpKeys[keyIndex], tmpValues[keyIndex]);
+        }
+        afterValues.add(afterValue);
+
+        JSONObject logText = new JSONObject();
+        logText.put("preValue", preValues);
+        logText.put("afterValue", afterValues);
+
+        OrderItemDto orderItemDto = new OrderItemDto();
+        orderItemDto.setbId("-1");
+        orderItemDto.setAction("ADD");
+        orderItemDto.setActionObj(tmpTable.trim());
+        orderItemDto.setLogText(logText.toJSONString());
+        orderItemDto.setServiceName(ApplicationContextFactory.getApplicationName());
+        orderItemDto.setoId(Java110TransactionalFactory.getOId());
+
+        String url = ServiceConstant.SERVICE_ORDER_URL + "/order/oIdApi/createOrderItem";
+        HttpHeaders httpHeaders = new HttpHeaders();
+        HttpEntity httpEntity = new HttpEntity(orderItemDto.toString(), httpHeaders);
+        ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class);
+
+        if (responseEntity.getStatusCode() != HttpStatus.OK) {
+            throw new IllegalArgumentException("娉ㄥ唽浜嬪姟鍥炴粴鏃ュ織澶辫触" + responseEntity);
+        }
 
     }
 
@@ -117,7 +278,7 @@
                 }
             }
         }
-        return sql;
+        return sql.toLowerCase();
     }
 
     private String getParameterValue(Object obj) {

--
Gitblit v1.8.0