Browse Source

优化sql,驾驶舱

shiyue 1 month ago
parent
commit
804cdc3f42

+ 50 - 0
energy-manage-common/src/main/java/com/energy/manage/common/reponse/HttpResult.java

@@ -0,0 +1,50 @@
+package com.energy.manage.common.reponse;
+
+import java.util.Optional;
+
+/**
+ * 请求响应实体
+ */
+public class HttpResult {
+
+    private boolean success;
+    private int statusCode;
+    private String message;
+    private String data;
+
+    private HttpResult(boolean success, int statusCode, String message, String data) {
+        this.success = success;
+        this.statusCode = statusCode;
+        this.message = message;
+        this.data = data;
+    }
+
+    public static HttpResult success(int statusCode, String data) {
+        return new HttpResult(true, statusCode, "请求成功", data);
+    }
+
+    public static HttpResult fail(String message) {
+        return new HttpResult(false, -1, message, null);
+    }
+
+    public static HttpResult fail(int statusCode, String message) {
+        return new HttpResult(false, statusCode, message, null);
+    }
+
+    // Getter方法
+    public boolean isSuccess() {
+        return success;
+    }
+
+    public int getStatusCode() {
+        return statusCode;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public Optional<String> getData() {
+        return Optional.ofNullable(data);
+    }
+}

+ 0 - 26
energy-manage-common/src/main/java/com/energy/manage/common/util/DateTools.java

@@ -655,32 +655,6 @@ public class DateTools {
     }
 
 
-//    public static void main(String[] args) {
-//        Date date1 = DateTools.str2Date("2018-09-10", Constants.YYYY_MM_DD);
-//        Date date2 = DateTools.str2Date("2019-11-20", Constants.YYYY_MM_DD);
-//
-//        //int number=DateTools.getZygjWeeks(date1,date2);
-//        String[] a= DateTools.getMonthRange(date1,date2);
-//        for (String i:a){
-//            System.out.println(i);
-//        }
-//
-//        //System.out.println(getDateFromString(getStartDate(new Date()),Constants.YYYY_MM_DD_HH_MM_SS));
-////        String date = "2017-08-17";
-////        Date date1 = DateTools.str2Date(date, Constants.YYYY_MM_DD);
-////        Map<Integer, Map<Integer, String>> weekNumDate = geWeekDate(date1, 7);
-////        for (Integer weekNum : weekNumDate.keySet()) {
-////           // System.out.println("第" + weekNum + "周在:" + getWeekNumOfMonth(weekNum, weekNumDate) + "月");
-////
-////            Map<Integer, String> weekMap = weekNumDate.get(weekNum);
-////            for (Integer s : weekMap.keySet()) {
-////                System.out.println(s + ": " + weekMap.get(s));
-////            }
-////        }
-//
-//    }
-
-
     public static Date getDate(String strTime) {
         if (strTime == null || strTime.length() == 0) {
             return null;

+ 1 - 1
energy-manage-service/pom.xml

@@ -53,7 +53,7 @@
         <dependency>
             <groupId>com.dtflys.forest</groupId>
             <artifactId>forest-spring-boot-starter</artifactId>
-            <version>1.5.13</version>
+            <version>1.5.30</version>
         </dependency>
 
     </dependencies>

+ 1 - 2
energy-manage-service/src/main/java/com/energy/manage/service/client/skf/DynamicMeasurementsClient.java

@@ -21,8 +21,7 @@ public interface DynamicMeasurementsClient {
             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);
+                                                          @Query("fromDateUTC")String fromDateUTC, @Query("toDateUTC")String toDateUTC);
 
 
     @Get(

+ 16 - 16
energy-manage-service/src/main/java/com/energy/manage/service/controller/system/SysTestController.java

@@ -5,6 +5,7 @@ import com.alibaba.excel.EasyExcel;
 import com.energy.manage.service.config.annotations.PassToken;
 import com.energy.manage.service.domain.vo.excel.MinTestDataVo;
 import com.energy.manage.service.service.kafka.producer.KafkaSendService;
+import com.energy.manage.service.service.vibration.VibrationService;
 import com.energy.manage.service.util.BatchDownloadUtil;
 import io.swagger.annotations.Api;
 import lombok.extern.slf4j.Slf4j;
@@ -15,6 +16,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.io.File;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 /**
@@ -33,6 +36,12 @@ public class SysTestController {
     @Autowired
     private BatchDownloadUtil batchDownloadUtil;
 
+    @Autowired
+    private VibrationService vibrationService;
+
+    // 定义时间格式
+    private final String dateTimeFormatter = "yyyy-MM-dd";
+
 //	@Autowired
 //	private KafkaSendService kafkaSendService;
 //
@@ -58,23 +67,14 @@ public class SysTestController {
 
 
 
+    @PassToken
+	@GetMapping("/vibrationData")
+	public void vibrationData() {
 
-//	@GetMapping("/test-execl")
-//	public void testExecl() {
-//
-//		File file = new File("/Users/shiyue/Downloads/zn/F001_min.xlsx");
-//		List<MinTestDataVo> list = EasyExcel.read(file).head(MinTestDataVo.class).sheet().doReadSync();
-//		int i = 0;
-////		list.stream().forEach(x -> {
-////			log.info(x.getFengsu());
-////		});
-//
-//		for(MinTestDataVo minTestDataVo : list){
-//			log.info(minTestDataVo.getFengsu());
-//			i++;
-//		}
-//		System.out.println(i);
-//	}
+
+        vibrationService.extractSkfPointData();
+
+	}
 
 
 

+ 15 - 0
energy-manage-service/src/main/java/com/energy/manage/service/service/vibration/VibrationService.java

@@ -0,0 +1,15 @@
+package com.energy.manage.service.service.vibration;
+
+/**
+ * skf接入测点数据
+ */
+public interface VibrationService {
+
+    /**
+     * 抽取skf测点数据生成csv文件)
+     */
+     void extractSkfPointData();
+
+
+
+}

+ 373 - 0
energy-manage-service/src/main/java/com/energy/manage/service/service/vibration/impl/VibrationServiceImpl.java

@@ -0,0 +1,373 @@
+package com.energy.manage.service.service.vibration.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.text.StrFormatter;
+import cn.hutool.core.text.csv.CsvUtil;
+import cn.hutool.core.text.csv.CsvWriter;
+import cn.hutool.core.util.CharsetUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.energy.manage.common.reponse.HttpResult;
+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.energy.manage.service.service.vibration.VibrationService;
+import com.energy.manage.service.util.HttpGetClient;
+import com.google.common.collect.Lists;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.io.File;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.format.TextStyle;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class VibrationServiceImpl implements VibrationService {
+
+    @Autowired
+    private AuthClient authClient;
+
+    @Autowired
+    private DynamicMeasurementsClient dynamicMeasurementsClient;
+
+    // 定义时间格式
+    private final String dateTimeFormatter = "yyyy-MM-dd";
+
+    private final String dateFormatter = "MM-dd";
+
+    private String dynamicMeasurementsUrl = "http://192.168.50.242:5000/v1/points/{}/dynamicMeasurements";
+
+    private ZoneId shanghaiZone = ZoneId.of("Asia/Shanghai");
+
+    private String yesterdayTime = LocalDate.now().minusDays(1).format(DateTimeFormatter.ofPattern(dateFormatter));
+
+    @Value("${skf.data.path}")
+    private String skfDataPath;
+
+    //    @Value("${skf.data.condition}")
+    private String condition = "七台河数据2";
+
+    @Override
+    public void extractSkfPointData() {
+
+        // 获取组织结构
+        List<HierarchyListVo> hierarchyListVoList = getHierarchyLists();
+        log.info("获取SKF数据组织结构树 >>> " + JSON.toJSONString(hierarchyListVoList));
+
+        // 企业
+        company:
+        for (HierarchyListVo companyHierarchyListVo : hierarchyListVoList) {
+            // 风场
+            field:
+            for (HierarchyListVo fieldHierarchyListVo : companyHierarchyListVo.getChildren()) {
+                if (CollectionUtils.isEmpty(fieldHierarchyListVo.getChildren())) {
+                    continue;
+                }
+                //风机,特殊情况需要单独处理(风机到部件到具体测点有可能少一层部件)需要根据不同风场进行单独处理,风机直接获取测点id,跳过部件
+                engine:
+                for (HierarchyListVo engineHierarchyListVo : fieldHierarchyListVo.getChildren()) {
+                    if (CollectionUtils.isEmpty(engineHierarchyListVo.getChildren())) {
+                        continue;
+                    }
+//                    List<String> subs = StrUtil.split(condition,",");
+//                    if(CollUtil.contains(subs,fieldHierarchyListVo.getName())){
+//                        getIointIdCreateDataCsv(engineHierarchyListVo,companyHierarchyListVo.getName(),
+//                                fieldHierarchyListVo.getName(),engineHierarchyListVo.getName(), engineHierarchyListVo.getName());
+//                    }else{
+                    //部件
+                    assembly:
+                    for (HierarchyListVo assemblyHierarchyListVo : engineHierarchyListVo.getChildren()) {
+                        if (CollectionUtils.isEmpty(assemblyHierarchyListVo.getChildren())) {
+                            continue;
+                        }
+                        // 具体测点
+                        for (HierarchyListVo pointHierarchyListVo : assemblyHierarchyListVo.getChildren()) {
+                            //获取测点id值,调用skf接口获取振动测点值
+                            log.info("部件测点路径:>>> " + companyHierarchyListVo.getName() + " -> " + fieldHierarchyListVo.getName() +
+                                    " -> " + engineHierarchyListVo.getName() + " -> " + assemblyHierarchyListVo.getName() + " -> " + pointHierarchyListVo.getName());
+                            // 测点id
+                            Integer pointId = pointHierarchyListVo.getId();
+                            log.info("测点id >>> " + pointId);
+
+                            List<DynamicMeasurementsVo> dynamicMeasurementsList = getDynamicMeasurementsList(pointId);
+                            if (CollectionUtil.isEmpty(dynamicMeasurementsList)) {
+                                continue;
+                            }
+                            // 拼接服务器地址
+                            String dataPath = skfDataPath + companyHierarchyListVo.getName() + "/" + fieldHierarchyListVo.getName() + "/"
+                                    + engineHierarchyListVo.getName()  + "/" + getCurrentYearByTimeZone(this.shanghaiZone) + "/"
+                                    + yesterdayTime;
+
+                            String fileNamePrefix = fieldHierarchyListVo.getName()  + "_" + engineHierarchyListVo.getName() + "_" +
+                                    pointHierarchyListVo.getName();
+
+                            // 获取具体数据并生成csv
+                            dynamicMeasurementsConvertData(dynamicMeasurementsList, dataPath, fileNamePrefix);
+                        }
+                    }
+//                    }
+                }
+            }
+            log.info(" >>> skf接口处理完毕 <<<");
+        }
+    }
+
+    /**
+     * 通过测点id获取测点数据并生成csv文件
+     *
+     * @param poinIdhierarchyListVo
+     * @param companyName
+     * @param fieldName
+     * @param engineName
+     * @param assemblyName
+     */
+    private void getIointIdCreateDataCsv(HierarchyListVo poinIdhierarchyListVo, String companyName, String fieldName,
+                                         String engineName, String assemblyName) {
+        if (poinIdhierarchyListVo == null) {
+            return;
+        }
+        // 具体测点
+        for (HierarchyListVo pointHierarchyListVo : poinIdhierarchyListVo.getChildren()) {
+            //获取测点id值,调用skf接口获取振动测点值
+            log.info("部件测点路径:>>> " + companyName + " -> " + fieldName +
+                    " -> " + engineName + " -> " + assemblyName + " -> " + pointHierarchyListVo.getName());
+            // 测点id
+            Integer pointId = pointHierarchyListVo.getId();
+            log.info("测点id >>> " + pointId);
+
+            List<DynamicMeasurementsVo> dynamicMeasurementsList = getDynamicMeasurementsList(pointId);
+            if (CollectionUtil.isEmpty(dynamicMeasurementsList)) {
+                continue;
+            }
+            // 拼接服务器地址
+            String dataPath = skfDataPath + companyName + "/" + fieldName + "/"
+                    + engineName + "/" + getCurrentYearByTimeZone(this.shanghaiZone) + "/"
+                    + yesterdayTime;
+
+            String fileNamePrefix = fieldName + "_" + engineName + "_" +
+                    pointHierarchyListVo.getName();
+
+            // 获取具体数据并生成csv
+            dynamicMeasurementsConvertData(dynamicMeasurementsList, dataPath, fileNamePrefix);
+        }
+    }
+
+
+    /**
+     * 将测点数据转换抽取
+     *
+     * @param dynamicMeasurementsList
+     * @return
+     */
+    private void dynamicMeasurementsConvertData(List<DynamicMeasurementsVo> dynamicMeasurementsList, String dataPath, String fileNamePrefix) {
+        dynamic:
+        for (DynamicMeasurementsVo dynamicMeasurementsVo : dynamicMeasurementsList) {
+            List<Double> doubleList = Lists.newLinkedList();
+            List<DynamicMeasurementsVo.MeasurementsDTO> dynamicMeasurementsVoMeasurements = dynamicMeasurementsVo.getMeasurements();
+            for (DynamicMeasurementsVo.MeasurementsDTO dto : dynamicMeasurementsVoMeasurements) {
+                CollectionUtil.addAll(doubleList, dto.getValues());
+            }
+            if (CollectionUtils.isEmpty(doubleList)) {
+                break dynamic;
+            }
+            String fileName = fileNamePrefix + "_" + dynamicMeasurementsVo.getSpeed() + "_" + utctolocal(dynamicMeasurementsVo.getReadingTimeUTC()) + "_cms.csv";
+            //生成csv文件
+            createCsvFile(doubleList, dataPath, fileName);
+            log.info("抽取skf数据并生成csv文件 >>>> " + fileName);
+        }
+    }
+
+    /**
+     * 通过测点id获取数据
+     *
+     * @param pointId
+     * @return
+     */
+    private List<DynamicMeasurementsVo> getDynamicMeasurementsList(Integer pointId) {
+        // 获取开始的时间
+        String fromDateUTC = LocalDate.now().minusDays(1).format(DateTimeFormatter.ofPattern(dateTimeFormatter));
+        // 获取结束的时间,当前时间
+        String toDateUTC = LocalDate.now().format(DateTimeFormatter.ofPattern(dateTimeFormatter));
+
+        String skfToken = getSkfAutoToken();
+        if (StringUtils.isEmpty(skfToken)) {
+            log.info(" >>>>>> 获取skftoken失败 <<<<<< ");
+            return null;
+        }
+        log.info(" >>>>>> 获取skftoken成功 <<<<<< " + skfToken);
+        List<DynamicMeasurementsVo> lists = Lists.newArrayList();
+        String url = StrFormatter.format(dynamicMeasurementsUrl, pointId);
+        // 动态参数
+        Map<String, Object> params = new HashMap<>();
+        params.put("fromDateUTC", fromDateUTC);
+        params.put("toDateUTC", toDateUTC);
+
+        //发送请求
+        HttpResult result = HttpGetClient.sendWithAuthAndParams(url, skfToken, params);
+
+        // 处理响应结果
+        if (result.isSuccess()) {
+            log.info("请求成功,状态码: " + result.getStatusCode());
+            result.getData().ifPresent(data -> System.out.println("响应内容: " + data));
+            lists = JSONArray.parseArray(result.getData().get(), DynamicMeasurementsVo.class);
+            return lists;
+        } else {
+            log.error("请求失败: " + result.getMessage());
+            if (result.getStatusCode() != -1) {
+                log.error("状态码: " + result.getStatusCode() + " >>>>>> 无测点数据");
+            }
+            return null;
+        }
+    }
+
+
+    /**
+     * 通过接口获取SKF数据组织结构树
+     *
+     * @return
+     */
+    private List<HierarchyListVo> getHierarchyLists() {
+        String skfToken = getSkfAutoToken();
+        if (StringUtils.isEmpty(skfToken)) {
+            log.info(" >>>>>> 获取skftoken失败 <<<<<< ");
+            return null;
+        }
+        List<HierarchyListVo> list = dynamicMeasurementsClient.getSkfHierarchy(skfToken);
+        return CollectionUtils.isEmpty(list) ? null : list;
+    }
+
+
+    /**
+     * 获取token
+     *
+     * @return
+     */
+    private String getSkfAutoToken() {
+        // 获取token
+        AutoTokenVO autoTokenVO = authClient.getSkfToken(SkfClientConstants.SKF_TOKEN_GRANT_TYPE,
+                SkfClientConstants.SKF_TOKEN_USERNAME, SkfClientConstants.SKF_TOKEN_PASSWORD);
+        return "Bearer " + autoTokenVO.getAccess_token();
+    }
+
+
+    /**
+     * 导出csv格式工具类
+     *
+     * @param result   导出数据
+     * @param fileName 文件名
+     */
+    private void createCsvFile(List result, String path, String fileName) {
+        try {
+            // 输出的文件流保存到本地文件
+            File tempFile = new File(path);
+            if (!tempFile.exists()) {
+                tempFile.mkdirs();
+            }
+            //构造文件
+            String fullPath = path + "/" + fileName;
+            File csvFile = new File(fullPath);
+            //导入HuTool中CSV工具包的CsvWriter类,设置导出字符类型, CHARSET_UTF_8
+            CsvWriter writer = CsvUtil.getWriter(csvFile, CharsetUtil.CHARSET_UTF_8);
+            //通过CsvWriter中的write方法写入数据
+            writer.write(result);
+            writer.close();   //关闭CsvWriter
+            log.info("CSV 文件生成成功!路径:" + fullPath);
+        } catch (Exception e) {
+            log.error("CSV 文件生成失:" + e.getMessage());
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 获取指定时区的当前年份(解决跨时区年份偏差问题)
+     * 适用场景:服务器时区与业务时区不一致(如服务器用UTC,业务用北京时区)
+     *
+     * @param zoneId 时区(如 ZoneId.of("Asia/Shanghai") 北京时区,ZoneId.of("UTC") 世界标准时间)
+     * @return 4位年份整数(如 2025)
+     * @throws IllegalArgumentException 若传入无效时区ID
+     */
+    public static int getCurrentYearByTimeZone(ZoneId zoneId) {
+        if (zoneId == null) {
+            throw new IllegalArgumentException("时区不能为空,请传入有效的ZoneId(如ZoneId.of(\"Asia/Shanghai\"))");
+        }
+        // 指定时区获取当前日期,再提取年份
+        return LocalDate.now(zoneId).getYear();
+    }
+
+    /**
+     * 获取“M月d日”格式(中文口语化格式,如 9月8日、12月31日)
+     * 适用场景:中文展示(前端页面、通知文案)
+     *
+     * @param zoneId 时区(可为null,默认系统时区)
+     * @return M月d日 格式的月日字符串
+     */
+    public static String getMonthDayAsChinese(ZoneId zoneId) {
+        ZoneId actualZone = (zoneId == null) ? ZoneId.systemDefault() : zoneId;
+        // 格式模板:M=一位/两位数月,d=一位/两位数日(自动省略前导0,更符合中文习惯)
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M月d日");
+        return LocalDate.now(actualZone).format(formatter);
+    }
+
+    /**
+     * 适用场景:月份名称展示(如“当前月份:九月”)、枚举判断等
+     *
+     * @param zoneId 时区
+     * @param locale 语言地区(如 Locale.CHINA 中文,Locale.ENGLISH 英文)
+     * @return 本地化的月份名称(如“九月”“September”)
+     */
+    private String getCurrentMonthAsName(ZoneId zoneId, Locale locale) {
+        ZoneId actualZone = (zoneId == null) ? ZoneId.systemDefault() : zoneId;
+        Locale actualLocale = (locale == null) ? Locale.getDefault() : locale;
+
+        // 1. 获取Month枚举(如 SEPTEMBER)
+        Month currentMonth = LocalDate.now(actualZone).getMonth();
+        // 2. 转换为本地化完整名称(TextStyle.FULL 表示完整名称,如“九月”而非“九”)
+        return currentMonth.getDisplayName(TextStyle.FULL, actualLocale);
+    }
+
+    /**
+     * 获取当前月份(数字形式,1-12)
+     * 适用场景:数值判断(如“当前月份是否为12月”)、数据库存储等
+     *
+     * @param zoneId 时区(如 ZoneId.of("Asia/Shanghai"),默认系统时区)
+     * @return 月份数字(1=1月,12=12月)
+     */
+    public static int getCurrentMonthAsNumber(ZoneId zoneId) {
+        // 若未指定时区,使用系统默认时区
+        ZoneId actualZone = (zoneId == null) ? ZoneId.systemDefault() : zoneId;
+        // LocalDate.now(时区) 获取指定时区的当前日期,getMonthValue() 提取1-12的月份
+        return LocalDate.now(actualZone).getMonthValue();
+    }
+
+
+    /**
+     * 时间转换
+     *
+     * @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"));
+    }
+
+}

+ 0 - 20
energy-manage-service/src/main/java/com/energy/manage/service/task/EnergyDataTask.java

@@ -1,20 +0,0 @@
-package com.energy.manage.service.task;
-
-import com.xxl.job.core.handler.annotation.XxlJob;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-@Slf4j
-@Component
-public class EnergyDataTask {
-
-    /**
-     * 开始定时器
-     */
-    @XxlJob(value = "demoJobHandler")
-    public void demoJobHandler() {
-        log.info(" xxl-job >>>> test ");
-        return;
-    }
-
-}

+ 51 - 0
energy-manage-service/src/main/java/com/energy/manage/service/task/SkfVibrationDataTask.java

@@ -0,0 +1,51 @@
+package com.energy.manage.service.task;
+
+import com.energy.manage.service.service.vibration.VibrationService;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+@Slf4j
+@Component
+public class SkfVibrationDataTask {
+
+    @Autowired
+    private VibrationService vibrationService;
+
+    // 定义时间格式
+    private final String dateTimeFormatter = "yyyy-MM-dd";
+
+    /**
+     * 开始定时器
+     */
+    @XxlJob(value = "skfVibrationData")
+    public void skfVibrationData() {
+
+        log.info(getCurrentDateTim() + "开始抽取skf测点数据 ");
+
+        // 获取昨天的时间
+        String yesterdayDate = LocalDate.now().minusDays(1).format(DateTimeFormatter.ofPattern(dateTimeFormatter));
+
+//        vibrationService.extractSkfPointData(yesterdayDate,1,999);
+
+        log.info(getCurrentDateTim() + "结束抽取skf测点数据 ");
+    }
+
+
+    private String getCurrentDateTim() {
+        // 1. 获取当前系统的日期时间(不含时区,适用于本地时间场景)
+        LocalDateTime now = LocalDateTime.now();
+        System.out.println("当前原始时间:" + now);
+        // 2. 定义常用的日期时间格式器(可根据需求自定义格式)
+        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        // 3. 格式化日期时间
+        return now.format(formatter1);
+    }
+
+
+}

+ 1 - 4
energy-manage-service/src/main/java/com/energy/manage/service/util/DateUtils.java

@@ -187,6 +187,7 @@ public class DateUtils {
 
     /**
      * 加天数
+     *
      * @param date
      * @param days
      * @return
@@ -196,10 +197,6 @@ public class DateUtils {
         return Date.from(localDate.plusDays(days).atStartOfDay(ZoneId.systemDefault()).toInstant());
     }
 
-    public static void main(String[] args) {
-        System.out.println(DateUtils.convertDate2StringYMD(addDays(new Date(),2)));
-    }
-
 
     /**
      * Date--》LocalDate

+ 83 - 0
energy-manage-service/src/main/java/com/energy/manage/service/util/HttpGetClient.java

@@ -0,0 +1,83 @@
+package com.energy.manage.service.util;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.http.HttpStatus;
+import cn.hutool.http.HttpUtil;
+import com.energy.manage.common.reponse.HttpResult;
+import lombok.extern.slf4j.Slf4j;
+
+import java.nio.charset.Charset;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+public class HttpGetClient {
+
+    // 默认超时时间5秒
+    private static final int DEFAULT_TIMEOUT = 5000;
+
+    /**
+     * 发送带Authorization头和动态参数的GET请求
+     *
+     * @param baseUrl 基础URL(不包含参数部分)
+     * @param token   认证令牌
+     * @param params  动态请求参数
+     * @return 响应结果封装对象
+     */
+    public static HttpResult sendWithAuthAndParams(String baseUrl, String token, Map<String, Object> params) {
+        return sendWithAuthAndParams(baseUrl, token, params, new HashMap<>(), DEFAULT_TIMEOUT);
+    }
+
+    /**
+     * 发送带Authorization头和动态参数的GET请求,可自定义头信息和超时时间
+     *
+     * @param baseUrl 基础URL(不包含参数部分)
+     * @param token   认证令牌
+     * @param params  动态请求参数
+     * @param headers 额外的头信息
+     * @param timeout 超时时间(毫秒)
+     * @return 响应结果封装对象
+     */
+    public static HttpResult sendWithAuthAndParams(String baseUrl, String token, Map<String, Object> params,
+                                                   Map<String, String> headers, int timeout) {
+        // 参数校验
+        if (baseUrl == null || baseUrl.trim().isEmpty()) {
+            return HttpResult.fail("请求基础URL不能为空");
+        }
+        if (token == null || token.trim().isEmpty()) {
+            return HttpResult.fail("认证令牌不能为空");
+        }
+
+        try {
+            // 构建完整URL(自动处理参数拼接和编码)
+            String url = HttpUtil.urlWithForm(baseUrl, params, Charset.forName("UTF-8"), false);
+            log.info("请求url 地址 >>> " + url);
+            // 构建请求
+            HttpRequest request = HttpRequest.get(url)
+                    .header("Authorization", token)
+                    .header("Content-Type", "application/json")
+                    .timeout(timeout);
+
+            // 添加额外头信息
+            if (headers != null && !headers.isEmpty()) {
+                headers.forEach(request::header);
+            }
+
+            // 执行请求
+            HttpResponse response = request.execute();
+            int statusCode = response.getStatus();
+
+            // 根据状态码返回不同结果
+            if (HttpStatus.HTTP_OK == statusCode) {
+                return HttpResult.success(statusCode, response.body());
+            } else {
+                return HttpResult.fail(statusCode, "请求失败: " + response.body());
+            }
+
+        } catch (Exception e) {
+            return HttpResult.fail("请求发生异常: " + e.getMessage());
+        }
+    }
+
+}

+ 3 - 2
energy-manage-service/src/test/java/client/SkfClientWebTest.java

@@ -82,9 +82,9 @@ public class SkfClientWebTest {
             String fromDateUTC = "2024-0"+x+"-01";
             String toDateUTC = "2024-0"+x+"-30";
             Integer includeMeasurements = 1;
-            Integer numReadings = 800;
+            Integer numReadings = 999;
 
-            List<DynamicMeasurementsVo> lists = dynamicMeasurementsClient.getSkfDynamicMeasurements(token, pointId, fromDateUTC, toDateUTC, includeMeasurements, numReadings);
+            List<DynamicMeasurementsVo> lists = dynamicMeasurementsClient.getSkfDynamicMeasurements(token, pointId,fromDateUTC,toDateUTC);
             System.out.println("数据集 >>>>> " + lists.size());
 
 
@@ -99,6 +99,7 @@ public class SkfClientWebTest {
                     name = vo.getName();
                 }
             }
+
             for (DynamicMeasurementsVo dynamicMeasurementsVo : lists) {
                 if (!CollectionUtil.isEmpty(dynamicMeasurementsVo.getMeasurements())) {
                     List<DynamicMeasurementsVo.MeasurementsDTO> dynamicMeasurementsVoMeasurements = dynamicMeasurementsVo.getMeasurements();