App消息推送调整

This commit is contained in:
xy
2026-04-07 09:15:25 +08:00
parent c0cccc3479
commit e7ba886b94
9 changed files with 222 additions and 16 deletions

View File

@@ -99,9 +99,14 @@
<if test="queryParam.process != null and queryParam.process !=''"> <if test="queryParam.process != null and queryParam.process !=''">
and process = #{queryParam.process} and process = #{queryParam.process}
</if> </if>
<if test="queryParam.runStatus != null and queryParam.runStatus !=''"> <choose>
and run_status = #{queryParam.runStatus} <when test="queryParam.runStatus != null and queryParam.runStatus != ''">
</if> AND run_status = #{queryParam.runStatus}
</when>
<otherwise>
AND run_status IN (1,2)
</otherwise>
</choose>
<if test="queryParam.searchValue != null and queryParam.searchValue !=''"> <if test="queryParam.searchValue != null and queryParam.searchValue !=''">
and (name like concat('%',#{queryParam.searchValue},'%') or ndid like concat('%',#{queryParam.searchValue},'%')) and (name like concat('%',#{queryParam.searchValue},'%') or ndid like concat('%',#{queryParam.searchValue},'%'))
</if> </if>

View File

@@ -572,8 +572,10 @@ public class CsDeviceUserPOServiceImpl extends ServiceImpl<CsDeviceUserPOMapper,
.eq(CsDeviceUserPO::getSubUserId, param.getUserId()) .eq(CsDeviceUserPO::getSubUserId, param.getUserId())
); );
} }
queryWrapper.in(CsDeviceUserPO::getDeviceId, param.getList()) if (CollectionUtil.isNotEmpty(param.getList())) {
.eq(CsDeviceUserPO::getStatus, "1"); queryWrapper.in(CsDeviceUserPO::getDeviceId, param.getList());
}
queryWrapper.eq(CsDeviceUserPO::getStatus, "1");
return this.list(queryWrapper); return this.list(queryWrapper);
} }
} }

View File

@@ -659,9 +659,6 @@ class IcdServiceImpl implements IcdService {
if (Objects.isNull(item.getLineNo())) { if (Objects.isNull(item.getLineNo())) {
item.setLineNo(item.getClDid() == 0 ? null:item.getClDid()); item.setLineNo(item.getClDid() == 0 ? null:item.getClDid());
} }
if (CollectionUtil.isNotEmpty(csEquipmentDeliveryPOS)) {
item.setRunStatus(csEquipmentDeliveryPOS.get(0).getRunStatus());
}
}); });
} }
vo.setLineInfoList(line); vo.setLineInfoList(line);

View File

@@ -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; String content = devDetailDto.getEngineeringName() + "-" + devDetailDto.getProjectName() + "-" + devDetailDto.getEquipmentName() + "" + time.format(DatePattern.NORM_DATETIME_MS_FORMATTER) + "发生" + eventName;
noticeUserDto.setContent(content); noticeUserDto.setContent(content);
payload.setType(0); payload.setType(0);
payload.setPath("/pages/message/message?type="+payload.getType()); payload.setPath("/pages/index/message1?type="+payload.getType());
noticeUserDto.setPayload(payload); noticeUserDto.setPayload(payload);
if (CollectionUtil.isNotEmpty(noticeUserDto.getPushClientId())) { if (CollectionUtil.isNotEmpty(noticeUserDto.getPushClientId())) {
List<String> filteredList = noticeUserDto.getPushClientId().stream() List<String> filteredList = noticeUserDto.getPushClientId().stream()
.filter(Objects::nonNull) .filter(s -> s != null && !s.isEmpty())
.distinct() .distinct()
.collect(Collectors.toList()); .collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(filteredList)) { if (CollectionUtil.isNotEmpty(filteredList)) {

View File

@@ -78,6 +78,12 @@
<version>1.0.0</version> <version>1.0.0</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>com.njcn</groupId>
<artifactId>access-api</artifactId>
<version>1.0.0</version>
<scope>compile</scope>
</dependency>
</dependencies> </dependencies>

View File

@@ -46,6 +46,13 @@ public class DataTaskController extends BaseController {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe); 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);
}
} }

View File

@@ -23,4 +23,17 @@ public interface IDataTaskService {
*/ */
void channelRunAlarm(String time); 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);
} }

View File

