|
|
@ -1,7 +1,8 @@ |
|
|
|
package com.hnac.hzims.operational.alert.service.impl; |
|
|
|
package com.hnac.hzims.operational.alert.service.impl; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
|
|
|
import com.hnac.hzims.message.MessageConstants; |
|
|
|
import com.hnac.hzims.message.MessageConstants; |
|
|
|
import com.hnac.hzims.message.dto.MessagePushRecordDto; |
|
|
|
import com.hnac.hzims.message.dto.BusinessMessageDTO; |
|
|
|
import com.hnac.hzims.message.fegin.IMessageClient; |
|
|
|
import com.hnac.hzims.message.fegin.IMessageClient; |
|
|
|
import com.hnac.hzims.operational.alert.constants.AbnormalAlarmConstant; |
|
|
|
import com.hnac.hzims.operational.alert.constants.AbnormalAlarmConstant; |
|
|
|
import com.hnac.hzims.operational.alert.entity.AbnormalAlarmEntity; |
|
|
|
import com.hnac.hzims.operational.alert.entity.AbnormalAlarmEntity; |
|
|
@ -24,6 +25,7 @@ import org.springblade.core.tool.utils.CollectionUtil; |
|
|
|
import org.springblade.core.tool.utils.DateUtil; |
|
|
|
import org.springblade.core.tool.utils.DateUtil; |
|
|
|
import org.springblade.core.tool.utils.ObjectUtil; |
|
|
|
import org.springblade.core.tool.utils.ObjectUtil; |
|
|
|
import org.springblade.core.tool.utils.StringUtil; |
|
|
|
import org.springblade.core.tool.utils.StringUtil; |
|
|
|
|
|
|
|
import org.springblade.system.entity.Dept; |
|
|
|
import org.springblade.system.feign.ISysClient; |
|
|
|
import org.springblade.system.feign.ISysClient; |
|
|
|
import org.springblade.system.user.entity.User; |
|
|
|
import org.springblade.system.user.entity.User; |
|
|
|
import org.springblade.system.user.feign.IUserClient; |
|
|
|
import org.springblade.system.user.feign.IUserClient; |
|
|
@ -31,8 +33,6 @@ import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
|
|
|
|
import java.time.LocalDateTime; |
|
|
|
import java.time.LocalDateTime; |
|
|
|
import java.util.*; |
|
|
|
import java.util.*; |
|
|
|
import java.util.concurrent.CompletableFuture; |
|
|
|
|
|
|
|
import java.util.function.Function; |
|
|
|
|
|
|
|
import java.util.stream.Collectors; |
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
@ -57,39 +57,57 @@ public class AbnormalAlarmServiceImpl extends BaseServiceImpl<AbnormalAlarmMappe |
|
|
|
private final IMessageClient messageClient; |
|
|
|
private final IMessageClient messageClient; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* 数据中断、数据异常告警 |
|
|
|
* 故障、中断,异常告警数据处理 |
|
|
|
* @param param |
|
|
|
* @param param |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void alarmDataHandle(String param) { |
|
|
|
public void alarmDataHandle(String param) { |
|
|
|
// 查询代运维站点
|
|
|
|
// 查询站点站点
|
|
|
|
List<StationEntity> stations = stationService.list(); |
|
|
|
List<StationEntity> stations = stationService.list(); |
|
|
|
if(CollectionUtil.isEmpty(stations)){ |
|
|
|
if(CollectionUtil.isEmpty(stations)){ |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 查询告警数据: 间隔3分钟
|
|
|
|
SoeQueryConditionByStation query = new SoeQueryConditionByStation(); |
|
|
|
SoeQueryConditionByStation query = new SoeQueryConditionByStation(); |
|
|
|
query.setTypes(AbnormalAlarmConstant.SEND_MESSSAGE_TYPE_LIST); |
|
|
|
query.setTypes(AbnormalAlarmConstant.SEND_MESSSAGE_TYPE_LIST); |
|
|
|
query.setStationIds(stations.stream().map(StationEntity::getCode).collect(Collectors.toList())); |
|
|
|
query.setStationIds(stations.stream().map(StationEntity::getCode).collect(Collectors.toList())); |
|
|
|
Calendar calendar = Calendar.getInstance(); |
|
|
|
Calendar calendar = Calendar.getInstance(); |
|
|
|
query.setEndTime(LocalDateTime.parse(DateUtil.format(calendar.getTime(), DateUtil.PATTERN_DATETIME),DateUtil.DATETIME_FORMATTER)); |
|
|
|
query.setEndTime(LocalDateTime.parse(DateUtil.format(calendar.getTime(), DateUtil.PATTERN_DATETIME),DateUtil.DATETIME_FORMATTER)); |
|
|
|
calendar.add(Calendar.MINUTE,-2); |
|
|
|
calendar.add(Calendar.MINUTE,-3); |
|
|
|
query.setBeginTime(LocalDateTime.parse(DateUtil.format(calendar.getTime() , DateUtil.PATTERN_DATETIME),DateUtil.DATETIME_FORMATTER)); |
|
|
|
query.setBeginTime(LocalDateTime.parse(DateUtil.format(calendar.getTime() , DateUtil.PATTERN_DATETIME),DateUtil.DATETIME_FORMATTER)); |
|
|
|
query.setNeedPage(false); |
|
|
|
query.setNeedPage(false); |
|
|
|
log.error("alarm_data_handle_param : {}",query); |
|
|
|
query.setPage(1); |
|
|
|
|
|
|
|
query.setLimit(100000); |
|
|
|
Result<HzPage<SoeData>> result = soeClient.getByStationsAndTime(query); |
|
|
|
Result<HzPage<SoeData>> result = soeClient.getByStationsAndTime(query); |
|
|
|
// 未查询到告警信息
|
|
|
|
// 未查询到告警信息
|
|
|
|
if(!result.isSuccess() || ObjectUtil.isEmpty(result.getData().getRecords())){ |
|
|
|
if(!result.isSuccess() || ObjectUtil.isEmpty(result.getData()) || CollectionUtil.isEmpty(result.getData().getRecords())) { |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
log.error("alarm_data_handle_begin_result : {}",result.getData().getRecords()); |
|
|
|
|
|
|
|
// 遍历告警信息
|
|
|
|
// 遍历告警信息
|
|
|
|
List<SoeData> list = new ArrayList<>(result.getData().getRecords().stream().sorted(Comparator.comparing(SoeData::getTs).reversed()) |
|
|
|
result.getData().getRecords().forEach(item -> { |
|
|
|
.collect(Collectors.toMap(o -> o.getStation() + o.getSoeType(), Function.identity(), (o1, o2) -> o1)).values()); |
|
|
|
if(!AbnormalAlarmConstant.INTERRUPT_LIST.contains(item.getSoeType())){ |
|
|
|
log.error("alarm_data_handle_end_result : {}",list); |
|
|
|
return; |
|
|
|
list.forEach(item -> { |
|
|
|
} |
|
|
|
|
|
|
|
this.interrupt(stations,item); |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 历史数据处理
|
|
|
|
|
|
|
|
this.saveHistoryAlarm(stations,result.getData().getRecords()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 中断、异常数据处理 |
|
|
|
|
|
|
|
* @param stations |
|
|
|
|
|
|
|
* @param item |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
private void interrupt(List<StationEntity> stations,SoeData item) { |
|
|
|
|
|
|
|
// 查询中断数据
|
|
|
|
AbnormalAlarmEntity queryEntity = this.baseMapper.getAbnormalAlarm(item.getStation(),item.getSoeType()); |
|
|
|
AbnormalAlarmEntity queryEntity = this.baseMapper.getAbnormalAlarm(item.getStation(),item.getSoeType()); |
|
|
|
|
|
|
|
// 是否为中断恢复
|
|
|
|
boolean flag = AbnormalAlarmConstant.ABNORMAL_STATUS.equals(item.getSoeAlarmType()); |
|
|
|
boolean flag = AbnormalAlarmConstant.ABNORMAL_STATUS.equals(item.getSoeAlarmType()); |
|
|
|
|
|
|
|
// 站点名称
|
|
|
|
String stationName = Optional.ofNullable(stations.stream().filter(o-> o.getCode().equals(item.getStation())).collect(Collectors.toList())).map(o->o.get(0).getName()).orElse(null); |
|
|
|
String stationName = Optional.ofNullable(stations.stream().filter(o-> o.getCode().equals(item.getStation())).collect(Collectors.toList())).map(o->o.get(0).getName()).orElse(null); |
|
|
|
|
|
|
|
// 不存在记录进行保存
|
|
|
|
if(ObjectUtil.isEmpty(queryEntity)){ |
|
|
|
if(ObjectUtil.isEmpty(queryEntity)){ |
|
|
|
AbnormalAlarmEntity entity = new AbnormalAlarmEntity(); |
|
|
|
AbnormalAlarmEntity entity = new AbnormalAlarmEntity(); |
|
|
|
entity.setStationId(item.getStation()); |
|
|
|
entity.setStationId(item.getStation()); |
|
|
@ -107,11 +125,9 @@ public class AbnormalAlarmServiceImpl extends BaseServiceImpl<AbnormalAlarmMappe |
|
|
|
} |
|
|
|
} |
|
|
|
// 保存告警信息
|
|
|
|
// 保存告警信息
|
|
|
|
this.save(entity); |
|
|
|
this.save(entity); |
|
|
|
return; |
|
|
|
// 存在记录进行修改
|
|
|
|
} |
|
|
|
}else{ |
|
|
|
queryEntity.setSoeExplain(item.getSoeExplain()); |
|
|
|
queryEntity.setSoeExplain(item.getSoeExplain()); |
|
|
|
queryEntity.setStationName(stationName); |
|
|
|
|
|
|
|
queryEntity.setType(item.getSoeType()); |
|
|
|
|
|
|
|
queryEntity.setStartTime(queryEntity.getStartTime()); |
|
|
|
queryEntity.setStartTime(queryEntity.getStartTime()); |
|
|
|
queryEntity.setUpdateTime(new Date()); |
|
|
|
queryEntity.setUpdateTime(new Date()); |
|
|
|
queryEntity.setEndTime(null); |
|
|
|
queryEntity.setEndTime(null); |
|
|
@ -121,60 +137,46 @@ public class AbnormalAlarmServiceImpl extends BaseServiceImpl<AbnormalAlarmMappe |
|
|
|
queryEntity.setStatus(1); |
|
|
|
queryEntity.setStatus(1); |
|
|
|
} |
|
|
|
} |
|
|
|
this.updateById(queryEntity); |
|
|
|
this.updateById(queryEntity); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 异步保存历史告警
|
|
|
|
|
|
|
|
CompletableFuture.supplyAsync(()-> this.saveHistoryAlarm(result.getData().getRecords(),stations)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 查询实时告警数据 |
|
|
|
|
|
|
|
* @return |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public List<String> getAbnormalAlarmList() { |
|
|
|
|
|
|
|
List<String> alarmList = this.baseMapper.getAbnormalAlarmList(); |
|
|
|
|
|
|
|
if(CollectionUtil.isEmpty(alarmList)){ |
|
|
|
|
|
|
|
return new ArrayList<>(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
return alarmList; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* 保存告警历史信息 |
|
|
|
* 历史数据处理 |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param stations |
|
|
|
* @param list |
|
|
|
* @param list |
|
|
|
* @return |
|
|
|
|
|
|
|
*/ |
|
|
|
*/ |
|
|
|
private String saveHistoryAlarm(List<SoeData> list,List<StationEntity> stations) { |
|
|
|
private void saveHistoryAlarm(List<StationEntity> stations, List<SoeData> list) { |
|
|
|
|
|
|
|
List<HistoryAbnormalAlarmEntity> historys = historyAbnormalAlarmService.list(Wrappers.<HistoryAbnormalAlarmEntity>lambdaQuery() |
|
|
|
|
|
|
|
.in(HistoryAbnormalAlarmEntity::getAlarmId,list.stream().map(SoeData::getId).collect(Collectors.toList())) |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
Set<String> explainSet = new HashSet<>(); |
|
|
|
list.forEach(item->{ |
|
|
|
list.forEach(item->{ |
|
|
|
Date ts = DateUtil.parse(DateUtil.format(item.getTs(),DateUtil.PATTERN_DATETIME),DateUtil.DATETIME_FORMAT); |
|
|
|
if(CollectionUtil.isNotEmpty(historys) && historys.stream().map(HistoryAbnormalAlarmEntity::getAlarmId).collect(Collectors.toList()).contains(item.getId())){ |
|
|
|
// 历史数据异常查询
|
|
|
|
return; |
|
|
|
HistoryAbnormalAlarmEntity queryEntity = this.historyAbnormalAlarmService.getAbnormalAlarm(item.getStation(),item.getSoeType()); |
|
|
|
} |
|
|
|
// 数据中断恢复
|
|
|
|
if(explainSet.contains(item.getSoeExplain())){ |
|
|
|
boolean flag = AbnormalAlarmConstant.ABNORMAL_STATUS.equals(item.getSoeAlarmType()); |
|
|
|
return; |
|
|
|
String stationName = Optional.ofNullable(stations.stream().filter(o-> o.getCode().equals(item.getStation())).collect(Collectors.toList())).map(o->o.get(0).getName()).orElse(null); |
|
|
|
} |
|
|
|
if(ObjectUtil.isEmpty(queryEntity) || !flag){ |
|
|
|
|
|
|
|
HistoryAbnormalAlarmEntity entity = new HistoryAbnormalAlarmEntity(); |
|
|
|
HistoryAbnormalAlarmEntity entity = new HistoryAbnormalAlarmEntity(); |
|
|
|
|
|
|
|
String stationName = Optional.ofNullable(stations.stream().filter(o-> o.getCode().equals(item.getStation())).collect(Collectors.toList())).map(o->o.get(0).getName()).orElse(null); |
|
|
|
entity.setAlarmId(item.getId()); |
|
|
|
entity.setAlarmId(item.getId()); |
|
|
|
entity.setStationId(item.getStation()); |
|
|
|
entity.setStationId(item.getStation()); |
|
|
|
entity.setStationName(stationName); |
|
|
|
entity.setStationName(stationName); |
|
|
|
entity.setRealId(item.getRealId()); |
|
|
|
entity.setRealId(item.getRealId()); |
|
|
|
entity.setSoeExplain(item.getSoeExplain()); |
|
|
|
entity.setSoeExplain(item.getSoeExplain()); |
|
|
|
entity.setType(item.getSoeType()); |
|
|
|
entity.setType(item.getSoeType()); |
|
|
|
entity.setStartTime(ts); |
|
|
|
entity.setStartTime(item.getTs()); |
|
|
|
entity.setStatus(0); |
|
|
|
if(AbnormalAlarmConstant.ABNORMAL_STATUS.equals(item.getSoeAlarmType())){ |
|
|
|
|
|
|
|
entity.setStatus(1); |
|
|
|
|
|
|
|
}else{ |
|
|
|
|
|
|
|
entity.setStatus(1); |
|
|
|
|
|
|
|
} |
|
|
|
this.historyAbnormalAlarmService.save(entity); |
|
|
|
this.historyAbnormalAlarmService.save(entity); |
|
|
|
// 消息推送
|
|
|
|
// 相同告警只允许添加一次,发送一次消息
|
|
|
|
|
|
|
|
explainSet.add(item.getSoeExplain()); |
|
|
|
this.sendAlarmMessage(Collections.singletonList(entity),stations); |
|
|
|
this.sendAlarmMessage(Collections.singletonList(entity),stations); |
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
queryEntity.setSoeExplain(item.getSoeExplain()); |
|
|
|
|
|
|
|
queryEntity.setUpdateTime(new Date()); |
|
|
|
|
|
|
|
queryEntity.setEndTime(ts); |
|
|
|
|
|
|
|
queryEntity.setStatus(1); |
|
|
|
|
|
|
|
this.historyAbnormalAlarmService.updateById(queryEntity); |
|
|
|
|
|
|
|
}); |
|
|
|
}); |
|
|
|
return "success"; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
@ -199,34 +201,62 @@ public class AbnormalAlarmServiceImpl extends BaseServiceImpl<AbnormalAlarmMappe |
|
|
|
if(CollectionUtil.isEmpty(depts)){ |
|
|
|
if(CollectionUtil.isEmpty(depts)){ |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
// 获取站点用户
|
|
|
|
List<User> users = this.parentAuthUser(depts.get(0)); |
|
|
|
R<List<User>> result = userClient.userListByDeptId(depts.get(0)); |
|
|
|
if(CollectionUtil.isEmpty(users)){ |
|
|
|
if(!result.isSuccess() || CollectionUtil.isEmpty(result.getData())){ |
|
|
|
log.error("alarmmessagestation {} user is null",entity.getStationId()); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
MessagePushRecordDto message = new MessagePushRecordDto(); |
|
|
|
BusinessMessageDTO message = new BusinessMessageDTO(); |
|
|
|
|
|
|
|
message.setDeptId(depts.get(0)); |
|
|
|
message.setBusinessClassify("warning"); |
|
|
|
message.setBusinessClassify("warning"); |
|
|
|
|
|
|
|
message.setUserIds(users.stream().map(o->String.valueOf(o.getId())).distinct().collect(Collectors.joining(","))); |
|
|
|
message.setBusinessKey(MessageConstants.BusinessClassifyEnum.WARNING.getKey()); |
|
|
|
message.setBusinessKey(MessageConstants.BusinessClassifyEnum.WARNING.getKey()); |
|
|
|
message.setSubject(MessageConstants.BusinessClassifyEnum.WARNING.getDescription()); |
|
|
|
message.setSubject(MessageConstants.BusinessClassifyEnum.WARNING.getDescription()); |
|
|
|
message.setTaskId(entity.getId()); |
|
|
|
message.setTaskId(entity.getId()); |
|
|
|
message.setTenantId("200000"); |
|
|
|
message.setTenantId("200000"); |
|
|
|
message.setContent(entity.getSoeExplain()); |
|
|
|
message.setContent(entity.getSoeExplain()); |
|
|
|
message.setTypes(Arrays.asList(MessageConstants.APP_PUSH, MessageConstants.WS_PUSH)); |
|
|
|
|
|
|
|
message.setPushType(MessageConstants.IMMEDIATELY); |
|
|
|
|
|
|
|
message.setDeptId(depts.get(0)); |
|
|
|
|
|
|
|
message.setCreateDept(depts.get(0)); |
|
|
|
|
|
|
|
R<String> deptName = sysClient.getDeptName(depts.get(0)); |
|
|
|
R<String> deptName = sysClient.getDeptName(depts.get(0)); |
|
|
|
if (deptName.isSuccess()) { |
|
|
|
if (deptName.isSuccess()) { |
|
|
|
message.setDeptName(deptName.getData()); |
|
|
|
message.setDeptName(deptName.getData()); |
|
|
|
} |
|
|
|
} |
|
|
|
User admin = userClient.userByAccount("200000", "admin").getData(); |
|
|
|
User admin = userClient.userByAccount("200000", "admin").getData(); |
|
|
|
message.setCreateUser(admin.getId()); |
|
|
|
message.setCreateUser(admin.getId()); |
|
|
|
result.getData().forEach(user->{ |
|
|
|
messageClient.sendAppAndWsMsgByUsers(message); |
|
|
|
message.setPusher(String.valueOf(user.getId())); |
|
|
|
|
|
|
|
message.setPusherName(user.getName()); |
|
|
|
|
|
|
|
message.setAccount(String.valueOf(user.getId())); |
|
|
|
|
|
|
|
messageClient.sendMessage(message); |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 获取本级机构或者上级机构用户 |
|
|
|
|
|
|
|
* @param deptId |
|
|
|
|
|
|
|
* @return |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
private List<User> parentAuthUser(Long deptId) { |
|
|
|
|
|
|
|
List<User> users = new ArrayList<>(); |
|
|
|
|
|
|
|
R<List<User>> selfs = userClient.userListByDeptId(deptId); |
|
|
|
|
|
|
|
if(selfs.isSuccess() && CollectionUtil.isNotEmpty(selfs.getData())){ |
|
|
|
|
|
|
|
users.addAll(selfs.getData()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
R<Dept> dept = sysClient.getDept(deptId); |
|
|
|
|
|
|
|
if(dept.isSuccess() && ObjectUtil.isNotEmpty(dept.getData())){ |
|
|
|
|
|
|
|
R<List<User>> parents = userClient.userByDeptId("200000",deptId); |
|
|
|
|
|
|
|
if(parents.isSuccess() && CollectionUtil.isNotEmpty(parents.getData())){ |
|
|
|
|
|
|
|
users.addAll(parents.getData()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return users; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 查询实时告警数据 |
|
|
|
|
|
|
|
* @return |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public List<String> getAbnormalAlarmList() { |
|
|
|
|
|
|
|
List<String> alarmList = this.baseMapper.getAbnormalAlarmList(); |
|
|
|
|
|
|
|
if(CollectionUtil.isEmpty(alarmList)){ |
|
|
|
|
|
|
|
return new ArrayList<>(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return alarmList; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|