Merge remote-tracking branch 'origin/main'
This commit is contained in:
@@ -347,6 +347,30 @@ public class RedisUtil {
|
||||
return info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据key模糊查询,并取出所有符合条件的key集合
|
||||
* @return
|
||||
*/
|
||||
|
||||
public Set<String> scanKeysByPattern(String pattern, int count) {
|
||||
Set<String> keys = new HashSet<>();
|
||||
ScanOptions options = ScanOptions.scanOptions()
|
||||
.match(pattern)
|
||||
.count(count)
|
||||
.build();
|
||||
|
||||
try (Cursor<byte[]> cursor = redisTemplate.getConnectionFactory()
|
||||
.getConnection()
|
||||
.scan(options)) {
|
||||
while (cursor.hasNext()) {
|
||||
keys.add(new String(cursor.next()));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("扫描Redis keys失败", e);
|
||||
}
|
||||
return keys;
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据切库
|
||||
* @param dbIndex
|
||||
|
||||
@@ -41,6 +41,11 @@ public class LineALLInfoDTO {
|
||||
private Integer num;
|
||||
@ApiModelProperty(name = "objName",value = "监测点对象名称")
|
||||
private String objName;
|
||||
@ApiModelProperty(name = "objName",value = "电网侧监测点对象名称Id")
|
||||
private String objId;
|
||||
@ApiModelProperty(name = "objName",value = "电网侧监测点对象名称")
|
||||
private String objName2;
|
||||
|
||||
@ApiModelProperty(name = "loadType",value = "监测对象类型")
|
||||
private String loadType;
|
||||
@ApiModelProperty(name = "voltageLevel",value = "电压等级")
|
||||
|
||||
@@ -6,14 +6,14 @@ package com.njcn.device.pq.controller;
|
||||
* @Description: 异常告警数据指标范围
|
||||
*/
|
||||
|
||||
import com.njcn.algorithm.pojo.dto.PqReasonableRangeDto;
|
||||
import com.njcn.algorithm.pojo.param.DataCleanParam;
|
||||
import com.njcn.common.pojo.annotation.OperateInfo;
|
||||
import com.njcn.common.pojo.constant.OperateType;
|
||||
import com.njcn.common.pojo.enums.common.LogEnum;
|
||||
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
|
||||
import com.njcn.common.pojo.response.HttpResult;
|
||||
import com.njcn.common.utils.HttpResultUtil;
|
||||
import com.njcn.dataProcess.param.DataCleanParam;
|
||||
import com.njcn.dataProcess.pojo.dto.PqReasonableRangeDto;
|
||||
import com.njcn.device.pq.service.ReasonableRangeService;
|
||||
import com.njcn.web.controller.BaseController;
|
||||
import io.swagger.annotations.Api;
|
||||
|
||||
@@ -14,6 +14,7 @@ import com.njcn.message.constant.RedisKeyPrefix;
|
||||
import com.njcn.redis.utils.RedisUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Component;
|
||||
@@ -35,6 +36,7 @@ import java.util.stream.Collectors;
|
||||
@Component
|
||||
@EnableScheduling
|
||||
@RequiredArgsConstructor
|
||||
@ConditionalOnProperty(name = "business.task-enabled", havingValue = "true", matchIfMissing = true)
|
||||
public class DeviceComflagTasks {
|
||||
private final NodeMapper nodeMapper;
|
||||
private final IDeviceService iDeviceService;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.njcn.device.pq.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.njcn.dataProcess.pojo.po.PqReasonableRange;
|
||||
import com.njcn.algorithm.pojo.po.PqReasonableRange;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
package com.njcn.device.pq.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.njcn.dataProcess.param.DataCleanParam;
|
||||
import com.njcn.dataProcess.pojo.dto.PqReasonableRangeDto;
|
||||
import com.njcn.dataProcess.pojo.po.PqReasonableRange;
|
||||
import com.njcn.algorithm.pojo.dto.PqReasonableRangeDto;
|
||||
import com.njcn.algorithm.pojo.param.DataCleanParam;
|
||||
import com.njcn.algorithm.pojo.po.PqReasonableRange;
|
||||
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
@@ -9,20 +9,17 @@ import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.json.JSONArray;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.njcn.algorithm.pojo.api.PqReasonableRangeFeignClient;
|
||||
import com.njcn.algorithm.pojo.dto.PqReasonableRangeDto;
|
||||
import com.njcn.algorithm.pojo.param.DataCleanParam;
|
||||
import com.njcn.common.pojo.exception.BusinessException;
|
||||
import com.njcn.dataProcess.api.DataLimitRateDetailFeignClient;
|
||||
import com.njcn.dataProcess.api.DataLimitRateFeignClient;
|
||||
import com.njcn.dataProcess.api.DataLimitTargetFeignClient;
|
||||
import com.njcn.dataProcess.api.PqReasonableRangeFeignClient;
|
||||
import com.njcn.dataProcess.enums.DataCleanEnum;
|
||||
import com.njcn.dataProcess.param.DataCleanParam;
|
||||
import com.njcn.dataProcess.param.LineCountEvaluateParam;
|
||||
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailDto;
|
||||
import com.njcn.dataProcess.pojo.dto.DataLimitRateDto;
|
||||
import com.njcn.dataProcess.pojo.dto.DataLimitTargetDto;
|
||||
import com.njcn.dataProcess.pojo.dto.PqReasonableRangeDto;
|
||||
import com.njcn.device.biz.enums.DeviceResponseEnum;
|
||||
import com.njcn.device.biz.pojo.dto.LineDevGetDTO;
|
||||
import com.njcn.device.biz.pojo.po.Overlimit;
|
||||
import com.njcn.device.line.mapper.LineMapper;
|
||||
import com.njcn.device.line.service.DeptLineService;
|
||||
|
||||
@@ -19,12 +19,12 @@ import com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.njcn.algorithm.pojo.api.PqReasonableRangeFeignClient;
|
||||
import com.njcn.algorithm.pojo.dto.PqReasonableRangeDto;
|
||||
import com.njcn.algorithm.pojo.param.DataCleanParam;
|
||||
import com.njcn.common.pojo.dto.SimpleDTO;
|
||||
import com.njcn.common.pojo.exception.BusinessException;
|
||||
import com.njcn.dataProcess.api.PqReasonableRangeFeignClient;
|
||||
import com.njcn.dataProcess.enums.DataCleanEnum;
|
||||
import com.njcn.dataProcess.param.DataCleanParam;
|
||||
import com.njcn.dataProcess.pojo.dto.PqReasonableRangeDto;
|
||||
import com.njcn.device.common.mapper.onlinerate.OnLineRateMapper;
|
||||
import com.njcn.device.common.service.GeneralDeviceService;
|
||||
import com.njcn.device.line.mapper.LineMapper;
|
||||
|
||||
@@ -2,12 +2,15 @@ package com.njcn.device.pq.service.impl;
|
||||
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.hutool.core.date.DatePattern;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
|
||||
import com.njcn.device.biz.commApi.CommLineClient;
|
||||
import com.njcn.device.biz.pojo.dto.LineALLInfoDTO;
|
||||
import com.njcn.device.common.service.GeneralDeviceService;
|
||||
import com.njcn.device.line.mapper.LineDetailMapper;
|
||||
import com.njcn.device.line.mapper.LineMapper;
|
||||
@@ -66,6 +69,7 @@ public class RStatIntegrityDServiceImpl extends MppServiceImpl<RStatIntegrityDMa
|
||||
private final GeneralDeviceService deviceService;
|
||||
private final LineService lineService;
|
||||
private final UserLedgerService userLedgerService;
|
||||
private final CommLineClient commLineClient;
|
||||
|
||||
@Override
|
||||
public Float getTotalIntegrityByLineIds(LineBaseQueryParam param) {
|
||||
@@ -146,6 +150,9 @@ public class RStatIntegrityDServiceImpl extends MppServiceImpl<RStatIntegrityDMa
|
||||
@Override
|
||||
public DeviceOnlineRate getData(DeviceInfoParam.BusinessParam param) {
|
||||
DeviceOnlineRate rate = new DeviceOnlineRate();
|
||||
//BusinessParam的searchvalue只匹配监测点名称现在要匹配电站,监测点,监测点对象名称,所以穿空再添加过滤逻辑
|
||||
String tempSearchValue=param.getSearchValue();
|
||||
param.setSearchValue("");
|
||||
//获取终端台账类信息
|
||||
List<GeneralDeviceDTO> deviceInfo = deviceService.getDeviceInfo(param, null, Collections.singletonList(1));
|
||||
if (CollUtil.isNotEmpty(deviceInfo)) {
|
||||
@@ -154,14 +161,55 @@ public class RStatIntegrityDServiceImpl extends MppServiceImpl<RStatIntegrityDMa
|
||||
.stream()
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
rate.setTotalNum(lineIds.size());
|
||||
//获取所有监测点的数据完整性
|
||||
List<RStatIntegrityVO> lineIntegrityRateInfo = rStatIntegrityDMapper.getLineIntegrityRateInfo(lineIds, param.getSearchBeginTime(), param.getSearchEndTime());
|
||||
//获取所有监测点信息信息
|
||||
List<LineDetailVO.Detail> LineInfoByIds = lineService.getLineDetailByIds(lineIds);
|
||||
List<String> filterLineList = new ArrayList<>();
|
||||
|
||||
rate.setBelowNum(CollUtil.isNotEmpty(lineIntegrityRateInfo) ? calculateIntegrityRate(lineIntegrityRateInfo, 90, lineIds.size()) : lineIds.size());
|
||||
rate.setTotalOnlineRate(calculateIntegrityRate(lineIntegrityRateInfo, lineIds).doubleValue()>100.0?BigDecimal.valueOf(100.0) : calculateIntegrityRate(lineIntegrityRateInfo, lineIds));
|
||||
if(CollectionUtil.isNotEmpty(lineIds)){
|
||||
//根据searchvalue过滤
|
||||
List<LineALLInfoDTO> data = commLineClient.getLineAllDetailList(lineIds).getData();
|
||||
filterLineList= data.stream()
|
||||
.filter(dto -> {
|
||||
LineALLInfoDTO.LineLineDTO lineDTO = dto.getLineLineDTO();
|
||||
String linename = lineDTO != null ? lineDTO.getLinename() : null;
|
||||
String objName2 = lineDTO != null ? lineDTO.getObjName2() : null;
|
||||
|
||||
LineALLInfoDTO.LineSubStationDTO subStationDTO = dto.getLineSubStationDTO();
|
||||
String subStationName = subStationDTO != null ? subStationDTO.getSubStationName() : null;
|
||||
|
||||
// 大小写敏感的模糊匹配(相当于 MySQL 的 LIKE '%keyword%')
|
||||
return (linename != null && linename.contains(tempSearchValue))
|
||||
|| (objName2 != null && objName2.contains(tempSearchValue))
|
||||
|| (subStationName != null && subStationName.contains(tempSearchValue));
|
||||
}).map(dto -> dto.getLineLineDTO() != null ? dto.getLineLineDTO().getLineId() : null)
|
||||
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
rate.setTotalNum(filterLineList.size());
|
||||
List<String> finalFilterLineList = filterLineList;
|
||||
//根据过滤后监测点过滤
|
||||
deviceInfo= deviceInfo.stream()
|
||||
.filter(dto -> {
|
||||
List<String> original = dto.getLineIndexes();
|
||||
if (original == null || original.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
// 计算交集
|
||||
List<String> intersection = original.stream()
|
||||
.filter(finalFilterLineList::contains)
|
||||
.collect(Collectors.toList());
|
||||
if (intersection.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
// 更新当前 DTO 的 lineIndexes 为交集
|
||||
dto.setLineIndexes(intersection);
|
||||
return true;
|
||||
})
|
||||
.collect(Collectors.toList()); //获取所有监测点的数据完整性
|
||||
List<RStatIntegrityVO> lineIntegrityRateInfo = rStatIntegrityDMapper.getLineIntegrityRateInfo(filterLineList, param.getSearchBeginTime(), param.getSearchEndTime());
|
||||
//获取所有监测点信息信息
|
||||
List<LineDetailVO.Detail> LineInfoByIds = lineService.getLineDetailByIds(filterLineList);
|
||||
|
||||
rate.setBelowNum(CollUtil.isNotEmpty(lineIntegrityRateInfo) ? calculateIntegrityRate(lineIntegrityRateInfo, 90, filterLineList.size()) : lineIds.size());
|
||||
rate.setTotalOnlineRate(calculateIntegrityRate(lineIntegrityRateInfo, filterLineList).doubleValue()>100.0?BigDecimal.valueOf(100.0) : calculateIntegrityRate(lineIntegrityRateInfo, lineIds));
|
||||
List<DeviceOnlineRate.CitDetail> citDetailList = new ArrayList<>();
|
||||
DeviceOnlineRate.CitDetail citDetail;
|
||||
DeviceOnlineRate.LineDetail detail;
|
||||
@@ -174,12 +222,13 @@ public class RStatIntegrityDServiceImpl extends MppServiceImpl<RStatIntegrityDMa
|
||||
Map<String, BigDecimal> onlineRateByDevMap = citDevOnRate.stream()
|
||||
.collect(Collectors.toMap(RStatIntegrityVO::getLineIndex, RStatIntegrityVO::getIntegrityRate));
|
||||
citDetail = new DeviceOnlineRate.CitDetail();
|
||||
List<LineDetailVO.Detail> lineDetail = LineInfoByIds.stream().filter(x -> dto.getLineIndexes().contains(x.getLineId())).collect(Collectors.toList());
|
||||
|
||||
citDetail.setCitName(dto.getName());
|
||||
citDetail.setCitTotalNum(dto.getLineIndexes().size());
|
||||
citDetail.setCitBelowNum(CollUtil.isNotEmpty(citDevOnRate) ? calculateIntegrityRate(citDevOnRate, 90, dto.getLineIndexes().size()) : dto.getLineIndexes().size());
|
||||
citDetail.setCitTotalOnlineRate(calculateIntegrityRate(lineIntegrityRateInfo, dto.getLineIndexes()).doubleValue()>100.0?BigDecimal.valueOf(100.0):calculateIntegrityRate(lineIntegrityRateInfo, dto.getLineIndexes()));
|
||||
List<DeviceOnlineRate.LineDetail> detailList = new ArrayList<>();
|
||||
List<LineDetailVO.Detail> lineDetail = LineInfoByIds.stream().filter(x -> dto.getLineIndexes().contains(x.getLineId())).collect(Collectors.toList());
|
||||
for (LineDetailVO.Detail line : lineDetail) {
|
||||
detail = new DeviceOnlineRate.LineDetail();
|
||||
detail.setCit(line.getDeptName());
|
||||
|
||||
@@ -3,10 +3,11 @@ package com.njcn.device.pq.service.impl;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.njcn.dataProcess.param.DataCleanParam;
|
||||
import com.njcn.dataProcess.pojo.dto.PqReasonableRangeDto;
|
||||
import com.njcn.dataProcess.pojo.po.PqReasonableRange;
|
||||
import com.njcn.algorithm.pojo.dto.PqReasonableRangeDto;
|
||||
import com.njcn.algorithm.pojo.param.DataCleanParam;
|
||||
import com.njcn.algorithm.pojo.po.PqReasonableRange;
|
||||
import com.njcn.device.pq.mapper.ReasonableRangeMapper;
|
||||
import com.njcn.device.pq.service.ReasonableRangeService;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
|
||||
@@ -2884,6 +2884,8 @@ public class TerminalBaseServiceImpl extends ServiceImpl<LineMapper, Line> imple
|
||||
device.setUpdateTime(LocalDateTime.now());
|
||||
device.setElectroplate(0);
|
||||
device.setOnTime(1);
|
||||
//处理装置识别码秘钥
|
||||
coderM3d(device, false);
|
||||
deviceMapper.insert(device);
|
||||
//分配前置进程
|
||||
nodeDeviceService.oneKeyDistribution(node.getId());
|
||||
|
||||
@@ -45,6 +45,7 @@ import com.njcn.influx.imapper.PqsCommunicateMapper;
|
||||
import com.njcn.influx.pojo.po.PqsCommunicate;
|
||||
import com.njcn.influx.query.InfluxQueryWrapper;
|
||||
import com.njcn.supervision.pojo.vo.user.NewUserReportVO;
|
||||
import com.njcn.supervision.pojo.vo.user.UserReportVO;
|
||||
import com.njcn.system.api.AreaFeignClient;
|
||||
import com.njcn.system.api.DicDataFeignClient;
|
||||
import com.njcn.system.enums.DicDataTypeEnum;
|
||||
@@ -616,6 +617,11 @@ public class LineServiceImpl extends ServiceImpl<LineMapper, Line> implements Li
|
||||
lineLineDTO.setLinename(lineName);
|
||||
lineLineDTO.setNum(lineDetail.getNum());
|
||||
lineLineDTO.setObjName(lineDetail.getObjName());
|
||||
lineLineDTO.setObjId(lineDetail.getObjId());
|
||||
if(StringUtils.isNotEmpty(lineDetail.getObjId())){
|
||||
UserReportVO userReportVO = userLedgerService.getUserReportById(lineDetail.getObjId());
|
||||
lineLineDTO.setObjName2(userReportVO.getProjectName());
|
||||
}
|
||||
lineLineDTO.setLoadType(dicDataFeignClient.getDicDataById(lineDetail.getLoadType()).getData().getName());
|
||||
//电压使用母线电压
|
||||
lineLineDTO.setVoltageLevel(dicDataFeignClient.getDicDataById(voltage.getScale()).getData().getName());
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package com.njcn.event.common.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.njcn.event.pojo.param.*;
|
||||
import com.njcn.event.pojo.param.EventBaseParam;
|
||||
import com.njcn.event.pojo.param.StatisticsParam;
|
||||
import com.njcn.event.pojo.vo.*;
|
||||
|
||||
import java.text.ParseException;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -79,8 +79,6 @@ public interface EventAnalysisService {
|
||||
*/
|
||||
Page<WaveTypeVO> getMonitorEventAnalyseQuery(EventBaseParam eventBaseParam);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*监测点事件波形下载
|
||||
* @author zbj
|
||||
@@ -88,6 +86,20 @@ public interface EventAnalysisService {
|
||||
*/
|
||||
//HttpServletResponse downloadMonitorEventWaveFile(WaveFileParam waveFileParam, HttpServletResponse response) throws Exception;
|
||||
|
||||
|
||||
/**
|
||||
* 判定压降落点区域
|
||||
* <p>
|
||||
* 入参:
|
||||
* eventValue 特征幅值(百分比形式,如 "80.5" 表示 80.5%),内部 /100 得到 VVm(0~1)
|
||||
* persistTime 持续时间(秒)
|
||||
* <p>
|
||||
* 优先规则:
|
||||
* 1) 持续时间 < 0.001 秒 或 VVm = 0 → A区
|
||||
* 2) 按区间表逐行匹配(左闭右开 [下限, 上限))
|
||||
* 3) 都不匹配返回 null,由调用方走兜底
|
||||
*
|
||||
* @return 区域名(A区/B区/C区/D区);解析失败或未匹配返回 null
|
||||
*/
|
||||
String determineDropZone(String eventValue, String persistTime);
|
||||
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.njcn.common.config.GeneralInfo;
|
||||
@@ -13,6 +12,7 @@ import com.njcn.common.pojo.response.HttpResult;
|
||||
import com.njcn.device.pq.api.LineFeignClient;
|
||||
import com.njcn.device.pq.pojo.vo.AreaLineInfoVO;
|
||||
import com.njcn.device.pq.pojo.vo.LineDetailDataVO;
|
||||
import com.njcn.event.common.service.EventAnalysisService;
|
||||
import com.njcn.event.common.service.EventDetailService;
|
||||
import com.njcn.event.enums.EventResponseEnum;
|
||||
import com.njcn.event.file.pojo.enums.WaveFileResponseEnum;
|
||||
@@ -21,19 +21,20 @@ import com.njcn.event.pojo.param.StatisticsParam;
|
||||
import com.njcn.event.pojo.po.EventDetail;
|
||||
import com.njcn.event.pojo.po.RmpEventDetailPO;
|
||||
import com.njcn.event.pojo.vo.*;
|
||||
import com.njcn.event.common.service.EventAnalysisService;
|
||||
import com.njcn.influx.utils.InfluxDbUtils;
|
||||
import com.njcn.system.api.DicDataFeignClient;
|
||||
import com.njcn.system.enums.DicDataEnum;
|
||||
import com.njcn.system.enums.DicDataTypeEnum;
|
||||
import com.njcn.system.pojo.po.DictData;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.influxdb.dto.QueryResult;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.*;
|
||||
import java.text.ParseException;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
@@ -51,6 +52,7 @@ import java.util.zip.ZipOutputStream;
|
||||
*/
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class EventAnalysisServiceImpl implements EventAnalysisService {
|
||||
|
||||
// 定义阈值常量(单位:百分比)
|
||||
@@ -1727,6 +1729,75 @@ public class EventAnalysisServiceImpl implements EventAnalysisService {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String determineDropZone(String eventValue, String persistTime) {
|
||||
if (eventValue == null || eventValue.trim().isEmpty()
|
||||
|| persistTime == null || persistTime.trim().isEmpty()) {
|
||||
log.warn("判定压降落点区域入参为空,eventValue={}, persistTime={}", eventValue, persistTime);
|
||||
return null;
|
||||
}
|
||||
BigDecimal vvm;
|
||||
BigDecimal vvtm;
|
||||
try {
|
||||
// params[3] 是百分比(如 "80.5"),/100 得到 0~1 的 VVm
|
||||
vvm = new BigDecimal(eventValue.trim()).divide(new BigDecimal("100"), 6, RoundingMode.HALF_UP);
|
||||
vvtm = new BigDecimal(persistTime.trim());
|
||||
} catch (Exception e) {
|
||||
log.error("判定压降落点区域入参解析失败,eventValue={}, persistTime={}", eventValue, persistTime, e);
|
||||
return null;
|
||||
}
|
||||
|
||||
// 1) 超短脉冲 或 完全失压 默认 A 区
|
||||
if (vvtm.compareTo(new BigDecimal("0.001")) < 0
|
||||
|| vvm.compareTo(BigDecimal.ZERO) == 0) {
|
||||
return "A区";
|
||||
}
|
||||
|
||||
// 2) 区间表(左闭右开)
|
||||
// A区
|
||||
if (inRange(vvm, "0.9", "1") && inRange(vvtm, "0.001", "60")) {
|
||||
return "A区";
|
||||
}
|
||||
if (inRange(vvm, "0", "0.9") && inRange(vvtm, "0.001", "0.05")) {
|
||||
return "A区";
|
||||
}
|
||||
// B区
|
||||
if (inRange(vvm, "0.5", "0.7") && inRange(vvtm, "0.05", "0.2")) {
|
||||
return "B区";
|
||||
}
|
||||
if (inRange(vvm, "0.7", "0.8") && inRange(vvtm, "0.05", "0.5")) {
|
||||
return "B区";
|
||||
}
|
||||
if (inRange(vvm, "0.8", "0.9") && inRange(vvtm, "0.05", "60")) {
|
||||
return "B区";
|
||||
}
|
||||
// C区
|
||||
if (inRange(vvm, "0", "0.5") && inRange(vvtm, "0.05", "1")) {
|
||||
return "C区";
|
||||
}
|
||||
if (inRange(vvm, "0.5", "0.7") && inRange(vvtm, "0.2", "1")) {
|
||||
return "C区";
|
||||
}
|
||||
if (inRange(vvm, "0.7", "0.8") && inRange(vvtm, "0.5", "1")) {
|
||||
return "C区";
|
||||
}
|
||||
// D区
|
||||
if (inRange(vvm, "0", "0.8") && inRange(vvtm, "1", "60")) {
|
||||
return "D区";
|
||||
}
|
||||
|
||||
log.warn("压降落点区域未匹配任何规则,eventValue={}, persistTime={}", eventValue, persistTime);
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 左闭右开区间判断:lowerInclusive ≤ value < upperExclusive
|
||||
*/
|
||||
private boolean inRange(BigDecimal value, String lowerInclusive, String upperExclusive) {
|
||||
return value.compareTo(new BigDecimal(lowerInclusive)) >= 0
|
||||
&& value.compareTo(new BigDecimal(upperExclusive)) < 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 监测点事件波形下载
|
||||
|
||||
@@ -11,6 +11,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.njcn.common.config.GeneralInfo;
|
||||
import com.njcn.device.biz.commApi.CommLineClient;
|
||||
import com.njcn.device.biz.pojo.dto.LineALLInfoDTO;
|
||||
import com.njcn.device.pq.api.GeneralDeviceInfoClient;
|
||||
import com.njcn.device.pq.api.LineFeignClient;
|
||||
import com.njcn.device.pq.api.UserLedgerFeignClient;
|
||||
@@ -48,6 +50,7 @@ import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.math.BigDecimal;
|
||||
@@ -83,7 +86,7 @@ public class AnalyzeServiceImpl implements IAnalyzeService {
|
||||
private final EventDetailFeignClient eventDetailFeignClient;
|
||||
private final DicDataFeignClient dicDataFeignClient;
|
||||
private final UserLedgerFeignClient userLedgerFeignClient;
|
||||
|
||||
private final CommLineClient commLineClient;
|
||||
@Override
|
||||
public Page<OverAreaLimitVO> getAreaData(OverAreaVO param) {
|
||||
Page<OverAreaLimitVO> page = new Page<>();
|
||||
@@ -301,8 +304,31 @@ public class AnalyzeServiceImpl implements IAnalyzeService {
|
||||
lineList.addAll(item.getLineIndexes());
|
||||
});
|
||||
}
|
||||
if (CollectionUtil.isNotEmpty(lineList)) {
|
||||
page = targetMapper.getSumLimitTargetPage(page, lineList, DateUtil.beginOfDay(DateUtil.parse(param.getSearchBeginTime())),
|
||||
List<String> filterLineList = new ArrayList<>();
|
||||
|
||||
if(CollectionUtil.isNotEmpty(lineList)){
|
||||
//根据searchvalue过滤
|
||||
String searchvalue=param.getSearchValue();
|
||||
List<LineALLInfoDTO> data = commLineClient.getLineAllDetailList(lineList).getData();
|
||||
filterLineList= data.stream()
|
||||
.filter(dto -> {
|
||||
LineALLInfoDTO.LineLineDTO lineDTO = dto.getLineLineDTO();
|
||||
String linename = lineDTO != null ? lineDTO.getLinename() : null;
|
||||
String objName2 = lineDTO != null ? lineDTO.getObjName2() : null;
|
||||
|
||||
LineALLInfoDTO.LineSubStationDTO subStationDTO = dto.getLineSubStationDTO();
|
||||
String subStationName = subStationDTO != null ? subStationDTO.getSubStationName() : null;
|
||||
|
||||
// 大小写敏感的模糊匹配(相当于 MySQL 的 LIKE '%keyword%')
|
||||
return (linename != null && linename.contains(searchvalue))
|
||||
|| (objName2 != null && objName2.contains(searchvalue))
|
||||
|| (subStationName != null && subStationName.contains(searchvalue));
|
||||
}).map(dto -> dto.getLineLineDTO() != null ? dto.getLineLineDTO().getLineId() : null)
|
||||
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
if (CollectionUtil.isNotEmpty(filterLineList)) {
|
||||
page = targetMapper.getSumLimitTargetPage(page, filterLineList, DateUtil.beginOfDay(DateUtil.parse(param.getSearchBeginTime())),
|
||||
DateUtil.endOfDay(DateUtil.parse(param.getSearchEndTime())));
|
||||
List<MonitorOverLimitVO> pageRecords = page.getRecords();
|
||||
if (CollectionUtils.isEmpty(pageRecords)) {
|
||||
|
||||
Reference in New Issue
Block a user