wzl hai 1 ano
achega
52b27bc70d
Modificáronse 71 ficheiros con 3462 adicións e 0 borrados
  1. 3 0
      .gitignore
  2. 147 0
      pom.xml
  3. 13 0
      src/main/java/com/dskj/znzn/importData/ImportDataApplication.java
  4. 19 0
      src/main/java/com/dskj/znzn/importData/common/ThreadLocalUser.java
  5. 12 0
      src/main/java/com/dskj/znzn/importData/common/annotaions/NeedLogin.java
  6. 24 0
      src/main/java/com/dskj/znzn/importData/common/annotaions/NoRepeat.java
  7. 35 0
      src/main/java/com/dskj/znzn/importData/common/base/CurrentUser.java
  8. 29 0
      src/main/java/com/dskj/znzn/importData/common/base/PageInfo.java
  9. 38 0
      src/main/java/com/dskj/znzn/importData/common/base/PageR.java
  10. 56 0
      src/main/java/com/dskj/znzn/importData/common/base/R.java
  11. 50 0
      src/main/java/com/dskj/znzn/importData/common/conf/CommonWebMvcConfigurer.java
  12. 18 0
      src/main/java/com/dskj/znzn/importData/common/conf/MyBatisPlusConfig.java
  13. 83 0
      src/main/java/com/dskj/znzn/importData/common/conf/RedisConfigurer.java
  14. 46 0
      src/main/java/com/dskj/znzn/importData/common/conf/SwaggerConfiguration.java
  15. 18 0
      src/main/java/com/dskj/znzn/importData/common/exception/BusinessException.java
  16. 58 0
      src/main/java/com/dskj/znzn/importData/common/exception/GloableException.java
  17. 5 0
      src/main/java/com/dskj/znzn/importData/common/exception/UserNotLoginExeption.java
  18. 44 0
      src/main/java/com/dskj/znzn/importData/common/filter/AccessLogFilter.java
  19. 194 0
      src/main/java/com/dskj/znzn/importData/common/filter/AppInterceptor.java
  20. 41 0
      src/main/java/com/dskj/znzn/importData/common/filter/InterceptResponse.java
  21. 59 0
      src/main/java/com/dskj/znzn/importData/common/filter/ParamsRequestWrapper.java
  22. 91 0
      src/main/java/com/dskj/znzn/importData/common/service/RedisService.java
  23. 123 0
      src/main/java/com/dskj/znzn/importData/common/service/impl/RedisServiceImpl.java
  24. 92 0
      src/main/java/com/dskj/znzn/importData/common/utils/FileEncodingConverter.java
  25. 313 0
      src/main/java/com/dskj/znzn/importData/common/utils/IpUtils.java
  26. 82 0
      src/main/java/com/dskj/znzn/importData/generate/CodeGenerateMain.java
  27. 71 0
      src/main/java/com/dskj/znzn/importData/web/controller/BaseTemplateController.java
  28. 36 0
      src/main/java/com/dskj/znzn/importData/web/controller/BaseTemplateFieldController.java
  29. 36 0
      src/main/java/com/dskj/znzn/importData/web/controller/MappingFieldController.java
  30. 64 0
      src/main/java/com/dskj/znzn/importData/web/controller/ProcessController.java
  31. 36 0
      src/main/java/com/dskj/znzn/importData/web/controller/ProcessGroupController.java
  32. 44 0
      src/main/java/com/dskj/znzn/importData/web/entity/BaseTemplate.java
  33. 50 0
      src/main/java/com/dskj/znzn/importData/web/entity/BaseTemplateField.java
  34. 62 0
      src/main/java/com/dskj/znzn/importData/web/entity/MappingField.java
  35. 47 0
      src/main/java/com/dskj/znzn/importData/web/entity/Process.java
  36. 44 0
      src/main/java/com/dskj/znzn/importData/web/entity/ProcessGroup.java
  37. 24 0
      src/main/java/com/dskj/znzn/importData/web/indata/AddBaseTemplateInData.java
  38. 17 0
      src/main/java/com/dskj/znzn/importData/web/indata/EditBaseTemplateInData.java
  39. 19 0
      src/main/java/com/dskj/znzn/importData/web/indata/ReadExcepDataInData.java
  40. 23 0
      src/main/java/com/dskj/znzn/importData/web/indata/TemplateFields.java
  41. 15 0
      src/main/java/com/dskj/znzn/importData/web/mapper/BaseTemplateFieldMapper.java
  42. 14 0
      src/main/java/com/dskj/znzn/importData/web/mapper/BaseTemplateMapper.java
  43. 14 0
      src/main/java/com/dskj/znzn/importData/web/mapper/MappingFieldMapper.java
  44. 14 0
      src/main/java/com/dskj/znzn/importData/web/mapper/ProcessGroupMapper.java
  45. 14 0
      src/main/java/com/dskj/znzn/importData/web/mapper/ProcessMapper.java
  46. 24 0
      src/main/java/com/dskj/znzn/importData/web/outdata/GetBaseTemplateOutData.java
  47. 34 0
      src/main/java/com/dskj/znzn/importData/web/service/IBaseTemplateFieldService.java
  48. 62 0
      src/main/java/com/dskj/znzn/importData/web/service/IBaseTemplateService.java
  49. 25 0
      src/main/java/com/dskj/znzn/importData/web/service/IMappingFieldService.java
  50. 25 0
      src/main/java/com/dskj/znzn/importData/web/service/IProcessGroupService.java
  51. 38 0
      src/main/java/com/dskj/znzn/importData/web/service/IProcessService.java
  52. 54 0
      src/main/java/com/dskj/znzn/importData/web/service/impl/BaseTemplateFieldServiceImpl.java
  53. 140 0
      src/main/java/com/dskj/znzn/importData/web/service/impl/BaseTemplateServiceImpl.java
  54. 33 0
      src/main/java/com/dskj/znzn/importData/web/service/impl/MappingFieldServiceImpl.java
  55. 34 0
      src/main/java/com/dskj/znzn/importData/web/service/impl/ProcessGroupServiceImpl.java
  56. 107 0
      src/main/java/com/dskj/znzn/importData/web/service/impl/ProcessServiceImpl.java
  57. 34 0
      src/main/resources/application-dev.yml
  58. 40 0
      src/main/resources/application-prod.yml
  59. 31 0
      src/main/resources/application.yml
  60. 61 0
      src/main/resources/logback-dev.xml
  61. 61 0
      src/main/resources/logback-prod.xml
  62. 12 0
      src/main/resources/mapper/BaseTemplateFieldMapper.xml
  63. 5 0
      src/main/resources/mapper/BaseTemplateMapper.xml
  64. 5 0
      src/main/resources/mapper/MappingFieldMapper.xml
  65. 14 0
      src/main/resources/mapper/ProcessGroupMapper.xml
  66. 5 0
      src/main/resources/mapper/ProcessMapper.xml
  67. 59 0
      src/main/resources/templates/controller.java.vm
  68. 159 0
      src/main/resources/templates/entity.java.vm
  69. 18 0
      src/main/resources/templates/mapper.java.vm
  70. 17 0
      src/main/resources/templates/service.java.vm
  71. 28 0
      src/main/resources/templates/serviceImpl.java.vm

+ 3 - 0
.gitignore

@@ -0,0 +1,3 @@
+.idea
+target/
+ImportData.iml

+ 147 - 0
pom.xml

@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.dskj.znzn</groupId>
+    <artifactId>ImportData</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.7.18</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.21</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.30</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.7.15</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>2.0.26</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity</artifactId>
+            <version>1.7</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-spring-boot-starter</artifactId>
+            <version>3.0.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.dtflys.forest</groupId>
+            <artifactId>forest-spring-boot-starter</artifactId>
+            <version>1.5.36</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.5.7</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <version>3.5.3.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.1.10</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>4.0.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.17.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.googlecode.juniversalchardet</groupId>
+            <artifactId>juniversalchardet</artifactId>
+            <version>1.0.3</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.7.18</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <!-- 可选地指定 mainClass,但通常不是必需的 -->
+                <configuration>
+                    <mainClass>com.dskj.znzn.import.data.Application</mainClass>
+                </configuration>
+            </plugin>
+            <!-- 其他插件配置... -->
+        </plugins>
+    </build>
+
+</project>

+ 13 - 0
src/main/java/com/dskj/znzn/importData/ImportDataApplication.java

@@ -0,0 +1,13 @@
+package com.dskj.znzn.importData;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ImportDataApplication {
+
+    public static void main(String[] args) {
+
+        SpringApplication.run(ImportDataApplication.class, args);
+    }
+}

+ 19 - 0
src/main/java/com/dskj/znzn/importData/common/ThreadLocalUser.java

@@ -0,0 +1,19 @@
+package com.dskj.znzn.importData.common;
+
+import com.dskj.znzn.importData.common.base.CurrentUser;
+
+/**
+ *
+ */
+public class ThreadLocalUser {
+
+    private static final ThreadLocal<CurrentUser> userInfo = new ThreadLocal<>();
+
+    public static CurrentUser get() {
+        return userInfo.get();
+    }
+
+    public static void set(CurrentUser currentUser) {
+        userInfo.set(currentUser);
+    }
+}

+ 12 - 0
src/main/java/com/dskj/znzn/importData/common/annotaions/NeedLogin.java

@@ -0,0 +1,12 @@
+package com.dskj.znzn.importData.common.annotaions;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface NeedLogin {
+    boolean required() default true;
+}

+ 24 - 0
src/main/java/com/dskj/znzn/importData/common/annotaions/NoRepeat.java

@@ -0,0 +1,24 @@
+package com.dskj.znzn.importData.common.annotaions;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author 魏志亮
+ */
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface NoRepeat {
+
+    /**
+     * 单位秒
+     */
+    long timeout() default 1;
+
+    /**
+     * 次数
+     */
+    long count() default 1;
+}

+ 35 - 0
src/main/java/com/dskj/znzn/importData/common/base/CurrentUser.java

@@ -0,0 +1,35 @@
+package com.dskj.znzn.importData.common.base;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class CurrentUser {
+
+    private Integer userId;
+
+    private String userName;
+
+    private String deviceId;
+
+    private Date createDate;
+
+    private Date expireDate;
+
+    private String fromProject;
+
+    private Integer isVip = 0;
+
+    @Override
+    public String toString() {
+        return "CurrentUser{" +
+                "userId=" + userId +
+                ", userName='" + userName + '\'' +
+                ", deviceId='" + deviceId + '\'' +
+                ", createDate=" + createDate +
+                ", expireDate=" + expireDate +
+                ", fromProject='" + fromProject + '\'' +
+                '}';
+    }
+}

+ 29 - 0
src/main/java/com/dskj/znzn/importData/common/base/PageInfo.java

@@ -0,0 +1,29 @@
+package com.dskj.znzn.importData.common.base;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+
+@ApiModel(description = "分页信息")
+@Data
+public class PageInfo {
+
+    @ApiModelProperty(value = "查询页码")
+    @Min(value = 1)
+    private long pageNo;
+
+    @ApiModelProperty(value = "每页条数")
+    @Min(value = 1)
+    @Max(value = 100)
+    private long pageSize;
+
+    @ApiModelProperty(value = "排序规则")
+    private String orderBy;
+
+    @ApiModelProperty(name = "是否正序 false:否 true:是")
+    private Boolean isAsc;
+
+}

+ 38 - 0
src/main/java/com/dskj/znzn/importData/common/base/PageR.java

