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() + ")");
}
}