74 lines
2.5 KiB
Java
74 lines
2.5 KiB
Java
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;
|
|
|
|
/**
|
|
* <p>
|
|
* 水质信息表 服务实现类
|
|
* </p>
|
|
*
|
|
* @author wanyan
|
|
* @since 2023-11-01
|
|
*/
|
|
@Service
|
|
public class WqRRealServiceImp extends ServiceImpl<WqRealMapper, WqRReal> implements WqRRealService {
|
|
|
|
@Value("${offlineThreshold}")
|
|
private Integer offlineThreshold;
|
|
|
|
@Override
|
|
public List<WqRReal> getList() {
|
|
LambdaQueryWrapper<WqRReal> queryWrapper = new LambdaQueryWrapper<>();
|
|
queryWrapper.orderByDesc(WqRReal::getTm).orderByAsc(WqRReal::getMn);
|
|
return this.list(queryWrapper);
|
|
}
|
|
|
|
@Override
|
|
public Map<Boolean, List<WqRReal>> online() {
|
|
List<WqRReal> 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;
|
|
}
|
|
}
|