wzl 8 місяців тому
батько
коміт
837ca9c9a1
47 змінених файлів з 2638 додано та 0 видалено
  1. 2 0
      .gitignore
  2. 129 0
      pom.xml
  3. 13 0
      src/main/java/com/dskj/znzn/transData/Application.java
  4. 19 0
      src/main/java/com/dskj/znzn/transData/common/ThreadLocalUser.java
  5. 12 0
      src/main/java/com/dskj/znzn/transData/common/annotaions/NeedLogin.java
  6. 24 0
      src/main/java/com/dskj/znzn/transData/common/annotaions/NoRepeat.java
  7. 35 0
      src/main/java/com/dskj/znzn/transData/common/base/CurrentUser.java
  8. 29 0
      src/main/java/com/dskj/znzn/transData/common/base/PageInfo.java
  9. 38 0
      src/main/java/com/dskj/znzn/transData/common/base/PageR.java
  10. 56 0
      src/main/java/com/dskj/znzn/transData/common/base/R.java
  11. 50 0
      src/main/java/com/dskj/znzn/transData/common/conf/CommonWebMvcConfigurer.java
  12. 18 0
      src/main/java/com/dskj/znzn/transData/common/conf/MyBatisPlusConfig.java
  13. 84 0
      src/main/java/com/dskj/znzn/transData/common/conf/RedisConfigurer.java
  14. 61 0
      src/main/java/com/dskj/znzn/transData/common/conf/SwaggerConfiguration.java
  15. 18 0
      src/main/java/com/dskj/znzn/transData/common/exception/BusinessException.java
  16. 56 0
      src/main/java/com/dskj/znzn/transData/common/exception/GloableException.java
  17. 5 0
      src/main/java/com/dskj/znzn/transData/common/exception/UserNotLoginExeption.java
  18. 44 0
      src/main/java/com/dskj/znzn/transData/common/filter/AccessLogFilter.java
  19. 196 0
      src/main/java/com/dskj/znzn/transData/common/filter/AppInterceptor.java
  20. 41 0
      src/main/java/com/dskj/znzn/transData/common/filter/InterceptResponse.java
  21. 59 0
      src/main/java/com/dskj/znzn/transData/common/filter/ParamsRequestWrapper.java
  22. 91 0
      src/main/java/com/dskj/znzn/transData/common/service/RedisService.java
  23. 123 0
      src/main/java/com/dskj/znzn/transData/common/service/impl/RedisServiceImpl.java
  24. 314 0
      src/main/java/com/dskj/znzn/transData/common/utils/IpUtils.java
  25. 86 0
      src/main/java/com/dskj/znzn/transData/generate/CodeGenerateMain.java
  26. 43 0
      src/main/java/com/dskj/znzn/transData/web/WaveData/entity/WaveData.java
  27. 36 0
      src/main/java/com/dskj/znzn/transData/web/WaveData/indata/GetMesureDataInData.java
  28. 14 0
      src/main/java/com/dskj/znzn/transData/web/WaveData/mapper/WaveDataMapper.java
  29. 12 0
      src/main/java/com/dskj/znzn/transData/web/WaveData/service/IWaveDataService.java
  30. 37 0
      src/main/java/com/dskj/znzn/transData/web/WaveData/service/impl/WaveDataServiceImpl.java
  31. 77 0
      src/main/java/com/dskj/znzn/transData/web/transConf/controller/TransConfController.java
  32. 222 0
      src/main/java/com/dskj/znzn/transData/web/transConf/entity/TransConf.java
  33. 30 0
      src/main/java/com/dskj/znzn/transData/web/transConf/indata/AddInData.java
  34. 28 0
      src/main/java/com/dskj/znzn/transData/web/transConf/indata/InsertOrUpdateInData.java
  35. 20 0
      src/main/java/com/dskj/znzn/transData/web/transConf/indata/WindCodeAndTypeInData.java
  36. 18 0
      src/main/java/com/dskj/znzn/transData/web/transConf/mapper/TransConfMapper.java
  37. 111 0
      src/main/java/com/dskj/znzn/transData/web/transConf/outdata/TransConfForPlt.java
  38. 27 0
      src/main/java/com/dskj/znzn/transData/web/transConf/service/ITransConfService.java
  39. 64 0
      src/main/java/com/dskj/znzn/transData/web/transConf/service/impl/TransConfServiceImpl.java
  40. 40 0
      src/main/resources/application-datang.yml
  41. 34 0
      src/main/resources/application-dev.yml
  42. 40 0
      src/main/resources/application-prod.yml
  43. 28 0
      src/main/resources/application.yml
  44. 61 0
      src/main/resources/logback-dev.xml
  45. 61 0
      src/main/resources/logback-prod.xml
  46. 5 0
      src/main/resources/mapper/TransConfMapper.xml
  47. 27 0
      src/main/resources/mapper/WaveDataMapper.xml

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+.idea
+target\