@@ -0,0 +1,38 @@
+package com.dskj.znzn.importData.common.base;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@ApiModel(description = "分页返回结果")
+@Data
+public class PageR<T> {
+
+    private int code;
+    private String message;
+    @ApiModelProperty(value = "总页码")
+    private long totalPage;
+    @ApiModelProperty(value = "总条数")
+    private long totalCount;
+    private List<T> datas;
+
+    public PageR(long totalPage, long totalCount, List<T> datas) {
+        this.code = 200;
+        this.message = "success";
+        this.totalCount = totalCount;
+        this.totalPage = totalPage;
+        this.datas = datas;
+    }
+
+    public static <T> PageR<T> page(long totalPage, long totalCount, List<T> datas) {
+        return new PageR(totalPage, totalCount, datas);
+    }
+
+    public static <T> PageR<T> page(IPage<T> page, List<T> datas) {
+        return new PageR(page.getPages(), page.getTotal(), datas);
+    }
+
+}

+ 56 - 0
src/main/java/com/dskj/znzn/importData/common/base/R.java

@@ -0,0 +1,56 @@
+package com.dskj.znzn.importData.common.base;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+@ApiModel(description = "返回结果")
+@Data
+public class R<T> {
+
+    private int code;
+    private String message;
+    private T datas;
+
+    public R(int code, T datas) {
+        this.code = code;
+        this.message = message;
+        this.datas = datas;
+    }
+
+    public R(int code, String message, T datas) {
+        this.code = code;
+        this.message = message;
+        this.datas = datas;
+    }
+
+    public static R ok() {
+        return new R(200, "success", null);
+    }
+
+    public static <T> R<T> ok(T datas) {
+        return new R(200, "success", datas);
+    }
+
+    public static <T> R<T> ok(String message, T datas) {
+        return new R(200, message, datas);
+    }
+
+
+    public static <T> R<T> ok(int code, String message, T datas) {
+        return new R(code, message, datas);
+    }
+
+    public static R error() {
+        return new R(500, "fail", null);
+    }
+
+    public static R error(String message) {
+        return new R(500, message, null);
+    }
+
+
+    public static R error(int code, String message) {
+        return new R(code, message, null);
+    }
+
+}

+ 50 - 0
src/main/java/com/dskj/znzn/importData/common/conf/CommonWebMvcConfigurer.java

@@ -0,0 +1,50 @@
+package com.dskj.znzn.importData.common.conf;
+
+import com.dskj.znzn.importData.common.filter.AppInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
+
+/**
+ * @author 魏志亮
+ */
+@Configuration
+public class CommonWebMvcConfigurer extends WebMvcConfigurationSupport {
+
+    @Bean
+    public HandlerInterceptor getInterceptor() {
+        return new AppInterceptor();
+    }
+
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
+        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
+    }
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(getInterceptor())
+                .addPathPatterns("/**")
+                .excludePathPatterns("/swagger-resources/**", "/v2/**", "/doc.html", "/webjars/**");
+        super.addInterceptors(registry);
+    }
+
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+        // 设置允许跨域的路径
+        registry.addMapping("/**")
+                // 设置允许跨域请求的域名
+                .allowedOrigins("*")
+                // 设置允许的方法
+                .allowedMethods("GET", "POST", "DELETE", "PUT")
+                // 设置允许的header属性
+                .allowedHeaders("*")
+                // 跨域允许时间
+                .maxAge(3600);
+    }
+}

+ 18 - 0
src/main/java/com/dskj/znzn/importData/common/conf/MyBatisPlusConfig.java

@@ -0,0 +1,18 @@
+package com.dskj.znzn.importData.common.conf;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MyBatisPlusConfig {
+
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+        return interceptor;
+    }
+}

+ 83 - 0
src/main/java/com/dskj/znzn/importData/common/conf/RedisConfigurer.java

@@ -0,0 +1,83 @@
+package com.dskj.znzn.importData.common.conf;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cache.CacheManager;
+import org.springframework.cache.annotation.CachingConfigurer;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.cache.interceptor.KeyGenerator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.cache.RedisCacheConfiguration;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.*;
+
+import javax.annotation.Resource;
+import java.time.Duration;
+
+/**
+ * Redis Configuration
+ */
+@Configuration
+@EnableCaching
+@Slf4j
+public class RedisConfigurer implements CachingConfigurer {
+    @Resource
+    RedisConnectionFactory factory;
+
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate() {
+        RedisTemplate<String, Object> template = new RedisTemplate<>();
+        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
+        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
+        ObjectMapper om = new ObjectMapper();
+        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        jackson2JsonRedisSerializer.setObjectMapper(om);
+        template.setConnectionFactory(factory);
+        //key序列化方式
+        template.setKeySerializer(redisSerializer);
+        template.setHashKeySerializer(redisSerializer);
+        //value序列化
+        template.setValueSerializer(new StringRedisSerializer());
+        //value hashmap序列化
+        template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
+        //key hashmap序列化
+        template.setHashKeySerializer(redisSerializer);
+        return template;
+    }
+
+
+    @Bean
+    @Override
+    public CacheManager cacheManager() {
+        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
+        //解决查询缓存转换异常的问题
+        ObjectMapper om = new ObjectMapper();
+        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        // 配置序列化(解决乱码的问题),过期时间10天
+        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
+                .entryTtl(Duration.ofMinutes(10))
+                .computePrefixWith(name -> name + ":")
+                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
+                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
+                .disableCachingNullValues();
+        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
+                .cacheDefaults(config)
+                .build();
+        log.info("redis config ={}", config.toString());
+        return cacheManager;
+    }
+
+
+    @Bean
+    public KeyGenerator jfKeyGenerator() {
+        return (target, method, params) -> {
+            return "";
+        };
+    }
+}
+

+ 46 - 0
src/main/java/com/dskj/znzn/importData/common/conf/SwaggerConfiguration.java

@@ -0,0 +1,46 @@
+package com.dskj.znzn.importData.common.conf;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
+
+
+@Configuration
+@Import(BeanValidatorPluginsConfiguration.class)
+@EnableSwagger2WebMvc
+public class SwaggerConfiguration {
+
+    @Value("${spring.profiles.active}")
+    private String env;
+
+    @Bean(value = "defaultApi")
+    public Docket defaultApi() {
+
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())
+                .groupName("dev".equals(env) ? "测试" : "生产")
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.dskj.znzn"))
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title("中能智能数据导入接口文档")
+                .termsOfServiceUrl("https://doc.weizhiliang.top/")
+                .contact(new Contact("魏志亮", "https://www.weizhiliang.top", "727204053@qq.com"))
+                .version("1.0")
+                .build();
+    }
+}

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

@@ -0,0 +1,18 @@
+package com.dskj.znzn.importData.common.exception;
+
+public class BusinessException extends RuntimeException {
+
+    private int code;
+
+    private String message;
+
+    public BusinessException(String message) {
+        super(message);
+        this.code = 500;
+    }
+
+    public BusinessException(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+}

+ 58 - 0
src/main/java/com/dskj/znzn/importData/common/exception/GloableException.java

@@ -0,0 +1,58 @@
+package com.dskj.znzn.importData.common.exception;
+
+import com.dskj.znzn.importData.common.base.R;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import java.util.List;
+
+@Slf4j
+@RestControllerAdvice
+public class GloableException {
+
+    @ExceptionHandler(BusinessException.class)
+    @ResponseBody
+    public R businessExdeption(BusinessException e) {
+        log.error("Exception", e);
+        return R.error(e.getMessage());
+    }
+
+    @ExceptionHandler(UserNotLoginExeption.class)
+    @ResponseBody
+    public R userNotLoginExeption(UserNotLoginExeption e) {
+        log.error("Exception", e);
+        return R.error(401, "Unauthorized");
+    }
+
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    @ResponseBody
+    public R methodArgumentNotValidException(MethodArgumentNotValidException e) {
+        List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
+
+        // 这里你可以根据自己的需要来处理错误
+        // 例如,构建一个响应体,其中包含所有字段的错误信息
+        StringBuilder errorMessage = new StringBuilder();
+        for (FieldError fieldError : fieldErrors) {
+            if (errorMessage.length() != 0) {
+                errorMessage.append("\n - ");
+            }
+            errorMessage.append(fieldError.getField())
+                    .append(": ")
+                    .append(fieldError.getDefaultMessage());
+        }
+        log.error("Exception", e);
+        return R.error(errorMessage.toString());
+    }
+
+    @ExceptionHandler(Exception.class)
+    @ResponseBody
+    public R exception(Exception e) {
+        log.info("Exception: [{}]", e.getMessage());
+        log.error("Exception", e);
+        return R.error("请求异常,请重试或联系管理员");
+    }
+}

+ 5 - 0
src/main/java/com/dskj/znzn/importData/common/exception/UserNotLoginExeption.java

@@ -0,0 +1,5 @@
+package com.dskj.znzn.importData.common.exception;
+
+public class UserNotLoginExeption extends RuntimeException {
+
+}

+ 44 - 0
src/main/java/com/dskj/znzn/importData/common/filter/AccessLogFilter.java

@@ -0,0 +1,44 @@
+package com.dskj.znzn.importData.common.filter;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 日志过滤器,用于记录日志
+ *
+ * @author 魏志亮
+ */
+@Slf4j
+@Component
+public class AccessLogFilter implements Filter {
+
+    @Override
+    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+
+        HttpServletRequest request = (HttpServletRequest) servletRequest;
+        String path = request.getServletPath();
+
+        List<String> urls = Arrays.asList(".", "api-docs");
+        for (String url : urls) {
+            if (path.contains(url)) {
+                filterChain.doFilter(servletRequest, servletResponse);
+                return;
+            }
+        }
+        //如果上传文件,直接调用 doFilter
+        if (null != request.getContentType() && request.getContentType().contains(MediaType.MULTIPART_FORM_DATA_VALUE)) {
+            filterChain.doFilter(servletRequest, servletResponse);
+            return;
+        }
+
+        filterChain.doFilter(new ParamsRequestWrapper(request), servletResponse);
+    }
+
+}

+ 194 - 0
src/main/java/com/dskj/znzn/importData/common/filter/AppInterceptor.java

