diff --git a/web-adapter/src/main/java/com/zcloud/web/AlarmRecordController.java b/web-adapter/src/main/java/com/zcloud/web/AlarmRecordController.java index 1ee827b..936db15 100644 --- a/web-adapter/src/main/java/com/zcloud/web/AlarmRecordController.java +++ b/web-adapter/src/main/java/com/zcloud/web/AlarmRecordController.java @@ -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); } diff --git a/web-app/src/main/java/com/zcloud/command/AlarmDisposeAssignExe.java b/web-app/src/main/java/com/zcloud/command/AlarmDisposeAssignExe.java index cdc8575..eab6474 100644 --- a/web-app/src/main/java/com/zcloud/command/AlarmDisposeAssignExe.java +++ b/web-app/src/main/java/com/zcloud/command/AlarmDisposeAssignExe.java @@ -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){ // 发送站内信 diff --git a/web-app/src/main/java/com/zcloud/command/BindSensorExe.java b/web-app/src/main/java/com/zcloud/command/BindSensorExe.java index dd1134e..0de915e 100644 --- a/web-app/src/main/java/com/zcloud/command/BindSensorExe.java +++ b/web-app/src/main/java/com/zcloud/command/BindSensorExe.java @@ -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 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 sensorDeviceIdList = cmd.getDeviceIdList().stream() + .filter(StringUtils::hasText) + .distinct() + .collect(Collectors.toList()); + if (sensorDeviceIdList.isEmpty()) { + return; + } + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(RegionSensorRelDO::getSensorDeviceId, sensorDeviceIdList) + .eq(RegionSensorRelDO::getDeleteEnum, "FALSE") + .ne(RegionSensorRelDO::getFireRegionId, cmd.getFireRegionId()); + List conflictRelList = regionSensorRelRepository.list(wrapper); + if (conflictRelList == null || conflictRelList.isEmpty()) { + return; + } + throw new BizException(buildConflictMessage(sensorDeviceIdList, conflictRelList)); + } + + private String buildConflictMessage(List sensorDeviceIdList, List conflictRelList) { + Map conflictRelMap = new LinkedHashMap<>(); + for (RegionSensorRelDO conflictRel : conflictRelList) { + conflictRelMap.putIfAbsent(conflictRel.getSensorDeviceId(), conflictRel); + } + + Map sensorNameMap = querySensorNameMap(new ArrayList<>(conflictRelMap.keySet())); + List 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 querySensorNameMap(List sensorDeviceIdList) { + if (sensorDeviceIdList == null || sensorDeviceIdList.isEmpty()) { + return new LinkedHashMap<>(); + } + LambdaQueryWrapper 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(); + } } diff --git a/web-client/src/main/java/com/zcloud/dto/SensorDeviceThresholdCmd.java b/web-client/src/main/java/com/zcloud/dto/SensorDeviceThresholdCmd.java index af4f33c..2b3ed0f 100644 --- a/web-client/src/main/java/com/zcloud/dto/SensorDeviceThresholdCmd.java +++ b/web-client/src/main/java/com/zcloud/dto/SensorDeviceThresholdCmd.java @@ -7,6 +7,8 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; +import java.math.BigDecimal; + /** * SensorDeviceThresholdCmd - 传感器设备命令 * @Author wangyan @@ -25,23 +27,23 @@ 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; -} \ No newline at end of file +} diff --git a/web-client/src/main/java/com/zcloud/dto/clientobject/AlarmRecordCO.java b/web-client/src/main/java/com/zcloud/dto/clientobject/AlarmRecordCO.java index 54b13d1..46b497b 100644 --- a/web-client/src/main/java/com/zcloud/dto/clientobject/AlarmRecordCO.java +++ b/web-client/src/main/java/com/zcloud/dto/clientobject/AlarmRecordCO.java @@ -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; diff --git a/web-client/src/main/java/com/zcloud/dto/clientobject/SensorDeviceCO.java b/web-client/src/main/java/com/zcloud/dto/clientobject/SensorDeviceCO.java index c768819..85f92c3 100644 --- a/web-client/src/main/java/com/zcloud/dto/clientobject/SensorDeviceCO.java +++ b/web-client/src/main/java/com/zcloud/dto/clientobject/SensorDeviceCO.java @@ -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; diff --git a/web-domain/src/main/java/com/zcloud/domain/model/SensorDeviceE.java b/web-domain/src/main/java/com/zcloud/domain/model/SensorDeviceE.java index 65e12c8..bce37bc 100644 --- a/web-domain/src/main/java/com/zcloud/domain/model/SensorDeviceE.java +++ b/web-domain/src/main/java/com/zcloud/domain/model/SensorDeviceE.java @@ -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次) diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/AlarmRecordDO.java b/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/AlarmRecordDO.java index 3a977b7..6831d98 100644 --- a/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/AlarmRecordDO.java +++ b/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/AlarmRecordDO.java @@ -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; diff --git a/web-infrastructure/src/main/resources/mapper/AlarmRecordMapper.xml b/web-infrastructure/src/main/resources/mapper/AlarmRecordMapper.xml index 135023f..d57d3ba 100644 --- a/web-infrastructure/src/main/resources/mapper/AlarmRecordMapper.xml +++ b/web-infrastructure/src/main/resources/mapper/AlarmRecordMapper.xml @@ -249,7 +249,7 @@ ast.sensor_type_id, ast.type_name AS sensor_type_name - 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 ar.id = #{id} AND ar.delete_enum = 'FALSE'