+ 129 - 0
pom.xml

@@ -0,0 +1,129 @@
+<?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>org.example</groupId>
+    <artifactId>WindDataTrans</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>
+
+
+    </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.transData.Application</mainClass>
+                </configuration>
+            </plugin>
+            <!-- 其他插件配置... -->
+        </plugins>
+    </build>
+
+</project>

+ 13 - 0
src/main/java/com/dskj/znzn/transData/Application.java

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

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

@@ -0,0 +1,19 @@
+package com.dskj.znzn.transData.common;
+
+import com.dskj.znzn.transData.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/transData/common/annotaions/NeedLogin.java

@@ -0,0 +1,12 @@
+package com.dskj.znzn.transData.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/transData/common/annotaions/NoRepeat.java

@@ -0,0 +1,24 @@
+package com.dskj.znzn.transData.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/transData/common/base/CurrentUser.java

@@ -0,0 +1,35 @@
+package com.dskj.znzn.transData.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/transData/common/base/PageInfo.java

@@ -0,0 +1,29 @@
+package com.dskj.znzn.transData.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/transData/common/base/PageR.java

@@ -0,0 +1,38 @@
+package com.dskj.znzn.transData.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/transData/common/base/R.java

@@ -0,0 +1,56 @@
+package com.dskj.znzn.transData.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/transData/common/conf/CommonWebMvcConfigurer.java

@@ -0,0 +1,50 @@
+package com.dskj.znzn.transData.common.conf;
+
+import com.dskj.znzn.transData.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/transData/common/conf/MyBatisPlusConfig.java

@@ -0,0 +1,18 @@
+package com.dskj.znzn.transData.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;
+    }
+}

+ 84 - 0
src/main/java/com/dskj/znzn/transData/common/conf/RedisConfigurer.java

@@ -0,0 +1,84 @@
+package com.dskj.znzn.transData.common.conf;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+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 "";
+        };
+    }
+}
+

+ 61 - 0
src/main/java/com/dskj/znzn/transData/common/conf/SwaggerConfiguration.java

@@ -0,0 +1,61 @@
+package com.dskj.znzn.transData.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.ParameterBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.schema.ModelRef;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.service.Parameter;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+@Configuration
+@Import(BeanValidatorPluginsConfiguration.class)
+@EnableSwagger2WebMvc
+public class SwaggerConfiguration {
+
+    @Value("${spring.profiles.active}")
+    private String env;
+
+    @Bean(value = "defaultApi")
+    public Docket defaultApi() {
+        List<Parameter> list = new ArrayList<>();
+        ParameterBuilder headToken = new ParameterBuilder();
+        headToken.name("token").description("TOKEN")
+                .modelRef(new ModelRef("string")).parameterType("header").required(false)
+                .defaultValue("")
+                .build();
+
+        list.add(headToken.build());
+
+        return new Docket(DocumentationType.SWAGGER_2)
+                .globalOperationParameters(list)
+                .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/transData/common/exception/BusinessException.java

@@ -0,0 +1,18 @@
+package com.dskj.znzn.transData.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;
+    }
+}

+ 56 - 0
src/main/java/com/dskj/znzn/transData/common/exception/GloableException.java

@@ -0,0 +1,56 @@
+package com.dskj.znzn.transData.common.exception;
+
+import com.dskj.znzn.transData.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) {
+            errorMessage.append("\n - ")
+                    .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(e.getMessage());
+    }
+}

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

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

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

@@ -0,0 +1,44 @@
+package com.dskj.znzn.transData.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);
+    }
+
+}

+ 196 - 0
src/main/java/com/dskj/znzn/transData/common/filter/AppInterceptor.java

@@ -0,0 +1,196 @@
+package com.dskj.znzn.transData.common.filter;
+
+import cn.hutool.core.codec.Base64;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.dskj.znzn.transData.common.ThreadLocalUser;
+import com.dskj.znzn.transData.common.annotaions.NeedLogin;
+import com.dskj.znzn.transData.common.annotaions.NoRepeat;
+import com.dskj.znzn.transData.common.base.CurrentUser;
+import com.dskj.znzn.transData.common.exception.BusinessException;
+import com.dskj.znzn.transData.common.exception.UserNotLoginExeption;
+import com.dskj.znzn.transData.common.service.RedisService;
+import com.dskj.znzn.transData.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.Date;
+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/transData/common/filter/InterceptResponse.java

