diff --git a/src/main/java/com/campus/water/controller/WorkOrderController.java b/src/main/java/com/campus/water/controller/WorkOrderController.java index 726e12a..9434b5b 100644 --- a/src/main/java/com/campus/water/controller/WorkOrderController.java +++ b/src/main/java/com/campus/water/controller/WorkOrderController.java @@ -79,7 +79,7 @@ public class WorkOrderController { private String orderId; private boolean approved; } - + // 审核工单 // 2. 修改接口接收方式 @PostMapping("/review") @PreAuthorize("hasAnyRole('SUPER_ADMIN', 'AREA_ADMIN')") diff --git a/src/main/java/com/campus/water/controller/web/AdminController.java b/src/main/java/com/campus/water/controller/web/AdminController.java index 7a81a40..7c9d3f2 100644 --- a/src/main/java/com/campus/water/controller/web/AdminController.java +++ b/src/main/java/com/campus/water/controller/web/AdminController.java @@ -82,6 +82,11 @@ public class AdminController { public ResponseEntity> saveAdmin(@RequestBody Admin admin) { // 实现保持不变 try { + + if (admin.getAdminName() == null || admin.getAdminName().trim().isEmpty()) { + return ResponseEntity.ok(ResultVO.error(400, "管理员姓名不能为空")); + } + Admin savedAdmin = adminService.saveAdmin(admin); return ResponseEntity.ok(ResultVO.success(savedAdmin)); } catch (Exception e) { @@ -121,6 +126,8 @@ public class AdminController { } } + + /** * 管理员个人信息修改 * 允许当前登录用户修改自己的基本信息(不含角色/区域等敏感字段) diff --git a/src/main/java/com/campus/water/service/TerminalServiceImpl.java b/src/main/java/com/campus/water/service/TerminalServiceImpl.java index c3f33c4..655dc2c 100644 --- a/src/main/java/com/campus/water/service/TerminalServiceImpl.java +++ b/src/main/java/com/campus/water/service/TerminalServiceImpl.java @@ -94,23 +94,30 @@ public class TerminalServiceImpl implements TerminalService { } @Override - @Transactional - public void deleteTerminal(String terminalId) { - // 1. 校验终端是否已绑定设备(使用新增的existsByTerminalId方法) - if (mappingRepository.existsByTerminalId(terminalId)) { +@Transactional +public void deleteTerminal(String terminalId) { + // 1. 检查终端映射记录是否存在 + Optional mappingOpt = mappingRepository.findByTerminalId(terminalId); + + if (mappingOpt.isPresent()) { + // 检查是否实际绑定了设备(deviceId不为null) + DeviceTerminalMapping mapping = mappingOpt.get(); + if (mapping.getDeviceId() != null && !mapping.getDeviceId().isEmpty()) { throw new RuntimeException("终端已绑定设备,无法删除,请先解除设备关联"); } + } - // 2. 校验终端是否存在(复用原有existsById方法) - if (!locationRepository.existsById(terminalId)) { - throw new RuntimeException("终端不存在,无需删除:" + terminalId); - } - - // 3. 级联删除数据(先删映射表,再删位置表,保证数据一致性) - mappingRepository.deleteByTerminalId(terminalId); // 新增的批量删除方法 - locationRepository.deleteById(terminalId); // 复用原有删除方法 + // 2. 校验终端是否存在 + if (!locationRepository.existsById(terminalId)) { + throw new RuntimeException("终端不存在,无需删除:" + terminalId); } + // 3. 级联删除数据 + mappingRepository.deleteByTerminalId(terminalId); + locationRepository.deleteById(terminalId); +} + + @Override public TerminalManageVO getTerminalById(String terminalId) { // 1. 查询位置信息(复用原有findById方法) diff --git a/src/main/resources/web/src/components/layout/AppSidebar.vue b/src/main/resources/web/src/components/layout/AppSidebar.vue index a214368..eecf014 100644 --- a/src/main/resources/web/src/components/layout/AppSidebar.vue +++ b/src/main/resources/web/src/components/layout/AppSidebar.vue @@ -55,7 +55,8 @@ const menuItems: MenuItem[] = [ route: '/home/equipment', children: [ { name: '制水机', route: '/home/equipment/water-maker' }, - { name: '供水机', route: '/home/equipment/water-supplier' } + { name: '供水机', route: '/home/equipment/water-supplier' }, + { name: '终端机', route: '/home/equipment/terminal' } // 添加终端机菜单项 ] }, { diff --git a/src/main/resources/web/src/router/index.ts b/src/main/resources/web/src/router/index.ts index a38c5ed..1589759 100644 --- a/src/main/resources/web/src/router/index.ts +++ b/src/main/resources/web/src/router/index.ts @@ -70,6 +70,17 @@ const router = createRouter({ title: '供水设备' } }, + { + path: '/home/equipment/terminal', + component: () => import('@/views/equipment/Terminal.vue'), + meta: { requiresAuth: true } + }, + { + path: '/home/equipment/terminal/:id', + component: () => import('@/views/equipment/TerminalDetail.vue'), // 如果需要详情页 + meta: { requiresAuth: true } + }, + // 工单管理相关路由 { path: 'work-order', diff --git a/src/main/resources/web/src/views/Dashboard.vue b/src/main/resources/web/src/views/Dashboard.vue index 0b2cd66..8475221 100644 --- a/src/main/resources/web/src/views/Dashboard.vue +++ b/src/main/resources/web/src/views/Dashboard.vue @@ -74,7 +74,7 @@
- +
{{ alert.deviceId }}:{{ alert.alertMessage }}
{{ formatDateTime(alert.timestamp) }}
@@ -244,6 +244,7 @@ const fetchStatsData = async () => { } } +// 获取告警数据 // 获取告警数据 const fetchAlertData = async () => { loadingAlerts.value = true @@ -271,24 +272,25 @@ const fetchAlertData = async () => { // 确保数据是数组 const alerts = Array.isArray(alertResult.data) ? alertResult.data : [] + // 按时间倒序排序(最新的在前面) + const sortedAlerts = [...alerts].sort((a, b) => { + // 将时间字符串转换为Date对象进行比较 + const timeA = new Date(a.timestamp).getTime() + const timeB = new Date(b.timestamp).getTime() + return timeB - timeA // 降序排列(最新的在前) + }) + // 只取前10条 - recentAlerts.value = alerts.slice(0, 10) - - // 如果有告警,设置最新告警 - if (recentAlerts.value.length > 0) { - const sortedAlerts = [...recentAlerts.value].sort((a, b) => { - const priorityMap: Record = { - 'critical': 4, - 'error': 3, - 'warning': 2, - 'info': 1 - }; - return (priorityMap[b.alertLevel?.toLowerCase()] || 0) - (priorityMap[a.alertLevel?.toLowerCase()] || 0); - }); - latestAlert.value = sortedAlerts[0] ?? null; + recentAlerts.value = sortedAlerts.slice(0, 10) + + // 如果有告警,设置最新告警(时间最新的) + // 修改第222行附近的代码 + if (recentAlerts.value.length > 0 && recentAlerts.value[0]) { + latestAlert.value = recentAlerts.value[0] // 第一个是最新时间的告警 } else { - latestAlert.value = null; + latestAlert.value = null } + } } catch (error: any) { console.error('获取告警数据失败:', error) @@ -318,6 +320,7 @@ const fetchAlertData = async () => { } } + // 组件挂载时获取数据 onMounted(() => { fetchStatsData() diff --git a/src/main/resources/web/src/views/area/Campus.vue b/src/main/resources/web/src/views/area/Campus.vue index a922eff..b929fbf 100644 --- a/src/main/resources/web/src/views/area/Campus.vue +++ b/src/main/resources/web/src/views/area/Campus.vue @@ -11,8 +11,7 @@
- - +
@@ -89,6 +88,18 @@