package com.whdc.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.whdc.entity.WqRReal; import com.whdc.mapper.WqRealMapper; import com.whdc.service.WqRRealService; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.time.Duration; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; /** *

* 水质信息表 服务实现类 *

* * @author wanyan * @since 2023-11-01 */ @Service public class WqRRealServiceImp extends ServiceImpl implements WqRRealService { @Value("${offlineThreshold}") private Integer offlineThreshold; @Override public List getList() { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.orderByDesc(WqRReal::getTm).orderByAsc(WqRReal::getMn); return this.list(queryWrapper); } @Override public Map> online() { List list = this.list(); if(list != null && !list.isEmpty()) { return list.stream() .collect(Collectors.partitioningBy(device -> !isDeviceOffline(device), // 对分组后的列表按时间倒序排序 Collectors.collectingAndThen( Collectors.toList(), des -> des.stream() .sorted(Comparator.comparing(WqRReal::getTm).reversed()) .collect(Collectors.toList()) ) )); } return new HashMap<>(); } public boolean isDeviceOffline(WqRReal device) { return isDeviceOffline(device, offlineThreshold*3600*1000); } public boolean isDeviceOffline(WqRReal device, long threshold) { return isDeviceOffline(device, LocalDateTime.now(), threshold); } private boolean isDeviceOffline(WqRReal device, LocalDateTime currentTime, long threshold) { if (device == null || device.getTm() == null) { return true; // 没有时间数据的设备视为离线 } Duration duration = Duration.between(device.getTm(), currentTime); long millis = duration.toMillis(); return millis >= threshold; } }