@@ -0,0 +1,194 @@
+package com.dskj.znzn.importData.common.filter;
+
+import cn.hutool.core.codec.Base64;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.dskj.znzn.importData.common.ThreadLocalUser;
+import com.dskj.znzn.importData.common.annotaions.NeedLogin;
+import com.dskj.znzn.importData.common.annotaions.NoRepeat;
+import com.dskj.znzn.importData.common.base.CurrentUser;
+import com.dskj.znzn.importData.common.exception.UserNotLoginExeption;
+import com.dskj.znzn.importData.common.service.RedisService;
+import com.dskj.znzn.importData.common.utils.IpUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.MDC;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.lang.reflect.Method;
+import java.util.Enumeration;
+import java.util.UUID;
+
+/**
+ * @author 魏志亮
+ */
+@Component
+@Slf4j
+public class AppInterceptor implements HandlerInterceptor {
+
+    @Resource
+    private RedisService redisService;
+
+    private static final String BEGIN_REQUEST_TIME = "BEGIN_REQUEST_TIME";
+    private static final String TRACE_ID = "TRACE_ID";
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+
+        createBase(request);
+
+        // 如果不是映射到方法直接通过
+        if (!(handler instanceof HandlerMethod)) {
+            return true;
+        }
+
+        HandlerMethod handlerMethod = (HandlerMethod) handler;
+        Method method = handlerMethod.getMethod();
+        //是否需要登录
+        loginInfo(request, method);
+
+//        noRepeatInfo(method);
+
+        printRequestHead(request);
+        printRequestParams(request);
+
+        return true;
+    }
+
+    public void createBase(HttpServletRequest request) {
+        MDC.put(TRACE_ID, UUID.randomUUID().toString().replaceAll("-", ""));
+        request.setAttribute(BEGIN_REQUEST_TIME, System.currentTimeMillis());
+    }
+
+    //TODO 暂时用不到先不实现呢
+    private void noRepeatInfo(Method method) {
+
+        if (method.isAnnotationPresent(NoRepeat.class)) {
+
+        }
+    }
+
+    private void loginInfo(HttpServletRequest request, Method method) {
+        String token = request.getHeader("token");
+        CurrentUser currentUser = new CurrentUser();
+
+        if (StringUtils.isNotEmpty(token)) {
+            String userName = "";
+            Integer userId = null;
+            try {
+                String infoBase64 = token.split("\\.")[1];
+                JSONObject info = JSON.parseObject(new String(Base64.decode(infoBase64)));
+                userName = info.getString("userName");
+                userId = info.getInteger("userId");
+
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            String result = redisService.get(String.format("zhzn_energy_system_user_login_info:%s", userName));
+            if (StringUtils.isNotBlank(result) && result.equals(token)) {
+                currentUser.setUserId(userId);
+                currentUser.setUserName(userName);
+            }
+        }
+
+        boolean loginFlag = true;
+        if (method.getDeclaringClass().isAnnotationPresent(NeedLogin.class)) {
+            NeedLogin parentNeedLogin = method.getDeclaringClass().getAnnotation(NeedLogin.class);
+            // 类上需要登录 判断方法是否需要登录,如果不需要登录,那就不需要
+            if (parentNeedLogin.required()) {
+                if (method.isAnnotationPresent(NeedLogin.class)) {
+                    NeedLogin needLogin = method.getAnnotation(NeedLogin.class);
+                    if (!needLogin.required()) {
+                        loginFlag = false;
+                    }
+                }
+            } else {
+                loginFlag = false;
+                if (method.isAnnotationPresent(NeedLogin.class)) {
+                    NeedLogin needLogin = method.getAnnotation(NeedLogin.class);
+                    if (needLogin.required()) {
+                        loginFlag = true;
+                    }
+                }
+            }
+        } else {
+            //类方法没有 则直接根据方法上的进行判断
+            if (method.isAnnotationPresent(NeedLogin.class)) {
+                NeedLogin needLogin = method.getAnnotation(NeedLogin.class);
+                loginFlag = needLogin.required();
+            } else {
+                loginFlag = false;
+            }
+        }
+
+        if (loginFlag) {
+            if (null == currentUser.getUserId()) {
+                throw new UserNotLoginExeption();
+            }
+        }
+        ThreadLocalUser.set(currentUser);
+        log.info("请求的用户信息:[{}]", currentUser);
+    }
+
+    private void printRequestParams(HttpServletRequest request) {
+
+        log.info("请求地址:[{}]", request.getRequestURI());
+        log.info("请求IP:[{}]", IpUtils.getIpAddr(request));
+        log.info("请求类型[{}]", request.getContentType());
+        log.info("请求方式:[{}]", request.getMethod());
+
+        String mediaType = request.getContentType();
+        if (null != mediaType) {
+            if (mediaType.contains(MediaType.APPLICATION_JSON_VALUE)) {
+                log.info("请求BODY:[{}]", ((ParamsRequestWrapper) request).getBody());
+            } else if (mediaType.contains(MediaType.APPLICATION_FORM_URLENCODED_VALUE)) {
+                JSONObject argParamJson = new JSONObject();
+                Enumeration params = request.getParameterNames();
+                while (params.hasMoreElements()) {
+                    String param = (String) params.nextElement();
+                    argParamJson.put(param, request.getParameter(param));
+                }
+                log.info("请求PARAM:[{}]", argParamJson);
+            } else {
+                JSONObject argParamJson = new JSONObject();
+                Enumeration params = request.getParameterNames();
+                while (params.hasMoreElements()) {
+                    String param = (String) params.nextElement();
+                    argParamJson.put(param, request.getParameter(param));
+                }
+                log.info("请求PARAM:[{}]", argParamJson);
+                log.info("请求FILE:[{}]", "文件类型");
+            }
+        }
+    }
+
+
+    private void printRequestHead(HttpServletRequest request) {
+        JSONObject headJson = new JSONObject();
+        Enumeration<String> enumeration = request.getHeaderNames();
+        while (enumeration.hasMoreElements()) {
+            String name = enumeration.nextElement();
+            headJson.put(name, request.getHeader(name));
+        }
+        log.info("请求头信息[{}]", headJson);
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
+        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
+        log.info("请求时长:[{}]", System.currentTimeMillis() - Long.parseLong(request.getAttribute(BEGIN_REQUEST_TIME) + ""));
+        MDC.clear();
+    }
+}

+ 41 - 0
src/main/java/com/dskj/znzn/importData/common/filter/InterceptResponse.java

@@ -0,0 +1,41 @@
+package com.dskj.znzn.importData.common.filter;
+
+import com.alibaba.fastjson.JSON;
+import com.dskj.znzn.importData.common.base.PageR;
+import com.dskj.znzn.importData.common.base.R;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.MethodParameter;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.http.server.ServletServerHttpRequest;
+import org.springframework.http.server.ServletServerHttpResponse;
+import org.springframework.lang.Nullable;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@ControllerAdvice
+@Slf4j
+public class InterceptResponse implements ResponseBodyAdvice<Object> {
+    @Override
+    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
+        return true;
+    }
+
+    @Override
+    public Object beforeBodyWrite(@Nullable Object body, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
+        ServletServerHttpResponse responseTemp = (ServletServerHttpResponse) serverHttpResponse;
+        HttpServletResponse resp = responseTemp.getServletResponse();
+        ServletServerHttpRequest sshr = (ServletServerHttpRequest) serverHttpRequest;
+        HttpServletRequest req = sshr.getServletRequest();
+        //此处的 Result 对象是我自定义的返回值类型,具体根据自己需求修改即可
+        if (body instanceof R || body instanceof PageR) {
+            log.info("返回结果[{}]", JSON.toJSONString(body));
+        }
+        return body;
+    }
+}

+ 59 - 0
src/main/java/com/dskj/znzn/importData/common/filter/ParamsRequestWrapper.java

@@ -0,0 +1,59 @@
+package com.dskj.znzn.importData.common.filter;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.IOUtils;
+
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+
+@Slf4j
+public class ParamsRequestWrapper extends HttpServletRequestWrapper {
+    @Getter
+    @Setter
+    private String body;
+
+    ParamsRequestWrapper(HttpServletRequest request) throws IOException {
+        super(request);
+        body = IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8);
+    }
+
+    @Override
+    public ServletInputStream getInputStream() {
+        final ByteArrayInputStream bais = new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8));
+        return new ServletInputStream() {
+            @Override
+            public boolean isFinished() {
+                return false;
+            }
+
+            @Override
+            public boolean isReady() {
+                return false;
+            }
+
+            @Override
+            public void setReadListener(ReadListener listener) {
+
+            }
+
+            @Override
+            public int read() {
+                return bais.read();
+            }
+        };
+    }
+
+    @Override
+    public BufferedReader getReader() {
+        return new BufferedReader(new InputStreamReader(getInputStream()));
+    }
+}

+ 91 - 0
src/main/java/com/dskj/znzn/importData/common/service/RedisService.java

@@ -0,0 +1,91 @@
+package com.dskj.znzn.importData.common.service;
+
+import java.util.Set;
+
+public interface RedisService {
+
+    /**
+     * 指定缓存失效时间
+     *
+     * @param key  键
+     * @param time 时间(秒)
+     * @return
+     */
+    boolean expire(String key, long time);
+
+    /**
+     * @param key 键 不能为null
+     * @return 时间(秒) 返回0代表为永久有效
+     */
+    long getExpire(String key);
+
+    /**
+     * 判断key是否存在
+     *
+     * @param key 键
+     * @return true 存在 false不存在
+     */
+    boolean hasKey(String key);
+
+    /**
+     * 删除缓存
+     *
+     * @param key 可以传一个值 或多个
+     */
+    void del(String... key);
+// ============================String=============================
+
+    /**
+     * 普通缓存获取
+     *
+     * @param key 键
+     * @return 值
+     */
+    String get(String key);
+
+    /**
+     * 普通缓存放入
+     *
+     * @param key   键
+     * @param value 值
+     * @return true成功 false失败
+     */
+    boolean set(String key, Object value);
+
+    /**
+     * 普通缓存放入并设置时间
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期
+     * @return true成功 false 失败
+     */
+    boolean set(String key, Object value, long time);
+
+    /**
+     * 递增
+     *
+     * @param key   键
+     * @param delta 要增加几(大于0)
+     * @return
+     */
+    long incr(String key, long delta);
+
+    /**
+     * 递减
+     *
+     * @param key   键
+     * @param delta 要减少几(小于0)
+     * @return
+     */
+    long decr(String key, long delta);
+
+    /**
+     * 获取通配符所有key
+     * @param key
+     * @return
+     */
+    Set keys(String key);
+
+    void delKeys(Set keys);
+}

+ 123 - 0
src/main/java/com/dskj/znzn/importData/common/service/impl/RedisServiceImpl.java

