Эх сурвалжийг харах

数据集:groovy执行java代码

Raod 3 жил өмнө
parent
commit
f09c737461

+ 7 - 0
report-core/pom.xml

@@ -151,6 +151,13 @@
             <artifactId>poi-ooxml-schemas</artifactId>
             <version>4.1.2</version>
         </dependency>
+
+        <dependency>
+            <groupId>org.codehaus.groovy</groupId>
+            <artifactId>groovy</artifactId>
+            <version>3.0.9</version>
+        </dependency>
+
     </dependencies>
 
     <developers>

+ 1 - 0
report-core/src/main/java/com/anjiplus/template/gaea/business/code/ResponseCode.java

@@ -131,6 +131,7 @@ public interface ResponseCode {
     String SET_CODE_ISEXIST = "4008";
     String SOURCE_CODE_ISEXIST = "4009";
     String CLASS_NOT_FOUND = "4010";
+    String EXECUTE_GROOVY_ERROR = "4011";
 
     String REPORT_SHARE_LINK_INVALID = "report.share.link.invalid";
 

+ 14 - 0
report-core/src/main/java/com/anjiplus/template/gaea/business/modules/datasettransform/service/IGroovyHandler.java

@@ -0,0 +1,14 @@
+package com.anjiplus.template.gaea.business.modules.datasettransform.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.List;
+
+/**
+ * @author: Raod
+ * @since: 2022-02-23
+ */
+public interface IGroovyHandler {
+
+    List<JSONObject> transform(List<JSONObject> data);
+}

+ 65 - 0
report-core/src/main/java/com/anjiplus/template/gaea/business/modules/datasettransform/service/impl/GroovyTransformServiceImpl.java

@@ -0,0 +1,65 @@
+package com.anjiplus.template.gaea.business.modules.datasettransform.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.anji.plus.gaea.exception.BusinessExceptionBuilder;
+import com.anjiplus.template.gaea.business.code.ResponseCode;
+import com.anjiplus.template.gaea.business.modules.datasettransform.controller.dto.DataSetTransformDto;
+import com.anjiplus.template.gaea.business.modules.datasettransform.service.IGroovyHandler;
+import com.anjiplus.template.gaea.business.modules.datasettransform.service.TransformStrategy;
+import groovy.lang.GroovyClassLoader;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.script.Invocable;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import java.util.List;
+
+/**
+ * Created by raodeming on 2021/3/23.
+ */
+@Component
+@Slf4j
+public class GroovyTransformServiceImpl implements TransformStrategy {
+
+    private GroovyClassLoader groovyClassLoader = new GroovyClassLoader();
+
+    /**
+     * 数据清洗转换 类型
+     *
+     * @return
+     */
+    @Override
+    public String type() {
+        return "javaBean";
+    }
+
+    /***
+     * 清洗转换算法接口
+     * @param def
+     * @param data
+     * @return
+     */
+    @Override
+    public List<JSONObject> transform(DataSetTransformDto def, List<JSONObject> data) {
+        String transformScript = def.getTransformScript();
+        Class<?> clazz = groovyClassLoader.parseClass(transformScript);
+        if (clazz != null) {
+            try {
+                Object instance = clazz.newInstance();
+                if (instance!=null) {
+                    if (instance instanceof IGroovyHandler) {
+                        IGroovyHandler handler = (IGroovyHandler) instance;
+                        return handler.transform(data);
+                    } else {
+                        System.err.println("转换失败!");
+                    }
+                }
+            } catch (Exception e) {
+                log.info("执行javaBean异常", e);
+                throw BusinessExceptionBuilder.build(ResponseCode.EXECUTE_GROOVY_ERROR, e.getMessage());
+            }
+        }
+        return data;
+    }
+}

+ 1 - 0
report-core/src/main/java/com/anjiplus/template/gaea/business/modules/datasettransform/service/impl/JsTransformServiceImpl.java

@@ -58,6 +58,7 @@ public class JsTransformServiceImpl implements TransformStrategy {
             }
 
         } catch (Exception ex) {
+            log.info("执行js异常", ex);
             throw BusinessExceptionBuilder.build(ResponseCode.EXECUTE_JS_ERROR, ex.getMessage());
         }
         return null;

+ 1 - 0
report-core/src/main/resources/db/migration/V1.0.15__update_javaBean.sql

@@ -0,0 +1 @@
+UPDATE `aj_report`.`gaea_dict_item` SET `dict_code` = 'TRANSFORM_TYPE', `item_name` = 'java脚本', `item_value` = 'javaBean', `item_extend` = NULL, `enabled` = 1, `locale` = 'zh', `remark` = NULL, `sort` = 2, `create_by` = 'admin', `create_time` = '2021-03-23 10:54:08', `update_by` = 'admin', `update_time` = '2021-03-23 10:54:08', `version` = 1 WHERE `id` = 151;

+ 1 - 0
report-core/src/main/resources/i18n/messages_en_US.properties

@@ -47,5 +47,6 @@ Component.load.check.error={0} Component not load
 4008=The set code does not allow duplication
 4009=The source code does not allow duplication
 4010=Can't auto find match driver class
+4011=execute javaBean error
 
 report.share.link.invalid=report share link invalid

+ 1 - 0
report-core/src/main/resources/i18n/messages_zh_CN.properties

@@ -48,6 +48,7 @@ Component.load.check.error={0}\u7EC4\u4EF6\u672A\u52A0\u8F7D
 4008=\u6570\u636E\u96C6\u7F16\u7801\u4E0D\u5141\u8BB8\u91CD\u590D
 4009=\u6570\u636E\u6E90\u7F16\u7801\u4E0D\u5141\u8BB8\u91CD\u590D
 4010=\u9A71\u52A8\u5305\u4E0D\u5B58\u5728
