Forráskód Böngészése

Merge branch 'energy-manage-shiyue'

shiyue 8 hónapja
szülő
commit
7e3cd52964

+ 2 - 1
energy-manage-service/Dockerfile

@@ -1,6 +1,7 @@
 # 该镜像需要依赖的基础镜像
-FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openjdk:8-alpine-linuxarm64
 #FROM --platform=linux/amd64 jdk8:latest
+FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openjdk:8-alpine-linuxarm64
+
 
 # 指定维护者的名字
 MAINTAINER shiyue

+ 7 - 0
energy-manage-service/pom.xml

@@ -49,6 +49,13 @@
             <version>2.5.1</version>
         </dependency>
 
+        <!-- forest 远程连接框架 -->
+        <dependency>
+            <groupId>com.dtflys.forest</groupId>
+            <artifactId>forest-spring-boot-starter</artifactId>
+            <version>1.5.13</version>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 2 - 0
energy-manage-service/src/main/java/com/energy/manage/service/ManageAppApplication.java

@@ -1,5 +1,6 @@
 package com.energy.manage.service;
 
+import com.dtflys.forest.springboot.annotation.ForestScan;
 import com.energy.manage.common.mapper.MyMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.SpringApplication;
@@ -18,6 +19,7 @@ import tk.mybatis.spring.annotation.MapperScan;
 @EnableAspectJAutoProxy(exposeProxy = true)
 @EnableTransactionManagement
 @EnableAsync
