From a0a6af1ba1c205a36e22a9a5f72957abda4f2d72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=B9=BE=E7=BF=94?= Date: Mon, 27 Apr 2026 17:26:28 +0800 Subject: [PATCH] =?UTF-8?q?=E9=85=B8=E9=9B=BE=E5=A1=94=E6=8A=A5=E8=AD=A6?= =?UTF-8?q?=E6=8F=90=E9=86=92=E6=A3=80=E6=9F=A5=E5=AE=9A=E6=97=B6=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AcidMistTowerAlarmNotifyProcessor.java | 43 ++++++++ .../feign/IBsTowerReportTaskClient.java | 23 +++++ .../feign/BsTowerReportTaskClientImpl.java | 26 +++++ .../energy/service/IBsTowerReportService.java | 6 ++ .../impl/BsTowerReportServiceImpl.java | 97 +++++++++++++++++++ 5 files changed, 195 insertions(+) create mode 100644 blade-ops/blade-job/src/main/java/org/springblade/job/processor/ehs/AcidMistTowerAlarmNotifyProcessor.java create mode 100644 blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/energy/feign/IBsTowerReportTaskClient.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/feign/BsTowerReportTaskClientImpl.java diff --git a/blade-ops/blade-job/src/main/java/org/springblade/job/processor/ehs/AcidMistTowerAlarmNotifyProcessor.java b/blade-ops/blade-job/src/main/java/org/springblade/job/processor/ehs/AcidMistTowerAlarmNotifyProcessor.java new file mode 100644 index 000000000..31ffd1004 --- /dev/null +++ b/blade-ops/blade-job/src/main/java/org/springblade/job/processor/ehs/AcidMistTowerAlarmNotifyProcessor.java @@ -0,0 +1,43 @@ +package org.springblade.job.processor.ehs; + +import jakarta.annotation.Resource; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springblade.desk.energy.feign.IBsTowerReportTaskClient; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; + +/** + * 酸雾塔报警提醒定时任务处理器 + * 定期检查超过3分钟未处理的酸雾塔报警,并给环保技术员角色发送系统待办提醒 + * + * @author BladeX + */ +@Component +@Data +@Slf4j +public class AcidMistTowerAlarmNotifyProcessor implements BasicProcessor { + + @Resource + private IBsTowerReportTaskClient bsTowerReportTaskClient; + + @Override + public ProcessResult process(TaskContext context) throws Exception { + log.info("========== 开始执行酸雾塔报警提醒检查定时任务 =========="); + log.info("任务参数: {}", context.getJobParams()); + + try { + // 调用Feign客户端检查未处理的报警并发送提醒 + bsTowerReportTaskClient.checkUnprocessedAlarm(); + log.info("酸雾塔报警提醒检查成功"); + } catch (Exception e) { + log.error("酸雾塔报警提醒检查异常", e); + return new ProcessResult(false, "酸雾塔报警提醒检查失败: " + e.getMessage()); + } + + log.info("========== 酸雾塔报警提醒检查定时任务执行完毕 =========="); + return new ProcessResult(true); + } +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/energy/feign/IBsTowerReportTaskClient.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/energy/feign/IBsTowerReportTaskClient.java new file mode 100644 index 000000000..35dcbc234 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/energy/feign/IBsTowerReportTaskClient.java @@ -0,0 +1,23 @@ +package org.springblade.desk.energy.feign; + +import org.springblade.core.launch.constant.AppConstant; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * 酸雾塔报警提醒Feign客户端接口 + */ +@FeignClient( + value = AppConstant.APPLICATION_DESK_NAME +) +public interface IBsTowerReportTaskClient { + + String API_PREFIX = "/feign/client/bs-tower-report"; + String CHECK_UNPROCESSED_ALARM = API_PREFIX + "/check-unprocessed-alarm"; + + /** + * 检查未处理的酸雾塔报警并发送提醒 + */ + @GetMapping(CHECK_UNPROCESSED_ALARM) + void checkUnprocessedAlarm(); +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/feign/BsTowerReportTaskClientImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/feign/BsTowerReportTaskClientImpl.java new file mode 100644 index 000000000..7f654cd2e --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/feign/BsTowerReportTaskClientImpl.java @@ -0,0 +1,26 @@ +package org.springblade.desk.energy.feign; + +import io.swagger.v3.oas.annotations.Hidden; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springblade.desk.energy.service.IBsTowerReportService; +import org.springframework.web.bind.annotation.RestController; + +/** + * 酸雾塔报警提醒Feign客户端实现 + */ +@RestController +@Hidden +@Slf4j +public class BsTowerReportTaskClientImpl implements IBsTowerReportTaskClient { + + @Resource + private IBsTowerReportService bsTowerReportService; + + @Override + public void checkUnprocessedAlarm() { + log.info("开始检查未处理的酸雾塔报警..."); + bsTowerReportService.checkUnprocessedAlarmAndNotify(); + log.info("酸雾塔报警检查完成"); + } +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsTowerReportService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsTowerReportService.java index 62246059f..fdc508b6c 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsTowerReportService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsTowerReportService.java @@ -64,4 +64,10 @@ public interface IBsTowerReportService extends BaseService BsTowerReportEntity getTowerReportByTerm(String pid, Short type, Long id); + + /** + * 检查未处理的酸雾塔报警并发送提醒 + * 查询开始时间超过3分钟且dealStatus=false的记录,给环保技术员角色发送系统待办提醒 + */ + void checkUnprocessedAlarmAndNotify(); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsTowerReportServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsTowerReportServiceImpl.java index 4aef1f54b..11eb0a012 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsTowerReportServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsTowerReportServiceImpl.java @@ -29,7 +29,11 @@ package org.springblade.desk.energy.service.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.desk.common.feign.IMesNotifyMessageClient; +import org.springblade.desk.common.pojo.entity.MesNotifyMessageEntity; import org.springblade.desk.energy.excel.BsTowerReportExcel; import org.springblade.desk.energy.mapper.BsTowerReportMapper; import org.springblade.desk.energy.pojo.entity.BsTowerEntity; @@ -40,11 +44,14 @@ import org.springblade.desk.energy.pojo.vo.BsTowerReportVO; import org.springblade.desk.energy.service.IBsTowerReportService; import org.springblade.desk.energy.service.IBsTowerService; import org.springblade.desk.energy.service.IEpTowerRecAlarmService; +import org.springblade.core.tool.api.R; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseServiceImpl; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -56,12 +63,15 @@ import java.util.Objects; * @author BladeX * @since 2025-12-24 */ +@Slf4j @Service public class BsTowerReportServiceImpl extends BaseServiceImpl implements IBsTowerReportService { @Resource IBsTowerService iBsTowerService; @Resource IEpTowerRecAlarmService iEpTowerRecAlarmService; + @Resource + IMesNotifyMessageClient mesNotifyMessageClient; @Override public IPage selectBsTowerReportPage(IPage page, BsTowerReportVO bsTowerReport) { if(StringUtils.isNotEmpty(bsTowerReport.getQueryBtDate())){ @@ -148,5 +158,92 @@ public class BsTowerReportServiceImpl extends BaseServiceImpl unprocessedAlarms = list( + Wrappers.lambdaQuery(BsTowerReportEntity.class) + .lt(BsTowerReportEntity::getStartTime, threeMinutesAgoDate) + .eq(BsTowerReportEntity::getDealStatus, "false") // 使用字符串而非布尔值 + .isNotNull(BsTowerReportEntity::getStartTime) + ); + + if (unprocessedAlarms == null || unprocessedAlarms.isEmpty()) { + log.info("没有发现超过3分钟未处理的酸雾塔报警"); + return; + } + + log.info("发现 {} 条超过3分钟未处理的酸雾塔报警", unprocessedAlarms.size()); + + // 获取环保技术员角色ID + Long environmentalTechnicianRoleId = 0L; + String roleName = "环保技术员"; + + // 为每条未处理的报警记录发送提醒(只发送一次) + for (BsTowerReportEntity alarm : unprocessedAlarms) { + try { + // 构建通知消息 + String title = String.format("酸雾塔报警提醒 - %s", + StringUtils.isNotBlank(alarm.getBtCode()) ? alarm.getBtCode() : "未知设备"); + + String content = String.format( + "酸雾塔报警详情:\n" + + "- 编码:%s\n" + + "- 错误点:%s\n" + + "- 消息文本:%s\n" + + "- 开始时间:%s\n" + + "- 持续时间:已超过3分钟未处理", + StringUtils.defaultIfBlank(alarm.getBtCode(), "未知"), + StringUtils.defaultIfBlank(alarm.getErrorPoint(), "未知"), + StringUtils.defaultIfBlank(alarm.getMessText(), "无"), + alarm.getStartTime() + ); + + // 创建通知消息实体 + MesNotifyMessageEntity notifyMessage = MesNotifyMessageEntity.builder() + .title(title) + .content(content) + .receiveRoleId(environmentalTechnicianRoleId) + .receiveRoleName(roleName) + .receiveUserId(AuthUtil.getUserId()) + .build(); + + // 调用Feign客户端保存通知消息 + R result = mesNotifyMessageClient.save(notifyMessage); + + if (result != null && result.isSuccess()) { + log.info("D,报警ID: {}, 编码: {}", alarm.getId(), alarm.getBtCode()); + } else { + log.error("发送酸雾塔报警提醒失败,报警ID: {}, 错误信息: {}", + alarm.getId(), result != null ? result.getMsg() : "返回结果为空"); + } + + } catch (Exception e) { + log.error("处理酸雾塔报警提醒时发生异常,报警ID: {}", alarm.getId(), e); + } + } + + log.info("========== 酸雾塔报警检查完成,共处理 {} 条记录 ==========", unprocessedAlarms.size()); + + } catch (Exception e) { + log.error("检查酸雾塔报警时发生异常", e); + throw new RuntimeException("检查酸雾塔报警失败: " + e.getMessage(), e); + } + } + }