修改device相关代码 #56

Merged
hnu202326010106 merged 1 commits from wanglei_branch into develop 1 month ago

@ -1,8 +1,4 @@
/**
*
* device
*
*/
// com/campus/water/entity/Device.java
package com.campus.water.entity;
import lombok.Data;
@ -10,6 +6,9 @@ import jakarta.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* device
*/
@Data
@Entity
@Table(name = "device")
@ -25,7 +24,7 @@ public class Device {
@Column(name = "device_type", length = 50)
private DeviceType deviceType;
@Column(name = "area_id", length = 20) // 确保这个字段存在
@Column(name = "area_id", length = 20)
private String areaId;
@Column(name = "install_location", length = 200)
@ -41,7 +40,10 @@ public class Device {
@Column(name = "create_time")
private LocalDateTime createTime = LocalDateTime.now();
// 保留原有的remark方法若表中有该字段可直接映射无则忽略
private String remark;
public void setRemark(String remark) {
this.remark = remark;
}
public enum DeviceType {

@ -1,57 +0,0 @@
package com.campus.water.entity.po;
import lombok.Data;
import jakarta.persistence.*;
import java.time.LocalDateTime;
/**
*
*
*/
@Data
@Entity
@Table(name = "device_po")
public class DevicePO {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // 设备自增主键
@Column(unique = true, nullable = false, length = 20) // 确保业务唯一标识
private String deviceId; // 设备唯一标识业务ID
// 解决area_id映射冲突明确字段定义与Device实体类保持长度一致
@Column(name = "area_id", length = 20) // 显式指定列名和长度与Device类匹配
private String areaId; // 所属区域ID
@Column(length = 50) // 与Device的DeviceStatus枚举存储长度一致
private String status; // 设备状态online在线、offline离线、fault故障
private LocalDateTime lastActiveTime; // 最后活动时间(用于判断在线状态)
@Column(length = 50) // 与Device的DeviceType枚举存储长度一致
private String deviceType; // 设备类型water_maker制水机、water_supply供水机
// 解决create_time字段映射冲突显式指定列名与字段属性确保与数据库表结构一致
@Column(name = "create_time", nullable = false, updatable = false)
private LocalDateTime createTime; // 创建时间
@Column(name = "update_time")
private LocalDateTime updateTime; // 更新时间
// 新增初始化时间字段的方法确保与Device实体类行为一致
@PrePersist
public void prePersist() {
if (createTime == null) {
createTime = LocalDateTime.now();
}
if (updateTime == null) {
updateTime = LocalDateTime.now();
}
}
// 新增更新时自动刷新updateTime
@PreUpdate
public void preUpdate() {
updateTime = LocalDateTime.now();
}
}

@ -1,33 +0,0 @@
package com.campus.water.mapper;
import com.campus.water.entity.po.DevicePO;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List;
@Repository
// 注意DevicePO的主键类型是Longid字段因此这里泛型第二参数改为Long
public interface DevicePOMapper extends JpaRepository<DevicePO, Long> {
// 根据设备唯一标识deviceId查询注意区分主键id和业务字段deviceId
DevicePO findByDeviceId(String deviceId);
// 根据状态字符串查询参数类型为String匹配DevicePO的status字段
List<DevicePO> findByStatus(String status);
// 更新设备状态状态参数类型改为String
@Modifying
@Transactional
@Query("UPDATE DevicePO d SET d.status = ?2, d.lastActiveTime = ?3 WHERE d.deviceId = ?1")
void updateDeviceStatus(String deviceId, String status, LocalDateTime lastActiveTime);
// 补充常用查询按区域ID查询设备
List<DevicePO> findByAreaId(String areaId);
// 补充:按区域和状态查询
List<DevicePO> findByAreaIdAndStatus(String areaId, String status);
}

@ -1,3 +1,4 @@
// com/campus/water/mapper/DeviceRepository.java
package com.campus.water.mapper;
import com.campus.water.entity.Device;
@ -10,19 +11,31 @@ public interface DeviceRepository extends JpaRepository<Device, String> {
// 根据区域ID查询设备
List<Device> findByAreaId(String areaId);
// 根据设备类型查询
// 根据设备类型(枚举)查询
List<Device> findByDeviceType(Device.DeviceType deviceType);
// 根据设备状态查询
// 根据设备状态(枚举)查询
List<Device> findByStatus(Device.DeviceStatus status);
// 按区域和设备类型查询设备
// 按区域和设备类型查询
List<Device> findByAreaIdAndDeviceType(String areaId, Device.DeviceType deviceType);
// 按安装位置模糊查询设备
// 按安装位置模糊查询
List<Device> findByInstallLocationContaining(String location);
List<Device> findByStatusAndAreaIdAndDeviceType(String status, String areaId, String deviceType);
Object countByStatusAndAreaIdAndDeviceType(String online, String areaId, String deviceType);
// 关键修正参数类型为枚举原DevicePO用String现统一为Device的枚举
List<Device> findByStatusAndAreaIdAndDeviceType(
Device.DeviceStatus status,
String areaId,
Device.DeviceType deviceType
);
// 统计方法参数修正为枚举
long countByStatusAndAreaIdAndDeviceType(
Device.DeviceStatus status,
String areaId,
Device.DeviceType deviceType
);
List<Device> findByAreaIdAndStatus(String areaId, Device.DeviceStatus deviceStatus);
}

@ -1,3 +1,4 @@
// com/campus/water/service/DeviceStatusServiceImpl.java
package com.campus.water.service;
import com.campus.water.entity.Device;
@ -7,22 +8,19 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
// 核心:添加@Service注解让Spring注册这个实现类为Bean
@Service
@RequiredArgsConstructor // 注入Repository等依赖
@RequiredArgsConstructor
@Slf4j
public class DeviceStatusServiceImpl implements DeviceStatusService {
// 注入设备仓库(根据你的业务逻辑补充依赖)
private final DeviceRepository deviceRepository;
// 实现接口的所有方法(以下是示例实现,你需根据业务逻辑完善)
@Override
public boolean updateDeviceStatus(DeviceStatusUpdateRequest request) {
// 示例逻辑根据request更新设备状态
Device device = deviceRepository.findById(request.getDeviceId()).orElse(null);
if (device == null) {
log.warn("设备不存在 | 设备ID{}", request.getDeviceId());
@ -36,20 +34,18 @@ public class DeviceStatusServiceImpl implements DeviceStatusService {
@Override
public boolean markDeviceOnline(String deviceId) {
// 实现标记设备在线的逻辑
Device device = deviceRepository.findById(deviceId).orElse(null);
if (device == null) return false;
device.setStatus(Device.DeviceStatus.valueOf("online")); // 对应你的Device枚举/字符串
device.setStatus(Device.DeviceStatus.online);
deviceRepository.save(device);
return true;
}
@Override
public boolean markDeviceOffline(String deviceId, String reason) {
// 实现标记设备离线的逻辑
Device device = deviceRepository.findById(deviceId).orElse(null);
if (device == null) return false;
device.setStatus(Device.DeviceStatus.valueOf("offline"));
device.setStatus(Device.DeviceStatus.offline);
device.setRemark(reason);
deviceRepository.save(device);
return true;
@ -57,10 +53,9 @@ public class DeviceStatusServiceImpl implements DeviceStatusService {
@Override
public boolean markDeviceFault(String deviceId, String faultType, String description) {
// 实现标记设备故障的逻辑
Device device = deviceRepository.findById(deviceId).orElse(null);
if (device == null) return false;
device.setStatus(Device.DeviceStatus.valueOf("fault"));
device.setStatus(Device.DeviceStatus.fault);
device.setRemark("故障类型:" + faultType + ",描述:" + description);
deviceRepository.save(device);
return true;
@ -68,10 +63,10 @@ public class DeviceStatusServiceImpl implements DeviceStatusService {
@Override
public boolean batchUpdateDeviceStatus(List<String> deviceIds, String status, String remark) {
// 实现批量更新设备状态的逻辑
List<Device> devices = deviceRepository.findAllById(deviceIds);
Device.DeviceStatus targetStatus = Device.DeviceStatus.valueOf(status);
devices.forEach(device -> {
device.setStatus(Device.DeviceStatus.valueOf(status));
device.setStatus(targetStatus);
device.setRemark(remark);
});
deviceRepository.saveAll(devices);
@ -80,32 +75,32 @@ public class DeviceStatusServiceImpl implements DeviceStatusService {
@Override
public List<Device> getDevicesByStatus(String status, String areaId, String deviceType) {
// 实现按状态/区域/设备类型查询设备的逻辑
// 可调用DeviceRepository的自定义查询方法
return deviceRepository.findByStatusAndAreaIdAndDeviceType(status, areaId, deviceType);
Device.DeviceStatus targetStatus = Device.DeviceStatus.valueOf(status);
Device.DeviceType targetType = Device.DeviceType.valueOf(deviceType);
return deviceRepository.findByStatusAndAreaIdAndDeviceType(targetStatus, areaId, targetType);
}
@Override
public Map<String, Object> getDeviceStatusCount(String areaId, String deviceType) {
// 实现统计各状态设备数量的逻辑
// 示例返回online/offline/fault的数量
Device.DeviceType targetType = Device.DeviceType.valueOf(deviceType);
return Map.of(
"online", deviceRepository.countByStatusAndAreaIdAndDeviceType("online", areaId, deviceType),
"offline", deviceRepository.countByStatusAndAreaIdAndDeviceType("offline", areaId, deviceType),
"fault", deviceRepository.countByStatusAndAreaIdAndDeviceType("fault", areaId, deviceType)
"online", deviceRepository.countByStatusAndAreaIdAndDeviceType(Device.DeviceStatus.online, areaId, targetType),
"offline", deviceRepository.countByStatusAndAreaIdAndDeviceType(Device.DeviceStatus.offline, areaId, targetType),
"fault", deviceRepository.countByStatusAndAreaIdAndDeviceType(Device.DeviceStatus.fault, areaId, targetType)
);
}
@Override
public List<Device> getOfflineDevicesExceedThreshold(Integer thresholdMinutes, String areaId) {
// 实现获取超过阈值的离线设备的逻辑
// 需结合设备最后心跳时间判断
return List.of(); // 临时返回空,需完善
// 由于没有last_active_time此处逻辑需调整
// 方案1若设备有最近操作时间可用作替代
// 方案2仅返回状态为offline的设备不判断时间
return deviceRepository.findByAreaIdAndStatus(areaId, Device.DeviceStatus.offline);
}
@Override
public void autoDetectOfflineDevices(Integer thresholdMinutes) {
// 实现自动检测离线设备的逻辑
// 定时任务/扫描逻辑,需完善
// 同理无last_active_time时无法通过时间判断可注释或简化逻辑
log.info("自动检测离线设备(不执行时间判断,仅依赖手动标记)");
}
}
Loading…
Cancel
Save