@@ -0,0 +1,41 @@
+package com.dskj.znzn.transData.common.filter;
+
+import com.alibaba.fastjson.JSON;
+import com.dskj.znzn.transData.common.base.PageR;
+import com.dskj.znzn.transData.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/transData/common/filter/ParamsRequestWrapper.java

@@ -0,0 +1,59 @@
+package com.dskj.znzn.transData.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/transData/common/service/RedisService.java

@@ -0,0 +1,91 @@
+package com.dskj.znzn.transData.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/transData/common/service/impl/RedisServiceImpl.java

@@ -0,0 +1,123 @@
+package com.dskj.znzn.transData.common.service.impl;
+
+
+import com.dskj.znzn.transData.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);
+    }
+}

+ 314 - 0
src/main/java/com/dskj/znzn/transData/common/utils/IpUtils.java

@@ -0,0 +1,314 @@
+package com.dskj.znzn.transData.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:
+                switch (b1) {
+                    case 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 e) {
+        }
+        return "127.0.0.1";
+    }
+
+    /**
+     * 获取主机名
+     *
+     * @return 本地主机名
+     */
+    public static String getHostName() {
+        try {
+            return InetAddress.getLocalHost().getHostName();
+        } catch (UnknownHostException e) {
+        }
+        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 (false == 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;
+    }
+}

+ 86 - 0
src/main/java/com/dskj/znzn/transData/generate/CodeGenerateMain.java

@@ -0,0 +1,86 @@
+package com.dskj.znzn.transData.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.nio.file.Files;
+import java.nio.file.Path;
+import java.sql.Types;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+
+import static com.baomidou.mybatisplus.core.enums.SqlLike.RIGHT;
+import static java.nio.file.StandardOpenOption.CREATE_NEW;
+
+/**
+ * @author 魏志亮
+ */
+public class CodeGenerateMain {
+
+    static String host = "192.168.50.235";
+    static Integer port = 30306;
+    static String dbName = "energy_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 = "trans_conf";
+
+        boolean isFirst = true;
+        //去掉表前缀
+        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.transData.web").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();
+                })
+                .templateEngine(new VelocityTemplateEngine())
+                .execute();
+
+    }
+}

+ 43 - 0
src/main/java/com/dskj/znzn/transData/web/WaveData/entity/WaveData.java

