Sfoglia il codice sorgente

Merge branch 'master' of http://39.98.38.2:13000/dumingliang/sh-model-platform

Hua 3 mesi fa
parent
commit
a3ff47e57d
100 ha cambiato i file con 2149 aggiunte e 516 eliminazioni
  1. BIN
      plugins/gw-plugin-biz-3.8.8.jar
  2. 2 2
      pom.xml
  3. BIN
      ruoyi-admin/libs/gw-plugin-starter-3.8.8.jar
  4. BIN
      ruoyi-admin/libs/js-gw-plugin-common-3.8.8.jar
  5. 25 0
      ruoyi-admin/pom.xml
  6. 2 1
      ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
  7. 6 1
      ruoyi-admin/src/main/resources/application.yml
  8. 6 85
      ruoyi-api-patform/src/main/java/com/ruoyi/interfaces/service/impl/BizDataShowConfigServiceImpl.java
  9. 47 0
      ruoyi-api-patform/src/main/java/com/ruoyi/interfaces/snailJob/CleanDataJob.java
  10. 0 1
      ruoyi-common/pom.xml
  11. 94 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/api/BizDataApiRequest.java
  12. 32 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/deserializer/MapListDeserializer.java
  13. 7 7
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java
  14. 3 1
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BizDataApi.java
  15. 1 1
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BizDataApiParam.java
  16. 6 1
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java
  17. 17 0
      ruoyi-common/src/main/java/com/ruoyi/common/dataobject/DataTable.java
  18. 1 1
      ruoyi-common/src/main/java/com/ruoyi/common/mybatis/mapper/BaseMapperX.java
  19. 256 0
      ruoyi-common/src/main/java/com/ruoyi/common/transition/CleanTransition.java
  20. 267 0
      ruoyi-common/src/main/java/com/ruoyi/common/transition/FieldDerivationTransition.java
  21. 75 0
      ruoyi-common/src/main/java/com/ruoyi/common/transition/SortTransition.java
  22. 19 0
      ruoyi-common/src/main/java/com/ruoyi/common/transition/Transition.java
  23. 25 0
      ruoyi-common/src/main/java/com/ruoyi/common/transition/TransitionFactory.java
  24. 32 0
      ruoyi-common/src/main/java/com/ruoyi/common/transition/TransitionRegistry.java
  25. 47 48
      ruoyi-common/src/main/java/com/ruoyi/common/utils/kms/KmsWrapper.java
  26. 1 1
      ruoyi-model-dpp/src/main/java/com/ruoyi/model/att/dataobject/AttCleanRuleDO.java
  27. 2 0
      ruoyi-model-dpp/src/main/java/com/ruoyi/model/att/mapper/AttCleanRuleMapper.java
  28. 1 11
      ruoyi-model-dpp/src/main/java/com/ruoyi/model/att/service/impl/AttCleanRuleServiceImpl.java
  29. 1 0
      ruoyi-model-dpp/src/main/java/com/ruoyi/model/dpp/api/service/etl/DppEtlTaskService.java
  30. 3 0
      ruoyi-model-dpp/src/main/java/com/ruoyi/model/dpp/controller/etl/vo/DppEtlNewNodeSaveReqVO.java
  31. 5 1
      ruoyi-model-dpp/src/main/java/com/ruoyi/model/dpp/controller/etl/vo/DppEtlTaskPageReqVO.java
  32. 10 0
      ruoyi-model-dpp/src/main/java/com/ruoyi/model/dpp/controller/etl/vo/DppEtlTaskRespVO.java
  33. 6 0
      ruoyi-model-dpp/src/main/java/com/ruoyi/model/dpp/controller/etl/vo/DppEtlTaskSaveReqVO.java
  34. 80 25
      ruoyi-model-dpp/src/main/java/com/ruoyi/model/dpp/dal/dataobject/etl/DppEtlTaskDO.java
  35. 3 4
      ruoyi-model-dpp/src/main/java/com/ruoyi/model/etl/controller/DppEtlTaskController.java
  36. 35 26
      ruoyi-model-dpp/src/main/java/com/ruoyi/model/etl/mapper/DppEtlTaskMapper.java
  37. 3 5
      ruoyi-model-dpp/src/main/java/com/ruoyi/model/etl/service/impl/DppEtlNodeServiceImpl.java
  38. 7 9
      ruoyi-model-dpp/src/main/java/com/ruoyi/model/etl/service/impl/DppEtlSchedulerServiceImpl.java
  39. 5 6
      ruoyi-model-dpp/src/main/java/com/ruoyi/model/etl/service/impl/DppEtlTaskNodeRelServiceImpl.java
  40. 44 109
      ruoyi-model-dpp/src/main/java/com/ruoyi/model/etl/service/impl/DppEtlTaskServiceImpl.java
  41. 6 1
      ruoyi-model-dpp/src/main/resources/mapper/att/AttCleanRuleMapper.xml
  42. 242 169
      ruoyi-model-dpp/src/main/resources/mapper/etl/DppEtlTaskMapper.xml
  43. 4 0
      ruoyi-ui/package.json
  44. 280 0
      ruoyi-ui/src/api/dp/dataElem/dataElem.js
  45. 52 0
      ruoyi-ui/src/api/dp/document/document.js
  46. 10 0
      ruoyi-ui/src/api/dp/document/search.js
  47. 215 0
      ruoyi-ui/src/api/dp/model/model.js
  48. 0 0
      ruoyi-ui/src/assets/da/asset/api (1).svg
  49. 0 0
      ruoyi-ui/src/assets/da/asset/api (2).svg
  50. 0 0
      ruoyi-ui/src/assets/da/asset/api (3).svg
  51. 0 0
      ruoyi-ui/src/assets/da/asset/api (4).svg
  52. 1 0
      ruoyi-ui/src/assets/da/asset/api (5).svg
  53. 1 0
      ruoyi-ui/src/assets/da/asset/api (6).svg
  54. BIN
      ruoyi-ui/src/assets/da/asset/arrow.png
  55. 3 0
      ruoyi-ui/src/assets/da/asset/arrow.svg
  56. BIN
      ruoyi-ui/src/assets/da/asset/empty.png
  57. 6 0
      ruoyi-ui/src/assets/da/asset/file.svg
  58. 6 0
      ruoyi-ui/src/assets/da/asset/folder.svg
  59. 1 0
      ruoyi-ui/src/assets/da/asset/h2 (1).svg
  60. 1 0
      ruoyi-ui/src/assets/da/asset/h2 (2).svg
  61. 0 0
      ruoyi-ui/src/assets/da/asset/h2 (3).svg
  62. 1 0
      ruoyi-ui/src/assets/da/asset/h2 (4).svg
  63. BIN
      ruoyi-ui/src/assets/da/asset/icon (1).png
  64. BIN
      ruoyi-ui/src/assets/da/asset/icon (2).png
  65. BIN
      ruoyi-ui/src/assets/da/asset/icon (3).png
  66. BIN
      ruoyi-ui/src/assets/da/asset/icon (4).png
  67. BIN
      ruoyi-ui/src/assets/da/asset/icon (5).png
  68. BIN
      ruoyi-ui/src/assets/da/asset/icon (6).png
  69. BIN
      ruoyi-ui/src/assets/da/asset/icon (7).png
  70. BIN
      ruoyi-ui/src/assets/da/asset/icon (8).png
  71. BIN
      ruoyi-ui/src/assets/da/asset/icon (9).png
  72. 3 0
      ruoyi-ui/src/assets/da/asset2/btn (1).svg
  73. 11 0
      ruoyi-ui/src/assets/da/asset2/btn (2).svg
  74. 4 0
      ruoyi-ui/src/assets/da/asset2/btn (3).svg
  75. 6 0
      ruoyi-ui/src/assets/da/asset2/btn (4).svg
  76. 6 0
      ruoyi-ui/src/assets/da/asset2/fen (1).svg
  77. 10 0
      ruoyi-ui/src/assets/da/asset2/fen (2).svg
  78. 10 0
      ruoyi-ui/src/assets/da/asset2/fen (3).svg
  79. 8 0
      ruoyi-ui/src/assets/da/asset2/fen (4).svg
  80. 3 0
      ruoyi-ui/src/assets/da/asset2/tit.svg
  81. 8 0
      ruoyi-ui/src/assets/dpp/etl/bg.svg
  82. 9 0
      ruoyi-ui/src/assets/dpp/etl/cg.svg
  83. BIN
      ruoyi-ui/src/assets/dpp/etl/circle-check.png
  84. BIN
      ruoyi-ui/src/assets/dpp/etl/circle-close.png
  85. BIN
      ruoyi-ui/src/assets/dpp/etl/circle-subtract.png
  86. BIN
      ruoyi-ui/src/assets/dpp/etl/circle-subtract1.png
  87. 10 0
      ruoyi-ui/src/assets/dpp/etl/dd.svg
  88. 16 0
      ruoyi-ui/src/assets/dpp/etl/sb.svg
  89. 3 0
      ruoyi-ui/src/assets/dpp/etl/title (1).svg
  90. 6 0
      ruoyi-ui/src/assets/dpp/etl/title (2).svg
  91. 8 0
      ruoyi-ui/src/assets/dpp/etl/title (3).svg
  92. 3 0
      ruoyi-ui/src/assets/dpp/etl/title (4).svg
  93. 3 0
      ruoyi-ui/src/assets/dpp/etl/title-act (1).svg
  94. 6 0
      ruoyi-ui/src/assets/dpp/etl/title-act (2).svg
  95. 8 0
      ruoyi-ui/src/assets/dpp/etl/title-act (3).svg
  96. 3 0
      ruoyi-ui/src/assets/dpp/etl/title-act (4).svg
  97. BIN
      ruoyi-ui/src/assets/dpp/etl/toolbar (1).png
  98. BIN
      ruoyi-ui/src/assets/dpp/etl/toolbar (2).png
  99. BIN
      ruoyi-ui/src/assets/dpp/etl/toolbar (3).png
  100. BIN
      ruoyi-ui/src/assets/dpp/etl/toolbar (4).png

BIN
plugins/gw-plugin-biz-3.8.8.jar


+ 2 - 2
pom.xml

@@ -23,7 +23,7 @@
         <bitwalker.version>1.21</bitwalker.version>
         <swagger.version>3.0.0</swagger.version>
         <kaptcha.version>2.3.3</kaptcha.version>
-        <mybatis-plus.version>3.5.3.2</mybatis-plus.version>
+        <mybatis-plus.version>3.5.3</mybatis-plus.version>
         <mybatis-spring-boot.version>2.2.0</mybatis-spring-boot.version>
         <pagehelper.boot.version>1.4.7</pagehelper.boot.version>
         <fastjson.version>2.0.53</fastjson.version>
@@ -111,7 +111,7 @@
             <dependency>
                 <groupId>com.baomidou</groupId>
                 <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
-                <version>3.5.2</version>
+                <version>4.3.0</version>
             </dependency>
 
             <!-- pagehelper 分页插件 -->

BIN
ruoyi-admin/libs/gw-plugin-starter-3.8.8.jar


BIN
ruoyi-admin/libs/js-gw-plugin-common-3.8.8.jar


+ 25 - 0
ruoyi-admin/pom.xml

@@ -109,6 +109,31 @@
             <version>3.0.5</version>
         </dependency>
 
+<!--        <dependency>-->
+<!--            <groupId>com.ruoyi</groupId>-->
+<!--            <artifactId>gw-plugin-common</artifactId>-->
+<!--            <version>3.8.8</version>-->
+<!--            <systemPath>${project.basedir}/libs/js-gw-plugin-common-3.8.8.jar</systemPath>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>com.ruoyi</groupId>-->
+<!--            <artifactId>gw-plugin-starter</artifactId>-->
+<!--            <version>3.8.8</version>-->
+<!--            <systemPath>${project.basedir}/libs/gw-plugin-starter-3.8.8.jar</systemPath>-->
+<!--        </dependency>-->
+        <dependency>
+            <groupId>org.pf4j</groupId>
+            <artifactId>pf4j</artifactId>
+            <version>3.13.0</version>
+            <scope>compile</scope>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-log4j12</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 2 - 1
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java

@@ -5,6 +5,7 @@ import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * 启动程序
@@ -13,7 +14,7 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
  */
 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
 @EnableSnailJob
-
+@EnableScheduling
 @MapperScan("com.ruoyi.**.mapper")
 public class RuoYiApplication
 {

+ 6 - 1
ruoyi-admin/src/main/resources/application.yml

@@ -191,4 +191,9 @@ id.workerId: 1
 #数据中心ID(0~31)
 id.datacenterId: 1
 
-
+golden:
+  plugin:
+    mode: deployment
+    enabled: true
+    work-dir: D:/Workspaces/sh-model-platform/plugins
+    path: D:/Workspaces/sh-model-platform/plugins

+ 6 - 85
ruoyi-api-patform/src/main/java/com/ruoyi/interfaces/service/impl/BizDataShowConfigServiceImpl.java

@@ -1,21 +1,16 @@
 package com.ruoyi.interfaces.service.impl;
 
-import com.alibaba.fastjson2.JSONObject;
-import com.alibaba.fastjson2.JSONPath;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.api.BizDataApiRequest;
 import com.ruoyi.common.exception.CheckException;
-import com.ruoyi.common.utils.JsonUtils;
-import com.ruoyi.common.utils.OkHttpUtils;
-import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.uuid.IdUtils;
-import com.ruoyi.interfaces.domain.BizDataApi;
-import com.ruoyi.interfaces.domain.BizDataApiParam;
 import com.ruoyi.interfaces.domain.BizDataShowConfig;
 import com.ruoyi.interfaces.mapper.BizDataShowConfigMapper;
 import com.ruoyi.interfaces.service.BizDataShowConfigService;
 import org.springframework.stereotype.Service;
 
-import java.util.*;
+import java.util.Date;
+import java.util.Optional;
 
 @Service
 public class BizDataShowConfigServiceImpl extends ServiceImpl<BizDataShowConfigMapper, BizDataShowConfig> implements BizDataShowConfigService {
@@ -35,7 +30,7 @@ public class BizDataShowConfigServiceImpl extends ServiceImpl<BizDataShowConfigM
 
     @Override
     public boolean testApi(String apiConfig) {
-        Object result = requestByQueryOptions(apiConfig);
+        Object result = BizDataApiRequest.requestByQueryOptions(apiConfig);
         return result != null;
     }
 
@@ -43,86 +38,12 @@ public class BizDataShowConfigServiceImpl extends ServiceImpl<BizDataShowConfigM
     public Object getBizDataById(String id) {
         BizDataShowConfig bizDataShowConfig = this.getById(id);
         Optional.ofNullable(bizDataShowConfig).orElseThrow(() -> new CheckException("id.no"));
-        return requestByQueryOptions(bizDataShowConfig.getQueryOptions());
+        return BizDataApiRequest.requestByQueryOptions(bizDataShowConfig.getQueryOptions());
     }
 
     @Override
     public Object getBizDataByConfig(String config) {
-        return requestByQueryOptions(config);
-    }
-
-    private Object requestByQueryOptions(String queryOptions) {
-        BizDataApi apiConfigObj = JsonUtils.jsonToPojo(queryOptions, BizDataApi.class);
-        // 解析参数格式
-        Map<String, Object> params = parseKeyValueList(apiConfigObj.getParams());
-        Map<String, Object> cookies = parseKeyValueList(apiConfigObj.getCookies());
-        Map<String, Object> headers = parseKeyValueList(apiConfigObj.getHeaders());
-        String body = parseBody(apiConfigObj.getBody());
-        String responseResolution = apiConfigObj.getResponseResolution();
-
-        String responseString = OkHttpUtils.executeRequest(
-                apiConfigObj.getUrl(),
-                apiConfigObj.getMethod(),
-                params,
-                body,
-                cookies,
-                headers
-        );
-
-        JSONObject responseObj = JsonUtils.jsonToPojo(responseString, JSONObject.class);
-        Object result = responseObj;
-        if (StringUtils.isNotBlank(responseResolution)) {
-            result = JSONPath.eval(responseObj, responseResolution);
-        }
-        return result;
-    }
-
-    /**
-     * 将键值对数组解析为Map
-     */
-    private Map<String, Object> parseKeyValueList(List<BizDataApiParam> keyValueList) {
-        Map<String, Object> resultMap = new HashMap<>();
-        if (keyValueList == null) {
-            return resultMap;
-        }
-
-        for (BizDataApiParam item : keyValueList) {
-            String key = item.getKey();
-            Object value = item.getValue();
-            String type = item.getType();
-
-            // 根据类型处理值
-            if ("array".equals(type) && value instanceof List) {
-                resultMap.put(key, Collections.singletonList(value));
-            } else {
-                resultMap.put(key, value);
-            }
-        }
-        return resultMap;
-    }
-
-    /**
-     * 解析body字段
-     */
-    private String parseBody(List<BizDataApiParam> bodyArray) {
-        if (bodyArray == null) {
-            return null;
-        }
-
-        JSONObject bodyObj = new JSONObject();
-        bodyArray.forEach(item -> {
-            String key = item.getKey();
-            Object value = item.getValue();
-            String type = item.getType();
-
-            // 根据类型处理值
-            if ("array".equals(type) && value instanceof List) {
-                bodyObj.put(key, value);
-            } else {
-                bodyObj.put(key, value);
-            }
-        });
-        return bodyObj.toJSONString();
+        return BizDataApiRequest.requestByQueryOptions(config);
     }
 
 }

+ 47 - 0
ruoyi-api-patform/src/main/java/com/ruoyi/interfaces/snailJob/CleanDataJob.java

@@ -0,0 +1,47 @@
+package com.ruoyi.interfaces.snailJob;
+
+import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
+import com.aizuda.snailjob.client.job.core.dto.JobArgs;
+import com.aizuda.snailjob.model.dto.ExecuteResult;
+import com.alibaba.fastjson2.JSONObject;
+import com.ruoyi.common.core.api.BizDataApiRequest;
+import com.ruoyi.common.core.domain.BizDataApiParam;
+import com.ruoyi.common.dataobject.DataTable;
+import com.ruoyi.common.exception.CheckException;
+import com.ruoyi.common.transition.CleanTransition;
+import com.ruoyi.common.utils.JsonUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+@Component
+public class CleanDataJob {
+
+    public final static String PRO_CODE = "CLEAN_DATA";
+
+    @JobExecutor(name = "cleanDataJob")
+    public ExecuteResult cleanDataJob(JobArgs jobArgs) {
+        String paramsString = String.valueOf(jobArgs.getJobParams());
+        JSONObject configObject = JsonUtils.jsonToPojo(paramsString, JSONObject.class);
+
+        // 1. 获取数据
+        String queryOptions = Optional.ofNullable(configObject).map(a -> a.getString("queryOptions")).orElseThrow(() -> new CheckException("请检查数据源配置!"));
+        String ruleListString = Optional.ofNullable(configObject).map(a -> a.getString("ruleList")).orElseThrow(() -> new CheckException("请检查数据源配置!"));
+        List<Map<String, Object>> data = (List<Map<String, Object>>) BizDataApiRequest.requestByQueryOptions(queryOptions);
+        List<BizDataApiParam> columnList = BizDataApiRequest.getColumns(queryOptions);
+        Optional.ofNullable(columnList).orElseThrow(() -> new CheckException("请检查数据源配置!"));
+        List<String> columns = columnList.stream().map(BizDataApiParam::getKey).collect(Collectors.toList());
+        DataTable dataTable = new DataTable(columns, data);
+
+        List<Map> ruleList = JsonUtils.jsonToList(ruleListString, Map.class);
+        // 2. 清洗转换数据
+        CleanTransition cleanTransition = new CleanTransition();
+        com.alibaba.fastjson2.JSONObject parameter = new com.alibaba.fastjson2.JSONObject();
+        parameter.put("tableFields", ruleList);
+        cleanTransition.transition(dataTable, parameter);
+        return ExecuteResult.success("执行成功");
+    }
+}

+ 0 - 1
ruoyi-common/pom.xml

@@ -262,7 +262,6 @@
                 </dependency>
         -->
 
-
         <dependency>
             <groupId>dev.tinyflow</groupId>
             <artifactId>tinyflow-java-core</artifactId>

+ 94 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/api/BizDataApiRequest.java

@@ -0,0 +1,94 @@
+package com.ruoyi.common.core.api;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.alibaba.fastjson2.JSONPath;
+import com.ruoyi.common.core.domain.BizDataApi;
+import com.ruoyi.common.core.domain.BizDataApiParam;
+import com.ruoyi.common.utils.JsonUtils;
+import com.ruoyi.common.utils.OkHttpUtils;
+import com.ruoyi.common.utils.StringUtils;
+
+import java.util.*;
+
+public class BizDataApiRequest {
+
+    public static Object requestByQueryOptions(String queryOptions) {
+        BizDataApi apiConfigObj = JsonUtils.jsonToPojo(queryOptions, BizDataApi.class);
+        // 解析参数格式
+        Map<String, Object> params = parseKeyValueList(apiConfigObj.getParams());
+        Map<String, Object> cookies = parseKeyValueList(apiConfigObj.getCookies());
+        Map<String, Object> headers = parseKeyValueList(apiConfigObj.getHeaders());
+        String body = parseBody(apiConfigObj.getBody());
+        String responseResolution = apiConfigObj.getResponseResolution();
+
+        String responseString = OkHttpUtils.executeRequest(
+                apiConfigObj.getUrl(),
+                apiConfigObj.getMethod(),
+                params,
+                body,
+                cookies,
+                headers
+        );
+
+        JSONObject responseObj = JsonUtils.jsonToPojo(responseString, JSONObject.class);
+        Object result = responseObj;
+        if (StringUtils.isNotBlank(responseResolution)) {
+            result = JSONPath.eval(responseObj, responseResolution);
+        }
+        return result;
+    }
+
+    /**
+     * 将键值对数组解析为Map
+     */
+    private static Map<String, Object> parseKeyValueList(List<BizDataApiParam> keyValueList) {
+        Map<String, Object> resultMap = new HashMap<>();
+        if (keyValueList == null) {
+            return resultMap;
+        }
+
+        for (BizDataApiParam item : keyValueList) {
+            String key = item.getKey();
+            Object value = item.getValue();
+            String type = item.getType();
+
+            // 根据类型处理值
+            if ("array".equals(type) && value instanceof List) {
+                resultMap.put(key, Collections.singletonList(value));
+            } else {
+                resultMap.put(key, value);
+            }
+        }
+        return resultMap;
+    }
+
+    /**
+     * 解析body字段
+     */
+    private static String parseBody(List<BizDataApiParam> bodyArray) {
+        if (bodyArray == null) {
+            return null;
+        }
+
+        JSONObject bodyObj = new JSONObject();
+        bodyArray.forEach(item -> {
+            String key = item.getKey();
+            Object value = item.getValue();
+            String type = item.getType();
+
+            // 根据类型处理值
+            if ("array".equals(type) && value instanceof List) {
+                bodyObj.put(key, value);
+            } else {
+                bodyObj.put(key, value);
+            }
+        });
+        return bodyObj.toJSONString();
+    }
+
+    public static List<BizDataApiParam> getColumns(String queryOptions) {
+        BizDataApi apiConfigObj = JsonUtils.jsonToPojo(queryOptions, BizDataApi.class);
+        return Optional.ofNullable(apiConfigObj).map(BizDataApi::getResponse).orElse(null);
+    }
+
+}

+ 32 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/deserializer/MapListDeserializer.java

@@ -0,0 +1,32 @@
+package com.ruoyi.common.core.deserializer;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+public class MapListDeserializer extends JsonDeserializer<List<Map<String, Object>>> {
+
+    @Override
+    public List<Map<String, Object>> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
+        ObjectMapper mapper = (ObjectMapper) p.getCodec();
+        String value = p.getValueAsString();
+
+        if (value == null || value.isEmpty()) {
+            return null;
+        }
+
+        // 如果是字符串,则尝试解析为 List<Map<String, Object>>
+        if (value.startsWith("[")) {
+            return mapper.readValue(value,
+                    mapper.getTypeFactory().constructCollectionType(List.class, Map.class));
+        }
+
+        return null;
+    }
+
+}

