diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/mapping/CsEquipmentDeliveryMapper.xml b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/mapping/CsEquipmentDeliveryMapper.xml
index 8381dc9..be94897 100644
--- a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/mapping/CsEquipmentDeliveryMapper.xml
+++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/mapping/CsEquipmentDeliveryMapper.xml
@@ -99,9 +99,14 @@
and process = #{queryParam.process}
-
- and run_status = #{queryParam.runStatus}
-
+
+
+ AND run_status = #{queryParam.runStatus}
+
+
+ AND run_status IN (1,2)
+
+
and (name like concat('%',#{queryParam.searchValue},'%') or ndid like concat('%',#{queryParam.searchValue},'%'))
diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/CsDeviceUserPOServiceImpl.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/CsDeviceUserPOServiceImpl.java
index ca29355..3fc52c6 100644
--- a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/CsDeviceUserPOServiceImpl.java
+++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/CsDeviceUserPOServiceImpl.java
@@ -572,8 +572,10 @@ public class CsDeviceUserPOServiceImpl extends ServiceImpl filteredList = noticeUserDto.getPushClientId().stream()
- .filter(Objects::nonNull)
+ .filter(s -> s != null && !s.isEmpty())
.distinct()
.collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(filteredList)) {
diff --git a/cs-system/cs-system-boot/pom.xml b/cs-system/cs-system-boot/pom.xml
index 137ba9c..10a8b69 100644
--- a/cs-system/cs-system-boot/pom.xml
+++ b/cs-system/cs-system-boot/pom.xml
@@ -78,6 +78,12 @@
1.0.0
compile
+
+ com.njcn
+ access-api
+ 1.0.0
+ compile
+
diff --git a/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/controller/task/DataTaskController.java b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/controller/task/DataTaskController.java
index ddf4271..bfe17c6 100644
--- a/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/controller/task/DataTaskController.java
+++ b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/controller/task/DataTaskController.java
@@ -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 pushAppMsg(@RequestParam("time") String time){
+ String methodDescribe = getMethodDescribe("pushAppMsg");
+ dataTaskService.pushAppMsg(time);
+ return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
+ }
}
diff --git a/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/IDataTaskService.java b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/IDataTaskService.java
index 3315760..a9e60cf 100644
--- a/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/IDataTaskService.java
+++ b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/IDataTaskService.java
@@ -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);
+
}
diff --git a/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/impl/DataTaskServiceImpl.java b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/impl/DataTaskServiceImpl.java
index cb37d70..de3e498 100644
--- a/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/impl/DataTaskServiceImpl.java
+++ b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/impl/DataTaskServiceImpl.java
@@ -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 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> 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 relationList = csDeviceUserFeignClient.getList(new UserDevParam()).getData();
+ if (CollectionUtil.isNotEmpty(relationList)) {
+ //根据时间获取稳态事件
+ List harmonicList = csHarmonicFeignClient.queryListByTime(time).getData();
+ //根据时间获取告警事件
+ List alarmList = csAlarmFeignClient.queryListByTime(time).getData();
+
+ //note 先处理管理员,管理员推送所有设备告警
+ List adminAllUser = appUserFeignClient.getAdminInfo().getData();
+ List adminUser = adminAllUser.stream()
+ .filter(item->item.getDevCode() != null)
+ .filter(item-> !Objects.equals(item.getDevCode(), ""))
+ .collect(Collectors.toList());
+ //获取管理员消息推送打开的情况
+ if (CollectionUtil.isNotEmpty(adminUser)) {
+ List appInfoSetList = appInfoSetFeignClient.getListById(
+ adminUser.stream().map(User::getId).collect(Collectors.toList())).getData();
+ if (CollectionUtil.isNotEmpty(appInfoSetList)) {
+ //需要稳态提示的用户
+ List user1 = appInfoSetList.stream()
+ .filter(item->Objects.equals(item.getHarmonicInfo(), 1))
+ .map(AppInfoSet::getUserId)
+ .distinct()
+ .collect(Collectors.toList());
+ //需要暂态提示的用户
+ List user2 = appInfoSetList.stream()
+ .filter(item->Objects.equals(item.getAlarmInfo(), 1))
+ .map(AppInfoSet::getUserId)
+ .distinct()
+ .collect(Collectors.toList());
+ // 在 adminUser 中找到对应的用户,提取 devCode
+ List harmonicDevCodes = adminUser.stream()
+ .filter(user -> user1.contains(user.getId()))
+ .map(User::getDevCode)
+ .distinct()
+ .collect(Collectors.toList());
+ List 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 userIdList = relationList.stream().map(CsDeviceUserPO::getSubUserId).distinct().collect(Collectors.toList());
+ List userList = userFeignClient.getUserListByIds(userIdList).getData();
+ //获取普通用户 并且 有设备码的用户
+ List 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 appInfoSetList = appInfoSetFeignClient.getListById(
+ normalUser.stream().map(User::getId).collect(Collectors.toList())).getData();
+ if (CollectionUtil.isNotEmpty(appInfoSetList)) {
+ //需要稳态提示的用户
+ List user1 = appInfoSetList.stream()
+ .filter(item->Objects.equals(item.getHarmonicInfo(), 1))
+ .map(AppInfoSet::getUserId)
+ .distinct()
+ .collect(Collectors.toList());
+ //需要暂态提示的用户
+ List user2 = appInfoSetList.stream()
+ .filter(item->Objects.equals(item.getAlarmInfo(), 1))
+ .map(AppInfoSet::getUserId)
+ .distinct()
+ .collect(Collectors.toList());
+ // 在 normalUser 中找到对应的用户
+ List harmonicUser = normalUser.stream()
+ .filter(user -> user1.contains(user.getId()))
+ .distinct()
+ .collect(Collectors.toList());
+ List alarmUser = normalUser.stream()
+ .filter(user -> user2.contains(user.getId()))
+ .distinct()
+ .collect(Collectors.toList());
+
+ //普通用户不为空,推送稳态消息
+ if (CollectionUtil.isNotEmpty(harmonicUser) && CollectionUtil.isNotEmpty(harmonicList)) {
+ harmonicUser.forEach(item->{
+ //根据用户获取监测点
+ List lineIds = csCommTerminalFeignClient.getLineIdsByUser(item.getId()).getData();
+ List 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 devIds = csCommTerminalFeignClient.getDevIdsByUser(item.getId()).getData();
+ List 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);
+ }
+ });
+ }
+ }
+ }
+ }
+ }
+
+
/**
* 过滤时间间隔,只保留超过指定小时数的时间段
*
diff --git a/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/task/DataTask.java b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/task/DataTask.java
index ebb79ed..80acff9 100644
--- a/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/task/DataTask.java
+++ b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/task/DataTask.java
@@ -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);
+ }
}