@@ -0,0 +1,123 @@
+package com.dskj.znzn.importData.common.service.impl;
+
+
+import com.dskj.znzn.importData.common.service.RedisService;
+import lombok.AllArgsConstructor;
+import lombok.extern.java.Log;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Collection;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+@Service
+@Log
+@AllArgsConstructor
+public class RedisServiceImpl implements RedisService {
+
+    private RedisTemplate<String, Object> redisTemplate;
+
+    @Override
+    public boolean expire(String key, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.expire(key, time, TimeUnit.SECONDS);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public long getExpire(String key) {
+        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
+    }
+
+    @Override
+    public boolean hasKey(String key) {
+        try {
+            return redisTemplate.hasKey(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public void del(String... key) {
+        if (key != null && key.length > 0) {
+            if (key.length == 1) {
+                redisTemplate.delete(key[0]);
+            } else {
+                redisTemplate.delete((Collection<String>) CollectionUtils.arrayToList(key));
+            }
+        }
+    }
+
+    @Override
+    public String get(String key) {
+        if (StringUtils.isBlank(key)) {
+            return null;
+        }
+        Object value = redisTemplate.opsForValue().get(key);
+        return value == null ? null : String.valueOf(value);
+    }
+
+    @Override
+    public boolean set(String key, Object value) {
+        try {
+            redisTemplate.opsForValue().set(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public boolean set(String key, Object value, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
+            } else {
+                set(key, value);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public long incr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("递增因子必须大于0");
+        }
+        return redisTemplate.opsForValue().increment(key, delta);
+    }
+
+    @Override
+    public long decr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("递减因子必须大于0");
+        }
+        return redisTemplate.opsForValue().increment(key, -delta);
+    }
+
+    @Override
+    public Set keys(String key) {
+        return redisTemplate.keys(key);
+    }
+
+    @Override
+    public void delKeys(Set keys) {
+        redisTemplate.delete(keys);
+    }
+}

+ 92 - 0
src/main/java/com/dskj/znzn/importData/common/utils/FileEncodingConverter.java

@@ -0,0 +1,92 @@
+package com.dskj.znzn.importData.common.utils;
+
+import org.mozilla.universalchardet.UniversalDetector;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+
+public class FileEncodingConverter {
+
+    /**
+     * 检测文件的编码
+     *
+     * @param fis 文件流
+     * @return 检测到的编码
+     * @throws IOException 如果读取文件时发生错误
+     */
+    public static String detectFileCharset(InputStream fis) throws IOException {
+        byte[] buf = new byte[4096];
+        UniversalDetector detector = new UniversalDetector(null);
+
+        int nRead;
+        while ((nRead = fis.read(buf)) > 0 && !detector.isDone()) {
+            detector.handleData(buf, 0, nRead);
+        }
+        detector.dataEnd();
+
+        String detectedCharset = detector.getDetectedCharset();
+        detector.reset();
+
+        return detectedCharset;
+    }
+
+    /**
+     * 转化文件到 InputStream流
+     *
+     * @param fileName 文件名
+     * @return
+     * @throws IOException
+     */
+    public static InputStream convertFileToInputStream(String fileName) throws IOException {
+        return convertFileToInputStream(new FileInputStream(fileName));
+    }
+
+
+    public static InputStream convertFileToInputStream(InputStream inputStream) throws IOException {
+        String detectedCharset = detectFileCharset(inputStream);
+        System.out.println(" 文件编码: " + detectedCharset);
+        if (StandardCharsets.UTF_8.displayName().equalsIgnoreCase(detectedCharset)) {
+            return inputStream;
+        } else {
+            try (InputStreamReader reader = new InputStreamReader(inputStream, detectedCharset);
+                 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
+
+                // 将 InputStreamReader 读取的字符数据转换为字节数据并写入 ByteArrayOutputStream
+                char[] buffer = new char[1024];
+                int len;
+                while ((len = reader.read(buffer)) != -1) {
+                    byte[] bytes = new String(buffer, 0, len).getBytes(StandardCharsets.UTF_8);
+                    byteArrayOutputStream.write(bytes);
+                }
+
+                // 从 ByteArrayOutputStream 中获取 ByteArrayInputStream
+                return new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
+            }
+        }
+    }
+
+    /**
+     * 将文件转换为 UTF-8 编码
+     *
+     * @param inputFileName  输入文件路径
+     * @param outputFileName 输出文件路径
+     * @param sourceCharset  源文件的编码
+     * @throws IOException 如果读取或写入文件时发生错误
+     */
+    public static void convertFileToUtf8(String inputFileName, String outputFileName, String sourceCharset) throws
+            IOException {
+        try (InputStream inputStream = new FileInputStream(inputFileName);
+             InputStreamReader reader = new InputStreamReader(inputStream, sourceCharset);
+             BufferedReader bufferedReader = new BufferedReader(reader);
+             OutputStream outputStream = new FileOutputStream(outputFileName);
+             OutputStreamWriter writer = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);
+             BufferedWriter bufferedWriter = new BufferedWriter(writer)) {
+
+            String line;
+            while ((line = bufferedReader.readLine()) != null) {
+                bufferedWriter.write(line);
+                bufferedWriter.newLine();
+            }
+        }
+    }
+}

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

@@ -0,0 +1,313 @@
+package com.dskj.znzn.importData.common.utils;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * 获取IP方法
+ *
+ * @author ruoyi
+ */
+public class IpUtils {
+    public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)";
+    // 匹配 ip
+    public final static String REGX_IP = "((" + REGX_0_255 + "\\.){3}" + REGX_0_255 + ")";
+    public final static String REGX_IP_WILDCARD = "(((\\*\\.){3}\\*)|(" + REGX_0_255 + "(\\.\\*){3})|(" + REGX_0_255 + "\\." + REGX_0_255 + ")(\\.\\*){2}" + "|((" + REGX_0_255 + "\\.){3}\\*))";
+    // 匹配网段
+    public final static String REGX_IP_SEG = "(" + REGX_IP + "\\-" + REGX_IP + ")";
+
+    /**
+     * 获取客户端IP
+     *
+     * @param request 请求对象
+     * @return IP地址
+     */
+    public static String getIpAddr(HttpServletRequest request) {
+        if (request == null) {
+            return "unknown";
+        }
+        String ip = request.getHeader("x-forwarded-for");
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("X-Forwarded-For");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("X-Real-IP");
+        }
+
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddr();
+        }
+
+        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip);
+    }
+
+    /**
+     * 检查是否为内部IP地址
+     *
+     * @param ip IP地址
+     * @return 结果
+     */
+    public static boolean internalIp(String ip) {
+        byte[] addr = textToNumericFormatV4(ip);
+        return internalIp(addr) || "127.0.0.1".equals(ip);
+    }
+
+    /**
+     * 检查是否为内部IP地址
+     *
+     * @param addr byte地址
+     * @return 结果
+     */
+    private static boolean internalIp(byte[] addr) {
+        if (null == addr || addr.length < 2) {
+            return true;
+        }
+        final byte b0 = addr[0];
+        final byte b1 = addr[1];
+        // 10.x.x.x/8
+        final byte SECTION_1 = 0x0A;
+        // 172.16.x.x/12
+        final byte SECTION_2 = (byte) 0xAC;
+        final byte SECTION_3 = (byte) 0x10;
+        final byte SECTION_4 = (byte) 0x1F;
+        // 192.168.x.x/16
+        final byte SECTION_5 = (byte) 0xC0;
+        final byte SECTION_6 = (byte) 0xA8;
+        switch (b0) {
+            case SECTION_1:
+                return true;
+            case SECTION_2:
+                if (b1 >= SECTION_3 && b1 <= SECTION_4) {
+                    return true;
+                }
+            case SECTION_5:
+                if (b1 == SECTION_6) {
+                    return true;
+                }
+            default:
+                return false;
+        }
+    }
+
+    /**
+     * 将IPv4地址转换成字节
+     *
+     * @param text IPv4地址
+     * @return byte 字节
+     */
+    public static byte[] textToNumericFormatV4(String text) {
+        if (text.length() == 0) {
+            return null;
+        }
+
+        byte[] bytes = new byte[4];
+        String[] elements = text.split("\\.", -1);
+        try {
+            long l;
+            int i;
+            switch (elements.length) {
+                case 1:
+                    l = Long.parseLong(elements[0]);
+                    if ((l < 0L) || (l > 4294967295L)) {
+                        return null;
+                    }
+                    bytes[0] = (byte) (int) (l >> 24 & 0xFF);
+                    bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF);
+                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
+                    bytes[3] = (byte) (int) (l & 0xFF);
+                    break;
+                case 2:
+                    l = Integer.parseInt(elements[0]);
+                    if ((l < 0L) || (l > 255L)) {
+                        return null;
+                    }
+                    bytes[0] = (byte) (int) (l & 0xFF);
+                    l = Integer.parseInt(elements[1]);
+                    if ((l < 0L) || (l > 16777215L)) {
+                        return null;
+                    }
+                    bytes[1] = (byte) (int) (l >> 16 & 0xFF);
+                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
+                    bytes[3] = (byte) (int) (l & 0xFF);
+                    break;
+                case 3:
+                    for (i = 0; i < 2; ++i) {
+                        l = Integer.parseInt(elements[i]);
+                        if ((l < 0L) || (l > 255L)) {
+                            return null;
+                        }
+                        bytes[i] = (byte) (int) (l & 0xFF);
+                    }
+                    l = Integer.parseInt(elements[2]);
+                    if ((l < 0L) || (l > 65535L)) {
+                        return null;
+                    }
+                    bytes[2] = (byte) (int) (l >> 8 & 0xFF);
+                    bytes[3] = (byte) (int) (l & 0xFF);
+                    break;
+                case 4:
+                    for (i = 0; i < 4; ++i) {
+                        l = Integer.parseInt(elements[i]);
+                        if ((l < 0L) || (l > 255L)) {
+                            return null;
+                        }
+                        bytes[i] = (byte) (int) (l & 0xFF);
+                    }
+                    break;
+                default:
+                    return null;
+            }
+        } catch (NumberFormatException e) {
+            return null;
+        }
+        return bytes;
+    }
+
+    /**
+     * 获取IP地址
+     *
+     * @return 本地IP地址
+     */
+    public static String getHostIp() {
+        try {
+            return InetAddress.getLocalHost().getHostAddress();
+        } catch (UnknownHostException ignored) {
+        }
+        return "127.0.0.1";
+    }
+
+    /**
+     * 获取主机名
+     *
+     * @return 本地主机名
+     */
+    public static String getHostName() {
+        try {
+            return InetAddress.getLocalHost().getHostName();
+        } catch (UnknownHostException ignored) {
+        }
+        return "未知";
+    }
+
+    /**
+     * 从多级反向代理中获得第一个非unknown IP地址
+     *
+     * @param ip 获得的IP地址
+     * @return 第一个非unknown IP地址
+     */
+    public static String getMultistageReverseProxyIp(String ip) {
+        // 多级反向代理检测
+        if (ip != null && ip.indexOf(",") > 0) {
+            final String[] ips = ip.trim().split(",");
+            for (String subIp : ips) {
+                if (!isUnknown(subIp)) {
+                    ip = subIp;
+                    break;
+                }
+            }
+        }
+        return StringUtils.substring(ip, 0, 255);
+    }
+
+    /**
+     * 检测给定字符串是否为未知,多用于检测HTTP请求相关
+     *
+     * @param checkString 被检测的字符串
+     * @return 是否未知
+     */
+    public static boolean isUnknown(String checkString) {
+        return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString);
+    }
+
+    /**
+     * 是否为IP
+     */
+    public static boolean isIP(String ip) {
+        return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP);
+    }
+
+    /**
+     * 是否为IP,或 *为间隔的通配符地址
+     */
+    public static boolean isIpWildCard(String ip) {
+        return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD);
+    }
+
+    /**
+     * 检测参数是否在ip通配符里
+     */
+    public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip) {
+        String[] s1 = ipWildCard.split("\\.");
+        String[] s2 = ip.split("\\.");
+        boolean isMatchedSeg = true;
+        for (int i = 0; i < s1.length && !s1[i].equals("*"); i++) {
+            if (!s1[i].equals(s2[i])) {
+                isMatchedSeg = false;
+                break;
+            }
+        }
+        return isMatchedSeg;
+    }
+
+    /**
+     * 是否为特定格式如:“10.10.10.1-10.10.10.99”的ip段字符串
+     */
+    public static boolean isIPSegment(String ipSeg) {
+        return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG);
+    }
+
+    /**
+     * 判断ip是否在指定网段中
+     */
+    public static boolean ipIsInNetNoCheck(String iparea, String ip) {
+        int idx = iparea.indexOf('-');
+        String[] sips = iparea.substring(0, idx).split("\\.");
+        String[] sipe = iparea.substring(idx + 1).split("\\.");
+        String[] sipt = ip.split("\\.");
+        long ips = 0L, ipe = 0L, ipt = 0L;
+        for (int i = 0; i < 4; ++i) {
+            ips = ips << 8 | Integer.parseInt(sips[i]);
+            ipe = ipe << 8 | Integer.parseInt(sipe[i]);
+            ipt = ipt << 8 | Integer.parseInt(sipt[i]);
+        }
+        if (ips > ipe) {
+            long t = ips;
+            ips = ipe;
+            ipe = t;
+        }
+        return ips <= ipt && ipt <= ipe;
+    }
+
+    /**
+     * 校验ip是否符合过滤串规则
+     *
+     * @param filter 过滤IP列表,支持后缀'*'通配,支持网段如:`10.10.10.1-10.10.10.99`
+     * @param ip     校验IP地址
+     * @return boolean 结果
+     */
+    public static boolean isMatchedIp(String filter, String ip) {
+        if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip)) {
+            return false;
+        }
+        String[] ips = filter.split(";");
+        for (String iStr : ips) {
+            if (isIP(iStr) && iStr.equals(ip)) {
+                return true;
+            } else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip)) {
+                return true;
+            } else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}

+ 82 - 0
src/main/java/com/dskj/znzn/importData/generate/CodeGenerateMain.java

@@ -0,0 +1,82 @@
+package com.dskj.znzn.importData.generate;
+
+import com.baomidou.mybatisplus.generator.FastAutoGenerator;
+import com.baomidou.mybatisplus.generator.config.OutputFile;
+import com.baomidou.mybatisplus.generator.config.po.LikeTable;
+import com.baomidou.mybatisplus.generator.config.rules.DateType;
+import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
+import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
+
+import java.io.File;
+import java.io.IOException;
+import java.sql.Types;
+import java.util.Collections;
+
+import static com.baomidou.mybatisplus.core.enums.SqlLike.RIGHT;
+
+/**
+ * @author 魏志亮
+ */
+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 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:查询全部  前缀_:匹配
+        String includTables = "all";
+
+        //去掉表前缀
+        String replaceTablePrefix = "";
+
+        File directory = new File("");
+        //项目路径-mgb
+        String sourcePath = String.join(File.separator, directory.getCanonicalPath(), "src", "main");
+        String javaPath = sourcePath + File.separator + "java";
+        String resouces = sourcePath + File.separator + "resources";
+        String xmlPahth = String.join(File.separator, resouces, "mapper");
+
+        FastAutoGenerator.create(url, username, password).
+                globalConfig(builder -> builder.author("魏志亮")
+                        .enableSwagger()
+                        .dateType(DateType.ONLY_DATE)
+                        .outputDir(javaPath))
+                .dataSourceConfig(builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
+                    int typeCode = metaInfo.getJdbcType().TYPE_CODE;
+                    if (typeCode == Types.TINYINT) {
+                        // 自定义类型转换
+                        return DbColumnType.INTEGER;
+                    }
+                    return typeRegistry.getColumnType(metaInfo);
+                })).
+                packageConfig(builder -> {
+                    builder.parent("com.dskj.znzn.importData.web");
+                    builder.pathInfo(Collections.singletonMap(OutputFile.xml, xmlPahth)); // 设置mapperXml生成路径
+                })
+                .strategyConfig(builder -> {
+                    builder.enableSkipView();
+                    builder.addTablePrefix(replaceTablePrefix);
+                    builder.disableSqlFilter();
+                    if ("all".equalsIgnoreCase(includTables)) {
+                        builder.likeTable(new LikeTable(""));
+                    } else if (includTables.endsWith("_")) {
+                        builder.likeTable(new LikeTable(includTables, RIGHT));
+                    } else {
+                        builder.addInclude(includTables);
+                    }
+                    builder.entityBuilder().enableLombok().enableFileOverride();
+                    builder.controllerBuilder().enableRestStyle().enableFileOverride();
+                    builder.mapperBuilder().enableFileOverride();
+
+
+                })
+                .templateEngine(new VelocityTemplateEngine())
+                .execute();
+
+    }
+}

+ 71 - 0
src/main/java/com/dskj/znzn/importData/web/controller/BaseTemplateController.java

@@ -0,0 +1,71 @@
+package com.dskj.znzn.importData.web.controller;
+
+import com.dskj.znzn.importData.common.base.R;
+import com.dskj.znzn.importData.web.entity.BaseTemplate;
+import com.dskj.znzn.importData.web.indata.AddBaseTemplateInData;
+import com.dskj.znzn.importData.web.indata.EditBaseTemplateInData;
+import com.dskj.znzn.importData.web.outdata.GetBaseTemplateOutData;
+import com.dskj.znzn.importData.web.service.IBaseTemplateService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+
+/**
+ * @author 魏志亮
+ * @since 2024-10-30
+ */
+@RestController
+@RequestMapping("baseTemplate")
+@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
+@Api(tags = "基础模板")
+public class BaseTemplateController {
+
+    private final IBaseTemplateService baseTemplateService;
+
+    @ApiOperation(value = "根据ID获取")
+    @GetMapping("/get/{id}")
+    public R<GetBaseTemplateOutData> getBaseDataById(@PathVariable Integer id) {
+        return R.ok(baseTemplateService.getBaseDataById(id));
+    }
+
+    @ApiOperation(value = "获取所有基础模板")
+    @GetMapping("getAllEnabled")
+    public R<List<BaseTemplate>> getAllEnabled() {
+        return R.ok(baseTemplateService.getAllEnabled());
+    }
+
+    @ApiOperation(value = "添加模板")
+    @PostMapping("addTemplate")
+    public R addTemplate(@Validated @RequestBody AddBaseTemplateInData inData) {
+        baseTemplateService.addTemplate(inData);
+        return R.ok();
+    }
+
+    @ApiOperation(value = "删除模板")
+    @PostMapping("/del/{id}")
+    public R deleteTemplate(@PathVariable Integer id) {
+        baseTemplateService.deleteTemplate(id);
+        return R.ok();
+    }
+
+    @ApiOperation(value = "编辑模板")
+    @PostMapping("editTemplate")
+    public R editTemplate(@Valid @RequestBody EditBaseTemplateInData inData) {
+        baseTemplateService.editTemplate(inData);
+        return R.ok();
+    }
+
+    @ApiOperation(value = "查询模板是否已被使用")
+    @GetMapping("/queryUsed/{id}")
+    public R<List> queryUsed(@PathVariable Integer id) {
+        baseTemplateService.queryUsed(id);
+        return R.ok();
+    }
+}

+ 36 - 0
src/main/java/com/dskj/znzn/importData/web/controller/BaseTemplateFieldController.java

@@ -0,0 +1,36 @@
+package com.dskj.znzn.importData.web.controller;
+
+import com.dskj.znzn.importData.common.base.R;
+import com.dskj.znzn.importData.web.entity.BaseTemplateField;
+import com.dskj.znzn.importData.web.service.IBaseTemplateFieldService;
+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 java.util.List;
+
+
+/**
+ * @author 魏志亮
+ * @since 2024-10-30
+ */
+@RestController
+@RequestMapping("baseTemplateField")
+@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
+@Api(tags = "基础模板-字段")
+public class BaseTemplateFieldController {
+
+    private final IBaseTemplateFieldService baseTemplateFieldService;
+
+    @ApiOperation(value = "根据模板ID获取")
+    @GetMapping("/template/{templateId}")
+    public R<List<BaseTemplateField>> getByTemplateId(@PathVariable Integer templateId) {
+        return R.ok(baseTemplateFieldService.getByTemplateId(templateId));
+    }
+
+}

+ 36 - 0
src/main/java/com/dskj/znzn/importData/web/controller/MappingFieldController.java

@@ -0,0 +1,36 @@
+package com.dskj.znzn.importData.web.controller;
+
+import com.dskj.znzn.importData.common.base.R;
+import com.dskj.znzn.importData.web.entity.MappingField;
+import com.dskj.znzn.importData.web.service.IMappingFieldService;
+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 java.util.List;
+
+
+/**
+ * @author 魏志亮
+ * @since 2024-10-30
+ */
+@RestController
+@RequestMapping("mappingField")
+@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
+@Api(tags = "映射字段")
+public class MappingFieldController {
+
+    private final IMappingFieldService mappingFieldService;
+
+    @ApiOperation(value = "根据执行器ID获取所有映射关系")
+    @GetMapping("/processId/{processId}")
+    public R<List<MappingField>> getByProcessId(@PathVariable Integer processId) {
+        return R.ok(mappingFieldService.getByProcessId(processId));
+    }
+
+}

+ 64 - 0
src/main/java/com/dskj/znzn/importData/web/controller/ProcessController.java

@@ -0,0 +1,64 @@
+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.indata.ReadExcepDataInData;
+import com.dskj.znzn.importData.web.service.IProcessService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+
+/**
+ * @author 魏志亮
+ * @since 2024-10-30
+ */
+@RestController
+@RequestMapping("process")
+@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
+@Api(tags = "执行器")
+public class ProcessController {
+
+    private final IProcessService processService;
+
+    @ApiOperation(value = "根据执行器组ID获取所有执行器")
+    @GetMapping("/processGroup/{processGroupId}")
+    public R<List<Process>> getByProcessGroupId(@PathVariable Integer processGroupId) {
+        return R.ok(processService.getByProcessGroupId(processGroupId));
+    }
+
+    @ApiOperation(value = "读取excel数据")
+    @PostMapping("readExcelData")
+    @ApiImplicitParam(name = "file", value = "文件", required = true, dataType = "file", paramType = "query")
+    public R<List<Map<Integer, Object>>> readExcelData(@RequestParam("file") MultipartFile[] files, ReadExcepDataInData inData) throws Exception {
+
+        if (null == files || files.length == 0) {
+            throw new BusinessException("文件不能为空");
+        }
+        MultipartFile file = files[0];
+        if (file.isEmpty()) {
+            throw new BusinessException("文件不能为空");
+        }
+
+        String fileName = file.getOriginalFilename();
+        assert fileName != null;
+        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(Locale.ROOT);
+        List<String> suffixList = Arrays.asList("xls", "xlsx", "csv");
+        if (!suffixList.contains(suffix)) {
+            throw new BusinessException("文件格式不支持,当前支持:" + String.join(",", suffixList));
+        }
+
+        return R.ok(processService.readExcelData(fileName, file.getInputStream(), suffix, inData));
+    }
+
+}

+ 36 - 0
src/main/java/com/dskj/znzn/importData/web/controller/ProcessGroupController.java

@@ -0,0 +1,36 @@
+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.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 java.util.List;
+
+
+/**
+ * @author 魏志亮
+ * @since 2024-10-30
+ */
+@RestController
+@RequestMapping("processGroup")
+@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
+@Api(tags = "执行器组")
+public class ProcessGroupController {
+
+    private final IProcessGroupService processGroupService;
+
+    @ApiOperation(value = "根据模板ID获取")
+    @GetMapping("/template/{templateId}")
+    public R<List<ProcessGroup>> getByTemplateId(@PathVariable Integer templateId) {
+        return R.ok(processGroupService.getByTemplateId(templateId));
+    }
+
+}

+ 44 - 0
src/main/java/com/dskj/znzn/importData/web/entity/BaseTemplate.java

@@ -0,0 +1,44 @@
+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;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author 魏志亮
+ * @since 2024-10-30
+ */
+@Getter
+@Setter
+@TableName("base_template")
+@ApiModel(value = "BaseTemplate对象", description = "基础模板")
+public class BaseTemplate implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("名称")
+    private String name;
+
+    @ApiModelProperty("0:不可用 1:可用: 2:不可编辑")
+    private Integer status;
+
+    @ApiModelProperty("创建时间")
+    @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")
+    private Date updateTime;
+}

+ 50 - 0
src/main/java/com/dskj/znzn/importData/web/entity/BaseTemplateField.java

@@ -0,0 +1,50 @@
+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;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author 魏志亮
+ * @since 2024-10-30
+ */
+@Getter
+@Setter
+@TableName("base_template_field")
+@ApiModel(value = "BaseTemplateField对象", description = "基础模板-字段")
+public class BaseTemplateField implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("模板ID")
+    private Integer templateId;
+
+    @ApiModelProperty("标准化字段")
+    private String standardizedName;
+
+    @ApiModelProperty("是否是索引列,合并表的时候,多个文件合并使用 0:不是,非必填  1:是,必填,  默认0")
+    private Integer isIndex;
+
+    @ApiModelProperty("是否是切割文件的字段 0:不是 1:是 ,默认0")
+    private Integer isCutCol;
+
+    @ApiModelProperty("创建时间")
+    @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")
+    private Date updateTime;
+}

+ 62 - 0
src/main/java/com/dskj/znzn/importData/web/entity/MappingField.java

@@ -0,0 +1,62 @@
+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;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author 魏志亮
+ * @since 2024-10-30
+ */
+@Getter
+@Setter
+@TableName("mapping_field")
+@ApiModel(value = "MappingField对象", description = "映射字段")
+public class MappingField implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("模板ID")
+    private Integer templateId;
+
+    @ApiModelProperty("模版标准化字段ID")
+    private Integer templateFiledId;
+
+    @ApiModelProperty("处理器组ID")
+    private Integer processGourpId;
+
+    @ApiModelProperty("处理器ID")
+    private Integer processId;
+
+    @ApiModelProperty("标准化字段")
+    private String standardizedName;
+
+    @ApiModelProperty("0: 原始列名 1: 文件名  2:sheet_name(只允许excel格式的,csv不支持)")
+    private Integer dataNameType;
+
+    @ApiModelProperty("数据对应的名称,如有多个丨号 分割")
+    private String dataName;
+
+    @ApiModelProperty("移除的字符串,如有多个丨号 分割")
+    private String removeCharacters;
+
+    @ApiModelProperty("创建时间")
+    @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")
+    private Date updateTime;
+}

+ 47 - 0
src/main/java/com/dskj/znzn/importData/web/entity/Process.java

@@ -0,0 +1,47 @@
+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;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author 魏志亮
+ * @since 2024-10-30
+ */
+@Getter
+@Setter
+@TableName("process")
+@ApiModel(value = "Process对象", description = "执行器")
+public class Process implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("处理器组ID")
+    private Integer groupId;
+
+    @ApiModelProperty("处理器名称")
+    private String name;
+
+    @ApiModelProperty("0:不可用 1:可用")
+    private Integer status;
+
+    @ApiModelProperty("创建时间")
+    @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")
+    private Date updateTime;
+}

