From e7ba886b94831a84ec9082ea505f349d63e52aa4 Mon Sep 17 00:00:00 2001 From: xy <748613696@qq.com> Date: Tue, 7 Apr 2026 09:15:25 +0800 Subject: [PATCH] =?UTF-8?q?App=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapping/CsEquipmentDeliveryMapper.xml | 11 +- .../impl/CsDeviceUserPOServiceImpl.java | 6 +- .../csdevice/service/impl/IcdServiceImpl.java | 3 - .../service/impl/CsEventPOServiceImpl.java | 4 +- cs-system/cs-system-boot/pom.xml | 6 + .../controller/task/DataTaskController.java | 9 +- .../cssystem/service/IDataTaskService.java | 13 ++ .../service/impl/DataTaskServiceImpl.java | 176 +++++++++++++++++- .../java/com/njcn/cssystem/task/DataTask.java | 10 + 9 files changed, 222 insertions(+), 16 deletions(-) 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 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); + } }