diff --git a/src/main/java/com/campus/water/entity/Device.java b/src/main/java/com/campus/water/entity/Device.java index 46e2430..112d491 100644 --- a/src/main/java/com/campus/water/entity/Device.java +++ b/src/main/java/com/campus/water/entity/Device.java @@ -24,8 +24,8 @@ public class Device { @Column(name = "device_type", length = 50) private DeviceType deviceType; - @Column(name = "area_name", length = 36) - private String areaName; + @Column(name = "area_id", length = 36) + private String areaId; @Column(name = "install_location", length = 200) private String installLocation; diff --git a/src/main/java/com/campus/water/mapper/AreaRepository.java b/src/main/java/com/campus/water/mapper/AreaRepository.java index 1aab421..e40eb6f 100644 --- a/src/main/java/com/campus/water/mapper/AreaRepository.java +++ b/src/main/java/com/campus/water/mapper/AreaRepository.java @@ -56,6 +56,4 @@ public interface AreaRepository extends JpaRepository { */ List findByAreaTypeAndManagerIsNullOrManagerEquals(Area.AreaType areaType, String emptyStr); - Optional findByAreaName(String areaName); - } \ 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 fadcc8d..8e3b9aa 100644 --- a/src/main/java/com/campus/water/mapper/DeviceRepository.java +++ b/src/main/java/com/campus/water/mapper/DeviceRepository.java @@ -9,7 +9,7 @@ import java.util.List; @Repository public interface DeviceRepository extends JpaRepository { // 根据区域名称查询设备 - List findByAreaName(String areaName); + List findByAreaId(String areaId); // 根据设备类型(枚举)查询 List findByDeviceType(Device.DeviceType deviceType); @@ -18,7 +18,7 @@ public interface DeviceRepository extends JpaRepository { List findByStatus(Device.DeviceStatus status); // 按区域和设备类型查询 - List findByAreaNameAndDeviceType(String areaName, Device.DeviceType deviceType); + List findByAreaIdAndDeviceType(String areaId, Device.DeviceType deviceType); // 按安装位置模糊查询 List findByInstallLocationContaining(String location); diff --git a/src/main/java/com/campus/water/service/AlertTriggerService.java b/src/main/java/com/campus/water/service/AlertTriggerService.java index 0b3e361..10e9f47 100644 --- a/src/main/java/com/campus/water/service/AlertTriggerService.java +++ b/src/main/java/com/campus/water/service/AlertTriggerService.java @@ -1,11 +1,9 @@ package com.campus.water.service; import com.campus.water.entity.Alert; -import com.campus.water.entity.Area; import com.campus.water.entity.Device; import com.campus.water.entity.WorkOrder; import com.campus.water.mapper.AlertRepository; -import com.campus.water.mapper.AreaRepository; import com.campus.water.mapper.DeviceRepository; import com.campus.water.mapper.WorkOrderRepository; import com.campus.water.model.WaterMakerSensorData; @@ -46,7 +44,6 @@ public class AlertTriggerService { private final AlertRepository alertRepository; private final WorkOrderRepository workOrderRepository; private final DeviceRepository deviceRepository; - private final AreaRepository areaRepository; /** * 检查制水机数据异常并触发告警 @@ -167,11 +164,8 @@ public class AlertTriggerService { private void createAlertAndWorkOrder(String deviceId, String alertType, Alert.AlertLevel level, String message, WorkOrder.OrderType orderType) { - // 1. 获取设备的片区名称 - String areaName = getDeviceAreaName(deviceId); - - // 2. 关键步骤:通过片区名称匹配获取对应的areaId(保留原有area_id逻辑) - String areaId = getAreaIdByAreaName(areaName); + // 获取设备所在区域(用于工单分配) + String areaId = getDeviceAreaId(deviceId); // 1. 创建告警记录 Alert alert = new Alert(); @@ -225,26 +219,20 @@ public class AlertTriggerService { /** * 获取设备所在区域ID(新增超时控制,避免查询阻塞) */ - /** - * 第一步:获取设备的片区名称(从修改后的Device表中获取) - */ - private String getDeviceAreaName(String deviceId) { - Device device = deviceRepository.findById(deviceId) - .orElseThrow(() -> new RuntimeException("设备不存在:" + deviceId)); - return device.getAreaName(); // 从Device获取areaName(已修改后的字段) - } - - /** - * 第二步:新增方法 - 通过片区名称匹配获取对应的areaId - */ - private String getAreaIdByAreaName(String areaName) { - if (areaName == null || areaName.trim().isEmpty()) { - throw new RuntimeException("片区名称不能为空,无法匹配片区ID"); + public String getDeviceAreaId(String deviceId) { + try { + Optional deviceOpt = deviceRepository.findById(deviceId); + String areaId = deviceOpt.map(Device::getAreaId).orElse(null); + // 空值兜底:null/空字符串→unknown + if (areaId == null || areaId.trim().isEmpty()) { + areaId = "unknown"; + log.warn("设备{}的area_id为空/设备不存在,兜底为unknown", deviceId); + } + return areaId; + } catch (Exception e) { // 捕获所有数据库异常 + log.error("获取设备{}的area_id失败(数据库异常)", deviceId, e); + return "unknown"; // 异常时兜底 } - // 通过片区名称查询片区信息,获取对应的areaId - Area area = areaRepository.findByAreaName(areaName) - .orElseThrow(() -> new RuntimeException("未查询到对应片区ID,片区名称:" + areaName)); - return area.getAreaId(); // 返回原有保留的areaId } /** * 生成唯一工单ID(WO+时间戳+随机数) diff --git a/src/main/java/com/campus/water/service/DeviceService.java b/src/main/java/com/campus/water/service/DeviceService.java index f611bdd..20e699e 100644 --- a/src/main/java/com/campus/water/service/DeviceService.java +++ b/src/main/java/com/campus/water/service/DeviceService.java @@ -94,11 +94,11 @@ public class DeviceService { /** * 根据条件查询设备列表 */ - public List queryDevices(String areaName, DeviceType deviceType, DeviceStatus status) { - if (areaName != null && deviceType != null) { - return deviceRepository.findByAreaNameAndDeviceType(areaName, deviceType); - } else if (areaName != null) { - return deviceRepository.findByAreaName (areaName); + public List queryDevices(String areaId, DeviceType deviceType, DeviceStatus status) { + if (areaId != null && deviceType != null) { + return deviceRepository.findByAreaIdAndDeviceType(areaId, deviceType); + } else if (areaId != null) { + return deviceRepository.findByAreaId (areaId); } else if (deviceType != null) { return deviceRepository.findByDeviceType(deviceType); } else if (status != null) { @@ -111,28 +111,28 @@ public class DeviceService { /** * 关联设备与终端 */ - // ========== 改造:原有bindTerminal方法,添加areaName参数和校验 ========== + // ========== 改造:原有bindTerminal方法,添加areaId参数和校验 ========== @Transactional - public DeviceTerminalMapping bindTerminal(String deviceId, String terminalId, String terminalName, String areaName) { + public DeviceTerminalMapping bindTerminal(String deviceId, String terminalId, String terminalName, String areaId) { // 1. 校验片区非空(终端必须归属片区) - if (areaName == null || areaName.trim().isEmpty()) { + if (areaId == null || areaId.trim().isEmpty()) { throw new RuntimeException("片区ID不能为空,请先选择片区"); } // 2. 校验设备存在且属于该片区的供水机 - validateDeviceBelongsToArea(deviceId, areaName); + validateDeviceBelongsToArea(deviceId, areaId); // 3. 检查终端是否已绑定(原有逻辑保留) Optional existing = terminalMappingRepository.findByTerminalId(terminalId); if (existing.isPresent()) { throw new RuntimeException("终端已绑定设备:" + existing.get().getDeviceId()); } - // 4. 构建映射对象(新增设置areaName) + // 4. 构建映射对象(新增设置areaId) DeviceTerminalMapping mapping = new DeviceTerminalMapping(); mapping.setDeviceId(deviceId); mapping.setTerminalId(terminalId); mapping.setTerminalName(terminalName); mapping.setTerminalStatus(DeviceTerminalMapping.TerminalStatus.active); mapping.setInstallDate(LocalDate.now()); - mapping.setAreaId(mapping.getAreaId()); // 保存终端所属片区 + mapping.setAreaId(areaId); // 保存终端所属片区 return terminalMappingRepository.save(mapping); } @@ -227,17 +227,17 @@ public class DeviceService { } // ========== 新增1:查询指定片区的所有供水机 ========== - public List getWaterSuppliesByArea(String areaName) { + public List getWaterSuppliesByArea(String areaId) { // 1. 校验片区ID非空 - if (areaName == null || areaName.trim().isEmpty()) { + if (areaId == null || areaId.trim().isEmpty()) { throw new RuntimeException("片区ID不能为空"); } // 2. 查询该片区下类型为供水机的设备 - return deviceRepository.findByAreaNameAndDeviceType(areaName, Device.DeviceType.water_supply); + return deviceRepository.findByAreaIdAndDeviceType(areaId, Device.DeviceType.water_supply); } // ========== 新增2:校验设备是否属于指定片区 ========== - public void validateDeviceBelongsToArea(String deviceId, String areaName) { + public void validateDeviceBelongsToArea(String deviceId, String areaId) { // 1. 校验设备存在 Device device = getDeviceById(deviceId); // 2. 校验设备是供水机 @@ -245,8 +245,8 @@ public class DeviceService { throw new RuntimeException("只能关联供水机设备,当前设备类型不合法"); } // 3. 校验设备所属片区与选中片区一致 - if (!areaName.equals(device.getAreaName())) { - throw new RuntimeException("该供水机不属于所选片区(设备所属片区:" + device.getAreaName() + ")"); + if (!areaId.equals(device.getAreaId())) { + throw new RuntimeException("该供水机不属于所选片区(设备所属片区:" + device.getAreaId() + ")"); } }