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 d2bed4e..fc49e00 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 @@ -10,6 +10,7 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.njcn.common.pojo.annotation.OperateInfo; import com.njcn.common.pojo.enums.common.LogEnum; import com.njcn.common.pojo.enums.response.CommonResponseEnum; @@ -25,11 +26,13 @@ import com.njcn.product.event.devcie.service.PqsDeptslineService; import com.njcn.product.event.transientes.mapper.PqUserLedgerMapper; import com.njcn.product.event.transientes.mapper.PqUserLineAssMapper; import com.njcn.product.event.transientes.mapper.PqsEventdetailMapper; +import com.njcn.product.event.transientes.pojo.dto.MessaeDTO; import com.njcn.product.event.transientes.pojo.dto.SmsResponseDTO; import com.njcn.product.event.transientes.pojo.dto.SmsSendDTO; import com.njcn.product.event.transientes.pojo.dto.UpLoadEvent; import com.njcn.product.event.transientes.pojo.param.MonitorTerminalParam; import com.njcn.product.event.transientes.pojo.po.*; +import com.njcn.product.event.transientes.pojo.vo.EventDetailVO; import com.njcn.product.event.transientes.service.*; import com.njcn.product.event.transientes.utils.SmsUtils; import com.njcn.product.event.transientes.websocket.WebSocketServer; @@ -131,7 +134,7 @@ public class EventGateController extends BaseController { && (Float.parseFloat(jsonObject.get("persisttime").toString()) * 1000) >= msgEventConfigService.getEventDuration()) { //过滤重要暂降事件 //F47过滤 - float eventvalue = Float.parseFloat(jsonObject.get("eventvalue").toString()); + float eventvalue = Float.parseFloat(jsonObject.get("eventvalue").toString())*100; float persisttime = Float.parseFloat(jsonObject.get("persisttime").toString()) * 1000; if(shouldSendSMS(eventvalue,persisttime)){ Integer lineId = Integer.valueOf(jsonObject.get("lineid").toString()); @@ -197,7 +200,7 @@ public class EventGateController extends BaseController { // 条件1: 电压降至50%以下,持续时间超过20ms - if (value < 0.5 && time >= 20) { + if (value < 50 && time >= 20) { return true; } @@ -408,6 +411,59 @@ public class EventGateController extends BaseController { return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe); } + @OperateInfo + @PostMapping("/messageGenerate") + @ApiOperation("暂降事件短信内容生成") + public HttpResult messageGenerate(@RequestParam String eventId) { + String methodDescribe = getMethodDescribe("messageGenerate"); + MessaeDTO result = eventGateService.messageGenerate(eventId); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe); + } + @OperateInfo + @PostMapping("/messageSend") + @ApiOperation("短信发送") + public HttpResult> messageSend(@RequestBody MessaeDTO messaeDTO) { + String methodDescribe = getMethodDescribe("messageGenerate"); + List resultList = new ArrayList<>(); + List msgDTOList = new ArrayList<>(); + for (PqsUser user : messaeDTO.getPqsUsers()) { + String msgId = IdUtil.simpleUUID(); + + SmsSendDTO.ItemInner dto = new SmsSendDTO.ItemInner(); + dto.setContent(messaeDTO.getMessage()); + dto.setTo(user.getPhone()); + dto.setCustomMsgID(msgId); + msgDTOList.add(dto); + + 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); + Map stringSmsItemMap = result.stream().collect(Collectors.toMap(SmsResponseDTO.SmsItem::getCustomMsgID, Function.identity())); + + resultList.forEach(item -> { + if (stringSmsItemMap.containsKey(item.getMsgIndex())) { + SmsResponseDTO.SmsItem smsItem = stringSmsItemMap.get(item.getMsgIndex()); + item.setSendResult(Objects.equals(smsItem.getCode(), "0") ? 1 : 0); + item.setIsHandle(1); + + } + }); + msgEventInfoService.saveBatch(resultList); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, resultList, methodDescribe); + } + + private void sendMessage(JSONObject jsonObject, String objStr) { try { diff --git a/event_smart/src/main/java/com/njcn/product/event/transientes/controller/LargeScreenCountController.java b/event_smart/src/main/java/com/njcn/product/event/transientes/controller/LargeScreenCountController.java index b2ba411..c89b52b 100644 --- a/event_smart/src/main/java/com/njcn/product/event/transientes/controller/LargeScreenCountController.java +++ b/event_smart/src/main/java/com/njcn/product/event/transientes/controller/LargeScreenCountController.java @@ -10,6 +10,7 @@ import com.njcn.common.pojo.enums.response.CommonResponseEnum; import com.njcn.common.pojo.response.HttpResult; import com.njcn.product.event.dataTransmit.DataSynchronization; import com.njcn.product.event.devcie.pojo.dto.DeviceDTO; +import com.njcn.product.event.transientes.pojo.dto.MessaeDTO; import com.njcn.product.event.transientes.pojo.param.LargeScreenCountParam; import com.njcn.product.event.transientes.pojo.param.MessageEventFeedbackParam; import com.njcn.product.event.transientes.pojo.po.MsgEventInfo; 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 new file mode 100644 index 0000000..f211a32 --- /dev/null +++ b/event_smart/src/main/java/com/njcn/product/event/transientes/pojo/dto/MessaeDTO.java @@ -0,0 +1,21 @@ +package com.njcn.product.event.transientes.pojo.dto; + +import com.njcn.product.event.transientes.pojo.po.PqsUser; +import lombok.Data; + +import java.util.List; + +/** + * Description: + * Date: 2026/06/22 上午 10:34【需求编号】 + * + * @author clam + * @version V1.0.0 + */ +@Data +public class MessaeDTO { + private String message; + private String eventId; + + private List 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 e08b6f6..50029ec 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 @@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; /** @@ -36,6 +37,12 @@ public class LargeScreenCountParam extends BaseParam { private LocalDate startTime; @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate endTime; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startDateTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTDateime; + @ApiModelProperty(value = "字典树 对象大类") private String bigObjType; 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 7fca510..c719264 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 @@ -1,6 +1,7 @@ package com.njcn.product.event.transientes.service; 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; public interface EventGateService { @@ -12,4 +13,6 @@ public interface EventGateService { * @return */ WaveDataDTO getTransientAnalyseWave(MonitorTerminalParam param); + + MessaeDTO messageGenerate(String eventId); } 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 adc16e1..00b45f8 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 @@ -1,27 +1,42 @@ package com.njcn.product.event.transientes.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.LocalDateTimeUtil; 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.component.WaveFileComponent; import com.njcn.event.file.pojo.dto.WaveDataDTO; import com.njcn.event.file.pojo.enums.WaveFileResponseEnum; +import com.njcn.product.event.config.RedisUtil; import com.njcn.product.event.devcie.mapper.PqLinedetailMapper; +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.devcie.pojo.po.PqsDeptsline; import com.njcn.product.event.devcie.service.PqDeviceService; import com.njcn.product.event.devcie.service.PqLineService; +import com.njcn.product.event.devcie.service.PqsDeptslineService; +import com.njcn.product.event.transientes.mapper.PqUserLedgerMapper; +import com.njcn.product.event.transientes.mapper.PqUserLineAssMapper; +import com.njcn.product.event.transientes.pojo.dto.MessaeDTO; import com.njcn.product.event.transientes.pojo.param.MonitorTerminalParam; -import com.njcn.product.event.transientes.pojo.po.PqsEventdetail; -import com.njcn.product.event.transientes.service.EventGateService; -import com.njcn.product.event.transientes.service.PqsEventdetailService; +import com.njcn.product.event.transientes.pojo.po.*; +import com.njcn.product.event.transientes.service.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.InputStream; -import java.util.Objects; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @Author: cdf @@ -38,6 +53,17 @@ public class EventGateServiceImpl implements EventGateService { private final WaveFileComponent waveFileComponent; private final PqLineService pqLineService; private final PqLinedetailMapper pqLinedetailMapper; + private final PqsDeptslineService pqsDeptslineService; + private final PqsDeptsService pqsDeptsService; + private final PqsUsersetService pqsUsersetService; + private final PqsUserService pqsUserService; + private final PqUserLineAssMapper pqUserLineAssMapper; + private final PqUserLedgerMapper pqUserLedgerMapper; + + private final static String NAME_KEY = "LineCache:"; + private final RedisUtil redisUtil; + @Value("${SYS_TYPE_ZT}") + private String sysTypeZt; @Value("${business.wavePath}") private String WAVEPATH; @@ -80,4 +106,104 @@ public class EventGateServiceImpl implements EventGateService { return waveDataDTO; } + + @Override + public MessaeDTO messageGenerate(String eventId) { + MessaeDTO messaeDTO = new MessaeDTO(); + 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); + + Double persisttime = eventDetail.getPersisttime(); + BigDecimal persisttimeFormmat = new BigDecimal(persisttime).divide(new BigDecimal(1000)).setScale(3, RoundingMode.HALF_UP); + + List assList = pqUserLineAssMapper.selectList(new LambdaQueryWrapper().eq(PqUserLineAssPO::getLineIndex, eventDetail.getLineid())); + String str ; + 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).in(PqUserLedgerPO::getId, userIds)); + String sensitiveUser = poList.stream().map(PqUserLedgerPO::getCustomerName).collect(Collectors.joining(";")); + + str ="影响用户:"+sensitiveUser+";"; + + } else { + str = ""; + } + + List ledgerBaseInfoDTOS = (List)redisUtil.getObjectByKey(NAME_KEY + StrUtil.DASHED+"LedgerBaseInfoDTO"); + Map LedgerBaseInfoDTOMap = ledgerBaseInfoDTOS.stream().collect(Collectors.toMap(LedgerBaseInfoDTO::getLineId, Function.identity())); + StringBuilder stringBuilder = new StringBuilder(LocalDateTimeUtil.format(eventDetail.getTimeid(), DatePattern.NORM_DATETIME_PATTERN)); + stringBuilder.append(".").append(eventDetail.getMs().toString()).append(",").append(LedgerBaseInfoDTOMap.get(eventDetail.getLineid()).getStationName()) + .append(LedgerBaseInfoDTOMap.get(eventDetail.getLineid()).getBusBarName()) +// .append("_").append(jsonObject.get("pointname").toString()) + .append("发生电压暂降事件,事件残余电压:").append(eventvalueFormmat).append("%,持续时间:").append(persisttimeFormmat).append("S;"); + stringBuilder.append(str); + + messaeDTO.setMessage(stringBuilder.toString()); + List pqLineDept = pqsDeptslineService.lambdaQuery().eq(PqsDeptsline::getLineIndex, eventDetail.getLineid()).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 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); + return messaeDTO; + } + + private boolean shouldSendSMS( Double value , Double time ) { + + + // 条件1: 电压降至50%以下,持续时间超过20ms + if (value < 50 && 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; + } + + public Set getAllParentDeptIds(Set deptIds) { + // 首次获取直接父级 + List allDeptList = pqsDeptsService.lambdaQuery().list(); + // 递归获取所有父级 + Set result = recursivelyGetParentIds(deptIds, allDeptList); + return result; + } + + /** + * 递归获取所有父级ID + * + * @param currentParentIds 当前层级的父级ID集合 + * @return 所有层级的父级ID集合 + */ + private Set recursivelyGetParentIds(Set currentParentIds, List allDeptList) { + Set result = new HashSet<>(currentParentIds); + Set nextLevelParentIds = new HashSet<>(); + List parentDeptList = allDeptList.stream().filter(it -> currentParentIds.contains(it.getDeptsIndex())).collect(Collectors.toList()); + for (PqsDepts pqsDepts : parentDeptList) { + if (!pqsDepts.getParentnodeid().equals("0")) { + nextLevelParentIds.add(pqsDepts.getParentnodeid()); + } + } + // 如果有更高层级的父级,继续递归 + if (!nextLevelParentIds.isEmpty()) { + Set deeperParentIds = recursivelyGetParentIds(nextLevelParentIds, allDeptList); + result.addAll(deeperParentIds); + } + return result; + } } 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 b0e70d8..10975db 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 @@ -1196,8 +1196,8 @@ public class LargeScreenCountServiceImpl implements LargeScreenCountService { @Override public Page eventPage(LargeScreenCountParam largeScreenCountParam) { Page pqsEventdetailPage = new Page<>(largeScreenCountParam.getPageNum(), largeScreenCountParam.getPageSize()); - LocalDateTime startTime = largeScreenCountParam.getStartTime().atStartOfDay(); - LocalDateTime endTime = LocalDateTimeUtil.endOfDay(largeScreenCountParam.getEndTime().atStartOfDay()); +// LocalDateTime startTime = largeScreenCountParam.getStartTime().atStartOfDay(); +// LocalDateTime endTime = LocalDateTimeUtil.endOfDay(largeScreenCountParam.getEndTime().atStartOfDay()); List deptslineIds = commGeneralService.getLineIdsByRedis(largeScreenCountParam.getDeptId()); @@ -1206,7 +1206,7 @@ public class LargeScreenCountServiceImpl implements LargeScreenCountService { List assList = new ArrayList<>(); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper - .between(PqsEventdetail::getTimeid, startTime, endTime) +// .between(PqsEventdetail::getTimeid, startTime, endTime) .gt(PqsEventdetail::getPersisttime, msgEventConfigService.getEventDuration()) .le(PqsEventdetail::getEventvalue, msgEventConfigService.getEventValue()) .orderByDesc(PqsEventdetail::getTimeid); @@ -1216,6 +1216,15 @@ public class LargeScreenCountServiceImpl implements LargeScreenCountService { } else { queryWrapper.in(PqsEventdetail::getWavetype, msgEventConfigService.getEventType()); } + if(Objects.nonNull(largeScreenCountParam.getStartTime())&&Objects.nonNull(largeScreenCountParam.getEndTime())){ + LocalDateTime startTime = largeScreenCountParam.getStartTime().atStartOfDay(); + LocalDateTime endTime = LocalDateTimeUtil.endOfDay(largeScreenCountParam.getEndTime().atStartOfDay()); + queryWrapper + .between(PqsEventdetail::getTimeid, startTime, endTime); + } + if (Objects.nonNull(largeScreenCountParam.getStartDateTime())&&Objects.nonNull(largeScreenCountParam.getEndTDateime())) { + queryWrapper.between(PqsEventdetail::getTimeid, largeScreenCountParam.getStartDateTime(),largeScreenCountParam.getEndTDateime()); + } if (Objects.nonNull(largeScreenCountParam.getEventDurationMin()) || Objects.nonNull(largeScreenCountParam.getEventDurationMax())) { queryWrapper.gt(Objects.nonNull(largeScreenCountParam.getEventDurationMin()), PqsEventdetail::getPersisttime, largeScreenCountParam.getEventDurationMin()); 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 d97d234..9eb4b18 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(), temp.getPersisttime()) && (!successSendEventIds.contains(temp.getEventdetailIndex()))) + .filter(temp -> shouldSendSMS(temp.getEventvalue()*100, temp.getPersisttime()) && (!successSendEventIds.contains(temp.getEventdetailIndex()))) .collect(Collectors.toList()); log.info("扫描到敏感客户暂态事件过滤后事件:"+pqsEventdetails.size()+"条"); @@ -348,7 +348,7 @@ public class SendMessageServiceImpl implements SendMessageService { // 条件1: 电压降至50%以下,持续时间超过20ms - if (value < 0.5 && time >= 20) { + if (value < 50 && time >= 20) { return true; }