|
|
|
|
@@ -1,19 +1,21 @@
|
|
|
|
|
package com.njcn.cssystem.service.impl;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
|
|
import cn.hutool.core.date.DatePattern;
|
|
|
|
|
import cn.hutool.core.collection.CollectionUtil;
|
|
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
|
|
import cn.hutool.core.util.IdUtil;
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
|
|
import cn.hutool.core.util.ReflectUtil;
|
|
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
|
import com.alibaba.nacos.shaded.com.google.gson.Gson;
|
|
|
|
|
import com.njcn.access.pojo.dto.NoticeUserDto;
|
|
|
|
|
import com.njcn.access.utils.SendMessageUtil;
|
|
|
|
|
import com.njcn.csdevice.api.CsCommTerminalFeignClient;
|
|
|
|
|
import com.njcn.csdevice.api.CsDeviceUserFeignClient;
|
|
|
|
|
import com.njcn.csdevice.api.CsLineFeignClient;
|
|
|
|
|
import com.njcn.csdevice.pojo.dto.CsLineDTO;
|
|
|
|
|
import com.njcn.csdevice.pojo.param.UserDevParam;
|
|
|
|
|
import com.njcn.csdevice.pojo.po.CsDeviceUserPO;
|
|
|
|
|
import com.njcn.csdevice.pojo.po.CsLinePO;
|
|
|
|
|
import com.njcn.csharmonic.api.*;
|
|
|
|
|
import com.njcn.csharmonic.param.CsEventUserQueryParam;
|
|
|
|
|
import com.njcn.csharmonic.pojo.param.RStatLimitQueryParam;
|
|
|
|
|
@@ -24,10 +26,12 @@ import com.njcn.influx.pojo.po.PqsCommunicate;
|
|
|
|
|
import com.njcn.influx.query.InfluxQueryWrapper;
|
|
|
|
|
import com.njcn.system.api.DictTreeFeignClient;
|
|
|
|
|
import com.njcn.system.enums.DicDataEnum;
|
|
|
|
|
import com.njcn.system.enums.DicTreeEnum;
|
|
|
|
|
import com.njcn.system.pojo.vo.DictTreeVO;
|
|
|
|
|
import com.njcn.user.api.AppInfoSetFeignClient;
|
|
|
|
|
import com.njcn.user.api.AppUserFeignClient;
|
|
|
|
|
import com.njcn.user.api.UserFeignClient;
|
|
|
|
|
import com.njcn.user.pojo.po.User;
|
|
|
|
|
import com.njcn.user.pojo.po.app.AppInfoSet;
|
|
|
|
|
import lombok.AllArgsConstructor;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
|
|
@@ -44,6 +48,8 @@ import java.util.*;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
import java.util.stream.Stream;
|
|
|
|
|
|
|
|
|
|
import static cn.hutool.core.date.DatePattern.NORM_DATE_PATTERN;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @author xy
|
|
|
|
|
@@ -65,6 +71,10 @@ public class DataTaskServiceImpl implements IDataTaskService {
|
|
|
|
|
private final CsAlarmFeignClient csAlarmFeignClient;
|
|
|
|
|
private final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault());
|
|
|
|
|
private final DictTreeFeignClient dictTreeFeignClient;
|
|
|
|
|
private final UserFeignClient userFeignClient;
|
|
|
|
|
private final AppInfoSetFeignClient appInfoSetFeignClient;
|
|
|
|
|
private final SendMessageUtil sendMessageUtil;
|
|
|
|
|
private final CsCommTerminalFeignClient csCommTerminalFeignClient;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
|
@@ -109,7 +119,7 @@ public class DataTaskServiceImpl implements IDataTaskService {
|
|
|
|
|
if (StringUtils.isNotBlank(time)) {
|
|
|
|
|
date = time;
|
|
|
|
|
} else {
|
|
|
|
|
date = DateUtil.yesterday().toString(DatePattern.NORM_DATE_PATTERN);
|
|
|
|
|
date = DateUtil.yesterday().toString(NORM_DATE_PATTERN);
|
|
|
|
|
}
|
|
|
|
|
RStatLimitQueryParam rStatLimitQueryParam = RStatLimitQueryParam.builder().ids(lineList).date(date).endDate(date).build();
|
|
|
|
|
List<RStatLimitRateDPO> limitRates = rStatLimitRateDClient.monitorIdsGetLimitRateInfo(rStatLimitQueryParam).getData();
|
|
|
|
|
@@ -199,7 +209,7 @@ public class DataTaskServiceImpl implements IDataTaskService {
|
|
|
|
|
if (StringUtils.isNotBlank(time)) {
|
|
|
|
|
date = time;
|
|
|
|
|
} else {
|
|
|
|
|
date = DateUtil.yesterday().toString(DatePattern.NORM_DATE_PATTERN);
|
|
|
|
|
date = DateUtil.yesterday().toString(NORM_DATE_PATTERN);
|
|
|
|
|
}
|
|
|
|
|
Map<String, List<String>> map = getDevCommunicate(devList, date + " 00:00:00", date+ " 23:59:59");
|
|
|
|
|
|
|
|
|
|
@@ -290,6 +300,162 @@ public class DataTaskServiceImpl implements IDataTaskService {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void pushAppMsg(String time) {
|
|
|
|
|
//查询所有用户-设备关系
|
|
|
|
|
List<CsDeviceUserPO> relationList = csDeviceUserFeignClient.getList(new UserDevParam()).getData();
|
|
|
|
|
if (CollectionUtil.isNotEmpty(relationList)) {
|
|
|
|
|
//根据时间获取稳态事件
|
|
|
|
|
List<CsHarmonic> harmonicList = csHarmonicFeignClient.queryListByTime(time).getData();
|
|
|
|
|
//根据时间获取告警事件
|
|
|
|
|
List<CsAlarm> alarmList = csAlarmFeignClient.queryListByTime(time).getData();
|
|
|
|
|
|
|
|
|
|
//note 先处理管理员,管理员推送所有设备告警
|
|
|
|
|
List<User> adminAllUser = appUserFeignClient.getAdminInfo().getData();
|
|
|
|
|
List<User> adminUser = adminAllUser.stream()
|
|
|
|
|
.filter(item->item.getDevCode() != null)
|
|
|
|
|
.filter(item-> !Objects.equals(item.getDevCode(), ""))
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
//获取管理员消息推送打开的情况
|
|
|
|
|
if (CollectionUtil.isNotEmpty(adminUser)) {
|
|
|
|
|
List<AppInfoSet> appInfoSetList = appInfoSetFeignClient.getListById(
|
|
|
|
|
adminUser.stream().map(User::getId).collect(Collectors.toList())).getData();
|
|
|
|
|
if (CollectionUtil.isNotEmpty(appInfoSetList)) {
|
|
|
|
|
//需要稳态提示的用户
|
|
|
|
|
List<String> user1 = appInfoSetList.stream()
|
|
|
|
|
.filter(item->Objects.equals(item.getHarmonicInfo(), 1))
|
|
|
|
|
.map(AppInfoSet::getUserId)
|
|
|
|
|
.distinct()
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
//需要暂态提示的用户
|
|
|
|
|
List<String> user2 = appInfoSetList.stream()
|
|
|
|
|
.filter(item->Objects.equals(item.getAlarmInfo(), 1))
|
|
|
|
|
.map(AppInfoSet::getUserId)
|
|
|
|
|
.distinct()
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
// 在 adminUser 中找到对应的用户,提取 devCode
|
|
|
|
|
List<String> harmonicDevCodes = adminUser.stream()
|
|
|
|
|
.filter(user -> user1.contains(user.getId()))
|
|
|
|
|
.map(User::getDevCode)
|
|
|
|
|
.distinct()
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
List<String> alarmDevCodes = adminUser.stream()
|
|
|
|
|
.filter(user -> user2.contains(user.getId()))
|
|
|
|
|
.map(User::getDevCode)
|
|
|
|
|
.distinct()
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
//管理员用户不为空,推送稳态消息
|
|
|
|
|
NoticeUserDto noticeUserDto = new NoticeUserDto();
|
|
|
|
|
if (CollectionUtil.isNotEmpty(harmonicDevCodes) && CollectionUtil.isNotEmpty(harmonicList)) {
|
|
|
|
|
NoticeUserDto.Payload payload = new NoticeUserDto.Payload();
|
|
|
|
|
noticeUserDto.setPushClientId(harmonicDevCodes);
|
|
|
|
|
noticeUserDto.setTitle("稳态事件");
|
|
|
|
|
noticeUserDto.setContent(time + "发生稳态事件"+harmonicList.size()+"次,点击查看详情");
|
|
|
|
|
payload.setType(1);
|
|
|
|
|
payload.setPath("/pages/index/message1?type="+payload.getType());
|
|
|
|
|
noticeUserDto.setPayload(payload);
|
|
|
|
|
sendMessageUtil.sendEventToUser(noticeUserDto);
|
|
|
|
|
}
|
|
|
|
|
//管理员用户不为空,推送告警消息
|
|
|
|
|
if (CollectionUtil.isNotEmpty(alarmDevCodes) && CollectionUtil.isNotEmpty(alarmList)) {
|
|
|
|
|
NoticeUserDto.Payload payload = new NoticeUserDto.Payload();
|
|
|
|
|
noticeUserDto.setPushClientId(alarmDevCodes);
|
|
|
|
|
noticeUserDto.setTitle("告警事件");
|
|
|
|
|
noticeUserDto.setContent(time + "发生告警事件"+alarmList.size()+"次,点击查看详情");
|
|
|
|
|
payload.setType(2);
|
|
|
|
|
payload.setPath("/pages/index/message1?type="+payload.getType());
|
|
|
|
|
noticeUserDto.setPayload(payload);
|
|
|
|
|
sendMessageUtil.sendEventToUser(noticeUserDto);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//note 再处理普通用户,普通用户根据关系来确定哪些设备
|
|
|
|
|
List<String> userIdList = relationList.stream().map(CsDeviceUserPO::getSubUserId).distinct().collect(Collectors.toList());
|
|
|
|
|
List<User> userList = userFeignClient.getUserListByIds(userIdList).getData();
|
|
|
|
|
//获取普通用户 并且 有设备码的用户
|
|
|
|
|
List<User> normalUser = userList.stream()
|
|
|
|
|
.filter(item->item.getDevCode() != null)
|
|
|
|
|
.filter(item-> !Objects.equals(item.getDevCode(), ""))
|
|
|
|
|
.filter(item->item.getType() == 3)
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
//获取普通用户消息推送打开的情况
|
|
|
|
|
if (CollectionUtil.isNotEmpty(normalUser)) {
|
|
|
|
|
List<AppInfoSet> appInfoSetList = appInfoSetFeignClient.getListById(
|
|
|
|
|
normalUser.stream().map(User::getId).collect(Collectors.toList())).getData();
|
|
|
|
|
if (CollectionUtil.isNotEmpty(appInfoSetList)) {
|
|
|
|
|
//需要稳态提示的用户
|
|
|
|
|
List<String> user1 = appInfoSetList.stream()
|
|
|
|
|
.filter(item->Objects.equals(item.getHarmonicInfo(), 1))
|
|
|
|
|
.map(AppInfoSet::getUserId)
|
|
|
|
|
.distinct()
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
//需要暂态提示的用户
|
|
|
|
|
List<String> user2 = appInfoSetList.stream()
|
|
|
|
|
.filter(item->Objects.equals(item.getAlarmInfo(), 1))
|
|
|
|
|
.map(AppInfoSet::getUserId)
|
|
|
|
|
.distinct()
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
// 在 normalUser 中找到对应的用户
|
|
|
|
|
List<User> harmonicUser = normalUser.stream()
|
|
|
|
|
.filter(user -> user1.contains(user.getId()))
|
|
|
|
|
.distinct()
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
List<User> alarmUser = normalUser.stream()
|
|
|
|
|
.filter(user -> user2.contains(user.getId()))
|
|
|
|
|
.distinct()
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
//普通用户不为空,推送稳态消息
|
|
|
|
|
if (CollectionUtil.isNotEmpty(harmonicUser) && CollectionUtil.isNotEmpty(harmonicList)) {
|
|
|
|
|
harmonicUser.forEach(item->{
|
|
|
|
|
//根据用户获取监测点
|
|
|
|
|
List<String> lineIds = csCommTerminalFeignClient.getLineIdsByUser(item.getId()).getData();
|
|
|
|
|
List<CsHarmonic> harmonicData = harmonicList.stream()
|
|
|
|
|
.filter(line -> lineIds.contains(line.getLineId()))
|
|
|
|
|
.distinct()
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
if (CollectionUtil.isNotEmpty(harmonicData)) {
|
|
|
|
|
NoticeUserDto noticeUserDto = new NoticeUserDto();
|
|
|
|
|
NoticeUserDto.Payload payload = new NoticeUserDto.Payload();
|
|
|
|
|
noticeUserDto.setPushClientId(Collections.singletonList(item.getDevCode()));
|
|
|
|
|
noticeUserDto.setTitle("稳态事件");
|
|
|
|
|
noticeUserDto.setContent(time + "发生稳态事件"+harmonicData.size()+"次,点击查看详情");
|
|
|
|
|
payload.setType(1);
|
|
|
|
|
payload.setPath("/pages/index/message1?type="+payload.getType());
|
|
|
|
|
noticeUserDto.setPayload(payload);
|
|
|
|
|
sendMessageUtil.sendEventToUser(noticeUserDto);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
//普通用户不为空,推送暂态消息
|
|
|
|
|
if (CollectionUtil.isNotEmpty(alarmUser) && CollectionUtil.isNotEmpty(alarmList)) {
|
|
|
|
|
alarmUser.forEach(item->{
|
|
|
|
|
//根据用户获取设备
|
|
|
|
|
List<String> devIds = csCommTerminalFeignClient.getDevIdsByUser(item.getId()).getData();
|
|
|
|
|
List<String> alarmDevIds = Arrays.asList(alarmList.get(0).getDevList().split(","));
|
|
|
|
|
//是否存在交集
|
|
|
|
|
boolean hasMatch = !Collections.disjoint(devIds, alarmDevIds);
|
|
|
|
|
if (hasMatch) {
|
|
|
|
|
NoticeUserDto noticeUserDto = new NoticeUserDto();
|
|
|
|
|
NoticeUserDto.Payload payload = new NoticeUserDto.Payload();
|
|
|
|
|
noticeUserDto.setPushClientId(Collections.singletonList(item.getDevCode()));
|
|
|
|
|
noticeUserDto.setTitle("告警事件");
|
|
|
|
|
noticeUserDto.setContent(time + "发生告警事件"+alarmList.size()+"次,点击查看详情");
|
|
|
|
|
payload.setType(2);
|
|
|
|
|
payload.setPath("/pages/index/message1?type="+payload.getType());
|
|
|
|
|
noticeUserDto.setPayload(payload);
|
|
|
|
|
sendMessageUtil.sendEventToUser(noticeUserDto);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 过滤时间间隔,只保留超过指定小时数的时间段
|
|
|
|
|
*
|
|
|
|
|
|