@@ -0,0 +1,43 @@
+
+package com.dskj.znzn.transData.web.WaveData.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.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@TableName("wave_data")
+@ApiModel
+@Data
+public class WaveData implements Serializable {
+
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("风机编号")
+    private String windTurbineNumber;
+
+    @ApiModelProperty("原始风机编号")
+    private String windTurbineName;
+
+    @ApiModelProperty("时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date timeStamp;
+
+    @ApiModelProperty("采样频率")
+    private String samplingFrequency;
+
+    @ApiModelProperty("测点名称")
+    private String mesurePointName;
+
+    @ApiModelProperty("测点数据")
+    private String mesureData;
+
+}

+ 36 - 0
src/main/java/com/dskj/znzn/transData/web/WaveData/indata/GetMesureDataInData.java

@@ -0,0 +1,36 @@
+
+package com.dskj.znzn.transData.web.WaveData.indata;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+
+@ApiModel
+@Data
+public class GetMesureDataInData {
+
+    @ApiModelProperty("风场编号")
+    @NotBlank(message = "风场编号不能为空")
+    private String windCode;
+
+    @ApiModelProperty("风机编号,数组")
+    @NotEmpty(message = "必须选择风机")
+    private List<String> windTurbineNumberList;
+
+    @ApiModelProperty("开始时间,yyyy-MM-dd HH:mm:ss")
+    @NotBlank(message = "开始时间不能为空")
+    private String startTime;
+
+    @ApiModelProperty("结束时间,yyyy-MM-dd hh:mm:ss")
+    @NotBlank(message = "结束时间不能为空")
+    private String endTime;
+
+    @ApiModelProperty("测点,数组")
+    @NotEmpty(message = "必须选择测点")
+    private List<String> mesureNameList;
+
+}

+ 14 - 0
src/main/java/com/dskj/znzn/transData/web/WaveData/mapper/WaveDataMapper.java

@@ -0,0 +1,14 @@
+package com.dskj.znzn.transData.web.WaveData.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dskj.znzn.transData.web.WaveData.entity.WaveData;
+import java.util.List;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface WaveDataMapper extends BaseMapper<WaveData> {
+
+    List<WaveData> getMesureData(String windCode, List<String> windTurbineNumberList, String startTime, String endTime, List<String> mesureNameList);
+
+    WaveData getById(String windCode, Integer id);
+}

+ 12 - 0
src/main/java/com/dskj/znzn/transData/web/WaveData/service/IWaveDataService.java

@@ -0,0 +1,12 @@
+package com.dskj.znzn.transData.web.WaveData.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dskj.znzn.transData.web.WaveData.entity.WaveData;
+import com.dskj.znzn.transData.web.WaveData.indata.GetMesureDataInData;
+import java.util.List;
+
+public interface IWaveDataService extends IService<WaveData> {
+    List<WaveData> getMesureData(GetMesureDataInData inData);
+
+    WaveData getById(String windCode, Integer id);
+}

+ 37 - 0
src/main/java/com/dskj/znzn/transData/web/WaveData/service/impl/WaveDataServiceImpl.java

@@ -0,0 +1,37 @@
+
+package com.dskj.znzn.transData.web.WaveData.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dskj.znzn.transData.common.exception.BusinessException;
+import com.dskj.znzn.transData.web.WaveData.entity.WaveData;
+import com.dskj.znzn.transData.web.WaveData.indata.GetMesureDataInData;
+import com.dskj.znzn.transData.web.WaveData.mapper.WaveDataMapper;
+import com.dskj.znzn.transData.web.WaveData.service.IWaveDataService;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
+public class WaveDataServiceImpl extends ServiceImpl<WaveDataMapper, WaveData> implements IWaveDataService {
+    private final WaveDataMapper waveDataMapper;
+
+    public List<WaveData> getMesureData(GetMesureDataInData inData) {
+        if (inData.getWindCode().contains(" ")) {
+            throw new BusinessException("风场参数异常");
+        } else {
+            return this.waveDataMapper.getMesureData(inData.getWindCode() + "_wave", inData.getWindTurbineNumberList(), inData.getStartTime(), inData.getEndTime(), inData.getMesureNameList());
+        }
+    }
+
+    public WaveData getById(String windCode, Integer id) {
+        if (windCode.contains(" ")) {
+            throw new BusinessException("风场参数异常");
+        } else {
+            return this.waveDataMapper.getById(windCode + "_wave", id);
+        }
+    }
+}

+ 77 - 0
src/main/java/com/dskj/znzn/transData/web/transConf/controller/TransConfController.java

@@ -0,0 +1,77 @@
+package com.dskj.znzn.transData.web.transConf.controller;
+
+import com.dskj.znzn.transData.common.annotaions.NeedLogin;
+import com.dskj.znzn.transData.common.base.PageInfo;
+import com.dskj.znzn.transData.common.base.PageR;
+import com.dskj.znzn.transData.common.base.R;
+import com.dskj.znzn.transData.web.transConf.entity.TransConf;
+import com.dskj.znzn.transData.web.transConf.indata.InsertOrUpdateInData;
+import com.dskj.znzn.transData.web.transConf.indata.WindCodeAndTypeInData;
+import com.dskj.znzn.transData.web.transConf.outdata.TransConfForPlt;
+import com.dskj.znzn.transData.web.transConf.service.ITransConfService;
+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.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author 魏志亮
+ * @since 2024-07-08
+ */
+@RestController
+@RequestMapping("/transConf")
+@NeedLogin
+@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
+@Api(tags = "点检表接口")
+public class TransConfController {
+
+    private final ITransConfService iTransConfService;
+
+
+    @ApiOperation(value = "获取所有点检表")
+    @PostMapping("/list")
+    public R<List<TransConf>> list() {
+        return R.ok(iTransConfService.list());
+    }
+
+    @ApiOperation(value = "获取所有点检表-分页")
+    @PostMapping("/listPage")
+    public PageR<TransConf> listPage(@RequestBody @Valid PageInfo info) {
+        return iTransConfService.listPage(info);
+    }
+
+    @ApiOperation(value = "根据风场编号以及类型获取点检表")
+    @PostMapping("/getByWindCodeAndType")
+    public R<TransConf> getByWindCodeAndType(@Valid @RequestBody WindCodeAndTypeInData inData) {
+        return R.ok(iTransConfService.getByWindCodeAndType(inData.getWindCode(), inData.getType()));
+    }
+
+    @ApiOperation(value = "根据风场编号以及类型获取点检表-平台查看使用")
+    @PostMapping("/getByWindCodeAndTypeForPlt")
+    public R<TransConfForPlt> getByWindCodeAndTypeForPlt(@Valid @RequestBody WindCodeAndTypeInData inData) {
+        return R.ok(iTransConfService.getByWindCodeAndTypeForPlt(inData.getWindCode(), inData.getType()));
+    }
+
+
+//    @ApiOperation(value = "添加点检表")
+//    @PostMapping("/add")
+//    public R add(@Valid @RequestBody AddInData addInData) {
+//        iTransConfService.save(addInData);
+//        return R.ok();
+//    }
+
+    @ApiOperation(value = "新增或者更新点检表")
+    @PostMapping("/insertOrUpdate")
+    public R insertOrUpdate(@Valid @RequestBody InsertOrUpdateInData insertOrUpdateInData) {
+        iTransConfService.insertOrUpdate(insertOrUpdateInData);
+        return R.ok();
+    }
+}

+ 222 - 0
src/main/java/com/dskj/znzn/transData/web/transConf/entity/TransConf.java

@@ -0,0 +1,222 @@
+package com.dskj.znzn.transData.web.transConf.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 魏志亮
+ * @since 2024-07-08
+ */
+@Getter
+@Setter
+@TableName("trans_conf")
+@ApiModel(value = "TransConf对象", description = "")
+public class TransConf implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("风场编号")
+    private String windCode;
+
+    @ApiModelProperty("风场名称")
+    private String windName;
+
+    @ApiModelProperty("分析类型")
+    private String type;
+
+    @ApiModelProperty("是否是竖表")
+    private Boolean isVerticalTable;
+
+    @ApiModelProperty("是否需要合并列")
+    private Boolean mergeColumns;
+
+    @ApiModelProperty("竖表需要读取的字段,逗号分隔")
+    private String verticalReadCols;
+
+    @ApiModelProperty("竖表索引列,一般是 时间和风机号")
+    private String verticalIndexCols;
+
+    @ApiModelProperty("竖表取的列名")
+    private String verticalColKey;
+
+    @ApiModelProperty("竖表取的数值")
+    private String verticalColValue;
+
+    @ApiModelProperty("处理列明前缀")
+    private String resolveColPrefix;
+
+    @ApiModelProperty("风机名称代码处理")
+    private String windNameExec;
+
+    @ApiModelProperty("开始读取的行数,excel显示的行数-1")
+    private Integer beginHeader;
+
+    @ApiModelProperty("风机编号")
+    private String windTurbineNumber;
+
+    @ApiModelProperty("时间")
+    private String timeStamp;
+
+    @ApiModelProperty("有功功率")
+    private String activePower;
+
+    @ApiModelProperty("风轮转速")
+    private String rotorSpeed;
+
+    @ApiModelProperty("发电机转速")
+    private String generatorSpeed;
+
+    @ApiModelProperty("风速")
+    private String windVelocity;
+
+    @ApiModelProperty("桨距角1")
+    @TableField(value = "pitch_angle_blade_1")
+    private String pitchAngleBlade1;
+
+    @ApiModelProperty("桨距角2")
+    @TableField(value = "pitch_angle_blade_2")
+    private String pitchAngleBlade2;
+
+    @ApiModelProperty("桨距角3")
+    @TableField(value = "pitch_angle_blade_3")
+    private String pitchAngleBlade3;
+
+    @ApiModelProperty("机舱位置")
+    private String cabinPosition;
+
+    @ApiModelProperty("绝对风向")
+    private String trueWindDirection;
+
+    @ApiModelProperty("对风角度")
+    private String yawError1;
+
+    @ApiModelProperty("扭缆角度")
+    private String twistedCableAngle;
+
+    @ApiModelProperty("主轴承轴承温度")
+    private String mainBearingTemperature;
+
+    @ApiModelProperty("齿轮箱油温")
+    private String gearboxOilTemperature;
+
+    @ApiModelProperty("齿轮箱低速轴轴承温度")
+    private String gearboxLowSpeedShaftBearingTemperature;
+
+    @ApiModelProperty("齿轮箱中速轴轴承温度")
+    private String gearboxmediumSpeedShaftbearingTemperature;
+
+    @ApiModelProperty("齿轮箱高速轴轴承温度")
+    private String gearboxHighSpeedShaftBearingTemperature;
+
+    @ApiModelProperty("发电机驱动端轴承温度")
+    private String generatordriveEndBearingTemperature;
+
+    @ApiModelProperty("发电机非驱动端轴承温度")
+    private String generatornonDriveEndBearingTemperature;
+
+    @ApiModelProperty("机舱内温度")
+    private String cabinTemperature;
+
+    @ApiModelProperty("环境温度")
+    private String outsideCabinTemperature;
+
+    @ApiModelProperty("发电机绕组1温度")
+    private String generatorWinding1Temperature;
+
+    @ApiModelProperty("发电机绕组2温度")
+    private String generatorWinding2Temperature;
+
+    @ApiModelProperty("发电机绕组3温度")
+    private String generatorWinding3Temperature;
+
+    @ApiModelProperty("机舱前后振动")
+    private String frontBackVibrationOfTheCabin;
+
+    @ApiModelProperty("机舱左右振动")
+    private String sideToSideVibrationOfTheCabin;
+
+    @ApiModelProperty("齿轮箱转速")
+    private String requiredGearboxSpeed;
+
+    @ApiModelProperty("变频器转速(主控)")
+    private String inverterSpeedMasterControl;
+
+    @ApiModelProperty("实际力矩")
+    private String actualTorque;
+
+    @ApiModelProperty("给定力矩")
+    private String givenTorque;
+
+    @ApiModelProperty("顺时针偏航次数")
+    private String clockwiseYawCount;
+
+    @ApiModelProperty("逆时针偏航次数")
+    private String counterclockwiseYawCount;
+
+    @ApiModelProperty("不可利用")
+    private String unusable;
+
+    @ApiModelProperty("功率曲线可用")
+    private String powerCurveAvailable;
+
+    @ApiModelProperty("有功功率设定值")
+    private String setValueOfActivePower;
+
+    @ApiModelProperty("风机状态1")
+    private String windTurbineStatus;
+
+    @ApiModelProperty("风机状态2")
+    private String windTurbineStatus2;
+
+    @ApiModelProperty("湍流强度")
+    private String turbulenceIntensity;
+
+    @ApiModelProperty("预留字段(浮点型)")
+    private String param1;
+
+    @ApiModelProperty("预留字段(浮点型)")
+    private String param2;
+
+    @ApiModelProperty("预留字段(浮点型)")
+    private String param3;
+
+    @ApiModelProperty("预留字段(浮点型)")
+    private String param4;
+
+    @ApiModelProperty("预留字段(浮点型)")
+    private String param5;
+
+    @ApiModelProperty("预留字段(字符型)")
+    private String param6;
+
+    @ApiModelProperty("预留字段(字符型)")
+    private String param7;
+
+    @ApiModelProperty("预留字段(字符型)")
+    private String param8;
+
+    @ApiModelProperty("预留字段(字符型)")
+    private String param9;
+
+    @ApiModelProperty("预留字段(字符型)")
+    private String param10;
+
+    @ApiModelProperty("0:不可用 1:可用")
+    private Integer status;
+}

