fix(alarm): 修复报警记录分配时间设置问题并优化传感器绑定逻辑

main
zhaokai 2026-05-26 11:01:43 +08:00
parent 544a94ada3
commit 3db3063206
9 changed files with 126 additions and 33 deletions

View File

@ -69,7 +69,8 @@ public class AlarmRecordController {
double currentValue = Math.round((Math.random() * 70 + 30) * 100) / 100.0;
AlarmRecordCO alarmRecordCO = new AlarmRecordCO();
// 每往前导10秒时间往前推10秒
alarmRecordCO.setAlarmTime(newDateTime.format(formatter));
// alarmRecordCO.setAlarmTime(newDateTime.format(formatter));
alarmRecordCO.setAlarmTime(newDateTime);
alarmRecordCO.setCurrentValue(BigDecimal.valueOf(currentValue));
alarmRecordCOList.add(alarmRecordCO);
}

View File

@ -76,6 +76,7 @@ public class AlarmDisposeAssignExe {
BeanUtil.copyProperties(cmd, updateEntity);
updateEntity.setId( id);
updateEntity.setAssignTime(assignTime);
updateEntity.setAssignTime(LocalDateTime.now());
alarmRecordGateway.update(updateEntity);
if (cmd.getStatus() == 20){
// 发送站内信

View File

@ -2,25 +2,31 @@ package com.zcloud.command;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.cola.exception.BizException;
import com.zcloud.domain.gateway.DeviceRegionGateway;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zcloud.domain.gateway.RegionSensorRelGateway;
import com.zcloud.domain.model.DeviceRegionE;
import com.zcloud.domain.model.RegionSensorRelE;
import com.zcloud.dto.BindSensorCmd;
import com.zcloud.gbscommon.utils.Tools;
import com.zcloud.gbscommon.utils.UuidUtil;
import com.zcloud.persistence.dataobject.DeviceRegionDO;
import com.zcloud.persistence.dataobject.RegionSensorRelDO;
import com.zcloud.persistence.dataobject.SensorDeviceDO;
import com.zcloud.persistence.repository.DeviceRegionRepository;
import com.zcloud.persistence.repository.RegionSensorRelRepository;
import com.zcloud.persistence.repository.SensorDeviceRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* BindSensorExe -
*
* @Author wangyan
* @Date 2026-04-03 00:00:00
*/
@ -30,16 +36,94 @@ import java.util.List;
public class BindSensorExe {
private final RegionSensorRelGateway regionSensorRelGateway;
private final DeviceRegionGateway deviceRegionGateway;
private final RegionSensorRelRepository regionSensorRelRepository;
private final DeviceRegionRepository deviceRegionRepository;
private final SensorDeviceRepository sensorDeviceRepository;
/**
*
*
* @param cmd
* @throws BizException
*/
@Transactional(rollbackFor = Exception.class)
public void execute(BindSensorCmd cmd) {
// 删除旧数据
validateSensorBindingConflict(cmd);
// 只有全部校验通过,才允许更新当前区域的绑定关系。
regionSensorRelGateway.removeByRegionId(cmd.getFireRegionId());
RegionSensorRelE entity = new RegionSensorRelE();
List<RegionSensorRelE> relList = entity.initList(cmd.getFireRegionId(), cmd.getDeviceIdList());
regionSensorRelRepository.saveBatch(BeanUtil.copyToList(relList, RegionSensorRelDO.class));
}
private void validateSensorBindingConflict(BindSensorCmd cmd) {
if (cmd.getDeviceIdList() == null || cmd.getDeviceIdList().isEmpty()) {
return;
}
List<String> sensorDeviceIdList = cmd.getDeviceIdList().stream()
.filter(StringUtils::hasText)
.distinct()
.collect(Collectors.toList());
if (sensorDeviceIdList.isEmpty()) {
return;
}
LambdaQueryWrapper<RegionSensorRelDO> wrapper = new LambdaQueryWrapper<>();
wrapper.in(RegionSensorRelDO::getSensorDeviceId, sensorDeviceIdList)
.eq(RegionSensorRelDO::getDeleteEnum, "FALSE")
.ne(RegionSensorRelDO::getFireRegionId, cmd.getFireRegionId());
List<RegionSensorRelDO> conflictRelList = regionSensorRelRepository.list(wrapper);
if (conflictRelList == null || conflictRelList.isEmpty()) {
return;
}
throw new BizException(buildConflictMessage(sensorDeviceIdList, conflictRelList));
}
private String buildConflictMessage(List<String> sensorDeviceIdList, List<RegionSensorRelDO> conflictRelList) {
Map<String, RegionSensorRelDO> conflictRelMap = new LinkedHashMap<>();
for (RegionSensorRelDO conflictRel : conflictRelList) {
conflictRelMap.putIfAbsent(conflictRel.getSensorDeviceId(), conflictRel);
}
Map<String, String> sensorNameMap = querySensorNameMap(new ArrayList<>(conflictRelMap.keySet()));
List<String> conflictMessageList = new ArrayList<>();
for (String sensorDeviceId : sensorDeviceIdList) {
RegionSensorRelDO conflictRel = conflictRelMap.get(sensorDeviceId);
if (conflictRel == null) {
continue;
}
String sensorName = sensorNameMap.get(sensorDeviceId);
if (!StringUtils.hasText(sensorName)) {
sensorName = sensorDeviceId;
}
String fireRegionName = queryFireRegionName(conflictRel.getFireRegionId());
if (!StringUtils.hasText(fireRegionName)) {
fireRegionName = conflictRel.getFireRegionId();
}
conflictMessageList.add("传感器【" + sensorName + "】已绑定区域【" + fireRegionName + "】");
}
return "以下传感器已绑定其他区域,请先解绑后再操作:" + String.join("", conflictMessageList);
}
private Map<String, String> querySensorNameMap(List<String> sensorDeviceIdList) {
if (sensorDeviceIdList == null || sensorDeviceIdList.isEmpty()) {
return new LinkedHashMap<>();
}
LambdaQueryWrapper<SensorDeviceDO> wrapper = new LambdaQueryWrapper<>();
wrapper.in(SensorDeviceDO::getSensorDeviceId, sensorDeviceIdList)
.eq(SensorDeviceDO::getDeleteEnum, "FALSE");
return sensorDeviceRepository.list(wrapper).stream()
.collect(Collectors.toMap(SensorDeviceDO::getSensorDeviceId, SensorDeviceDO::getSensorName,
(left, right) -> left, LinkedHashMap::new));
}
private String queryFireRegionName(String fireRegionId) {
DeviceRegionDO deviceRegionDO = deviceRegionRepository.findRegionById(fireRegionId);
if (deviceRegionDO == null) {
return null;
}
return deviceRegionDO.getFireRegionName();
}
}

View File

@ -7,6 +7,8 @@ import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import java.math.BigDecimal;
/**
* SensorDeviceThresholdCmd -
* @Author wangyan
@ -25,22 +27,22 @@ public class SensorDeviceThresholdCmd extends Command {
private String unitName;
@ApiModelProperty(value = "量程下限", name = "rangeMin")
private String rangeMin;
private BigDecimal rangeMin;
@ApiModelProperty(value = "量程上限", name = "rangeMax")
private String rangeMax;
private BigDecimal rangeMax;
@ApiModelProperty(value = "低低报阈值", name = "thresholdLowLow")
private String thresholdLowLow;
private BigDecimal thresholdLowLow;
@ApiModelProperty(value = "低报阈值", name = "thresholdLow")
private String thresholdLow;
private BigDecimal thresholdLow;
@ApiModelProperty(value = "高报阈值", name = "thresholdHigh")
private String thresholdHigh;
private BigDecimal thresholdHigh;
@ApiModelProperty(value = "高高报阈值", name = "thresholdHighHigh")
private String thresholdHighHigh;
private BigDecimal thresholdHighHigh;
@ApiModelProperty(value = "连续报警确认次数", name = "continuousAlarmCount")
private Integer continuousAlarmCount;

View File

@ -7,6 +7,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
/**
@ -97,18 +98,20 @@ public class AlarmRecordCO extends ClientObject {
@ApiModelProperty(value = "报警时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private String alarmTime;
private LocalDateTime alarmTime;
@ApiModelProperty(value = "当前状态 10待研判/20待处置/30已消警/40误报")
private Integer status;
@ApiModelProperty(value = "分配时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private String assignTime;
private LocalDateTime assignTime;
@ApiModelProperty(value = "分配人ID")
private Long assignUserId;
@ApiModelProperty(value = "处置时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private String disposeTime;
private LocalDateTime disposeTime;
@ApiModelProperty(value = "处置人ID")
private Long disposeUserId;

View File

@ -5,8 +5,8 @@ import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
/**
@ -66,22 +66,22 @@ public class SensorDeviceCO extends ClientObject {
private String unitName;
@ApiModelProperty(value = "量程下限")
private String rangeMin;
private BigDecimal rangeMin;
@ApiModelProperty(value = "量程上限")
private String rangeMax;
private BigDecimal rangeMax;
@ApiModelProperty(value = "低低报阈值")
private String thresholdLowLow;
private BigDecimal thresholdLowLow;
@ApiModelProperty(value = "低报阈值")
private String thresholdLow;
private BigDecimal thresholdLow;
@ApiModelProperty(value = "高报阈值")
private String thresholdHigh;
private BigDecimal thresholdHigh;
@ApiModelProperty(value = "高高报阈值")
private String thresholdHighHigh;
private BigDecimal thresholdHighHigh;
@ApiModelProperty(value = "连续报警确认次数")
private Integer continuousAlarmCount;

View File

@ -4,8 +4,8 @@ import com.jjb.saas.framework.domain.model.BaseE;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* SensorDeviceE -
@ -88,32 +88,32 @@ public class SensorDeviceE extends BaseE {
/**
*
*/
private String rangeMin;
private BigDecimal rangeMin;
/**
*
*/
private String rangeMax;
private BigDecimal rangeMax;
/**
*
*/
private String thresholdLowLow;
private BigDecimal thresholdLowLow;
/**
*
*/
private String thresholdLow;
private BigDecimal thresholdLow;
/**
*
*/
private String thresholdHigh;
private BigDecimal thresholdHigh;
/**
*
*/
private String thresholdHighHigh;
private BigDecimal thresholdHighHigh;
/**
* 3

View File

@ -103,6 +103,8 @@ public class AlarmRecordDO extends BaseDO {
@ApiModelProperty(value = "分配时间")
private LocalDateTime assignTime;
@ApiModelProperty(value = "分配人ID")
private Long assignUserId;
@ApiModelProperty(value = "处置时间")
private LocalDateTime disposeTime;

View File

@ -249,7 +249,7 @@
ast.sensor_type_id,
ast.type_name AS sensor_type_name
<include refid="alarmRecordBaseJoins"/>
LEFT JOIN iot_alarm_sensor_type ast ON ast.sensor_type_id = sd.sensor_type_id
LEFT JOIN iot_alarm_sensor_type ast ON ast.id = sd.sensor_type_id
<where>
ar.id = #{id}
AND ar.delete_enum = 'FALSE'