+ 44 - 0
src/main/java/com/dskj/znzn/importData/web/entity/ProcessGroup.java

@@ -0,0 +1,44 @@
+package com.dskj.znzn.importData.web.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author 魏志亮
+ * @since 2024-10-30
+ */
+@Getter
+@Setter
+@TableName("process_group")
+@ApiModel(value = "ProcessGroup对象", description = "执行器组")
+public class ProcessGroup implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    private Integer id;
+
+    @ApiModelProperty("模板ID")
+    private Integer templateId;
+
+    @ApiModelProperty("执行器组名称")
+    private String name;
+
+    @ApiModelProperty("0:不可用 1:可用")
+    private Integer status;
+
+    @ApiModelProperty("创建时间")
+    @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")
+    private Date updateTime;
+}

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

@@ -0,0 +1,24 @@
+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 java.util.List;
+
+@ApiModel
+@Data
+public class AddBaseTemplateInData {
+
+    @ApiModelProperty("名称")
+    @NotBlank(message = "模板名称不能为空")
+    private String name;
+
+    @ApiModelProperty("模板配置属性")
+    @NotEmpty(message = "模板字段不能为空")
+    @Valid
+    List<TemplateFields> templateFieldsList;
+}

+ 17 - 0
src/main/java/com/dskj/znzn/importData/web/indata/EditBaseTemplateInData.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;
+
+@ApiModel
+@Data
+public class EditBaseTemplateInData extends AddBaseTemplateInData {
+
+    @ApiModelProperty("模板ID")
+    @NotNull(message = "模板ID不能为空")
+    private Integer id;
+
+}

+ 19 - 0
src/main/java/com/dskj/znzn/importData/web/indata/ReadExcepDataInData.java

@@ -0,0 +1,19 @@
+package com.dskj.znzn.importData.web.indata;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel
+public class ReadExcepDataInData {
+
+    @ApiModelProperty("是否包含表头 0:不包含 1:包含")
+    private Integer hasColName = 1;
+
+    @ApiModelProperty("读取哪一行")
+    private Integer readRowNum;
+
+    @ApiModelProperty("读取行数")
+    private Integer readRowCount = 20;
+}

+ 23 - 0
src/main/java/com/dskj/znzn/importData/web/indata/TemplateFields.java

@@ -0,0 +1,23 @@
+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;
+
+@Data
+@ApiModel
+public class TemplateFields {
+
+    @ApiModelProperty("标准化字段")
+    @NotBlank(message = "标准化字段不能为空")
+    private String standardizedName;
+
+    @ApiModelProperty("是否是索引列,合并表的时候,多个文件合并使用 0:不是,非必填  1:是,必填,  默认0")
+    private Integer isIndex = 0;
+
+    @ApiModelProperty("是否是切割文件的字段 0:不是 1:是 ,默认0")
+    private Integer isCutCol = 0;
+
+}

+ 15 - 0
src/main/java/com/dskj/znzn/importData/web/mapper/BaseTemplateFieldMapper.java

@@ -0,0 +1,15 @@
+package com.dskj.znzn.importData.web.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dskj.znzn.importData.web.entity.BaseTemplateField;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author 魏志亮
+ * @since 2024-10-30
+ */
+@Mapper
+public interface BaseTemplateFieldMapper extends BaseMapper<BaseTemplateField> {
+
+    void deleteByTemplateId(Integer templateId);
+}

+ 14 - 0
src/main/java/com/dskj/znzn/importData/web/mapper/BaseTemplateMapper.java

@@ -0,0 +1,14 @@
+package com.dskj.znzn.importData.web.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dskj.znzn.importData.web.entity.BaseTemplate;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author 魏志亮
+ * @since 2024-10-30
+ */
+@Mapper
+public interface BaseTemplateMapper extends BaseMapper<BaseTemplate> {
+
+}

+ 14 - 0
src/main/java/com/dskj/znzn/importData/web/mapper/MappingFieldMapper.java

@@ -0,0 +1,14 @@
+package com.dskj.znzn.importData.web.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dskj.znzn.importData.web.entity.MappingField;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author 魏志亮
+ * @since 2024-10-30
+ */
+@Mapper
+public interface MappingFieldMapper extends BaseMapper<MappingField> {
+
+}

+ 14 - 0
src/main/java/com/dskj/znzn/importData/web/mapper/ProcessGroupMapper.java

@@ -0,0 +1,14 @@
+package com.dskj.znzn.importData.web.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dskj.znzn.importData.web.entity.ProcessGroup;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author 魏志亮
+ * @since 2024-10-30
+ */
+@Mapper
+public interface ProcessGroupMapper extends BaseMapper<ProcessGroup> {
+
+}

+ 14 - 0
src/main/java/com/dskj/znzn/importData/web/mapper/ProcessMapper.java

@@ -0,0 +1,14 @@
+package com.dskj.znzn.importData.web.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dskj.znzn.importData.web.entity.Process;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author 魏志亮
+ * @since 2024-10-30
+ */
+@Mapper
+public interface ProcessMapper extends BaseMapper<Process> {
+
+}

+ 24 - 0
src/main/java/com/dskj/znzn/importData/web/outdata/GetBaseTemplateOutData.java

@@ -0,0 +1,24 @@
+package com.dskj.znzn.importData.web.outdata;
+
+import com.dskj.znzn.importData.web.entity.BaseTemplate;
+import com.dskj.znzn.importData.web.entity.BaseTemplateField;
+import com.dskj.znzn.importData.web.entity.ProcessGroup;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@ApiModel
+@Data
+public class GetBaseTemplateOutData {
+
+    @ApiModelProperty("模板信息")
+    private BaseTemplate baseTemplate;
+
+    @ApiModelProperty("模板中的标准化字段")
+    private List<BaseTemplateField> fieldList;
+
+    @ApiModelProperty("使用这个模板的执行器组")
+    private List<ProcessGroup> useTemplateGroupList;
+}

+ 34 - 0
src/main/java/com/dskj/znzn/importData/web/service/IBaseTemplateFieldService.java

@@ -0,0 +1,34 @@
+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 java.util.List;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author 魏志亮
+ * @since 2024-10-29
+ */
+public interface IBaseTemplateFieldService extends IService<BaseTemplateField> {
+
+    /**
+     * 通过模板ID获取标准化字段
+     *
+     * @param templateId 模板ID
+     * @return
+     */
+    List<BaseTemplateField> getByTemplateId(Integer templateId);
+
+    /**
+     * 删除历史数据并添加新的数据
+     *
+     * @param id                 模板ID
+     * @param templateFieldsList 标准化字段
+     */
+    void deleteAndSaveByTemplateId(Integer id, List<TemplateFields> templateFieldsList);
+}

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

@@ -0,0 +1,62 @@
+package com.dskj.znzn.importData.web.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dskj.znzn.importData.web.entity.BaseTemplate;
+import com.dskj.znzn.importData.web.indata.AddBaseTemplateInData;
+import com.dskj.znzn.importData.web.indata.EditBaseTemplateInData;
+import com.dskj.znzn.importData.web.outdata.GetBaseTemplateOutData;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author 魏志亮
+ * @since 2024-10-29
+ */
+public interface IBaseTemplateService extends IService<BaseTemplate> {
+
+    /**
+     * 获取所有可用基础模板
+     *
+     * @return 所有可用基础模板
+     */
+    List<BaseTemplate> getAllEnabled();
+
+    /**
+     * 新增模板
+     *
+     * @param inData 模板数据
+     */
+    void addTemplate(AddBaseTemplateInData inData);
+
+    /**
+     * 删除模板
+     *
+     * @param id 主键
+     */
+    void deleteTemplate(Integer id);
+
+    /**
+     * 查询当前模板是佛被使用
+     *
+     * @param id 模板ID
+     */
+    void queryUsed(Integer id);
+
+    /**
+     * 获取本模板下的所有信息
+     *
+     * @param id 模板ID
+     * @return
+     */
+    GetBaseTemplateOutData getBaseDataById(Integer id);
+
+    /**
+     * 编辑模板
+     * @param inData 编辑模板
+     */
+    void editTemplate(EditBaseTemplateInData inData);
+}

+ 25 - 0
src/main/java/com/dskj/znzn/importData/web/service/IMappingFieldService.java

@@ -0,0 +1,25 @@
+package com.dskj.znzn.importData.web.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dskj.znzn.importData.web.entity.MappingField;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author 魏志亮
+ * @since 2024-10-29
+ */
+public interface IMappingFieldService extends IService<MappingField> {
+
+    /**
+     * 通过执行器ID获取所有映射关系
+     *
+     * @param processId 执行器ID
+     * @return 所有映射字段
+     */
+    List<MappingField> getByProcessId(Integer processId);
+}

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

@@ -0,0 +1,25 @@
+package com.dskj.znzn.importData.web.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dskj.znzn.importData.web.entity.ProcessGroup;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author 魏志亮
+ * @since 2024-10-29
+ */
+public interface IProcessGroupService extends IService<ProcessGroup> {
+
+    /**
+     * 查询使用了模板的执行器组名称
+     *
+     * @param templateId 模板ID
+     * @return 执行器组的名称
+     */
+    List<ProcessGroup> getByTemplateId(Integer templateId);
+}

+ 38 - 0
src/main/java/com/dskj/znzn/importData/web/service/IProcessService.java

@@ -0,0 +1,38 @@
+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.indata.ReadExcepDataInData;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author 魏志亮
+ * @since 2024-10-29
+ */
+public interface IProcessService extends IService<Process> {
+
+    /**
+     * 同构执行组ID获取执行器
+     *
+     * @param processGroupId 执行组ID
+     * @return
+     */
+    List<Process> getByProcessGroupId(Integer processGroupId);
+
+    /**
+     * @param fileName    文件名
+     * @param inputStream 文件流
+     * @param suffix      后缀
+     * @param inData      入参
+     * @return 列明数据
+     */
+    List<Map<Integer, Object>> readExcelData(String fileName, InputStream inputStream, String suffix, ReadExcepDataInData inData) throws IOException;
+}

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