+ 30 - 0
src/main/java/com/dskj/znzn/transData/web/transConf/indata/AddInData.java

@@ -0,0 +1,30 @@
+package com.dskj.znzn.transData.web.transConf.indata;
+
+import com.dskj.znzn.transData.web.transConf.entity.TransConf;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@ApiModel
+@Data
+public class AddInData extends TransConf {
+
+    @ApiModelProperty(value = "风场编号", required = true)
+    @NotBlank(message = "风场编号不能为空")
+    private String windCode;
+
+    @ApiModelProperty(value = "风场名称", required = true)
+    @NotBlank(message = "风场名称不能为空")
+    private String windName;
+
+    @ApiModelProperty(value = "风场全称", required = true)
+    @NotBlank(message = "风场全称不能为空")
+    private String windFullName;
+
+    @ApiModelProperty(value = "分析类型", required = true)
+    @NotBlank(message = "分析类型不能为空")
+    private String type;
+
+}

+ 28 - 0
src/main/java/com/dskj/znzn/transData/web/transConf/indata/InsertOrUpdateInData.java

@@ -0,0 +1,28 @@
+package com.dskj.znzn.transData.web.transConf.indata;
+
+import com.dskj.znzn.transData.web.transConf.entity.TransConf;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@ApiModel
+@Data
+public class InsertOrUpdateInData extends TransConf {
+
+    @ApiModelProperty(value = "风场编号", required = true)
+    @NotBlank(message = "风场编号不能为空")
+    private String windCode;
+
+    @ApiModelProperty(value = "风场名称", required = true)
+    @NotBlank(message = "风场名称不能为空")
+    private String windName;
+
+    @ApiModelProperty(value = "分析类型", required = true)
+    @NotBlank(message = "分析类型不能为空")
+    private String type;
+
+}

