From c276e09c7f3efdfaf40a629a6ea1f0a0fce2065f Mon Sep 17 00:00:00 2001 From: lj7788 Date: Sun, 4 Jan 2026 17:40:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E5=8F=91LED=E7=9B=91=E6=8E=A7?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yanzhu/system/domain/SysLedscreen.java | 28 ++ .../mapper/system/SysLedscreenMapper.xml | 33 +- .../com/yanzhu/led/LedMainApplication.java | 40 ++ .../yanzhu/led/controller/LedController.java | 8 +- .../yanzhu/led/service/ILedScreenService.java | 6 + .../yanzhu/led/service/LedDrawService.java | 9 + .../service/impl/LedScreenServiceImpl.java | 27 +- yanzhu-ui-vue3/src/api/system/led.js | 44 ++ .../src/views/system/ledscreen/ledRunInfo.vue | 442 ++++++++++++++++++ 9 files changed, 618 insertions(+), 19 deletions(-) create mode 100644 yanzhu-ui-vue3/src/api/system/led.js create mode 100644 yanzhu-ui-vue3/src/views/system/ledscreen/ledRunInfo.vue diff --git a/yanzhu-common/yanzhu-common-mapper/src/main/java/com/yanzhu/system/domain/SysLedscreen.java b/yanzhu-common/yanzhu-common-mapper/src/main/java/com/yanzhu/system/domain/SysLedscreen.java index 8f1e8fe1..a5a80989 100644 --- a/yanzhu-common/yanzhu-common-mapper/src/main/java/com/yanzhu/system/domain/SysLedscreen.java +++ b/yanzhu-common/yanzhu-common-mapper/src/main/java/com/yanzhu/system/domain/SysLedscreen.java @@ -80,6 +80,14 @@ public class SysLedscreen extends BaseEntity @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") private Long state; + /** 项目名称 */ + @Excel(name = "项目名称") + private String projectName; + + /** 工区名称 */ + @Excel(name = "工区名称") + private String workareaName; + public void setId(Long id) { this.id = id; @@ -198,6 +206,26 @@ public class SysLedscreen extends BaseEntity return state; } + public void setProjectName(String projectName) + { + this.projectName = projectName; + } + + public String getProjectName() + { + return projectName; + } + + public void setWorkareaName(String workareaName) + { + this.workareaName = workareaName; + } + + public String getWorkareaName() + { + return workareaName; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) diff --git a/yanzhu-common/yanzhu-common-mapper/src/main/resources/mapper/system/SysLedscreenMapper.xml b/yanzhu-common/yanzhu-common-mapper/src/main/resources/mapper/system/SysLedscreenMapper.xml index f493b8c5..a63d79f4 100644 --- a/yanzhu-common/yanzhu-common-mapper/src/main/resources/mapper/system/SysLedscreenMapper.xml +++ b/yanzhu-common/yanzhu-common-mapper/src/main/resources/mapper/system/SysLedscreenMapper.xml @@ -24,33 +24,38 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + - select id, project_id, workarea_id, device_name, device_sn, width, height, frequency, draw_type, title, enabled, is_del, state, is_online, remark, create_by, create_time, update_by, update_time from sys_ledscreen + select sl.id, sl.project_id, sl.workarea_id, sl.device_name, sl.device_sn, sl.width, sl.height, sl.frequency, sl.draw_type, sl.title, sl.enabled, sl.is_del, sl.state, sl.is_online, sl.remark, sl.create_by, sl.create_time, sl.update_by, sl.update_time, pi.project_name, wa.title as workarea_name + from sys_ledscreen sl + left join pro_project_info pi on sl.project_id = pi.id + left join sys_work_area wa on sl.workarea_id = wa.id diff --git a/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/LedMainApplication.java b/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/LedMainApplication.java index ad5df5c1..6734ecf4 100644 --- a/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/LedMainApplication.java +++ b/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/LedMainApplication.java @@ -112,6 +112,17 @@ public class LedMainApplication { return new String[]{"image1.jpg", "image2.jpg", "image3.jpg"}; // 实际使用时应从配置或数据库获取 } + private boolean ledIsOnline(String deviceSn) { + try { + if(ledServerService.getServer()==null){ + return false; + } + return ledServerService.getServer().getOnlineScreenByNetId(deviceSn) != null; + } catch (Exception e) { + logger.error(e.getMessage(), e); + return false; + } + } /** * 定期刷新所有LED屏 */ @@ -121,6 +132,18 @@ public class LedMainApplication { List ledScreens = ledScreenService.getAllLedScreens(); for (SysLedscreen ledScreen : ledScreens) { + // 检查设备的实际连接状态 + boolean isActuallyOnline = ledIsOnline(ledScreen.getDeviceSn()); + boolean wasOnline = ledScreen.isOnline(); + + // 如果在线状态改变,更新缓存和数据库 + if (isActuallyOnline != wasOnline) { + ledScreen.setOnline(isActuallyOnline); + ledScreenService.updateLedScreen(ledScreen); + logger.info("LED屏 {} 在线状态已更新: {} -> {}", + ledScreen.getDeviceSn(), wasOnline, isActuallyOnline); + } + // 检查是否已有对应的任务 if (!refreshTasks.containsKey(ledScreen.getDeviceSn())) { // 如果没有对应的任务,则创建新任务 @@ -186,10 +209,27 @@ public class LedMainApplication { return ledDrawService.getConnectedScreenCount(); } + /** + * 获取已连接的屏幕数量(按项目ID筛选) + * @param projectId 项目ID,如果为null则返回所有已连接屏幕数量 + */ + public int getConnectedScreenCount(Long projectId) { + List screens = ledScreenService.getAllLedScreensFromCacheByProjectId(projectId); + return (int) screens.stream().filter(SysLedscreen::isOnline).count(); + } + /** * 从缓存获取所有LED屏 */ public List getAllScreensFromCache() { return ledScreenService.getAllLedScreensFromCache(); } + + /** + * 从缓存获取所有LED屏(按项目ID筛选) + * @param projectId 项目ID,如果为null则返回所有LED屏 + */ + public List getAllScreensFromCache(Long projectId) { + return ledScreenService.getAllLedScreensFromCacheByProjectId(projectId); + } } \ No newline at end of file diff --git a/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/controller/LedController.java b/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/controller/LedController.java index 94b8ec87..3658c7de 100644 --- a/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/controller/LedController.java +++ b/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/controller/LedController.java @@ -18,9 +18,9 @@ public class LedController { * 获取服务器运行状态 */ @GetMapping("/status") - public String getServerStatus() { + public String getServerStatus(@RequestParam(required = false) Long projectId) { boolean isRunning = ledMainApplication.isServerRunning(); - int connectedCount = ledMainApplication.getConnectedScreenCount(); + int connectedCount = ledMainApplication.getConnectedScreenCount(projectId); return String.format("服务器运行状态: %s, 已连接屏幕数量: %d", isRunning ? "运行中" : "已停止", connectedCount); } @@ -28,8 +28,8 @@ public class LedController { * 获取所有LED屏信息 */ @GetMapping("/screens") - public List getAllScreens() { - return ledMainApplication.getAllScreensFromCache(); + public List getAllScreens(@RequestParam(required = false) Long projectId) { + return ledMainApplication.getAllScreensFromCache(projectId); } /** diff --git a/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/service/ILedScreenService.java b/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/service/ILedScreenService.java index d85ec1b4..35417456 100644 --- a/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/service/ILedScreenService.java +++ b/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/service/ILedScreenService.java @@ -35,5 +35,11 @@ public interface ILedScreenService { */ List getAllLedScreensFromCache(); + /** + * 根据项目ID从内存缓存获取LED屏 + * @param projectId 项目ID,如果为null则返回所有LED屏 + */ + List getAllLedScreensFromCacheByProjectId(Long projectId); + String[] getImagePathsForScreen(SysLedscreen ledScreen); } \ No newline at end of file diff --git a/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/service/LedDrawService.java b/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/service/LedDrawService.java index 3ed49e8d..f57d5167 100644 --- a/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/service/LedDrawService.java +++ b/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/service/LedDrawService.java @@ -150,4 +150,13 @@ public class LedDrawService { public int getConnectedScreenCount() { return connectedScreens.size(); } + + /** + * 检查指定设备是否已连接 + * @param deviceSn 设备序列号 + * @return true表示已连接,false表示未连接 + */ + public boolean isConnected(String deviceSn) { + return connectedScreens.containsKey(deviceSn); + } } \ No newline at end of file diff --git a/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/service/impl/LedScreenServiceImpl.java b/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/service/impl/LedScreenServiceImpl.java index 7cfedc74..42fff90f 100644 --- a/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/service/impl/LedScreenServiceImpl.java +++ b/yanzhu-modules/yanzhu-led/src/main/java/com/yanzhu/led/service/impl/LedScreenServiceImpl.java @@ -44,8 +44,19 @@ public class LedScreenServiceImpl implements ILedScreenService { List ledScreens = new ArrayList<>(); for (SysLedscreen ledscreen : sysWorkAreaList) { + // 检查缓存中是否已存在该屏幕 + SysLedscreen cachedScreen = ledScreenMap.get(ledscreen.getDeviceSn()); + + // 如果缓存中存在,保留缓存中的 isOnline 状态 + if (cachedScreen != null) { + ledscreen.setOnline(cachedScreen.isOnline()); + } else { + // 如果缓存中不存在,默认设置为离线 + ledscreen.setOnline(false); + } + ledScreens.add(ledscreen); - // 同时更新内存中的缓存 + // 更新内存中的缓存 ledScreenMap.put(ledscreen.getDeviceSn(), ledscreen); } @@ -102,6 +113,20 @@ public class LedScreenServiceImpl implements ILedScreenService { return new ArrayList<>(ledScreenMap.values()); } + /** + * 根据项目ID从内存缓存获取LED屏 + * @param projectId 项目ID,如果为null则返回所有LED屏 + */ + @Override + public List getAllLedScreensFromCacheByProjectId(Long projectId) { + if (projectId == null) { + return getAllLedScreensFromCache(); + } + return ledScreenMap.values().stream() + .filter(screen -> projectId.equals(screen.getProjectId())) + .collect(Collectors.toList()); + } + @Override /** * 获取LED屏要显示的图片路径 diff --git a/yanzhu-ui-vue3/src/api/system/led.js b/yanzhu-ui-vue3/src/api/system/led.js new file mode 100644 index 00000000..16053002 --- /dev/null +++ b/yanzhu-ui-vue3/src/api/system/led.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 获取服务器运行状态 +export function getServerStatus(projectId) { + return request({ + url: '/manage/led/status', + method: 'get', + params: { projectId } + }) +} + +// 获取所有LED屏信息 +export function getAllScreens(projectId) { + return request({ + url: '/manage/led/screens', + method: 'get', + params: { projectId } + }) +} + +// 根据NetID获取特定LED屏信息 +export function getScreenByNetId(netId) { + return request({ + url: '/manage/led/screens/' + netId, + method: 'get' + }) +} + +// 手动刷新特定LED屏 +export function refreshScreen(netId) { + return request({ + url: '/manage/led/screens/' + netId + '/refresh', + method: 'post' + }) +} + +// 更新LED屏配置 +export function updateScreen(data) { + return request({ + url: '/manage/led/screens', + method: 'put', + data: data + }) +} \ No newline at end of file diff --git a/yanzhu-ui-vue3/src/views/system/ledscreen/ledRunInfo.vue b/yanzhu-ui-vue3/src/views/system/ledscreen/ledRunInfo.vue new file mode 100644 index 00000000..bc93145e --- /dev/null +++ b/yanzhu-ui-vue3/src/views/system/ledscreen/ledRunInfo.vue @@ -0,0 +1,442 @@ + + + + +