App消息推送调整
This commit is contained in:
@@ -99,9 +99,14 @@
|
||||
<if test="queryParam.process != null and queryParam.process !=''">
|
||||
and process = #{queryParam.process}
|
||||
</if>
|
||||
<if test="queryParam.runStatus != null and queryParam.runStatus !=''">
|
||||
and run_status = #{queryParam.runStatus}
|
||||
</if>
|
||||
<choose>
|
||||
<when test="queryParam.runStatus != null and queryParam.runStatus != ''">
|
||||
AND run_status = #{queryParam.runStatus}
|
||||
</when>
|
||||
<otherwise>
|
||||
AND run_status IN (1,2)
|
||||
</otherwise>
|
||||
</choose>
|
||||
<if test="queryParam.searchValue != null and queryParam.searchValue !=''">
|
||||
and (name like concat('%',#{queryParam.searchValue},'%') or ndid like concat('%',#{queryParam.searchValue},'%'))
|
||||
</if>
|
||||
|
||||
@@ -572,8 +572,10 @@ public class CsDeviceUserPOServiceImpl extends ServiceImpl<CsDeviceUserPOMapper,
|
||||
.eq(CsDeviceUserPO::getSubUserId, param.getUserId())
|
||||
);
|
||||
}
|
||||
queryWrapper.in(CsDeviceUserPO::getDeviceId, param.getList())
|
||||
.eq(CsDeviceUserPO::getStatus, "1");
|
||||
if (CollectionUtil.isNotEmpty(param.getList())) {
|
||||
queryWrapper.in(CsDeviceUserPO::getDeviceId, param.getList());
|
||||
}
|
||||
queryWrapper.eq(CsDeviceUserPO::getStatus, "1");
|
||||
return this.list(queryWrapper);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -659,9 +659,6 @@ class IcdServiceImpl implements IcdService {
|
||||
if (Objects.isNull(item.getLineNo())) {
|
||||
item.setLineNo(item.getClDid() == 0 ? null:item.getClDid());
|
||||
}
|
||||
if (CollectionUtil.isNotEmpty(csEquipmentDeliveryPOS)) {
|
||||
item.setRunStatus(csEquipmentDeliveryPOS.get(0).getRunStatus());
|
||||
}
|
||||
});
|
||||
}
|
||||
vo.setLineInfoList(line);
|
||||
|
||||
@@ -448,12 +448,12 @@ public class CsEventPOServiceImpl extends ServiceImpl<CsEventPOMapper, CsEventPO
|
||||
String content = devDetailDto.getEngineeringName() + "-" + devDetailDto.getProjectName() + "-" + devDetailDto.getEquipmentName() + "于" + time.format(DatePattern.NORM_DATETIME_MS_FORMATTER) + "发生" + eventName;
|
||||
noticeUserDto.setContent(content);
|
||||
payload.setType(0);
|
||||
payload.setPath("/pages/message/message?type="+payload.getType());
|
||||
payload.setPath("/pages/index/message1?type="+payload.getType());
|
||||
noticeUserDto.setPayload(payload);
|
||||
|
||||
if (CollectionUtil.isNotEmpty(noticeUserDto.getPushClientId())) {
|
||||
List<String> filteredList = noticeUserDto.getPushClientId().stream()
|
||||
.filter(Objects::nonNull)
|
||||
.filter(s -> s != null && !s.isEmpty())
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
if (CollectionUtil.isNotEmpty(filteredList)) {
|
||||
|
||||
@@ -78,6 +78,12 @@
|
||||
<version>1.0.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.njcn</groupId>
|
||||
<artifactId>access-api</artifactId>
|
||||
<version>1.0.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
|
||||
@@ -46,6 +46,13 @@ public class DataTaskController extends BaseController {
|
||||
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
||||
}
|
||||
|
||||
|
||||
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
|
||||
@PostMapping("/pushAppMsg")
|
||||
@ApiOperation("app消息推送")
|
||||
public HttpResult<Boolean> pushAppMsg(@RequestParam("time") String time){
|
||||
String methodDescribe = getMethodDescribe("pushAppMsg");
|
||||
dataTaskService.pushAppMsg(time);
|
||||
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -23,4 +23,17 @@ public interface IDataTaskService {
|
||||
*/
|
||||
void channelRunAlarm(String time);
|
||||
|
||||
/**
|
||||
* 推送App消息
|
||||
* 只推送稳态事件、运行告警数据
|
||||
* 1、查询所有用户-设备关系
|
||||
* 2、剔除没有devCode的用户,没有devCode的用户没法推送
|
||||
* 3、剩余用户再筛选 是否打开消息推送,只推送那些打开通知的用户
|
||||
* 4、剩余用户,根据设备查询告警数据
|
||||
* 5、剩余用户,根据监测点查询稳态越限数据
|
||||
* 6、短信模板:2026年4月2日发生稳态事件xx次,点击查看详情;2026年4月2日发生告警事件xx次,点击查看详情;
|
||||
* @param time
|
||||
*/
|
||||
void pushAppMsg(String time);
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 过滤时间间隔,只保留超过指定小时数的时间段
|
||||
*
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.njcn.cssystem.task;
|
||||
|
||||
import cn.hutool.core.date.DatePattern;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import com.njcn.csdevice.api.CsDeviceUserFeignClient;
|
||||
import com.njcn.cssystem.service.IDataTaskService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -19,17 +20,26 @@ import org.springframework.stereotype.Component;
|
||||
public class DataTask {
|
||||
|
||||
private final IDataTaskService taskService;
|
||||
private final CsDeviceUserFeignClient csDeviceUserFeignClient;
|
||||
|
||||
//每天4点计算稳态越限数据
|
||||
@Scheduled(cron = "0 0 4 * * ?")
|
||||
public void csHarmonicJob() {
|
||||
String date = DateUtil.yesterday().toString(DatePattern.NORM_DATE_PATTERN);
|
||||
taskService.channelHarmonic(date);
|
||||
}
|
||||
|
||||
//每天5点计算运行告警数据
|
||||
@Scheduled(cron = "0 0 5 * * ?")
|
||||
public void csAlarmJob() {
|
||||
String date = DateUtil.yesterday().toString(DatePattern.NORM_DATE_PATTERN);
|
||||
taskService.channelRunAlarm(date);
|
||||
}
|
||||
|
||||
//每天10点推送App消息 (稳态事件 告警数据)
|
||||
@Scheduled(cron = "0 0 10 * * ?")
|
||||
public void pushAppMsg() {
|
||||
String date = DateUtil.yesterday().toString(DatePattern.NORM_DATE_PATTERN);
|
||||
taskService.pushAppMsg(date);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user