+ 20 - 0
src/main/java/com/dskj/znzn/transData/web/transConf/indata/WindCodeAndTypeInData.java

@@ -0,0 +1,20 @@
+package com.dskj.znzn.transData.web.transConf.indata;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@ApiModel
+@Data
+public class WindCodeAndTypeInData {
+
+    @ApiModelProperty(value = "风场编号", required = true)
+    @NotBlank(message = "风场编号不能为空")
+    private String windCode;
+
+    @ApiModelProperty(value = "数据类型(minute,second)", required = true)
+    @NotBlank(message = "数据类型不能为空")
+    private String type;
+}

+ 18 - 0
src/main/java/com/dskj/znzn/transData/web/transConf/mapper/TransConfMapper.java

@@ -0,0 +1,18 @@
+package com.dskj.znzn.transData.web.transConf.mapper;
+
+import com.dskj.znzn.transData.web.transConf.entity.TransConf;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 魏志亮
+ * @since 2024-07-08
+ */
+@Mapper
+public interface TransConfMapper extends BaseMapper<TransConf> {
+
+}

+ 111 - 0
src/main/java/com/dskj/znzn/transData/web/transConf/outdata/TransConfForPlt.java

@@ -0,0 +1,111 @@
+package com.dskj.znzn.transData.web.transConf.outdata;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.dskj.znzn.transData.web.transConf.entity.TransConf;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+//@JsonIgnoreProperties(value = {"isVerticalTable","mergeColumns","verticalReadCols","verticalIndexCols","verticalColKey","verticalColValue",
+//"resolveColPrefix","windNameExec",""})
+@EqualsAndHashCode(callSuper = true)
+@ApiModel
+@Data
+public class TransConfForPlt extends TransConf {
+
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @JsonIgnore
+    private Integer id;
+
+    @ApiModelProperty("风场编号")
+    @JsonIgnore
+    private String windCode;
+
+    @ApiModelProperty("风场名称")
+    @JsonIgnore
+    private String windName;
+
+    @ApiModelProperty("分析类型")
+    @JsonIgnore
+    private String type;
+
+    @ApiModelProperty("是否是竖表")
+    @JsonIgnore
+    private Boolean isVerticalTable;
+
+    @ApiModelProperty("是否需要合并列")
+    @JsonIgnore
+    private Boolean mergeColumns;
+
+    @ApiModelProperty("竖表需要读取的字段,逗号分隔")
+    @JsonIgnore
+    private String verticalReadCols;
+
+    @ApiModelProperty("竖表索引列,一般是 时间和风机号")
+    @JsonIgnore
+    private String verticalIndexCols;
+
+    @ApiModelProperty("竖表取的列名")
+    @JsonIgnore
+    private String verticalColKey;
+
+    @ApiModelProperty("竖表取的数值")
+    @JsonIgnore
+    private String verticalColValue;
+
+    @ApiModelProperty("处理列明前缀")
+    @JsonIgnore
+    private String resolveColPrefix;
+
+    @ApiModelProperty("风机名称代码处理")
+    @JsonIgnore
+    private String windNameExec;
+
+    @ApiModelProperty("开始读取的行数,excel显示的行数-1")
+    @JsonIgnore
+    private Integer beginHeader;
+
+    @ApiModelProperty("预留字段(浮点型)")
+    @JsonIgnore
+    private String param1;
+
+    @ApiModelProperty("预留字段(浮点型)")
+    @JsonIgnore
+    private String param2;
+
+    @ApiModelProperty("预留字段(浮点型)")
+    @JsonIgnore
+    private String param3;
+
+    @ApiModelProperty("预留字段(浮点型)")
+    @JsonIgnore
+    private String param4;
+
+    @ApiModelProperty("预留字段(浮点型)")
+    @JsonIgnore
+    private String param5;
+
+    @ApiModelProperty("预留字段(字符型)")
+    @JsonIgnore
+    private String param6;
+
+    @ApiModelProperty("预留字段(字符型)")
+    @JsonIgnore
+    private String param7;
+
+    @ApiModelProperty("预留字段(字符型)")
+    @JsonIgnore
+    private String param8;
+
+    @ApiModelProperty("预留字段(字符型)")
+    @JsonIgnore
+    private String param9;
+
+    @ApiModelProperty("预留字段(字符型)")
+    @JsonIgnore
+    private String param10;
+}