+ 7 - 7
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java

@@ -1,10 +1,5 @@
 package com.ruoyi.common.core.domain;
 
-import java.io.Serializable;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -12,6 +7,11 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import io.swagger.v3.oas.annotations.media.Schema;
 
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * Entity基类
  * 
@@ -33,7 +33,7 @@ public class BaseEntity implements Serializable
     private Long creatorId;
 
     /** 创建时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
 
     /** 更新者 */
@@ -46,7 +46,7 @@ public class BaseEntity implements Serializable
 
 
     /** 更新时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date updateTime;
 
     /** 备注 */

+ 3 - 1
ruoyi-api-patform/src/main/java/com/ruoyi/interfaces/domain/BizDataApi.java → ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BizDataApi.java

@@ -1,4 +1,4 @@
-package com.ruoyi.interfaces.domain;
+package com.ruoyi.common.core.domain;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import lombok.Data;
@@ -23,4 +23,6 @@ public class BizDataApi {
 
     private String responseResolution;
 
+    private List<BizDataApiParam> response;
+
 }

+ 1 - 1
ruoyi-api-patform/src/main/java/com/ruoyi/interfaces/domain/BizDataApiParam.java → ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BizDataApiParam.java

@@ -1,4 +1,4 @@
-package com.ruoyi.interfaces.domain;
+package com.ruoyi.common.core.domain;
 
 import lombok.Data;
 import lombok.NoArgsConstructor;

+ 6 - 1
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java

@@ -1,8 +1,9 @@
 package com.ruoyi.common.core.domain;
 
-import java.io.Serializable;
 import com.ruoyi.common.constant.HttpStatus;
 
+import java.io.Serializable;
+
 /**
  * 响应信息主体
  *
@@ -112,4 +113,8 @@ public class R<T> implements Serializable
     {
         return R.SUCCESS == ret.getCode();
     }
+
+    public static <T> R<T> ok(String msg) {
+        return restResult(null, SUCCESS, msg);
+    }
 }

+ 17 - 0
ruoyi-common/src/main/java/com/ruoyi/common/dataobject/DataTable.java

@@ -0,0 +1,17 @@
+package com.ruoyi.common.dataobject;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+import java.util.Map;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class DataTable {
+    private List<String> columnNames;
+    private List<Map<String, Object>> rows;
+}
+

+ 1 - 1
ruoyi-common/src/main/java/com/ruoyi/common/mybatis/mapper/BaseMapperX.java

@@ -31,7 +31,7 @@ import java.util.Objects;
  * 1. {@link BaseMapper} 为 MyBatis Plus 的基础接口,提供基础的 CRUD 能力
  * 2. {@link MPJBaseMapper} 为 MyBatis Plus Join 的基础接口,提供连表 Join 能力
  */
