diff --git a/src/main/java/club/joylink/xiannccda/alert/core/AlertDeviceType.java b/src/main/java/club/joylink/xiannccda/alert/core/AlertDeviceType.java index b0d38c7..853246a 100644 --- a/src/main/java/club/joylink/xiannccda/alert/core/AlertDeviceType.java +++ b/src/main/java/club/joylink/xiannccda/alert/core/AlertDeviceType.java @@ -1,9 +1,5 @@ package club.joylink.xiannccda.alert.core; -import club.joylink.xiannccda.ats.message.line3.device.DeviceType; -import java.util.Arrays; -import lombok.Getter; - public enum AlertDeviceType { /** diff --git a/src/main/java/club/joylink/xiannccda/ats/cache/LineGraphicDataRepository.java b/src/main/java/club/joylink/xiannccda/ats/cache/LineGraphicDataRepository.java index 519ba81..220c7ed 100644 --- a/src/main/java/club/joylink/xiannccda/ats/cache/LineGraphicDataRepository.java +++ b/src/main/java/club/joylink/xiannccda/ats/cache/LineGraphicDataRepository.java @@ -170,6 +170,12 @@ public class LineGraphicDataRepository { lineGraphMap.remove(id); } + public static MessageOrBuilder getDeviceByCodeNotException(int lineId, String code) { + MessageOrBuilder mob = line_code_table.get(lineId, code); + + return mob; + } + public static MessageOrBuilder getDeviceByCode(int lineId, String code) { MessageOrBuilder mob = line_code_table.get(lineId, code); BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotNull(mob, @@ -188,6 +194,7 @@ public class LineGraphicDataRepository { return (T) mob; } + @Deprecated public static T getDeviceById(int lineId, String id, Class cls) { MessageOrBuilder mob = line_id_table.get(lineId, id); BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotNull(mob, diff --git a/src/main/java/club/joylink/xiannccda/ats/warn/AxleSwitchTrackLedAlertListener.java b/src/main/java/club/joylink/xiannccda/ats/warn/AxleSwitchTrackLedAlertListener.java index ab0858b..5ab828d 100644 --- a/src/main/java/club/joylink/xiannccda/ats/warn/AxleSwitchTrackLedAlertListener.java +++ b/src/main/java/club/joylink/xiannccda/ats/warn/AxleSwitchTrackLedAlertListener.java @@ -21,6 +21,7 @@ import club.joylink.xiannccda.service.AlertInfoService; import club.joylink.xiannccda.service.config.DeviceGuardConfigService; import com.google.protobuf.GeneratedMessageV3; import com.google.protobuf.GeneratedMessageV3.Builder; +import com.google.protobuf.MessageOrBuilder; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -44,6 +45,9 @@ public class AxleSwitchTrackLedAlertListener implements AlertSourceEventListener this.alertInfoService = alertInfoService; } + private String getDefaultName(AlertType alertType) { + return String.format("%s", alertType.name()); + } @Override public void accept(SwitchAndTrackLedAlertEvent event) { @@ -100,40 +104,34 @@ public class AxleSwitchTrackLedAlertListener implements AlertSourceEventListener Optional alertInfoOptional = this.alertInfoService.findAreaDevice(alertType, AlertDeviceType.DEVICE_TYPE_TRACK, layoutDeviceId, lineId); Optional alertInfoMostOptional = this.alertInfoService.findAreaDevice(mostType, AlertDeviceType.DEVICE_TYPE_TRACK, layoutDeviceId, lineId); - String customName = this.getCustomName(alertInfoOptional, alertInfoMostOptional, alertType); +// String customName = this.getCustomName(alertInfoOptional, alertInfoMostOptional, alertType); + String alertInfoName = alertInfoOptional.map(DeviceAreaConfig::getAreaName).orElse(this.getDefaultName(alertType)); + String alertInfoMostName = alertInfoMostOptional.map(DeviceAreaConfig::getAreaName).orElse(null); + String ledName = alertType == AlertType.AXLE_LED_RED ? "红光带" : "橙光带"; if (light) { - log.info("光带检测到[{}] 线路[{}] 设备[{}] 告警[{}] 自定义名称[{}]", ledName, lineId, id, alertType.name(), customName); - if (alertManager.putAlterDevice(lineId, customName, id)) { + log.info("光带检测到[{}] 线路[{}] 设备[{}] 告警[{}] 自定义名称[{}]", ledName, lineId, id, alertType.name(), alertInfoName); + if (alertManager.putAlterDevice(lineId, alertInfoName, id)) { String alertMsg = String.format("出现%s设备[%s]", ledName, id); NccAlertInfo alertInfo = this.alertInfoService.createAlert2(alertInfoOptional, alertType, build, alertMsg, section.getCommon().getId(), false); alertManager.emit(alertInfo); } - if (alertInfoMostOptional.isPresent() && alertManager.needMostShow(lineId, customName, overNums)) { - - String warnDevices = alertManager.findAllWarnDevice(lineId, customName); + if (StringUtils.isNotEmpty(alertInfoMostName) && alertManager.needMostShow(lineId, alertInfoMostName, overNums)) { + String warnDevices = alertManager.findAllWarnDevice(lineId, alertInfoMostName); String alertMsg = String.format("%s-出现大面积%s设备[%s]", alertInfoMostOptional.get().getAreaName(), ledName, warnDevices); NccAlertInfo alertInfoMost = this.alertInfoService.createAlert2(alertInfoOptional, mostType, build, alertMsg, section.getCommon().getId(), false); alertManager.emit(alertInfoMost); } } else { - alertManager.removeAlterDevice(lineId, customName, id); - if (StringUtils.isNotEmpty(customName)) { - alertManager.removeAlterDevice(lineId, customName, id); + alertManager.removeAlterDevice(lineId, alertInfoName, id); + if (StringUtils.isNotEmpty(alertInfoMostName)) { + alertManager.removeAlterDevice(lineId, alertInfoMostName, id); } } } - private String getCustomName(Optional alertInfoOpt, Optional alertInfoMostOpt, AlertType alertType) { - String customName = alertInfoMostOpt.map(DeviceAreaConfig::getAreaName).orElse(null); - if (StringUtils.isNotEmpty(customName)) { - return String.format("%s_%s", customName, alertType.name()); - } - return alertInfoOpt.map(DeviceAreaConfig::getAreaName).orElse(alertType.name()); - } - private String findSectionId(int lineId, Section section, String deviceCode) { if (section.getSectionType() == SectionType.TurnoutPhysical) { return section.getCommon().getId(); diff --git a/src/main/java/club/joylink/xiannccda/ats/warn/SwitchLostAlertMonitoringTask.java b/src/main/java/club/joylink/xiannccda/ats/warn/SwitchLostAlertMonitoringTask.java index 1b6fb27..6d956d4 100644 --- a/src/main/java/club/joylink/xiannccda/ats/warn/SwitchLostAlertMonitoringTask.java +++ b/src/main/java/club/joylink/xiannccda/ats/warn/SwitchLostAlertMonitoringTask.java @@ -52,10 +52,15 @@ public class SwitchLostAlertMonitoringTask implements AlertMonitoringTask { switchBuilder.getLineId()); Optional alertInfoMostOpt = this.alertInfoService.findAreaDevice(AlertType.SWITCH_LOST_MOST, AlertDeviceType.DEVICE_TYPE_SWITCH, turnout.getCommon().getId(), switchBuilder.getLineId()); - String customName = this.getCustomName(alertInfoOpt, alertInfoMostOpt); log.info("线路[{}] 道岔[{}] 从监控中移除... 设备状态参数[{}]", switchBuilder.getLineId(), switchBuilder.getId(), switchBuilder); deviceMap.remove(switchBuilder.getId()); - alertManager.removeAlterDevice(switchBuilder.getLineId(), customName, switchBuilder.getId()); + String alertInfoName = alertInfoOpt.map(DeviceAreaConfig::getAreaName).orElse(this.getName()); + String mostName = alertInfoMostOpt.map(DeviceAreaConfig::getAreaName).orElse(null); + alertManager.removeAlterDevice(switchBuilder.getLineId(), alertInfoName, switchBuilder.getId()); + if (StringUtils.isNotEmpty(mostName)) { + alertManager.removeAlterDevice(switchBuilder.getLineId(), mostName, switchBuilder.getId()); + + } } @Override @@ -63,15 +68,44 @@ public class SwitchLostAlertMonitoringTask implements AlertMonitoringTask { return "SWITCH_LOST_ALTER"; } + private void checkDevice(Turnout turnout, Builder savedSwitchBuild) { + int lineId = savedSwitchBuild.getLineId(); + GuardConfig guardConfig = configService.getGuardConfig(lineId); + + Optional alertInfoOpt = this.alertInfoService.findAreaDevice(AlertType.SWITCH_LOST, AlertDeviceType.DEVICE_TYPE_SWITCH, turnout.getCommon().getId(), + savedSwitchBuild.getLineId()); + Optional alertInfoMostOpt = this.alertInfoService.findAreaDevice(AlertType.SWITCH_LOST_MOST, AlertDeviceType.DEVICE_TYPE_SWITCH, turnout.getCommon().getId(), + savedSwitchBuild.getLineId()); + boolean saveIsLost = savedSwitchBuild.getIpSingleSwitchStusLostIndication(); + if (saveIsLost && this.timeOver(savedSwitchBuild.getReceiveTime(), guardConfig.getSwitchLostTimes())) { + log.info("道岔失表超时,准备报警 线路[{}] 设备[{}] 接受时间[{}] 对应地图设备id[{}]", lineId, savedSwitchBuild.getId(), savedSwitchBuild.getReceiveTime(), turnout.getCommon().getId()); + String alertInfoName = alertInfoOpt.map(DeviceAreaConfig::getAreaName).orElse(this.getName()); + //失表超时 + if (alertManager.putAlterDevice(lineId, alertInfoName, savedSwitchBuild.getId())) { + String alertMsg = String.format("设备[%s]失表", savedSwitchBuild.getId()); + NccAlertInfo alertInfo = this.alertInfoService.createAlert2(alertInfoOpt, AlertType.SWITCH_LOST, savedSwitchBuild, alertMsg, turnout.getCommon().getId(), false); + alertManager.emit(alertInfo); + this.deviceMap.remove(savedSwitchBuild.getId()); + } + String mostName = alertInfoMostOpt.map(DeviceAreaConfig::getAreaName).orElse(null); + //检测大面积失表 + if (StringUtils.isNotEmpty(mostName) && alertManager.needMostShow(lineId, mostName, guardConfig.getSwitchLostMostNums())) { + String warnDevices = alertManager.findAllWarnDevice(lineId, mostName); + String alertMsg = String.format("%s-大面积失表设备[%s]", mostName, warnDevices); + NccAlertInfo alertInfo = this.alertInfoService.createAlert2(alertInfoMostOpt, AlertType.SWITCH_LOST_MOST, savedSwitchBuild, alertMsg, turnout.getCommon().getId(), false); + alertManager.emit(alertInfo); + } + } + } @Override public void run() { for (Builder savedSwitchBuild : this.deviceMap.values()) { Integer lineId = savedSwitchBuild.getLineId(); - GuardConfig guardConfig = configService.getGuardConfig(lineId); Turnout turnout = LineGraphicDataRepository.getDeviceByCode(lineId, savedSwitchBuild.getId(), Turnout.class); log.info("道岔失表检测 线路[{}] 设备[{}] 查找对应的地图道岔id[{}]", lineId, savedSwitchBuild.getId(), turnout.getCommon().getId()); - Optional alertInfoOpt = this.alertInfoService.findAreaDevice(AlertType.SWITCH_LOST, AlertDeviceType.DEVICE_TYPE_SWITCH, turnout.getCommon().getId(), + this.checkDevice(turnout, savedSwitchBuild); + /* Optional alertInfoOpt = this.alertInfoService.findAreaDevice(AlertType.SWITCH_LOST, AlertDeviceType.DEVICE_TYPE_SWITCH, turnout.getCommon().getId(), savedSwitchBuild.getLineId()); Optional alertInfoMostOpt = this.alertInfoService.findAreaDevice(AlertType.SWITCH_LOST_MOST, AlertDeviceType.DEVICE_TYPE_SWITCH, turnout.getCommon().getId(), savedSwitchBuild.getLineId()); @@ -95,7 +129,7 @@ public class SwitchLostAlertMonitoringTask implements AlertMonitoringTask { NccAlertInfo alertInfo = this.alertInfoService.createAlert2(alertInfoMostOpt, AlertType.SWITCH_LOST_MOST, savedSwitchBuild, alertMsg, turnout.getCommon().getId(), false); alertManager.emit(alertInfo); } - } + }*/ } } diff --git a/src/main/java/club/joylink/xiannccda/service/config/DeviceAreaConfigService.java b/src/main/java/club/joylink/xiannccda/service/config/DeviceAreaConfigService.java index 0398541..2034f8c 100644 --- a/src/main/java/club/joylink/xiannccda/service/config/DeviceAreaConfigService.java +++ b/src/main/java/club/joylink/xiannccda/service/config/DeviceAreaConfigService.java @@ -1,6 +1,8 @@ package club.joylink.xiannccda.service.config; import club.joylink.xiannccda.alert.core.AlertDeviceType; +import club.joylink.xiannccda.ats.cache.LineGraphicDataRepository; +import club.joylink.xiannccda.ats.message.collect.DeviceStatusDataOperate; import club.joylink.xiannccda.ats.message.line3.device.DeviceType; import club.joylink.xiannccda.dto.alertTip.AlertTipInfoDto; import club.joylink.xiannccda.dto.config.DeviceAreaConfigDto; @@ -16,11 +18,14 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.google.common.base.Joiner; import com.google.common.base.Splitter; import com.google.common.base.Strings; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.collect.Lists; +import com.google.protobuf.MessageOrBuilder; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; @@ -59,8 +64,52 @@ public class DeviceAreaConfigService { } } + private String findDevice(Integer lineId, List deviceIds) { + List errorDevices = Lists.newArrayList(); + + for (String deviceId : deviceIds) { + MessageOrBuilder msgBuild = LineGraphicDataRepository.getDeviceByCodeNotException(lineId, deviceId); + if (Objects.nonNull(msgBuild)) { + String deviceCode = DeviceStatusDataOperate.findFieldVal(msgBuild, "code", String.class); + errorDevices.add(deviceCode); + } else { + errorDevices.add(String.format("id[%s]未找到设备", deviceId)); + } + } + return Joiner.on(",").join(errorDevices); + } + + + private void checkDataForSql(DeviceAreaConfigDto dto, boolean isUpdate) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(DeviceAreaConfig.class); + queryWrapper.eq(DeviceAreaConfig::getDeviceType, dto.getDeviceType()); + queryWrapper.ne(isUpdate, DeviceAreaConfig::getId, dto.getId()); + List lastSqlList = Lists.newArrayList(); + for (String alertType : dto.getAlertTypes()) { + lastSqlList.add(String.format(" find_in_set('%s',%s) > 0 ", alertType, DeviceAreaConfig.ALERT_TYPES)); + } + if (CollectionUtils.isNotEmpty(lastSqlList)) { + StringBuilder queryTypes = new StringBuilder(" and ( "); + queryTypes.append(Joiner.on(" or ").join(lastSqlList)).append(") "); + queryWrapper.last(queryTypes.toString()); + } + + List areaConfigList = this.deviceAreaConfigRepository.list(queryWrapper); + + for (DeviceAreaConfig areaConfig : areaConfigList) { + List dbDatas = Splitter.on(",").splitToList(areaConfig.getData()); + List saveDatas = Lists.newArrayList(dto.getData()); + saveDatas.retainAll(dbDatas); + BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertTrue(CollectionUtils.isEmpty(saveDatas), + String.format("添加重复的设备区域[%s] 设备:%s", areaConfig.getAreaName(), this.findDevice(areaConfig.getLineId(), saveDatas))); + } + } + + public void saveOrUpdate(DeviceAreaConfigDto dto) { BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertTrue(CollectionUtils.isNotEmpty(dto.getAlertTypes()), "绑定数据类型不能为空"); + BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertTrue(CollectionUtils.isNotEmpty(dto.getData()), "绑定数据不能为空"); + boolean isUpdate = false; DeviceAreaConfig areaConfig = this.convertDB(dto); if (Objects.nonNull(dto.getId()) && dto.getId() != 0L) { LambdaQueryWrapper qw = Wrappers.lambdaQuery(DeviceAreaConfig.class); @@ -68,7 +117,10 @@ public class DeviceAreaConfigService { Long counter = this.deviceAreaConfigRepository.count(qw); BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertTrue(counter > 0L, "未找到对应的数据"); areaConfig.setId(dto.getId()); + isUpdate = true; + } + this.checkDataForSql(dto, isUpdate); this.deviceAreaConfigRepository.saveOrUpdate(areaConfig); AREA_CONFIG_CACHE.invalidate(dto.getLineId()); }