@@ -0,0 +1,54 @@
+package com.dskj.znzn.importData.web.service.impl;
+
+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.mapper.BaseTemplateFieldMapper;
+import com.dskj.znzn.importData.web.service.IBaseTemplateFieldService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author 魏志亮
+ * @since 2024-10-29
+ */
+@Service
+@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
+public class BaseTemplateFieldServiceImpl extends ServiceImpl<BaseTemplateFieldMapper, BaseTemplateField> implements IBaseTemplateFieldService {
+
+    private final BaseTemplateFieldMapper baseTemplateFieldMapper;
+
+    @Override
+    public List<BaseTemplateField> getByTemplateId(Integer templateId) {
+        LambdaQueryWrapper<BaseTemplateField> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(BaseTemplateField::getTemplateId, templateId);
+        return list(queryWrapper);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteAndSaveByTemplateId(Integer id, List<TemplateFields> templateFieldsList) {
+        baseTemplateFieldMapper.deleteByTemplateId(id);
+        List<BaseTemplateField> fieldsList = new ArrayList<>();
+        for (TemplateFields fields : templateFieldsList) {
+            BaseTemplateField baseTemplateField = new BaseTemplateField();
+            baseTemplateField.setTemplateId(id);
+            baseTemplateField.setStandardizedName(fields.getStandardizedName());
+            baseTemplateField.setIsIndex(fields.getIsIndex());
+            baseTemplateField.setIsCutCol(fields.getIsCutCol());
+            fieldsList.add(baseTemplateField);
+        }
+        saveBatch(fieldsList, 100);
+    }
+}

+ 140 - 0
src/main/java/com/dskj/znzn/importData/web/service/impl/BaseTemplateServiceImpl.java

@@ -0,0 +1,140 @@
+package com.dskj.znzn.importData.web.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+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.BaseTemplate;
+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.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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author 魏志亮
+ * @since 2024-10-29
+ */
+@Service
+@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
+public class BaseTemplateServiceImpl extends ServiceImpl<BaseTemplateMapper, BaseTemplate> implements IBaseTemplateService {
+
+    private final IBaseTemplateFieldService baseTemplateFieldService;
+
+    private final IProcessGroupService processGroupService;
+
+    @Override
+    public List<BaseTemplate> getAllEnabled() {
+        LambdaQueryWrapper<BaseTemplate> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.ne(BaseTemplate::getStatus, 0);
+        return list(queryWrapper);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addTemplate(AddBaseTemplateInData inData) {
+        LambdaQueryWrapper<BaseTemplate> baseWrapper = Wrappers.lambdaQuery();
+        baseWrapper.eq(BaseTemplate::getName, inData.getName()).ne(BaseTemplate::getStatus, 0);
+        if (count(baseWrapper) > 0) {
+            throw new BusinessException("目标名称已存在");
+        }
+
+        BaseTemplate baseTemplate = new BaseTemplate();
+        baseTemplate.setName(inData.getName());
+        save(baseTemplate);
+
+        Integer id = baseTemplate.getId();
+        List<BaseTemplateField> fieldsList = new ArrayList<>();
+        for (TemplateFields fields : inData.getTemplateFieldsList()) {
+            BaseTemplateField baseTemplateField = new BaseTemplateField();
+            baseTemplateField.setTemplateId(id);
+            baseTemplateField.setStandardizedName(fields.getStandardizedName());
+            baseTemplateField.setIsIndex(fields.getIsIndex());
+            baseTemplateField.setIsCutCol(fields.getIsCutCol());
+            fieldsList.add(baseTemplateField);
+        }
+        baseTemplateFieldService.saveBatch(fieldsList, 100);
+    }
+
+    @Override
+    public void deleteTemplate(Integer id) {
+        BaseTemplate baseTemplate = new BaseTemplate();
+        baseTemplate.setId(id);
+        baseTemplate.setStatus(0);
+        updateById(baseTemplate);
+    }
+
+    @Override
+    public void queryUsed(Integer id) {
+        BaseTemplate baseTemplate = getById(id);
+        if (null == baseTemplate || baseTemplate.getStatus() == 0) {
+            throw new BusinessException("查询模板不存在或已删除");
+        }
+
+        List<ProcessGroup> usedGroupList = processGroupService.getByTemplateId(id);
+        if (!usedGroupList.isEmpty()) {
+            String names = usedGroupList.stream().map(ProcessGroup::getName).collect(Collectors.joining(","));
+            throw new BusinessException("模板已被:[" + names + "]使用");
+        }
+    }
+
+    @Override
+    public GetBaseTemplateOutData getBaseDataById(Integer id) {
+        BaseTemplate baseTemplate = getById(id);
+        List<BaseTemplateField> fieldList = baseTemplateFieldService.getByTemplateId(id);
+        List<ProcessGroup> groupList = processGroupService.getByTemplateId(id);
+
+        GetBaseTemplateOutData data = new GetBaseTemplateOutData();
+        data.setBaseTemplate(baseTemplate);
+        data.setFieldList(fieldList);
+        data.setUseTemplateGroupList(groupList);
+
+        return data;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void editTemplate(EditBaseTemplateInData inData) {
+        Integer id = inData.getId();
+        BaseTemplate baseTemplate = getById(id);
+        if (null == baseTemplate || baseTemplate.getStatus() == 0) {
+            throw new BusinessException("查询模板不存在或已删除");
+        }
+
+        if (baseTemplate.getStatus() == 2) {
+            throw new BusinessException("默认模板不允许编辑");
+        }
+
+        List<ProcessGroup> usedGroupList = processGroupService.getByTemplateId(id);
+        if (!usedGroupList.isEmpty()) {
+            String names = usedGroupList.stream().map(ProcessGroup::getName).collect(Collectors.joining(","));
+            throw new BusinessException("模板已被:[" + names + "]使用");
+        }
+        if (!StringUtils.equals(inData.getName(), baseTemplate.getName())) {
+            BaseTemplate update = new BaseTemplate();
+            update.setId(id);
+            update.setName(inData.getName());
+            updateById(update);
+        }
+
+        baseTemplateFieldService.deleteAndSaveByTemplateId(id,inData.getTemplateFieldsList());
+    }
+}

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

@@ -0,0 +1,33 @@
+package com.dskj.znzn.importData.web.service.impl;
+
+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.MappingField;
+import com.dskj.znzn.importData.web.mapper.MappingFieldMapper;
+import com.dskj.znzn.importData.web.service.IMappingFieldService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author 魏志亮
+ * @since 2024-10-29
+ */
+@Service
+@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
+public class MappingFieldServiceImpl extends ServiceImpl<MappingFieldMapper, MappingField> implements IMappingFieldService {
+
+    @Override
+    public List<MappingField> getByProcessId(Integer processId) {
+        LambdaQueryWrapper<MappingField> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(MappingField::getProcessId, processId);
+        return list(queryWrapper);
+    }
+}

+ 34 - 0
src/main/java/com/dskj/znzn/importData/web/service/impl/ProcessGroupServiceImpl.java

@@ -0,0 +1,34 @@
+package com.dskj.znzn.importData.web.service.impl;
+
+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.ProcessGroup;
+import com.dskj.znzn.importData.web.mapper.ProcessGroupMapper;
+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;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author 魏志亮
+ * @since 2024-10-29
+ */
+@Service
+@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
+public class ProcessGroupServiceImpl extends ServiceImpl<ProcessGroupMapper, ProcessGroup> implements IProcessGroupService {
+
+    @Override
+    public List<ProcessGroup> getByTemplateId(Integer templateId) {
+        LambdaQueryWrapper<ProcessGroup> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(ProcessGroup::getTemplateId, templateId)
+                .eq(ProcessGroup::getStatus, 1);
+        return list(queryWrapper);
+    }
+}

+ 107 - 0
src/main/java/com/dskj/znzn/importData/web/service/impl/ProcessServiceImpl.java

@@ -0,0 +1,107 @@
+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.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.indata.ReadExcepDataInData;
+import com.dskj.znzn.importData.web.mapper.ProcessMapper;
+import com.dskj.znzn.importData.web.service.IProcessService;
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.dskj.znzn.importData.common.utils.FileEncodingConverter.convertFileToInputStream;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author 魏志亮
+ * @since 2024-10-29
+ */
+@Service
+@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
+public class ProcessServiceImpl extends ServiceImpl<ProcessMapper, Process> implements IProcessService {
+
+    @Override
+    public List<Process> getByProcessGroupId(Integer processGroupId) {
+        LambdaQueryWrapper<Process> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(Process::getGroupId, processGroupId)
+                .eq(Process::getStatus, 1);
+        return list(queryWrapper);
+    }
+
+    @Override
+    public List<Map<Integer, Object>> readExcelData(String fileName, InputStream inputStream, String suffix, ReadExcepDataInData inData) throws IOException {
+        List<Map<Integer, Object>> data = new ArrayList<>();
+
+        if ("csv".equals(suffix)) {
+            inputStream = convertFileToInputStream(inputStream);
+        }
+
+        EasyExcel.read(inputStream, new AnalysisEventListener<Map<Integer, Object>>() {
+
+            @SneakyThrows
+            @Override
+            public void invoke(Map<Integer, Object> obj, AnalysisContext context) {
+                System.out.println("当前行数" + context.readRowHolder().getRowIndex());
+                if (null != inData.getReadRowNum() && inData.getReadRowNum().equals(context.readRowHolder().getRowIndex() - 1)) {
+                    for (Integer key : obj.keySet()) {
+                        obj.computeIfAbsent(key, k -> "缺失列名" + k);
+                    }
+                    data.add(obj);
+                } else {
+                    for (Integer key : obj.keySet()) {
+                        obj.computeIfAbsent(key, k -> "缺失列名" + (k + 1));
+                    }
+                    data.add(obj);
+                }
+
+
+//                obj.put(-2, "文件名");
+//                obj.put(-1, context.readSheetHolder().getSheetName());
+//                obj.put(-1, "sheet名称");
+            }
+
+            @Override
+            public boolean hasNext(AnalysisContext context) {
+                if (context.readRowHolder().getRowIndex() > inData.getReadRowCount() - 1) {
+                    return false;
+                }
+
+                if (null != inData.getReadRowNum() && inData.getReadRowNum() > context.readRowHolder().getRowIndex() - 1) {
+                    return false;
+                }
+
+                return super.hasNext(context);
+            }
+
+            @Override
+            public void doAfterAllAnalysed(AnalysisContext context) {
+
+            }
+        }).sheet().doRead();
+
+        if (inData.getHasColName() == 0) {
+            Set<Integer> keys = data.stream().map(Map::keySet).flatMap(Collection::stream).collect(Collectors.toSet());
+            Map<Integer, Object> obj = new LinkedHashMap<>(keys.size());
+            for (Integer key : keys) {
+                obj.computeIfAbsent(key, k -> "无列名" + (k + 1));
+            }
+            data.add(0, obj);
+        }
+
+        return data;
+    }
+}

+ 34 - 0
src/main/resources/application-dev.yml

@@ -0,0 +1,34 @@
+server:
+  port: 8001
+knife4j:
+  enable: true
+  setting:
+    language: zh-CN
+    swagger-model-name: 模型
+
+spring:
+  datasource:
+    url: jdbc:mysql://192.168.50.235:30306/import_data?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false
+    username: root
+    password: admin123456
+
+  redis:
+    host: 192.168.50.233
+    port: 6379
+    password: 123456
+    jedis:
+      pool:
+        max-active: 8
+        max-wait: -1
+    database: 1
+
+
+mybatis-plus:
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+
+token:
+  secretKey: nflafam/sndbuoe;0f34i20jrte;t0osnfs.nls
+
+logging:
+  config: classpath:logback-dev.xml

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

@@ -0,0 +1,40 @@
+server:
+  port: 8002
+
+knife4j:
+  enable: true
+  setting:
+    language: zh-CN
+    swagger-model-name: 模型
+  basic:
+    enable: true
+    username: znzn
+    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
+    username: root
+    password: admin123456
+
+  redis:
+    host: 192.168.50.233
+    port: 6379
+    password: 123456
+    jedis:
+      pool:
+        max-active: 8
+        max-wait: -1
+    database: 10
+
+logging:
+  config: classpath:logback-prod.xml

+ 31 - 0
src/main/resources/application.yml

@@ -0,0 +1,31 @@
+server:
+  port: 8001
+spring:
+  profiles:
+    active: dev
+
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    druid:
+      initial-size: 30
+      log-abandoned: false
+      max-active: 300
+      max-wait: 600000
+      min-idle: 20
+      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
+      time-between-eviction-runs-millis: 60000
+      validation-query: SELECT 'x'
+  servlet:
+    multipart:
+      max-file-size: 100MB
+      max-request-size: 100MB
+

+ 61 - 0
src/main/resources/logback-dev.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="true" scan="false" scanPeriod="1 seconds">
+    <property name="PATTERN"
+              value="%d{yyyy-MM-dd HH:mm:ss.SSS} %X{TRACE_ID} [%thread] %-5level %logger[%L] - %m%n"/>
+    <property name="CHARSET" value="utf-8"/>
+    <property name="MAX_FILE_SIZE" value="200MB"/>
+    <property name="MAX_HISTORY" value="30"/>
+    <property name="BASE_LOG_PATH" value="/data/logs"/>
+    <property name="SERVICE_NAME" value="ImportData"/>
+
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${PATTERN}</pattern>
+            <charset>${CHARSET}</charset>
+        </encoder>
+    </appender>
+
+    <appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>${BASE_LOG_PATH}/${SERVICE_NAME}/dev/info.log</File>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>INFO</level>
+        </filter>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${BASE_LOG_PATH}/${SERVICE_NAME}/dev/info/%d{yyyy-MM-dd}.%i.log
+            </fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <maxHistory>${MAX_HISTORY}</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${PATTERN}</pattern>
+            <charset>${CHARSET}</charset>
+        </encoder>
+    </appender>
+
+    <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>${BASE_LOG_PATH}/${SERVICE_NAME}/dev/error.log</File>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>ERROR</level>
+        </filter>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${BASE_LOG_PATH}/${SERVICE_NAME}/dev/error/%d{yyyy-MM-dd}.%i.log
+            </fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <maxHistory>${MAX_HISTORY}</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${PATTERN}</pattern>
+            <charset>${CHARSET}</charset>
+        </encoder>
+    </appender>
+
+    <root level="INFO">
+        <appender-ref ref="fileAppender"/>
+        <appender-ref ref="errorAppender"/>
+        <appender-ref ref="console"/>
+    </root>
+</configuration>

+ 61 - 0
src/main/resources/logback-prod.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="true" scan="false" scanPeriod="1 seconds">
+    <property name="PATTERN"
+              value="%d{yyyy-MM-dd HH:mm:ss.SSS} %X{TRACE_ID} [%thread] %-5level %logger[%L] - %m%n"/>
+    <property name="CHARSET" value="utf-8"/>
+    <property name="MAX_FILE_SIZE" value="200MB"/>
+    <property name="MAX_HISTORY" value="30"/>
+    <property name="BASE_LOG_PATH" value="/data/collection_data/logs"/>
+    <property name="SERVICE_NAME" value="ImportData"/>
+
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${PATTERN}</pattern>
+            <charset>${CHARSET}</charset>
+        </encoder>
+    </appender>
+
+    <appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>${BASE_LOG_PATH}/${SERVICE_NAME}/prod/info.log</File>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>INFO</level>
+        </filter>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${BASE_LOG_PATH}/${SERVICE_NAME}/prod/info/info/%d{yyyy-MM-dd}.%i.log
+            </fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <maxHistory>${MAX_HISTORY}</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${PATTERN}</pattern>
+            <charset>${CHARSET}</charset>
+        </encoder>
+    </appender>
+
+    <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>${BASE_LOG_PATH}/${SERVICE_NAME}/prod/error.log</File>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>ERROR</level>
+        </filter>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${BASE_LOG_PATH}/${SERVICE_NAME}/prod/error/%d{yyyy-MM-dd}.%i.log
+            </fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <maxHistory>${MAX_HISTORY}</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${PATTERN}</pattern>
+            <charset>${CHARSET}</charset>
+        </encoder>
+    </appender>
+
+    <root level="INFO">
+        <appender-ref ref="fileAppender"/>
+        <appender-ref ref="errorAppender"/>
+        <appender-ref ref="console"/>
+    </root>
+</configuration>

+ 12 - 0
src/main/resources/mapper/BaseTemplateFieldMapper.xml

@@ -0,0 +1,12 @@
+<?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.BaseTemplateFieldMapper">
+
+    <delete id="deleteByTemplateId">
+
+        delete
+        from base_template_field
+        where template_id = #{templateId}
+
+    </delete>
+</mapper>

+ 5 - 0
src/main/resources/mapper/BaseTemplateMapper.xml

@@ -0,0 +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.BaseTemplateMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/MappingFieldMapper.xml

@@ -0,0 +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.MappingFieldMapper">
+
+</mapper>

+ 14 - 0
src/main/resources/mapper/ProcessGroupMapper.xml

@@ -0,0 +1,14 @@
+<?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.ProcessGroupMapper">
+
+<!--    <select id="getUsedTemplateProcessGroups" resultType="com.dskj.znzn.importData.web.entity.ProcessGroup">-->
+<!--        SELECT t.*-->
+<!--        from process_group t-->
+<!--                 INNER JOIN process t1 on t.id = t1.group_id-->
+<!--        where t1.template_id = #{id}-->
+<!--          and t.`status` = 1-->
+<!--          and t1.`status` = 1-->
+
+<!--    </select>-->
+</mapper>

+ 5 - 0
src/main/resources/mapper/ProcessMapper.xml

@@ -0,0 +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>

+ 59 - 0
src/main/resources/templates/controller.java.vm

@@ -0,0 +1,59 @@
+package ${package.Controller};
+
+import com.dskj.znzn.importData.common.base.R;
+import ${package.Entity}.${entity};
+import ${package.Service}.${table.serviceName};
+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.PathVariable;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+#if(${restControllerStyle})
+#else
+import org.springframework.stereotype.Controller;
+#end
+#if(${superControllerClassPackage})
+import ${superControllerClassPackage};
+#end
+
+
+/**
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+#if(${restControllerStyle})
+@RestController
+#else
+@Controller
+#end
+@RequestMapping("#if(${controllerMappingHyphenStyle})${controllerMappingHyphen}#else${table.entityPath}#end")
+#if(${kotlin})
+class ${table.controllerName}#if(${superControllerClass}) : ${superControllerClass}()#end
+
+#else
+#if(${superControllerClass})
+public class ${table.controllerName} extends ${superControllerClass} {
+#else
+@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
+#if(${table.comment} != "")
+@Api(tags="${table.comment}")
+#else
+@Api(tags="${table.controllerName}接口")
+#end
+public class ${table.controllerName} {
+#end
+
+    private final ${table.serviceName} ${table.serviceName.substring(1,2).toLowerCase()}${table.serviceName.substring(2)};
+
+    @ApiOperation(value = "根据ID获取")
+    @GetMapping("/{id}")
+    public R<${entity}> getById(@PathVariable Long id) {
+            return R.ok(${table.serviceName.substring(1,2).toLowerCase()}${table.serviceName.substring(2)}.getById(id));
+    }
+
+}
+#end

+ 159 - 0
src/main/resources/templates/entity.java.vm

@@ -0,0 +1,159 @@
+package ${package.Entity};
+
+#foreach($pkg in ${table.importPackages})
+import ${pkg};
+#end
+#if(${springdoc})
+import io.swagger.v3.oas.annotations.media.Schema;
+#elseif(${swagger})
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+#end
+#if(${entityLombokModel})
+import lombok.Getter;
+import lombok.Setter;
+#if(${chainModel})
+import lombok.experimental.Accessors;
+#end
+#end
+
+/**
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+#if(${entityLombokModel})
+@Getter
+@Setter
+  #if(${chainModel})
+@Accessors(chain = true)
+  #end
+#end
+#if(${table.convert})
+@TableName("${schemaName}${table.name}")
+#end
+#if(${springdoc})
+@Schema(name = "${entity}", description = "$!{table.comment}")
+#elseif(${swagger})
+@ApiModel(value = "${entity}对象", description = "$!{table.comment}")
+#end
+#if(${superEntityClass})
+public class ${entity} extends ${superEntityClass}#if(${activeRecord})<${entity}>#end {
+#elseif(${activeRecord})
+public class ${entity} extends Model<${entity}> {
+#elseif(${entitySerialVersionUID})
+public class ${entity} implements Serializable {
+#else
+public class ${entity} {
+#end
+#if(${entitySerialVersionUID})
+
+    private static final long serialVersionUID = 1L;
+#end
+## ----------  BEGIN 字段循环遍历  ----------
+#foreach($field in ${table.fields})
+
+#if(${field.keyFlag})
+#set($keyPropertyName=${field.propertyName})
+#end
+#if("$!field.comment" != "")
+  #if(${springdoc})
+    @Schema(description = "${field.comment}")
+  #elseif(${swagger})
+    @ApiModelProperty("${field.comment}")
+  #else
+    /**
+     * ${field.comment}
+     */
+  #end
+#end
+#if(${field.keyFlag})
+## 主键
+  #if(${field.keyIdentityFlag})
+    @TableId(value = "${field.annotationColumnName}", type = IdType.AUTO)
+  #elseif(!$null.isNull(${idType}) && "$!idType" != "")
+    @TableId(value = "${field.annotationColumnName}", type = IdType.${idType})
+  #elseif(${field.convert})
+    @TableId("${field.annotationColumnName}")
+  #end
+## 普通字段
+#elseif(${field.fill})
+## -----   存在字段填充设置   -----
+  #if(${field.convert})
+    @TableField(value = "${field.annotationColumnName}", fill = FieldFill.${field.fill})
+  #else
+    @TableField(fill = FieldFill.${field.fill})
+  #end
+#elseif(${field.convert})
+    @TableField("${field.annotationColumnName}")
+#end
+## 乐观锁注解
+#if(${field.versionField})
+    @Version
+#end
+## 逻辑删除注解
+#if(${field.logicDeleteField})
+    @TableLogic
+#end
+    private ${field.propertyType} ${field.propertyName};
+#end
+## ----------  END 字段循环遍历  ----------
+#if(!${entityLombokModel})
+#foreach($field in ${table.fields})
+  #if(${field.propertyType.equals("boolean")})
+    #set($getprefix="is")
+  #else
+    #set($getprefix="get")
+  #end
+
+    public ${field.propertyType} ${getprefix}${field.capitalName}() {
+        return ${field.propertyName};
+    }
+
+  #if(${chainModel})
+    public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
+  #else
+    public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
+  #end
+        this.${field.propertyName} = ${field.propertyName};
+  #if(${chainModel})
+        return this;
+  #end
+    }
+#end
+## --foreach end---
+#end
+## --end of #if(!${entityLombokModel})--
+#if(${entityColumnConstant})
+  #foreach($field in ${table.fields})
+
+    public static final String ${field.name.toUpperCase()} = "${field.name}";
+  #end
+#end
+#if(${activeRecord})
+
+    @Override
+    public Serializable pkVal() {
+  #if(${keyPropertyName})
+        return this.${keyPropertyName};
+  #else
+        return null;
+  #end
+    }
+#end
+#if(!${entityLombokModel})
+
+    @Override
+    public String toString() {
+        return "${entity}{" +
+  #foreach($field in ${table.fields})
+    #if($!{foreach.index}==0)
+        "${field.propertyName} = " + ${field.propertyName} +
+    #else
+        ", ${field.propertyName} = " + ${field.propertyName} +
+    #end
+  #end
+        "}";
+    }
+#end
+}

+ 18 - 0
src/main/resources/templates/mapper.java.vm

@@ -0,0 +1,18 @@
+package ${package.Mapper};
+
+import ${package.Entity}.${entity};
+import ${superMapperClassPackage};
+#if(${mapperAnnotationClass})
+import ${mapperAnnotationClass.name};
+#end
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+@Mapper
+public interface ${table.mapperName} extends ${superMapperClass}<${entity}> {
+
+}

+ 17 - 0
src/main/resources/templates/service.java.vm

@@ -0,0 +1,17 @@
+package ${package.Service};
+
+import ${package.Entity}.${entity};
+import ${superServiceClassPackage};
+
+/**
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+#if(${kotlin})
+interface ${table.serviceName} : ${superServiceClass}<${entity}>
+#else
+public interface ${table.serviceName} extends ${superServiceClass}<${entity}> {
+
+}
+#end

+ 28 - 0
src/main/resources/templates/serviceImpl.java.vm

@@ -0,0 +1,28 @@
+package ${package.ServiceImpl};
+
+import ${package.Entity}.${entity};
+import ${package.Mapper}.${table.mapperName};
+#if(${table.serviceInterface})
+import ${package.Service}.${table.serviceName};
+#end
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import ${superServiceImplClassPackage};
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+@Service
+#if(${kotlin})
+open class ${table.serviceImplName} : ${superServiceImplClass}<${table.mapperName}, ${entity}>()#if(${table.serviceInterface}), ${table.serviceName}#end {
+
+}
+#else
+@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
+public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}>#if(${table.serviceInterface}) implements ${table.serviceName}#end {
+
+}
+#end