package com.ecjtu.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ecjtu.common.constant.AlertResultConstants;
import com.ecjtu.common.constant.AlertTemplateConstants;
import com.ecjtu.common.utils.AlertTemplateUtil;
import com.ecjtu.common.utils.SecurityUtil;
import com.ecjtu.domain.entity.*;
import com.ecjtu.mapper.AlertLogMapper;
import com.ecjtu.mapper.AlertRuleMapper;
import com.ecjtu.mapper.WeatherAlertMapper;
import com.ecjtu.mapper.WeatherStationMapper;
import com.ecjtu.service.WeatherAlertService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
* @Description: 预警信息 业务实现层
* @Author: ZengXueBin
* @Date: 2023/5/4 04:12
*/
@Service
public class WeatherAlertServiceImpl extends ServiceImpl<WeatherAlertMapper, WeatherAlert> implements WeatherAlertService {
@Autowired
private AlertRuleMapper alertRuleMapper;
@Autowired
private WeatherStationMapper stationMapper;
@Autowired
private WeatherAlertMapper weatherAlertMapper;
@Autowired
private AlertLogMapper alertLogMapper;
/**
* 生成预警信息
*
* @param weatherDataList 气象数据列表
*/
@Override
public void processWeatherData(List<WeatherData> weatherDataList) {
// 预警规则
LambdaQueryWrapper<AlertRule> ruleLambdaQueryWrapper = new LambdaQueryWrapper<>();
ruleLambdaQueryWrapper.eq(AlertRule::getAlertStatus, "0");
List<AlertRule> alertRuleList = alertRuleMapper.selectList(ruleLambdaQueryWrapper);
// 按照预警类型分组并排序
Map<String, List<AlertRule>> alertRuleGroups = alertRuleList.stream()
.collect(Collectors.groupingBy(AlertRule::getMetric));
for (WeatherData weatherData : weatherDataList) {
// 遍历每个预警类型的规则组
for (Map.Entry<String, List<AlertRule>> entry : alertRuleGroups.entrySet()) {
List<AlertRule> ruleGroup = entry.getValue();
// 按照优先级升序排列
ruleGroup.sort(Comparator.comparingInt(AlertRule::getPriority));
// 遍历规则组内的规则
for (AlertRule alertRule : ruleGroup) {
if (isConditionSatisfied(weatherData, alertRule)) {
synchronized (this) {
WeatherAlert weatherAlert = generateAlertInfo(weatherData, alertRule);
weatherAlertMapper.insert(weatherAlert);
// 记录日志
recordAlertLog(weatherAlert.getAlertId(), AlertResultConstants.SYSTEM_TRIGGERED);
break;
}
}
}
}
}
}
/**
* 修改预警信息状态
*
* @param alertIds 待处理预警信息
* @param status 预警状态值
*/
@Override
public void updateAlertStatus(List<Long> alertIds, String status) {
if (alertIds.isEmpty()) {
return;
}
String alertIdsString = alertIds.stream()
.map(String::valueOf)
.collect(Collectors.joining(", "));
weatherAlertMapper.updateStatusByIds(alertIdsString, status);
}
/**
* 判断是否满足预警生成的条件
*
* @param weatherData 气象数据
* @param alertRule 预警规则
* @return true=满足 false=不满足
*/
private synchronized boolean isConditionSatisfied(WeatherData weatherData, AlertRule alertRule) {
String metric = alertRule.getMetric();
Float threshold = alertRule.getThreshold();
String operator = alertRule.getOperator();
Object metricValueObj = getMetricValue(weatherData, metric);
Float metricValue = null;
if (metricValueObj instanceof Float) {
metricValue = (Float) metricValueObj;
} else if (metricValueObj instanceof Integer) {
metricValue = ((Integer) metricValueObj).floatValue();
} else {
metricValue = 0.0f;
}
// 判断是否符合
boolean isConditionSatisfied = false;
switch (operator) {
case ">" -> isConditionSatisfied = metricValue > threshold;
case ">=" -> isConditionSatisfied = metricValue >= threshold;
case "<" -> isConditionSatisfied = metricValue < threshold;
case "<=" -> isConditionSatisfied = metricValue <= threshold;
case "=" -> isConditionSatisfied = Objects.equals(metricValue, threshold);
default -> {
}
}
return isConditionSatisfied;
}
/**
* 获取气象数据指标的值
*
* @param weatherData 气象数据
* @param metric 指标
* @return 指标的值
*/
private synchronized Object getMetricValue(WeatherData weatherData, String metric) {
Object value = null;
try {
Field field = WeatherData.class.getDeclaredField(metric);
field.setAccessible(true);
value = field.get(weatherData);
} catch (Exception e) {
throw new RuntimeException(e);
}
return value;
}
/**
* 生成预警信息
*
* @param weatherData 气象数据
* @param alertRule 预警规则
* @return 预警信息
*/
private synchronized WeatherAlert generateAlertInfo(WeatherData weatherData, AlertRule alertRule) {
WeatherAlert weatherAlert = new WeatherAlert();
String[] parts = alertRule.getRuleName().split("-");
String alertTitle = parts[1] + parts[0];
weatherAlert.setAlertTitle(alertTitle);
String metric = alertRule.getMetric();
Object metricValueObj = getMetricValue(weatherData, metric);
Float metricValue = null;
if (metricValueObj instanceof Float) {
metricValue = (Float) metricValueObj;
} else if (metricValueObj instanceof Integer) {
metricValue = ((Integer) metricValueObj).floatValue();
} else {
metricValue = 0.0f;
}
weatherAlert.setTriggerValue(metricValue);
weatherAlert.setAlertRuleId(alertRule.getRuleId());
weatherAlert.setAlertLevel(parts[1]);
weatherAlert.setAlertAreaId(weatherData.getStationNo());
weatherAlert.setAlertType("天气预警");
weatherAlert.setTriggerTime(LocalDateTime.now());
weatherAlert.setStartTime(LocalDateTime.now());
weatherAlert.setEndTime(LocalDateTime.now().plusHours(2));
weatherAlert.setAlertStatus("0");
// 生成预警详情
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日HH时mm分");
String triggerTime = weatherAlert.getTriggerTime().format(formatter);
String startTime = weatherAlert.getStartTime().format(formatter);
String endTime = weatherAlert.getEndTime().format(formatter);
Map<String, String> dataMap = new ConcurrentHashMap<>();
dataMap.put("triggerTime", triggerTime);
WeatherStation weatherStation = stationMapper.selectById(weatherData.getStationNo());
dataMap.put("alertArea", weatherStation.getStationName());
dataMap.put("alertTitle", alertTitle);
dataMap.put("startTime", startTime);
dataMap.put("endTime", endTime);
dataMap.put("alertType", weatherAlert.getAlertType());
String alertDesc = AlertTempla
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于SpringBoot+Vue的气象信息智慧监测管理系统源码+数据库文件(毕业设计).zip 该项目是个人高分毕业设计项目源码,已获导师指导认可通过,都经过严格调试,确保可以运行!放心下载使用。 基于SpringBoot+Vue的气象信息智慧监测管理系统源码+数据库文件(毕业设计).zip 该项目是个人高分毕业设计项目源码,已获导师指导认可通过,都经过严格调试,确保可以运行!放心下载使用。基于SpringBoot+Vue的气象信息智慧监测管理系统源码+数据库文件(毕业设计).zip 该项目是个人高分毕业设计项目源码,已获导师指导认可通过,都经过严格调试,确保可以运行!放心下载使用。基于SpringBoot+Vue的气象信息智慧监测管理系统源码+数据库文件(毕业设计).zip 该项目是个人高分毕业设计项目源码,已获导师指导认可通过,都经过严格调试,确保可以运行!放心下载使用。基于SpringBoot+Vue的气象信息智慧监测管理系统源码+数据库文件(毕业设计).zip 该项目是个人高分毕业设计项目源码,已获导师指导认可通过,都经过严格调试,确保可以运行!放心下载使用。基于Sprin
资源推荐
资源详情
资源评论
收起资源包目录
基于SpringBoot+Vue的气象信息智慧监测管理系统源码+数据库文件(毕业设计).zip (175个子文件)
.gitignore 408B
WeatherAlertServiceImpl.java 9KB
RedisCache.java 7KB
SysMenuServiceImpl.java 7KB
SysDictTypeServiceImpl.java 6KB
TokenService.java 5KB
SysUserController.java 5KB
WeatherDataController.java 5KB
SysDictDataController.java 5KB
AlertReleaseController.java 5KB
SysDictTypeController.java 4KB
SysDpetController.java 4KB
AlertPushServiceImpl.java 4KB
AlertPushController.java 4KB
AlertController.java 4KB
ApiResult.java 4KB
WeatherStationController.java 4KB
WeatherDataServiceImpl.java 3KB
SysLoginController.java 3KB
SysLoginService.java 3KB
PermissionService.java 3KB
SecurityUtil.java 3KB
SecurityConfig.java 3KB
LoginUser.java 3KB
SysMenuController.java 3KB
SysDictDataServiceImpl.java 3KB
ForeCastService.java 3KB
GlobalExceptionHandler.java 3KB
SysUserServiceImpl.java 2KB
UserDetailServiceImpl.java 2KB
SysRegisterService.java 2KB
WeatherData.java 2KB
AlertRuleController.java 2KB
CaptchaController.java 2KB
SecretUtil.java 2KB
CaptchaConfig.java 2KB
ResponseResult.java 2KB
JwtAuthenticationTokenFilter.java 2KB
JsonWebMvcConfigurer.java 2KB
SysUser.java 2KB
NowService.java 2KB
WeatherNowController.java 2KB
WeatherHistoryController.java 2KB
WeatherStationServiceImpl.java 2KB
WeatherHistoryImpl.java 2KB
RedisConfig.java 2KB
WeatherAlert.java 1KB
SysPasswordService.java 1KB
SysPermissionService.java 1KB
AddressUtil.java 1KB
WeatherForecastController.java 1KB
SysMenu.java 1KB
AlertIgnoreController.java 1KB
FastJson2JsonRedisSerializer.java 1KB
SysDeptServiceImpl.java 1KB
AlertRule.java 1KB
SysMenuService.java 1KB
SysRoleServiceImpl.java 1KB
SysDictTypeService.java 1KB
SysRoleController.java 1KB
MybatisPlusConfig.java 1KB
AliSmsConstants.java 1KB
WeatherHistory.java 1KB
WeatherStation.java 1KB
WeatherHistoryMapper.java 1KB
SysRole.java 1KB
WeatherHistoryService.java 1KB
SysDictData.java 1KB
PermissionContextHolder.java 1015B
ProjectConfig.java 961B
WeatherExport.java 956B
HttpStatus.java 950B
AliSmsUtil.java 949B
WeatherAlertService.java 933B
AlertResultConstants.java 925B
AlertStatusConstants.java 915B
SysDept.java 906B
RedisKeyUtil.java 885B
LoginBody.java 877B
MsWebApplicationTests.java 865B
AuthenticationContextHolder.java 820B
WeatherStationService.java 818B
AlertRecipient.java 805B
AlertPush.java 802B
SysDictDataService.java 797B
AlertLog.java 789B
AlertSubscription.java 781B
AlertTemplateUtil.java 770B
SysUserService.java 738B
UserConstants.java 738B
BaseEntity.java 737B
WeatherDataService.java 723B
WeatherStationMapper.java 720B
SysIndexController.java 684B
WeatherAlertMapper.java 651B
SysDictType.java 650B
AirQualityDTO.java 639B
RouterVO.java 628B
Mail.java 607B
CustomException.java 592B
共 175 条
- 1
- 2
资源评论
- 胡宇桐2024-01-05感谢资源主的分享,这个资源对我来说很有用,内容描述详尽,值得借鉴。
- m0_718739702024-01-05非常有用的资源,有一定的参考价值,受益匪浅,值得下载。
- FlowerSeaLHY2024-01-29资源很受用,资源主总结的很全面,内容与描述一致,解决了我当下的问题。
盈梓的博客
- 粉丝: 7040
- 资源: 1605
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功