From 277ca39dfcb93ed6ccb815b2d217b442a23fa54a Mon Sep 17 00:00:00 2001 From: xuyang <748613696@qq.com> Date: Wed, 8 Nov 2023 16:16:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=91=8A=E8=AD=A6=E4=BA=8B=E4=BB=B6=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/CsDevModelServiceImpl.java | 16 +-- .../njcn/zlevent/api/AlarmFeignClient.java | 18 +++ .../fallback/AlarmClientFallbackFactory.java | 35 ++++++ .../zlevent/controller/AlarmController.java | 47 ++++++++ .../njcn/zlevent/service/ICsAlarmService.java | 23 ++++ .../service/impl/CsAlarmServiceImpl.java | 103 ++++++++++++++++++ .../njcn/zlevent/utils/SendEventUtils.java | 25 +---- .../message/consumer/AppEventConsumer.java | 4 + 8 files changed, 242 insertions(+), 29 deletions(-) create mode 100644 iot-analysis/analysis-zl-event/zl-event-api/src/main/java/com/njcn/zlevent/api/AlarmFeignClient.java create mode 100644 iot-analysis/analysis-zl-event/zl-event-api/src/main/java/com/njcn/zlevent/api/fallback/AlarmClientFallbackFactory.java create mode 100644 iot-analysis/analysis-zl-event/zl-event-boot/src/main/java/com/njcn/zlevent/controller/AlarmController.java create mode 100644 iot-analysis/analysis-zl-event/zl-event-boot/src/main/java/com/njcn/zlevent/service/ICsAlarmService.java create mode 100644 iot-analysis/analysis-zl-event/zl-event-boot/src/main/java/com/njcn/zlevent/service/impl/CsAlarmServiceImpl.java diff --git a/iot-access/access-boot/src/main/java/com/njcn/access/service/impl/CsDevModelServiceImpl.java b/iot-access/access-boot/src/main/java/com/njcn/access/service/impl/CsDevModelServiceImpl.java index cffa13f..7a68ecc 100644 --- a/iot-access/access-boot/src/main/java/com/njcn/access/service/impl/CsDevModelServiceImpl.java +++ b/iot-access/access-boot/src/main/java/com/njcn/access/service/impl/CsDevModelServiceImpl.java @@ -1032,28 +1032,28 @@ public class CsDevModelServiceImpl implements ICsDevModelService { showName = "APF模块数据"; break; case "Ds$Apf$module$01": - showName = "模块1数据"; + showName = "APF模块1数据"; break; case "Ds$Apf$module$02": - showName = "模块2数据"; + showName = "APF模块2数据"; break; case "Ds$Apf$module$03": - showName = "模块3数据"; + showName = "APF模块3数据"; break; case "Ds$Apf$module$04": - showName = "模块4数据"; + showName = "APF模块4数据"; break; case "Ds$Apf$module$05": - showName = "模块5数据"; + showName = "APF模块5数据"; break; case "Ds$Apf$module$06": - showName = "模块6数据"; + showName = "APF模块6数据"; break; case "Ds$Apf$module$07": - showName = "模块7数据"; + showName = "APF模块7数据"; break; case "Ds$Apf$module$08": - showName = "模块8数据"; + showName = "APF模块8数据"; break; case "Ds$Pqd$Stat$01": showName = "电网侧数据"; diff --git a/iot-analysis/analysis-zl-event/zl-event-api/src/main/java/com/njcn/zlevent/api/AlarmFeignClient.java b/iot-analysis/analysis-zl-event/zl-event-api/src/main/java/com/njcn/zlevent/api/AlarmFeignClient.java new file mode 100644 index 0000000..7ef16c6 --- /dev/null +++ b/iot-analysis/analysis-zl-event/zl-event-api/src/main/java/com/njcn/zlevent/api/AlarmFeignClient.java @@ -0,0 +1,18 @@ +package com.njcn.zlevent.api; + +import com.njcn.common.pojo.constant.ServerInfo; +import com.njcn.common.pojo.response.HttpResult; +import com.njcn.mq.message.AppEventMessage; +import com.njcn.zlevent.api.fallback.AlarmClientFallbackFactory; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; + +/** + * @author xy + */ +@FeignClient(value = ServerInfo.CS_ZL_EVENT_BOOT, path = "/alarm", fallbackFactory = AlarmClientFallbackFactory.class,contextId = "alarm") +public interface AlarmFeignClient { + + @PostMapping("/analysis") + HttpResult analysis(AppEventMessage appEventMessage); +} diff --git a/iot-analysis/analysis-zl-event/zl-event-api/src/main/java/com/njcn/zlevent/api/fallback/AlarmClientFallbackFactory.java b/iot-analysis/analysis-zl-event/zl-event-api/src/main/java/com/njcn/zlevent/api/fallback/AlarmClientFallbackFactory.java new file mode 100644 index 0000000..73dd500 --- /dev/null +++ b/iot-analysis/analysis-zl-event/zl-event-api/src/main/java/com/njcn/zlevent/api/fallback/AlarmClientFallbackFactory.java @@ -0,0 +1,35 @@ +package com.njcn.zlevent.api.fallback; + +import com.njcn.common.pojo.enums.response.CommonResponseEnum; +import com.njcn.common.pojo.exception.BusinessException; +import com.njcn.common.pojo.response.HttpResult; +import com.njcn.mq.message.AppEventMessage; +import com.njcn.zlevent.api.AlarmFeignClient; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author xy + */ +@Slf4j +@Component +public class AlarmClientFallbackFactory implements FallbackFactory { + @Override + public AlarmFeignClient create(Throwable cause) { + //判断抛出异常是否为解码器抛出的业务异常 + Enum exceptionEnum = CommonResponseEnum.SERVICE_FALLBACK; + if (cause.getCause() instanceof BusinessException) { + BusinessException businessException = (BusinessException) cause.getCause(); + } + Enum finalExceptionEnum = exceptionEnum; + return new AlarmFeignClient() { + + @Override + public HttpResult analysis(AppEventMessage appEventMessage) { + log.error("{}异常,降级处理,异常为:{}","告警数据解析",cause.toString()); + throw new BusinessException(finalExceptionEnum); + } + }; + } +} diff --git a/iot-analysis/analysis-zl-event/zl-event-boot/src/main/java/com/njcn/zlevent/controller/AlarmController.java b/iot-analysis/analysis-zl-event/zl-event-boot/src/main/java/com/njcn/zlevent/controller/AlarmController.java new file mode 100644 index 0000000..cd00b5b --- /dev/null +++ b/iot-analysis/analysis-zl-event/zl-event-boot/src/main/java/com/njcn/zlevent/controller/AlarmController.java @@ -0,0 +1,47 @@ +package com.njcn.zlevent.controller; + +import com.njcn.common.pojo.annotation.OperateInfo; +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.mq.message.AppEventMessage; +import com.njcn.web.controller.BaseController; +import com.njcn.zlevent.service.ICsAlarmService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 类的介绍: + * + * @author xuyang + * @version 1.0.0 + * @createTime 2023/8/14 9:23 + */ +@Slf4j +@RestController +@RequestMapping("/alarm") +@Api(tags = "告警事件处理") +@AllArgsConstructor +public class AlarmController extends BaseController { + + private final ICsAlarmService csAlarmService; + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/analysis") + @ApiOperation("告警事件解析") + @ApiImplicitParam(name = "appEventMessage", value = "数据实体", required = true) + public HttpResult analysis(@RequestBody AppEventMessage appEventMessage){ + String methodDescribe = getMethodDescribe("analysis"); + csAlarmService.analysis(appEventMessage); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe); + } + +} diff --git a/iot-analysis/analysis-zl-event/zl-event-boot/src/main/java/com/njcn/zlevent/service/ICsAlarmService.java b/iot-analysis/analysis-zl-event/zl-event-boot/src/main/java/com/njcn/zlevent/service/ICsAlarmService.java new file mode 100644 index 0000000..efdf589 --- /dev/null +++ b/iot-analysis/analysis-zl-event/zl-event-boot/src/main/java/com/njcn/zlevent/service/ICsAlarmService.java @@ -0,0 +1,23 @@ +package com.njcn.zlevent.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.njcn.csharmonic.pojo.po.CsEventPO; +import com.njcn.mq.message.AppEventMessage; + +/** + *

+ * 告警事件表 服务类 + *

+ * + * @author xuyang + * @since 2023-08-23 + */ +public interface ICsAlarmService extends IService { + + /** + * 告警数据解析入库 + * @param appEventMessage 实体 + */ + void analysis(AppEventMessage appEventMessage); + +} diff --git a/iot-analysis/analysis-zl-event/zl-event-boot/src/main/java/com/njcn/zlevent/service/impl/CsAlarmServiceImpl.java b/iot-analysis/analysis-zl-event/zl-event-boot/src/main/java/com/njcn/zlevent/service/impl/CsAlarmServiceImpl.java new file mode 100644 index 0000000..6d4e51d --- /dev/null +++ b/iot-analysis/analysis-zl-event/zl-event-boot/src/main/java/com/njcn/zlevent/service/impl/CsAlarmServiceImpl.java @@ -0,0 +1,103 @@ +package com.njcn.zlevent.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.njcn.csdevice.api.EquipmentFeignClient; +import com.njcn.csdevice.pojo.po.CsEquipmentDeliveryPO; +import com.njcn.csharmonic.pojo.po.CsEventPO; +import com.njcn.mq.message.AppEventMessage; +import com.njcn.system.api.EpdFeignClient; +import com.njcn.system.pojo.param.EleEpdPqdParam; +import com.njcn.system.pojo.po.EleEpdPqd; +import com.njcn.zlevent.mapper.CsEventMapper; +import com.njcn.zlevent.pojo.po.CsEventLogs; +import com.njcn.zlevent.service.ICsAlarmService; +import com.njcn.zlevent.service.ICsEventLogsService; +import com.njcn.zlevent.service.ICsEventService; +import com.njcn.zlevent.utils.SendEventUtils; +import lombok.AllArgsConstructor; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 告警事件表 服务实现类 + *

+ * + * @author xuyang + * @since 2023-08-23 + */ +@Service +@AllArgsConstructor +public class CsAlarmServiceImpl extends ServiceImpl implements ICsAlarmService { + private final EquipmentFeignClient equipmentFeignClient; + private final EventServiceImpl eventService; + private final ICsEventService csEventService; + private final SendEventUtils sendEventUtils; + private final ICsEventLogsService csEventLogsService; + private final EpdFeignClient epdFeignClient; + + @Override + @Transactional(rollbackFor = Exception.class) + public void analysis(AppEventMessage appEventMessage) { + List list1 = new ArrayList<>(); + LocalDateTime eventTime = null; + String tag = null; + String id = IdUtil.fastSimpleUUID(); + //获取装置id + CsEquipmentDeliveryPO po = equipmentFeignClient.findDevByNDid(appEventMessage.getId()).getData(); + try { + List dataArray = appEventMessage.getMsg().getDataArray(); + for (AppEventMessage.DataArray item : dataArray) { + //事件入库 + CsEventPO csEvent = new CsEventPO(); + csEvent.setId(id); + csEvent.setDeviceId(po.getId()); + csEvent.setProcess(po.getProcess()); + csEvent.setCode(item.getCode()); + eventTime = eventService.timeFormat(item.getDataTimeSec(),item.getDataTimeUSec()); + csEvent.setStartTime(eventTime); + tag = item.getName(); + csEvent.setTag(tag); + csEvent.setType(3); + csEvent.setClDid(appEventMessage.getMsg().getClDid()); + csEvent.setLevel(Integer.parseInt(item.getType())); + csEvent.setCode(item.getCode()); + list1.add(csEvent); + } + if (CollectionUtil.isNotEmpty(list1)){ + csEventService.saveBatch(list1); + } + //推送事件逻辑处理 && cs_event_user入库 && 修改字典中告警事件的编码 + for (AppEventMessage.DataArray item : dataArray) { + if (Objects.isNull(item.getCode())){ + sendEventUtils.sendUser(2,item.getType(),po.getId(),item.getName(),eventTime,id); + } else { + sendEventUtils.sendUser(2,item.getType(),po.getId(),item.getCode(),eventTime,id); + //更新字典信息 + EleEpdPqd eleEpdPqd = epdFeignClient.findByName(item.getName()).getData(); + EleEpdPqdParam.EleEpdPqdUpdateParam updateParam = new EleEpdPqdParam.EleEpdPqdUpdateParam(); + BeanUtils.copyProperties(eleEpdPqd,updateParam); + updateParam.setDefaultValue(item.getCode()); + epdFeignClient.update(updateParam); + } + } + } catch (Exception e) { + CsEventLogs csEventLogs = new CsEventLogs(); + csEventLogs.setDeviceId(po.getId()); + csEventLogs.setStartTime(eventTime); + csEventLogs.setTag(tag); + csEventLogs.setStatus(0); + csEventLogs.setTime(LocalDateTime.now()); + csEventLogs.setRemark(e.getMessage()); + csEventLogsService.save(csEventLogs); + } + } +} diff --git a/iot-analysis/analysis-zl-event/zl-event-boot/src/main/java/com/njcn/zlevent/utils/SendEventUtils.java b/iot-analysis/analysis-zl-event/zl-event-boot/src/main/java/com/njcn/zlevent/utils/SendEventUtils.java index 59bfb83..ce77b14 100644 --- a/iot-analysis/analysis-zl-event/zl-event-boot/src/main/java/com/njcn/zlevent/utils/SendEventUtils.java +++ b/iot-analysis/analysis-zl-event/zl-event-boot/src/main/java/com/njcn/zlevent/utils/SendEventUtils.java @@ -91,10 +91,10 @@ public class SendEventUtils { NoticeUserDto noticeUserDto = new NoticeUserDto(); NoticeUserDto.Payload payload = new NoticeUserDto.Payload(); String content; - eventName = epdFeignClient.findByName(eventName).getData().getShowName(); List result = new ArrayList<>(); //事件处理 if (eventType == 1){ + eventName = epdFeignClient.findByName(eventName).getData().getShowName(); switch (type) { case "1": code = 2; @@ -159,6 +159,7 @@ public class SendEventUtils { else if (eventType == 2){ switch (type) { case "1": + eventName = epdFeignClient.findByName(eventName).getData().getShowName(); //Ⅰ级告警 不推送给用户,推送给业务管理 users = appUserFeignClient.getAdminInfo().getData(); noticeUserDto.setPushClientId(Collections.singletonList(users.get(0).getDevCode())); @@ -172,6 +173,7 @@ public class SendEventUtils { }); break; case "2": + eventName = epdFeignClient.findByName(eventName).getData().getShowName(); case "3": //Ⅱ、Ⅲ级告警推送相关用户及业务管理员 users = getEventUser(devId); @@ -192,7 +194,7 @@ public class SendEventUtils { } noticeUserDto.setTitle("告警事件"); DevDetailDTO devDetailDto = csLedgerFeignclient.queryDevDetail(devId).getData(); - content = devDetailDto.getEngineeringName() + "-" + devDetailDto.getProjectName() + "-" + devDetailDto.getEquipmentName() + "于" + eventTime.format(DatePattern.NORM_DATETIME_MS_FORMATTER) + "发生告警,告警故障编码为:" + eventName; + content = devDetailDto.getEngineeringName() + "-" + devDetailDto.getProjectName() + "-" + devDetailDto.getEquipmentName() + "于" + eventTime.format(DatePattern.NORM_DATETIME_MS_FORMATTER) + "发生告警,告警信息:" + eventName; noticeUserDto.setContent(content); payload.setType(3); payload.setPath("/pages/message/message?type="+payload.getType()); @@ -285,23 +287,4 @@ public class SendEventUtils { return users; } -// public String getPath( Integer type) { -// -// switch (type) { -// case 0: -// return "/pages/message/transient"; -// case 1: -// return "/pages/message/steady"; -// case 2: -// return "/pages/message/run"; -// case 3: -// return "/pages/message/report"; -// -// default: -// break; -// } -// return ""; -// } - - } diff --git a/iot-message/message-boot/src/main/java/com/njcn/message/consumer/AppEventConsumer.java b/iot-message/message-boot/src/main/java/com/njcn/message/consumer/AppEventConsumer.java index 7ec92f7..520b34f 100644 --- a/iot-message/message-boot/src/main/java/com/njcn/message/consumer/AppEventConsumer.java +++ b/iot-message/message-boot/src/main/java/com/njcn/message/consumer/AppEventConsumer.java @@ -9,6 +9,7 @@ import com.njcn.redis.pojo.enums.RedisKeyEnum; import com.njcn.redis.utils.RedisUtil; import com.njcn.system.api.RocketMqLogFeignClient; import com.njcn.system.pojo.po.RocketmqMsgErrorLog; +import com.njcn.zlevent.api.AlarmFeignClient; import com.njcn.zlevent.api.EventFeignClient; import com.njcn.zlevent.api.WaveFeignClient; import lombok.extern.slf4j.Slf4j; @@ -48,6 +49,8 @@ public class AppEventConsumer extends EnhanceConsumerMessageHandler