+@ForestScan(basePackages = "com.energy.manage.service.client")
 @MapperScan(value = "com.energy.manage.service.mappers", markerInterface = MyMapper.class)
 @Slf4j
 public class ManageAppApplication {

+ 25 - 0
energy-manage-service/src/main/java/com/energy/manage/service/client/skf/AuthClient.java

@@ -0,0 +1,25 @@
+package com.energy.manage.service.client.skf;
+
+import com.dtflys.forest.annotation.Body;
+import com.dtflys.forest.annotation.Post;
+import com.energy.manage.service.constant.client.skf.SkfClientConstants;
+import com.energy.manage.service.domain.client.skf.AutoTokenVO;
+
+public interface AuthClient {
+
+    /**
+     * 获取skf token,有效期两小时
+     * @return
+     */
+    @Post(
+            url = SkfClientConstants.SKF_REQUEST_PATH + SkfClientConstants.SKF_TOKEN_PATH,
+            contentType = "application/x-www-form-urlencoded"
+    )
+    AutoTokenVO getSkfToken(@Body("grant_type")String grantType,@Body("username")String username,@Body("password")String password);
+
+
+
+
+
+
+}

+ 36 - 0
energy-manage-service/src/main/java/com/energy/manage/service/client/skf/DynamicMeasurementsClient.java

@@ -0,0 +1,36 @@
+package com.energy.manage.service.client.skf;
+
+import com.alibaba.fastjson.JSONObject;
+import com.dtflys.forest.annotation.*;
+import com.energy.manage.service.constant.client.skf.SkfClientConstants;
+import com.energy.manage.service.domain.client.skf.AutoTokenVO;
+import com.energy.manage.service.domain.client.skf.DynamicMeasurementsVo;
+import com.energy.manage.service.domain.client.skf.HierarchyListVo;
+
+import java.util.List;
+
+public interface DynamicMeasurementsClient {
+
+
+    /**
+     * 获取skf DynamicMeasurementsClient
+     *
+     * @return
+     */
+    @Get(
+            url = SkfClientConstants.SKF_REQUEST_PATH + SkfClientConstants.SKF_DM_PATH + "{1}/dynamicMeasurements"
+    )
+    List<DynamicMeasurementsVo> getSkfDynamicMeasurements(@Header("Authorization") String authorization, Integer pointId,
+                                                          @Query("fromDateUTC")String fromDateUTC, @Query("toDateUTC")String toDateUTC,
+                                                          @Query("includeMeasurements")Integer includeMeasurements, @Query("numReadings")Integer numReadings);
+
+
+    @Get(
+            url = SkfClientConstants.SKF_REQUEST_PATH + SkfClientConstants.SKF_HIERARCHY
+    )
+    List<HierarchyListVo> getSkfHierarchy(@Header("Authorization") String authorization);
+
+
+
+
+}

+ 30 - 0
energy-manage-service/src/main/java/com/energy/manage/service/constant/client/skf/SkfClientConstants.java

@@ -0,0 +1,30 @@
+package com.energy.manage.service.constant.client.skf;
+
+/**
+ * skf client 常量
+ */
+public interface SkfClientConstants {
+
+    String SKF_REQUEST_PATH = "http://192.168.50.242:5000";
+
+    String SKF_TOKEN_GRANT_TYPE = "password";
+
+    String SKF_TOKEN_USERNAME = "admin";
+
+    String SKF_TOKEN_PASSWORD = "admin";
+
+    /**
+     * token 请求地址
+     */
+    String SKF_TOKEN_PATH = "/token";
+
+    /**
+     * dynamicMeasurements 请求地址
+     */
+    String SKF_DM_PATH = "/v1/points/";
+
+    /**
+     * 结构信息
+     */
+    String SKF_HIERARCHY = "/v1/hierarchy/?includePoints=true";
+}

+ 19 - 0
energy-manage-service/src/main/java/com/energy/manage/service/domain/client/skf/AutoTokenVO.java

@@ -0,0 +1,19 @@
+package com.energy.manage.service.domain.client.skf;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class AutoTokenVO {
+
+    private String access_token;
+
+    private String token_type;
+
+    private Integer expires_in;
+
+    private String refresh_token;
+
+
+}

+ 108 - 0
energy-manage-service/src/main/java/com/energy/manage/service/domain/client/skf/DynamicMeasurementsVo.java

@@ -0,0 +1,108 @@
+package com.energy.manage.service.domain.client.skf;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 测量DynamicMeasurementsVo
+ */
+@Getter
+@Setter
+@NoArgsConstructor
+public class DynamicMeasurementsVo {
+
+
+    @JsonProperty("PointID")
+    private Integer pointID;
+    @JsonProperty("Speed")
+    private Double speed;
+    @JsonProperty("SpeedBegin")
+    private Double speedBegin;
+    @JsonProperty("SpeedEnd")
+    private Double speedEnd;
+    @JsonProperty("SpeedMin")
+    private Double speedMin;
+    @JsonProperty("SpeedMax")
+    private Double speedMax;
+    @JsonProperty("SpeedUnits")
+    private String speedUnits;
+    @JsonProperty("Process")
+    private Integer process;
+    @JsonProperty("ProcessMin")
+    private Integer processMin;
+    @JsonProperty("ProcessMax")
+    private Integer processMax;
+    @JsonProperty("ProcessUnits")
+    private String processUnits;
+    @JsonProperty("Digital")
+    private Integer digital;
+    @JsonProperty("NumberOfChannels")
+    private Integer numberOfChannels;
+    @JsonProperty("SampleRate")
+    private Integer sampleRate;
+    @JsonProperty("Samples")
+    private Integer samples;
+    @JsonProperty("EUType")
+    private Integer eUType;
+    @JsonProperty("EU")
+    private String eu;
+    @JsonProperty("EUTypeSpectrum")
+    private Integer eUTypeSpectrum;
+    @JsonProperty("EUSpectrum")
+    private Object eUSpectrum;
+    @JsonProperty("DetectionType")
+    private Integer detectionType;
+    @JsonProperty("DetectionName")
+    private String detectionName;
+    @JsonProperty("WindowType")
+    private Integer windowType;
+    @JsonProperty("WindowName")
+    private String windowName;
+    @JsonProperty("StartFrequency")
+    private Integer startFrequency;
+    @JsonProperty("EndFrequency")
+    private Integer endFrequency;
+    @JsonProperty("Averages")
+    private Integer averages;
+    @JsonProperty("AverageType")
+    private Integer averageType;
+    @JsonProperty("StorageReason")
+    private Integer storageReason;
+    @JsonProperty("MeasurementComment")
+    private String measurementComment;
+    @JsonProperty("IncludeMeasurements")
+    private Integer includeMeasurements;
+    @JsonProperty("Content")
+    private Integer content;
+    @JsonProperty("Measurements")
+    private List<MeasurementsDTO> measurements;
+    @JsonProperty("UFF")
+    private List<?> uff;
+    @JsonProperty("SyncPosition")
+    private Integer syncPosition;
+    @JsonProperty("IDMeasurement")
+    private Integer iDMeasurement;
+    @JsonProperty("ReadingTimeUTC")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private String readingTimeUTC;
+
+    @NoArgsConstructor
+    @Getter
+    @Setter
+    public static class MeasurementsDTO {
+        @JsonProperty("MeasurementType")
+        private Integer measurementType;
+        @JsonProperty("Direction")
+        private Integer direction;
+        @JsonProperty("Values")
+        private List<Double> values;
+        @JsonProperty("UFF")
+        private Object uff;
+    }
+}

+ 16 - 0
energy-manage-service/src/main/java/com/energy/manage/service/domain/client/skf/HierarchyListVo.java

@@ -0,0 +1,16 @@
+package com.energy.manage.service.domain.client.skf;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * 结构集合
+ */
+@NoArgsConstructor
+@Data
+public class HierarchyListVo extends HierarchyVo {
+
+    List<HierarchyListVo> children;
+}

+ 41 - 0
energy-manage-service/src/main/java/com/energy/manage/service/domain/client/skf/HierarchyVo.java

@@ -0,0 +1,41 @@
+package com.energy.manage.service.domain.client.skf;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 结构信息
+ */
+@NoArgsConstructor
+@Data
+public class HierarchyVo {
+
+
+    @JsonProperty("description")
+    private String description;
+
+    @JsonProperty("name")
+    private String name;
+
+    @JsonProperty("path")
+    private String path;
+
+    @JsonProperty("tag")
+    private String tag;
+
+    @JsonProperty("active")
+    private Boolean active;
+
+    @JsonProperty("typeName")
+    private String typeName;
+
+    @JsonProperty("typeId")
+    private Integer typeId;
+
+    @JsonProperty("id")
+    private Integer id;
+
+    @JsonProperty("src")
+    private Object src;
+}

+ 14 - 1
energy-manage-service/src/main/resources/bootstrap.properties

@@ -45,4 +45,17 @@ spring.jackson.serialization.write-dates-as-timestamps=true
 
 #============================登录拦截器配置=========================================
 #拦截器是否生效
-energy.login.enabled=true
+energy.login.enabled=true
+
+# ============================forest配置=========================================
+forest.bean-id =  forestConfiguration
+forest.backend= okhttp3
+forest.max-connections = 5000
+forest.max-route-connections= 2000
+forest.timeout = 60000
+forest.connect-timeout = 50000
+forest.max-retry-count= 3
+forest.max-retry-interval = 5000
+forest.retry-count=3
+forest.ssl-protocol=
+forest.logEnabled= true

+ 200 - 0
energy-manage-service/src/test/java/client/SkfClientWebTest.java

@@ -0,0 +1,200 @@
+package client;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.text.csv.CsvUtil;
+import cn.hutool.core.text.csv.CsvWriter;
+import cn.hutool.core.util.CharsetUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.energy.manage.service.ManageAppApplication;
+import com.energy.manage.service.client.skf.AuthClient;
+import com.energy.manage.service.client.skf.DynamicMeasurementsClient;
+import com.energy.manage.service.constant.client.skf.SkfClientConstants;
+import com.energy.manage.service.domain.client.skf.AutoTokenVO;
+import com.energy.manage.service.domain.client.skf.DynamicMeasurementsVo;
+import com.energy.manage.service.domain.client.skf.HierarchyListVo;
+import com.google.common.collect.Lists;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.io.*;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.List;
+import java.util.TimeZone;
+
+@Slf4j
+@SpringBootTest(classes = ManageAppApplication.class)
+@RunWith(value = SpringRunner.class)
+public class SkfClientWebTest {
+
+    @Autowired
+    private AuthClient authClient;
+
+    @Autowired
+    private DynamicMeasurementsClient dynamicMeasurementsClient;
+
+    @Test
+    public void authToken() {
+
+        // 获取token
+        AutoTokenVO autoTokenVO = authClient.getSkfToken(SkfClientConstants.SKF_TOKEN_GRANT_TYPE,
+                SkfClientConstants.SKF_TOKEN_USERNAME, SkfClientConstants.SKF_TOKEN_PASSWORD);
+
+        if (autoTokenVO == null) {
+            return;
+        }
+
+        String token = "Bearer " + autoTokenVO.getAccess_token();
+        System.out.println("Authorization ====>" + token);
+
+        // 获取组织结构
+        List<HierarchyListVo> values = dynamicMeasurementsClient.getSkfHierarchy(token);
+        List<HierarchyListVo> hierarchyListVos = Lists.newArrayList();
+
+        for (HierarchyListVo hierarchyListVo : values) {
+            for (HierarchyListVo listVo : hierarchyListVo.getChildren()) {
+                if (listVo.getTypeId() == 1) {
+                    for (HierarchyListVo vo : listVo.getChildren()) {
+                        hierarchyListVos.addAll(vo.getChildren());
+                    }
+                }
+            }
+        }
+
+        Integer pointId = 138;
+        List<String> xlist = Lists.newArrayList();
+        xlist.add("7");
+        xlist.add("8");
+        xlist.add("9");
+
+        for(String x : xlist){
+            String fromDateUTC = "2024-0"+x+"-01";
+            String toDateUTC = "2024-0"+x+"-30";
+            Integer includeMeasurements = 1;
+            Integer numReadings = 800;
+
+            List<DynamicMeasurementsVo> lists = dynamicMeasurementsClient.getSkfDynamicMeasurements(token, pointId, fromDateUTC, toDateUTC, includeMeasurements, numReadings);
+            System.out.println("数据集 >>>>> " + lists.size());
+
+
+            if (CollectionUtil.isEmpty(lists)) {
+                return;
+            }
+
+            // 测点名字
+            String name = null;
+            for (HierarchyListVo vo : hierarchyListVos) {
+                if (vo.getId().equals(pointId)) {
+                    name = vo.getName();
+                }
+            }
+            for (DynamicMeasurementsVo dynamicMeasurementsVo : lists) {
+                if (!CollectionUtil.isEmpty(dynamicMeasurementsVo.getMeasurements())) {
+                    List<DynamicMeasurementsVo.MeasurementsDTO> dynamicMeasurementsVoMeasurements = dynamicMeasurementsVo.getMeasurements();
+                    List<Double> doubleList = Lists.newArrayList();
+                    for (DynamicMeasurementsVo.MeasurementsDTO dto : dynamicMeasurementsVoMeasurements) {
+                        CollectionUtil.addAll(doubleList, dto.getValues());
+                    }
+                    createCsvFile(doubleList, "/Users/shiyue/Downloads/sdk_data/"+x+"month","/Users/shiyue/Downloads/sdk_data/"+x+"month/"+"SKF_F004_4#风机_" + utctolocal(dynamicMeasurementsVo.getReadingTimeUTC()) + "_" + name + "_" + dynamicMeasurementsVo.getSpeed() + "_cms.csv");
+                }
+            }
+
+        }
+
+
+
+
+    }
+
+
+    /**
+     * 时间转换
+     *
+     * @param utcTime
+     * @return
+     */
+    private String utctolocal(String utcTime) {
+        DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
+        LocalDateTime dateTime = LocalDateTime.parse(utcTime, formatter);
+        return dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+    }
+
+
+    /**
+     * 导出csv格式工具类
+     *
+     * @param result   导出数据
+     * @param fileName 文件名
+     */
+    public void createCsvFile(List result, String path,String fileName) {
+        try {
+            // 输出的文件流保存到本地文件
+            File tempFile = new File(path);
+            if (!tempFile.exists()) {
+                tempFile.mkdirs();
+            }
+            File csvFile = new File(fileName);  //构造文件
+            //导入HuTool中CSV工具包的CsvWriter类
+            //设置导出字符类型, CHARSET_UTF_8
+            CsvWriter writer = CsvUtil.getWriter(csvFile, CharsetUtil.CHARSET_UTF_8);
+            writer.write(result);  //通过CsvWriter中的write方法写入数据
+            writer.close();   //关闭CsvWriter
+            //保存文件
+//            FileInputStream fileInputStream = new FileInputStream(csvFile);
+//            this.saveFile(fileInputStream, csvFile.getName());
+        } catch (Exception e) {
+            System.out.println(e);
+        }
+    }
+
+    /**
+     * 文件保存
+     *
+     * @param inputStream
+     * @param fileName
+     */
+    private void saveFile(InputStream inputStream, String fileName) {
+        OutputStream os = null;
+        try {
+            //保存文件路径
+            String path = "/Users/shiyue/Downloads/sdk_data/8month";
+            // 1K的数据缓冲
+            byte[] bs = new byte[1024];
+            // 读取到的数据长度
+            int len;
+            // 输出的文件流保存到本地文件
+            File tempFile = new File(path);
+            if (!tempFile.exists()) {
+                tempFile.mkdirs();
+            }
+            os = new FileOutputStream(tempFile.getPath() + File.separator + fileName);
+            // 开始读取
+            while ((len = inputStream.read(bs)) != -1) {
+                os.write(bs, 0, len);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            // 完毕,关闭所有链接
+            try {
+                os.close();
+                inputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+}