酸雾塔报警提醒检查定时任务

liweidong
张乾翔 2 months ago
parent 57eac8c0b4
commit a0a6af1ba1
  1. 43
      blade-ops/blade-job/src/main/java/org/springblade/job/processor/ehs/AcidMistTowerAlarmNotifyProcessor.java
  2. 23
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/energy/feign/IBsTowerReportTaskClient.java
  3. 26
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/feign/BsTowerReportTaskClientImpl.java
  4. 6
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsTowerReportService.java
  5. 97
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsTowerReportServiceImpl.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);
}
}

@ -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();
}

@ -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("酸雾塔报警检查完成");
}
}

@ -64,4 +64,10 @@ public interface IBsTowerReportService extends BaseService<BsTowerReportEntity>
BsTowerReportEntity getTowerReportByTerm(String pid, Short type, Long id);
/**
* 检查未处理的酸雾塔报警并发送提醒
* 查询开始时间超过3分钟且dealStatus=false的记录给环保技术员角色发送系统待办提醒
*/
void checkUnprocessedAlarmAndNotify();
}

@ -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<BsTowerReportMapper, BsTowerReportEntity> implements IBsTowerReportService {
@Resource
IBsTowerService iBsTowerService;
@Resource
IEpTowerRecAlarmService iEpTowerRecAlarmService;
@Resource
IMesNotifyMessageClient mesNotifyMessageClient;
@Override
public IPage<BsTowerReportVO> selectBsTowerReportPage(IPage<BsTowerReportVO> page, BsTowerReportVO bsTowerReport) {
if(StringUtils.isNotEmpty(bsTowerReport.getQueryBtDate())){
@ -148,5 +158,92 @@ public class BsTowerReportServiceImpl extends BaseServiceImpl<BsTowerReportMappe
return null;
}
/**
* 检查未处理的酸雾塔报警并发送提醒
* 查询开始时间超过3分钟且dealStatus=false的记录给环保技术员角色发送系统待办提醒
*/
@Override
public void checkUnprocessedAlarmAndNotify() {
log.info("========== 开始检查未处理的酸雾塔报警 ==========");
try {
// 计算3分钟前的时间
LocalDateTime threeMinutesAgo = LocalDateTime.now().minusMinutes(3);
Date threeMinutesAgoDate = Date.from(threeMinutesAgo.atZone(ZoneId.systemDefault()).toInstant());
log.info("查询条件: startTime < {} 且 dealStatus = false", threeMinutesAgoDate);
// 查询开始时间超过3分钟且未被处理(dealStatus='false')的报警记录
// 注意:DEAL_STATUS在数据库中是VARCHAR2类型,必须使用字符串比较
List<BsTowerReportEntity> 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);
}
}
}

Loading…
Cancel
Save