diff --git a/src/main/java/com/campus/water/entity/Device.java b/src/main/java/com/campus/water/entity/Device.java index 42ac6e4..5b6596c 100644 --- a/src/main/java/com/campus/water/entity/Device.java +++ b/src/main/java/com/campus/water/entity/Device.java @@ -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 { diff --git a/src/main/java/com/campus/water/entity/po/DevicePO.java b/src/main/java/com/campus/water/entity/po/DevicePO.java deleted file mode 100644 index 228a5c4..0000000 --- a/src/main/java/com/campus/water/entity/po/DevicePO.java +++ /dev/null @@ -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(); - } -} \ No newline at end of file diff --git a/src/main/java/com/campus/water/mapper/DevicePOMapper.java b/src/main/java/com/campus/water/mapper/DevicePOMapper.java deleted file mode 100644 index 8d6c0c3..0000000 --- a/src/main/java/com/campus/water/mapper/DevicePOMapper.java +++ /dev/null @@ -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的主键类型是Long(id字段),因此这里泛型第二参数改为Long -public interface DevicePOMapper extends JpaRepository { - - // 根据设备唯一标识(deviceId)查询(注意区分主键id和业务字段deviceId) - DevicePO findByDeviceId(String deviceId); - - // 根据状态字符串查询(参数类型为String,匹配DevicePO的status字段) - List 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 findByAreaId(String areaId); - - // 补充:按区域和状态查询 - List findByAreaIdAndStatus(String areaId, String status); -} \ No newline at end of file diff --git a/src/main/java/com/campus/water/mapper/DeviceRepository.java b/src/main/java/com/campus/water/mapper/DeviceRepository.java index 11bf860..31cd7c1 100644 --- a/src/main/java/com/campus/water/mapper/DeviceRepository.java +++ b/src/main/java/com/campus/water/mapper/DeviceRepository.java @@ -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 { // 根据区域ID查询设备 List findByAreaId(String areaId); - // 根据设备类型查询 + // 根据设备类型(枚举)查询 List findByDeviceType(Device.DeviceType deviceType); - // 根据设备状态查询 + // 根据设备状态(枚举)查询 List findByStatus(Device.DeviceStatus status); - // 按区域和设备类型查询设备 + // 按区域和设备类型查询 List findByAreaIdAndDeviceType(String areaId, Device.DeviceType deviceType); - // 按安装位置模糊查询设备 + // 按安装位置模糊查询 List findByInstallLocationContaining(String location); - List findByStatusAndAreaIdAndDeviceType(String status, String areaId, String deviceType); - - Object countByStatusAndAreaIdAndDeviceType(String online, String areaId, String deviceType); + // 关键修正:参数类型为枚举(原DevicePO用String,现统一为Device的枚举) + List findByStatusAndAreaIdAndDeviceType( + Device.DeviceStatus status, + String areaId, + Device.DeviceType deviceType + ); + + // 统计方法参数修正为枚举 + long countByStatusAndAreaIdAndDeviceType( + Device.DeviceStatus status, + String areaId, + Device.DeviceType deviceType + ); + + List findByAreaIdAndStatus(String areaId, Device.DeviceStatus deviceStatus); } \ No newline at end of file diff --git a/src/main/java/com/campus/water/service/DeviceStatusServiceImpl.java b/src/main/java/com/campus/water/service/DeviceStatusServiceImpl.java index a8bf028..22c0e8e 100644 --- a/src/main/java/com/campus/water/service/DeviceStatusServiceImpl.java +++ b/src/main/java/com/campus/water/service/DeviceStatusServiceImpl.java @@ -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 deviceIds, String status, String remark) { - // 实现批量更新设备状态的逻辑 List 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 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 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 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("自动检测离线设备(不执行时间判断,仅依赖手动标记)"); } } \ No newline at end of file