+ 27 - 0
src/main/java/com/dskj/znzn/transData/web/transConf/service/ITransConfService.java

@@ -0,0 +1,27 @@
+package com.dskj.znzn.transData.web.transConf.service;
+
+import com.dskj.znzn.transData.common.base.PageInfo;
+import com.dskj.znzn.transData.common.base.PageR;
+import com.dskj.znzn.transData.web.transConf.entity.TransConf;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dskj.znzn.transData.web.transConf.indata.InsertOrUpdateInData;
+import com.dskj.znzn.transData.web.transConf.outdata.TransConfForPlt;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author 魏志亮
+ * @since 2024-07-08
+ */
+public interface ITransConfService extends IService<TransConf> {
+
+    TransConf getByWindCodeAndType(String company, String type);
+
+    TransConfForPlt getByWindCodeAndTypeForPlt(String windCode, String type);
+
+    void insertOrUpdate(InsertOrUpdateInData insertOrUpdateInData);
+
+    PageR<TransConf> listPage(PageInfo info);
+}

+ 64 - 0
src/main/java/com/dskj/znzn/transData/web/transConf/service/impl/TransConfServiceImpl.java

@@ -0,0 +1,64 @@
+package com.dskj.znzn.transData.web.transConf.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dskj.znzn.transData.common.base.PageInfo;
+import com.dskj.znzn.transData.common.base.PageR;
+import com.dskj.znzn.transData.web.transConf.entity.TransConf;
+import com.dskj.znzn.transData.web.transConf.indata.InsertOrUpdateInData;
+import com.dskj.znzn.transData.web.transConf.mapper.TransConfMapper;
+import com.dskj.znzn.transData.web.transConf.outdata.TransConfForPlt;
+import com.dskj.znzn.transData.web.transConf.service.ITransConfService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author 魏志亮
+ * @since 2024-07-08
+ */
+@Service
+public class TransConfServiceImpl extends ServiceImpl<TransConfMapper, TransConf> implements ITransConfService {
+
+    @Override
+    public TransConf getByWindCodeAndType(String windCode, String type) {
+        LambdaQueryWrapper<TransConf> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(TransConf::getWindCode, windCode).eq(TransConf::getType, type).eq(TransConf::getStatus, 1);
+        return getOne(wrapper);
+    }
+
+    @Override
+    public TransConfForPlt getByWindCodeAndTypeForPlt(String windCode, String type) {
+        TransConf transConf = getByWindCodeAndType(windCode, type);
+        if (null != transConf) {
+            TransConfForPlt plt = new TransConfForPlt();
+            BeanUtils.copyProperties(transConf, plt);
+            return plt;
+        }
+        return null;
+    }
+
+    @Override
+    public void insertOrUpdate(InsertOrUpdateInData insertOrUpdateInData) {
+        insertOrUpdateInData.setId(null);
+        TransConf transConf = getByWindCodeAndType(insertOrUpdateInData.getWindCode(), insertOrUpdateInData.getType());
+        if (null != transConf) {
+            insertOrUpdateInData.setId(transConf.getId());
+            updateById(insertOrUpdateInData);
+        } else {
+            save(insertOrUpdateInData);
+        }
+    }
+
+    @Override
+    public PageR<TransConf> listPage(PageInfo info) {
+        Page<TransConf> queryPage = Page.of(info.getPageNo(), info.getPageSize());
+        Page<TransConf> pageInfo = page(queryPage);
+        return PageR.page(pageInfo, queryPage.getRecords());
+    }
+}

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