-public interface BaseMapperX<T> extends MPJBaseMapper<T> {
+public interface BaseMapperX<T> extends BaseMapper<T>, MPJBaseMapper<T> {
 
     default PageResult<T> selectPage(SortablePageParam pageParam, @Param("ew") Wrapper<T> queryWrapper) {
         return selectPage(pageParam, pageParam.getSortingFields(), queryWrapper);

+ 256 - 0
ruoyi-common/src/main/java/com/ruoyi/common/transition/CleanTransition.java

@@ -0,0 +1,256 @@
+package com.ruoyi.common.transition;
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.ruoyi.common.dataobject.DataTable;
+import com.ruoyi.common.enums.TaskComponentTypeEnum;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.alibaba.fastjson2.JSONWriter.Feature.PrettyFormat;
+
+@Slf4j
+public class CleanTransition implements Transition {
+
+    @Override
+    public DataTable transition(DataTable dataset, JSONObject parameter) {
+        log.info("*********************************  Initialize task context  ***********************************");
+        log.info("开始清洗节点");
+        log.info("开始任务时间: " + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
+        log.info("任务参数:" + parameter.toJSONString(PrettyFormat));
+
+        List<Map<String, Object>> tableFieldList = (List<Map<String, Object>>) parameter.get("tableFields");
+
+        if (tableFieldList == null || tableFieldList.isEmpty()) {
+            log.info("未配置任何规则,直接返回数据集。");
+            return dataset;
+        }
+
+        for (Map<String, Object> rule : tableFieldList) {
+            String ruleCode = MapUtils.getString(rule, "ruleCode");
+            String ruleType = MapUtils.getString(rule, "ruleType");
+            JSONObject ruleConfig = JSONObject.parseObject((String) rule.get("ruleConfig"));
+
+            if (!checkColumnsExist(dataset, ruleConfig)) {
+                log.warn(String.format("跳过规则 %s(字段不存在)", ruleCode));
+                continue;
+            }
+
+            switch (ruleType) {
+                case "WITHIN_BOUNDARY":
+                    dataset = applyNumericBoundary(dataset, ruleConfig);
+                    break;
+                case "REMOVE_EMPTY_COMBINATION":
+                    dataset = applyDeleteIfAllNull(dataset, ruleConfig);
+                    break;
+                case "ADD_PREFIX_SUFFIX":
+                    dataset = applyPrefixSuffix(dataset, ruleConfig);
+                    break;
+                case "MENU_CUSTOM":
+                    dataset = normalizeEnumMapping(dataset, ruleConfig);
+                    break;
+                case "KEEP_LATEST_OR_FIRST":
+                    dataset = deduplicateByFieldsKeepFirst(dataset, ruleConfig);
+                    break;
+                default:
+                    log.warn("未知规则:" + ruleCode);
+            }
+        }
+        return dataset;
+    }
+
+    @Override
+    public String code() {
+        return TaskComponentTypeEnum.SPARK_CLEAN.getCode();
+    }
+
+    private DataTable deduplicateByFieldsKeepFirst(DataTable dataTable, JSONObject cfg) {
+        List<String> allCols = Optional.ofNullable(cfg.getJSONArray("columns"))
+                .map(a -> a.toJavaList(String.class))
+                .orElse(Collections.emptyList());
+
+        if (allCols.isEmpty()) {
+            throw new IllegalArgumentException("规则029配置缺失:columns 不能为空");
+        }
+
+        // 简化实现,仅保留基于字段值去重的逻辑
+        Set<String> uniqueKeys = new HashSet<>();
+        List<Map<String, Object>> uniqueRows = new ArrayList<>();
+
+        for (Map<String, Object> row : dataTable.getRows()) {
+            StringBuilder keyBuilder = new StringBuilder();
+            for (String col : allCols) {
+                keyBuilder.append(row.get(col)).append("|");
+            }
+            String key = keyBuilder.toString();
+
+            if (!uniqueKeys.contains(key)) {
+                uniqueKeys.add(key);
+                uniqueRows.add(new HashMap<>(row));
+            }
+        }
+
+        return new DataTable(dataTable.getColumnNames(), uniqueRows);
+    }
+
+    private DataTable normalizeEnumMapping(DataTable dataTable, JSONObject cfg) {
+        String col = cfg.getJSONArray("columns").getString(0);
+        List<JSONObject> list = cfg.getList("stringValue", JSONObject.class);
+
+        if (StringUtils.isBlank(col) || list == null || list.size() < 1) {
+            throw new IllegalArgumentException("规则024配置缺失:columns/stringValue 不能为空");
+        }
+
+        Map<String, String> mapping = new HashMap<>();
+        for (JSONObject dict : list) {
+            mapping.put(dict.getString("value"), dict.getString("name"));
+        }
+
+        List<Map<String, Object>> newRows = new ArrayList<>();
+        for (Map<String, Object> row : dataTable.getRows()) {
+            Map<String, Object> newRow = new HashMap<>(row);
+            Object value = row.get(col);
+            if (value != null && mapping.containsKey(value.toString())) {
+                newRow.put(col, mapping.get(value.toString()));
+            }
+            newRows.add(newRow);
+        }
+
+        return new DataTable(dataTable.getColumnNames(), newRows);
+    }
+
+    private DataTable applyPrefixSuffix(DataTable dataTable, JSONObject cfg) {
+        String colName = cfg.getJSONArray("columns").getString(0);
+        String stringValue = cfg.getString("stringValue");
+        String handleType = cfg.getString("handleType");
+
+        if (StringUtils.isBlank(colName) || StringUtils.isBlank(stringValue) || StringUtils.isBlank(handleType)) {
+            throw new IllegalArgumentException("规则107配置缺失:columns/stringValue/handleType 不能为空");
+        }
+
+        if (!("1".equals(handleType) || "2".equals(handleType) || "3".equals(handleType) || "4".equals(handleType))) {
+            throw new IllegalArgumentException("规则107 handleType 非法:" + handleType);
+        }
+
+        List<Map<String, Object>> newRows = new ArrayList<>();
+        for (Map<String, Object> row : dataTable.getRows()) {
+            Map<String, Object> newRow = new HashMap<>(row);
+            Object value = row.get(colName);
+
+            if (value != null) {
+                String strValue = value.toString();
+                switch (handleType) {
+                    case "1": // 加前缀
+                        if (!strValue.startsWith(stringValue)) {
+                            newRow.put(colName, stringValue + strValue);
+                        }
+                        break;
+                    case "2": // 加后缀
+                        if (!strValue.endsWith(stringValue)) {
+                            newRow.put(colName, strValue + stringValue);
+                        }
+                        break;
+                    case "3": // 去除匹配上的前缀
+                        if (strValue.startsWith(stringValue)) {
+                            newRow.put(colName, strValue.substring(stringValue.length()));
+                        }
+                        break;
+                    case "4": // 去除匹配上的后缀
+                        if (strValue.endsWith(stringValue)) {
+                            newRow.put(colName, strValue.substring(0, strValue.length() - stringValue.length()));
+                        }
+                        break;
+                }
+            }
+            newRows.add(newRow);
+        }
+
+        return new DataTable(dataTable.getColumnNames(), newRows);
+    }
+
+    private boolean checkColumnsExist(DataTable dataTable, JSONObject ruleConfig) {
+        List<String> allColumns = dataTable.getColumnNames();
+        List<String> targetCols = new ArrayList<>();
+
+        if (ruleConfig.containsKey("columns")) {
+            targetCols.addAll(ruleConfig.getJSONArray("columns").toJavaList(String.class));
+        } else if (ruleConfig.containsKey("columnName")) {
+            targetCols.add(ruleConfig.getString("columnName"));
+        }
+
+        return allColumns.containsAll(targetCols);
+    }
+
+    private DataTable applyNumericBoundary(DataTable dataTable, JSONObject cfg) {
+        String col = cfg.getJSONArray("columns").getString(0);
+        double min = cfg.getDoubleValue("min");
+        double max = cfg.getDoubleValue("max");
+        int handleType = cfg.getIntValue("handleType");
+
+        List<Map<String, Object>> newRows = new ArrayList<>();
+        for (Map<String, Object> row : dataTable.getRows()) {
+            Map<String, Object> newRow = new HashMap<>(row);
+            Object value = row.get(col);
+            double numValue = Double.parseDouble(value.toString());
+            switch (handleType) {
+                case 1: // 超出边界设为边界值
+                    if (numValue < min) {
+                        newRow.put(col, min);
+                    } else if (numValue > max) {
+                        newRow.put(col, max);
+                    }
+                    break;
+                case 2: // 超出边界设为最小值
+                    if (numValue < min || numValue > max) {
+                        newRow.put(col, min);
+                    }
+                    break;
+                case 3: // 超出边界设为最大值
+                    if (numValue < min || numValue > max) {
+                        newRow.put(col, max);
+                    }
+                    break;
+            }
+            newRows.add(newRow);
+        }
+
+        return new DataTable(dataTable.getColumnNames(), newRows);
+    }
+
+    private DataTable applyDeleteIfAllNull(DataTable dataTable, JSONObject cfg) {
+        List<String> cols = cfg.getJSONArray("columns").toJavaList(String.class);
+        if (cols == null || cols.isEmpty()) return dataTable;
+
+        List<String> missing = cols.stream()
+                .filter(c -> !dataTable.getColumnNames().contains(c))
+                .collect(Collectors.toList());
+
+        if (!missing.isEmpty()) {
+            throw new IllegalArgumentException("组合判空配置包含不存在的列:" + missing);
+        }
+
+        List<Map<String, Object>> filteredRows = new ArrayList<>();
+        for (Map<String, Object> row : dataTable.getRows()) {
+            boolean allNull = true;
+            for (String col : cols) {
+                Object value = row.get(col);
+                if (value != null && !"".equals(value.toString().trim())) {
+                    if (!(value instanceof Double && ((Double) value).isNaN()) &&
+                            !(value instanceof Float && ((Float) value).isNaN())) {
+                        allNull = false;
+                        break;
+                    }
+                }
+            }
+            if (!allNull) {
+                filteredRows.add(row);
+            }
+        }
+
+        return new DataTable(dataTable.getColumnNames(), filteredRows);
+    }
+}

+ 267 - 0
ruoyi-common/src/main/java/com/ruoyi/common/transition/FieldDerivationTransition.java

@@ -0,0 +1,267 @@
+package com.ruoyi.common.transition;//package com.ruoyi.model.etl.transition;
+//
+//import cn.hutool.core.date.DateUtil;
+//import com.alibaba.fastjson2.JSONObject;
+//import org.apache.commons.collections4.CollectionUtils;
+//import org.apache.commons.collections4.MapUtils;
+//import org.apache.spark.sql.*;
+//import tech.qiantong.qdata.common.enums.TaskComponentTypeEnum;
+//import tech.qiantong.qdata.common.enums.etl.transition.FieldDerivationTypeEnum;
+//import tech.qiantong.qdata.common.utils.StringUtils;
+//import tech.qiantong.qdata.spark.etl.utils.LogUtils;
+//
+//import java.util.Date;
+//import java.util.List;
+//import java.util.Map;
+//import java.util.Objects;
+//import java.util.stream.Collectors;
+//
+//import static com.alibaba.fastjson2.JSONWriter.Feature.PrettyFormat;
+//
+///**
+// * 字段派生器
+// */
+//public class FieldDerivationTransition implements Transition {
+//
+//    @Override
+//    public String code() {
+//        return TaskComponentTypeEnum.FIELD_DERIVATION.getCode();
+//    }
+//
+//    /**
+//     *
+//     * @param spark
+//     * @param dataset
+//     * @param transition
+//     * @param logPath
+//     * @return
+//     */
+//    @Override
+//    public Dataset<Row> transition(SparkSession spark, Dataset<Row> dataset, JSONObject transition, LogUtils.Params logPath) {
+//        LogUtils.writeLog(logPath, "*********************************  Initialize task context  ***********************************");
+//        LogUtils.writeLog(logPath, "开始字段派生器节点");
+//        LogUtils.writeLog(logPath, "开始任务时间: " + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
+//        LogUtils.writeLog(logPath, "任务参数:" + transition.toJSONString(PrettyFormat));
+//        JSONObject parameter = transition.getJSONObject("parameter");
+//
+//        //字段派生类型
+//        String fieldDerivationType = MapUtils.getString(parameter,"fieldDerivationType");
+//
+//        // 校验
+//        if (StringUtils.isEmpty(fieldDerivationType)) {
+//            throw new IllegalArgumentException("字段派生类型不能为空!");
+//        }
+//
+//        FieldDerivationTypeEnum typeEnum = FieldDerivationTypeEnum.fromCode(fieldDerivationType);
+//
+//        switch (typeEnum) {
+//            case FIELD_DERIVE_CONCAT:
+//                // 拼接处理逻辑
+//                return handleConcat(parameter,dataset,logPath);
+//            case FIELD_DERIVE_SUBSTRING:
+//                // 截取处理逻辑
+//                return handleSubstring(parameter,dataset,logPath);
+//            case FIELD_DERIVE_REPLACE:
+//                // 替换处理逻辑
+//                return handleReplace();
+//            case FIELD_DERIVE_EXPRESSION:
+//                // 表达式处理逻辑
+//                return handleExpression();
+//            case FIELD_DERIVE_HASH:
+//                // 哈希处理逻辑
+//                return handleHash();
+//            case FIELD_DERIVE_REGEX:
+//                // 正则提取处理逻辑
+//                return handleRegex();
+//            case FIELD_DERIVE_CONSTANT:
+//                // 常量赋值处理逻辑
+//                return handleConstant();
+//            default:
+//                throw new IllegalArgumentException("未知的字段派生类型: " + fieldDerivationType);
+//        }
+//    }
+//
+//    private Dataset<Row> handleConstant() {
+//        return null;
+//    }
+//
+//    private Dataset<Row> handleRegex() {
+//        return null;
+//    }
+//
+//    private Dataset<Row> handleHash() {
+//        return null;
+//    }
+//
+//    private Dataset<Row> handleExpression() {
+//        return null;
+//    }
+//
+//    private Dataset<Row> handleReplace() {
+//        return null;
+//    }
+//
+//    /**
+//     *
+//     * {
+//     *   "fieldDerivationType": "FIELD_DERIVE_SUBSTRING",
+//     *   "fieldDerivationName": "phone_suffix",
+//     *   "direction": "FROM_END",                // FROM_START | FROM_END
+//     *   "startIndex": 4,
+//     *   "endIndex": 8,                          // 可选,endIndex 不填表示截取到末尾
+//     *   "tableFields": [
+//     *     { "columnName": "phone" }
+//     *   ]
+//     * }
+//     * @return
+//     */
+//    private Dataset<Row> handleSubstring(JSONObject parameter, Dataset<Row> dataset, LogUtils.Params logParams) {
+//        LogUtils.writeLog(logParams, "开始字段派生-截取处理");
+//        LogUtils.writeLog(logParams, "开始任务时间: " + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
+//
+//        //规则配置的合并后存储的字段名字存入
+//        String fieldDerivationName = MapUtils.getString(parameter,"fieldDerivationName");
+//        //截取标识符:  1 从前开始  |  2 从后开始
+//        String direction = MapUtils.getString(parameter,"direction");
+//
+//        //前缀符号
+//        Integer startIndex = MapUtils.getInteger(parameter,"startIndex",null);
+//        Integer endIndex = MapUtils.getInteger(parameter,"endIndex",null);
+//
+//        //选择的字段---只存储了一个,可以直接区 0下标
+//        List<Map<String, Object>> tableFields = (List<Map<String, Object>>) MapUtils.getObject(parameter, "tableFields");
+//
+//        //检验
+//        if (CollectionUtils.isEmpty(tableFields)) {
+//            throw new IllegalArgumentException("进行计算的字段不能为空!");
+//        }
+//        if (StringUtils.isEmpty(fieldDerivationName)) {
+//            throw new IllegalArgumentException("需要存储的字段名称不能为空!");
+//        }
+//        if (StringUtils.isEmpty(direction)) {
+//            throw new IllegalArgumentException("需要截取的类型不能为空!");
+//        }
+//        if (startIndex == null) {
+//            throw new IllegalArgumentException("需要截取的类型不能为空!");
+//        }
+//
+//        String columnName = MapUtils.getString(tableFields.get(0), "columnName");
+//        if (StringUtils.isEmpty(columnName)) {
+//            throw new IllegalArgumentException("需要截取的字段名不能为空!");
+//        }
+//
+//        Column sourceCol = functions.col(columnName).cast("string");
+//
+//        Column derivedCol;
+//
+//        if ("1".equalsIgnoreCase(direction)) {
+//            // 从前开始: substring(col, start, length)
+//            if (endIndex != null) {
+//                int length = endIndex - startIndex;
+//                if (length < 0) {
+//                    throw new IllegalArgumentException("endIndex 必须大于 startIndex");
+//                }
+//                derivedCol = functions.expr("substring(" + columnName + ", " + (startIndex + 1) + ", " + length + ")");
+//            } else {
+//                // 到结尾:length 无穷大
+//                derivedCol = functions.expr("substring(" + columnName + ", " + (startIndex + 1) + ")");
+//            }
+//        } else if ("2".equalsIgnoreCase(direction)) {
+//            // 从后开始:先计算字符串长度减去 startIndex,然后截取 length
+//            // 例:substr(phone, length(phone) - startIndex + 1, length)
+//            Column lengthCol = functions.length(sourceCol);
+//            Column startPos = lengthCol.minus(startIndex).plus(1);
+//
+//            if (endIndex != null) {
+//                int length = endIndex - startIndex;
+//                if (length < 0) {
+//                    throw new IllegalArgumentException("endIndex 必须大于 startIndex");
+//                }
+//                derivedCol = functions.expr("substring(" + columnName + ", length(" + columnName + ") - " + startIndex + " + 1, " + length + ")");
+//            } else {
+//                derivedCol = functions.expr("substring(" + columnName + ", length(" + columnName + ") - " + startIndex + " + 1)");
+//            }
+//        } else {
+//            throw new IllegalArgumentException("不支持的方向类型:" + direction);
+//        }
+//
+//        Dataset<Row> result = dataset.withColumn(fieldDerivationName, derivedCol);
+//
+//        // 打印结果以便调试
+//        result.printSchema();
+//        result.show(10, false);
+//
+//        return result;
+//    }
+//
+//    /**
+//     * 拼接处理逻辑
+//     * {
+//     * "fieldDerivationType":"传递的字段名字"
+//     *   ,"fieldDerivationName":"规则配置的合并后存储的字段名字存入"
+//     *   ,"delimiter":"连接符"
+//     *   ,"tableFields":[
+//     *     {"columnName":"进行拼接的字段名称"}
+//     *   ]
+//     *   ,"fieldDerivationPrefix":"前缀符"
+//     *   ,"fieldDerivationSuffix":"后缀符"
+//     * }
+//     * @return
+//     */
+//    private Dataset<Row> handleConcat(JSONObject parameter, Dataset<Row> dataset, LogUtils.Params logPath) {
+//        LogUtils.writeLog(logPath, "开始字段派生-拼接处理");
+//        LogUtils.writeLog(logPath, "开始任务时间: " + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
+//
+//        //规则配置的合并后存储的字段名字存入
+//        String fieldDerivationName = MapUtils.getString(parameter,"fieldDerivationName");
+//        //链接符
+//        String delimiter = MapUtils.getString(parameter,"delimiter","");
+//        //前缀符号
+//        String prefix = MapUtils.getString(parameter,"fieldDerivationPrefix","");
+//        //后缀符号
+//        String suffix = MapUtils.getString(parameter,"fieldDerivationSuffix","");
+//        //选择的字段
+//        List<Map<String, Object>> tableFields = (List<Map<String, Object>>) MapUtils.getObject(parameter, "tableFields");
+//
+//        //检验
+//        if (CollectionUtils.isEmpty(tableFields)) {
+//            throw new IllegalArgumentException("进行计算的字段不能为空!");
+//        }
+//        if (StringUtils.isEmpty(fieldDerivationName)) {
+//            throw new IllegalArgumentException("需要存储的字段名称不能为空!");
+//        }
+//
+//        // 构造字段列表,转换为字符串,并用 "null" 占位
+//        List<Column> columns = tableFields.stream()
+//                .map(field -> {
+//                    String colName = MapUtils.getString(field, "columnName");
+//                    return StringUtils.isNotEmpty(colName)
+//                            ? functions.coalesce(functions.col(colName).cast("string"), functions.lit("null"))
+//                            : null;
+//                })
+//                .filter(Objects::nonNull)
+//                .collect(Collectors.toList());
+//
+//        if (columns.isEmpty()) {
+//            throw new IllegalArgumentException("未获取到任何有效字段用于拼接!");
+//        }
+//
+//        // 用 delimiter 拼接字段值
+//        Column concatCol = functions.concat_ws(delimiter, columns.toArray(new Column[0]));
+//
+//        // 添加前缀和后缀
+//        concatCol = functions.concat_ws("", functions.lit(prefix), concatCol, functions.lit(suffix));
+//
+//        // 添加派生字段列
+//        Dataset<Row> rowDataset = dataset.withColumn(fieldDerivationName, concatCol);
+//
+//        // 调试日志
+//        System.out.println("拼接后的字段结构:");
+//        rowDataset.printSchema();
+//
+//        System.out.println("拼接后的前10条数据:");
+//        rowDataset.show(10, false);
+//
+//        return rowDataset;
+//    }
+//}

+ 75 - 0
ruoyi-common/src/main/java/com/ruoyi/common/transition/SortTransition.java

@@ -0,0 +1,75 @@
+package com.ruoyi.common.transition;//package com.ruoyi.model.etl.transition;
+//
+//import com.alibaba.fastjson2.JSONArray;
+//import com.alibaba.fastjson2.JSONObject;
+//import com.ruoyi.common.enums.TaskComponentTypeEnum;
+//
+//import java.util.ArrayList;
+//import java.util.List;
+//
+///**
+// * 排序转换器(类似Kettle的排序记录)
+// *
+// * @author
+// * @date 2025/06/20
+// **/
+//public class SortTransition implements Transition {
+//
+//    /**
+//     * {
+//     * "tableFields": [
+//     * {"columnName": "age", "order": "asc"},
+//     * {"columnName": "name", "order": "desc"}
+//     * ]
+//     * }
+//     *
+//     * @param dataset
+//     * @param transition
+//     * @return
+//     */
+//    @Override
+//    public Dataset<Row> transition(Dataset<Row> dataset, JSONObject transition) {
+//        JSONObject parameter = transition.getJSONObject("parameter");
+//
+//        // 1. 解析排序字段
+//        JSONArray sortFields = parameter.getJSONArray("tableFields");
+//        if (sortFields == null || sortFields.isEmpty()) {
+//            // 没有排序字段,直接返回原数据
+//            return dataset;
+//        }
+//
+//        List<Column> orderColumns = new ArrayList<>();
+//        for (int i = 0; i < sortFields.size(); i++) {
+//            JSONObject sortField = sortFields.getJSONObject(i);
+//            String field = sortField.getString("columnName");
+//            String order = sortField.getString("order");
+//            boolean caseSensitive = sortField.containsKey("caseSensitive") ? sortField.getBoolean("caseSensitive") : false;
+//
+//            Column sortCol;
+//            if (!caseSensitive) {
+//                sortCol = functions.lower(col(field));
+//            } else {
+//                sortCol = col(field);
+//            }
+//
+//            if ("desc".equalsIgnoreCase(order)) {
+//                orderColumns.add(sortCol.desc());
+//            } else {
+//                orderColumns.add(sortCol.asc());
+//            }
+//        }
+//
+//        // 2. 排序
+//        // 排序前
+//        dataset.show(false);
+//        Dataset<Row> sorted = dataset.sort(orderColumns.toArray(new Column[0]));
+//        // 排序后
+//        sorted.show(false);
+//        return sorted;
+//    }
+//
+//    @Override
+//    public String code() {
+//        return TaskComponentTypeEnum.SORT_RECORD.getCode();
+//    }
+//}

+ 19 - 0
ruoyi-common/src/main/java/com/ruoyi/common/transition/Transition.java

@@ -0,0 +1,19 @@
+package com.ruoyi.common.transition;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.ruoyi.common.dataobject.DataTable;
+
+/**
+ * <P>
+ * 用途:转换器接口
+ * </p>
+ *
+ * @author: FXB
+ * @create: 2025-06-20 09:04
+ **/
+public interface Transition {
+
+    DataTable transition(DataTable dataset, JSONObject transition);
+
+    String code();
+}

+ 25 - 0
ruoyi-common/src/main/java/com/ruoyi/common/transition/TransitionFactory.java

@@ -0,0 +1,25 @@
+package com.ruoyi.common.transition;
+
+import com.ruoyi.common.exception.ServiceException;
+
+import java.util.Optional;
+
+/**
+ * <P>
+ * 用途:转换工厂
+ * </p>
+ *
+ * @author: FXB
+ * @create: 2025-06-20 09:10
+ **/
+public class TransitionFactory {
+
+    private static final TransitionRegistry COMPONENT_ITEM_REGISTRY = new TransitionRegistry();
+
+    public TransitionFactory() {
+    }
+
+    public static Transition getTransition(String code) {
+        return Optional.ofNullable(COMPONENT_ITEM_REGISTRY.getTransition(code)).orElseThrow(() -> new ServiceException(String.format("%s not supported.", code)));
+    }
+}

+ 32 - 0
ruoyi-common/src/main/java/com/ruoyi/common/transition/TransitionRegistry.java

@@ -0,0 +1,32 @@
+package com.ruoyi.common.transition;
+
+import com.ruoyi.common.enums.TaskComponentTypeEnum;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * <P>
+ * 用途:转换组件注册
+ * </p>
+ *
+ * @author: FXB
+ * @create: 2025-06-20 09:10
+ **/
+public class TransitionRegistry {
+
+    private final Map<String, Transition> transitionMap = new HashMap<>();
+
+
+    public TransitionRegistry() {
+        this.transitionMap.put(TaskComponentTypeEnum.SPARK_CLEAN.getCode(), new CleanTransition());
+//        this.transitionMap.put(TaskComponentTypeEnum.SORT_RECORD.getCode(), new SortTransition());
+//        this.transitionMap.put(TaskComponentTypeEnum.FIELD_DERIVATION.getCode(), new FieldDerivationTransition());
+
+
+    }
+
+    public Transition getTransition(String code) {
+        return this.transitionMap.get(code);
+    }
+}

+ 47 - 48
ruoyi-common/src/main/java/com/ruoyi/common/utils/kms/KmsWrapper.java

@@ -5,20 +5,19 @@ import com.koal.kms.sdk.ed.KmsSdkException;
 import com.koal.kms.sdk.ed.KmsUtil;
 import com.koal.kms.sdk.ed.Mode;
 import org.springframework.stereotype.Component;
-import javax.annotation.PostConstruct;
+
 import java.util.Base64;
 
 /**
  * KMS工具类封装
- *
  */
 @Component
 public class KmsWrapper {
-    
+
     private static final Base64.Encoder BASE64_ENCODER = Base64.getEncoder();
     private static final Base64.Decoder BASE64_DECODER = Base64.getDecoder();
-    
-/*    *//**
+
+    /*    *//**
      * 初始化KMS客户端
      * 在实际项目中,这里应该读取配置文件进行初始化
      *//*
@@ -29,19 +28,19 @@ public class KmsWrapper {
     }*/
 
     // ==================== 数据加密相关方法 ====================
-    
+
     /**
      * CBC模式加密文本(推荐使用)
      */
     public String encryptTextCBC(String plainText) throws KmsSdkException {
         byte[] encryptedData = KmsUtil.encrypt(
-            plainText.getBytes(java.nio.charset.StandardCharsets.UTF_8), 
-            Mode.CBC,
-            null
+                plainText.getBytes(java.nio.charset.StandardCharsets.UTF_8),
+                Mode.CBC,
+                null
         );
         return BASE64_ENCODER.encodeToString(encryptedData);
     }
-    
+
     /**
      * CFB模式加密文本
      */
@@ -49,39 +48,39 @@ public class KmsWrapper {
         // 生成随机IV
         byte[] iv = KmsUtil.generateRandom(16);
         byte[] encryptedData = KmsUtil.encrypt(
-            plainText.getBytes(java.nio.charset.StandardCharsets.UTF_8), 
-            Mode.CFB, 
-            iv
+                plainText.getBytes(java.nio.charset.StandardCharsets.UTF_8),
+                Mode.CFB,
+                iv
         );
-        
+
         EncryptResult result = new EncryptResult();
         result.setEncryptedData(BASE64_ENCODER.encodeToString(encryptedData));
         result.setIv(BASE64_ENCODER.encodeToString(iv));
         return result;
     }
-    
+
     /**
      * CBC模式加密字节数据
      */
     public byte[] encryptDataCBC(byte[] plainData) throws KmsSdkException {
         return KmsUtil.encrypt(plainData, Mode.CBC, null);
     }
-    
+
     /**
      * CFB模式加密字节数据
      */
     public EncryptResult encryptDataCFB(byte[] plainData) throws KmsSdkException {
         byte[] iv = KmsUtil.generateRandom(16);
         byte[] encryptedData = KmsUtil.encrypt(plainData, Mode.CFB, iv);
-        
+
         EncryptResult result = new EncryptResult();
         result.setEncryptedDataBytes(encryptedData);
         result.setIvBytes(iv);
         return result;
     }
-    
+
     // ==================== 数据解密相关方法 ====================
-    
+
     /**
      * CBC模式解密文本
      */
@@ -90,7 +89,7 @@ public class KmsWrapper {
         byte[] decryptedData = KmsUtil.decrypt(encryptedData, Mode.CBC, null);
         return new String(decryptedData, java.nio.charset.StandardCharsets.UTF_8);
     }
-    
+
     /**
      * CFB模式解密文本
      */
@@ -100,33 +99,33 @@ public class KmsWrapper {
         byte[] decryptedData = KmsUtil.decrypt(encryptedData, Mode.CFB, iv);
         return new String(decryptedData, java.nio.charset.StandardCharsets.UTF_8);
     }
-    
+
     /**
      * CBC模式解密字节数据
      */
     public byte[] decryptDataCBC(byte[] encryptedData) throws KmsSdkException {
         return KmsUtil.decrypt(encryptedData, Mode.CBC, null);
     }
-    
+
     /**
      * CFB模式解密字节数据
      */
     public byte[] decryptDataCFB(byte[] encryptedData, byte[] iv) throws KmsSdkException {
         return KmsUtil.decrypt(encryptedData, Mode.CFB, iv);
     }
-    
+
     // ==================== 服务端加密解密 ====================
-    
+
     /**
      * 服务端加密(使用主密钥)
      */
     public String encryptServerSide(String plainText) throws KmsSdkException {
         byte[] encryptedData = KmsUtil.encrypt(
-            plainText.getBytes(java.nio.charset.StandardCharsets.UTF_8)
+                plainText.getBytes(java.nio.charset.StandardCharsets.UTF_8)
         );
         return BASE64_ENCODER.encodeToString(encryptedData);
     }
-    
+
     /**
      * 服务端解密(使用主密钥)
      */
@@ -135,23 +134,23 @@ public class KmsWrapper {
         byte[] decryptedData = KmsUtil.decrypt(encryptedData);
         return new String(decryptedData, java.nio.charset.StandardCharsets.UTF_8);
     }
-    
+
     /**
      * 服务端加密字节数据
      */
     public byte[] encryptServerSide(byte[] plainData) throws KmsSdkException {
         return KmsUtil.encrypt(plainData);
     }
-    
+
     /**
      * 服务端解密字节数据
      */
     public byte[] decryptServerSide(byte[] encryptedData) throws KmsSdkException {
         return KmsUtil.decrypt(encryptedData);
     }
-    
+
     // ==================== 随机数生成 ====================
-    
+
     /**
      * 生成随机字符串(Base64编码)
      */
@@ -159,64 +158,64 @@ public class KmsWrapper {
         byte[] randomBytes = KmsUtil.generateRandom(length);
         return BASE64_ENCODER.encodeToString(randomBytes);
     }
-    
+
     /**
      * 生成随机字节数组
      */
     public byte[] generateRandomBytes(int length) throws KmsSdkException {
         return KmsUtil.generateRandom(length);
     }
-    
+
     /**
      * 生成16字节IV(用于CFB模式)
      */
     public String generateIVBase64() throws KmsSdkException {
         return generateRandomBase64(16);
     }
-    
+
     /**
      * 生成16字节IV字节数组
      */
     public byte[] generateIVBytes() throws KmsSdkException {
         return generateRandomBytes(16);
     }
-    
+
     // ==================== 文件操作 ====================
-    
+
     /**
      * 文件加密
      */
     public void encryptFile(String sourceFilePath, String targetFileName) throws KmsSdkException {
         KmsUtil.encryptFile(sourceFilePath, targetFileName);
     }
-    
+
     /**
      * 文件解密
      */
     public void decryptFile(String sourceFilePath, String targetFileName) throws KmsSdkException {
         KmsUtil.decryptFile(sourceFilePath, targetFileName);
     }
-    
+
     // ==================== HMAC运算 ====================
-    
+
     /**
      * HMAC运算(SM3)
      */
     public String hmacBase64(String data) throws KmsSdkException {
         byte[] hmacData = KmsUtil.hMac(
-            data.getBytes(java.nio.charset.StandardCharsets.UTF_8), 
-            DigestAlgorithm.SM3
+                data.getBytes(java.nio.charset.StandardCharsets.UTF_8),
+                DigestAlgorithm.SM3
         );
         return BASE64_ENCODER.encodeToString(hmacData);
     }
-    
+
     /**
      * HMAC运算字节数据
      */
     public byte[] hmac(byte[] data) throws KmsSdkException {
         return KmsUtil.hMac(data, DigestAlgorithm.SM3);
     }
-    
+
     /**
      * 验证HMAC
      */
@@ -225,27 +224,27 @@ public class KmsWrapper {
         byte[] hmacBytes = BASE64_DECODER.decode(hmacBase64);
         return KmsUtil.verifyHMac(dataBytes, hmacBytes, DigestAlgorithm.SM3);
     }
-    
+
     /**
      * 验证HMAC字节数据
      */
     public boolean verifyHmac(byte[] data, byte[] hmacData) throws KmsSdkException {
         return KmsUtil.verifyHMac(data, hmacData, DigestAlgorithm.SM3);
     }
-    
+
     // ==================== 摘要运算 ====================
-    
+
     /**
      * 计算摘要(SM3)
      */
     public String hashBase64(String data) throws KmsSdkException {
         byte[] hashData = KmsUtil.hash(
-            data.getBytes(java.nio.charset.StandardCharsets.UTF_8), 
-            DigestAlgorithm.SM3
+                data.getBytes(java.nio.charset.StandardCharsets.UTF_8),
+                DigestAlgorithm.SM3
         );
         return BASE64_ENCODER.encodeToString(hashData);
     }
-    
+
     /**
      * 计算摘要字节数据
      */

+ 1 - 1
ruoyi-model-dpp/src/main/java/com/ruoyi/model/att/dataobject/AttCleanRuleDO.java

@@ -14,7 +14,7 @@ import lombok.*;
  * @date 2025-01-20
  */
 @Data
-@TableName(value = "SH_MODEL.ATT_CLEAN_RULE")
+@TableName(value = "ATT_CLEAN_RULE")
 // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
 // @KeySequence("ATT_CLEAN_RULE_seq")
 @Builder

+ 2 - 0
ruoyi-model-dpp/src/main/java/com/ruoyi/model/att/mapper/AttCleanRuleMapper.java

@@ -21,6 +21,8 @@ import java.util.Set;
  */
 public interface AttCleanRuleMapper extends BaseMapperX<AttCleanRuleDO> {
 
+    List<AttCleanRuleDO> listOfCleanRule(AttCleanRulePageReqVO attCleanRule);
+
     List<AttCleanRuleDO> selectPage(AttCleanRulePageReqVO reqVO);
 
     default PageResult<AttCleanRuleDO> selectPage2(AttCleanRulePageReqVO reqVO) {

+ 1 - 11
ruoyi-model-dpp/src/main/java/com/ruoyi/model/att/service/impl/AttCleanRuleServiceImpl.java

@@ -94,19 +94,9 @@ public class AttCleanRuleServiceImpl extends ServiceImpl<AttCleanRuleMapper, Att
 
     @Override
     public List<AttCleanRuleRespVO> getAttCleanRuleList(AttCleanRulePageReqVO attCleanRule) {
-
-        MPJLambdaWrapper<AttCleanRuleDO> lambdaWrapper = new MPJLambdaWrapper();
-        lambdaWrapper.selectAll(AttCleanRuleDO.class)
-                .select("t2.NAME AS catName")
-                .leftJoin("ATT_CLEAN_CAT t2 on t.CAT_CODE = t2.CODE AND t2.DEL_FLAG = '0'")
-                .likeRight(org.apache.commons.lang3.StringUtils.isNotBlank(attCleanRule.getCatCode()), AttCleanRuleDO::getCatCode, attCleanRule.getCatCode());
-//        LambdaQueryWrapperX<AttCleanRuleDO> x = new LambdaQueryWrapperX<>();
-//        x.eqIfPresent(AttCleanRuleDO::getType , attCleanRule.getType());
-//        x.eqIfPresent(AttCleanRuleDO::getValidFlag , attCleanRule.getValidFlag());
-        List<AttCleanRuleDO> attCleanRuleDOS = attCleanRuleMapper.selectList(lambdaWrapper);
+        List<AttCleanRuleDO> attCleanRuleDOS = attCleanRuleMapper.listOfCleanRule(attCleanRule);
         List<AttCleanRuleRespVO> bean = BeanUtils.toBean(attCleanRuleDOS, AttCleanRuleRespVO.class);
         for (AttCleanRuleRespVO respVO : bean) {
-
             respVO.setParentType(Convert.toStr(respVO.getCatID()));
             respVO.setParentName(respVO.getCatName());
         }

+ 1 - 0
ruoyi-model-dpp/src/main/java/com/ruoyi/model/dpp/api/service/etl/DppEtlTaskService.java

@@ -17,4 +17,5 @@ public interface DppEtlTaskService {
      * @return 条数
      */
     int checkTaskIdInAsset(List<Long> assetIdList);
+
 }

+ 3 - 0
ruoyi-model-dpp/src/main/java/com/ruoyi/model/dpp/controller/etl/vo/DppEtlNewNodeSaveReqVO.java

@@ -1,5 +1,7 @@
 package com.ruoyi.model.dpp.controller.etl.vo;
 
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.ruoyi.common.core.deserializer.MapListDeserializer;
 import com.ruoyi.common.core.domain.BaseEntity;
 import com.ruoyi.common.utils.json.JSONUtils;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -60,6 +62,7 @@ public class DppEtlNewNodeSaveReqVO extends BaseEntity {
     private String globalParams = "[]";  // 默认值
 
     @Parameter(name = "locations", description = "位置参数", required = false)
+    @JsonDeserialize(using = MapListDeserializer.class)
     private List<Map<String,Object>> locations;
 
     @Parameter(name = "timeout", description = "超时时间", required = false)

+ 5 - 1
ruoyi-model-dpp/src/main/java/com/ruoyi/model/dpp/controller/etl/vo/DppEtlTaskPageReqVO.java

@@ -67,6 +67,10 @@ public class DppEtlTaskPageReqVO extends PageParam {
     @Schema(description = "DolphinScheduler的id", example = "")
     private Long dsId;
 
-    /** 类目编码 */
+    /**
+     * 类目编码
+     */
     private String catCode;
+
+    private String tableName;
 }

+ 10 - 0
ruoyi-model-dpp/src/main/java/com/ruoyi/model/dpp/controller/etl/vo/DppEtlTaskRespVO.java

@@ -1,6 +1,7 @@
 package com.ruoyi.model.dpp.controller.etl.vo;
 
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.ruoyi.common.annotation.Excel;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -117,6 +118,7 @@ public class DppEtlTaskRespVO implements Serializable {
 
     @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
     @Schema(description = "创建时间", example = "")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
 
     @Excel(name = "更新人")
@@ -129,6 +131,7 @@ public class DppEtlTaskRespVO implements Serializable {
 
     @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
     @Schema(description = "更新时间", example = "")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date updateTime;
 
     @Excel(name = "备注")
@@ -139,12 +142,19 @@ public class DppEtlTaskRespVO implements Serializable {
     @Excel(name = "最后执行时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
     @Schema(description = "最后执行时间", example = "")
     @TableField(exist = false)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date lastExecuteTime;
 
 
     @Schema(description = "草稿任务配置信息", example = "")
     private String draftJson;
 
+    @Schema(description = "来源数据配置", example = "")
+    private String queryOptions;
+
+    @Schema(description = "清洗规则配置", example = "")
+    private String ruleList;
+
     /** cron表达式 */
     @TableField(exist = false)
     private String cronExpression;

+ 6 - 0
ruoyi-model-dpp/src/main/java/com/ruoyi/model/dpp/controller/etl/vo/DppEtlTaskSaveReqVO.java

@@ -92,4 +92,10 @@ public class DppEtlTaskSaveReqVO extends BaseEntity {
 
     @Schema(description = "草稿任务配置信息", example = "")
     private String draftJson;
+
+    @Schema(description = "来源数据配置", example = "")
+    private String queryOptions;
+    @Schema(description = "清洗规则配置", example = "")
+    private String ruleList;
+
 }

+ 80 - 25
ruoyi-model-dpp/src/main/java/com/ruoyi/model/dpp/dal/dataobject/etl/DppEtlTaskDO.java

@@ -25,95 +25,150 @@ public class DppEtlTaskDO extends BaseEntity {
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
 
-    /** ID */
+    /**
+     * ID
+     */
     @TableId(type = IdType.AUTO)
     private Long id;
 
-    /** 类目Id */
+    /**
+     * 类目Id
+     */
     private Long catId;
 
-    /** 类目编码 */
+    /**
+     * 类目编码
+     */
     private String catCode;
 
     @TableField(exist = false)
     private String catName;
 
-    /** 数据源类型 */
+    /**
+     * 数据源类型
+     */
     @TableField(exist = false)
     private String datasourceType;
 
-    /** 1:离线任务 2:实时任务 3:数据开发任务 4:作业任务 */
+    /**
+     * 1:离线任务 2:实时任务 3:数据开发任务 4:作业任务
+     */
     private String type;
 
-    /** 任务名称 */
+    /**
+     * 任务名称
+     */
     private String name;
 
-    /** 任务编码 */
+    /**
+     * 任务编码
+     */
     private String code;
 
-    /** 任务版本 */
+    /**
+     * 任务版本
+     */
     private Long version;
 
-    /** 项目id */
+    /**
+     * 项目id
+     */
     private Long projectId;
 
-    /** 项目编码 */
+    /**
+     * 项目编码
+     */
     private String projectCode;
 
-    /** 责任人 */
+    /**
+     * 责任人
+     */
     private String personCharge;
 
-    /** 责任人名称 */
+    /**
+     * 责任人名称
+     */
     @TableField(exist = false)
     private String personChargeName;
 
-    /** 联系电话 */
+    /**
+     * 联系电话
+     */
     private String contactNumber;
 
 
-    /** 节点坐标信息 */
+    /**
+     * 节点坐标信息
+     */
     private String locations;
 
     @Schema(description = "任务的执行策略", example = "")
     private String executionType;
 
-    /** 描述 */
+    /**
+     * 描述
+     */
     private String description;
 
-    /** 超时时间 */
+    /**
+     * 超时时间
+     */
     private Long timeout;
 
-    /** 抽取量 */
+    /**
+     * 抽取量
+     */
     private Long extractionCount;
 
-    /** 写入量 */
+    /**
+     * 写入量
+     */
     private Long writeCount;
 
-    /** 任务状态 */
+    /**
+     * 任务状态
+     */
     private String status;
 
-    /** DolphinScheduler的id */
+    /**
+     * DolphinScheduler的id
+     */
     private Long dsId;
 
-    /** 是否有效 */
+    /**
+     * 是否有效
+     */
     private Boolean validFlag;
 
-    /** 删除标志 */
+    /**
+     * 删除标志
+     */
     @TableLogic
     private Boolean delFlag;
 
-    /** cron表达式 */
+    /**
+     * cron表达式
+     */
     @TableField(exist = false)
     private String cronExpression;
 
-    /** 调度上下限 */
+    /**
+     * 调度上下限
+     */
     @TableField(exist = false)
     private String schedulerState;
 
-    /** 最后执行时间 */
+    /**
+     * 最后执行时间
+     */
     @TableField(exist = false)
     private Date lastExecuteTime;
 
     @Schema(description = "草稿任务配置信息", example = "")
     private String draftJson;
+    @Schema(description = "来源数据配置", example = "")
+    private String queryOptions;
+    @Schema(description = "清洗规则配置", example = "")
+    private String ruleList;
+
 }

+ 3 - 4
ruoyi-model-dpp/src/main/java/com/ruoyi/model/etl/controller/DppEtlTaskController.java

@@ -184,10 +184,9 @@ public class DppEtlTaskController extends BaseController {
     @Operation(summary = "修改数据汇聚任务")
     @PostMapping("/updateEtlTask")
     @ResponseStatus(HttpStatus.CREATED)
-    public AjaxResult updateEtlTask(@Valid @RequestBody DppEtlNewNodeSaveReqVO dppEtlNewNodeSaveReqVO) {
-        dppEtlNewNodeSaveReqVO.setType("1");//默认离线数据集成
-        DppEtlTaskSaveReqVO result = dppEtlTaskService.updateEtlTask(dppEtlNewNodeSaveReqVO);
-        return AjaxResult.success(result);
+    public AjaxResult updateEtlTask(@Valid @RequestBody DppEtlTaskSaveReqVO dppEtlTaskSaveReqVO) {
+        int result = dppEtlTaskService.updateDppEtlTask(dppEtlTaskSaveReqVO);
+        return AjaxResult.check(result > 0);
     }
 
     @Operation(summary = "新增数据汇聚任务")

+ 35 - 26
ruoyi-model-dpp/src/main/java/com/ruoyi/model/etl/mapper/DppEtlTaskMapper.java

@@ -2,19 +2,13 @@ package com.ruoyi.model.etl.mapper;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.github.yulichang.wrapper.MPJLambdaWrapper;
-import com.ruoyi.common.core.page.PageResult;
-import com.ruoyi.common.enums.TaskCatEnum;
 import com.ruoyi.common.mybatis.mapper.BaseMapperX;
 import com.ruoyi.model.dpp.controller.etl.vo.DppEtlTaskPageReqVO;
 import com.ruoyi.model.dpp.controller.etl.vo.DppEtlTaskRespVO;
 import com.ruoyi.model.dpp.dal.dataobject.etl.DppEtlTaskDO;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
-import java.util.*;
-import java.util.stream.Collectors;
+import java.util.List;
 
 /**
  * 数据集成任务Mapper接口
@@ -27,27 +21,42 @@ public interface DppEtlTaskMapper extends BaseMapperX<DppEtlTaskDO> {
 
     IPage<DppEtlTaskRespVO> getDppEtlTaskPage(Page page, @Param("params") DppEtlTaskPageReqVO reqVO);
 
+    DppEtlTaskDO getByTaskId(@Param("id") Long id);
 
+    List<DppEtlTaskDO> selectPage(DppEtlTaskPageReqVO reqVO);
 
-    default PageResult<DppEtlTaskDO> selectPage(DppEtlTaskPageReqVO reqVO) {
-        // 直接在 reqVO 中设置动态表名(如果需要)
-        if (StringUtils.isNotBlank(reqVO.getType())) {
-            // 如果 XML 中无法直接调用静态方法,可以在 Java 中设置
-            // 这里假设你已经在 reqVO 中添加了 dynamicTableName 字段
-            String tableName = TaskCatEnum.findEnumByType(reqVO.getType()).toString();
-            // 通过反射或其他方式设置到 reqVO 中,或者在 XML 中处理
-        }
-
-        // 调用 XML 中定义的方法
-        IPage<DppEtlTaskDO> pageResult = selectJoinPage(
-                new Page<>(reqVO.getPageNum(), reqVO.getPageSize()),
-                reqVO
-        );
-
-        // 直接返回,不需要转换
-        return new PageResult<>(pageResult.getRecords(), pageResult.getTotal());
-    }
-
+//    default PageResult<DppEtlTaskDO> selectPage(DppEtlTaskPageReqVO reqVO) {
+//        // 定义排序的字段(防止 SQL 注入,与数据库字段名称一致)
+//        Set<String> allowedColumns = new HashSet<>(Arrays.asList("id", "create_time", "update_time"));
+//
+//        MPJLambdaWrapper<DppEtlTaskDO> lambdaWrapper = new MPJLambdaWrapper();
+//
+//        String leftJoin = TaskCatEnum.findEnumByType(reqVO.getType()) + " t2 on t.CAT_CODE = t2.CODE AND t2.DEL_FLAG = '0'";
+//
+//        lambdaWrapper.selectAll(DppEtlTaskDO.class)
+//                .select("t2.NAME AS catName",
+//                        "t3.CRON_EXPRESSION AS cronExpression"
+//                        , "t3.STATUS AS schedulerState"
+//                        , "(SELECT MAX(ti.CREATE_TIME) FROM DPP_ETL_TASK_INSTANCE ti WHERE ti.TASK_CODE = t.CODE AND ti.DEL_FLAG = '0') AS lastExecuteTime")
+//                .leftJoin(leftJoin)
+//                .leftJoin("DPP_ETL_SCHEDULER t3 ON t.id = t3.task_id AND t3.DEL_FLAG = '0'")
+//                .eq(StringUtils.isNotBlank(reqVO.getType()), DppEtlTaskDO::getType, reqVO.getType())
+//                .likeRight(StringUtils.isNotBlank(reqVO.getCatCode()), DppEtlTaskDO::getCatCode, reqVO.getCatCode())
+//                .like(StringUtils.isNotBlank(reqVO.getName()), DppEtlTaskDO::getName, reqVO.getName())
+//                .eq(StringUtils.isNotBlank(reqVO.getCode()), DppEtlTaskDO::getCode, reqVO.getCode())
+//                .ne(DppEtlTaskDO::getStatus, "-2")
+//                .ne(DppEtlTaskDO::getStatus, "-3")
+//                .eq(reqVO.getProjectId() != null, DppEtlTaskDO::getProjectId, reqVO.getProjectId())
+//                .eq(StringUtils.isNotBlank(reqVO.getProjectCode()), DppEtlTaskDO::getProjectCode, reqVO.getProjectCode())
+//                .eq(StringUtils.isNotBlank(reqVO.getPersonCharge()), DppEtlTaskDO::getPersonCharge, reqVO.getPersonCharge())
+//                .eq(StringUtils.isNotBlank(reqVO.getLocations()), DppEtlTaskDO::getLocations, reqVO.getLocations())
+//                .eq(StringUtils.isNotBlank(reqVO.getDescription()), DppEtlTaskDO::getDescription, reqVO.getDescription())
+//                .eq(StringUtils.isNotBlank(reqVO.getStatus()), DppEtlTaskDO::getStatus, reqVO.getStatus())
+//                .orderByStr(StringUtils.isNotBlank(reqVO.getOrderByColumn()), StringUtils.equals("asc", reqVO.getIsAsc()), StringUtils.isNotBlank(reqVO.getOrderByColumn()) ? Arrays.asList(reqVO.getOrderByColumn().split(",")) : null);
+//
+//        // 构造动态查询条件
+//        return selectJoinPage(reqVO, DppEtlTaskDO.class, lambdaWrapper);
+//    }
 
     IPage<DppEtlTaskDO> selectJoinPage(Page<DppEtlTaskDO> page, @Param("reqVO") DppEtlTaskPageReqVO reqVO);
 

+ 3 - 5
ruoyi-model-dpp/src/main/java/com/ruoyi/model/etl/service/impl/DppEtlNodeServiceImpl.java

@@ -48,11 +48,9 @@ public class DppEtlNodeServiceImpl extends ServiceImpl<DppEtlNodeMapper, DppEtlN
 
     @Override
     public List<DppEtlNodeRespVO> getDppEtlNodeRespList(DppEtlNodePageReqVO reqVO) {
-
-        MPJLambdaWrapper<DppEtlNodeDO> wrapper = new MPJLambdaWrapper<>();
-        wrapper.selectAll(DppEtlNodeDO.class)
-                .in(CollectionUtils.isNotEmpty(reqVO.getCodeList()), DppEtlNodeDO::getCode, reqVO.getCodeList());
-        List<DppEtlNodeDO> dppEtlTaskNodeRelDOS = dppEtlNodeMapper.selectList(wrapper);
+        QueryWrapper<DppEtlNodeDO> wrapper = new QueryWrapper<>();
+        wrapper.in(CollectionUtils.isNotEmpty(reqVO.getCodeList()), "CODE", reqVO.getCodeList());
+        List<DppEtlNodeDO> dppEtlTaskNodeRelDOS = list(wrapper);
         return BeanUtils.toBean(dppEtlTaskNodeRelDOS, DppEtlNodeRespVO.class);
     }
 

+ 7 - 9
ruoyi-model-dpp/src/main/java/com/ruoyi/model/etl/service/impl/DppEtlSchedulerServiceImpl.java

@@ -2,7 +2,6 @@ package com.ruoyi.model.etl.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.ruoyi.common.core.page.PageResult;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.StringUtils;
@@ -79,14 +78,13 @@ public class DppEtlSchedulerServiceImpl extends ServiceImpl<DppEtlSchedulerMappe
 
     @Override
     public DppEtlSchedulerDO getDppEtlSchedulerById(DppEtlSchedulerPageReqVO reqVO) {
-        MPJLambdaWrapper<DppEtlSchedulerDO> wrapper = new MPJLambdaWrapper<>();
-        wrapper.selectAll(DppEtlSchedulerDO.class)
-                .eq(reqVO.getTaskId() != null, DppEtlSchedulerDO::getTaskId, reqVO.getTaskId())
-                .eq(reqVO.getTaskCode() != null, DppEtlSchedulerDO::getTaskCode, reqVO.getTaskCode())
-                .eq(reqVO.getDsId() != null, DppEtlSchedulerDO::getDsId, reqVO.getDsId())
-                .eq(reqVO.getId() != null, DppEtlSchedulerDO::getId, reqVO.getId())
-                .eq(StringUtils.isNotBlank(reqVO.getTaskCode()), DppEtlSchedulerDO::getTaskCode, reqVO.getTaskCode());
-        return dppEtlSchedulerMapper.selectOne(wrapper);
+        QueryWrapper<DppEtlSchedulerDO> wrapper = new QueryWrapper<>();
+        wrapper.eq(reqVO.getTaskId() != null, "TASK_ID", reqVO.getTaskId())
+                .eq(reqVO.getTaskCode() != null, "TASK_CODE", reqVO.getTaskCode())
+                .eq(reqVO.getDsId() != null, "DS_ID", reqVO.getDsId())
+                .eq(reqVO.getId() != null, "ID", reqVO.getId())
+                .eq(StringUtils.isNotBlank(reqVO.getTaskCode()), "TASK_CODE", reqVO.getTaskCode());
+        return getOne(wrapper);
     }
 
     @Override

+ 5 - 6
ruoyi-model-dpp/src/main/java/com/ruoyi/model/etl/service/impl/DppEtlTaskNodeRelServiceImpl.java

@@ -44,12 +44,11 @@ public class DppEtlTaskNodeRelServiceImpl extends ServiceImpl<DppEtlTaskNodeRelM
 
     @Override
     public List<DppEtlTaskNodeRelRespVO> getDppEtlTaskNodeRelRespVOList(DppEtlTaskNodeRelPageReqVO reqVO) {
-        MPJLambdaWrapper<DppEtlTaskNodeRelDO> wrapper = new MPJLambdaWrapper<>();
-        wrapper.selectAll(DppEtlTaskNodeRelDO.class)
-                .eq(reqVO.getTaskId() != null, DppEtlTaskNodeRelDO::getTaskId, reqVO.getTaskId())
-                .eq(reqVO.getTaskVersion() != null, DppEtlTaskNodeRelDO::getTaskVersion, reqVO.getTaskVersion())
-                .eq(StringUtils.isNotBlank(reqVO.getTaskCode()), DppEtlTaskNodeRelDO::getTaskCode, reqVO.getTaskCode());
-        List<DppEtlTaskNodeRelDO> dppEtlTaskNodeRelDOS = dppEtlTaskNodeRelMapper.selectList(wrapper);
+        QueryWrapper<DppEtlTaskNodeRelDO> wrapper = new QueryWrapper<>();
+        wrapper.eq(reqVO.getTaskId() != null, "TASK_ID", reqVO.getTaskId())
+                .eq(reqVO.getTaskVersion() != null, "TASK_VERSION", reqVO.getTaskVersion())
+                .eq(StringUtils.isNotBlank(reqVO.getTaskCode()), "TASK_CODE", reqVO.getTaskCode());
+        List<DppEtlTaskNodeRelDO> dppEtlTaskNodeRelDOS = list(wrapper);
         return BeanUtils.toBean(dppEtlTaskNodeRelDOS, DppEtlTaskNodeRelRespVO.class);
     }
 

+ 44 - 109
ruoyi-model-dpp/src/main/java/com/ruoyi/model/etl/service/impl/DppEtlTaskServiceImpl.java

@@ -7,11 +7,20 @@ import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.PageInfo;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.ruoyi.common.core.api.BizDataApiRequest;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.BizDataApiParam;
+import com.ruoyi.common.core.page.PageParam;
 import com.ruoyi.common.core.page.PageResult;
+import com.ruoyi.common.dataobject.DataTable;
 import com.ruoyi.common.enums.TaskCatEnum;
+import com.ruoyi.common.exception.CheckException;
 import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.transition.CleanTransition;
+import com.ruoyi.common.utils.JsonUtils;
+import com.ruoyi.common.utils.PageUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.json.JSONUtils;
 import com.ruoyi.common.utils.object.BeanUtils;
@@ -47,7 +56,6 @@ import java.util.*;
 import java.util.stream.Collectors;
 
 import static com.ruoyi.common.core.domain.AjaxResult.error;
-import static com.ruoyi.common.core.domain.AjaxResult.success;
 import static java.util.stream.Collectors.toSet;
 
 /**
@@ -97,7 +105,18 @@ public class DppEtlTaskServiceImpl extends ServiceImpl<DppEtlTaskMapper, DppEtlT
 
     @Override
     public PageResult<DppEtlTaskDO> getDppEtlTaskPage(DppEtlTaskPageReqVO pageReqVO) {
-        return dppEtlTaskMapper.selectPage(pageReqVO);
+        String tableName = String.valueOf(TaskCatEnum.findEnumByType(pageReqVO.getType()));
+        pageReqVO.setTableName(tableName);
+        // 特殊:不分页,直接查询全部
+        if (PageParam.PAGE_SIZE_NONE.equals(pageReqVO.getPageSize())) {
+            List<DppEtlTaskDO> list = dppEtlTaskMapper.selectPage(pageReqVO);
+            return new PageResult<>(list, (long) list.size());
+        }
+
+        // MyBatis Plus Join 查询
+        PageUtils.startPage();
+        List<DppEtlTaskDO> list = dppEtlTaskMapper.selectPage(pageReqVO);
+        return new PageResult<>(list, new PageInfo(list).getTotal());
     }
 
     public List<DppEtlTaskNodeRelRespVO> getTaskNodeRelList(DppEtlTaskRespVO bean) {
@@ -110,7 +129,7 @@ public class DppEtlTaskServiceImpl extends ServiceImpl<DppEtlTaskMapper, DppEtlT
 
     @Override
     public PageResult<DppEtlTaskRespVO> getDppEtlTaskPageList(DppEtlTaskPageReqVO dppEtlTask) {
-        PageResult<DppEtlTaskDO> dppEtlTaskDOPageResult = dppEtlTaskMapper.selectPage(dppEtlTask);
+        PageResult<DppEtlTaskDO> dppEtlTaskDOPageResult = getDppEtlTaskPage(dppEtlTask);
         PageResult<DppEtlTaskRespVO> dppEtlTaskRespVOPageResult = BeanUtils.toBean(dppEtlTaskDOPageResult, DppEtlTaskRespVO.class);
         List<DppEtlTaskRespVO> dppEtlTaskDOList = (List<DppEtlTaskRespVO>) dppEtlTaskRespVOPageResult.getRows();
         if (CollectionUtils.isEmpty(dppEtlTaskDOList)) {
@@ -152,8 +171,6 @@ public class DppEtlTaskServiceImpl extends ServiceImpl<DppEtlTaskMapper, DppEtlT
 
     @Override
     public int updateDppEtlTask(DppEtlTaskSaveReqVO updateReqVO) {
-        // 相关校验
-
         // 更新数据集成任务
         DppEtlTaskDO updateObj = BeanUtils.toBean(updateReqVO, DppEtlTaskDO.class);
         if (StringUtils.isNotEmpty(updateReqVO.getCatCode()) && StringUtils.isNotEmpty(updateReqVO.getType())) {
@@ -333,77 +350,7 @@ public class DppEtlTaskServiceImpl extends ServiceImpl<DppEtlTaskMapper, DppEtlT
     @Override
     public Map<String, Object> updateReleaseJobTask(DppEtlNewNodeSaveReqVO dppEtlNewNodeSaveReqVO) {
         DppEtlTaskDO dppEtlTaskDO = dppEtlTaskMapper.selectById(dppEtlNewNodeSaveReqVO.getId());
-        DppEtlSchedulerPageReqVO dppEtlSchedulerPageReqVO = new DppEtlSchedulerPageReqVO();
-        dppEtlSchedulerPageReqVO.setTaskId(dppEtlTaskDO.getId());
-        dppEtlSchedulerPageReqVO.setTaskCode(dppEtlTaskDO.getCode());
-        //1:离线任务 2:实时任务 3:数据开发任务 4:作业任务
-        String type = dppEtlTaskDO.getType();
-        DppEtlSchedulerDO dppEtlSchedulerById = iDppEtlSchedulerService.getDppEtlSchedulerById(dppEtlSchedulerPageReqVO);
-        // 若任务状态未变化,则直接返回
-        if (StringUtils.equals(dppEtlTaskDO.getStatus(), dppEtlNewNodeSaveReqVO.getReleaseState())) {
-            return new HashMap<>();
-        }
-
-        if (StringUtils.equals("-2", dppEtlTaskDO.getStatus()) && StringUtils.equals("0", dppEtlNewNodeSaveReqVO.getReleaseState())) {
-            return new HashMap<>();
-        }
-
-        if (StringUtils.equals("-3", dppEtlTaskDO.getStatus()) && StringUtils.equals("1", dppEtlNewNodeSaveReqVO.getReleaseState())) {
-            return new HashMap<>();
-        }
-
-
-        if (StringUtils.equals("4", type) && StringUtils.equals("1", dppEtlNewNodeSaveReqVO.getReleaseState())) {
-            wrapCustomNodeStatus(dppEtlTaskDO.getId(), dppEtlNewNodeSaveReqVO.getReleaseState());
-        }
-
-        if (StringUtils.equals("1", dppEtlSchedulerById.getStatus()) && StringUtils.equals("0", dppEtlNewNodeSaveReqVO.getReleaseState())) {
-            throw new ServiceException("调度上线中,请先下线调度!");
-        }
-
-        //判断是否是离线任务 是需要获取扩展信息的任务编码进行接口调用
-        if (StringUtils.equals("1", type)) {
-            //获取扩展信息
-            DppEtlTaskExtDO taskExt = dppEtlTaskExtService.getByTaskId(Long.parseLong(dppEtlNewNodeSaveReqVO.getId()));
-            if (taskExt == null) {
-                throw new ServiceException("暂无数据!");
-            }
-            dppEtlTaskDO.setCode(taskExt.getEtlTaskCode());
-        }
-
-        // 下线操作
-        if (StringUtils.equals("0", dppEtlNewNodeSaveReqVO.getReleaseState())) {
-            DsStatusRespDTO dsStatusRespDTO = dsEtlTaskService.releaseTask("OFFLINE", String.valueOf(dppEtlTaskDO.getProjectCode()), dppEtlTaskDO.getCode());
-            if (dsStatusRespDTO == null || !dsStatusRespDTO.getSuccess()) {
-                throw new ServiceException("发布或下线任务,失败!");
-            }
-
-            // 更新任务状态
-            if (!StringUtils.equals("-2", dppEtlTaskDO.getStatus()) && !StringUtils.equals("-3", dppEtlTaskDO.getStatus())) {
-                updateTaskStatus(dppEtlTaskDO.getId(), dppEtlNewNodeSaveReqVO.getReleaseState());
-            } else {
-                updateTaskStatus(dppEtlTaskDO.getId(), "-2");
-            }
-            return new HashMap<>();
-        }
-
-        // 上线操作
-        DsStatusRespDTO dsStatusRespDTO = dsEtlTaskService.releaseTask("ONLINE", String.valueOf(dppEtlTaskDO.getProjectCode()), dppEtlTaskDO.getCode());
-        String responseMsg = dsStatusRespDTO.getMsg();
-        if (responseMsg.contains("SubWorkflowDefinition") && responseMsg.contains("is not online")) {
-            throw new RuntimeException("存在未上线的子工作流,请先将所有子工作流上线");
-        }
-        if (dsStatusRespDTO == null || !dsStatusRespDTO.getSuccess()) {
-            throw new ServiceException("发布任务失败!");
-        }
-
-        // 更新任务状态
-        if (!StringUtils.equals("-2", dppEtlTaskDO.getStatus()) && !StringUtils.equals("-3", dppEtlTaskDO.getStatus())) {
-            updateTaskStatus(dppEtlTaskDO.getId(), dppEtlNewNodeSaveReqVO.getReleaseState());
-        } else {
-            updateTaskStatus(dppEtlTaskDO.getId(), "-3");
-        }
-
+        updateTaskStatus(dppEtlTaskDO.getId(), dppEtlNewNodeSaveReqVO.getReleaseState());
         return null;
     }
 
@@ -648,7 +595,10 @@ public class DppEtlTaskServiceImpl extends ServiceImpl<DppEtlTaskMapper, DppEtlT
 
         List<DppEtlNodeDO> dppEtlNodeDOList = new ArrayList<>();
 
-        Map<String, DppEtlNodeSaveReqVO> nodeMap = nodeList.stream().collect(Collectors.toMap(DppEtlNodeSaveReqVO::getCode, node -> node));
+        Map<String, DppEtlNodeSaveReqVO> nodeMap = new HashMap<>();
+        if (nodeList != null && nodeList.size() > 0) {
+            nodeMap = nodeList.stream().collect(Collectors.toMap(DppEtlNodeSaveReqVO::getCode, node -> node));
+        }
 
         // 遍历 ProcessDefinition 中的 taskDefinitionList
         for (DppEtlNodeSaveReqVO createReqVO : nodeList) {
@@ -1211,13 +1161,7 @@ public class DppEtlTaskServiceImpl extends ServiceImpl<DppEtlTaskMapper, DppEtlT
 
     @Override
     public DppEtlTaskUpdateQueryRespVO getuUpdateQueryInfo(Long id) {
-        MPJLambdaWrapper<DppEtlTaskDO> lambdaWrapper = new MPJLambdaWrapper();
-        lambdaWrapper.selectAll(DppEtlTaskDO.class)
-                .select("t3.NICK_NAME AS personChargeName")
-                .leftJoin("SYSTEM_USER t3 on t.PERSON_CHARGE = t3.USER_ID AND t3.DEL_FLAG = '0'")
-                .eq(DppEtlTaskDO::getId, id);
-
-        DppEtlTaskDO dppEtlTaskDO = dppEtlTaskMapper.selectJoinOne(DppEtlTaskDO.class, lambdaWrapper);
+        DppEtlTaskDO dppEtlTaskDO = dppEtlTaskMapper.getByTaskId(id);
         List<DppEtlTaskNodeRelRespVO> dppEtlTaskNodeRelRespVOList = this.getTaskNodeRelList(BeanUtils.toBean(dppEtlTaskDO, DppEtlTaskRespVO.class));
 
         DppEtlTaskUpdateQueryRespVO bean = new DppEtlTaskUpdateQueryRespVO(dppEtlTaskDO);
@@ -1367,32 +1311,23 @@ public class DppEtlTaskServiceImpl extends ServiceImpl<DppEtlTaskMapper, DppEtlT
         if (dppEtlTaskDO == null) {
             return error("任务不存在,请刷新后重试!");
         }
-        if (!StringUtils.equals("1", dppEtlTaskDO.getStatus())) {
-            DppEtlNewNodeSaveReqVO nodeSaveReqVO = new DppEtlNewNodeSaveReqVO();
-            nodeSaveReqVO.setId(String.valueOf(id));
-            nodeSaveReqVO.setReleaseState("1");
-            this.updateReleaseJobTask(nodeSaveReqVO);
-//            return error("任务状态错误,请刷新后重试!");
-        }
-        //1:离线任务 2:实时任务 3:数据开发任务 4:作业任务
-        String type = dppEtlTaskDO.getType();
-
-        //判断是否是离线任务 是需要获取扩展信息的任务编码进行接口调用
-        if (StringUtils.equals("1", type)) {
-            //获取扩展信息
-            DppEtlTaskExtDO taskExt = dppEtlTaskExtService.getByTaskId(dppEtlTaskDO.getId());
-            if (taskExt == null) {
-                throw new ServiceException("暂无数据!");
-            }
-            dppEtlTaskDO.setCode(taskExt.getEtlTaskCode());
-        }
-
-
-        DsStartTaskReqDTO dsStartTaskReqDTO = TaskConverter.createDsStartTaskReqDTO(dppEtlTaskDO.getCode());
-
-        DsStatusRespDTO dsStatusRespDTO = dsEtlTaskService.startTask(dsStartTaskReqDTO, dppEtlTaskDO.getProjectCode());
+        return AjaxResult.success(startTask(dppEtlTaskDO));
+    }
 
-        return dsStatusRespDTO.getSuccess() ? success() : error(dsStatusRespDTO.getMsg());
+    private DataTable startTask(DppEtlTaskDO dppEtlTaskDO) {
+        // 1. 获取数据
+        List<Map<String, Object>> data = (List<Map<String, Object>>) BizDataApiRequest.requestByQueryOptions(dppEtlTaskDO.getQueryOptions());
+        List<BizDataApiParam> columnList = BizDataApiRequest.getColumns(dppEtlTaskDO.getQueryOptions());
+        Optional.ofNullable(columnList).orElseThrow(() -> new CheckException("请检查数据源配置!"));
+        List<String> columns = columnList.stream().map(BizDataApiParam::getKey).collect(Collectors.toList());
+        DataTable dataTable = new DataTable(columns, data);
+
+        List<Map> ruleList = JsonUtils.jsonToList(dppEtlTaskDO.getRuleList(), Map.class);
+        // 2. 清洗转换数据
+        CleanTransition cleanTransition = new CleanTransition();
+        com.alibaba.fastjson2.JSONObject parameter = new com.alibaba.fastjson2.JSONObject();
+        parameter.put("tableFields", ruleList);
+        return cleanTransition.transition(dataTable, parameter);
     }
 
 

+ 6 - 1
ruoyi-model-dpp/src/main/resources/mapper/att/AttCleanRuleMapper.xml

@@ -125,7 +125,12 @@
         <include refid="selectAttCleanRuleVo"/>
         where ID = #{id}
     </select>
-
+    <select id="listOfCleanRule" resultType="com.ruoyi.model.att.dataobject.AttCleanRuleDO">
+        select t.*, t2.NAME AS catName
+        from ATT_CLEAN_RULE t
+                 left join ATT_CLEAN_CAT t2 on t.CAT_CODE = t2.CODE AND t2.DEL_FLAG = '0'
+        where CAT_CODE like CONCAT(#{catCode}, '%')
+    </select>
     <insert id="insertAttCleanRule" parameterType="AttCleanRuleDO">
         insert into ATT_CLEAN_RULE
         <trim prefix="(" suffix=")" suffixOverrides=",">

+ 242 - 169
ruoyi-model-dpp/src/main/resources/mapper/etl/DppEtlTaskMapper.xml

@@ -1,60 +1,85 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
-PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.model.etl.mapper.DppEtlTaskMapper">
 
     <resultMap type="DppEtlTaskDO" id="DppEtlTaskResult">
-        <result property="id"    column="ID"    />
-        <result property="type"    column="TYPE"    />
-        <result property="name"    column="NAME"    />
-        <result property="code"    column="CODE"    />
-        <result property="version"    column="VERSION"    />
-        <result property="projectId"    column="PROJECT_ID"    />
-        <result property="projectCode"    column="PROJECT_CODE"    />
-        <result property="personCharge"    column="PERSON_CHARGE"    />
-        <result property="locations"    column="LOCATIONS"    />
-        <result property="description"    column="DESCRIPTION"    />
-        <result property="timeout"    column="TIMEOUT"    />
-        <result property="extractionCount"    column="EXTRACTION_COUNT"    />
-        <result property="executionType"    column="EXECUTION_TYPE"    />
-        <result property="writeCount"    column="WRITE_COUNT"    />
-        <result property="status"    column="STATUS"    />
-        <result property="dsId"    column="DS_ID"    />
-        <result property="validFlag"    column="VALID_FLAG"    />
-        <result property="delFlag"    column="DEL_FLAG"    />
-        <result property="createBy"    column="CREATE_BY"    />
-        <result property="creatorId"    column="CREATOR_ID"    />
-        <result property="createTime"    column="CREATE_TIME"    />
-        <result property="updateBy"    column="UPDATE_BY"    />
-        <result property="updaterId"    column="UPDATER_ID"    />
-        <result property="updateTime"    column="UPDATE_TIME"    />
-        <result property="remark"    column="REMARK"    />
+        <result property="id" column="ID"/>
+        <result property="type" column="TYPE"/>
+        <result property="name" column="NAME"/>
+        <result property="code" column="CODE"/>
+        <result property="version" column="VERSION"/>
+        <result property="projectId" column="PROJECT_ID"/>
+        <result property="projectCode" column="PROJECT_CODE"/>
+        <result property="personCharge" column="PERSON_CHARGE"/>
+        <result property="locations" column="LOCATIONS"/>
+        <result property="description" column="DESCRIPTION"/>
+        <result property="timeout" column="TIMEOUT"/>
+        <result property="extractionCount" column="EXTRACTION_COUNT"/>
+        <result property="executionType" column="EXECUTION_TYPE"/>
+        <result property="writeCount" column="WRITE_COUNT"/>
+        <result property="status" column="STATUS"/>
+        <result property="dsId" column="DS_ID"/>
+        <result property="validFlag" column="VALID_FLAG"/>
+        <result property="delFlag" column="DEL_FLAG"/>
+        <result property="createBy" column="CREATE_BY"/>
+        <result property="creatorId" column="CREATOR_ID"/>
+        <result property="createTime" column="CREATE_TIME"/>
+        <result property="updateBy" column="UPDATE_BY"/>
+        <result property="updaterId" column="UPDATER_ID"/>
+        <result property="updateTime" column="UPDATE_TIME"/>
+        <result property="remark" column="REMARK"/>
     </resultMap>
 
     <sql id="selectDppEtlTaskVo">
-        select ID, TYPE, NAME, CODE, VERSION, PROJECT_ID,EXECUTION_TYPE, PROJECT_CODE, PERSON_CHARGE, LOCATIONS, DESCRIPTION, TIMEOUT, EXTRACTION_COUNT, WRITE_COUNT, STATUS, DS_ID, VALID_FLAG, DEL_FLAG, CREATE_BY, CREATOR_ID, CREATE_TIME, UPDATE_BY, UPDATER_ID, UPDATE_TIME, REMARK from DPP_ETL_TASK
+        select ID,
+               TYPE,
+               NAME,
+               CODE,
+               VERSION,
+               PROJECT_ID,
+               EXECUTION_TYPE,
+               PROJECT_CODE,
+               PERSON_CHARGE,
+               LOCATIONS,
+               DESCRIPTION,
+               TIMEOUT,
+               EXTRACTION_COUNT,
+               WRITE_COUNT,
+               STATUS,
+               DS_ID,
+               VALID_FLAG,
+               DEL_FLAG,
+               CREATE_BY,
+               CREATOR_ID,
+               CREATE_TIME,
+               UPDATE_BY,
+               UPDATER_ID,
+               UPDATE_TIME,
+               REMARK
+        from DPP_ETL_TASK
     </sql>
 
     <select id="selectDppEtlTaskList" parameterType="DppEtlTaskDO" resultMap="DppEtlTaskResult">
         <include refid="selectDppEtlTaskVo"/>
         <where>
-            <if test="type != null  and type != ''"> and TYPE = #{type}</if>
-            <if test="name != null  and name != ''"> and NAME like concat('%', #{name}, '%')</if>
-            <if test="code != null  and code != ''"> and CODE = #{code}</if>
-            <if test="version != null "> and VERSION = #{version}</if>
-            <if test="projectId != null "> and PROJECT_ID = #{projectId}</if>
-            <if test="projectCode != null  and projectCode != ''"> and PROJECT_CODE = #{projectCode}</if>
-            <if test="executionType != null  and executionType != ''"> and EXECUTION_TYPE = #{executionType}</if>
-            <if test="personCharge != null  and personCharge != ''"> and PERSON_CHARGE = #{personCharge}</if>
-            <if test="locations != null  and locations != ''"> and LOCATIONS = #{locations}</if>
-            <if test="description != null  and description != ''"> and DESCRIPTION = #{description}</if>
-            <if test="timeout != null "> and TIMEOUT = #{timeout}</if>
-            <if test="extractionCount != null "> and EXTRACTION_COUNT = #{extractionCount}</if>
-            <if test="writeCount != null "> and WRITE_COUNT = #{writeCount}</if>
-            <if test="status != null  and status != ''"> and STATUS = #{status}</if>
-            <if test="dsId != null "> and DS_ID = #{dsId}</if>
-            <if test="createTime != null "> and CREATE_TIME = #{createTime}</if>
+            <if test="type != null  and type != ''">and TYPE = #{type}</if>
+            <if test="name != null  and name != ''">and NAME like concat('%', #{name}, '%')</if>
+            <if test="code != null  and code != ''">and CODE = #{code}</if>
+            <if test="version != null ">and VERSION = #{version}</if>
+            <if test="projectId != null ">and PROJECT_ID = #{projectId}</if>
+            <if test="projectCode != null  and projectCode != ''">and PROJECT_CODE = #{projectCode}</if>
+            <if test="executionType != null  and executionType != ''">and EXECUTION_TYPE = #{executionType}</if>
+            <if test="personCharge != null  and personCharge != ''">and PERSON_CHARGE = #{personCharge}</if>
+            <if test="locations != null  and locations != ''">and LOCATIONS = #{locations}</if>
+            <if test="description != null  and description != ''">and DESCRIPTION = #{description}</if>
+            <if test="timeout != null ">and TIMEOUT = #{timeout}</if>
+            <if test="extractionCount != null ">and EXTRACTION_COUNT = #{extractionCount}</if>
+            <if test="writeCount != null ">and WRITE_COUNT = #{writeCount}</if>
+            <if test="status != null  and status != ''">and STATUS = #{status}</if>
+            <if test="dsId != null ">and DS_ID = #{dsId}</if>
+            <if test="createTime != null ">and CREATE_TIME = #{createTime}</if>
         </where>
     </select>
 
@@ -91,7 +116,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updaterId != null">UPDATER_ID,</if>
             <if test="updateTime != null">UPDATE_TIME,</if>
             <if test="remark != null">REMARK,</if>
-         </trim>
+        </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="id != null">#{id},</if>
             <if test="type != null">#{type},</if>
@@ -118,7 +143,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updaterId != null">#{updaterId},</if>
             <if test="updateTime != null">#{updateTime},</if>
             <if test="remark != null">#{remark},</if>
-         </trim>
+        </trim>
     </insert>
 
     <update id="updateDppEtlTask" parameterType="DppEtlTaskDO">
@@ -153,7 +178,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </update>
 
     <delete id="deleteDppEtlTaskById" parameterType="Long">
-        delete from DPP_ETL_TASK where ID = #{id}
+        delete
+        from DPP_ETL_TASK
+        where ID = #{id}
     </delete>
 
     <delete id="deleteDppEtlTaskByIds" parameterType="String">
@@ -164,40 +191,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
 
 
-
     <select id="checkTaskIdInSubTasks" parameterType="Long" resultType="int">
         SELECT COUNT(1)
         FROM DPP_ETL_TASK dt
         WHERE dt.DEL_FLAG = '0'
-          AND dt.TYPE = '4'
-          AND dt.id IN (
-            SELECT rel.TASK_ID
-            FROM DPP_ETL_TASK_NODE_REL rel
-                     JOIN DPP_ETL_NODE node
-                          ON (node.CODE = rel.PRE_NODE_CODE OR node.CODE = rel.POST_NODE_CODE)
-            WHERE
-                <choose>
-                    <when test="@tech.qiantong.qdata.mybatis.config.MasterDataSourceConfig@getDatabaseType() == 'mysql'">
-                        CAST(
-                            SUBSTRING_INDEX(
-                                SUBSTRING_INDEX(
-                                    node.PARAMETERS,
-                                    '"subTaskId":',
-                                    -1
-                                ),
-                                ',',
-                                1
-                            ) AS UNSIGNED
-                        )
-                    </when>
-                    <when test="@tech.qiantong.qdata.mybatis.config.MasterDataSourceConfig@getDatabaseType() == 'dm8'">
-                        TO_NUMBER(
-                        REGEXP_SUBSTR(node.PARAMETERS,
-                        '"subTaskId"[[:space:]]*:[[:space:]]*([0-9]+)',
-                        1, 1, NULL, 1)
-                        )
-                    </when>
-                </choose> = #{id}
+        AND dt.TYPE = '4'
+        AND dt.id IN (
+        SELECT rel.TASK_ID
+        FROM DPP_ETL_TASK_NODE_REL rel
+        JOIN DPP_ETL_NODE node
+        ON (node.CODE = rel.PRE_NODE_CODE OR node.CODE = rel.POST_NODE_CODE)
+        WHERE
+        <choose>
+            <when test="@tech.qiantong.qdata.mybatis.config.MasterDataSourceConfig@getDatabaseType() == 'mysql'">
+                CAST(
+                SUBSTRING_INDEX(
+                SUBSTRING_INDEX(
+                node.PARAMETERS,
+                '"subTaskId":',
+                -1
+                ),
+                ',',
+                1
+                ) AS UNSIGNED
+                )
+            </when>
+            <when test="@tech.qiantong.qdata.mybatis.config.MasterDataSourceConfig@getDatabaseType() == 'dm8'">
+                TO_NUMBER(
+                REGEXP_SUBSTR(node.PARAMETERS,
+                '"subTaskId"[[:space:]]*:[[:space:]]*([0-9]+)',
+                1, 1, NULL, 1)
+                )
+            </when>
+        </choose>
+        = #{id}
         );
     </select>
 
@@ -205,103 +232,103 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         SELECT COUNT(1)
         FROM DPP_ETL_TASK dt
         WHERE dt.DEL_FLAG = '0'
-          AND dt.TYPE != '4'
-            <if test="projectIdList != null and projectIdList.size > 0">
-                AND dt.PROJECT_ID in
-                <foreach item="id" collection="projectIdList" open="(" separator="," close=")">
-                    #{id}
-                </foreach>
-            </if>
-          AND dt.id IN (
-            SELECT rel.TASK_ID
-            FROM DPP_ETL_TASK_NODE_REL rel
-                     JOIN DPP_ETL_NODE node
-                          ON (node.CODE = rel.PRE_NODE_CODE OR node.CODE = rel.POST_NODE_CODE)
-            WHERE
-                <choose>
-                    <when test="@tech.qiantong.qdata.mybatis.config.MasterDataSourceConfig@getDatabaseType() == 'mysql'">
-                        CAST(
-                            SUBSTRING_INDEX(
-                                SUBSTRING_INDEX(
-                                    node.PARAMETERS,
-                                    '"datasourceId":',
-                                    -1
-                                ),
-                                ',',
-                                1
-                            ) AS UNSIGNED
-                        )
-                    </when>
-                    <when test="@tech.qiantong.qdata.mybatis.config.MasterDataSourceConfig@getDatabaseType() == 'dm8'">
-                                TO_NUMBER(
-                                REGEXP_SUBSTR(node.PARAMETERS,
-                                '"datasourceId"[[:space:]]*:[[:space:]]*([0-9]+)',
-                                1, 1, NULL, 1)
-                                )
-                    </when>
-                </choose>
-                        in
-                        <foreach item="id" collection="datasourceIdList" open="(" separator="," close=")">
-                            #{id}
-                        </foreach>
+        AND dt.TYPE != '4'
+        <if test="projectIdList != null and projectIdList.size > 0">
+            AND dt.PROJECT_ID in
+            <foreach item="id" collection="projectIdList" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </if>
+        AND dt.id IN (
+        SELECT rel.TASK_ID
+        FROM DPP_ETL_TASK_NODE_REL rel
+        JOIN DPP_ETL_NODE node
+        ON (node.CODE = rel.PRE_NODE_CODE OR node.CODE = rel.POST_NODE_CODE)
+        WHERE
+        <choose>
+            <when test="@tech.qiantong.qdata.mybatis.config.MasterDataSourceConfig@getDatabaseType() == 'mysql'">
+                CAST(
+                SUBSTRING_INDEX(
+                SUBSTRING_INDEX(
+                node.PARAMETERS,
+                '"datasourceId":',
+                -1
+                ),
+                ',',
+                1
+                ) AS UNSIGNED
+                )
+            </when>
+            <when test="@tech.qiantong.qdata.mybatis.config.MasterDataSourceConfig@getDatabaseType() == 'dm8'">
+                TO_NUMBER(
+                REGEXP_SUBSTR(node.PARAMETERS,
+                '"datasourceId"[[:space:]]*:[[:space:]]*([0-9]+)',
+                1, 1, NULL, 1)
+                )
+            </when>
+        </choose>
+        in
+        <foreach item="id" collection="datasourceIdList" open="(" separator="," close=")">
+            #{id}
+        </foreach>
         );
     </select>
     <select id="checkTaskIdInAsset" parameterType="Long" resultType="int">
         SELECT COUNT(1)
         FROM DPP_ETL_TASK dt
         WHERE dt.DEL_FLAG = '0'
-            AND dt.TYPE = '1'
-            AND dt.id IN (
-                SELECT rel.TASK_ID
-                FROM DPP_ETL_TASK_NODE_REL rel
-                    JOIN DPP_ETL_NODE node
-                        ON (node.CODE = rel.PRE_NODE_CODE OR node.CODE = rel.POST_NODE_CODE)
-                WHERE
-                <choose>
-                    <when test="@tech.qiantong.qdata.mybatis.config.MasterDataSourceConfig@getDatabaseType() == 'mysql'">
-                        CAST(
-                            SUBSTRING_INDEX(
-                                SUBSTRING_INDEX(
-                                    node.PARAMETERS,
-                                    '"clmt":',
-                                    -1
-                                ),
-                                ',',
-                                1
-                            ) AS UNSIGNED
-                        ) = 1
-                        AND
-                            CAST(
-                            SUBSTRING_INDEX(
-                                SUBSTRING_INDEX(
-                                    node.PARAMETERS,
-                                    '"asset_id_cpoy":',
-                                    -1
-                                ),
-                                ',',
-                                1
-                            ) AS UNSIGNED
-                        )
-                    </when>
-                    <when test="@tech.qiantong.qdata.mybatis.config.MasterDataSourceConfig@getDatabaseType() == 'dm8'">
-                        TO_NUMBER(
-                        REGEXP_SUBSTR(node.PARAMETERS,
-                        '"clmt"[[:space:]]*:[[:space:]]*"?([0-9]+)"?',
-                        1, 1, NULL, 1)
-                        )=1 AND
-                        TO_NUMBER(
-                        REGEXP_SUBSTR(node.PARAMETERS,
-                        '"asset_id_cpoy"[[:space:]]*:[[:space:]]*([0-9]+)',
-                        1, 1, NULL, 1)
-                        )
-                    </when>
-                </choose>
-                           in
-                          <foreach item="id" collection="assetIdList" open="(" separator="," close=")">
-                              #{id}
-                          </foreach>
+        AND dt.TYPE = '1'
+        AND dt.id IN (
+        SELECT rel.TASK_ID
+        FROM DPP_ETL_TASK_NODE_REL rel
+        JOIN DPP_ETL_NODE node
+        ON (node.CODE = rel.PRE_NODE_CODE OR node.CODE = rel.POST_NODE_CODE)
+        WHERE
+        <choose>
+            <when test="@tech.qiantong.qdata.mybatis.config.MasterDataSourceConfig@getDatabaseType() == 'mysql'">
+                CAST(
+                SUBSTRING_INDEX(
+                SUBSTRING_INDEX(
+                node.PARAMETERS,
+                '"clmt":',
+                -1
+                ),
+                ',',
+                1
+                ) AS UNSIGNED
+                ) = 1
+                AND
+                CAST(
+                SUBSTRING_INDEX(
+                SUBSTRING_INDEX(
+                node.PARAMETERS,
+                '"asset_id_cpoy":',
+                -1
+                ),
+                ',',
+                1
+                ) AS UNSIGNED
+                )
+            </when>
+            <when test="@tech.qiantong.qdata.mybatis.config.MasterDataSourceConfig@getDatabaseType() == 'dm8'">
+                TO_NUMBER(
+                REGEXP_SUBSTR(node.PARAMETERS,
+                '"clmt"[[:space:]]*:[[:space:]]*"?([0-9]+)"?',
+                1, 1, NULL, 1)
+                )=1 AND
+                TO_NUMBER(
+                REGEXP_SUBSTR(node.PARAMETERS,
+                '"asset_id_cpoy"[[:space:]]*:[[:space:]]*([0-9]+)',
+                1, 1, NULL, 1)
+                )
+            </when>
+        </choose>
+        in
+        <foreach item="id" collection="assetIdList" open="(" separator="," close=")">
+            #{id}
+        </foreach>
 
-            );
+        );
     </select>
 
     <select id="getDppEtlTaskPage" resultType="com.ruoyi.model.dpp.controller.etl.vo.DppEtlTaskRespVO">
@@ -310,7 +337,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         t2.NAME AS catName,
         t3.CRON_EXPRESSION AS cronExpression,
         t3.STATUS AS schedulerState ,
-        (SELECT MAX(ti.CREATE_TIME) FROM DPP_ETL_TASK_INSTANCE ti WHERE ti.TASK_CODE = t.CODE AND ti.DEL_FLAG = '0') AS lastExecuteTime
+        (SELECT MAX(ti.CREATE_TIME) FROM DPP_ETL_TASK_INSTANCE ti WHERE ti.TASK_CODE = t.CODE AND ti.DEL_FLAG = '0') AS
+        lastExecuteTime
         <if test="params.type == '3'.toString()">
             <choose>
                 <when test="@tech.qiantong.qdata.mybatis.config.MasterDataSourceConfig@getDatabaseType() == 'dm8'">
@@ -336,7 +364,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             </when>
         </choose>
         t2 on t.CAT_CODE = t2.CODE AND t2.DEL_FLAG = '0'
-        LEFT JOIN  DPP_ETL_SCHEDULER t3 ON t.id = t3.task_id AND t3.DEL_FLAG = '0'
+        LEFT JOIN DPP_ETL_SCHEDULER t3 ON t.id = t3.task_id AND t3.DEL_FLAG = '0'
         WHERE
         t.DEL_FLAG = '0'
         AND t.STATUS NOT IN ('-2', '-3')
@@ -397,6 +425,51 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             </choose>
         </if>
     </select>
+    <select id="selectPage" resultType="com.ruoyi.model.dpp.dal.dataobject.etl.DppEtlTaskDO">
+        SELECT
+            t.*,
+            t2.NAME AS catName,
+            t3.CRON_EXPRESSION AS cronExpression,
+            t3.STATUS AS schedulerState,
+            (SELECT MAX(ti.CREATE_TIME) FROM DPP_ETL_TASK_INSTANCE ti WHERE ti.TASK_CODE = t.CODE AND ti.DEL_FLAG = '0') AS lastExecuteTime
+        FROM DPP_ETL_TASK t
+        LEFT JOIN ${tableName} t2 on t.CAT_CODE = t2.CODE AND t2.DEL_FLAG = '0'
+        LEFT JOIN DPP_ETL_SCHEDULER t3 ON t.id = t3.task_id AND t3.DEL_FLAG = '0'
+        WHERE t.status != '-2' AND t.status != '-3'
+            <if test="type != null and type != ''">
+                AND t.type = #{type}
+            </if>
+            <if test="catCode != null and catCode != ''">
+                AND t.CAT_CODE like CONCAT(#{catCode}, '%')
+            </if>
+            <if test="name != null and name != ''">
+                AND t.name like CONCAT('%', #{name}, '%')
+            </if>
+            <if test="projectId != null and projectId != ''">
+                AND t.PROJECT_ID = #{projectId}
+            </if>
+            <if test="projectCode != null and projectCode != ''">
+                AND t.PROJECT_CODE = #{projectCode}
+            </if>
+            <if test="personCharge != null and personCharge != ''">
+                AND t.PERSON_CHARGE = #{personCharge}
+            </if>
+            <if test="locations != null and locations != ''">
+                AND t.LOCATIONS = #{locations}
+            </if>
+            <if test="description != null and description != ''">
+                AND t.DESCRIPTION = #{description}
+            </if>
+            <if test="status != null and status != ''">
+                AND t.STATUS = #{status}
+            </if>
+    </select>
+    <select id="getByTaskId" resultType="com.ruoyi.model.dpp.dal.dataobject.etl.DppEtlTaskDO">
+        SELECT t.*, t3.NICK_NAME AS personChargeName
+        FROM DPP_ETL_TASK t
+                 LEFT JOIN SYS_USER t3 on t.PERSON_CHARGE = t3.USER_ID AND t3.DEL_FLAG = '0'
+        where t.id = #{id}
+    </select>
 
     <resultMap id="DppEtlTaskDOResultMap" type="com.ruoyi.model.dpp.dal.dataobject.etl.DppEtlTaskDO">
         <!-- 主表字段映射 -->

+ 4 - 0
ruoyi-ui/package.json

@@ -19,7 +19,11 @@
   "dependencies": {
     "@antv/layout": "^1.2.14-beta.8",
     "@antv/x6": "^2.19.0",
+    "@antv/x6-plugin-dnd": "^2.1.1",
+    "@antv/x6-plugin-export": "^2.1.6",
+    "@antv/x6-plugin-history": "^2.2.4",
     "@antv/x6-plugin-keyboard": "^2.2.3",
+    "@antv/x6-plugin-selection": "^2.2.2",
     "@antv/x6-vue-shape": "^2.1.2",
     "@element-plus/icons-vue": "2.3.1",
     "@tinyflow-ai/vue": "^1.0.4",

+ 280 - 0
ruoyi-ui/src/api/dp/dataElem/dataElem.js

@@ -0,0 +1,280 @@
+import request from '@/utils/request';
+
+// 查询数据元列表
+export function listDpDataElem(query) {
+    return request({
+        url: '/dp/dataElem/list',
+        method: 'get',
+        params: query
+    });
+}
+
+// 查询数据元列表
+export function getDpDataElemList(query) {
+    return request({
+        url: '/dp/dataElem/getDpDataElemList',
+        method: 'get',
+        params: query
+    });
+}
+
+// 查询数据元详细
+export function getDpDataElem(id) {
+    return request({
+        url: '/dp/dataElem/' + id,
+        method: 'get'
+    });
+}
+
+// 新增数据元
+export function addDpDataElem(data) {
+    return request({
+        url: '/dp/dataElem',
+        method: 'post',
+        data: data
+    });
+}
+
+// 修改数据元
+export function updateDpDataElem(data) {
+    return request({
+        url: '/dp/dataElem',
+        method: 'put',
+        data: data
+    });
+}
+// 修改数据元
+export function updateStatusDpDataElem(id, status) {
+    return request({
+        url: `/dp/dataElem/updateStatus/${id}/${status}`,
+        method: 'post'
+    });
+}
+
+// 删除数据元
+export function delDpDataElem(id) {
+    return request({
+        url: '/dp/dataElem/' + id,
+        method: 'delete'
+    });
+}
+// 查询数据元代码映射列表
+export function listDpCodeMap(query) {
+    return request({
+        url: '/dp/codeMap/list',
+        method: 'get',
+        params: query
+    });
+}
+
+// 查询数据元代码映射详细
+export function getDpCodeMap(id) {
+    return request({
+        url: '/dp/codeMap/' + id,
+        method: 'get'
+    });
+}
+
+// 新增数据元代码映射
+export function addDpCodeMap(data) {
+    return request({
+        url: '/dp/codeMap',
+        method: 'post',
+        data: data
+    });
+}
+
+// 修改数据元代码映射
+export function updateDpCodeMap(data) {
+    return request({
+        url: '/dp/codeMap',
+        method: 'put',
+        data: data
+    });
+}
+
+// 删除数据元代码映射
+export function delDpCodeMap(id) {
+    return request({
+        url: '/dp/codeMap/' + id,
+        method: 'delete'
+    });
+}
+// 查询数据元数据资产关联信息列表
+export function listDpDataElemAssetRel(query) {
+    return request({
+        url: '/dp/dataElemAssetRel/list',
+        method: 'get',
+        params: query
+    });
+}
+
+// 查询数据元数据资产关联信息详细
+export function getDpDataElemAssetRel(id) {
+    return request({
+        url: '/dp/dataElemAssetRel/' + id,
+        method: 'get'
+    });
+}
+
+// 新增数据元数据资产关联信息
+export function addDpDataElemAssetRel(data) {
+    return request({
+        url: '/dp/dataElemAssetRel',
+        method: 'post',
+        data: data
+    });
+}
+
+// 修改数据元数据资产关联信息
+export function updateDpDataElemAssetRel(data) {
+    return request({
+        url: '/dp/dataElemAssetRel',
+        method: 'put',
+        data: data
+    });
+}
+
+// 删除数据元数据资产关联信息
+export function delDpDataElemAssetRel(id) {
+    return request({
+        url: '/dp/dataElemAssetRel/' + id,
+        method: 'delete'
+    });
+}
+// 查询数据元代码列表
+export function listDpDataElemCode(query) {
+    return request({
+        url: '/dp/dataElemCode/list',
+        method: 'get',
+        params: query
+    });
+}
+
+// 查询数据元代码详细
+export function getDpDataElemCode(id) {
+    return request({
+        url: '/dp/dataElemCode/' + id,
+        method: 'get'
+    });
+}
+
+// 新增数据元代码
+export function addDpDataElemCode(data) {
+    return request({
+        url: '/dp/dataElemCode',
+        method: 'post',
+        data: data
+    });
+}
+
+// 修改数据元代码
+export function updateDpDataElemCode(data) {
+    return request({
+        url: '/dp/dataElemCode',
+        method: 'put',
+        data: data
+    });
+}
+
+// 删除数据元代码
+export function delDpDataElemCode(id) {
+    return request({
+        url: '/dp/dataElemCode/' + id,
+        method: 'delete'
+    });
+}
+
+//校验源代码值
+export function validateCodeValue(params) {
+    return request({
+        url: '/dp/dataElemCode/validateCodeValue',
+        method: 'get',
+        params
+    });
+}
+// 查询数据元数据规则关联信息列表
+export function listDpDataElemRuleRel(query) {
+    return request({
+        url: '/dp/dataElemRuleRel/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询数据元数据规则关联信息详细
+export function getDpDataElemRuleRel(id) {
+    return request({
+        url: '/dp/dataElemRuleRel/' + id,
+        method: 'get'
+    })
+}
+
+// 新增数据元数据规则关联信息
+export function addDpDataElemRuleRel(data) {
+    return request({
+        url: '/dp/dataElemRuleRel',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改数据元数据规则关联信息
+export function updateDpDataElemRuleRel(data) {
+    return request({
+        url: '/dp/dataElemRuleRel',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除数据元数据规则关联信息
+export function delDpDataElemRuleRel(id) {
+    return request({
+        url: '/dp/dataElemRuleRel/' + id,
+        method: 'delete'
+    })
+}
+
+// 保存关联信息
+export function save(dataElemId, ruleType, data) {
+    return request({
+        url: `/dp/dataElemRuleRel/save/${dataElemId}/${ruleType}`,
+        method: 'post',
+        data
+    })
+}
+
+// 数据源清洗 稽查规则
+export function dpDataElemRuleRel(data) {
+    return request({
+        url: '/dp/dataElemRuleRel',
+        method: 'post',
+        data: data
+    });
+}
+// 数据源清洗 稽查规则 修改
+export function putDpDataElemRuleRel(data) {
+    return request({
+        url: '/dp/dataElemRuleRel',
+        method: 'put',
+        data: data
+    });
+}
+// 数据源清洗 稽查规则 删除
+export function DlEPutDpDataElemRuleRel(id) {
+    return request({
+        url: '/dp/dataElemRuleRel/' + id,
+        method: 'DELETE',
+    });
+}
+
+// 数据集成 查询
+export function listDpDataElemRuleRelV2(query) {
+    return request({
+        url: '/da/asset/listRelRule/v2',
+        method: 'get',
+        params: query
+    })
+}
+

+ 52 - 0
ruoyi-ui/src/api/dp/document/document.js

@@ -0,0 +1,52 @@
+import request from '@/utils/request'
+
+// 查询标准信息登记列表
+export function listDpDocument(query) {
+    return request({
+        url: '/dp/document/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询标准信息登记详细
+export function getDpDocument(ID) {
+    return request({
+        url: '/dp/document/' + ID,
+        method: 'get'
+    })
+}
+
+// 新增标准信息登记
+export function addDpDocument(data) {
+    return request({
+        url: '/dp/document',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改标准信息登记
+export function updateDpDocument(data) {
+    return request({
+        url: '/dp/document',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除标准信息登记
+export function delDpDocument(ID) {
+    return request({
+        url: '/dp/document/' + ID,
+        method: 'delete'
+    })
+}
+
+export function listAttDocumentCat(query) {
+    return request({
+        url: 'att/documentCat/getAttDocumentCatList',
+        method: 'get',
+        params: query
+    })
+}

+ 10 - 0
ruoyi-ui/src/api/dp/document/search.js

@@ -0,0 +1,10 @@
+import request from "@/utils/request";
+
+// 查询数据元代码映射列表
+export function dpDocumentList(query) {
+  return request({
+    url: "/dp/document/search",
+    method: "get",
+    params: query,
+  });
+}

+ 215 - 0
ruoyi-ui/src/api/dp/model/model.js

@@ -0,0 +1,215 @@
+import request from '@/utils/request';
+
+// 查询逻辑模型列表
+export function listDpModel(query) {
+    return request({
+        url: '/dp/model/list',
+        method: 'get',
+        params: query
+    });
+}
+
+// 查询逻辑模型详细
+export function getDpModel(ID) {
+    return request({
+        url: '/dp/model/' + ID,
+        method: 'get'
+    });
+}
+
+// 新增逻辑模型
+export function addDpModel(data) {
+    return request({
+        url: '/dp/model',
+        method: 'post',
+        data: data
+    });
+}
+// 新增逻辑模型
+export function dpModelColumn(data) {
+    return request({
+        url: '/dp/modelColumn/addList',
+        method: 'post',
+        data: data
+    });
+}
+// 新增逻辑模型
+export function updateDpModel(data) {
+    return request({
+        url: '/dp/model',
+        method: 'put',
+        data: data
+    });
+}
+// 修改逻辑模型
+// export function updateDpModel(data) {
+//   return request({
+//     url: '/dp/dpModelColumn/editList',
+//     method: 'put',
+//     data: data
+//   })
+// }
+
+// 删除逻辑模型
+export function delDpModel(ID) {
+    return request({
+        url: '/dp/model/' + ID,
+        method: 'delete'
+    });
+}
+
+// 删除逻辑模型字段
+export function delDpModelColumn(ID) {
+    return request({
+        url: '/dp/model/columnAll/' + ID,
+        method: 'delete'
+    });
+}
+// 查询逻辑模型类目管理列表
+export function listAttModelCat(query) {
+    return request({
+        url: '/att/modelCat/list',
+        method: 'get',
+        params: query
+    });
+}
+// 获取 表信息
+export function getDpModelColumnList(query) {
+    return request({
+        url: '/dp/modelColumn/getDpModelColumnList',
+        method: 'get',
+        params: query
+    });
+}
+// 修改逻辑模型
+export function updateDpModelColumn(data) {
+    return request({
+        url: '/dp/modelColumn/editList',
+        method: 'put',
+        data: data
+    });
+}
+// 物化
+export function createMaterializedTable(data) {
+    return request({
+        url: '/dp/modelMaterialized/createMaterializedTable',
+        method: 'post',
+        data: data
+    });
+}
+// 数据库连接
+export function getDaDatasourceList(query) {
+    return request({
+        url: '/da/dataSource/getDaDatasourceList',
+        method: 'get',
+        params: query
+    });
+}
+// 修改状态
+export function updateStatusDpDataModel(id, status) {
+    return request({
+        url: `/dp/model/updateStatus/${id}/${status}`,
+        method: 'post'
+    });
+}
+//表
+export function tableList(ID) {
+    console.log("🚀 ~ tableList ~ ID:", ID)
+    return request({
+        url: '/da/dataSource/tableList/' + ID,
+        method: 'get'
+    });
+}
+// 表字段
+export function columnsList(data) {
+    return request({
+        url: `/da/dataSource/columnsList`,
+        method: 'post',
+        data: data
+    });
+}
+
+// 查询逻辑模型属性信息列表
+export function listDpModelColumn(query) {
+    return request({
+        url: '/dp/modelColumn/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询逻辑模型属性信息详细
+export function getDpModelColumn(id) {
+    return request({
+        url: '/dp/modelColumn/' + id,
+        method: 'get'
+    })
+}
+
+// 新增逻辑模型属性信息
+export function addDpModelColumn(data) {
+    return request({
+        url: '/dp/modelColumn',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改逻辑模型属性信息
+export function updateDpModelColumns(data) {
+    return request({
+        url: '/dp/modelColumn',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除逻辑模型属性信息
+export function delDpModelColumns(id) {
+    return request({
+        url: '/dp/modelColumn/' + id,
+        method: 'delete'
+    })
+}
+// 查询物化模型记录列表
+export function listDpModelMaterialized(query) {
+    return request({
+        url: '/dp/modelMaterialized/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询物化模型记录详细
+export function getDpModelMaterialized(id) {
+    return request({
+        url: '/dp/modelMaterialized/' + id,
+        method: 'get'
+    })
+}
+
+// 新增物化模型记录
+export function addDpModelMaterialized(data) {
+    return request({
+        url: '/dp/modelMaterialized',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改物化模型记录
+export function updateDpModelMaterialized(data) {
+    return request({
+        url: '/dp/modelMaterialized',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除物化模型记录
+export function delDpModelMaterialized(id) {
+    return request({
+        url: '/dp/modelMaterialized/' + id,
+        method: 'delete'
+    })
+}

File diff suppressed because it is too large
+ 0 - 0
ruoyi-ui/src/assets/da/asset/api (1).svg


File diff suppressed because it is too large
+ 0 - 0
ruoyi-ui/src/assets/da/asset/api (2).svg


File diff suppressed because it is too large
+ 0 - 0
ruoyi-ui/src/assets/da/asset/api (3).svg


File diff suppressed because it is too large
+ 0 - 0
ruoyi-ui/src/assets/da/asset/api (4).svg


+ 1 - 0
ruoyi-ui/src/assets/da/asset/api (5).svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1752633349125" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8864" data-spm-anchor-id="a313x.search_index.0.i3.1ce43a81N1BzOw" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M870.62 240.77H467.21c0-49.51-40.14-89.64-89.64-89.64H153.46c-49.53 0-89.65 40.13-89.65 89.64v627.52c0 49.51 40.12 89.65 89.65 89.65h717.17c49.52 0 89.64-40.13 89.64-89.65V330.42c-0.01-49.51-40.13-89.65-89.65-89.65z m0 582.69c0 24.76-20.08 44.82-44.83 44.82H198.28c-24.75 0-44.82-20.07-44.82-44.82V509.71h717.17v313.75z m-44.83-403.39H153.46v-179.3c0.22 0.23 20.07 0 44.82 0h134.47c24.75 0 44.77 0.06 44.83 0v89.65H825.8c24.75 0 44.83 20.07 44.83 44.82-0.01 24.75-20.09 44.83-44.84 44.83z" fill="#edce2e" p-id="8865"></path></svg>

+ 1 - 0
ruoyi-ui/src/assets/da/asset/api (6).svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1752633349125" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8864" data-spm-anchor-id="a313x.search_index.0.i3.1ce43a81N1BzOw" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M870.62 240.77H467.21c0-49.51-40.14-89.64-89.64-89.64H153.46c-49.53 0-89.65 40.13-89.65 89.64v627.52c0 49.51 40.12 89.65 89.65 89.65h717.17c49.52 0 89.64-40.13 89.64-89.65V330.42c-0.01-49.51-40.13-89.65-89.65-89.65z m0 582.69c0 24.76-20.08 44.82-44.83 44.82H198.28c-24.75 0-44.82-20.07-44.82-44.82V509.71h717.17v313.75z m-44.83-403.39H153.46v-179.3c0.22 0.23 20.07 0 44.82 0h134.47c24.75 0 44.77 0.06 44.83 0v89.65H825.8c24.75 0 44.83 20.07 44.83 44.82-0.01 24.75-20.09 44.83-44.84 44.83z" fill="#dbdbdb" p-id="8865"></path></svg>

BIN
ruoyi-ui/src/assets/da/asset/arrow.png


+ 3 - 0
ruoyi-ui/src/assets/da/asset/arrow.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="12.463" height="7.588" viewBox="0 0 12.463 7.588">
+  <path id="路径_23457" data-name="路径 23457" d="M518.213,91.562l.409-.409-5.636-5.637a.578.578,0,1,0-.817.818l4.817,4.818-4.817,4.816a.578.578,0,0,0,.817.818l5.2-5.2.024-.023Z" transform="translate(97.354 -511.6) rotate(90)" fill="#376afc" stroke="#3367fc" stroke-width="0.8"/>
+</svg>

BIN
ruoyi-ui/src/assets/da/asset/empty.png


+ 6 - 0
ruoyi-ui/src/assets/da/asset/file.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="14.064" height="15.543" viewBox="0 0 14.064 15.543">
+  <g id="组_24414" data-name="组 24414" transform="translate(14449.911 21377.951)">
+    <path id="路径_23163" data-name="路径 23163" d="M130.967,91.266h2.967v2.967h-2.967Zm0,4.45h7.416V97.2h-7.416Zm4.45-3.708h2.967v1.483h-2.967Z" transform="translate(-14577.554 -21465.93)" fill="#2665fb"/>
+    <path id="路径_23186" data-name="路径 23186" d="M118.88,42.667a1.81,1.81,0,0,1,1.851,1.766v12.01a1.81,1.81,0,0,1-1.851,1.766H108.517a1.81,1.81,0,0,1-1.851-1.766V44.433a1.81,1.81,0,0,1,1.851-1.766H118.88Zm0,1.413H108.517a.362.362,0,0,0-.37.353v12.01a.362.362,0,0,0,.37.353H118.88a.362.362,0,0,0,.37-.353V44.433A.362.362,0,0,0,118.88,44.08Zm-2.221,9.891a.707.707,0,1,1,0,1.413h-5.922a.707.707,0,1,1,0-1.413h5.922Z" transform="translate(-14556.577 -21420.617)" fill="#2665fb"/>
+  </g>
+</svg>

+ 6 - 0
ruoyi-ui/src/assets/da/asset/folder.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16.758" height="15.213" viewBox="0 0 16.758 15.213">
+  <g id="组_23951" data-name="组 23951" transform="translate(14442.879 21416.594)">
+    <path id="路径_23160" data-name="路径 23160" d="M89.871,133.071h15.066a.845.845,0,0,1,.843.915l-.7,8.452a.845.845,0,0,1-.842.775H90.575a.845.845,0,0,1-.842-.775l-.7-8.452a.845.845,0,0,1,.843-.915Zm1.482,8.452h12.1l.563-6.762H90.79ZM98.6,129.691h5.566a.845.845,0,0,1,.845.845v.845H89.8v-2.536a.845.845,0,0,1,.845-.845h6.266l1.69,1.69Z" transform="translate(-14531.904 -21544.594)" fill="#2665fb"/>
+    <path id="路径_23162" data-name="路径 23162" d="M21.647,75.883H16.879a.7.7,0,0,1,0-1.409h4.768a.7.7,0,0,1,0,1.409Zm0,2.787H16.879a.7.7,0,1,1,0-1.409h4.768a.7.7,0,1,1,0,1.409ZM13.51,75.179a.752.752,0,1,0,.752-.752A.752.752,0,0,0,13.51,75.179Zm0,2.787a.752.752,0,1,0,.752-.752A.752.752,0,0,0,13.51,77.966Z" transform="translate(-14452.51 -21483.219)" fill="#2665fb"/>
+  </g>
+</svg>

+ 1 - 0
ruoyi-ui/src/assets/da/asset/h2 (1).svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1752567827253" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7888" xmlns:xlink="http://www.w3.org/1999/xlink" width="256" height="256"><path d="M731.136 142.222222H292.636444c-32.369778 0-63.374222 11.832889-86.243555 32.995556A108.373333 108.373333 0 0 0 170.666667 254.805333v548.181334c0 13.312 3.982222 26.339556 11.377777 37.774222 7.395556 11.377778 18.090667 20.707556 30.833778 26.965333a84.935111 84.935111 0 0 0 81.692445-4.096l172.771555-108.259555c9.500444-5.973333 20.707556-9.216 32.199111-9.386667 11.491556-0.170667 22.755556 2.730667 32.540445 8.362667l199.566222 116.167111a84.764444 84.764444 0 0 0 80.668444 2.161778c12.458667-6.371556 22.755556-15.644444 30.037334-26.908445 7.168-11.320889 10.979556-24.177778 10.979555-37.262222V254.805333c0-14.791111-3.185778-29.468444-9.329777-43.121777a112.355556 112.355556 0 0 0-26.453334-36.579556c-11.377778-10.467556-24.860444-18.773333-39.651555-24.348444a130.844444 130.844444 0 0 0-46.762667-8.533334z" fill="#266EFF" p-id="7889"></path><path d="M284.444444 312.888889m42.666667 0l369.777778 0q42.666667 0 42.666667 42.666667l0 0q0 42.666667-42.666667 42.666666l-369.777778 0q-42.666667 0-42.666667-42.666666l0 0q0-42.666667 42.666667-42.666667Z" fill="#FFFFFF" p-id="7890"></path><path d="M284.444444 483.555556m42.666667 0l199.111111 0q42.666667 0 42.666667 42.666666l0 0q0 42.666667-42.666667 42.666667l-199.111111 0q-42.666667 0-42.666667-42.666667l0 0q0-42.666667 42.666667-42.666666Z" fill="#FFFFFF" p-id="7891"></path></svg>

+ 1 - 0
ruoyi-ui/src/assets/da/asset/h2 (2).svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1752567728042" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3509" xmlns:xlink="http://www.w3.org/1999/xlink" width="256" height="256"><path d="M511.978359 280.670486m44.790137 44.790136l141.850361 141.850362q44.790136 44.790136 0 89.580273l-141.850361 141.850361q-44.790136 44.790136-89.580273 0l-141.850362-141.850361q-44.790136-44.790136 0-89.580273l141.850362-141.850362q44.790136-44.790136 89.580273 0Z" fill="#1890FF" p-id="3510"></path><path d="M512.018369 1023.873314a63.342818 63.342818 0 0 1-44.720029-18.496103L18.577815 556.783373a63.342818 63.342818 0 0 1 0-89.630088L467.29834 18.496103a63.342818 63.342818 0 0 1 89.566745 0l448.84721 448.467153a63.342818 63.342818 0 0 1 0 89.630088L556.801742 1005.377211a63.342818 63.342818 0 0 1-44.783373 18.496103zM512.018369 63.342818L63.361188 511.936657l448.657181 448.720525 448.657182-448.720525L512.018369 63.279475z m22.360015-22.423357l-22.423357 22.360014z" fill="#1890FF" p-id="3511"></path></svg>

File diff suppressed because it is too large
+ 0 - 0
ruoyi-ui/src/assets/da/asset/h2 (3).svg


+ 1 - 0
ruoyi-ui/src/assets/da/asset/h2 (4).svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1752567784979" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5861" xmlns:xlink="http://www.w3.org/1999/xlink" width="256" height="256"><path d="M899.498667 173.141333L536.746667 23.125333c-8.533333-3.157333-14.250667-3.157333-19.968 0L149.76 185.856c-19.968 9.514667-19.968 38.144-2.858667 47.658667L506.069333 409.6c5.717333 6.4 14.250667 6.4 22.784 0l373.461334-192c17.152-9.557333 17.152-34.986667-2.816-44.501333" fill="#2B6EE5" p-id="5862"></path><path d="M499.541333 465.792c0-9.984-2.858667-20.053333-11.477333-23.381333L131.84 254.08c-14.336-10.026667-34.474667 3.370667-34.474667 23.338667v447.36c0 10.026667 5.76 20.053333 11.52 23.381333 231.68 156.458667 353.28 239.146667 364.8 248.064 17.237333 13.354667 31.658667-23.04 28.8-39.68l-2.901333-490.752z" fill="#2B6EE5" p-id="5863"></path><path d="M857.472 300.970667a53.333333 53.333333 0 0 1 52.48 92.714666l-4.778667 2.688-261.333333 130.645334a53.333333 53.333333 0 0 1-52.48-92.714667l4.778667-2.688 261.333333-130.645333zM857.472 529.621333a53.333333 53.333333 0 0 1 52.48 92.714667l-4.778667 2.688-261.333333 130.688a53.333333 53.333333 0 0 1-52.48-92.714667l4.778667-2.688 261.333333-130.688zM857.472 715.648a53.333333 53.333333 0 0 1 52.48 92.714667l-4.778667 2.688-261.333333 130.645333a53.333333 53.333333 0 0 1-52.48-92.714667l4.778667-2.688 261.333333-130.645333z" fill="#2B6EE5" p-id="5864"></path></svg>

BIN
ruoyi-ui/src/assets/da/asset/icon (1).png


BIN
ruoyi-ui/src/assets/da/asset/icon (2).png


BIN
ruoyi-ui/src/assets/da/asset/icon (3).png


BIN
ruoyi-ui/src/assets/da/asset/icon (4).png


BIN
ruoyi-ui/src/assets/da/asset/icon (5).png


BIN
ruoyi-ui/src/assets/da/asset/icon (6).png


BIN
ruoyi-ui/src/assets/da/asset/icon (7).png


BIN
ruoyi-ui/src/assets/da/asset/icon (8).png


BIN
ruoyi-ui/src/assets/da/asset/icon (9).png


+ 3 - 0
ruoyi-ui/src/assets/da/asset2/btn (1).svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="13.113" height="11.926" viewBox="0 0 13.113 11.926">
+  <path id="路径_23817" data-name="路径 23817" d="M47.508,51.219,42.078,56.65a.512.512,0,0,0,0,.724L47.508,62.8a.512.512,0,0,0,.874-.362V59.454l.1.006a7.284,7.284,0,0,1,5.391,2.951l.292.4A.461.461,0,0,0,55,62.561l.031-.491q.014-.225.014-.45V61.5a7.042,7.042,0,0,0-6.578-6.911l-.079,0V51.581a.512.512,0,0,0-.874-.362ZM47.1,53.435v2.453l.759-.027h.233a5.764,5.764,0,0,1,5.475,4.285l.024.094-.06-.051A8.555,8.555,0,0,0,48,58.164q-.138,0-.276,0l-.62.02v2.4l-3.576-3.576Z" transform="translate(-41.927 -51.068)" fill="#FF7A00"/>
+</svg>

+ 11 - 0
ruoyi-ui/src/assets/da/asset2/btn (2).svg

@@ -0,0 +1,11 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="11.181" height="11.91" viewBox="0 0 11.181 11.91">
+  <g id="组_24734" data-name="组 24734" transform="translate(-38.3 -6.301)">
+    <path id="路径_23410" data-name="路径 23410" d="M47.828,18.111H40.02a1.635,1.635,0,0,1-1.62-1.62V8.02A1.635,1.635,0,0,1,40.02,6.4h7.734a1.635,1.635,0,0,1,1.62,1.62v4.935a.475.475,0,0,1-.442.442.412.412,0,0,1-.368-.442V8.02a.738.738,0,0,0-.737-.737H40.02a.738.738,0,0,0-.737.737v8.47a.738.738,0,0,0,.737.737h7.734a.738.738,0,0,0,.737-.737V15.018a.442.442,0,1,1,.884,0v1.473a1.528,1.528,0,0,1-1.547,1.62Z" fill="#3d446e" stroke="#3d446e" stroke-width="0.2"/>
+    <path id="路径_23411" data-name="路径 23411" d="M198.842,262.842m-.442,0a.442.442,0,1,0,.442-.442A.442.442,0,0,0,198.4,262.842Z" transform="translate(-158.159 -253.054)" fill="#3d446e" stroke="#3d446e" stroke-width="0.2"/>
+    <path id="路径_23412" data-name="路径 23412" d="M350.682,263.284h-4.64a.425.425,0,0,1-.442-.442.475.475,0,0,1,.442-.442h4.64a.442.442,0,1,1,0,.884Z" transform="translate(-303.665 -253.054)" fill="#3d446e" stroke="#3d446e" stroke-width="0.2"/>
+    <path id="路径_23413" data-name="路径 23413" d="M198.842,474.042m-.442,0a.442.442,0,1,0,.442-.442A.442.442,0,0,0,198.4,474.042Z" transform="translate(-158.159 -461.823)" fill="#3d446e" stroke="#3d446e" stroke-width="0.2"/>
+    <path id="路径_23414" data-name="路径 23414" d="M350.682,474.484h-4.64a.425.425,0,0,1-.442-.442.475.475,0,0,1,.442-.442h4.64a.442.442,0,1,1,0,.884Z" transform="translate(-303.665 -461.823)" fill="#3d446e" stroke="#3d446e" stroke-width="0.2"/>
+    <path id="路径_23415" data-name="路径 23415" d="M198.842,685.242m-.442,0a.442.442,0,1,0,.442-.442A.442.442,0,0,0,198.4,685.242Z" transform="translate(-158.159 -670.592)" fill="#3d446e" stroke="#3d446e" stroke-width="0.2"/>
+    <path id="路径_23416" data-name="路径 23416" d="M350.682,685.684h-4.64a.442.442,0,0,1,0-.884h4.64a.475.475,0,0,1,.442.442A.425.425,0,0,1,350.682,685.684Z" transform="translate(-303.665 -670.592)" fill="#3d446e" stroke="#3d446e" stroke-width="0.2"/>
+  </g>
+</svg>

+ 4 - 0
ruoyi-ui/src/assets/da/asset2/btn (3).svg

@@ -0,0 +1,4 @@
+<svg id="arrow-down-s-line_1_" data-name="arrow-down-s-line (1)" xmlns="http://www.w3.org/2000/svg" width="14.712" height="14" viewBox="0 0 14.712 14">
+  <path id="路径" d="M0,0H14V14H0Z" fill="none"/>
+  <path id="路径-2" data-name="路径" d="M4.7,3.652,8.347,0,9.39,1.043l-4.7,4.7L0,1.043,1.043,0Z" transform="translate(2.322 4.595)" fill="#3d446e"/>
+</svg>

+ 6 - 0
ruoyi-ui/src/assets/da/asset2/btn (4).svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="11.939" height="12.088" viewBox="0 0 11.939 12.088">
+  <g id="组_24747" data-name="组 24747" transform="translate(-97.789 -113.498)">
+    <path id="路径_23821" data-name="路径 23821" d="M393.6,125.606a.539.539,0,0,1-.539-.539v-3.1a.537.537,0,0,1,.122-.342l6.487-7.905a.54.54,0,0,1,.951.417l-1.476,10.507a.538.538,0,0,1-.778.4L395,123.329a.539.539,0,1,1,.489-.96l2.695,1.372,1.1-7.857-5.147,6.271v2.911A.54.54,0,0,1,393.6,125.606Z" transform="translate(-290.901 -0.02)" fill="#039792"/>
+    <path id="路径_23822" data-name="路径 23822" d="M101.077,121.738a.552.552,0,0,1-.246-.059l-2.751-1.42a.54.54,0,0,1,0-.956l10.861-5.742a.539.539,0,1,1,.5.953l-9.949,5.261,1.834.947a.539.539,0,0,1-.248,1.018Z" transform="translate(0)" fill="#039792"/>
+  </g>
+</svg>

+ 6 - 0
ruoyi-ui/src/assets/da/asset2/fen (1).svg

@@ -0,0 +1,6 @@
+<svg id="组_24733" data-name="组 24733" xmlns="http://www.w3.org/2000/svg" width="15.781" height="15.781" viewBox="0 0 15.781 15.781">
+  <path id="路径_23403" data-name="路径 23403" d="M0,0,0,0H15.781V15.781H0V0Z" fill="#e8eff8"/>
+  <path id="路径_23404" data-name="路径 23404" d="M139.636,628.722a.359.359,0,0,1,.359-.359h10.76a.359.359,0,0,1,.359.359v1.793a.359.359,0,0,1-.359.359h-10.76a.359.359,0,0,1-.359-.359v-1.793Z" transform="translate(-137.484 -618.679)" fill="#2666fb"/>
+  <path id="路径_23405" data-name="路径 23405" d="M139.636,213.041a.359.359,0,0,1,.359-.359h6.1a.359.359,0,0,1,.359.359v1.793a.359.359,0,0,1-.359.359h-6.1a.359.359,0,0,1-.359-.359v-1.793Zm6.815-3.228a.359.359,0,0,0-.359-.359h-6.1a.359.359,0,0,0-.359.359v1.793a.359.359,0,0,0,.359.359h6.1a.359.359,0,0,0,.359-.359v-1.793Z" transform="translate(-137.484 -206.226)" fill="#2666fb"/>
+  <path id="路径_23406" data-name="路径 23406" d="M653.429,259.586a1.793,1.793,0,1,0-1.793-1.793A1.793,1.793,0,0,0,653.429,259.586Z" transform="translate(-641.593 -252.054)" fill="#2666fb"/>
+</svg>

+ 10 - 0
ruoyi-ui/src/assets/da/asset2/fen (2).svg

@@ -0,0 +1,10 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="15.781" height="15.781" viewBox="0 0 15.781 15.781">
+  <g id="组_24730" data-name="组 24730" transform="translate(-1595 -431.219)">
+    <g id="组_24206" data-name="组 24206" transform="translate(-141 -31)">
+      <g id="组_24204" data-name="组 24204" transform="translate(1736 462.219)">
+        <path id="路径_23403" data-name="路径 23403" d="M0,0,0,0H15.781V15.781H0V0Z" fill="#e8eff8"/>
+      </g>
+    </g>
+    <path id="路径_23409" data-name="路径 23409" d="M47.523,128.486h4.857v.971H47.523Zm-2.429,1.457v1.943h-.971v-1.943H42.666L44.609,128l1.943,1.943Zm0,4.857h1.457l-1.943,1.943L42.666,134.8h1.457v-1.943h.971V134.8Zm2.429.486h4.857v.971H47.523Zm-.971-3.4h5.829v.971H46.552v-.971Z" transform="translate(1555.368 306.737)" fill="#2666fb" stroke="#2666fb" stroke-width="0.6"/>
+  </g>
+</svg>

+ 10 - 0
ruoyi-ui/src/assets/da/asset2/fen (3).svg

@@ -0,0 +1,10 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="15.781" height="15.781" viewBox="0 0 15.781 15.781">
+  <g id="组_24731" data-name="组 24731" transform="translate(-1595 -431.219)">
+    <g id="组_24206" data-name="组 24206" transform="translate(-141 -31)">
+      <g id="组_24204" data-name="组 24204" transform="translate(1736 462.219)">
+        <path id="路径_23403" data-name="路径 23403" d="M0,0,0,0H15.781V15.781H0V0Z" fill="#e8eff8"/>
+      </g>
+    </g>
+    <path id="路径_23409" data-name="路径 23409" d="M47.523,128.486h4.857v.971H47.523Zm-2.429,1.457v1.943h-.971v-1.943H42.666L44.609,128l1.943,1.943Zm0,4.857h1.457l-1.943,1.943L42.666,134.8h1.457v-1.943h.971V134.8Zm2.429.486h4.857v.971H47.523Zm-.971-3.4h5.829v.971H46.552v-.971Z" transform="translate(1735.263 391.586) rotate(90)" fill="#2666fb" stroke="#2666fb" stroke-width="0.6"/>
+  </g>
+</svg>

+ 8 - 0
ruoyi-ui/src/assets/da/asset2/fen (4).svg

@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="15.781" height="15.781" viewBox="0 0 15.781 15.781">
+  <g id="组_24732" data-name="组 24732" transform="translate(-1736 -462.219)">
+    <g id="组_24204" data-name="组 24204" transform="translate(1736 462.219)">
+      <path id="路径_23403" data-name="路径 23403" d="M0,0,0,0H15.781V15.781H0V0Z" fill="#e8eff8"/>
+    </g>
+    <path id="路径_23408" data-name="路径 23408" d="M224.583,222.641l-2.1-3.8.243-.728a2.753,2.753,0,0,0,.081-.809,3.284,3.284,0,0,0-.324-1.538,4.536,4.536,0,0,0-.809-1.214,3.2,3.2,0,0,0-1.214-.809,2.209,2.209,0,0,0-1.457-.4,3.284,3.284,0,0,0-1.538.324,3.985,3.985,0,0,0-1.214.809,3.2,3.2,0,0,0-.809,1.214,3.284,3.284,0,0,0-.324,1.538,2.5,2.5,0,0,0,.081.809c.081.243.162.486.243.809l-2.1,3.8v.162c0,.081,0,.162.081.162,0,.081.081.081.162.162h.162l1.781-.4.647,1.7c0,.081.081.081.081.162a.3.3,0,0,0,.243.081c.081,0,.081,0,.162-.081.081,0,.081-.081.162-.162l1.781-3.4h.647l1.861,3.4c0,.081.081.081.162.162.162.081.162.081.243.081s.162,0,.162-.081.081-.081.081-.162l.647-1.7,1.781.4h.162c.081,0,.081-.081.162-.081a.251.251,0,0,0,.081-.162C224.664,222.722,224.664,222.722,224.583,222.641ZM219,220.294a3.074,3.074,0,0,1-3.075-3.075A3.006,3.006,0,0,1,219,214.224a3.074,3.074,0,0,1,3.075,3.075A3.006,3.006,0,0,1,219,220.294Zm-2.428-3.075A2.506,2.506,0,0,0,219,219.727a2.453,2.453,0,0,0,2.428-2.509A2.506,2.506,0,0,0,219,214.709,2.56,2.56,0,0,0,216.57,217.218Z" transform="translate(1524.902 251.109)" fill="#ffab47"/>
+  </g>
+</svg>

File diff suppressed because it is too large
+ 3 - 0
ruoyi-ui/src/assets/da/asset2/tit.svg


File diff suppressed because it is too large
+ 8 - 0
ruoyi-ui/src/assets/dpp/etl/bg.svg


+ 9 - 0
ruoyi-ui/src/assets/dpp/etl/cg.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
+  <g id="组_24170" data-name="组 24170" transform="translate(-627 -263)">
+    <g id="路径_23381" data-name="路径 23381" transform="translate(627 263)" fill="#36b342">
+      <path d="M 8 15.5 C 3.864490032196045 15.5 0.5 12.13551044464111 0.5 8 C 0.5 3.864490032196045 3.864490032196045 0.5 8 0.5 C 12.13551044464111 0.5 15.5 3.864490032196045 15.5 8 C 15.5 12.13551044464111 12.13551044464111 15.5 8 15.5 Z" stroke="none"/>
+      <path d="M 8 1 C 4.140190124511719 1 1 4.140190124511719 1 8 C 1 11.85980987548828 4.140190124511719 15 8 15 C 11.85980987548828 15 15 11.85980987548828 15 8 C 15 4.140190124511719 11.85980987548828 1 8 1 M 8 0 C 12.41827964782715 0 16 3.581720352172852 16 8 C 16 12.41827964782715 12.41827964782715 16 8 16 C 3.581720352172852 16 0 12.41827964782715 0 8 C 0 3.581720352172852 3.581720352172852 0 8 0 Z" stroke="none" fill="#fff"/>
+    </g>
+    <path id="路径_23380" data-name="路径 23380" d="M122.921,244.239l-4.3,4.3a.818.818,0,0,1-1.139,0l-2.372-2.386a.794.794,0,0,1,0-1.125.81.81,0,0,1,1.139,0l1.816,1.816,3.727-3.727a.8.8,0,0,1,1.125,1.125Z" transform="translate(515.982 25.677)" fill="#fff"/>
+  </g>
+</svg>

BIN
ruoyi-ui/src/assets/dpp/etl/circle-check.png


BIN
ruoyi-ui/src/assets/dpp/etl/circle-close.png


BIN
ruoyi-ui/src/assets/dpp/etl/circle-subtract.png


BIN
ruoyi-ui/src/assets/dpp/etl/circle-subtract1.png


+ 10 - 0
ruoyi-ui/src/assets/dpp/etl/dd.svg

@@ -0,0 +1,10 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
+  <g id="组_24173" data-name="组 24173" transform="translate(-627 -263)">
+    <g id="路径_23381" data-name="路径 23381" transform="translate(627 263)" fill="#ff9800">
+      <path d="M 8 15.5 C 3.864490032196045 15.5 0.5 12.13551044464111 0.5 8 C 0.5 3.864490032196045 3.864490032196045 0.5 8 0.5 C 12.13551044464111 0.5 15.5 3.864490032196045 15.5 8 C 15.5 12.13551044464111 12.13551044464111 15.5 8 15.5 Z" stroke="none"/>
+      <path d="M 8 1 C 4.140190124511719 1 1 4.140190124511719 1 8 C 1 11.85980987548828 4.140190124511719 15 8 15 C 11.85980987548828 15 15 11.85980987548828 15 8 C 15 4.140190124511719 11.85980987548828 1 8 1 M 8 0 C 12.41827964782715 0 16 3.581720352172852 16 8 C 16 12.41827964782715 12.41827964782715 16 8 16 C 3.581720352172852 16 0 12.41827964782715 0 8 C 0 3.581720352172852 3.581720352172852 0 8 0 Z" stroke="none" fill="#fff"/>
+    </g>
+    <path id="路径_23383" data-name="路径 23383" d="M242.785,65.707v5.505c0,.23-.26.417-.581.417s-.581-.187-.581-.417V65.707c0-.23.26-.417.581-.417S242.785,65.477,242.785,65.707Zm3.6-.417c-.321,0-.581.187-.581.417v5.505c0,.23.26.417.581.417s.581-.187.581-.417V65.707C246.971,65.477,246.711,65.29,246.39,65.29Z" transform="translate(390.703 202.789)" fill="#fff"/>
+    <path id="路径_23383_-_轮廓" data-name="路径 23383 - 轮廓" d="M242.2,65.04a.755.755,0,0,1,.831.667v5.505a.852.852,0,0,1-1.663,0V65.707A.755.755,0,0,1,242.2,65.04Zm0,6.339c.2,0,.331-.1.331-.167V65.707c0-.067-.132-.167-.331-.167s-.331.1-.331.167v5.505C241.873,71.279,242,71.379,242.2,71.379Zm4.186-6.339a.755.755,0,0,1,.831.667v5.505a.852.852,0,0,1-1.663,0V65.707A.755.755,0,0,1,246.39,65.04Zm0,6.339c.2,0,.331-.1.331-.167V65.707c0-.067-.132-.167-.331-.167s-.331.1-.331.167v5.505C246.058,71.279,246.19,71.379,246.39,71.379Z" transform="translate(390.703 202.789)" fill="#fff"/>
+  </g>
+</svg>

+ 16 - 0
ruoyi-ui/src/assets/dpp/etl/sb.svg

@@ -0,0 +1,16 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
+  <g id="组_24175" data-name="组 24175" transform="translate(-953 -261)">
+    <g id="组_24177" data-name="组 24177">
+      <g id="组_24168" data-name="组 24168" transform="translate(326 -2)">
+        <g id="路径_23381" data-name="路径 23381" transform="translate(627 263)" fill="#f43">
+          <path d="M 8 15.5 C 3.864490032196045 15.5 0.5 12.13551044464111 0.5 8 C 0.5 3.864490032196045 3.864490032196045 0.5 8 0.5 C 12.13551044464111 0.5 15.5 3.864490032196045 15.5 8 C 15.5 12.13551044464111 12.13551044464111 15.5 8 15.5 Z" stroke="none"/>
+          <path d="M 8 1 C 4.140190124511719 1 1 4.140190124511719 1 8 C 1 11.85980987548828 4.140190124511719 15 8 15 C 11.85980987548828 15 15 11.85980987548828 15 8 C 15 4.140190124511719 11.85980987548828 1 8 1 M 8 0 C 12.41827964782715 0 16 3.581720352172852 16 8 C 16 12.41827964782715 12.41827964782715 16 8 16 C 3.581720352172852 16 0 12.41827964782715 0 8 C 0 3.581720352172852 3.581720352172852 0 8 0 Z" stroke="none" fill="#fff"/>
+        </g>
+      </g>
+      <g id="组_24169" data-name="组 24169" transform="translate(946.684 254.684)">
+        <path id="路径_23385" data-name="路径 23385" d="M322.669,321.754l2.01-2.01a.647.647,0,0,0-.915-.915l-2.01,2.01-2.01-2.01a.647.647,0,0,0-.915.915l2.01,2.01-2.01,2.01a.647.647,0,0,0,.915.915l2.01-2.01,2.01,2.01a.647.647,0,0,0,.915-.915l-2.01-2.01Z" transform="translate(-307.438 -307.438)" fill="#fff"/>
+        <path id="路径_23385_-_轮廓" data-name="路径 23385 - 轮廓" d="M324.222,325.018a.792.792,0,0,1-.563-.233l-1.9-1.9-1.9,1.9a.8.8,0,1,1-1.127-1.127l1.9-1.9-1.9-1.9a.8.8,0,0,1,1.127-1.127l1.9,1.9,1.9-1.9a.8.8,0,1,1,1.127,1.127l-1.9,1.9,1.9,1.9a.8.8,0,0,1-.563,1.36Zm-2.467-2.562,2.116,2.116a.5.5,0,1,0,.7-.7l-1.966-1.966h-.3l2.266-2.266a.5.5,0,0,0-.7-.7l-2.116,2.116-2.116-2.116a.5.5,0,0,0-.7.7l2.116,2.116-2.116,2.116a.5.5,0,0,0,.7.7Z" transform="translate(-307.438 -307.438)" fill="#fff"/>
+      </g>
+    </g>
+  </g>
+</svg>

+ 3 - 0
ruoyi-ui/src/assets/dpp/etl/title (1).svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="11.102" height="11.934" viewBox="0 0 11.102 11.934">
+  <path id="路径_23513" data-name="路径 23513" d="M114.928,83h-1.54a.389.389,0,0,0-.389.389v9.159a.389.389,0,0,0,.389.389h.444v-2.98a.944.944,0,0,1,.276-.667l.711-.711a.944.944,0,0,1,.667-.276h4.128a.944.944,0,0,1,.667.276l.711.711a.944.944,0,0,1,.276.667v2.98h.444a.389.389,0,0,0,.389-.389V85.8a.389.389,0,0,0-.114-.275l-1.815-1.815v2.319a.5.5,0,0,1-.5.5h-4.246a.5.5,0,0,1-.5-.5Zm1,0v2.526h3.247V83Zm7.174,2.8v6.751a1.388,1.388,0,0,1-1.388,1.388h-8.326A1.388,1.388,0,0,1,112,92.546V83.388A1.388,1.388,0,0,1,113.388,82h5.918a1.388,1.388,0,0,1,.981.406l2.408,2.408a1.388,1.388,0,0,1,.406.981Zm-3.51,3.5H115.51l-.679.679v2.957h5.44V89.978Zm-1.784-5.53a.5.5,0,0,1,1,0v.9a.5.5,0,1,1-1,0Z" transform="translate(-112 -82)" fill="#2666fb"/>
+</svg>

+ 6 - 0
ruoyi-ui/src/assets/dpp/etl/title (2).svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="12.408" height="11.597" viewBox="0 0 12.408 11.597">
+  <g id="组_24443" data-name="组 24443" transform="translate(-31.9 -38.3)">
+    <path id="路径_23504" data-name="路径 23504" d="M38.165,118.29H33.3a1.2,1.2,0,0,1-1.3-1.136v-7.219a1.2,1.2,0,0,1,1.3-1.136h1.541v.811H33.3c-.243,0-.487.162-.487.324v7.219c0,.162.243.324.487.324h4.867Zm5.191-4.948h-.811v-3.407c0-.162-.243-.324-.487-.324H40.841V108.8h1.217a1.2,1.2,0,0,1,1.3,1.136ZM36.137,108.8h3.488v.73H36.137Z" transform="translate(0 -69.508)" fill="#2666fb" stroke="#2666fb" stroke-width="0.2"/>
+    <path id="路径_23505" data-name="路径 23505" d="M237.692,40.752a.435.435,0,0,1-.406-.406V38.806a.383.383,0,0,1,.406-.406h.081a.383.383,0,0,1,.406.406v1.541C238.1,40.509,237.936,40.752,237.692,40.752Zm4.7,0a.454.454,0,0,1-.487-.406V38.806a.383.383,0,0,1,.406-.406h.081a.383.383,0,0,1,.406.406v1.541A.435.435,0,0,1,242.4,40.752Zm-5.6,1.622h6.408v.73H236.8Zm0,2.677h3.082v.73H236.8Zm6.165,3.65a2.516,2.516,0,0,1-1.784-.73,2.618,2.618,0,0,1-.649-1.7,2.7,2.7,0,0,1,.73-1.7,2.618,2.618,0,0,1,1.7-.649,2.7,2.7,0,0,1,1.7.73,2.618,2.618,0,0,1,.649,1.7,2.7,2.7,0,0,1-.73,1.7A2.412,2.412,0,0,1,242.965,48.7Zm0-3.975a1.542,1.542,0,0,0-1.054.406,1.473,1.473,0,0,0-.487,1.136,1.938,1.938,0,0,0,.406,1.136,1.641,1.641,0,0,0,2.271.081,1.473,1.473,0,0,0,.487-1.136,1.938,1.938,0,0,0-.406-1.136,1.651,1.651,0,0,0-1.217-.487Zm3.326,4.948a.493.493,0,0,1-.649,0l-.892-.892a.459.459,0,1,1,.649-.649l.892.892A.493.493,0,0,1,246.29,49.675Z" transform="translate(-202.204)" fill="#2666fb" stroke="#2666fb" stroke-width="0.2"/>
+  </g>
+</svg>

+ 8 - 0
ruoyi-ui/src/assets/dpp/etl/title (3).svg

@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="11.404" height="11.804" viewBox="0 0 11.404 11.804">
+  <g id="组_24446" data-name="组 24446" transform="translate(-40.006 -34.56)">
+    <path id="路径_23509" data-name="路径 23509" d="M44.583,46.364H41.414a1.383,1.383,0,0,1-1.408-1.353v-9.1a1.383,1.383,0,0,1,1.408-1.353H50a1.383,1.383,0,0,1,1.408,1.353v3.794a.57.57,0,1,1-1.14,0V35.913A.248.248,0,0,0,50,35.7H41.414a.248.248,0,0,0-.267.213v9.1a.248.248,0,0,0,.267.213h3.169a.57.57,0,0,1,0,1.14Z" fill="#2666fb"/>
+    <path id="路径_23510" data-name="路径 23510" d="M534.177,601.634a.57.57,0,0,1-.4-.973l3.5-3.5a.57.57,0,1,1,.806.806l-3.5,3.5A.569.569,0,0,1,534.177,601.634Z" transform="translate(-487.555 -555.542)" fill="#2666fb"/>
+    <path id="路径_23511" data-name="路径 23511" d="M240.484,210.981a.568.568,0,0,1-.4-.167l-3.5-3.5a.57.57,0,1,1,.806-.806l3.5,3.5a.57.57,0,0,1-.4.974Zm-1.7-8.346H233.3a.57.57,0,0,1,0-1.14h5.483a.57.57,0,1,1,0,1.14ZM236.47,204.7H233.3a.57.57,0,0,1,0-1.14h3.172a.57.57,0,0,1,0,1.14Z" transform="translate(-190.361 -164.89)" fill="#2666fb"/>
+    <path id="路径_23512" data-name="路径 23512" d="M222.058,553.356h-1.746a.57.57,0,0,1,0-1.14h1.746a.57.57,0,0,1,0,1.14Z" transform="translate(-177.534 -511.314)" fill="#2666fb"/>
+  </g>
+</svg>

+ 3 - 0
ruoyi-ui/src/assets/dpp/etl/title (4).svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="11" height="11.324" viewBox="0 0 11 11.324">
+  <path id="路径_23503" data-name="路径 23503" d="M152.665,157.1a1.78,1.78,0,0,1,1.712,1.294h6.382v.971h-6.382a1.78,1.78,0,0,1-3.425,0H149.76v-.971h1.193A1.78,1.78,0,0,1,152.665,157.1Zm0,.971a.809.809,0,1,0,.809.809A.809.809,0,0,0,152.665,158.068Zm5.176-4.853a1.78,1.78,0,0,1,1.712,1.294h1.206v.971h-1.206a1.78,1.78,0,0,1-3.425,0H149.76v-.971h6.369A1.78,1.78,0,0,1,157.842,153.215Zm0,.971a.809.809,0,1,0,.809.809A.809.809,0,0,0,157.842,154.186Zm-5.176-4.853a1.78,1.78,0,0,1,1.712,1.294h6.382v.971h-6.382a1.78,1.78,0,0,1-3.425,0H149.76v-.971h1.193A1.78,1.78,0,0,1,152.665,149.333Zm0,.971a.809.809,0,1,0,.809.809A.809.809,0,0,0,152.665,150.3Z" transform="translate(-149.76 -149.333)" fill="#2666fb"/>
+</svg>

+ 3 - 0
ruoyi-ui/src/assets/dpp/etl/title-act (1).svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="11.102" height="11.934" viewBox="0 0 11.102 11.934">
+  <path id="路径_23513" data-name="路径 23513" d="M114.928,83h-1.54a.389.389,0,0,0-.389.389v9.159a.389.389,0,0,0,.389.389h.444v-2.98a.944.944,0,0,1,.276-.667l.711-.711a.944.944,0,0,1,.667-.276h4.128a.944.944,0,0,1,.667.276l.711.711a.944.944,0,0,1,.276.667v2.98h.444a.389.389,0,0,0,.389-.389V85.8a.389.389,0,0,0-.114-.275l-1.815-1.815v2.319a.5.5,0,0,1-.5.5h-4.246a.5.5,0,0,1-.5-.5Zm1,0v2.526h3.247V83Zm7.174,2.8v6.751a1.388,1.388,0,0,1-1.388,1.388h-8.326A1.388,1.388,0,0,1,112,92.546V83.388A1.388,1.388,0,0,1,113.388,82h5.918a1.388,1.388,0,0,1,.981.406l2.408,2.408a1.388,1.388,0,0,1,.406.981Zm-3.51,3.5H115.51l-.679.679v2.957h5.44V89.978Zm-1.784-5.53a.5.5,0,0,1,1,0v.9a.5.5,0,1,1-1,0Z" transform="translate(-112 -82)" fill="#fff"/>
+</svg>

+ 6 - 0
ruoyi-ui/src/assets/dpp/etl/title-act (2).svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="12.408" height="11.597" viewBox="0 0 12.408 11.597">
+  <g id="组_24443" data-name="组 24443" transform="translate(-31.9 -38.3)">
+    <path id="路径_23504" data-name="路径 23504" d="M38.165,118.29H33.3a1.2,1.2,0,0,1-1.3-1.136v-7.219a1.2,1.2,0,0,1,1.3-1.136h1.541v.811H33.3c-.243,0-.487.162-.487.324v7.219c0,.162.243.324.487.324h4.867Zm5.191-4.948h-.811v-3.407c0-.162-.243-.324-.487-.324H40.841V108.8h1.217a1.2,1.2,0,0,1,1.3,1.136ZM36.137,108.8h3.488v.73H36.137Z" transform="translate(0 -69.508)" fill="#fff" stroke="#fff" stroke-width="0.2"/>
+    <path id="路径_23505" data-name="路径 23505" d="M237.692,40.752a.435.435,0,0,1-.406-.406V38.806a.383.383,0,0,1,.406-.406h.081a.383.383,0,0,1,.406.406v1.541C238.1,40.509,237.936,40.752,237.692,40.752Zm4.7,0a.454.454,0,0,1-.487-.406V38.806a.383.383,0,0,1,.406-.406h.081a.383.383,0,0,1,.406.406v1.541A.435.435,0,0,1,242.4,40.752Zm-5.6,1.622h6.408v.73H236.8Zm0,2.677h3.082v.73H236.8Zm6.165,3.65a2.516,2.516,0,0,1-1.784-.73,2.618,2.618,0,0,1-.649-1.7,2.7,2.7,0,0,1,.73-1.7,2.618,2.618,0,0,1,1.7-.649,2.7,2.7,0,0,1,1.7.73,2.618,2.618,0,0,1,.649,1.7,2.7,2.7,0,0,1-.73,1.7A2.412,2.412,0,0,1,242.965,48.7Zm0-3.975a1.542,1.542,0,0,0-1.054.406,1.473,1.473,0,0,0-.487,1.136,1.938,1.938,0,0,0,.406,1.136,1.641,1.641,0,0,0,2.271.081,1.473,1.473,0,0,0,.487-1.136,1.938,1.938,0,0,0-.406-1.136,1.651,1.651,0,0,0-1.217-.487Zm3.326,4.948a.493.493,0,0,1-.649,0l-.892-.892a.459.459,0,1,1,.649-.649l.892.892A.493.493,0,0,1,246.29,49.675Z" transform="translate(-202.204)" fill="#fff" stroke="#fff" stroke-width="0.2"/>
+  </g>
+</svg>

+ 8 - 0
ruoyi-ui/src/assets/dpp/etl/title-act (3).svg

@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="11.404" height="11.804" viewBox="0 0 11.404 11.804">
+  <g id="组_24446" data-name="组 24446" transform="translate(-40.006 -34.56)">
+    <path id="路径_23509" data-name="路径 23509" d="M44.583,46.364H41.414a1.383,1.383,0,0,1-1.408-1.353v-9.1a1.383,1.383,0,0,1,1.408-1.353H50a1.383,1.383,0,0,1,1.408,1.353v3.794a.57.57,0,1,1-1.14,0V35.913A.248.248,0,0,0,50,35.7H41.414a.248.248,0,0,0-.267.213v9.1a.248.248,0,0,0,.267.213h3.169a.57.57,0,0,1,0,1.14Z" fill="#fff"/>
+    <path id="路径_23510" data-name="路径 23510" d="M534.177,601.634a.57.57,0,0,1-.4-.973l3.5-3.5a.57.57,0,1,1,.806.806l-3.5,3.5A.569.569,0,0,1,534.177,601.634Z" transform="translate(-487.555 -555.542)" fill="#fff"/>
+    <path id="路径_23511" data-name="路径 23511" d="M240.484,210.981a.568.568,0,0,1-.4-.167l-3.5-3.5a.57.57,0,1,1,.806-.806l3.5,3.5a.57.57,0,0,1-.4.974Zm-1.7-8.346H233.3a.57.57,0,0,1,0-1.14h5.483a.57.57,0,1,1,0,1.14ZM236.47,204.7H233.3a.57.57,0,0,1,0-1.14h3.172a.57.57,0,0,1,0,1.14Z" transform="translate(-190.361 -164.89)" fill="#fff"/>
+    <path id="路径_23512" data-name="路径 23512" d="M222.058,553.356h-1.746a.57.57,0,0,1,0-1.14h1.746a.57.57,0,0,1,0,1.14Z" transform="translate(-177.534 -511.314)" fill="#fff"/>
+  </g>
+</svg>

+ 3 - 0
ruoyi-ui/src/assets/dpp/etl/title-act (4).svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="11" height="11.324" viewBox="0 0 11 11.324">
+  <path id="路径_23503" data-name="路径 23503" d="M152.665,157.1a1.78,1.78,0,0,1,1.712,1.294h6.382v.971h-6.382a1.78,1.78,0,0,1-3.425,0H149.76v-.971h1.193A1.78,1.78,0,0,1,152.665,157.1Zm0,.971a.809.809,0,1,0,.809.809A.809.809,0,0,0,152.665,158.068Zm5.176-4.853a1.78,1.78,0,0,1,1.712,1.294h1.206v.971h-1.206a1.78,1.78,0,0,1-3.425,0H149.76v-.971h6.369A1.78,1.78,0,0,1,157.842,153.215Zm0,.971a.809.809,0,1,0,.809.809A.809.809,0,0,0,157.842,154.186Zm-5.176-4.853a1.78,1.78,0,0,1,1.712,1.294h6.382v.971h-6.382a1.78,1.78,0,0,1-3.425,0H149.76v-.971h1.193A1.78,1.78,0,0,1,152.665,149.333Zm0,.971a.809.809,0,1,0,.809.809A.809.809,0,0,0,152.665,150.3Z" transform="translate(-149.76 -149.333)" fill="#fff"/>
+</svg>

BIN
ruoyi-ui/src/assets/dpp/etl/toolbar (1).png


BIN
ruoyi-ui/src/assets/dpp/etl/toolbar (2).png


BIN
ruoyi-ui/src/assets/dpp/etl/toolbar (3).png


BIN
ruoyi-ui/src/assets/dpp/etl/toolbar (4).png


Some files were not shown because too many files changed in this diff