| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- package com.zksy.api.service.impl;
- import static com.zksy.common.utils.CollectionSideEffects.*;
- import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
- import com.zksy.api.domain.EquipmentBase;
- import com.zksy.api.domain.EquipmentStatus;
- import com.zksy.api.domain.AlarmData;
- import com.zksy.api.event.DeviceStatusChangePublisher;
- import com.zksy.api.service.CollectionAlarmWriter;
- import com.zksy.api.mapper.EquipmentBaseApiMapper;
- import com.zksy.api.mapper.EquipmentStatusApiMapper;
- import com.zksy.api.service.EquipmentStatusApiService;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- import org.springframework.transaction.support.TransactionSynchronization;
- import org.springframework.transaction.support.TransactionSynchronizationManager;
- import java.time.LocalDateTime;
- import java.util.Objects;
- /**
- * 设备报警状态服务实现
- * 根据设备编码更新 equipment_status 表的报警状态
- */
- @Slf4j
- @Service
- public class EquipmentStatusApiServiceImpl implements EquipmentStatusApiService {
- @Autowired
- private EquipmentBaseApiMapper equipmentBaseApiMapper;
- @Autowired
- private EquipmentStatusApiMapper equipmentStatusApiMapper;
- @Autowired
- private DeviceStatusChangePublisher deviceStatusChangePublisher;
- @Autowired
- private CollectionAlarmWriter collectionAlarmWriter;
- @Override
- @Transactional
- public boolean updateAlarmStatus(String deviceCode, Integer alarmStatus) {
- if (deviceCode == null || deviceCode.isEmpty()) {
- log.warn("更新设备报警状态失败:deviceCode为空");
- return false;
- }
- // 1. 根据设备编码查询设备基础信息,获取 equipmentId
- EquipmentBase equipmentBase = equipmentBaseApiMapper.selectOne(
- new LambdaQueryWrapper<EquipmentBase>()
- .eq(EquipmentBase::getEquipmentCode, deviceCode)
- .last("LIMIT 1"));
- if (equipmentBase == null) {
- log.warn("更新设备报警状态失败:未找到设备编码对应的设备信息,deviceCode={}", deviceCode);
- return false;
- }
- String equipmentId = equipmentBase.getEquipmentId();
- // 2. 查询是否已有状态记录
- EquipmentStatus existingStatus = equipmentStatusApiMapper.selectOne(
- new LambdaQueryWrapper<EquipmentStatus>()
- .eq(EquipmentStatus::getEquipmentId, equipmentId));
- if (existingStatus != null) {
- Integer previousAlarmStatus = existingStatus.getAlarmStatus();
- // 更新已有记录
- existingStatus.setAlarmStatus(alarmStatus);
- existingStatus.setStatusUpdateTime(LocalDateTime.now());
- int affected = equipmentStatusApiMapper.updateById(existingStatus);
- if (affected <= 0) {
- return false;
- }
- log.info("更新设备报警状态成功: deviceCode={}, equipmentId={}, alarmStatus={}",
- deviceCode, equipmentId, alarmStatus);
- if (!Objects.equals(previousAlarmStatus, alarmStatus)) {
- deviceStatusChangePublisher.publishAfterCommit(deviceCode, equipmentId,
- existingStatus.getCurrentStatus(), existingStatus.getAlarmStatus(),
- existingStatus.getOnlineStatus(), "zk-api:updateAlarmStatus");
- }
- } else {
- // 不存在则创建新记录
- EquipmentStatus newStatus = new EquipmentStatus();
- newStatus.setEquipmentId(equipmentId);
- newStatus.setAlarmStatus(alarmStatus);
- newStatus.setCurrentStatus(1); // 默认在用
- newStatus.setOnlineStatus(1); // 默认在线
- newStatus.setStatusUpdateTime(LocalDateTime.now());
- newStatus.setCreateTime(LocalDateTime.now());
- int affected = equipmentStatusApiMapper.insert(newStatus);
- if (affected <= 0) {
- return false;
- }
- log.info("创建设备报警状态记录成功: deviceCode={}, equipmentId={}, alarmStatus={}",
- deviceCode, equipmentId, alarmStatus);
- deviceStatusChangePublisher.publishAfterCommit(deviceCode, equipmentId,
- newStatus.getCurrentStatus(), newStatus.getAlarmStatus(),
- newStatus.getOnlineStatus(), "zk-api:updateAlarmStatus");
- }
- return true;
- }
- @Override
- @Transactional
- public boolean updateOnlineStatus(String deviceCode, Integer onlineStatus) {
- if (deviceCode == null || deviceCode.isEmpty()) {
- log.warn("更新设备在线状态失败:deviceCode为空");
- return false;
- }
- EquipmentBase equipmentBase = equipmentBaseApiMapper.selectOne(
- new LambdaQueryWrapper<EquipmentBase>()
- .eq(EquipmentBase::getEquipmentCode, deviceCode)
- .last("LIMIT 1"));
- if (equipmentBase == null) {
- log.warn("更新设备在线状态失败:未找到设备编码对应的设备信息,deviceCode={}", deviceCode);
- return false;
- }
- String equipmentId = equipmentBase.getEquipmentId();
- EquipmentStatus existingStatus = equipmentStatusApiMapper.selectOne(
- new LambdaQueryWrapper<EquipmentStatus>()
- .eq(EquipmentStatus::getEquipmentId, equipmentId));
- if (existingStatus != null) {
- Integer previousOnlineStatus = existingStatus.getOnlineStatus();
- existingStatus.setOnlineStatus(onlineStatus);
- existingStatus.setStatusUpdateTime(LocalDateTime.now());
- int affected = equipmentStatusApiMapper.updateById(existingStatus);
- if (affected <= 0) {
- return false;
- }
- log.info("更新设备在线状态成功: deviceCode={}, equipmentId={}, onlineStatus={}",
- deviceCode, equipmentId, onlineStatus);
- if (!Objects.equals(previousOnlineStatus, onlineStatus)) {
- deviceStatusChangePublisher.publishAfterCommit(deviceCode, equipmentId,
- existingStatus.getCurrentStatus(), existingStatus.getAlarmStatus(),
- existingStatus.getOnlineStatus(), "zk-api:updateOnlineStatus");
- }
- // 设备由在线转为离线时,新增离线报警记录
- if (previousOnlineStatus != null && previousOnlineStatus == 1 && onlineStatus == 0) {
- saveOfflineAlarmAfterCommit(deviceCode);
- }
- // 收到有效数据重新上线后,自动处理对应的离线告警;恢复失败不影响在线状态和后续采集。
- if (previousOnlineStatus != null && previousOnlineStatus == 0 && onlineStatus == 1) {
- recoverOfflineAlarmAfterCommit(deviceCode);
- }
- } else {
- EquipmentStatus newStatus = new EquipmentStatus();
- newStatus.setEquipmentId(equipmentId);
- newStatus.setOnlineStatus(onlineStatus);
- newStatus.setAlarmStatus(0);
- newStatus.setCurrentStatus(1);
- newStatus.setStatusUpdateTime(LocalDateTime.now());
- newStatus.setCreateTime(LocalDateTime.now());
- int affected = equipmentStatusApiMapper.insert(newStatus);
- if (affected <= 0) {
- return false;
- }
- log.info("创建设备在线状态记录成功: deviceCode={}, equipmentId={}, onlineStatus={}",
- deviceCode, equipmentId, onlineStatus);
- deviceStatusChangePublisher.publishAfterCommit(deviceCode, equipmentId,
- newStatus.getCurrentStatus(), newStatus.getAlarmStatus(),
- newStatus.getOnlineStatus(), "zk-api:updateOnlineStatus");
- }
- return true;
- }
- /**
- * 新增设备离线报警记录
- */
- private void saveOfflineAlarmAfterCommit(String deviceCode) {
- if (TransactionSynchronizationManager.isSynchronizationActive()) {
- TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
- @Override
- public void afterCommit() {
- run(deviceCode, "离线报警独立事务", () -> saveOfflineAlarm(deviceCode));
- }
- });
- } else {
- run(deviceCode, "离线报警", () -> saveOfflineAlarm(deviceCode));
- }
- }
- private void saveOfflineAlarm(String deviceCode) {
- AlarmData alarmData = new AlarmData();
- alarmData.setDeviceCode(deviceCode);
- alarmData.setWarningCode("OFFLINE");
- alarmData.setAlarmLevel(4);
- alarmData.setAlarmStatus(0);
- alarmData.setCreateTime(LocalDateTime.now());
- alarmData.setCreateTime(LocalDateTime.now());
- if (collectionAlarmWriter.saveOrUpdateUnhandled(alarmData)) {
- log.info("设备离线报警数据入库成功: deviceCode={}, alarmId={}", deviceCode, alarmData.getId());
- }
- }
- private void recoverOfflineAlarmAfterCommit(String deviceCode) {
- if (TransactionSynchronizationManager.isSynchronizationActive()) {
- TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
- @Override
- public void afterCommit() {
- run(deviceCode, "离线告警恢复独立事务", () ->
- collectionAlarmWriter.markRecovered(deviceCode, "OFFLINE"));
- }
- });
- } else {
- run(deviceCode, "离线告警恢复", () ->
- collectionAlarmWriter.markRecovered(deviceCode, "OFFLINE"));
- }
- }
- }
|