From 6fd4ff8471ed04e5ec4a137b56ff7e3ebc85faeb Mon Sep 17 00:00:00 2001 From: ZHW <1941286652@qq.com> Date: Sat, 27 Dec 2025 21:03:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=AE=BE=E5=A4=87=E4=B8=BB?= =?UTF-8?q?=E8=A6=81=E6=98=AF=E5=85=B3=E8=81=94=E8=AE=BE=E5=A4=87=E7=9A=84?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../water/controller/web/AdminController.java | 2 + .../water/service/TerminalServiceImpl.java | 31 +- .../web/src/components/layout/AppSidebar.vue | 3 +- src/main/resources/web/src/router/index.ts | 11 + .../web/src/views/equipment/Terminal.vue | 807 ++++++++++++++++++ .../src/views/equipment/TerminalDetail.vue | 572 +++++++++++++ .../web/src/views/equipment/WaterMaker.vue | 48 ++ 7 files changed, 1461 insertions(+), 13 deletions(-) create mode 100644 src/main/resources/web/src/views/equipment/Terminal.vue create mode 100644 src/main/resources/web/src/views/equipment/TerminalDetail.vue 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 47b7de5..7c9d3f2 100644 --- a/src/main/java/com/campus/water/controller/web/AdminController.java +++ b/src/main/java/com/campus/water/controller/web/AdminController.java @@ -126,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/equipment/Terminal.vue b/src/main/resources/web/src/views/equipment/Terminal.vue new file mode 100644 index 0000000..08260a7 --- /dev/null +++ b/src/main/resources/web/src/views/equipment/Terminal.vue @@ -0,0 +1,807 @@ + + + + + diff --git a/src/main/resources/web/src/views/equipment/TerminalDetail.vue b/src/main/resources/web/src/views/equipment/TerminalDetail.vue new file mode 100644 index 0000000..53dbc2d --- /dev/null +++ b/src/main/resources/web/src/views/equipment/TerminalDetail.vue @@ -0,0 +1,572 @@ + + + + + + diff --git a/src/main/resources/web/src/views/equipment/WaterMaker.vue b/src/main/resources/web/src/views/equipment/WaterMaker.vue index a5df1f4..e2f0167 100644 --- a/src/main/resources/web/src/views/equipment/WaterMaker.vue +++ b/src/main/resources/web/src/views/equipment/WaterMaker.vue @@ -10,6 +10,8 @@
+ +
@@ -99,6 +101,12 @@ 设为故障 + @@ -495,6 +503,41 @@ const updateDeviceStatus = async (deviceId: string, status: string) => { } } +// 删除设备 +const deleteDevice = async (deviceId: string) => { + if (!confirm(`确定要删除设备 ${deviceId} 吗?此操作不可恢复。`)) { + return + } + + try { + const token = authStore.token + if (!token) { + router.push('/login') + return + } + + const result = await request>(`/api/web/device/delete/${deviceId}`, { + method: 'DELETE' + }) + + if (result.code === 200) { + // 从本地列表中移除设备 + devices.value = devices.value.filter(d => d.deviceId !== deviceId) + alert('设备删除成功') + } else { + alert(`删除设备失败: ${result.message}`) + } + } catch (error) { + console.error('删除设备失败:', error) + alert('删除设备失败') + if ((error as Error).message.includes('401')) { + authStore.logout() + router.push('/login') + } + } +} + + // 添加设备 const addDevice = async () => { try { @@ -852,5 +895,10 @@ onMounted(async () => { width: 90%; min-width: auto; } + + .btn-delete { + background-color: #ff4d4f; + color: white; + } }