设备信息

This commit is contained in:
cbs 2025-02-06 17:31:18 +08:00
parent afccb0e06b
commit faabc4151b
9 changed files with 128 additions and 3 deletions

View File

@ -0,0 +1,6 @@
package cn.iocoder.yudao.module.system.constant.device;
public class DeviceChcheConstant {
//设备最后通讯时间
public static String DEVICE_LAST_TIME = "device:last:time";
}

View File

@ -100,4 +100,11 @@ public class DeviceInformationController {
BeanUtils.toBean(list, DeviceInformationRespVO.class));
}
@GetMapping("/classification")
@Operation(summary = "获得设备信息分类列表")
public CommonResult<Map<Integer,List<DeviceInformationDO>>> classification() {
Map<Integer,List<DeviceInformationDO>> map = informationService.classification();
return success(map);
}
}

View File

@ -41,6 +41,9 @@ public class DeviceInformationPageReqVO extends PageParam {
@Schema(description = "设备编号")
private String deviceNo;
@Schema(description = "设备位置")
private String deviceLocation;
@Schema(description = "mac地址")
private String macAddress;

View File

@ -50,6 +50,10 @@ public class DeviceInformationRespVO {
@ExcelProperty("设备编号")
private String deviceNo;
@Schema(description = "设备位置")
@ExcelProperty("设备位置")
private String deviceLocation;
@Schema(description = "mac地址")
@ExcelProperty("mac地址")
private String macAddress;

View File

@ -41,6 +41,9 @@ public class DeviceInformationSaveReqVO {
@Schema(description = "设备编号")
private String deviceNo;
@Schema(description = "设备位置")
private String deviceLocation;
@Schema(description = "mac地址")
private String macAddress;

View File

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.math.BigDecimal;
@ -62,6 +63,10 @@ public class DeviceInformationDO extends BaseDO {
* 设备编号
*/
private String deviceNo;
/**
* 设备位置
*/
private String deviceLocation;
/**
* mac地址
*/

View File

@ -0,0 +1,24 @@
package cn.iocoder.yudao.module.system.enums.device;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* device_information的device_status
*/
@Getter
@AllArgsConstructor
public enum DeviceStatusEnum {
ON_LINE(1, "在线"),
OFF_LINE(2, "离线"),
EXECPTION(3, "异常");
/**
* 类型
*/
private final Integer type;
/**
* 说明
*/
private final String msg;
}

View File

@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.information.DeviceInformati
import javax.validation.Valid;
import java.util.List;
import java.util.Map;
/**
* 设备信息 Service 接口
@ -76,4 +77,10 @@ public interface DeviceInformationService {
* @return
*/
List<DeviceInformationDO> getList(@Valid DeviceInformationPageReqVO pageReqVO);
/**
* 获得设备信息分类列表
* @return
*/
Map<Integer, List<DeviceInformationDO>> classification();
}

View File

@ -5,10 +5,13 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.grpc.api.GrpcServiceApi;
import cn.iocoder.yudao.module.system.constant.device.DeviceChcheConstant;
import cn.iocoder.yudao.module.system.controller.admin.information.vo.DeviceInformationPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.information.vo.DeviceInformationSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.information.DeviceInformationDO;
import cn.iocoder.yudao.module.system.dal.mysql.information.DeviceInformationMapper;
import cn.iocoder.yudao.module.system.enums.device.DeviceStatusEnum;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -17,7 +20,9 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
import static cn.hutool.core.collection.CollUtil.isNotEmpty;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@ -41,6 +46,9 @@ public class DeviceInformationServiceImpl implements DeviceInformationService {
@Resource
private GrpcServiceApi grpcServiceApi;
@Resource
private RedisUtil redisUtil;
@Override
public Long createInformation(DeviceInformationSaveReqVO createReqVO) {
DeviceInformationPageReqVO pageReqVO = new DeviceInformationPageReqVO();
@ -52,7 +60,6 @@ public class DeviceInformationServiceImpl implements DeviceInformationService {
// 插入
DeviceInformationDO information = BeanUtils.toBean(createReqVO, DeviceInformationDO.class);
information.setDeviceStatus(1);
information.setDeviceLastTime(LocalDateTime.now());
informationMapper.insert(information);
// 返回
return information.getId();
@ -83,7 +90,24 @@ public class DeviceInformationServiceImpl implements DeviceInformationService {
@Override
public DeviceInformationDO getInformation(Long id) {
return informationMapper.selectById(id);
// 校验存在
validateInformationExists(id);
DeviceInformationDO deviceInformationDO = informationMapper.selectById(id);
String deviceKey = DeviceChcheConstant.DEVICE_LAST_TIME +deviceInformationDO.getMacAddress();
Object object = redisUtil.get(deviceKey);
if (ObjectUtil.isEmpty(object)) {
deviceInformationDO.setDeviceStatus(DeviceStatusEnum.OFF_LINE.getType());
return deviceInformationDO;
}
try {
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime curTimeLDT = LocalDateTime.parse((String)object, df);
deviceInformationDO.setDeviceLastTime(curTimeLDT);
deviceInformationDO.setDeviceStatus(DeviceStatusEnum.ON_LINE.getType());
} catch (Exception e) {
log.info("查询设备最后通讯时间异常 :{}",e.getMessage());
}
return deviceInformationDO;
}
@Override
@ -118,4 +142,46 @@ public class DeviceInformationServiceImpl implements DeviceInformationService {
.eq(pageReqVO.getDeviceType() != null, DeviceInformationDO::getDeviceType, pageReqVO.getDeviceType()));
}
/**
* 获得设备信息分类列表
* @return
*/
@Override
public Map<Integer, List<DeviceInformationDO>> classification() {
List<DeviceInformationDO> deviceInformationDOS = informationMapper.selectList(new LambdaQueryWrapper<DeviceInformationDO>());
if (ObjectUtil.isEmpty(deviceInformationDOS)) {
return new HashMap<>();
}
// todo 需要设置设备通讯的时间
for (DeviceInformationDO deviceInformationDO : deviceInformationDOS) {
String deviceKey = DeviceChcheConstant.DEVICE_LAST_TIME +deviceInformationDO.getMacAddress();
Object object = redisUtil.get(deviceKey);
if (ObjectUtil.isEmpty(object)) {
deviceInformationDO.setDeviceStatus(DeviceStatusEnum.OFF_LINE.getType());
continue;
}
try {
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime curTimeLDT = LocalDateTime.parse((String)object, df);
deviceInformationDO.setDeviceLastTime(curTimeLDT);
deviceInformationDO.setDeviceStatus(DeviceStatusEnum.ON_LINE.getType());
} catch (Exception e) {
log.info("查询设备最后通讯时间异常 :{}",e.getMessage());
}
}
Map<Integer, List<DeviceInformationDO>> collect =
deviceInformationDOS.stream()
.collect(Collectors.groupingBy(DeviceInformationDO::getDeviceType));
ArrayList<Map.Entry<Integer, List<DeviceInformationDO>>> list = new ArrayList<Map.Entry<Integer, List<DeviceInformationDO>>>(collect.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Integer, List<DeviceInformationDO>>>() {
public int compare(Map.Entry<Integer, List<DeviceInformationDO>> o1, Map.Entry<Integer, List<DeviceInformationDO>> o2) {
return o1.getKey().compareTo(o2.getKey()); // 按照值排序
}
});
return collect;
}
}