diff --git a/src/main/java/com/campus/water/entity/Device.java b/src/main/java/com/campus/water/entity/Device.java index 112d491..46e2430 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_id", length = 36) - private String areaId; + @Column(name = "area_name", length = 36) + private String areaName; @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 e40eb6f..1aab421 100644 --- a/src/main/java/com/campus/water/mapper/AreaRepository.java +++ b/src/main/java/com/campus/water/mapper/AreaRepository.java @@ -56,4 +56,6 @@ 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 99a1dd2..fadcc8d 100644 --- a/src/main/java/com/campus/water/mapper/DeviceRepository.java +++ b/src/main/java/com/campus/water/mapper/DeviceRepository.java @@ -8,8 +8,8 @@ import java.util.List; @Repository public interface DeviceRepository extends JpaRepository { - // 根据区域ID查询设备 - List findByAreaId(String areaId); + // 根据区域名称查询设备 + List findByAreaName(String areaName); // 根据设备类型(枚举)查询 List findByDeviceType(Device.DeviceType deviceType); @@ -18,7 +18,7 @@ public interface DeviceRepository extends JpaRepository { List findByStatus(Device.DeviceStatus status); // 按区域和设备类型查询 - List findByAreaIdAndDeviceType(String areaId, Device.DeviceType deviceType); + List findByAreaNameAndDeviceType(String areaName, 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 10e9f47..0b3e361 100644 --- a/src/main/java/com/campus/water/service/AlertTriggerService.java +++ b/src/main/java/com/campus/water/service/AlertTriggerService.java @@ -1,9 +1,11 @@ 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; @@ -44,6 +46,7 @@ public class AlertTriggerService { private final AlertRepository alertRepository; private final WorkOrderRepository workOrderRepository; private final DeviceRepository deviceRepository; + private final AreaRepository areaRepository; /** * 检查制水机数据异常并触发告警 @@ -164,8 +167,11 @@ public class AlertTriggerService { private void createAlertAndWorkOrder(String deviceId, String alertType, Alert.AlertLevel level, String message, WorkOrder.OrderType orderType) { - // 获取设备所在区域(用于工单分配) - String areaId = getDeviceAreaId(deviceId); + // 1. 获取设备的片区名称 + String areaName = getDeviceAreaName(deviceId); + + // 2. 关键步骤:通过片区名称匹配获取对应的areaId(保留原有area_id逻辑) + String areaId = getAreaIdByAreaName(areaName); // 1. 创建告警记录 Alert alert = new Alert(); @@ -219,20 +225,26 @@ public class AlertTriggerService { /** * 获取设备所在区域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"; // 异常时兜底 + /** + * 第一步:获取设备的片区名称(从修改后的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"); } + // 通过片区名称查询片区信息,获取对应的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 bbf1bbb..f611bdd 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 areaId, DeviceType deviceType, DeviceStatus status) { - if (areaId != null && deviceType != null) { - return deviceRepository.findByAreaIdAndDeviceType(areaId, deviceType); - } else if (areaId != null) { - return deviceRepository.findByAreaId(areaId); + 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); } else if (deviceType != null) { return deviceRepository.findByDeviceType(deviceType); } else if (status != null) { @@ -111,28 +111,28 @@ public class DeviceService { /** * 关联设备与终端 */ - // ========== 改造:原有bindTerminal方法,添加areaId参数和校验 ========== + // ========== 改造:原有bindTerminal方法,添加areaName参数和校验 ========== @Transactional - public DeviceTerminalMapping bindTerminal(String deviceId, String terminalId, String terminalName, String areaId) { + public DeviceTerminalMapping bindTerminal(String deviceId, String terminalId, String terminalName, String areaName) { // 1. 校验片区非空(终端必须归属片区) - if (areaId == null || areaId.trim().isEmpty()) { + if (areaName == null || areaName.trim().isEmpty()) { throw new RuntimeException("片区ID不能为空,请先选择片区"); } // 2. 校验设备存在且属于该片区的供水机 - validateDeviceBelongsToArea(deviceId, areaId); + validateDeviceBelongsToArea(deviceId, areaName); // 3. 检查终端是否已绑定(原有逻辑保留) Optional existing = terminalMappingRepository.findByTerminalId(terminalId); if (existing.isPresent()) { throw new RuntimeException("终端已绑定设备:" + existing.get().getDeviceId()); } - // 4. 构建映射对象(新增设置areaId) + // 4. 构建映射对象(新增设置areaName) DeviceTerminalMapping mapping = new DeviceTerminalMapping(); mapping.setDeviceId(deviceId); mapping.setTerminalId(terminalId); mapping.setTerminalName(terminalName); mapping.setTerminalStatus(DeviceTerminalMapping.TerminalStatus.active); mapping.setInstallDate(LocalDate.now()); - mapping.setAreaId(areaId); // 保存终端所属片区 + mapping.setAreaId(mapping.getAreaId()); // 保存终端所属片区 return terminalMappingRepository.save(mapping); } @@ -227,17 +227,17 @@ public class DeviceService { } // ========== 新增1:查询指定片区的所有供水机 ========== - public List getWaterSuppliesByArea(String areaId) { + public List getWaterSuppliesByArea(String areaName) { // 1. 校验片区ID非空 - if (areaId == null || areaId.trim().isEmpty()) { + if (areaName == null || areaName.trim().isEmpty()) { throw new RuntimeException("片区ID不能为空"); } // 2. 查询该片区下类型为供水机的设备 - return deviceRepository.findByAreaIdAndDeviceType(areaId, Device.DeviceType.water_supply); + return deviceRepository.findByAreaNameAndDeviceType(areaName, Device.DeviceType.water_supply); } // ========== 新增2:校验设备是否属于指定片区 ========== - public void validateDeviceBelongsToArea(String deviceId, String areaId) { + public void validateDeviceBelongsToArea(String deviceId, String areaName) { // 1. 校验设备存在 Device device = getDeviceById(deviceId); // 2. 校验设备是供水机 @@ -245,8 +245,8 @@ public class DeviceService { throw new RuntimeException("只能关联供水机设备,当前设备类型不合法"); } // 3. 校验设备所属片区与选中片区一致 - if (!areaId.equals(device.getAreaId())) { - throw new RuntimeException("该供水机不属于所选片区(设备所属片区:" + device.getAreaId() + ")"); + if (!areaName.equals(device.getAreaName())) { + throw new RuntimeException("该供水机不属于所选片区(设备所属片区:" + device.getAreaName() + ")"); } }