From fa71d8406c432986027bab962975c12ddd807839 Mon Sep 17 00:00:00 2001 From: cdf <857448963@qq.com> Date: Mon, 6 Jul 2026 10:54:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E7=8E=B0=E5=9C=BA=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E8=A6=81=E6=B1=82=E8=BF=9B=E8=A1=8C=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/EventGateController.java | 61 +++++-- .../event/transientes/pojo/dto/MessaeDTO.java | 7 +- .../pojo/param/LargeScreenCountParam.java | 4 + .../transientes/pojo/po/PqsEventdetail.java | 4 + .../service/CleanEventService.java | 12 ++ .../transientes/service/EventGateService.java | 6 + .../service/impl/CleanEventServiceImpl.java | 128 +++++++++++++++ .../service/impl/EventGateServiceImpl.java | 153 +++++++++++++++++- .../service/impl/EventRightServiceImpl.java | 50 ++++-- .../impl/LargeScreenCountServiceImpl.java | 15 +- .../service/impl/SendMessageServiceImpl.java | 33 ++-- 11 files changed, 428 insertions(+), 45 deletions(-) create mode 100644 event_smart/src/main/java/com/njcn/product/event/transientes/service/CleanEventService.java create mode 100644 event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/CleanEventServiceImpl.java diff --git a/event_smart/src/main/java/com/njcn/product/event/transientes/controller/EventGateController.java b/event_smart/src/main/java/com/njcn/product/event/transientes/controller/EventGateController.java index fc49e00..d829ce0 100644 --- a/event_smart/src/main/java/com/njcn/product/event/transientes/controller/EventGateController.java +++ b/event_smart/src/main/java/com/njcn/product/event/transientes/controller/EventGateController.java @@ -16,6 +16,7 @@ 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.event.file.pojo.dto.WaveDataDTO; +import com.njcn.product.event.dataTransmit.DataSynchronization; import com.njcn.product.event.devcie.config.PqlineCache; import com.njcn.product.event.devcie.job.LineCacheJob; import com.njcn.product.event.devcie.mapper.PqLineMapper; @@ -104,7 +105,8 @@ public class EventGateController extends BaseController { private final PqlineCache pqlineCache; private final SendMessageService messageService; - + private final CleanEventService cleanEventService; + private final DataSynchronization dataSynchronization; @GetMapping("/testSendMessage") @ApiOperation("接收远程推送的暂态事件") public HttpResult SendMessage(@RequestParam("startTime") String startTime,@RequestParam("endtTime") String endtTime) { @@ -112,6 +114,14 @@ public class EventGateController extends BaseController { messageService.sendMessage(LocalDateTimeUtil.parse(startTime,DatePattern.NORM_DATETIME_PATTERN),LocalDateTimeUtil.parse(endtTime,DatePattern.NORM_DATETIME_PATTERN)); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe); + } + @GetMapping("/testClean") + @ApiOperation("接收远程推送的暂态事件") + public HttpResult testClean() { + String methodDescribe = getMethodDescribe("testClean"); + dataSynchronization.syncFail(); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe); + } @OperateInfo @@ -419,6 +429,24 @@ public class EventGateController extends BaseController { MessaeDTO result = eventGateService.messageGenerate(eventId); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe); } + + + @OperateInfo + @PostMapping("/messageGenerateByIds") + @ApiOperation("暂降事件短信内容生成") + public HttpResult messageGenerateByIds(@RequestParam List eventIds) { + String methodDescribe = getMethodDescribe("messageGenerateByIds"); + MessaeDTO result = eventGateService.messageGenerateByIds(eventIds); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe); + } + @OperateInfo + @PostMapping("/msgGenerateByMsg") + @ApiOperation("根据故障短信内容生成暂降短信") + public HttpResult msgGenerateByMsg(@RequestParam String msg) { + String methodDescribe = getMethodDescribe("msgGenerateByMsg"); + MessaeDTO result = eventGateService.msgGenerateByMsg(msg); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe); + } @OperateInfo @PostMapping("/messageSend") @ApiOperation("短信发送") @@ -426,7 +454,12 @@ public class EventGateController extends BaseController { String methodDescribe = getMethodDescribe("messageGenerate"); List resultList = new ArrayList<>(); List msgDTOList = new ArrayList<>(); - for (PqsUser user : messaeDTO.getPqsUsers()) { + List allUsers = messaeDTO.getPqsUsers().values() // Collection> + .stream() // 转为流 + .filter(list -> list != null) // 过滤掉null的List(可选) + .flatMap(List::stream) // 将每个List拆开,合并成一个流 + .collect(Collectors.toList()); + for (PqsUser user : allUsers) { String msgId = IdUtil.simpleUUID(); SmsSendDTO.ItemInner dto = new SmsSendDTO.ItemInner(); @@ -434,18 +467,20 @@ public class EventGateController extends BaseController { dto.setTo(user.getPhone()); dto.setCustomMsgID(msgId); msgDTOList.add(dto); + for (String eventId :messaeDTO.getEventIds()){ + MsgEventInfo msgEventInfo = new MsgEventInfo(); + msgEventInfo.setMsgIndex(msgId); + msgEventInfo.setMsgContent(messaeDTO.getMessage()); + msgEventInfo.setPhone(user.getPhone()); + msgEventInfo.setUserId(user.getUserIndex()); + msgEventInfo.setUserName(user.getName()); + msgEventInfo.setIsHandle(0); + msgEventInfo.setSendResult(0); + msgEventInfo.setSendTime(LocalDateTime.now()); + msgEventInfo.setEventIndex(eventId); + resultList.add(msgEventInfo); + } - MsgEventInfo msgEventInfo = new MsgEventInfo(); - msgEventInfo.setMsgIndex(msgId); - msgEventInfo.setMsgContent(messaeDTO.getMessage()); - msgEventInfo.setPhone(user.getPhone()); - msgEventInfo.setUserId(user.getUserIndex()); - msgEventInfo.setUserName(user.getName()); - msgEventInfo.setIsHandle(0); - msgEventInfo.setSendResult(0); - msgEventInfo.setSendTime(LocalDateTime.now()); - msgEventInfo.setEventIndex(messaeDTO.getEventId()); - resultList.add(msgEventInfo); } List result = smsUtils.sendSmSToUser(msgDTOList); diff --git a/event_smart/src/main/java/com/njcn/product/event/transientes/pojo/dto/MessaeDTO.java b/event_smart/src/main/java/com/njcn/product/event/transientes/pojo/dto/MessaeDTO.java index f211a32..163c756 100644 --- a/event_smart/src/main/java/com/njcn/product/event/transientes/pojo/dto/MessaeDTO.java +++ b/event_smart/src/main/java/com/njcn/product/event/transientes/pojo/dto/MessaeDTO.java @@ -1,9 +1,11 @@ package com.njcn.product.event.transientes.pojo.dto; import com.njcn.product.event.transientes.pojo.po.PqsUser; +import com.njcn.product.event.transientes.pojo.po.PqsUserSet; import lombok.Data; import java.util.List; +import java.util.Map; /** * Description: @@ -15,7 +17,8 @@ import java.util.List; @Data public class MessaeDTO { private String message; - private String eventId; + private List eventIds; - private List pqsUsers; +// private List pqsUsers; + private Map> pqsUsers; } diff --git a/event_smart/src/main/java/com/njcn/product/event/transientes/pojo/param/LargeScreenCountParam.java b/event_smart/src/main/java/com/njcn/product/event/transientes/pojo/param/LargeScreenCountParam.java index 50029ec..cb656c3 100644 --- a/event_smart/src/main/java/com/njcn/product/event/transientes/pojo/param/LargeScreenCountParam.java +++ b/event_smart/src/main/java/com/njcn/product/event/transientes/pojo/param/LargeScreenCountParam.java @@ -43,6 +43,10 @@ public class LargeScreenCountParam extends BaseParam { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime endTDateime; + //是否过滤铭感客户默认是,1是0否 + private String fiterSensitiveUser; + + @ApiModelProperty(value = "字典树 对象大类") private String bigObjType; diff --git a/event_smart/src/main/java/com/njcn/product/event/transientes/pojo/po/PqsEventdetail.java b/event_smart/src/main/java/com/njcn/product/event/transientes/pojo/po/PqsEventdetail.java index 56bd7c5..dc28476 100644 --- a/event_smart/src/main/java/com/njcn/product/event/transientes/pojo/po/PqsEventdetail.java +++ b/event_smart/src/main/java/com/njcn/product/event/transientes/pojo/po/PqsEventdetail.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.List; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; @@ -106,6 +107,9 @@ public class PqsEventdetail { @TableField(exist = false) private String stationName; + @TableField(exist = false) + private List consumerNameList; + @TableField(exist = false) private String busBarName; } diff --git a/event_smart/src/main/java/com/njcn/product/event/transientes/service/CleanEventService.java b/event_smart/src/main/java/com/njcn/product/event/transientes/service/CleanEventService.java new file mode 100644 index 0000000..5e50107 --- /dev/null +++ b/event_smart/src/main/java/com/njcn/product/event/transientes/service/CleanEventService.java @@ -0,0 +1,12 @@ +package com.njcn.product.event.transientes.service; + +/** + * Description: + * Date: 2026/07/01 上午 10:57【需求编号】 + * + * @author clam + * @version V1.0.0 + */ +public interface CleanEventService { + void cleanup(); +} diff --git a/event_smart/src/main/java/com/njcn/product/event/transientes/service/EventGateService.java b/event_smart/src/main/java/com/njcn/product/event/transientes/service/EventGateService.java index c719264..642cdee 100644 --- a/event_smart/src/main/java/com/njcn/product/event/transientes/service/EventGateService.java +++ b/event_smart/src/main/java/com/njcn/product/event/transientes/service/EventGateService.java @@ -4,6 +4,8 @@ import com.njcn.event.file.pojo.dto.WaveDataDTO; import com.njcn.product.event.transientes.pojo.dto.MessaeDTO; import com.njcn.product.event.transientes.pojo.param.MonitorTerminalParam; +import java.util.List; + public interface EventGateService { @@ -15,4 +17,8 @@ public interface EventGateService { WaveDataDTO getTransientAnalyseWave(MonitorTerminalParam param); MessaeDTO messageGenerate(String eventId); + + MessaeDTO msgGenerateByMsg(String msg); + + MessaeDTO messageGenerateByIds(List eventIds); } diff --git a/event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/CleanEventServiceImpl.java b/event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/CleanEventServiceImpl.java new file mode 100644 index 0000000..672c89d --- /dev/null +++ b/event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/CleanEventServiceImpl.java @@ -0,0 +1,128 @@ +package com.njcn.product.event.transientes.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.njcn.common.pojo.exception.BusinessException; +import com.njcn.event.file.pojo.enums.WaveFileResponseEnum; +import com.njcn.product.event.config.RedisUtil; +import com.njcn.product.event.devcie.pojo.dto.LedgerBaseInfoDTO; +import com.njcn.product.event.devcie.pojo.po.PqDevice; +import com.njcn.product.event.devcie.pojo.po.PqLine; +import com.njcn.product.event.devcie.pojo.po.PqLinedetail; +import com.njcn.product.event.transientes.pojo.po.PqsEventdetail; +import com.njcn.product.event.transientes.service.CleanEventService; +import com.njcn.product.event.transientes.service.PqsEventdetailService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * Description: + * Date: 2026/07/01 上午 10:57【需求编号】 + * + * @author clam + * @version V1.0.0 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class CleanEventServiceImpl implements CleanEventService { + private final PqsEventdetailService pqsEventdetailService; + private final RedisUtil redisUtil; + private final static String NAME_KEY = "LineCache:"; + @Value("${business.wavePath}") + private String WAVEPATH; + @Transactional(rollbackFor = Exception.class) + @Override + public void cleanup() { + log.info("开始执行 PQS_EVENTDETAIL 清理任务..."); + LocalDateTime oneMonthAgo = LocalDateTime.now().minusMonths(1); + LocalDateTime twoMonthAgo = LocalDateTime.now().minusMonths(1).minusDays(5); + + // 构建查询条件:timeid 早于一个月前,且 eventvalue 在 [0.9, 0.98] 之间 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.between(PqsEventdetail::getTimeid,twoMonthAgo, oneMonthAgo) + .ge(PqsEventdetail::getEventvalue, 0.9) + .le(PqsEventdetail::getEventvalue, 0.98); + + // 一次性查询所有符合条件的记录(注意:若数据量极大,建议改为分页或分批处理) + List records = pqsEventdetailService.list(wrapper); + if (records == null || records.isEmpty()) { + log.info("没有符合条件的记录,清理任务结束"); + return; + } + + log.info("共查询到 {} 条待清理记录", records.size()); + List ledgerBaseInfoDTOS = (List)redisUtil.getObjectByKey(NAME_KEY + StrUtil.DASHED+"LedgerBaseInfoDTO"); + Map LedgerBaseInfoDTOMap = ledgerBaseInfoDTOS.stream().collect(Collectors.toMap(LedgerBaseInfoDTO::getLineId, Function.identity())); + // 收集主键 ID 和删除文件 + List ids = new ArrayList<>(records.size()); + + for (PqsEventdetail record : records) { + ids.add(record.getEventdetailIndex()); + Integer lineid = record.getLineid(); + LedgerBaseInfoDTO ledgerBaseInfoDTO = LedgerBaseInfoDTOMap.get(lineid); + + String waveName = record.getWavename(); + String cfgPath, datPath,cfgPathLower,datPathLower; + if (StrUtil.isBlank(waveName)) { + continue; + } + cfgPath = WAVEPATH+"/"+ledgerBaseInfoDTO.getIp()+"/"+waveName+".CFG"; + datPath = WAVEPATH+"/"+ledgerBaseInfoDTO.getIp()+"/"+waveName+".DAT"; + cfgPathLower = WAVEPATH+"/"+ledgerBaseInfoDTO.getIp()+"/"+waveName+".cfg"; + datPathLower = WAVEPATH+"/"+ledgerBaseInfoDTO.getIp()+"/"+waveName+".dat"; + List filePathList = new ArrayList<>(); + filePathList.add(cfgPath); + filePathList.add(datPath); + filePathList.add(cfgPathLower); + filePathList.add(datPathLower); + deleteWaveFile(filePathList); + } + + // 批量删除数据库记录 + if (!ids.isEmpty()) { + boolean flag = pqsEventdetailService.removeByIds(ids); + } + + log.info("PQS_EVENTDETAIL 清理任务完成"); + } + /** + * 删除波形文件(若文件不存在则忽略) + * + * @param filePathList 文件路径(支持绝对或相对路径) + */ + private void deleteWaveFile(List filePathList ) { + filePathList.forEach(filePath->{ + if (filePath == null || filePath.trim().isEmpty()) { + return; + } + try { + Path path = Paths.get(filePath); + boolean deleted = Files.deleteIfExists(path); + if (deleted) { + log.debug("成功删除波形文件: {}", filePath); + } else { + log.warn("波形文件不存在,无法删除: {}", filePath); + } + } catch (IOException e) { + log.error("删除波形文件失败: {}", filePath, e); + } + }); + + } + +} diff --git a/event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/EventGateServiceImpl.java b/event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/EventGateServiceImpl.java index 00b45f8..b2b2f0f 100644 --- a/event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/EventGateServiceImpl.java +++ b/event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/EventGateServiceImpl.java @@ -34,7 +34,10 @@ import org.springframework.stereotype.Service; import java.io.InputStream; import java.math.BigDecimal; import java.math.RoundingMode; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.stream.Collectors; @@ -110,7 +113,7 @@ public class EventGateServiceImpl implements EventGateService { @Override public MessaeDTO messageGenerate(String eventId) { MessaeDTO messaeDTO = new MessaeDTO(); - messaeDTO.setEventId(eventId); +// messaeDTO.setEventId(eventId); PqsEventdetail eventDetail = pqsEventdetailService.getById(eventId); Double eventvalue = eventDetail.getEventvalue(); BigDecimal eventvalueFormmat = new BigDecimal(eventvalue).multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP); @@ -151,10 +154,156 @@ public class EventGateServiceImpl implements EventGateService { } List pqsUserList = pqsUserService.lambdaQuery().select(PqsUser::getUserIndex, PqsUser::getPhone, PqsUser::getName) .in(PqsUser::getUserIndex, pqsUserSetList.stream().map(PqsUserSet::getUserIndex).collect(Collectors.toList())).list(); - messaeDTO.setPqsUsers(pqsUserList); +// messaeDTO.setPqsUsers(pqsUserList); return messaeDTO; } + @Override + public MessaeDTO msgGenerateByMsg(String msg) { + // 2. 解析为 LocalDateTime +// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); +// LocalDateTime extractedTime = LocalDateTime.parse(dateTimeStr, formatter); +// +// // 3. 计算前后各一分钟 +// LocalDateTime startTime = extractedTime.minusMinutes(1); +// LocalDateTime endTime = extractedTime.plusMinutes(1); +// //获取敏感用户直供变电站名称 +// List poList = pqUserLedgerMapper.selectList(new LambdaQueryWrapper().select(PqUserLedgerPO::getId, PqUserLedgerPO::getCustomerName,PqUserLedgerPO::getIsShow).eq(PqUserLedgerPO::getIsShow, 1)); +// List userIds = poList.stream().map(PqUserLedgerPO::getId).collect(Collectors.toList()); +// List pqUserLineAssPOS = pqUserLineAssMapper.selectList(new LambdaQueryWrapper().in(PqUserLineAssPO::getUserIndex, userIds)); +// List lineIds = pqUserLineAssPOS.stream().map(PqUserLineAssPO::getLineIndex).distinct().collect(Collectors.toList()); +// LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); +// lambdaQueryWrapper.in(PqsEventdetail::getLineid,lineIds).between(PqsEventdetail::getTimeid,startTime,endTime); +// List pqsEventdetails = pqsEventdetailService.list(lambdaQueryWrapper); +// +// if (CollUtil.isEmpty(pqsUserSetList)) { +// //当前事件未找到用户信息,判断为不需要发送短信用户 +// throw new BusinessException("当前事件暂无发送短信用户信息"); +// } + return null; + } + + @Override + public MessaeDTO messageGenerateByIds(List eventIds) { + MessaeDTO messaeDTO = new MessaeDTO(); + + List list = pqsEventdetailService.lambdaQuery(). + in(PqsEventdetail::getEventdetailIndex, eventIds).orderByAsc(PqsEventdetail::getTimeid).list(); + List ledgerBaseInfoDTOS = (List)redisUtil.getObjectByKey(NAME_KEY + StrUtil.DASHED+"LedgerBaseInfoDTO"); + Map LedgerBaseInfoDTOMap = ledgerBaseInfoDTOS.stream().collect(Collectors.toMap(LedgerBaseInfoDTO::getLineId, Function.identity())); + + list.forEach(event->{ + event.setBusBarName(LedgerBaseInfoDTOMap.get(event.getLineid()).getBusBarName()); + event.setStationName(LedgerBaseInfoDTOMap.get(event.getLineid()).getStationName()); + List assList = pqUserLineAssMapper.selectList(new LambdaQueryWrapper().eq(PqUserLineAssPO::getLineIndex, event.getLineid())); + List consumerNameList = new ArrayList<>(); + if (CollUtil.isNotEmpty(assList)) { + List userIds = assList.stream().map(PqUserLineAssPO::getUserIndex).distinct().collect(Collectors.toList()); + List poList = pqUserLedgerMapper.selectList(new LambdaQueryWrapper().select(PqUserLedgerPO::getId, PqUserLedgerPO::getCustomerName, PqUserLedgerPO::getIsShow).eq(PqUserLedgerPO::getIsShow,1).in(PqUserLedgerPO::getId, userIds)); + if(CollUtil.isNotEmpty(poList)){ + consumerNameList= poList.stream().map(PqUserLedgerPO::getCustomerName).collect(Collectors.toList()); + } + } + event.setConsumerNameList(consumerNameList); + }); + Map> groupFilterNull = list.stream() + .filter(e -> e.getStationName() != null) + .collect(Collectors.groupingBy(PqsEventdetail::getStationName)); +// AtomicInteger index = new AtomicInteger(); + + String eventString = groupFilterNull.entrySet().stream().map(entry -> { + String substationnName = entry.getKey(); // 例如 "110kV智芯变" + List value = entry.getValue(); + StringBuilder sb = new StringBuilder(); + + if (value.size() == 1) { + + BigDecimal eventvalue = new BigDecimal(value.get(0).getEventvalue()).multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP); + BigDecimal persisttime = new BigDecimal(value.get(0).getPersisttime()).divide(new BigDecimal(1000)).setScale(3, RoundingMode.HALF_UP); + + sb.append(substationnName).append(value.get(0).getBusBarName()).append("发生电压暂降,电压跌落至").append(eventvalue).append("%,持续时间:").append(persisttime).append("S"); + String ConsumerName = value.stream().map(PqsEventdetail::getConsumerNameList).flatMap(List::stream).distinct().collect(Collectors.joining(",")); + sb.append(",所带敏感用户为").append(ConsumerName); + } else { + Map> BusNameMap = value.stream().map(PqsEventdetail::getBusBarName).distinct().collect(Collectors.groupingBy(EventGateServiceImpl::extractVoltage)); + String allBusName = BusNameMap.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) // 按电压等级排序(110,220,500) + .map(tempEntry -> { + String voltage = tempEntry.getKey(); // 例如 "110kV" + List busNameList = tempEntry.getValue(); + // 构建组内字符串:第一个保留全名,后续的去掉电压前缀 + StringBuilder busName = new StringBuilder(); + for (int i = 0; i < busNameList.size(); i++) { + String fullName = busNameList.get(i).replace("母线",""); + if (i == 0) { + busName.append(fullName); // 第一个保留完整名称(含电压) + } else { + // 去掉电压前缀(例如 "10kV3B#母线" -> "3B#") + String pureName = fullName.startsWith(voltage) + ? fullName.substring(voltage.length()) + : fullName; + busName.append("、").append(pureName.replace("母线","")); + } + } + return busName.toString(); + }) + .collect(Collectors.joining(",")); + BigDecimal eventvalueMin = new BigDecimal(value.stream().mapToDouble(PqsEventdetail::getEventvalue).min().getAsDouble()) + .multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP); + BigDecimal eventvalueMax = new BigDecimal(value.stream().mapToDouble(PqsEventdetail::getEventvalue).max().getAsDouble()) + .multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP); + + BigDecimal persisttimeMin = new BigDecimal(value.stream().mapToDouble(PqsEventdetail::getPersisttime).min().getAsDouble()) + .divide(new BigDecimal(1000)).setScale(3, RoundingMode.HALF_UP); + BigDecimal persisttimeMax = new BigDecimal(value.stream().mapToDouble(PqsEventdetail::getPersisttime).max().getAsDouble()) + .divide(new BigDecimal(1000)).setScale(3, RoundingMode.HALF_UP); + sb.append(substationnName).append(allBusName) + .append("母线电压跌落至").append(eventvalueMin).append("%—").append(eventvalueMax).append("%,持续时间:") + .append(persisttimeMin).append("S—").append(persisttimeMax).append("S"); + String ConsumerName = value.stream().map(PqsEventdetail::getConsumerNameList).flatMap(List::stream).distinct().collect(Collectors.joining(",")); + sb.append(",所带敏感用户为").append(ConsumerName); + } + + return sb.toString(); + }).collect(Collectors.joining(";")); + messaeDTO.setMessage(eventString); + List lineIds = list.stream().map(PqsEventdetail::getLineid).distinct().collect(Collectors.toList()); + List pqLineDept = pqsDeptslineService.lambdaQuery().in(PqsDeptsline::getLineIndex, lineIds).eq(PqsDeptsline::getSystype, sysTypeZt).list(); + Set deptIds = pqLineDept.stream().map(PqsDeptsline::getDeptsIndex).collect(Collectors.toSet()); + Set resultIds = getAllParentDeptIds(deptIds); + List pqsUserSetList = pqsUsersetService.lambdaQuery().eq(PqsUserSet::getIsNotice, 1).in(PqsUserSet::getDeptsIndex, resultIds).list(); + if (CollUtil.isEmpty(pqsUserSetList)) { + //当前事件未找到用户信息,判断为不需要发送短信用户 + throw new BusinessException("当前事件暂无发送短信用户信息"); + } + List userMap = pqsUserService.lambdaQuery().select(PqsUser::getUserIndex, PqsUser::getPhone, PqsUser::getName) + .in(PqsUser::getUserIndex, pqsUserSetList.stream().map(PqsUserSet::getUserIndex).collect(Collectors.toList())).list(); + Map> collect = pqsUserSetList.stream().collect(Collectors.groupingBy(PqsUserSet::getDeptsIndex)); + List allDeptList = pqsDeptsService.lambdaQuery().eq(PqsDepts::getState,1).list(); + Map collect1 = allDeptList.stream().collect(Collectors.toMap(PqsDepts::getDeptsIndex, Function.identity())); + Map> newMap = collect.entrySet().stream() + .collect(Collectors.toMap( + entry -> collect1.get(entry.getKey()).getDeptsname() , // 重新设置key逻辑 + entry ->{ + return userMap.stream().filter(temp->entry.getValue().stream().map(PqsUserSet::getUserIndex).collect(Collectors.toList()).contains(temp.getUserIndex())).collect(Collectors.toList()); + } + )); + + + + messaeDTO.setEventIds(eventIds); + messaeDTO.setPqsUsers(newMap); + return messaeDTO; + } + private static String extractVoltage(String name) { + int kVIndex = name.indexOf("kV"); + if (kVIndex == -1) { + log.info("存在台账"+name+"不符合命名规范"); + throw new IllegalArgumentException("无法解析电压等级: " + name); + } + // 返回从开头到 "kV" 结束的部分(包含 "kV") + return name.substring(0, kVIndex + 2); + } private boolean shouldSendSMS( Double value , Double time ) { diff --git a/event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/EventRightServiceImpl.java b/event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/EventRightServiceImpl.java index 6157527..7539626 100644 --- a/event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/EventRightServiceImpl.java +++ b/event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/EventRightServiceImpl.java @@ -94,7 +94,7 @@ public class EventRightServiceImpl implements EventRightService { Set assUserIds = assList.stream() .map(PqUserLineAssPO::getUserIndex) .collect(Collectors.toSet()); - List userLedgers = getUserLedgers(new ArrayList<>(assUserIds),null,false); + List userLedgers = getUserLedgers(new ArrayList<>(assUserIds),param,false); if (CollUtil.isEmpty(userLedgers)) { return result; } @@ -191,6 +191,9 @@ public class EventRightServiceImpl implements EventRightService { }else { userWrapper.in(PqUserLedgerPO::getId, assUserIds); } + if(Objects.equals("1",param.getFiterSensitiveUser())){ + userWrapper.eq(PqUserLedgerPO::getIsShow,1); + } if(queryFlag){ if(StrUtil.isNotBlank(param.getBigObjType())){ //对象大类不为空 @@ -281,7 +284,9 @@ public class EventRightServiceImpl implements EventRightService { treeMap.forEach((tree, obj) -> { //获取对象大类的用户 List oneList = userMap.get(obj.getId()); - + if(CollUtil.isEmpty(oneList)){ + oneList = new ArrayList<>(); + } if (tree.equals(DicTreeEnum.BJ_USER.getCode())) { Integer[] count = getEventCount(oneList, assList, eventdetailList,true); @@ -372,6 +377,8 @@ public class EventRightServiceImpl implements EventRightService { if(CollUtil.isEmpty(deptLineIds)){ return result; } + //页面查询只显示敏感客户 + param.setFiterSensitiveUser("1"); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); PqSubstation pqSubstation = null; @@ -555,6 +562,8 @@ public class EventRightServiceImpl implements EventRightService { @Override public Page rightEventDevOpen(LargeScreenCountParam param) { Page result = new Page<>(PageFactory.getPageNum(param),PageFactory.getPageSize(param)); + //页面查询只显示敏感客户 + param.setFiterSensitiveUser("1"); List lineIds = commGeneralService.getLineIdsByRedis(param.getDeptId()); if(CollUtil.isEmpty(lineIds)){ return result; @@ -618,7 +627,9 @@ public class EventRightServiceImpl implements EventRightService { }else { lambdaQueryWrapper.in(PqUserLedgerPO::getId,userIds); } - + if(Objects.equals("1",param.getFiterSensitiveUser())){ + lambdaQueryWrapper.eq(PqUserLedgerPO::getIsShow,1); + } if(StrUtil.isNotBlank(param.getBigObjType())){ //对象大类不为空 lambdaQueryWrapper.eq(PqUserLedgerPO::getBigObjType,param.getBigObjType()); @@ -822,6 +833,8 @@ public class EventRightServiceImpl implements EventRightService { long devCount = oneList.stream().filter(it->userLastIds.contains(it.getId())).count(); count[1] = (int) devCount; } + }else { + oneList = new ArrayList<>(); } return count; } @@ -829,7 +842,8 @@ public class EventRightServiceImpl implements EventRightService { @Override public UserLedgerStatisticVO userLedgerStatisticClone(LargeScreenCountParam param) { UserLedgerStatisticVO result = new UserLedgerStatisticVO(); - + //页面查询只显示敏感客户 + param.setFiterSensitiveUser("1"); // 1. 获取字典树数据 List dicTreeList = getAllDicTrees(); Map treeMap = getDicTreeMap(dicTreeList); @@ -840,6 +854,14 @@ public class EventRightServiceImpl implements EventRightService { if (CollUtil.isEmpty(lineIds)) { return result; } + if(Objects.equals("1",param.getFiterSensitiveUser())){ + //查询重要敏感客户 + List poList = pqUserLedgerMapper.selectList(new LambdaQueryWrapper().select(PqUserLedgerPO::getId, PqUserLedgerPO::getCustomerName,PqUserLedgerPO::getIsShow).eq(PqUserLedgerPO::getIsShow, 1)); + List userIds = poList.stream().map(PqUserLedgerPO::getId).collect(Collectors.toList()); + List pqUserLineAssPOS = pqUserLineAssMapper.selectList(new LambdaQueryWrapper().in(PqUserLineAssPO::getUserIndex, userIds)); + List templineIds = pqUserLineAssPOS.stream().map(PqUserLineAssPO::getLineIndex).distinct().collect(Collectors.toList()); + lineIds.retainAll(templineIds); + } // 3. 获取用户线路关联数据 List assList = getUserLineAssociations(lineIds); @@ -851,7 +873,7 @@ public class EventRightServiceImpl implements EventRightService { Set assUserIds = assList.stream() .map(PqUserLineAssPO::getUserIndex) .collect(Collectors.toSet()); - List userLedgers = getUserLedgers(new ArrayList<>(assUserIds),null,false); + List userLedgers = getUserLedgers(new ArrayList<>(assUserIds),param,false); if (CollUtil.isEmpty(userLedgers)) { return result; } @@ -879,7 +901,8 @@ public class EventRightServiceImpl implements EventRightService { if (CollUtil.isEmpty(lineIds)) { return result; } - + //页面查询只显示敏感客户 + param.setFiterSensitiveUser("1"); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); PqSubstation pqSubstation = null; if(Objects.nonNull(param.getBdId())){ @@ -916,6 +939,9 @@ public class EventRightServiceImpl implements EventRightService { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.orderByAsc(PqUserLedgerPO::getSmallObjType,PqUserLedgerPO::getUpdateTime); + if(Objects.equals("1",param.getFiterSensitiveUser())){ + lambdaQueryWrapper.eq(PqUserLedgerPO::getIsShow,1); + } if(StrUtil.isNotBlank(param.getBigObjType())){ //对象大类不为空 lambdaQueryWrapper.eq(PqUserLedgerPO::getBigObjType,param.getBigObjType()); @@ -953,16 +979,16 @@ public class EventRightServiceImpl implements EventRightService { List ledgerList = pqLineService.getBaseLedger(lineTemIds,null); List pqsDeptslineList = pqsDeptslineService.lambdaQuery().in(PqsDeptsline::getLineIndex,lineTemIds).eq(PqsDeptsline::getSystype,sysTypeZt).list(); - Map deptLineMap = pqsDeptslineList.stream().collect(Collectors.toMap(PqsDeptsline::getLineIndex,dept->dept)); +// Map deptLineMap = pqsDeptslineList.stream().collect(Collectors.toMap(PqsDeptsline::getLineIndex,dept->dept)); + Map> deptLineMap = pqsDeptslineList.stream().collect(Collectors.groupingBy(PqsDeptsline::getLineIndex)); - Map deptTemMap = new HashMap<>(); + Map> deptTemMap = new HashMap<>(); List pqsDeptsList = pqsDeptsService.lambdaQuery().eq(PqsDepts::getState,1).list(); Map deptMap = pqsDeptsList.stream().collect(Collectors.toMap(PqsDepts::getDeptsIndex,dept->dept)); deptLineMap.forEach((k,v)->{ - deptTemMap.put(k,deptMap.get(v.getDeptsIndex()).getDeptsname()); + deptTemMap.put(k,v.stream().map(PqsDeptsline::getDeptsIndex).map(deptMap::get).map(PqsDepts::getDeptsname).collect(Collectors.toList())); }); - Map> assMap = assPOList.stream().collect(Collectors.groupingBy(PqUserLineAssPO::getUserIndex,Collectors.mapping(PqUserLineAssPO::getLineIndex,Collectors.toList()))); for(PqUserLedgerPO po :page.getRecords()){ @@ -972,7 +998,9 @@ public class EventRightServiceImpl implements EventRightService { po.setGdName(temList.stream().map(LedgerBaseInfoDTO::getGdName).distinct().collect(Collectors.joining(";"))); po.setStation(temList.stream().map(LedgerBaseInfoDTO::getStationName).distinct().collect(Collectors.joining(";"))); po.setInfo(temList.stream().map(it->it.getStationName()+"_"+it.getBusBarName()).distinct().collect(Collectors.joining(";"))); - po.setDeptName(temList.stream().map(LedgerBaseInfoDTO::getLineId).distinct().map(deptTemMap::get).distinct().collect(Collectors.joining(";"))); +// po.setDeptName(temList.stream().map(LedgerBaseInfoDTO::getLineId).distinct().map(deptTemMap::get).distinct().collect(Collectors.joining(";"))); + po.setDeptName(temList.stream().map(LedgerBaseInfoDTO::getLineId).distinct().map(deptTemMap::get).flatMap(Collection::stream).distinct().collect(Collectors.joining(";"))); + } } diff --git a/event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/LargeScreenCountServiceImpl.java b/event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/LargeScreenCountServiceImpl.java index 10975db..e04b176 100644 --- a/event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/LargeScreenCountServiceImpl.java +++ b/event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/LargeScreenCountServiceImpl.java @@ -1198,7 +1198,8 @@ public class LargeScreenCountServiceImpl implements LargeScreenCountService { Page pqsEventdetailPage = new Page<>(largeScreenCountParam.getPageNum(), largeScreenCountParam.getPageSize()); // LocalDateTime startTime = largeScreenCountParam.getStartTime().atStartOfDay(); // LocalDateTime endTime = LocalDateTimeUtil.endOfDay(largeScreenCountParam.getEndTime().atStartOfDay()); - + //页面查询只显示敏感客户 + largeScreenCountParam.setFiterSensitiveUser("1"); List deptslineIds = commGeneralService.getLineIdsByRedis(largeScreenCountParam.getDeptId()); List ledgerList = new ArrayList<>(); @@ -1210,6 +1211,14 @@ public class LargeScreenCountServiceImpl implements LargeScreenCountService { .gt(PqsEventdetail::getPersisttime, msgEventConfigService.getEventDuration()) .le(PqsEventdetail::getEventvalue, msgEventConfigService.getEventValue()) .orderByDesc(PqsEventdetail::getTimeid); + if(Objects.equals("1",largeScreenCountParam.getFiterSensitiveUser())){ + //查询重要敏感客户 + List poList = pqUserLedgerMapper.selectList(new LambdaQueryWrapper().select(PqUserLedgerPO::getId, PqUserLedgerPO::getCustomerName,PqUserLedgerPO::getIsShow).eq(PqUserLedgerPO::getIsShow, 1)); + List userIds = poList.stream().map(PqUserLedgerPO::getId).collect(Collectors.toList()); + List pqUserLineAssPOS = pqUserLineAssMapper.selectList(new LambdaQueryWrapper().in(PqUserLineAssPO::getUserIndex, userIds)); + List lineIds = pqUserLineAssPOS.stream().map(PqUserLineAssPO::getLineIndex).distinct().collect(Collectors.toList()); + deptslineIds.retainAll(lineIds); + } if (Objects.nonNull(largeScreenCountParam.getEventtype())) { queryWrapper.eq(PqsEventdetail::getWavetype, largeScreenCountParam.getEventtype()); @@ -1549,10 +1558,10 @@ public class LargeScreenCountServiceImpl implements LargeScreenCountService { Map pqsDeptsMap = pqsDeptsService.lambdaQuery().eq(PqsDepts::getState, 1).list().stream().collect(Collectors.toMap(PqsDepts::getDeptsIndex, Function.identity())); - Map map = deptslineList.stream().collect(Collectors.toMap(PqsDeptsline::getLineIndex, Function.identity())); + Map> map = deptslineList.stream().collect(Collectors.groupingBy(PqsDeptsline::getLineIndex)); Map temMap = new HashMap<>(); map.forEach((lineId, deptline) -> { - String deptName = pqsDeptsMap.get(deptline.getDeptsIndex()).getDeptsname(); + String deptName = deptline.stream().map(PqsDeptsline::getDeptsIndex).map(pqsDeptsMap::get).map(PqsDepts::getDeptsname).collect(Collectors.joining(";")); temMap.put(lineId, deptName); }); diff --git a/event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/SendMessageServiceImpl.java b/event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/SendMessageServiceImpl.java index 9eb4b18..e4f0406 100644 --- a/event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/SendMessageServiceImpl.java +++ b/event_smart/src/main/java/com/njcn/product/event/transientes/service/impl/SendMessageServiceImpl.java @@ -86,7 +86,7 @@ public class SendMessageServiceImpl implements SendMessageService { List successSendEventIds = msgEventInfos.stream().map(MsgEventInfo::getEventIndex).distinct().collect(Collectors.toList()); pqsEventdetails = pqsEventdetails.stream() - .filter(temp -> shouldSendSMS(temp.getEventvalue()*100, temp.getPersisttime()) && (!successSendEventIds.contains(temp.getEventdetailIndex()))) + .filter(temp -> shouldSendSMS(temp.getEventvalue()*100, temp.getPersisttime(),temp.getWavetype()) && (!successSendEventIds.contains(temp.getEventdetailIndex()))) .collect(Collectors.toList()); log.info("扫描到敏感客户暂态事件过滤后事件:"+pqsEventdetails.size()+"条"); @@ -344,23 +344,28 @@ public class SendMessageServiceImpl implements SendMessageService { } - private boolean shouldSendSMS( Double value , Double time ) { + private boolean shouldSendSMS(Double value , Double time, Integer wavetype) { + if(wavetype==1){ + // 条件1: 电压降至50%以下,持续时间超过20ms + if (value < 50 && value>=10&& time >= 20) { + return true; + } + // 条件2: 电压降至50%—70%,持续时间超过200ms + if (value >= 50 && value < 70 && time >= 200) { + return true; + } - // 条件1: 电压降至50%以下,持续时间超过20ms - if (value < 50 && time >= 20) { - return true; + // 条件3: 电压降至70%—80%,持续时间超过500ms + if (value >= 70 && value <= 80 && time >= 500) { + return true; + } + } else if (wavetype==3) { + if (value < 10&& time >= 20) { + return true; + } } - // 条件2: 电压降至50%—70%,持续时间超过200ms - if (value >= 50 && value < 70 && time >= 200) { - return true; - } - - // 条件3: 电压降至70%—80%,持续时间超过500ms - if (value >= 70 && value <= 80 && time >= 500) { - return true; - } return false; }