@@ -0,0 +1,40 @@
+server:
+  port: 9002
+
+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://127.0.0.1:3306/energy_data_prod?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false
+    username: root
+    password: admin123456
+
+  redis:
+    host: 172.16.37.22
+    port: 6379
+    password: 123456
+    jedis:
+      pool:
+        max-active: 8
+        max-wait: -1
+    database: 10
+
+logging:
+  config: classpath:logback-prod.xml

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

@@ -0,0 +1,34 @@
+server:
+  port: 9001
+knife4j:
+  enable: true
+  setting:
+    language: zh-CN
+    swagger-model-name: 模型
+
+spring:
+  datasource:
+    url: jdbc:mysql://192.168.50.235:30306/energy_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: 9002
+
+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/energy_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

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

@@ -0,0 +1,28 @@
+server:
+  port: 9001
+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'
+
+

+ 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="energy_data_java_web"/>
+
+    <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="energy_data_java_web"/>
+
+    <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>

+ 5 - 0
src/main/resources/mapper/TransConfMapper.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.transData.web.transConf.mapper.TransConfMapper">
+
+</mapper>

+ 27 - 0
src/main/resources/mapper/WaveDataMapper.xml

@@ -0,0 +1,27 @@
+<?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.transData.web.WaveData.mapper.WaveDataMapper">
+
+    <select id="getMesureData" resultType="com.dskj.znzn.transData.web.WaveData.entity.WaveData">
+
+        select id,wind_turbine_number,wind_turbine_name,time_stamp,sampling_frequency,mesure_point_name from
+        ${windCode}
+        where
+        time_stamp between #{startTime} and #{endTime}
+        and wind_turbine_number in
+        <foreach collection="windTurbineNumberList" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+        and mesure_point_name in
+        <foreach collection="mesureNameList" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+        order by time_stamp asc
+
+    </select>
+    <select id="getById" resultType="com.dskj.znzn.transData.web.WaveData.entity.WaveData">
+        select *
+        from ${windCode}
+        where id = #{id}
+    </select>
+</mapper>