Kaynağa Gözat

添加执行器组功能

wzl 1 yıl önce
ebeveyn
işleme
226076b978
36 değiştirilmiş dosya ile 622 ekleme ve 133 silme
  1. 1 1
      pom.xml
  2. 15 8
      src/main/java/com/dskj/znzn/importData/common/base/R.java
  3. 2 4
      src/main/java/com/dskj/znzn/importData/common/conf/RedisConfigurer.java
  4. 1 1
      src/main/java/com/dskj/znzn/importData/common/exception/BusinessException.java
  5. 17 12
      src/main/java/com/dskj/znzn/importData/common/filter/AppInterceptor.java
  6. 39 9
      src/main/java/com/dskj/znzn/importData/common/utils/FileEncodingConverter.java
  7. 6 6
      src/main/java/com/dskj/znzn/importData/common/utils/IpUtils.java
  8. 6 7
      src/main/java/com/dskj/znzn/importData/generate/CodeGenerateMain.java
  9. 10 3
      src/main/java/com/dskj/znzn/importData/web/controller/BaseTemplateController.java
  10. 16 8
      src/main/java/com/dskj/znzn/importData/web/controller/ProcessExecutorController.java
  11. 31 4
      src/main/java/com/dskj/znzn/importData/web/controller/ProcessGroupController.java
  12. 3 6
      src/main/java/com/dskj/znzn/importData/web/entity/MappingField.java
  13. 8 5
      src/main/java/com/dskj/znzn/importData/web/entity/ProcessExecutor.java
  14. 8 2
      src/main/java/com/dskj/znzn/importData/web/entity/ProcessGroup.java
  15. 1 1
      src/main/java/com/dskj/znzn/importData/web/indata/AddBaseTemplateInData.java
  16. 34 0
      src/main/java/com/dskj/znzn/importData/web/indata/AddProcessGroupInData.java
  17. 2 0
      src/main/java/com/dskj/znzn/importData/web/indata/EditBaseTemplateInData.java
  18. 17 0
      src/main/java/com/dskj/znzn/importData/web/indata/EditProcessGroupInData.java
  19. 28 0
      src/main/java/com/dskj/znzn/importData/web/indata/MappingFieldInData.java
  20. 30 0
      src/main/java/com/dskj/znzn/importData/web/indata/ProcessExecutorInData.java
  21. 1 1
      src/main/java/com/dskj/znzn/importData/web/indata/TemplateFieldsInData.java
  22. 2 2
      src/main/java/com/dskj/znzn/importData/web/mapper/ProcessExecutorMapper.java
  23. 31 0
      src/main/java/com/dskj/znzn/importData/web/outdata/ProcessExecutorOutData.java
  24. 3 4
      src/main/java/com/dskj/znzn/importData/web/service/IBaseTemplateFieldService.java
  25. 0 1
      src/main/java/com/dskj/znzn/importData/web/service/IBaseTemplateService.java
  26. 19 4
      src/main/java/com/dskj/znzn/importData/web/service/IProcessExecutorService.java
  27. 30 0
      src/main/java/com/dskj/znzn/importData/web/service/IProcessGroupService.java
  28. 3 3
      src/main/java/com/dskj/znzn/importData/web/service/impl/BaseTemplateFieldServiceImpl.java
  29. 23 6
      src/main/java/com/dskj/znzn/importData/web/service/impl/BaseTemplateServiceImpl.java
  30. 1 1
      src/main/java/com/dskj/znzn/importData/web/service/impl/MappingFieldServiceImpl.java
  31. 71 11
      src/main/java/com/dskj/znzn/importData/web/service/impl/ProcessExecutorServiceImpl.java
  32. 153 2
      src/main/java/com/dskj/znzn/importData/web/service/impl/ProcessGroupServiceImpl.java
  33. 3 6
      src/main/resources/application-dev.yml
  34. 0 8
      src/main/resources/application-prod.yml
  35. 6 6
      src/main/resources/application.yml
  36. 1 1
      src/main/resources/mapper/ProcessExecutorMapper.xml

+ 1 - 1
pom.xml

@@ -137,7 +137,7 @@
                 </executions>
                 <!-- 可选地指定 mainClass,但通常不是必需的 -->
                 <configuration>
-                    <mainClass>com.dskj.znzn.import.data.Application</mainClass>
+                    <mainClass>com.dskj.znzn.importData.ImportDataApplication</mainClass>
                 </configuration>
             </plugin>
             <!-- 其他插件配置... -->

+ 15 - 8
src/main/java/com/dskj/znzn/importData/common/base/R.java

@@ -3,6 +3,8 @@ package com.dskj.znzn.importData.common.base;
 import io.swagger.annotations.ApiModel;
 import lombok.Data;
 