@@ -1,19 +1,21 @@
package com.njcn.cssystem.service.impl; package com.njcn.cssystem.service.impl;
import cn.hutool.core.collection.CollUtil; 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.date.DateUtil;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.alibaba.nacos.shaded.com.google.gson.Gson; 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.CsDeviceUserFeignClient;
import com.njcn.csdevice.api.CsLineFeignClient; import com.njcn.csdevice.api.CsLineFeignClient;
import com.njcn.csdevice.pojo.dto.CsLineDTO; import com.njcn.csdevice.pojo.dto.CsLineDTO;
import com.njcn.csdevice.pojo.param.UserDevParam; import com.njcn.csdevice.pojo.param.UserDevParam;
import com.njcn.csdevice.pojo.po.CsDeviceUserPO; import com.njcn.csdevice.pojo.po.CsDeviceUserPO;
import com.njcn.csdevice.pojo.po.CsLinePO;
import com.njcn.csharmonic.api.*; import com.njcn.csharmonic.api.*;
import com.njcn.csharmonic.param.CsEventUserQueryParam; import com.njcn.csharmonic.param.CsEventUserQueryParam;
import com.njcn.csharmonic.pojo.param.RStatLimitQueryParam; 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.influx.query.InfluxQueryWrapper;
import com.njcn.system.api.DictTreeFeignClient; import com.njcn.system.api.DictTreeFeignClient;
import com.njcn.system.enums.DicDataEnum; import com.njcn.system.enums.DicDataEnum;
import com.njcn.system.enums.DicTreeEnum;
import com.njcn.system.pojo.vo.DictTreeVO; import com.njcn.system.pojo.vo.DictTreeVO;
import com.njcn.user.api.AppInfoSetFeignClient;
import com.njcn.user.api.AppUserFeignClient; 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.User;
import com.njcn.user.pojo.po.app.AppInfoSet;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
@@ -44,6 +48,8 @@ import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import static cn.hutool.core.date.DatePattern.NORM_DATE_PATTERN;
/** /**
* @author xy * @author xy
@@ -65,6 +71,10 @@ public class DataTaskServiceImpl implements IDataTaskService {
private final CsAlarmFeignClient csAlarmFeignClient; private final CsAlarmFeignClient csAlarmFeignClient;
private final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()); private final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault());
private final DictTreeFeignClient dictTreeFeignClient; private final DictTreeFeignClient dictTreeFeignClient;
private final UserFeignClient userFeignClient;
private final AppInfoSetFeignClient appInfoSetFeignClient;
private final SendMessageUtil sendMessageUtil;
private final CsCommTerminalFeignClient csCommTerminalFeignClient;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@@ -109,7 +119,7 @@ public class DataTaskServiceImpl implements IDataTaskService {
if (StringUtils.isNotBlank(time)) { if (StringUtils.isNotBlank(time)) {
date = time; date = time;
} else { } 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(); RStatLimitQueryParam rStatLimitQueryParam = RStatLimitQueryParam.builder().ids(lineList).date(date).endDate(date).build();
List<RStatLimitRateDPO> limitRates = rStatLimitRateDClient.monitorIdsGetLimitRateInfo(rStatLimitQueryParam).getData(); List<RStatLimitRateDPO> limitRates = rStatLimitRateDClient.monitorIdsGetLimitRateInfo(rStatLimitQueryParam).getData();
@@ -199,7 +209,7 @@ public class DataTaskServiceImpl implements IDataTaskService {
if (StringUtils.isNotBlank(time)) { if (StringUtils.isNotBlank(time)) {
date = time; date = time;
} else { } 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"); 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);
}
});
}
}
}
}
}
/** /**
* 过滤时间间隔,只保留超过指定小时数的时间段 * 过滤时间间隔,只保留超过指定小时数的时间段
* *

View File

@@ -2,6 +2,7 @@ package com.njcn.cssystem.task;
import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.njcn.csdevice.api.CsDeviceUserFeignClient;
import com.njcn.cssystem.service.IDataTaskService; import com.njcn.cssystem.service.IDataTaskService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -19,17 +20,26 @@ import org.springframework.stereotype.Component;
public class DataTask { public class DataTask {
private final IDataTaskService taskService; private final IDataTaskService taskService;
private final CsDeviceUserFeignClient csDeviceUserFeignClient;
//每天4点计算稳态越限数据
@Scheduled(cron = "0 0 4 * * ?") @Scheduled(cron = "0 0 4 * * ?")
public void csHarmonicJob() { public void csHarmonicJob() {
String date = DateUtil.yesterday().toString(DatePattern.NORM_DATE_PATTERN); String date = DateUtil.yesterday().toString(DatePattern.NORM_DATE_PATTERN);
taskService.channelHarmonic(date); taskService.channelHarmonic(date);
} }
//每天5点计算运行告警数据
@Scheduled(cron = "0 0 5 * * ?") @Scheduled(cron = "0 0 5 * * ?")
public void csAlarmJob() { public void csAlarmJob() {
String date = DateUtil.yesterday().toString(DatePattern.NORM_DATE_PATTERN); String date = DateUtil.yesterday().toString(DatePattern.NORM_DATE_PATTERN);
taskService.channelRunAlarm(date); 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);
}
} }