package com.mes.device.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.mes.device.entity.DeviceConfig; import com.mes.device.entity.DeviceStatus; import com.mes.device.mapper.DeviceConfigMapper; import com.mes.device.mapper.DeviceStatusMapper; import com.mes.device.service.DeviceConfigService; import com.mes.device.service.DeviceStatusService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.stream.Collectors; /** * 设备状态服务实现类 */ @Slf4j @Service @RequiredArgsConstructor public class DeviceStatusServiceImpl extends ServiceImpl implements DeviceStatusService { private final DeviceConfigService deviceConfigService; private final DeviceConfigMapper deviceConfigMapper; @Override public DeviceStatus getLatestByDeviceId(String deviceId) { if (deviceId == null || deviceId.trim().isEmpty()) { return null; } try { return baseMapper.getLatestByDeviceId(deviceId.trim()); } catch (Exception e) { log.error("获取设备状态失败, deviceId={}", deviceId, e); return null; } } @Override public List getLatestByDeviceIds(List deviceIds) { if (deviceIds == null || deviceIds.isEmpty()) { return new ArrayList<>(); } try { List validIds = deviceIds.stream() .filter(id -> id != null && !id.trim().isEmpty()) .map(String::trim) .distinct() .collect(Collectors.toList()); if (validIds.isEmpty()) { return new ArrayList<>(); } return baseMapper.getLatestByDeviceIds(validIds); } catch (Exception e) { log.error("批量获取设备状态失败, deviceIds={}", deviceIds, e); return new ArrayList<>(); } } @Override @Transactional(rollbackFor = Exception.class) public boolean updateDeviceOnlineStatus(Long deviceId, String status) { if (deviceId == null) { log.warn("设备ID不能为空"); return false; } if (status == null || status.trim().isEmpty()) { log.warn("设备状态不能为空"); return false; } try { // 获取设备配置 DeviceConfig device = deviceConfigService.getDeviceById(deviceId); if (device == null) { log.warn("设备不存在: deviceId={}", deviceId); return false; } String deviceIdStr = device.getDeviceId(); if (deviceIdStr == null || deviceIdStr.trim().isEmpty()) { log.warn("设备配置中device_id字段为空: id={}", deviceId); return false; } // 检查是否已有状态记录 DeviceStatus existing = getLatestByDeviceId(deviceIdStr); Date now = new Date(); if (existing != null) { // 更新现有记录 existing.setStatus(status); existing.setLastHeartbeat(now); boolean result = updateById(existing); if (result) { log.info("更新设备在线状态成功: deviceId={}, status={}", deviceId, status); } return result; } else { // 创建新记录 DeviceStatus newStatus = new DeviceStatus(); newStatus.setDeviceId(deviceIdStr); newStatus.setStatus(status); newStatus.setLastHeartbeat(now); newStatus.setCreatedTime(now); boolean result = save(newStatus); if (result) { log.info("创建设备状态记录成功: deviceId={}, status={}", deviceId, status); } return result; } } catch (Exception e) { log.error("更新设备在线状态失败: deviceId={}, status={}", deviceId, status, e); return false; } } @Override @Transactional(rollbackFor = Exception.class) public boolean batchUpdateDeviceOnlineStatus(List deviceIds, String status) { if (deviceIds == null || deviceIds.isEmpty()) { log.warn("设备ID列表不能为空"); return false; } if (status == null || status.trim().isEmpty()) { log.warn("设备状态不能为空"); return false; } try { boolean allSuccess = true; for (Long deviceId : deviceIds) { if (!updateDeviceOnlineStatus(deviceId, status)) { allSuccess = false; } } log.info("批量更新设备在线状态完成: deviceIds={}, status={}, success={}", deviceIds.size(), status, allSuccess); return allSuccess; } catch (Exception e) { log.error("批量更新设备在线状态失败: deviceIds={}, status={}", deviceIds, status, e); return false; } } @Override @Transactional(rollbackFor = Exception.class) public boolean recordHeartbeat(String deviceId, String status) { if (deviceId == null || deviceId.trim().isEmpty()) { return false; } if (status == null || status.trim().isEmpty()) { status = DeviceStatus.Status.ONLINE; // 默认在线 } try { Date now = new Date(); DeviceStatus existing = getLatestByDeviceId(deviceId); if (existing != null) { existing.setStatus(status); existing.setLastHeartbeat(now); return updateById(existing); } else { DeviceStatus newStatus = new DeviceStatus(); newStatus.setDeviceId(deviceId); newStatus.setStatus(status); newStatus.setLastHeartbeat(now); newStatus.setCreatedTime(now); return save(newStatus); } } catch (Exception e) { log.error("记录设备心跳失败: deviceId={}, status={}", deviceId, status, e); return false; } } @Override public DeviceStatus getLatestByDeviceConfigId(Long deviceConfigId) { if (deviceConfigId == null) { return null; } try { DeviceConfig device = deviceConfigService.getDeviceById(deviceConfigId); if (device == null || device.getDeviceId() == null) { return null; } return getLatestByDeviceId(device.getDeviceId()); } catch (Exception e) { log.error("根据设备配置ID获取设备状态失败: deviceConfigId={}", deviceConfigId, e); return null; } } }