+import java.util.Collection;
+
 @ApiModel(description = "返回结果")
 @Data
 public class R<T> {
@@ -10,42 +12,47 @@ public class R<T> {
     private int code;
     private String message;
     private T datas;
+    private long total;
 
-    public R(int code, T datas) {
+    public R(int code, String message, T datas) {
         this.code = code;
         this.message = message;
         this.datas = datas;
     }
 
-    public R(int code, String message, T datas) {
+    public R(int code, String message, T datas, long total) {
         this.code = code;
         this.message = message;
         this.datas = datas;
+        this.total = total;
     }
 
     public static R ok() {
-        return new R(200, "success", null);
+        return ok(200, "success", null);
     }
 
     public static <T> R<T> ok(T datas) {
-        return new R(200, "success", datas);
+        return ok(200, "success", datas);
     }
 
     public static <T> R<T> ok(String message, T datas) {
-        return new R(200, message, datas);
+        return ok(200, message, datas);
     }
 
 
     public static <T> R<T> ok(int code, String message, T datas) {
-        return new R(code, message, datas);
+        if (datas instanceof Collection) {
+            return new R(code, message, datas, ((Collection) datas).size());
+        }
+        return new R(code, message, datas, -1);
     }
 
     public static R error() {
-        return new R(500, "fail", null);
+        return error(500, "fail");
     }
 
     public static R error(String message) {
-        return new R(500, message, null);
+        return error(500, message);
     }
 
 

+ 2 - 4
src/main/java/com/dskj/znzn/importData/common/conf/RedisConfigurer.java

@@ -68,16 +68,14 @@ public class RedisConfigurer implements CachingConfigurer {
         RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                 .cacheDefaults(config)
                 .build();
-        log.info("redis config ={}", config.toString());
+        log.info("redis config ={}", config);
         return cacheManager;
     }
 
 
     @Bean
     public KeyGenerator jfKeyGenerator() {
-        return (target, method, params) -> {
-            return "";
-        };
+        return (target, method, params) -> "";
     }
 }
 

+ 1 - 1
src/main/java/com/dskj/znzn/importData/common/exception/BusinessException.java

@@ -2,7 +2,7 @@ package com.dskj.znzn.importData.common.exception;
 
 public class BusinessException extends RuntimeException {
 
-    private int code;
+    private final int code;
 
     private String message;
 

+ 17 - 12
src/main/java/com/dskj/znzn/importData/common/filter/AppInterceptor.java

@@ -98,6 +98,18 @@ public class AppInterceptor implements HandlerInterceptor {
             }
         }
 
+        boolean loginFlag = isLoginFlag(method);
+
+        if (loginFlag) {
+            if (null == currentUser.getUserId()) {
+                throw new UserNotLoginExeption();
+            }
+        }
+        ThreadLocalUser.set(currentUser);
+        log.info("请求的用户信息:[{}]", currentUser);
+    }
+
+    private static boolean isLoginFlag(Method method) {
         boolean loginFlag = true;
         if (method.getDeclaringClass().isAnnotationPresent(NeedLogin.class)) {
             NeedLogin parentNeedLogin = method.getDeclaringClass().getAnnotation(NeedLogin.class);
@@ -127,14 +139,7 @@ public class AppInterceptor implements HandlerInterceptor {
                 loginFlag = false;
             }
         }
-
-        if (loginFlag) {
-            if (null == currentUser.getUserId()) {
-                throw new UserNotLoginExeption();
-            }
-        }
-        ThreadLocalUser.set(currentUser);
-        log.info("请求的用户信息:[{}]", currentUser);
+        return loginFlag;
     }
 
     private void printRequestParams(HttpServletRequest request) {
@@ -150,17 +155,17 @@ public class AppInterceptor implements HandlerInterceptor {
                 log.info("请求BODY:[{}]", ((ParamsRequestWrapper) request).getBody());
             } else if (mediaType.contains(MediaType.APPLICATION_FORM_URLENCODED_VALUE)) {
                 JSONObject argParamJson = new JSONObject();
-                Enumeration params = request.getParameterNames();
+                Enumeration<String> params = request.getParameterNames();
                 while (params.hasMoreElements()) {
-                    String param = (String) params.nextElement();
+                    String param = params.nextElement();
                     argParamJson.put(param, request.getParameter(param));
                 }
                 log.info("请求PARAM:[{}]", argParamJson);
             } else {
                 JSONObject argParamJson = new JSONObject();
-                Enumeration params = request.getParameterNames();
+                Enumeration<String> params = request.getParameterNames();
                 while (params.hasMoreElements()) {
-                    String param = (String) params.nextElement();
+                    String param = params.nextElement();
                     argParamJson.put(param, request.getParameter(param));
                 }
                 log.info("请求PARAM:[{}]", argParamJson);

+ 39 - 9
src/main/java/com/dskj/znzn/importData/common/utils/FileEncodingConverter.java

@@ -4,6 +4,8 @@ import org.mozilla.universalchardet.UniversalDetector;
 
 import java.io.*;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 
 public class FileEncodingConverter {
 
@@ -26,6 +28,11 @@ public class FileEncodingConverter {
 
         String detectedCharset = detector.getDetectedCharset();
         detector.reset();
+        fis.reset();
+
+        if (null == detectedCharset) {
+            return "GB18030";
+        }
 
         return detectedCharset;
     }
@@ -34,21 +41,38 @@ public class FileEncodingConverter {
      * 转化文件到 InputStream流
      *
      * @param fileName 文件名
-     * @return
-     * @throws IOException
      */
     public static InputStream convertFileToInputStream(String fileName) throws IOException {
-        return convertFileToInputStream(new FileInputStream(fileName));
+        return convertFileToInputStream(Files.newInputStream(Paths.get(fileName)));
     }
 
+    public static byte[] getInputByte(InputStream inputStream) throws IOException {
+        // 将 InputStream 内容读取到字节数组中
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        byte[] buffer = new byte[1024];
+        int len;
+        while ((len = inputStream.read(buffer)) != -1) {
+            baos.write(buffer, 0, len);
+        }
+        inputStream.close();
+
+        return baos.toByteArray();
+    }
 
     public static InputStream convertFileToInputStream(InputStream inputStream) throws IOException {
-        String detectedCharset = detectFileCharset(inputStream);
+
+        // 使用 ByteArrayInputStream 多次读取
+        byte[] byteArrays = getInputByte(inputStream);
+
+        InputStream inputStream1 = new ByteArrayInputStream(byteArrays);
+        InputStream inputStream2 = new ByteArrayInputStream(byteArrays);
+
+        String detectedCharset = detectFileCharset(inputStream1);
         System.out.println(" 文件编码: " + detectedCharset);
         if (StandardCharsets.UTF_8.displayName().equalsIgnoreCase(detectedCharset)) {
-            return inputStream;
+            return inputStream1;
         } else {
-            try (InputStreamReader reader = new InputStreamReader(inputStream, detectedCharset);
+            try (InputStreamReader reader = new InputStreamReader(inputStream2, detectedCharset);
                  ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
 
                 // 将 InputStreamReader 读取的字符数据转换为字节数据并写入 ByteArrayOutputStream
@@ -59,7 +83,6 @@ public class FileEncodingConverter {
                     byteArrayOutputStream.write(bytes);
                 }
 
-                // 从 ByteArrayOutputStream 中获取 ByteArrayInputStream
                 return new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
             }
         }
@@ -75,10 +98,10 @@ public class FileEncodingConverter {
      */
     public static void convertFileToUtf8(String inputFileName, String outputFileName, String sourceCharset) throws
             IOException {
-        try (InputStream inputStream = new FileInputStream(inputFileName);
+        try (InputStream inputStream = Files.newInputStream(Paths.get(inputFileName));
              InputStreamReader reader = new InputStreamReader(inputStream, sourceCharset);
              BufferedReader bufferedReader = new BufferedReader(reader);
-             OutputStream outputStream = new FileOutputStream(outputFileName);
+             OutputStream outputStream = Files.newOutputStream(Paths.get(outputFileName));
              OutputStreamWriter writer = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);
              BufferedWriter bufferedWriter = new BufferedWriter(writer)) {
 
@@ -89,4 +112,11 @@ public class FileEncodingConverter {
             }
         }
     }
+
+    public static void main(String[] args) throws IOException {
+
+        InputStream inputStream = Files.newInputStream(new File("D:\\data\\b2_240828_2324_Err.csv").toPath());
+        System.out.println(detectFileCharset(inputStream));
+
+    }
 }

+ 6 - 6
src/main/java/com/dskj/znzn/importData/common/utils/IpUtils.java

@@ -30,20 +30,20 @@ public class IpUtils {
             return "unknown";
         }
         String ip = request.getHeader("x-forwarded-for");
-        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
             ip = request.getHeader("Proxy-Client-IP");
         }
-        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
             ip = request.getHeader("X-Forwarded-For");
         }
-        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
             ip = request.getHeader("WL-Proxy-Client-IP");
         }
-        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
             ip = request.getHeader("X-Real-IP");
         }
 
-        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
             ip = request.getRemoteAddr();
         }
 
@@ -105,7 +105,7 @@ public class IpUtils {
      * @return byte 字节
      */
     public static byte[] textToNumericFormatV4(String text) {
-        if (text.length() == 0) {
+        if (text.isEmpty()) {
             return null;
         }
 

+ 6 - 7
src/main/java/com/dskj/znzn/importData/generate/CodeGenerateMain.java

@@ -19,13 +19,13 @@ import static com.baomidou.mybatisplus.core.enums.SqlLike.RIGHT;
  */
 public class CodeGenerateMain {
 
-    static String host = "192.168.50.235";
-    static Integer port = 30306;
-    static String dbName = "import_data";
-    static String username = "root";
-    static String password = "admin123456";
+    static final String host = "192.168.50.235";
+    static final Integer port = 30306;
+    static final String dbName = "import_data";
+    static final String username = "root";
+    static final String password = "admin123456";
 
-    static String url = String.format("jdbc:mysql://%s:%s/%s?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&allowPublicKeyRetrieval=true", host, port, dbName);
+    static final String url = String.format("jdbc:mysql://%s:%s/%s?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&allowPublicKeyRetrieval=true", host, port, dbName);
 
     public static void main(String[] args) throws IOException {
         //逗号分隔 ,all:查询全部  前缀_:匹配
@@ -73,7 +73,6 @@ public class CodeGenerateMain {
                     builder.controllerBuilder().enableRestStyle().enableFileOverride();
                     builder.mapperBuilder().enableFileOverride();
 
-
                 })
                 .templateEngine(new VelocityTemplateEngine())
                 .execute();

+ 10 - 3
src/main/java/com/dskj/znzn/importData/web/controller/BaseTemplateController.java

@@ -29,13 +29,13 @@ public class BaseTemplateController {
 
     private final IBaseTemplateService baseTemplateService;
 
-    @ApiOperation(value = "根据ID获取")
+    @ApiOperation(value = "根据模板ID获取")
     @GetMapping("/get/{id}")
     public R<GetBaseTemplateOutData> getBaseDataById(@PathVariable Integer id) {
         return R.ok(baseTemplateService.getBaseDataById(id));
     }
 
-    @ApiOperation(value = "获取所有基础模板")
+    @ApiOperation(value = "获取所有模板")
     @GetMapping("getAllEnabled")
     public R<List<BaseTemplate>> getAllEnabled() {
         return R.ok(baseTemplateService.getAllEnabled());
@@ -64,8 +64,15 @@ public class BaseTemplateController {
 
     @ApiOperation(value = "查询模板是否已被使用")
     @GetMapping("/queryUsed/{id}")
-    public R<List> queryUsed(@PathVariable Integer id) {
+    public R queryUsed(@PathVariable Integer id) {
         baseTemplateService.queryUsed(id);
         return R.ok();
     }
+
+//    @ApiOperation(value = "复制模板")
+//    @GetMapping("/copyTemplate/{id}")
+//    public R copyTemplate(@PathVariable Integer id) {
+//        baseTemplateService.copyTemplate(id);
+//        return R.ok();
+//    }
 }

+ 16 - 8
src/main/java/com/dskj/znzn/importData/web/controller/ProcessController.java → src/main/java/com/dskj/znzn/importData/web/controller/ProcessExecutorController.java

@@ -2,9 +2,10 @@ package com.dskj.znzn.importData.web.controller;
 
 import com.dskj.znzn.importData.common.base.R;
 import com.dskj.znzn.importData.common.exception.BusinessException;
-import com.dskj.znzn.importData.web.entity.Process;
+import com.dskj.znzn.importData.web.entity.ProcessExecutor;
+import com.dskj.znzn.importData.web.outdata.ProcessExecutorOutData;
 import com.dskj.znzn.importData.web.indata.ReadExcepDataInData;
-import com.dskj.znzn.importData.web.service.IProcessService;
+import com.dskj.znzn.importData.web.service.IProcessExecutorService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
@@ -24,19 +25,26 @@ import java.util.Map;
  * @since 2024-10-30
  */
 @RestController
-@RequestMapping("process")
+@RequestMapping("processExecutor")
 @RequiredArgsConstructor(onConstructor = @__({@Autowired}))
 @Api(tags = "执行器")
-public class ProcessController {
+public class ProcessExecutorController {
 
-    private final IProcessService processService;
+    private final IProcessExecutorService processService;
 
-    @ApiOperation(value = "根据执行器组ID获取所有执行器")
-    @GetMapping("/processGroup/{processGroupId}")
-    public R<List<Process>> getByProcessGroupId(@PathVariable Integer processGroupId) {
+    @ApiOperation(value = "根据执行器组ID获取所有执行器参数")
+    @GetMapping("/getByProcessGroupId/{processGroupId}")
+    public R<List<ProcessExecutor>> getByProcessGroupId(@PathVariable Integer processGroupId) {
         return R.ok(processService.getByProcessGroupId(processGroupId));
     }
 
+    @ApiOperation(value = "根据执行器组ID获取所有执行器完整信息")
+    @GetMapping("/getCompleteByProcessGroupId/{processGroupId}")
+    public R<List<ProcessExecutorOutData>> getCompleteByProcessGroupId(@PathVariable Integer processGroupId) {
+        return R.ok(processService.getCompleteByProcessGroupId(processGroupId));
+    }
+
+
     @ApiOperation(value = "读取excel数据")
     @PostMapping("readExcelData")
     @ApiImplicitParam(name = "file", value = "文件", required = true, dataType = "file", paramType = "query")

+ 31 - 4
src/main/java/com/dskj/znzn/importData/web/controller/ProcessGroupController.java

@@ -2,16 +2,16 @@ package com.dskj.znzn.importData.web.controller;
 
 import com.dskj.znzn.importData.common.base.R;
 import com.dskj.znzn.importData.web.entity.ProcessGroup;
+import com.dskj.znzn.importData.web.indata.AddProcessGroupInData;
+import com.dskj.znzn.importData.web.indata.EditProcessGroupInData;
 import com.dskj.znzn.importData.web.service.IProcessGroupService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
+import javax.validation.Valid;
 import java.util.List;
 
 
@@ -33,4 +33,31 @@ public class ProcessGroupController {
         return R.ok(processGroupService.getByTemplateId(templateId));
     }
 
+    @PostMapping(value = "addProcessGroup")
+    @ApiOperation(value = "添加执行器组")
+    public R addProcessGroup(@Valid @RequestBody AddProcessGroupInData inData) {
+        processGroupService.saveProceeGroup(inData);
+        return R.ok();
+    }
+
+    @GetMapping(value = "/deleteProcessGroup/{processGroupId}")
+    @ApiOperation(value = "删除执行器组")
+    public R deleteProcessGroup(@PathVariable Integer processGroupId) {
+        processGroupService.deleteProcessGroup(processGroupId);
+        return R.ok();
+    }
+
+    @PostMapping(value = "editProcessGroup")
+    @ApiOperation(value = "编辑执行器组")
+    public R editProcessGroup(@Valid @RequestBody EditProcessGroupInData inData) {
+        processGroupService.editProcessGroup(inData);
+        return R.ok();
+    }
+
+    @GetMapping(value = "/copyProcessGroup/{processGroupId}")
+    @ApiOperation(value = "复制执行器组")
+    public R copyProcessGroup(@PathVariable Integer processGroupId) {
+        processGroupService.copyProcessGroup(processGroupId);
+        return R.ok();
+    }
 }

+ 3 - 6
src/main/java/com/dskj/znzn/importData/web/entity/MappingField.java

@@ -38,18 +38,15 @@ public class MappingField implements Serializable {
     private Integer processGourpId;
 
     @ApiModelProperty("处理器ID")
-    private Integer processId;
+    private Integer processExecutorId;
 
     @ApiModelProperty("标准化字段")
     private String standardizedName;
 
-    @ApiModelProperty("0: 原始列名 1: 文件名  2:sheet_name(只允许excel格式的,csv不支持)")
-    private Integer dataNameType;
-
-    @ApiModelProperty("数据对应的名称,如有多个丨号 分割")
+    @ApiModelProperty("数据对应的名称,如有多个,号 分割")
     private String dataName;
 
-    @ApiModelProperty("移除的字符串,如有多个号 分割")
+    @ApiModelProperty("移除的字符串,如有多个,号 分割")
     private String removeCharacters;
 
     @ApiModelProperty("创建时间")

+ 8 - 5
src/main/java/com/dskj/znzn/importData/web/entity/Process.java → src/main/java/com/dskj/znzn/importData/web/entity/ProcessExecutor.java

@@ -18,9 +18,9 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@TableName("process")
-@ApiModel(value = "Process对象", description = "执行器")
-public class Process implements Serializable {
+@TableName("process_executor")
+@ApiModel(value = "ProcessExecutor对象", description = "执行器")
+public class ProcessExecutor implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
@@ -34,14 +34,17 @@ public class Process implements Serializable {
     @ApiModelProperty("处理器名称")
     private String name;
 
+    @ApiModelProperty("已知的字段")
+    private String knownFields;
+
     @ApiModelProperty("0:不可用 1:可用")
     private Integer status;
 
     @ApiModelProperty("创建时间")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
 
     @ApiModelProperty("更新时间")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date updateTime;
 }

+ 8 - 2
src/main/java/com/dskj/znzn/importData/web/entity/ProcessGroup.java

@@ -1,5 +1,7 @@
 package com.dskj.znzn.importData.web.entity;
 
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
@@ -23,6 +25,7 @@ public class ProcessGroup implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
     @ApiModelProperty("模板ID")
@@ -31,14 +34,17 @@ public class ProcessGroup implements Serializable {
     @ApiModelProperty("执行器组名称")
     private String name;
 
+    @ApiModelProperty("0:竖向 1:横向,自定义方式用 0,1,0 拼接 ")
+    private String joinType;
+
     @ApiModelProperty("0:不可用 1:可用")
     private Integer status;
 
     @ApiModelProperty("创建时间")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
 
     @ApiModelProperty("更新时间")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date updateTime;
 }

+ 1 - 1
src/main/java/com/dskj/znzn/importData/web/indata/AddBaseTemplateInData.java

@@ -20,5 +20,5 @@ public class AddBaseTemplateInData {
     @ApiModelProperty("模板配置属性")
     @NotEmpty(message = "模板字段不能为空")
     @Valid
-    List<TemplateFields> templateFieldsList;
+    List<TemplateFieldsInData> templateFieldsInDataList;
 }

+ 34 - 0
src/main/java/com/dskj/znzn/importData/web/indata/AddProcessGroupInData.java

@@ -0,0 +1,34 @@
+package com.dskj.znzn.importData.web.indata;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@ApiModel
+@Data
+public class AddProcessGroupInData {
+
+    @ApiModelProperty("执行器组名称")
+    @NotBlank
+    private String name;
+
+    @ApiModelProperty("模板ID")
+    @NotNull
+    private Integer templateId;
+
+    @ApiModelProperty("连接方式数组,  0:竖向 1:横向, 自定义使用 0,1,0 方式拼接")
+    @NotEmpty
+    private List<String> joinTypeList;
+
+    @ApiModelProperty("执行器数组")
+    @NotEmpty
+    @Valid
+    private List<ProcessExecutorInData> processExecutorInDataList;
+
+}

+ 2 - 0
src/main/java/com/dskj/znzn/importData/web/indata/EditBaseTemplateInData.java

@@ -3,9 +3,11 @@ package com.dskj.znzn.importData.web.indata;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import javax.validation.constraints.NotNull;
 
+@EqualsAndHashCode(callSuper = true)
 @ApiModel
 @Data
 public class EditBaseTemplateInData extends AddBaseTemplateInData {

+ 17 - 0
src/main/java/com/dskj/znzn/importData/web/indata/EditProcessGroupInData.java

@@ -0,0 +1,17 @@
+package com.dskj.znzn.importData.web.indata;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel
+public class EditProcessGroupInData extends AddProcessGroupInData {
+
+    @ApiModelProperty("执行器组ID")
+    @NotNull
+    private Integer processGroupId;
+    
+}

+ 28 - 0
src/main/java/com/dskj/znzn/importData/web/indata/MappingFieldInData.java

@@ -0,0 +1,28 @@
+package com.dskj.znzn.importData.web.indata;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@ApiModel
+@Data
+public class MappingFieldInData {
+
+    @ApiModelProperty("模版标准化字段ID")
+    @NotNull
+    private Integer templateFiledId;
+
+    @ApiModelProperty("标准化字段名称")
+    @NotBlank
+    private String standardizedName;
+
+    @ApiModelProperty("映射关系数组,合并列时有可能需要配置多个")
+    private List<String> dataNameList;
+
+    @ApiModelProperty("移除的字符,eg:风机编号F001数据,移除:风机编号,数据  最后保留F001")
+    private List<String> removeCharactersList;
+}

+ 30 - 0
src/main/java/com/dskj/znzn/importData/web/indata/ProcessExecutorInData.java

@@ -0,0 +1,30 @@
+package com.dskj.znzn.importData.web.indata;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@ApiModel
+@Data
+public class ProcessExecutorInData {
+
+    @ApiModelProperty("执行器名称")
+    @NotBlank
+    private String name;
+
+    @ApiModelProperty("已知的字段")
+    @NotEmpty
+    private List<String>knownFieldsList;
+
+    @ApiModelProperty("映射关系")
+    @NotEmpty
+    @Valid
+    private List<MappingFieldInData> mappingFieldList;
+
+}

+ 1 - 1
src/main/java/com/dskj/znzn/importData/web/indata/TemplateFields.java → src/main/java/com/dskj/znzn/importData/web/indata/TemplateFieldsInData.java

@@ -8,7 +8,7 @@ import javax.validation.constraints.NotBlank;
 
 @Data
 @ApiModel
-public class TemplateFields {
+public class TemplateFieldsInData {
 
     @ApiModelProperty("标准化字段")
     @NotBlank(message = "标准化字段不能为空")

+ 2 - 2
src/main/java/com/dskj/znzn/importData/web/mapper/ProcessMapper.java → src/main/java/com/dskj/znzn/importData/web/mapper/ProcessExecutorMapper.java

@@ -1,7 +1,7 @@
 package com.dskj.znzn.importData.web.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.dskj.znzn.importData.web.entity.Process;
+import com.dskj.znzn.importData.web.entity.ProcessExecutor;
 import org.apache.ibatis.annotations.Mapper;
 
 /**
@@ -9,6 +9,6 @@ import org.apache.ibatis.annotations.Mapper;
  * @since 2024-10-30
  */
 @Mapper
-public interface ProcessMapper extends BaseMapper<Process> {
+public interface ProcessExecutorMapper extends BaseMapper<ProcessExecutor> {
 
 }

+ 31 - 0
src/main/java/com/dskj/znzn/importData/web/outdata/ProcessExecutorOutData.java

@@ -0,0 +1,31 @@
+package com.dskj.znzn.importData.web.outdata;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.dskj.znzn.importData.web.entity.MappingField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel
+public class ProcessExecutorOutData {
+
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("处理器组ID")
+    private Integer groupId;
+
+    @ApiModelProperty("处理器名称")
+    private String name;
+
+    @ApiModelProperty("已知字段")
+    private String knownFields;
+
+    @ApiModelProperty("映射关系")
+    private List<MappingField> mappingFieldList;
+}

+ 3 - 4
src/main/java/com/dskj/znzn/importData/web/service/IBaseTemplateFieldService.java

@@ -2,7 +2,7 @@ package com.dskj.znzn.importData.web.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dskj.znzn.importData.web.entity.BaseTemplateField;
-import com.dskj.znzn.importData.web.indata.TemplateFields;
+import com.dskj.znzn.importData.web.indata.TemplateFieldsInData;
 
 import java.util.List;
 
@@ -20,7 +20,6 @@ public interface IBaseTemplateFieldService extends IService<BaseTemplateField> {
      * 通过模板ID获取标准化字段
      *
      * @param templateId 模板ID
-     * @return
      */
     List<BaseTemplateField> getByTemplateId(Integer templateId);
 
@@ -28,7 +27,7 @@ public interface IBaseTemplateFieldService extends IService<BaseTemplateField> {
      * 删除历史数据并添加新的数据
      *
      * @param id                 模板ID
-     * @param templateFieldsList 标准化字段
+     * @param templateFieldsInDataList 标准化字段
      */
-    void deleteAndSaveByTemplateId(Integer id, List<TemplateFields> templateFieldsList);
+    void deleteAndSaveByTemplateId(Integer id, List<TemplateFieldsInData> templateFieldsInDataList);
 }

+ 0 - 1
src/main/java/com/dskj/znzn/importData/web/service/IBaseTemplateService.java

@@ -50,7 +50,6 @@ public interface IBaseTemplateService extends IService<BaseTemplate> {
      * 获取本模板下的所有信息
      *
      * @param id 模板ID
-     * @return
      */
     GetBaseTemplateOutData getBaseDataById(Integer id);
 

+ 19 - 4
src/main/java/com/dskj/znzn/importData/web/service/IProcessService.java → src/main/java/com/dskj/znzn/importData/web/service/IProcessExecutorService.java

@@ -1,7 +1,8 @@
 package com.dskj.znzn.importData.web.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.dskj.znzn.importData.web.entity.Process;
+import com.dskj.znzn.importData.web.entity.ProcessExecutor;
+import com.dskj.znzn.importData.web.outdata.ProcessExecutorOutData;
 import com.dskj.znzn.importData.web.indata.ReadExcepDataInData;
 
 import java.io.IOException;
@@ -17,7 +18,7 @@ import java.util.Map;
  * @author 魏志亮
  * @since 2024-10-29
  */
-public interface IProcessService extends IService<Process> {
+public interface IProcessExecutorService extends IService<ProcessExecutor> {
 
     /**
      * 同构执行组ID获取执行器
@@ -25,14 +26,28 @@ public interface IProcessService extends IService<Process> {
      * @param processGroupId 执行组ID
      * @return
      */
-    List<Process> getByProcessGroupId(Integer processGroupId);
+    List<ProcessExecutor> getByProcessGroupId(Integer processGroupId);
 
     /**
      * @param fileName    文件名
      * @param inputStream 文件流
      * @param suffix      后缀
      * @param inData      入参
-     * @return 列数据
+     * @return 列数据
      */
     List<Map<Integer, Object>> readExcelData(String fileName, InputStream inputStream, String suffix, ReadExcepDataInData inData) throws IOException;
+
+    /**
+     * 获取执行器组完整信息
+     *
+     * @param processGroupId 执行器组ID
+     * @return
+     */
+    List<ProcessExecutorOutData> getCompleteByProcessGroupId(Integer processGroupId);
+
+    /**
+     * 编辑执行器组,使原来的不可用
+     * @param id
+     */
+    void deleteByProcessGroupId(Integer id);
 }

+ 30 - 0
src/main/java/com/dskj/znzn/importData/web/service/IProcessGroupService.java

@@ -2,6 +2,8 @@ package com.dskj.znzn.importData.web.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dskj.znzn.importData.web.entity.ProcessGroup;
+import com.dskj.znzn.importData.web.indata.AddProcessGroupInData;
+import com.dskj.znzn.importData.web.indata.EditProcessGroupInData;
 
 import java.util.List;
 
@@ -22,4 +24,32 @@ public interface IProcessGroupService extends IService<ProcessGroup> {
      * @return 执行器组的名称
      */
     List<ProcessGroup> getByTemplateId(Integer templateId);
+
+    /**
+     * 保存执行器组
+     *
+     * @param inData 数据
+     */
+    void saveProceeGroup(AddProcessGroupInData inData);
+
+    /**
+     * 删除执行器组
+     *
+     * @param processGroupId 执行器组ID
+     */
+    void deleteProcessGroup(Integer processGroupId);
+
+    /**
+     * 编辑执行器组
+     *
+     * @param inData 数据
+     */
+    void editProcessGroup(EditProcessGroupInData inData);
+
+    /**
+     * 复制执行器组
+     *
+     * @param processGroupId 执行器组ID
+     */
+    void copyProcessGroup(Integer processGroupId);
 }

+ 3 - 3
src/main/java/com/dskj/znzn/importData/web/service/impl/BaseTemplateFieldServiceImpl.java

@@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dskj.znzn.importData.web.entity.BaseTemplateField;
-import com.dskj.znzn.importData.web.indata.TemplateFields;
+import com.dskj.znzn.importData.web.indata.TemplateFieldsInData;
 import com.dskj.znzn.importData.web.mapper.BaseTemplateFieldMapper;
 import com.dskj.znzn.importData.web.service.IBaseTemplateFieldService;
 import lombok.RequiredArgsConstructor;
@@ -38,10 +38,10 @@ public class BaseTemplateFieldServiceImpl extends ServiceImpl<BaseTemplateFieldM
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void deleteAndSaveByTemplateId(Integer id, List<TemplateFields> templateFieldsList) {
+    public void deleteAndSaveByTemplateId(Integer id, List<TemplateFieldsInData> templateFieldsInDataList) {
         baseTemplateFieldMapper.deleteByTemplateId(id);
         List<BaseTemplateField> fieldsList = new ArrayList<>();
-        for (TemplateFields fields : templateFieldsList) {
+        for (TemplateFieldsInData fields : templateFieldsInDataList) {
             BaseTemplateField baseTemplateField = new BaseTemplateField();
             baseTemplateField.setTemplateId(id);
             baseTemplateField.setStandardizedName(fields.getStandardizedName());

+ 23 - 6
src/main/java/com/dskj/znzn/importData/web/service/impl/BaseTemplateServiceImpl.java

@@ -10,17 +10,19 @@ import com.dskj.znzn.importData.web.entity.BaseTemplateField;
 import com.dskj.znzn.importData.web.entity.ProcessGroup;
 import com.dskj.znzn.importData.web.indata.AddBaseTemplateInData;
 import com.dskj.znzn.importData.web.indata.EditBaseTemplateInData;
-import com.dskj.znzn.importData.web.indata.TemplateFields;
+import com.dskj.znzn.importData.web.indata.TemplateFieldsInData;
 import com.dskj.znzn.importData.web.mapper.BaseTemplateMapper;
 import com.dskj.znzn.importData.web.outdata.GetBaseTemplateOutData;
 import com.dskj.znzn.importData.web.service.IBaseTemplateFieldService;
 import com.dskj.znzn.importData.web.service.IBaseTemplateService;
 import com.dskj.znzn.importData.web.service.IProcessGroupService;
 import lombok.RequiredArgsConstructor;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -38,7 +40,6 @@ import java.util.stream.Collectors;
 public class BaseTemplateServiceImpl extends ServiceImpl<BaseTemplateMapper, BaseTemplate> implements IBaseTemplateService {
 
     private final IBaseTemplateFieldService baseTemplateFieldService;
-
     private final IProcessGroupService processGroupService;
 
     @Override
@@ -61,9 +62,14 @@ public class BaseTemplateServiceImpl extends ServiceImpl<BaseTemplateMapper, Bas
         baseTemplate.setName(inData.getName());
         save(baseTemplate);
 
+        List<BaseTemplateField> fieldsList = getBaseTemplateFields(inData, baseTemplate);
+        baseTemplateFieldService.saveBatch(fieldsList, 100);
+    }
+
+    private static @NotNull List<BaseTemplateField> getBaseTemplateFields(AddBaseTemplateInData inData, BaseTemplate baseTemplate) {
         Integer id = baseTemplate.getId();
         List<BaseTemplateField> fieldsList = new ArrayList<>();
-        for (TemplateFields fields : inData.getTemplateFieldsList()) {
+        for (TemplateFieldsInData fields : inData.getTemplateFieldsInDataList()) {
             BaseTemplateField baseTemplateField = new BaseTemplateField();
             baseTemplateField.setTemplateId(id);
             baseTemplateField.setStandardizedName(fields.getStandardizedName());
@@ -71,12 +77,20 @@ public class BaseTemplateServiceImpl extends ServiceImpl<BaseTemplateMapper, Bas
             baseTemplateField.setIsCutCol(fields.getIsCutCol());
             fieldsList.add(baseTemplateField);
         }
-        baseTemplateFieldService.saveBatch(fieldsList, 100);
+        return fieldsList;
     }
 
     @Override
     public void deleteTemplate(Integer id) {
-        BaseTemplate baseTemplate = new BaseTemplate();
+        BaseTemplate baseTemplate = getById(id);
+        if (null == baseTemplate || baseTemplate.getStatus() == 0) {
+            throw new BusinessException("查询模板不存在或已删除");
+        }
+        if (baseTemplate.getStatus() == 2) {
+            throw new BusinessException("默认模板不允许删除");
+        }
+
+        baseTemplate = new BaseTemplate();
         baseTemplate.setId(id);
         baseTemplate.setStatus(0);
         updateById(baseTemplate);
@@ -99,6 +113,9 @@ public class BaseTemplateServiceImpl extends ServiceImpl<BaseTemplateMapper, Bas
     @Override
     public GetBaseTemplateOutData getBaseDataById(Integer id) {
         BaseTemplate baseTemplate = getById(id);
+        if (null == baseTemplate || baseTemplate.getStatus() == 0) {
+            throw new BusinessException("查询模板不存在或已删除");
+        }
         List<BaseTemplateField> fieldList = baseTemplateFieldService.getByTemplateId(id);
         List<ProcessGroup> groupList = processGroupService.getByTemplateId(id);
 
@@ -135,6 +152,6 @@ public class BaseTemplateServiceImpl extends ServiceImpl<BaseTemplateMapper, Bas
             updateById(update);
         }
 
-        baseTemplateFieldService.deleteAndSaveByTemplateId(id,inData.getTemplateFieldsList());
+        baseTemplateFieldService.deleteAndSaveByTemplateId(id, inData.getTemplateFieldsInDataList());
     }
 }

+ 1 - 1
src/main/java/com/dskj/znzn/importData/web/service/impl/MappingFieldServiceImpl.java

@@ -27,7 +27,7 @@ public class MappingFieldServiceImpl extends ServiceImpl<MappingFieldMapper, Map
     @Override
     public List<MappingField> getByProcessId(Integer processId) {
         LambdaQueryWrapper<MappingField> queryWrapper = Wrappers.lambdaQuery();
-        queryWrapper.eq(MappingField::getProcessId, processId);
+        queryWrapper.eq(MappingField::getProcessExecutorId, processId);
         return list(queryWrapper);
     }
 }

+ 71 - 11
src/main/java/com/dskj/znzn/importData/web/service/impl/ProcessServiceImpl.java → src/main/java/com/dskj/znzn/importData/web/service/impl/ProcessExecutorServiceImpl.java

@@ -3,17 +3,21 @@ package com.dskj.znzn.importData.web.service.impl;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.dskj.znzn.importData.web.entity.Process;
+import com.dskj.znzn.importData.web.entity.ProcessExecutor;
+import com.dskj.znzn.importData.web.outdata.ProcessExecutorOutData;
 import com.dskj.znzn.importData.web.indata.ReadExcepDataInData;
-import com.dskj.znzn.importData.web.mapper.ProcessMapper;
-import com.dskj.znzn.importData.web.service.IProcessService;
+import com.dskj.znzn.importData.web.mapper.ProcessExecutorMapper;
+import com.dskj.znzn.importData.web.service.IMappingFieldService;
+import com.dskj.znzn.importData.web.service.IProcessExecutorService;
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -32,13 +36,15 @@ import static com.dskj.znzn.importData.common.utils.FileEncodingConverter.conver
  */
 @Service
 @RequiredArgsConstructor(onConstructor = @__({@Autowired}))
-public class ProcessServiceImpl extends ServiceImpl<ProcessMapper, Process> implements IProcessService {
+public class ProcessExecutorServiceImpl extends ServiceImpl<ProcessExecutorMapper, ProcessExecutor> implements IProcessExecutorService {
+
+    private final IMappingFieldService mappingFieldService;
 
     @Override
-    public List<Process> getByProcessGroupId(Integer processGroupId) {
-        LambdaQueryWrapper<Process> queryWrapper = Wrappers.lambdaQuery();
-        queryWrapper.eq(Process::getGroupId, processGroupId)
-                .eq(Process::getStatus, 1);
+    public List<ProcessExecutor> getByProcessGroupId(Integer processGroupId) {
+        LambdaQueryWrapper<ProcessExecutor> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(ProcessExecutor::getGroupId, processGroupId)
+                .eq(ProcessExecutor::getStatus, 1);
         return list(queryWrapper);
     }
 
@@ -67,8 +73,7 @@ public class ProcessServiceImpl extends ServiceImpl<ProcessMapper, Process> impl
                     }
                     data.add(obj);
                 }
-
-
+                System.out.println(obj);
 //                obj.put(-2, "文件名");
 //                obj.put(-1, context.readSheetHolder().getSheetName());
 //                obj.put(-1, "sheet名称");
@@ -91,7 +96,7 @@ public class ProcessServiceImpl extends ServiceImpl<ProcessMapper, Process> impl
             public void doAfterAllAnalysed(AnalysisContext context) {
 
             }
-        }).sheet().doRead();
+        }).excelType(getExcelType(suffix)).sheet().headRowNumber(0).doRead();
 
         if (inData.getHasColName() == 0) {
             Set<Integer> keys = data.stream().map(Map::keySet).flatMap(Collection::stream).collect(Collectors.toSet());
@@ -104,4 +109,59 @@ public class ProcessServiceImpl extends ServiceImpl<ProcessMapper, Process> impl
 
         return data;
     }
+
+    private ExcelTypeEnum getExcelType(String suffix) {
+        suffix = suffix.toLowerCase();
+        ExcelTypeEnum excelTypeEnum = null;
+        switch (suffix) {
+            case "csv":
+                excelTypeEnum = ExcelTypeEnum.CSV;
+                break;
+            case "xls":
+                excelTypeEnum = ExcelTypeEnum.XLS;
+                break;
+            case "xlsx":
+                excelTypeEnum = ExcelTypeEnum.XLSX;
+                break;
+        }
+        if (excelTypeEnum != null) {
+            System.out.println(excelTypeEnum.getValue());
+        }
+        return excelTypeEnum;
+    }
+
+    @Override
+    public List<ProcessExecutorOutData> getCompleteByProcessGroupId(Integer processGroupId) {
+        LambdaQueryWrapper<ProcessExecutor> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(ProcessExecutor::getGroupId, processGroupId)
+                .eq(ProcessExecutor::getStatus, 1);
+        List<ProcessExecutorOutData> outDataList = new ArrayList<>();
+        for (ProcessExecutor processExecutor : list(queryWrapper)) {
+            ProcessExecutorOutData outData = new ProcessExecutorOutData();
+            outData.setId(processExecutor.getId());
+            outData.setName(processExecutor.getName());
+            outData.setGroupId(processExecutor.getGroupId());
+            outData.setKnownFields(processExecutor.getKnownFields());
+            outData.setMappingFieldList(mappingFieldService.getByProcessId(processExecutor.getId()));
+            outDataList.add(outData);
+        }
+
+        return outDataList;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteByProcessGroupId(Integer id) {
+
+        List<Integer> ids = getByProcessGroupId(id).stream().map(ProcessExecutor::getId).collect(Collectors.toList());
+
+        List<ProcessExecutor> updateList = new ArrayList<>();
+        for (Integer executorId : ids) {
+            ProcessExecutor executor = new ProcessExecutor();
+            executor.setId(executorId);
+            executor.setStatus(0);
+            updateList.add(executor);
+        }
+        updateBatchById(updateList);
+    }
 }

+ 153 - 2
src/main/java/com/dskj/znzn/importData/web/service/impl/ProcessGroupServiceImpl.java

@@ -1,16 +1,26 @@
 package com.dskj.znzn.importData.web.service.impl;
 
+import java.util.*;
+
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dskj.znzn.importData.common.exception.BusinessException;
+import com.dskj.znzn.importData.web.entity.MappingField;
+import com.dskj.znzn.importData.web.entity.ProcessExecutor;
 import com.dskj.znzn.importData.web.entity.ProcessGroup;
+import com.dskj.znzn.importData.web.indata.EditProcessGroupInData;
+import com.dskj.znzn.importData.web.indata.MappingFieldInData;
+import com.dskj.znzn.importData.web.indata.ProcessExecutorInData;
+import com.dskj.znzn.importData.web.indata.AddProcessGroupInData;
 import com.dskj.znzn.importData.web.mapper.ProcessGroupMapper;
+import com.dskj.znzn.importData.web.service.IMappingFieldService;
+import com.dskj.znzn.importData.web.service.IProcessExecutorService;
 import com.dskj.znzn.importData.web.service.IProcessGroupService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-
-import java.util.List;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * <p>
@@ -24,6 +34,11 @@ import java.util.List;
 @RequiredArgsConstructor(onConstructor = @__({@Autowired}))
 public class ProcessGroupServiceImpl extends ServiceImpl<ProcessGroupMapper, ProcessGroup> implements IProcessGroupService {
 
+    private final IProcessExecutorService processExecutorService;
+
+    private final IMappingFieldService mappingFieldService;
+
+
     @Override
     public List<ProcessGroup> getByTemplateId(Integer templateId) {
         LambdaQueryWrapper<ProcessGroup> queryWrapper = Wrappers.lambdaQuery();
@@ -31,4 +46,140 @@ public class ProcessGroupServiceImpl extends ServiceImpl<ProcessGroupMapper, Pro
                 .eq(ProcessGroup::getStatus, 1);
         return list(queryWrapper);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void saveProceeGroup(AddProcessGroupInData inData) {
+
+        // 保存执行器组信息
+        ProcessGroup group = new ProcessGroup();
+        group.setTemplateId(inData.getTemplateId());
+        group.setName(inData.getName());
+
+        if (null != inData.getJoinTypeList() && !inData.getJoinTypeList().isEmpty()) {
+            group.setJoinType(String.join(",", inData.getJoinTypeList()));
+        }
+
+        save(group);
+
+        saveProcessInData(group, inData.getProcessExecutorInDataList(), inData.getTemplateId(), false);
+
+    }
+
+    @Override
+    public void deleteProcessGroup(Integer processGroupId) {
+        ProcessGroup group = new ProcessGroup();
+        group.setId(processGroupId);
+        group.setStatus(0);
+        updateById(group);
+    }
+
+    @Override
+    public void editProcessGroup(EditProcessGroupInData inData) {
+        ProcessGroup group = getById(inData.getProcessGroupId());
+        if (null == group) {
+            throw new BusinessException("执行器组不存在");
+        }
+        int count = inData.getProcessExecutorInDataList().size();
+        int joinTypeCount = null == inData.getJoinTypeList() ? 0 : inData.getJoinTypeList().size();
+
+        if (count - 1 != joinTypeCount) {
+            throw new BusinessException("执行器数量和连接方式数量不一致");
+        }
+
+        ProcessGroup update = new ProcessGroup();
+        update.setId(group.getId());
+        if (inData.getJoinTypeList() != null) {
+            update.setJoinType(String.join(",", inData.getJoinTypeList()));
+        }
+        update.setName(inData.getName());
+        updateById(update);
+
+        group.setName(inData.getName());
+
+        saveProcessInData(group, inData.getProcessExecutorInDataList(), inData.getTemplateId(), true);
+
+    }
+
+    private void saveProcessInData(ProcessGroup group, List<ProcessExecutorInData> processExecutorInDataList, Integer templateId, boolean editData) {
+
+        if (editData) {
+            processExecutorService.deleteByProcessGroupId(group.getId());
+        }
+
+        if (processExecutorInDataList != null && !processExecutorInDataList.isEmpty()) {
+            for (ProcessExecutorInData processExecutorInData : processExecutorInDataList) {
+
+                ProcessExecutor process = new ProcessExecutor();
+                process.setGroupId(group.getId());
+                process.setName(processExecutorInData.getName());
+                process.setKnownFields(String.join(",", process.getKnownFields()));
+                process.setStatus(1);
+                processExecutorService.save(process);
+
+                List<MappingField> mappingFieldList = new ArrayList<>();
+                for (MappingFieldInData mappingFieldInData : processExecutorInData.getMappingFieldList()) {
+                    if (null != mappingFieldInData.getDataNameList() && !mappingFieldInData.getDataNameList().isEmpty()) {
+                        MappingField mappingField = new MappingField();
+                        mappingField.setTemplateId(templateId);
+                        mappingField.setTemplateFiledId(mappingFieldInData.getTemplateFiledId());
+                        mappingField.setProcessGourpId(group.getId());
+                        mappingField.setProcessExecutorId(process.getId());
+                        mappingField.setStandardizedName(mappingFieldInData.getStandardizedName());
+                        mappingField.setDataName(String.join(",", mappingFieldInData.getDataNameList()));
+                        if (null != mappingFieldInData.getRemoveCharactersList() && !mappingFieldInData.getRemoveCharactersList().isEmpty()) {
+                            mappingField.setRemoveCharacters(String.join(",", mappingFieldInData.getRemoveCharactersList()));
+                        }
+                        mappingFieldList.add(mappingField);
+                    }
+                }
+                if (mappingFieldList.isEmpty()) {
+                    throw new BusinessException("请添加映射关系");
+                }
+                mappingFieldService.saveBatch(mappingFieldList);
+            }
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void copyProcessGroup(Integer processGroupId) {
+        ProcessGroup group = getById(processGroupId);
+        if (null == group) {
+            throw new BusinessException("未查询到执行器组");
+        }
+
+        AddProcessGroupInData inData = new AddProcessGroupInData();
+        inData.setName(group.getName() + System.currentTimeMillis());
+        inData.setTemplateId(group.getTemplateId());
+        inData.setJoinTypeList(Arrays.asList(group.getJoinType().split(",")));
+
+        List<ProcessExecutorInData> processList = new ArrayList<>();
+        List<ProcessExecutor> processExecutorList = processExecutorService.getByProcessGroupId(group.getId());
+
+        for (ProcessExecutor processExecutor : processExecutorList) {
+            ProcessExecutorInData processExecutorInData = new ProcessExecutorInData();
+            processExecutorInData.setName(processExecutor.getName());
+            processExecutorInData.setKnownFieldsList(Arrays.asList(processExecutor.getKnownFields().split(",")));
+
+            List<MappingFieldInData> mappingFieldInDataList = new ArrayList<>();
+
+            List<MappingField> mappingFieldList = mappingFieldService.getByProcessId(processExecutor.getId());
+            for (MappingField mappingField : mappingFieldList) {
+                MappingFieldInData mappingFieldInData = new MappingFieldInData();
+                mappingFieldInData.setTemplateFiledId(mappingField.getTemplateFiledId());
+                mappingFieldInData.setStandardizedName(mappingField.getStandardizedName());
+                mappingFieldInData.setDataNameList(Arrays.asList(mappingField.getDataName()));
+                mappingFieldInData.setRemoveCharactersList(null == mappingField.getRemoveCharacters() ? null :
+                        Arrays.asList(mappingField.getRemoveCharacters().split(",")));
+
+                mappingFieldInDataList.add(mappingFieldInData);
+            }
+            processExecutorInData.setMappingFieldList(mappingFieldInDataList);
+            processList.add(processExecutorInData);
+        }
+
+        inData.setProcessExecutorInDataList(processList);
+        saveProceeGroup(inData);
+    }
 }

+ 3 - 6
src/main/resources/application-dev.yml

@@ -23,12 +23,9 @@ spring:
     database: 1
 
 
-mybatis-plus:
-  configuration:
-    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-
-token:
-  secretKey: nflafam/sndbuoe;0f34i20jrte;t0osnfs.nls
+#mybatis-plus:
+#  configuration:
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 
 logging:
   config: classpath:logback-dev.xml

+ 0 - 8
src/main/resources/application-prod.yml

@@ -12,14 +12,6 @@ knife4j:
     password: znzn_prod
 
 
-mybatis-plus:
-  configuration:
-    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-
-token:
-  secretKey: jdj29lke8092-34204wdfnih8723309l;l;lf;wrwhgiq2nkhyisndfoupern
-
-
 spring:
   datasource:
     url: jdbc:mysql://192.168.50.235:30306/import_data_prod?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false

+ 6 - 6
src/main/resources/application.yml

@@ -15,10 +15,6 @@ spring:
       pool-prepared-statements: false
       remove-abandoned: false
       remove-abandoned-timeout-millis: 3000
-      stat:
-        log-slow-sql: true
-        merge-sql: true
-        slow-sql-millis: 2000
       test-on-borrow: false
       test-on-return: false
       test-while-idle: true
@@ -26,6 +22,10 @@ spring:
       validation-query: SELECT 'x'
   servlet:
     multipart:
-      max-file-size: 100MB
-      max-request-size: 100MB
+      max-file-size: 1000MB
+      max-request-size: 1000MB
 
+
+logging:
+  level:
+    com.dskj.znzn.importData.web.mapper: debug

+ 1 - 1
src/main/resources/mapper/ProcessMapper.xml → src/main/resources/mapper/ProcessExecutorMapper.xml

@@ -1,5 +1,5 @@
 <?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">
-<mapper namespace="com.dskj.znzn.importData.web.mapper.ProcessMapper">
+<mapper namespace="com.dskj.znzn.importData.web.mapper.ProcessExecutorMapper">
 
 </mapper>