+4011=\u6267\u884CjavaBean\u5931\u8D25
 6001={0}
 
 7001=\u89E3\u6790\u5931\u8D25

+ 18 - 0
report-core/src/test/java/com/DemoGroovyHandler.java

@@ -0,0 +1,18 @@
+package com;
+
+import com.alibaba.fastjson.JSONObject;
+import com.anjiplus.template.gaea.business.modules.datasettransform.service.IGroovyHandler;
+
+import java.util.List;
+
+/**
+ * 建议在idea写好复制整个类到此处,位置report-core/src/test/java/com/DemoGroovyHandler.java
+ */
+public class DemoGroovyHandler implements IGroovyHandler {
+
+    @Override
+    public List<JSONObject> transform(List<JSONObject> data) {
+
+        return data;
+    }
+}

+ 58 - 0
report-core/src/test/java/com/GroovyTest.java

@@ -0,0 +1,58 @@
+package com;
+
+import com.alibaba.fastjson.JSONObject;
+import com.anjiplus.template.gaea.business.modules.datasettransform.service.IGroovyHandler;
+import groovy.lang.GroovyClassLoader;
+
+import java.util.List;
+
+/**
+ * @author: Raod
+ * @since: 2022-02-23
+ */
+public class GroovyTest {
+
+
+    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
+        // codeSource来自DemoGroovyHandler
+        String codeSource = "package com;\n" +
+                "\n" +
+                "import com.alibaba.fastjson.JSONObject;\n" +
+                "import com.anjiplus.template.gaea.business.modules.datasettransform.service.IGroovyHandler;\n" +
+                "\n" +
+                "import java.util.ArrayList;\n" +
+                "import java.util.List;\n" +
+                "\n" +
+                "/**\n" +
+                " * @author: Raod\n" +
+                " * @since: 2022-02-23\n" +
+                " */\n" +
+                "public class DemoGroovyHandler implements IGroovyHandler {\n" +
+                "\n" +
+                "    @Override\n" +
+                "    public List<JSONObject> transform(List<JSONObject> data) {\n" +
+                "        List<JSONObject> result = new ArrayList<>();\n" +
+                "        JSONObject jsonObject = new JSONObject();\n" +
+                "        jsonObject.put(\"test\", \"demo\");\n" +
+                "        result.add(jsonObject);\n" +
+                "        return result;\n" +
+                "    }\n" +
+                "}";
+        GroovyClassLoader groovyClassLoader = new GroovyClassLoader();
+        Class<?> clazz = groovyClassLoader.parseClass(codeSource);
+        if (clazz != null) {
+            Object instance = clazz.newInstance();
+            if (instance!=null) {
+                if (instance instanceof IGroovyHandler) {
+                    IGroovyHandler handler = (IGroovyHandler) instance;
+                    List<JSONObject> transform = handler.transform(null);
+                    System.out.println(JSONObject.toJSONString(transform));
+
+                } else {
+                    System.err.println("转换失败!");
+                }
+            }
+        }
+    }
+
+}

+ 27 - 21
report-ui/src/views/resultset/components/EditDataSet.vue

@@ -229,7 +229,8 @@
                             <el-button
                               v-if="
                                 item.transformType == 'js' ||
-                                  item.transformType == 'dict'
+                                  item.transformType == 'dict' ||
+                                  item.transformType == 'javaBean'
                               "
                               type="text"
                               class="editor"
@@ -251,7 +252,7 @@
                           min-height="400px"
                           append-to-body
                         >
-                          <div v-if="isItemFilterType.transformType == 'js'">
+                          <div v-if="isItemFilterType.transformType == 'js' || isItemFilterType.transformType == 'javaBean'">
                             <div class="codemirror">
                               <!-- //自定义高级规则? -->
                               <monaco-editor
@@ -750,25 +751,30 @@ export default {
           ? item.transformScript
           : fnCont;
       } else if (item.transformType == "dict") {
-        // this.dialogTitle = '字典翻译'
-        // this.itemFilterScriptId = item.itemFilterSort
-        // const { code, data } = await getDictList('TRANSFORM_TYPE')
-        // if (code != '200') return
-        // const extend = data.find(function (y) {
-        //   if (y.id == item.transformType) {
-        //     return y
-        //   }
-        // })
-        // const extendArry = []
-        // const extendObj = JSON.parse(extend.extend)
-        // for (const i in extendObj) {
-        //   const children = []
-        //   for (const y in extendObj[i]) {
-        //     children.push({ name: y, value: extendObj[i][y] })
-        //   }
-        //   extendArry.push({ name: i, children: children })
-        // }
-        // this.tableData2 = extendArry
+
+      }else if (item.transformType == "javaBean") {
+        this.itemFilterScriptId = item.itemFilterSort;
+        const fnCont = `package com;
+
+import com.alibaba.fastjson.JSONObject;
+import com.anjiplus.template.gaea.business.modules.datasettransform.service.IGroovyHandler;
+
+import java.util.List;
+
+/**
+ * 建议在idea写好复制整个类到此处,位置report-core/src/test/java/com/DemoGroovyHandler.java
+ */
+public class DemoGroovyHandler implements IGroovyHandler {
+
+    @Override
+    public List<JSONObject> transform(List<JSONObject> data) {
+
+        return data;
+    }
+}`;
+        this.transformScript = item.transformScript
+          ? item.transformScript
+          : fnCont;
       }
     },
     // js 脚本编辑确定