19 changed files with 529 additions and 19 deletions
@ -0,0 +1,64 @@ |
|||||||
|
package com.mh.web.controller.alarm; |
||||||
|
|
||||||
|
import com.mh.common.annotation.Log; |
||||||
|
import com.mh.common.core.controller.BaseController; |
||||||
|
import com.mh.common.core.domain.AjaxResult; |
||||||
|
import com.mh.common.core.domain.entity.AlarmRecords; |
||||||
|
import com.mh.common.core.page.TableDataInfo; |
||||||
|
import com.mh.common.enums.BusinessType; |
||||||
|
import com.mh.system.service.operation.IAlarmRecordsService; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.security.access.prepost.PreAuthorize; |
||||||
|
import org.springframework.validation.annotation.Validated; |
||||||
|
import org.springframework.web.bind.annotation.*; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author LJF |
||||||
|
* @version 1.0 |
||||||
|
* @project EEMCS |
||||||
|
* @description 报警记录查询规则 |
||||||
|
* @date 2025-01-14 17:32:55 |
||||||
|
*/ |
||||||
|
@RestController |
||||||
|
@RequestMapping("/alarm/ard") |
||||||
|
public class AlarmRecordsController extends BaseController { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private IAlarmRecordsService alarmRecordsService; |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取报警规则记录列表内容数据 |
||||||
|
*/ |
||||||
|
@PreAuthorize("@ss.hasPermi('system:ard:list')") |
||||||
|
@GetMapping("/list") |
||||||
|
public TableDataInfo list(AlarmRecords alarmRecords) |
||||||
|
{ |
||||||
|
startPage(); |
||||||
|
List<AlarmRecords> list = alarmRecordsService.selectAlarmRecordsList(alarmRecords); |
||||||
|
return getDataTable(list); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 根据报警规则记录id获取详细信息 |
||||||
|
*/ |
||||||
|
@PreAuthorize("@ss.hasPermi('system:ard:query')") |
||||||
|
@GetMapping(value = "/{acdId}") |
||||||
|
public AjaxResult getInfo(@PathVariable String acdId) |
||||||
|
{ |
||||||
|
return success(alarmRecordsService.selectAlarmRecordsById(acdId)); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 删除报警规则记录管理 |
||||||
|
*/ |
||||||
|
@PreAuthorize("@ss.hasPermi('system:ard:remove')") |
||||||
|
@Log(title = "报警规则记录管理", businessType = BusinessType.DELETE) |
||||||
|
@DeleteMapping("/{acdIds}") |
||||||
|
public AjaxResult remove(@PathVariable String[] acdIds) |
||||||
|
{ |
||||||
|
return toAjax(alarmRecordsService.deleteAlarmRecordsByIds(acdIds)); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,44 @@ |
|||||||
|
package com.mh.common.utils; |
||||||
|
|
||||||
|
import java.math.BigDecimal; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.function.BiPredicate; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author LJF |
||||||
|
* @version 1.0 |
||||||
|
* @project EEMCS |
||||||
|
* @description 数据比较值 |
||||||
|
* @date 2025-02-21 15:56:56 |
||||||
|
*/ |
||||||
|
public class BigDecimalUtils { |
||||||
|
// 定义运算符与比较逻辑的映射
|
||||||
|
private static final Map<String, BiPredicate<BigDecimal, BigDecimal>> OPERATORS = new HashMap<>(); |
||||||
|
|
||||||
|
static { |
||||||
|
// 初始化支持的运算符
|
||||||
|
OPERATORS.put(">", (a, b) -> a.compareTo(b) > 0); |
||||||
|
OPERATORS.put(">=", (a, b) -> a.compareTo(b) >= 0); |
||||||
|
OPERATORS.put("<", (a, b) -> a.compareTo(b) < 0); |
||||||
|
OPERATORS.put("<=", (a, b) -> a.compareTo(b) <= 0); |
||||||
|
OPERATORS.put("==", (a, b) -> a.compareTo(b) == 0); |
||||||
|
OPERATORS.put("!=", (a, b) -> a.compareTo(b) != 0); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 根据运算符比较两个 BigDecimal |
||||||
|
* @param operator 运算符(如 ">", ">=") |
||||||
|
* @param a 第一个数值 |
||||||
|
* @param b 第二个数值 |
||||||
|
* @return 比较结果 |
||||||
|
* @throws IllegalArgumentException 如果运算符无效 |
||||||
|
*/ |
||||||
|
public static boolean compare(String operator, BigDecimal a, BigDecimal b) { |
||||||
|
BiPredicate<BigDecimal, BigDecimal> predicate = OPERATORS.get(operator); |
||||||
|
if (predicate == null) { |
||||||
|
throw new IllegalArgumentException("不支持的运算符: " + operator); |
||||||
|
} |
||||||
|
return predicate.test(a, b); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,111 @@ |
|||||||
|
package com.mh.quartz.task; |
||||||
|
|
||||||
|
import com.mh.common.core.domain.entity.AlarmCode; |
||||||
|
import com.mh.common.core.domain.entity.AlarmRecords; |
||||||
|
import com.mh.common.core.domain.entity.AlarmRules; |
||||||
|
import com.mh.common.core.domain.entity.CollectionParamsManage; |
||||||
|
import com.mh.common.utils.BigDecimalUtils; |
||||||
|
import com.mh.common.utils.DateUtils; |
||||||
|
import com.mh.system.service.device.ICollectionParamsManageService; |
||||||
|
import com.mh.system.service.operation.IAlarmCodeService; |
||||||
|
import com.mh.system.service.operation.IAlarmRecordsService; |
||||||
|
import com.mh.system.service.operation.IAlarmRulesService; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
|
||||||
|
import java.math.BigDecimal; |
||||||
|
import java.util.Date; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @author LJF |
||||||
|
* @version 1.0 |
||||||
|
* @project EEMCS |
||||||
|
* @description 创建报警记录 |
||||||
|
* @date 2025-02-21 08:48:48 |
||||||
|
*/ |
||||||
|
@Slf4j |
||||||
|
@Component("createAlarmTask") |
||||||
|
public class CreateAlarmTask { |
||||||
|
|
||||||
|
private final IAlarmRulesService alarmRulesService; |
||||||
|
|
||||||
|
private final IAlarmCodeService alarmCodeService; |
||||||
|
|
||||||
|
private final ICollectionParamsManageService collectionParamsManageService; |
||||||
|
|
||||||
|
private final IAlarmRecordsService alarmRecordService; |
||||||
|
|
||||||
|
@Autowired |
||||||
|
public CreateAlarmTask(IAlarmRulesService alarmRulesService, IAlarmCodeService alarmCodeService, ICollectionParamsManageService collectionParamsManageService, IAlarmRecordsService alarmRecordService) { |
||||||
|
this.alarmRulesService = alarmRulesService; |
||||||
|
this.alarmCodeService = alarmCodeService; |
||||||
|
this.collectionParamsManageService = collectionParamsManageService; |
||||||
|
this.alarmRecordService = alarmRecordService; |
||||||
|
} |
||||||
|
|
||||||
|
public void createAlarmTask() { |
||||||
|
log.info("创建报警记录"); |
||||||
|
// 查询仪表报警规则记录,查看哪些规则启用了
|
||||||
|
List<AlarmRules> alarmRules = alarmRulesService.selectAlarmRulesListByStatus(0); |
||||||
|
// 循环查询报警规则,判断是否满足报警条件
|
||||||
|
for (AlarmRules alarmRule : alarmRules) { |
||||||
|
// 判断报警类型
|
||||||
|
if ("0".equals(alarmRule.getAlarmType())) { |
||||||
|
// 当前是越限事件
|
||||||
|
// 查询事件类型查询对应的报警模板内容
|
||||||
|
AlarmCode alarmCode = alarmCodeService.selectAlarmCodeByAlarmType(alarmRule.getEventType()); |
||||||
|
// 获取当前采集参数值
|
||||||
|
CollectionParamsManage collectionParamsManage = collectionParamsManageService.selectCollectionParamsManageById(alarmRule.getCpmId()); |
||||||
|
// 判断当前值是否是当前事件
|
||||||
|
AlarmRecords alarmRecords = new AlarmRecords(); |
||||||
|
BigDecimal curValue = collectionParamsManage.getCurValue(); |
||||||
|
Date curTime = collectionParamsManage.getCurTime(); |
||||||
|
// 阈值
|
||||||
|
String threshold1 = alarmRule.getThreshold1(); |
||||||
|
if (alarmRule.getTimePeriodSet() == 0 && DateUtils.isSameDay(curTime, new Date())) { |
||||||
|
// 执行相关操作
|
||||||
|
insertOrUpdateRecord(alarmRule, curValue, threshold1, alarmCode, alarmRecords, collectionParamsManage); |
||||||
|
} else if (alarmRule.getTimePeriodSet() == 1 |
||||||
|
&& DateUtils.isSameDay(collectionParamsManage.getCurTime(), new Date()) |
||||||
|
&& DateUtils.isCurrentTimeInRange(alarmRule.getBeginTime(), alarmRule.getEndTime(), curTime) |
||||||
|
) { |
||||||
|
// 执行相关操作
|
||||||
|
insertOrUpdateRecord(alarmRule, curValue, threshold1, alarmCode, alarmRecords, collectionParamsManage); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private void insertOrUpdateRecord(AlarmRules alarmRule, BigDecimal curValue, String threshold1, AlarmCode alarmCode, AlarmRecords alarmRecords, CollectionParamsManage collectionParamsManage) { |
||||||
|
boolean compare = BigDecimalUtils.compare(alarmRule.getCondition1(), curValue, new BigDecimal(threshold1)); |
||||||
|
if (compare) { |
||||||
|
// 创建报警记录
|
||||||
|
String content = alarmCode.getMsgContent(); |
||||||
|
content.replace("#{curValue}", curValue.toString()); |
||||||
|
content.replace("#{setValue}", alarmRule.getCondition1() + threshold1); |
||||||
|
alarmRecords.setContent(content); |
||||||
|
alarmRecords.setAlarmType(alarmRule.getAlarmType()); |
||||||
|
alarmRecords.setEventType(alarmRule.getEventType()); |
||||||
|
alarmRecords.setAlarmLevel(alarmRule.getAlarmLevel()); |
||||||
|
alarmRecords.setLedgerId(alarmRule.getLedgerId()); |
||||||
|
alarmRecords.setCpmId(alarmRule.getCpmId()); |
||||||
|
alarmRecords.setDeviceName(alarmRule.getDeviceName()); |
||||||
|
alarmRecords.setCpmName(alarmRule.getCpmName()); |
||||||
|
alarmRecords.setCreateTime(collectionParamsManage.getCurTime()); |
||||||
|
// 判断报警记录是否已经存在
|
||||||
|
AlarmRecords isExits = alarmRecordService.selectIsExist(alarmRecords); |
||||||
|
if (isExits == null) { |
||||||
|
alarmRecordService.insertAlarmRecord(alarmRecords); |
||||||
|
} else { |
||||||
|
// 更新报警记录
|
||||||
|
alarmRecords.setContent(content); |
||||||
|
alarmRecords.setCreateTime(collectionParamsManage.getCurTime()); |
||||||
|
alarmRecordService.updateAlarmRecord(alarmRecords); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
package com.mh.system.mapper.operation; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
import com.mh.common.core.domain.entity.AlarmRecords; |
||||||
|
import org.apache.ibatis.annotations.Mapper; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author LJF |
||||||
|
* @version 1.0 |
||||||
|
* @project EEMCS |
||||||
|
* @description 报警记录mapper |
||||||
|
* @date 2025-02-21 14:14:31 |
||||||
|
*/ |
||||||
|
@Mapper |
||||||
|
public interface AlarmRecordsMapper extends BaseMapper<AlarmRecords> { |
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
package com.mh.system.service.device; |
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSONObject; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author LJF |
||||||
|
* @version 1.0 |
||||||
|
* @project EEMCS |
||||||
|
* @description 室内温湿度查询 |
||||||
|
* @date 2025-02-21 16:32:02 |
||||||
|
*/ |
||||||
|
public interface IIndoorTempMonitorService { |
||||||
|
|
||||||
|
JSONObject getIndoorTempByFloor(String floorId); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
package com.mh.system.service.device.impl; |
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSONObject; |
||||||
|
import com.mh.common.core.domain.entity.CollectionParamsManage; |
||||||
|
import com.mh.system.mapper.device.CollectionParamsManageMapper; |
||||||
|
import com.mh.system.service.device.IIndoorTempMonitorService; |
||||||
|
import jakarta.annotation.Resource; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Objects; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author LJF |
||||||
|
* @version 1.0 |
||||||
|
* @project EEMCS |
||||||
|
* @description 室内温湿度查询实现类 |
||||||
|
* @date 2025-02-21 16:32:23 |
||||||
|
*/ |
||||||
|
@Service |
||||||
|
public class IndoorTempMonitorServiceImpl implements IIndoorTempMonitorService { |
||||||
|
|
||||||
|
@Resource |
||||||
|
private CollectionParamsManageMapper collectionParamsManageMapper; |
||||||
|
|
||||||
|
@Override |
||||||
|
public JSONObject getIndoorTempByFloor(String floorId) { |
||||||
|
// 查询采集类型是温度的参数,采集参数是99
|
||||||
|
List<Map<String, Objects>> collectionParamsManages = collectionParamsManageMapper.selectByParamType(floorId,"99"); |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
package com.mh.system.service.operation; |
||||||
|
|
||||||
|
import com.mh.common.core.domain.entity.AlarmRecords; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author LJF |
||||||
|
* @version 1.0 |
||||||
|
* @project EEMCS |
||||||
|
* @description 报警记录生成 |
||||||
|
* @date 2025-02-21 10:13:37 |
||||||
|
*/ |
||||||
|
public interface IAlarmRecordsService { |
||||||
|
|
||||||
|
AlarmRecords selectIsExist(AlarmRecords alarmRecords); |
||||||
|
|
||||||
|
void insertAlarmRecord(AlarmRecords alarmRecords); |
||||||
|
|
||||||
|
void updateAlarmRecord(AlarmRecords alarmRecords); |
||||||
|
|
||||||
|
List<AlarmRecords> selectAlarmRecordsList(AlarmRecords alarmRecords); |
||||||
|
|
||||||
|
AlarmRecords selectAlarmRecordsById(String acdId); |
||||||
|
|
||||||
|
int deleteAlarmRecordsByIds(String[] acdIds); |
||||||
|
} |
@ -0,0 +1,114 @@ |
|||||||
|
package com.mh.system.service.operation.impl; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
||||||
|
import com.mh.common.core.domain.entity.AlarmRecords; |
||||||
|
import com.mh.system.mapper.operation.AlarmRecordsMapper; |
||||||
|
import com.mh.system.service.operation.IAlarmRecordsService; |
||||||
|
import jakarta.annotation.Resource; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import java.text.SimpleDateFormat; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author LJF |
||||||
|
* @version 1.0 |
||||||
|
* @project EEMCS |
||||||
|
* @description 报警记录实现类 |
||||||
|
* @date 2025-02-21 14:13:13 |
||||||
|
*/ |
||||||
|
@Service |
||||||
|
public class AlarmRecordsServiceImpl implements IAlarmRecordsService { |
||||||
|
|
||||||
|
@Resource |
||||||
|
private AlarmRecordsMapper alarmRecordsMapper; |
||||||
|
|
||||||
|
@Override |
||||||
|
public AlarmRecords selectIsExist(AlarmRecords alarmRecords) { |
||||||
|
QueryWrapper<AlarmRecords> queryWrapper = new QueryWrapper<>(); |
||||||
|
queryWrapper.eq("alarm_type", alarmRecords.getAlarmType()); |
||||||
|
queryWrapper.eq("event_type", alarmRecords.getEventType()); |
||||||
|
queryWrapper.eq("alarm_level", alarmRecords.getAlarmLevel()); |
||||||
|
queryWrapper.eq("ledger_id", alarmRecords.getLedgerId()); |
||||||
|
queryWrapper.eq("cpm_id", alarmRecords.getCpmId()); |
||||||
|
|
||||||
|
// 添加PostgreSQL特有的时间格式判断
|
||||||
|
queryWrapper.apply("to_char(create_time, 'YYYY-MM-DD HH24') = {0}", |
||||||
|
new SimpleDateFormat("yyyy-MM-dd HH").format(alarmRecords.getCreateTime())); |
||||||
|
|
||||||
|
return alarmRecordsMapper.selectOne(queryWrapper); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void insertAlarmRecord(AlarmRecords alarmRecords) { |
||||||
|
alarmRecordsMapper.insert(alarmRecords); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void updateAlarmRecord(AlarmRecords alarmRecords) { |
||||||
|
alarmRecordsMapper.updateById(alarmRecords); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<AlarmRecords> selectAlarmRecordsList(AlarmRecords alarmRecords) { |
||||||
|
if (alarmRecords == null) { |
||||||
|
return List.of(); |
||||||
|
} |
||||||
|
QueryWrapper<AlarmRecords> queryWrapper = new QueryWrapper<>(); |
||||||
|
// 报警类型
|
||||||
|
if (!alarmRecords.getAlarmType().isEmpty()) { |
||||||
|
queryWrapper.eq("alarm_type", alarmRecords.getAlarmType()); |
||||||
|
} |
||||||
|
// 事件类型
|
||||||
|
if (!alarmRecords.getEventType().isEmpty()) { |
||||||
|
queryWrapper.eq("event_type", alarmRecords.getEventType()); |
||||||
|
} |
||||||
|
// 报警等级
|
||||||
|
if (!alarmRecords.getAlarmLevel().isEmpty()) { |
||||||
|
queryWrapper.eq("alarm_level", alarmRecords.getAlarmLevel()); |
||||||
|
} |
||||||
|
// 设备名称
|
||||||
|
if (!alarmRecords.getDeviceName().isEmpty()) { |
||||||
|
queryWrapper.like("device_name", alarmRecords.getDeviceName()); |
||||||
|
} |
||||||
|
// 报警时间
|
||||||
|
if (alarmRecords.getCreateTime() != null) { |
||||||
|
queryWrapper.apply("to_char(create_time, 'YYYY-MM-DD HH24') = {0}", |
||||||
|
new SimpleDateFormat("yyyy-MM-dd HH").format(alarmRecords.getCreateTime())); |
||||||
|
} |
||||||
|
// 台账id
|
||||||
|
if (!alarmRecords.getLedgerId().isEmpty()) { |
||||||
|
queryWrapper.eq("ledger_id", alarmRecords.getLedgerId()); |
||||||
|
} |
||||||
|
// 仪表参数id
|
||||||
|
if (!alarmRecords.getCpmId().isEmpty()) { |
||||||
|
queryWrapper.eq("cpm_id", alarmRecords.getCpmId()); |
||||||
|
} |
||||||
|
// 仪表参数名称
|
||||||
|
if (!alarmRecords.getCpmName().isEmpty()) { |
||||||
|
queryWrapper.like("cpm_name", alarmRecords.getCpmName()); |
||||||
|
} |
||||||
|
// 报警内容
|
||||||
|
if (!alarmRecords.getContent().isEmpty()) { |
||||||
|
queryWrapper.like("content", alarmRecords.getContent()); |
||||||
|
} |
||||||
|
queryWrapper.orderByDesc("create_time"); |
||||||
|
return alarmRecordsMapper.selectList(queryWrapper); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public AlarmRecords selectAlarmRecordsById(String acdId) { |
||||||
|
return alarmRecordsMapper.selectById(acdId); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int deleteAlarmRecordsByIds(String[] acdIds) { |
||||||
|
if (acdIds != null && acdIds.length > 0) { |
||||||
|
for (String acdId : acdIds) { |
||||||
|
alarmRecordsMapper.deleteById(acdId); |
||||||
|
} |
||||||
|
return acdIds.length; |
||||||
|
} |
||||||
|
return 0; |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue