潘志宝
2025-01-22 d0d5011558c12337410350642e8c41da211e261b
Merge remote-tracking branch 'origin/master'
已修改9个文件
已添加1个文件
275 ■■■■■ 文件已修改
iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/enums/DataPointFreqEnum.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/admin/ApiDataController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointCollectTaskNet1h.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java 84 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictResultHandler.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-system/iailab-module-system-biz/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-system/iailab-module-system-biz/src/main/resources/application-dev.yaml 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-system/iailab-module-system-biz/src/main/resources/application.yaml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/enums/DataPointFreqEnum.java
@@ -11,7 +11,8 @@
public enum DataPointFreqEnum {
    NET_10S("10s", 10),
    NET_30S("30s", 30),
    NET_1MIN("1min",60);
    NET_1MIN("1min",60),
    NET_1H("1h",60*60);
    private String code;
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/admin/ApiDataController.java
@@ -9,6 +9,7 @@
import com.iailab.module.data.api.dto.IndexQueryDTO;
import com.iailab.module.data.api.dto.echarts.BarLineDTO;
import com.iailab.module.data.api.dto.echarts.SeriesItem;
import com.iailab.module.data.api.ind.IndItemApi;
import com.iailab.module.data.api.ind.dto.ApiIndItemQueryDTO;
import com.iailab.module.data.api.ind.dto.ApiIndItemValueDTO;
import com.iailab.module.data.api.plan.PlanItemApi;
@@ -66,6 +67,9 @@
    @Autowired
    private PlanItemApi planItemApi;
    @Autowired
    private IndItemApi indItemApi;
    @Autowired
    private IndItemCollector indItemCollector;
@@ -303,28 +307,15 @@
    @PermitAll
    @GetMapping("/query-ind/default-value")
    @Operation(summary = "查询指标默认值")
    public CommonResult<List<ApiIndItemValueDTO>> queryIndItemDefaultValue(HttpServletResponse response, HttpServletRequest
            request,@RequestParam String itemNo) throws Exception {
        apiSecurityUtils.validate(request);
        List<IndItemValueVO> list = indItemCollector.queryValue(itemNo);
        List<ApiIndItemValueDTO> dtoList = new ArrayList<>();
        list.forEach(item -> {
            if (item != null) {
                ApiIndItemValueDTO dto = new ApiIndItemValueDTO();
                dto.setDataTime(item.getDataTime());
                dto.setDataValue(item.getDataValue().doubleValue());
                dtoList.add(dto);
            }
        });
        return success(dtoList);
    public CommonResult<List<ApiIndItemValueDTO>> queryIndItemDefaultValue(@RequestParam String itemNo) {
        return success(indItemApi.queryIndItemDefaultValue(itemNo));
    }
    @PermitAll
    @PostMapping("/query-ind/history-value")
    @Operation(summary = "查询指标历史值")
    public CommonResult<List<ApiIndItemValueDTO>> queryIndItemHistoryValue(@RequestBody ApiIndItemQueryDTO dto) {
        List<IndItemValueVO> list = indItemCollector.queryValue(dto.getItemNo(), dto.getStart(), dto.getEnd());
        return success(ConvertUtils.sourceToTarget(list, ApiIndItemValueDTO.class));
        return success(indItemApi.queryIndItemHistoryValue(dto));
    }
    @PermitAll
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointCollectTaskNet1h.java
对比新文件
@@ -0,0 +1,40 @@
package com.iailab.module.data.job.task;
import com.iailab.module.data.point.collection.PointCollector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.Calendar;
/**
 * @description: Point采集器1h
 * @author: dzd
 * @date: 2025/1/18 14:07
 **/
@Component("pointCollectTaskNet1h")
public class PointCollectTaskNet1h implements ITask {
    private Logger logger = LoggerFactory.getLogger(getClass());
    private final String NET = "1h";
    @Resource
    private PointCollector pointCollector;
    @Override
    public void run(String params){
        logger.debug("pointCollectTaskNet1h定时任务正在执行,参数为:{}", params);
        try {
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.MILLISECOND, 0);
            pointCollector.collect(calendar.getTime(), NET);
            logger.info("pointCollectTaskNet1h定时任务完成时间:" + LocalDateTime.now());
        } catch (Exception ex) {
            ex.printStackTrace();
            logger.error("pointCollectTaskNet1h定时任务失败时间:" + LocalDateTime.now());
        }
    }
}
iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java
@@ -107,17 +107,9 @@
    @Operation(summary = "获取最后预测值")
    Map<String, BigDecimal> getPredictLastValue(@RequestBody PredictLastValueReqVO reqVO);
    @GetMapping("/predict-data/electric")
    @Operation(summary = "电力功率因数预测结果查询")
    Map<String,List<Object[]>> getElectricPredictData(String itemCode);
    @GetMapping("/schedule-data/last")
    @Operation(summary = "调度模型最新结果查询")
    List<StScheduleRecordVO> getLastScheduleData(@RequestParam("scheduleCode") String scheduleCode,@RequestParam("limit") Integer limit);
    @GetMapping("/machineRealTimeStatus")
    @Operation(summary = "发电机组实时状态查询")
    List<Map<String, Object>> getRealTimeStatus(@RequestBody List<Map<String, Object>> machines);
    @PostMapping("/predict-data/itemNo")
    @Operation(summary = "查询时间范围内预测结果")
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java
@@ -667,43 +667,6 @@
    }
    @Override
    public Map<String,List<Object[]>> getElectricPredictData(String itemCode) {
        ItemVO predictItem = mmPredictItemService.getItemByItemNo(itemCode);
        if (null == predictItem) {
            return new HashMap<>();
        }
        List<Integer> resultIndexs = new ArrayList<>();
        resultIndexs.add(0);
        resultIndexs.add(1);
        resultIndexs.add(2);
        List<MmItemOutputEntity> outPuts = mmItemOutputService.getByItemid(predictItem.getId(),"predictValues",resultIndexs);
        if (CollectionUtils.isEmpty(outPuts)) {
            return new HashMap<>();
        }
        InfluxModelResultByOutPutIdsPOJO pojo = new InfluxModelResultByOutPutIdsPOJO();
        pojo.setOutPutIds(outPuts.stream().map(MmItemOutputEntity::getId).collect(Collectors.toList()));
        pojo.setType(DataTypeEnum.FLOAT.getCode());
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(predictItem.getLastTime());
        calendar.add(Calendar.DAY_OF_YEAR, 7);
        Map<String, List<InfluxModelResultVO>> outPutDatas = influxDBService.queryModelResultsByOutPutIds(pojo, predictItem.getLastTime(), calendar.getTime());
        Map<String,List<Object[]>> result = new HashMap<>(outPuts.size());
        for (MmItemOutputEntity outPut : outPuts) {
            String outPutId = outPut.getId();
            if (outPutDatas.containsKey(outPutId)) {
                List<InfluxModelResultVO> influxModelResultVOS = outPutDatas.get(outPutId);
                result.put(null == outPut.getResultIndex() ? outPut.getResultstr() : outPut.getResultstr()+"_"+outPut.getResultIndex(),influxModelResultVOS.stream().map(e -> {
                    Object[] values = new Object[2];
                    values[0] = DateUtils.format(Date.from(e.getTimestamp()), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
                    values[1] = Double.valueOf(e.getValue().toString());
                    return values;
                }).collect(Collectors.toList()));
            }
        }
        return result;
    }
    @Override
    public List<StScheduleRecordVO> getLastScheduleData(String scheduleCode, Integer limit) {
        if (StringUtils.isBlank(scheduleCode)) {
            return null;
@@ -712,46 +675,27 @@
    }
    @Override
    public List<Map<String, Object>> getRealTimeStatus(List<Map<String, Object>> machines) {
        List<String> pointNos = new ArrayList<>(16);
        for (Map<String, Object> machine : machines) {
            List<String> list = (List<String>) machine.get("pointNos");
            pointNos.addAll(list);
        }
        Map<String, Object> pointValues = dataPointApi.queryPointsRealValue(pointNos);
        List<Map<String, Object>> results = new ArrayList<>();
        for (Map<String, Object> machine : machines) {
            List<String> pointNoList = (List<String>) machine.get("pointNos");
            if (!pointValues.containsKey(pointNoList.get(0)) || !pointValues.containsKey(pointNoList.get(1))) {
                machine.put("status",false);
                machine.put("num",0);
                results.add(machine);
                continue;
            }
            Double PValue = Double.valueOf(pointValues.get(pointNoList.get(0)).toString());
            Double QValue = Double.valueOf(pointValues.get(pointNoList.get(1)).toString());
            Double cos = calculateCos(PValue, QValue);
            if (cos.equals(0.0)) {
                machine.put("status",false);
                machine.put("num",0);
            }else {
                machine.put("status",true);
                machine.put("num",cos);
            }
            results.add(machine);
        }
        return results;
    }
    @Override
    public Map<String, List<Object[]>> getPredictDataItemNo(PreDataItemNoReqVO reqVO) {
        if (StringUtils.isBlank(reqVO.getItemNo()) || null == reqVO.getStartTime() || null == reqVO.getEndTime()) {
        if (StringUtils.isBlank(reqVO.getItemNo())) {
            return new HashMap<>();
        }
        ItemVO predictItem = mmPredictItemService.getItemByItemNo(reqVO.getItemNo());
        if (null == predictItem) {
            return new HashMap<>();
        }
        // 默认开始时间:运行时间
        if (null == reqVO.getStartTime()) {
            reqVO.setStartTime(predictItem.getLastTime());
        }
        // 默认结束时间:运行时间+预测长度*粒度
        if (null == reqVO.getStartTime()) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(predictItem.getLastTime());
            calendar.add(Calendar.SECOND,predictItem.getPredictLength() * predictItem.getGranularity());
            reqVO.setEndTime(calendar.getTime());
        }
        List<String> itemNos = new ArrayList<String>(){{
           add(reqVO.getItemNo());
        }};
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java
@@ -12,6 +12,7 @@
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@@ -20,9 +21,7 @@
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.*;
import static com.iailab.framework.common.pojo.CommonResult.success;
@@ -180,12 +179,6 @@
        return CommonResult.success(data);
    }
    @GetMapping("/predict-data/electric")
    @Operation(summary = "电力功率因数预测结果查询")
    public CommonResult<Map<String,List<Object[]>>> getElectricPredictData(@RequestParam String itemCode) {
        Map<String,List<Object[]>> data = mcsApi.getElectricPredictData(itemCode);
        return CommonResult.success(data);
    }
    @GetMapping("/schedule-data/last")
    @Operation(summary = "调度模型最新结果查询")
    public CommonResult<List<StScheduleRecordVO>> getLastScheduleData(@RequestParam String scheduleCode, @RequestParam Integer limit) {
@@ -195,10 +188,26 @@
        return CommonResult.success(mcsApi.getLastScheduleData(scheduleCode,limit));
    }
    @PostMapping("/machineRealTimeStatus")
    @Operation(summary = "发电机组实时状态查询")
    CommonResult<List<Map<String, Object>>> getRealTimeStatus(@RequestBody List<Map<String, Object>> machines) {
        return CommonResult.success(mcsApi.getRealTimeStatus(machines));
    @PostMapping("/schedule-data/last/more")
    @Operation(summary = "多个调度模型最新结果查询")
    public CommonResult<Map<String,List<StScheduleRecordVO>>> getMoreLastScheduleData(@RequestBody Map<String,Object> params) {
        if (!params.containsKey("scheduleCodes")) {
            return success(new HashMap<>());
        }
        Set<String> scheduleCodes = new HashSet<>(((List<String>) params.get("scheduleCodes")));
        if (CollectionUtils.isEmpty(scheduleCodes)) {
            return success(new HashMap<>());
        }
        Integer limit = 1;
        if (params.containsKey("limit")) {
            limit = Integer.parseInt(params.get("limit").toString());
        }
        Map<String,List<StScheduleRecordVO>> result = new HashMap<>(scheduleCodes.size());
        for (String scheduleCode : scheduleCodes) {
            result.put(scheduleCode,mcsApi.getLastScheduleData(scheduleCode, limit));
        }
        return CommonResult.success(result);
    }
    @PostMapping("/predict-data/itemNo")
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictResultHandler.java
@@ -86,7 +86,6 @@
     *
     * @param predictResult
     */
    @Async
    @DSTransactional
    public void savePredictResult(PredictResultVO predictResult) {
        Map<String, List<DataValueVO>> resultMap = convertToPredictData(predictResult);
iailab-module-system/iailab-module-system-biz/pom.xml
@@ -90,12 +90,6 @@
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- Job 定时任务相关 -->
        <dependency>
            <groupId>com.iailab</groupId>
            <artifactId>iailab-common-job</artifactId>
        </dependency>
        <!-- 消息队列相关 -->
        <dependency>
            <groupId>com.iailab</groupId>
iailab-module-system/iailab-module-system-biz/src/main/resources/application-dev.yaml
@@ -72,12 +72,6 @@
  kafka:
    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
--- #################### 定时任务相关配置 ####################
xxl:
  job:
    admin:
      addresses: http://172.16.8.100:9090/xxl-job-admin # 调度中心部署跟地址
--- #################### 服务保障相关配置 ####################
# Lock4j 配置项
@@ -94,39 +88,6 @@
      base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator
      exposure:
        include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
# Spring Boot Admin 配置项
spring:
  boot:
    admin:
      # Spring Boot Admin Client 客户端的相关配置
      client:
        instance:
          service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
      # Spring Boot Admin Server 服务端的相关配置
      context-path: /admin # 配置 Spring
--- #################### 微信公众号、小程序相关配置 ####################
wx:
  mp: # 公众号配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档
    #    app-id: wx041349c6f39b268b
    #    secret: 5abee519483bc9f8cb37ce280e814bd0
    app-id: wx5b23ba7a5589ecbb # 测试号
    secret: 2a7b3b20c537e52e74afd395eb85f61f
    # 存储配置,解决 AccessToken 的跨节点的共享
    config-storage:
      type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
      key-prefix: wx # Redis Key 的前缀
      http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
  miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档
    #    appid: wx62056c0d5e8db250
    #    secret: 333ae72f41552af1e998fe1f54e1584a
    appid: wx63c280fe3248a3e7 # wenhualian的接口测试号
    secret: 6f270509224a7ae1296bbf1c8cb97aed
    config-storage:
      type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
      key-prefix: wa # Redis Key 的前缀
      http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
--- #################### 平台相关配置 ####################
@@ -146,30 +107,3 @@
  demo: false # 开启演示模式
  captcha:
    enable: false # 本地环境,暂时关闭图片验证码,方便登录等接口的测试
justauth:
  enabled: true
  type:
    DINGTALK: # 钉钉
      client-id: dingvrnreaje3yqvzhxg
      client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI
      ignore-check-redirect-uri: true
    WECHAT_ENTERPRISE: # 企业微信
      client-id: wwd411c69a39ad2e54
      client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw
      agent-id: 1000004
      ignore-check-redirect-uri: true
    # noinspection SpringBootApplicationYaml
    WECHAT_MINI_APP: # 微信小程序
      client-id: ${wx.miniapp.appid}
      client-secret: ${wx.miniapp.secret}
      ignore-check-redirect-uri: true
      ignore-check-state: true # 微信小程序,不会使用到 state,所以不进行校验
    WECHAT_MP: # 微信公众号
      client-id: ${wx.mp.app-id}
      client-secret: ${wx.mp.secret}
      ignore-check-redirect-uri: true
  cache:
    type: REDIS
    prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE::
    timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟
iailab-module-system/iailab-module-system-biz/src/main/resources/application.yaml
@@ -136,15 +136,6 @@
    listener:
      missing-topics-fatal: false # 消费监听接口监听的主题不存在时,默认会报错。所以通过设置为 false ,解决报错
--- #################### 定时任务相关配置 ####################
xxl:
  job:
    executor:
      appname: ${spring.application.name} # 执行器 AppName
      logpath: @log.path@/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径
    accessToken: default_token # 执行器通讯TOKEN
--- #################### 验证码相关配置 ####################
aj: