Merge remote-tracking branch 'origin/main'

This commit is contained in:
cdf
2026-06-01 10:02:47 +08:00
15 changed files with 233 additions and 37 deletions

View File

@@ -347,6 +347,30 @@ public class RedisUtil {
return info; 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 * @param dbIndex

View File

@@ -41,6 +41,11 @@ public class LineALLInfoDTO {
private Integer num; private Integer num;
@ApiModelProperty(name = "objName",value = "监测点对象名称") @ApiModelProperty(name = "objName",value = "监测点对象名称")
private String objName; private String objName;
@ApiModelProperty(name = "objName",value = "电网侧监测点对象名称Id")
private String objId;
@ApiModelProperty(name = "objName",value = "电网侧监测点对象名称")
private String objName2;
@ApiModelProperty(name = "loadType",value = "监测对象类型") @ApiModelProperty(name = "loadType",value = "监测对象类型")
private String loadType; private String loadType;
@ApiModelProperty(name = "voltageLevel",value = "电压等级") @ApiModelProperty(name = "voltageLevel",value = "电压等级")

View File

@@ -6,14 +6,14 @@ package com.njcn.device.pq.controller;
* @Description: 异常告警数据指标范围 * @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.annotation.OperateInfo;
import com.njcn.common.pojo.constant.OperateType; import com.njcn.common.pojo.constant.OperateType;
import com.njcn.common.pojo.enums.common.LogEnum; import com.njcn.common.pojo.enums.common.LogEnum;
import com.njcn.common.pojo.enums.response.CommonResponseEnum; import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.response.HttpResult; import com.njcn.common.pojo.response.HttpResult;
import com.njcn.common.utils.HttpResultUtil; 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.device.pq.service.ReasonableRangeService;
import com.njcn.web.controller.BaseController; import com.njcn.web.controller.BaseController;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;

View File

@@ -14,6 +14,7 @@ import com.njcn.message.constant.RedisKeyPrefix;
import com.njcn.redis.utils.RedisUtil; import com.njcn.redis.utils.RedisUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -35,6 +36,7 @@ import java.util.stream.Collectors;
@Component @Component
@EnableScheduling @EnableScheduling
@RequiredArgsConstructor @RequiredArgsConstructor
@ConditionalOnProperty(name = "business.task-enabled", havingValue = "true", matchIfMissing = true)
public class DeviceComflagTasks { public class DeviceComflagTasks {
private final NodeMapper nodeMapper; private final NodeMapper nodeMapper;
private final IDeviceService iDeviceService; private final IDeviceService iDeviceService;

View File

@@ -1,7 +1,7 @@
package com.njcn.device.pq.mapper; package com.njcn.device.pq.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.njcn.dataProcess.pojo.po.PqReasonableRange; import com.njcn.algorithm.pojo.po.PqReasonableRange;
/** /**
* <p> * <p>

View File

@@ -1,9 +1,10 @@
package com.njcn.device.pq.service; package com.njcn.device.pq.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.njcn.dataProcess.param.DataCleanParam; import com.njcn.algorithm.pojo.dto.PqReasonableRangeDto;
import com.njcn.dataProcess.pojo.dto.PqReasonableRangeDto; import com.njcn.algorithm.pojo.param.DataCleanParam;
import com.njcn.dataProcess.pojo.po.PqReasonableRange; import com.njcn.algorithm.pojo.po.PqReasonableRange;
import java.util.List; import java.util.List;

View File

@@ -9,20 +9,17 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray; import cn.hutool.json.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.common.pojo.exception.BusinessException;
import com.njcn.dataProcess.api.DataLimitRateDetailFeignClient; import com.njcn.dataProcess.api.DataLimitRateDetailFeignClient;
import com.njcn.dataProcess.api.DataLimitRateFeignClient; import com.njcn.dataProcess.api.DataLimitRateFeignClient;
import com.njcn.dataProcess.api.DataLimitTargetFeignClient; import com.njcn.dataProcess.api.DataLimitTargetFeignClient;
import com.njcn.dataProcess.api.PqReasonableRangeFeignClient;
import com.njcn.dataProcess.enums.DataCleanEnum; import com.njcn.dataProcess.enums.DataCleanEnum;
import com.njcn.dataProcess.param.DataCleanParam;
import com.njcn.dataProcess.param.LineCountEvaluateParam; import com.njcn.dataProcess.param.LineCountEvaluateParam;
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailDto; 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.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.biz.pojo.po.Overlimit;
import com.njcn.device.line.mapper.LineMapper; import com.njcn.device.line.mapper.LineMapper;
import com.njcn.device.line.service.DeptLineService; import com.njcn.device.line.service.DeptLineService;

View File

@@ -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.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.dto.SimpleDTO;
import com.njcn.common.pojo.exception.BusinessException; import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.dataProcess.api.PqReasonableRangeFeignClient;
import com.njcn.dataProcess.enums.DataCleanEnum; 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.mapper.onlinerate.OnLineRateMapper;
import com.njcn.device.common.service.GeneralDeviceService; import com.njcn.device.common.service.GeneralDeviceService;
import com.njcn.device.line.mapper.LineMapper; import com.njcn.device.line.mapper.LineMapper;

View File

@@ -2,12 +2,15 @@ package com.njcn.device.pq.service.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.jeffreyning.mybatisplus.service.MppServiceImpl; 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.common.service.GeneralDeviceService;
import com.njcn.device.line.mapper.LineDetailMapper; import com.njcn.device.line.mapper.LineDetailMapper;
import com.njcn.device.line.mapper.LineMapper; import com.njcn.device.line.mapper.LineMapper;
@@ -66,6 +69,7 @@ public class RStatIntegrityDServiceImpl extends MppServiceImpl<RStatIntegrityDMa
private final GeneralDeviceService deviceService; private final GeneralDeviceService deviceService;
private final LineService lineService; private final LineService lineService;
private final UserLedgerService userLedgerService; private final UserLedgerService userLedgerService;
private final CommLineClient commLineClient;
@Override @Override
public Float getTotalIntegrityByLineIds(LineBaseQueryParam param) { public Float getTotalIntegrityByLineIds(LineBaseQueryParam param) {
@@ -146,6 +150,9 @@ public class RStatIntegrityDServiceImpl extends MppServiceImpl<RStatIntegrityDMa
@Override @Override
public DeviceOnlineRate getData(DeviceInfoParam.BusinessParam param) { public DeviceOnlineRate getData(DeviceInfoParam.BusinessParam param) {
DeviceOnlineRate rate = new DeviceOnlineRate(); DeviceOnlineRate rate = new DeviceOnlineRate();
//BusinessParam的searchvalue只匹配监测点名称现在要匹配电站监测点监测点对象名称所以穿空再添加过滤逻辑
String tempSearchValue=param.getSearchValue();
param.setSearchValue("");
//获取终端台账类信息 //获取终端台账类信息
List<GeneralDeviceDTO> deviceInfo = deviceService.getDeviceInfo(param, null, Collections.singletonList(1)); List<GeneralDeviceDTO> deviceInfo = deviceService.getDeviceInfo(param, null, Collections.singletonList(1));
if (CollUtil.isNotEmpty(deviceInfo)) { if (CollUtil.isNotEmpty(deviceInfo)) {
@@ -154,14 +161,55 @@ public class RStatIntegrityDServiceImpl extends MppServiceImpl<RStatIntegrityDMa
.stream() .stream()
.distinct() .distinct()
.collect(Collectors.toList()); .collect(Collectors.toList());
rate.setTotalNum(lineIds.size()); List<String> filterLineList = new ArrayList<>();
//获取所有监测点的数据完整性
List<RStatIntegrityVO> lineIntegrityRateInfo = rStatIntegrityDMapper.getLineIntegrityRateInfo(lineIds, param.getSearchBeginTime(), param.getSearchEndTime());
//获取所有监测点信息信息
List<LineDetailVO.Detail> LineInfoByIds = lineService.getLineDetailByIds(lineIds);
rate.setBelowNum(CollUtil.isNotEmpty(lineIntegrityRateInfo) ? calculateIntegrityRate(lineIntegrityRateInfo, 90, lineIds.size()) : lineIds.size()); if(CollectionUtil.isNotEmpty(lineIds)){
rate.setTotalOnlineRate(calculateIntegrityRate(lineIntegrityRateInfo, lineIds).doubleValue()>100.0?BigDecimal.valueOf(100.0) : calculateIntegrityRate(lineIntegrityRateInfo, 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<>(); List<DeviceOnlineRate.CitDetail> citDetailList = new ArrayList<>();
DeviceOnlineRate.CitDetail citDetail; DeviceOnlineRate.CitDetail citDetail;
DeviceOnlineRate.LineDetail detail; DeviceOnlineRate.LineDetail detail;
@@ -174,12 +222,13 @@ public class RStatIntegrityDServiceImpl extends MppServiceImpl<RStatIntegrityDMa
Map<String, BigDecimal> onlineRateByDevMap = citDevOnRate.stream() Map<String, BigDecimal> onlineRateByDevMap = citDevOnRate.stream()
.collect(Collectors.toMap(RStatIntegrityVO::getLineIndex, RStatIntegrityVO::getIntegrityRate)); .collect(Collectors.toMap(RStatIntegrityVO::getLineIndex, RStatIntegrityVO::getIntegrityRate));
citDetail = new DeviceOnlineRate.CitDetail(); 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.setCitName(dto.getName());
citDetail.setCitTotalNum(dto.getLineIndexes().size()); citDetail.setCitTotalNum(dto.getLineIndexes().size());
citDetail.setCitBelowNum(CollUtil.isNotEmpty(citDevOnRate) ? calculateIntegrityRate(citDevOnRate, 90, dto.getLineIndexes().size()) : 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())); citDetail.setCitTotalOnlineRate(calculateIntegrityRate(lineIntegrityRateInfo, dto.getLineIndexes()).doubleValue()>100.0?BigDecimal.valueOf(100.0):calculateIntegrityRate(lineIntegrityRateInfo, dto.getLineIndexes()));
List<DeviceOnlineRate.LineDetail> detailList = new ArrayList<>(); 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) { for (LineDetailVO.Detail line : lineDetail) {
detail = new DeviceOnlineRate.LineDetail(); detail = new DeviceOnlineRate.LineDetail();
detail.setCit(line.getDeptName()); detail.setCit(line.getDeptName());

View File

@@ -3,10 +3,11 @@ package com.njcn.device.pq.service.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.dataProcess.param.DataCleanParam; import com.njcn.algorithm.pojo.dto.PqReasonableRangeDto;
import com.njcn.dataProcess.pojo.dto.PqReasonableRangeDto; import com.njcn.algorithm.pojo.param.DataCleanParam;
import com.njcn.dataProcess.pojo.po.PqReasonableRange; import com.njcn.algorithm.pojo.po.PqReasonableRange;
import com.njcn.device.pq.mapper.ReasonableRangeMapper; import com.njcn.device.pq.mapper.ReasonableRangeMapper;
import com.njcn.device.pq.service.ReasonableRangeService; import com.njcn.device.pq.service.ReasonableRangeService;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;

View File

@@ -2884,6 +2884,8 @@ public class TerminalBaseServiceImpl extends ServiceImpl<LineMapper, Line> imple
device.setUpdateTime(LocalDateTime.now()); device.setUpdateTime(LocalDateTime.now());
device.setElectroplate(0); device.setElectroplate(0);
device.setOnTime(1); device.setOnTime(1);
//处理装置识别码秘钥
coderM3d(device, false);
deviceMapper.insert(device); deviceMapper.insert(device);
//分配前置进程 //分配前置进程
nodeDeviceService.oneKeyDistribution(node.getId()); nodeDeviceService.oneKeyDistribution(node.getId());

View File

@@ -45,6 +45,7 @@ import com.njcn.influx.imapper.PqsCommunicateMapper;
import com.njcn.influx.pojo.po.PqsCommunicate; import com.njcn.influx.pojo.po.PqsCommunicate;
import com.njcn.influx.query.InfluxQueryWrapper; import com.njcn.influx.query.InfluxQueryWrapper;
import com.njcn.supervision.pojo.vo.user.NewUserReportVO; 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.AreaFeignClient;
import com.njcn.system.api.DicDataFeignClient; import com.njcn.system.api.DicDataFeignClient;
import com.njcn.system.enums.DicDataTypeEnum; import com.njcn.system.enums.DicDataTypeEnum;
@@ -616,6 +617,11 @@ public class LineServiceImpl extends ServiceImpl<LineMapper, Line> implements Li
lineLineDTO.setLinename(lineName); lineLineDTO.setLinename(lineName);
lineLineDTO.setNum(lineDetail.getNum()); lineLineDTO.setNum(lineDetail.getNum());
lineLineDTO.setObjName(lineDetail.getObjName()); 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.setLoadType(dicDataFeignClient.getDicDataById(lineDetail.getLoadType()).getData().getName());
//电压使用母线电压 //电压使用母线电压
lineLineDTO.setVoltageLevel(dicDataFeignClient.getDicDataById(voltage.getScale()).getData().getName()); lineLineDTO.setVoltageLevel(dicDataFeignClient.getDicDataById(voltage.getScale()).getData().getName());

View File

@@ -1,10 +1,10 @@
package com.njcn.event.common.service; package com.njcn.event.common.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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 com.njcn.event.pojo.vo.*;
import java.text.ParseException;
import java.util.List; import java.util.List;
/** /**
@@ -79,8 +79,6 @@ public interface EventAnalysisService {
*/ */
Page<WaveTypeVO> getMonitorEventAnalyseQuery(EventBaseParam eventBaseParam); Page<WaveTypeVO> getMonitorEventAnalyseQuery(EventBaseParam eventBaseParam);
/** /**
*监测点事件波形下载 *监测点事件波形下载
* @author zbj * @author zbj
@@ -88,6 +86,20 @@ public interface EventAnalysisService {
*/ */
//HttpServletResponse downloadMonitorEventWaveFile(WaveFileParam waveFileParam, HttpServletResponse response) throws Exception; //HttpServletResponse downloadMonitorEventWaveFile(WaveFileParam waveFileParam, HttpServletResponse response) throws Exception;
/**
* 判定压降落点区域
* <p>
* 入参:
* eventValue 特征幅值(百分比形式,如 "80.5" 表示 80.5%),内部 /100 得到 VVm0~1
* persistTime 持续时间(秒)
* <p>
* 优先规则:
* 1) 持续时间 < 0.001 秒 或 VVm = 0 → A区
* 2) 按区间表逐行匹配(左闭右开 [下限, 上限)
* 3) 都不匹配返回 null由调用方走兜底
*
* @return 区域名A区/B区/C区/D区解析失败或未匹配返回 null
*/
String determineDropZone(String eventValue, String persistTime);
} }

View File

@@ -4,7 +4,6 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil; 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.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.njcn.common.config.GeneralInfo; 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.api.LineFeignClient;
import com.njcn.device.pq.pojo.vo.AreaLineInfoVO; import com.njcn.device.pq.pojo.vo.AreaLineInfoVO;
import com.njcn.device.pq.pojo.vo.LineDetailDataVO; 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.common.service.EventDetailService;
import com.njcn.event.enums.EventResponseEnum; import com.njcn.event.enums.EventResponseEnum;
import com.njcn.event.file.pojo.enums.WaveFileResponseEnum; 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.EventDetail;
import com.njcn.event.pojo.po.RmpEventDetailPO; import com.njcn.event.pojo.po.RmpEventDetailPO;
import com.njcn.event.pojo.vo.*; import com.njcn.event.pojo.vo.*;
import com.njcn.event.common.service.EventAnalysisService;
import com.njcn.influx.utils.InfluxDbUtils; import com.njcn.influx.utils.InfluxDbUtils;
import com.njcn.system.api.DicDataFeignClient; import com.njcn.system.api.DicDataFeignClient;
import com.njcn.system.enums.DicDataEnum; import com.njcn.system.enums.DicDataEnum;
import com.njcn.system.enums.DicDataTypeEnum; import com.njcn.system.enums.DicDataTypeEnum;
import com.njcn.system.pojo.po.DictData; import com.njcn.system.pojo.po.DictData;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.influxdb.dto.QueryResult; import org.influxdb.dto.QueryResult;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.*; import java.io.*;
import java.text.ParseException; import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
@@ -51,6 +52,7 @@ import java.util.zip.ZipOutputStream;
*/ */
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
@Slf4j
public class EventAnalysisServiceImpl implements EventAnalysisService { 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;
}
/** /**
* 监测点事件波形下载 * 监测点事件波形下载

View File

@@ -11,6 +11,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.njcn.common.config.GeneralInfo; 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.GeneralDeviceInfoClient;
import com.njcn.device.pq.api.LineFeignClient; import com.njcn.device.pq.api.LineFeignClient;
import com.njcn.device.pq.api.UserLedgerFeignClient; import com.njcn.device.pq.api.UserLedgerFeignClient;
@@ -48,6 +50,7 @@ import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.File; import java.io.File;
import java.math.BigDecimal; import java.math.BigDecimal;
@@ -83,7 +86,7 @@ public class AnalyzeServiceImpl implements IAnalyzeService {
private final EventDetailFeignClient eventDetailFeignClient; private final EventDetailFeignClient eventDetailFeignClient;
private final DicDataFeignClient dicDataFeignClient; private final DicDataFeignClient dicDataFeignClient;
private final UserLedgerFeignClient userLedgerFeignClient; private final UserLedgerFeignClient userLedgerFeignClient;
private final CommLineClient commLineClient;
@Override @Override
public Page<OverAreaLimitVO> getAreaData(OverAreaVO param) { public Page<OverAreaLimitVO> getAreaData(OverAreaVO param) {
Page<OverAreaLimitVO> page = new Page<>(); Page<OverAreaLimitVO> page = new Page<>();
@@ -301,8 +304,31 @@ public class AnalyzeServiceImpl implements IAnalyzeService {
lineList.addAll(item.getLineIndexes()); lineList.addAll(item.getLineIndexes());
}); });
} }
if (CollectionUtil.isNotEmpty(lineList)) { List<String> filterLineList = new ArrayList<>();
page = targetMapper.getSumLimitTargetPage(page, lineList, DateUtil.beginOfDay(DateUtil.parse(param.getSearchBeginTime())),
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()))); DateUtil.endOfDay(DateUtil.parse(param.getSearchEndTime())));
List<MonitorOverLimitVO> pageRecords = page.getRecords(); List<MonitorOverLimitVO> pageRecords = page.getRecords();
if (CollectionUtils.isEmpty(pageRecords)) { if (CollectionUtils.isEmpty(pageRecords)) {