diff --git a/ruoyi-admin/src/main/java/com/ruoyi/device/DeviceCar/controller/DeviceCarController.java b/ruoyi-admin/src/main/java/com/ruoyi/device/DeviceCar/controller/DeviceCarController.java index 0b449b7..a85c78c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/device/DeviceCar/controller/DeviceCarController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/device/DeviceCar/controller/DeviceCarController.java @@ -37,7 +37,6 @@ public class DeviceCarController extends BaseController /** * 查询设备信息列表 */ - @PreAuthorize("@ss.hasPermi('device:DeviceCar:list')") @GetMapping("/list") public TableDataInfo list(DeviceCar deviceCar) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/device/srgv/controller/DeviceSrgvController.java b/ruoyi-admin/src/main/java/com/ruoyi/device/srgv/controller/DeviceSrgvController.java index c62de89..c132797 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/device/srgv/controller/DeviceSrgvController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/device/srgv/controller/DeviceSrgvController.java @@ -37,7 +37,6 @@ public class DeviceSrgvController extends BaseController /** * 查询四向小车设备表列表 */ - @PreAuthorize("@ss.hasPermi('device:srgv:list')") @GetMapping("/list") public TableDataInfo list(DeviceSrgv deviceSrgv) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/device/ssj/controller/DeviceSsjController.java b/ruoyi-admin/src/main/java/com/ruoyi/device/ssj/controller/DeviceSsjController.java index 231ada4..de9112f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/device/ssj/controller/DeviceSsjController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/device/ssj/controller/DeviceSsjController.java @@ -37,7 +37,6 @@ public class DeviceSsjController extends BaseController /** * 查询输送机列表 */ - @PreAuthorize("@ss.hasPermi('device:ssj:list')") @GetMapping("/list") public TableDataInfo list(DeviceSsj deviceSsj) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/device/tsj/controller/DeviceTsjController.java b/ruoyi-admin/src/main/java/com/ruoyi/device/tsj/controller/DeviceTsjController.java index 06967ce..b70f289 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/device/tsj/controller/DeviceTsjController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/device/tsj/controller/DeviceTsjController.java @@ -37,7 +37,6 @@ public class DeviceTsjController extends BaseController /** * 查询提升机设备列表 */ - @PreAuthorize("@ss.hasPermi('device:tsj:list')") @GetMapping("/list") public TableDataInfo list(DeviceTsj deviceTsj) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/index/controller/IndexController.java b/ruoyi-admin/src/main/java/com/ruoyi/index/controller/IndexController.java index 3e57e6b..0ce166c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/index/controller/IndexController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/index/controller/IndexController.java @@ -250,7 +250,6 @@ public class IndexController extends BaseController { statusCount.put("SRGV", new HashMap<>()); statusCount.put("TSJ", new HashMap<>()); statusCount.put("SSJ", new HashMap<>()); - // 查询DeviceCar数据(AGV) DeviceSrgv deviceSrgv = new DeviceSrgv(); List deviceSrgvs = deviceSrgvService.selectDeviceSrgvList(deviceSrgv); @@ -274,19 +273,15 @@ public class IndexController extends BaseController { for (DeviceSsj ssj : ssjList) { int taskNo = ssj.getTaskNo(); String status = "其他"; - // 根据taskNo判断状态:不等于空或0时为运行状态 if (taskNo != 0) { status = "运行"; } - Map typeStatusCount = statusCount.get("SSJ"); typeStatusCount.put(status, typeStatusCount.getOrDefault(status, 0) + 1); } - DeviceTsj deviceTsj = new DeviceTsj(); List TsjList = deviceTsjService.selectDeviceTsjList(deviceTsj); - for (DeviceTsj tsj : TsjList){ Long taskNo = tsj.getRwh(); String status = "其他"; @@ -296,7 +291,6 @@ public class IndexController extends BaseController { Map typeStatusCount = statusCount.get("TSJ"); typeStatusCount.put(status,typeStatusCount.getOrDefault(status,0) + 1); } - return AjaxResult.success(statusCount); } catch (Exception e) { return AjaxResult.error("获取设备状态分布数据失败"); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/ScheduleThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/ScheduleThread.java index faa0925..8248aaf 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/ScheduleThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/ScheduleThread.java @@ -29,14 +29,22 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import java.lang.reflect.Field; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @Component @Slf4j public class ScheduleThread { + public Map> threadMap = new ConcurrentHashMap<>(); + public Map threadDescMap = new ConcurrentHashMap<>(); + public Map threadTypeMap = new ConcurrentHashMap<>(); + public CustomThread plcSsjReadCustomThread; public CustomThread plcCdzjReadCustomThread; public CustomThread plcTsjReadCustomThread; @@ -49,12 +57,7 @@ public class ScheduleThread { public CustomThread sRgvThreadCustomThread; public CustomThread tsjThreadCustomThread; public CustomThread cdzThreadCustomThread; -// public CustomThread ddj1CustomThread; - /*public CustomThread ddj2CustomThread; - public CustomThread ddj3CustomThread; - public CustomThread ddj4CustomThread; - public CustomThread ddj5CustomThread; - public CustomThread ddj6CustomThread;*/ + @Autowired private IDeviceSsjService deviceSsjService; @Autowired @@ -85,23 +88,27 @@ public class ScheduleThread { log.info("调度服务执行成功"); } + /** * 调度初始化 */ private void scheduleInit() { //输送机线程 - SsjThread ssjThread=new SsjThread(); - ssjThreadCustomThread=new CustomThread(new Thread(ssjThread),ssjThread); -// //四向车线程 - SRgv1Thread srgvThread=new SRgv1Thread(); - sRgvThreadCustomThread=new CustomThread<>(new Thread(srgvThread),srgvThread); + SsjThread ssjThread = new SsjThread(); + ssjThreadCustomThread = new CustomThread(new Thread(ssjThread, "ssjThreadCustomThread"), ssjThread); + //四向车线程 + SRgv1Thread srgvThread = new SRgv1Thread(); + sRgvThreadCustomThread = new CustomThread<>(new Thread(srgvThread, "sRgvThreadCustomThread"), srgvThread); //提升机线程 - TsjThread tsjThread=new TsjThread(); - tsjThreadCustomThread=new CustomThread<>(new Thread(tsjThread),tsjThread); + TsjThread tsjThread = new TsjThread(); + tsjThreadCustomThread = new CustomThread<>(new Thread(tsjThread, "tsjThreadCustomThread"), tsjThread); //充电线程 CdzThread cdzThread = new CdzThread(); - cdzThreadCustomThread=new CustomThread<>(new Thread(cdzThread),cdzThread); + cdzThreadCustomThread = new CustomThread<>(new Thread(cdzThread, "cdzThreadCustomThread"), cdzThread); + + refreshThreadMap(); } + /** * plc读取初始化 */ @@ -114,17 +121,17 @@ public class ScheduleThread { ssjList.put(deviceSsj.getDeviceCode(), deviceSsj); } PlcSsjRead plcSsjRead = new PlcSsjRead(ssjList, new PlcConnectInfo("127.0.0.1", 1502)); - Thread plcSsjReadThread = new Thread(plcSsjRead); + Thread plcSsjReadThread = new Thread(plcSsjRead, "plcSsjReadCustomThread"); plcSsjReadCustomThread = new CustomThread(plcSsjReadThread, plcSsjRead); //plc充电桩读取线程 ConcurrentHashMap cdzList = new ConcurrentHashMap<>(); - List deviceCdzList =deviceCdzService.selectDeviceCdzList(new DeviceCdz()); + List deviceCdzList = deviceCdzService.selectDeviceCdzList(new DeviceCdz()); for (DeviceCdz deviceCdz : deviceCdzList) { - cdzList.put(String.valueOf(deviceCdz.getId()),deviceCdz); + cdzList.put(String.valueOf(deviceCdz.getId()), deviceCdz); } PlcCdzRead plcCdzRead = new PlcCdzRead(cdzList, new PlcConnectInfo("127.0.0.1", 1502)); - Thread plcCdzReadThread = new Thread(plcCdzRead); + Thread plcCdzReadThread = new Thread(plcCdzRead, "plcCdzjReadCustomThread"); plcCdzjReadCustomThread = new CustomThread(plcCdzReadThread, plcCdzRead); @@ -136,83 +143,100 @@ public class ScheduleThread { } //plc提升机读取线程 PlcTsjRead plcTsjRead = new PlcTsjRead(tsjList, new PlcConnectInfo("127.0.0.1", 1502)); - Thread plcTsjReadThread = new Thread(plcTsjRead); + Thread plcTsjReadThread = new Thread(plcTsjRead, "plcTsjReadCustomThread"); plcTsjReadCustomThread = new CustomThread(plcTsjReadThread, plcTsjRead); ConcurrentHashMap srgvList = new ConcurrentHashMap<>(); - List srgvs=deviceSrgvService.selectDeviceSrgvList(new DeviceSrgv()); - for(DeviceSrgv srgv:srgvs){ - srgvList.put(srgv.getDeviceId().toString(),srgv); - switch (srgv.getDeviceId()){ + List srgvs = deviceSrgvService.selectDeviceSrgvList(new DeviceSrgv()); + for (DeviceSrgv srgv : srgvs) { + srgvList.put(srgv.getDeviceId().toString(), srgv); + switch (srgv.getDeviceId()) { case 1: - PlcSrgvRead plcSrgvRead1=new PlcSrgvRead(srgv,new PlcConnectInfo(srgv.getIp(),srgv.getPort())); - Thread plcSrgvReadThread1 = new Thread((plcSrgvRead1)); - plcSrgvReadCustomThread1=new CustomThread(plcSrgvReadThread1,plcSrgvRead1); + PlcSrgvRead plcSrgvRead1 = new PlcSrgvRead(srgv, new PlcConnectInfo(srgv.getIp(), srgv.getPort())); + Thread plcSrgvReadThread1 = new Thread(plcSrgvRead1, "plcSrgvReadCustomThread1"); + plcSrgvReadCustomThread1 = new CustomThread(plcSrgvReadThread1, plcSrgvRead1); break; case 2: - PlcSrgvRead plcSrgvRead2=new PlcSrgvRead(srgv,new PlcConnectInfo(srgv.getIp(),srgv.getPort())); - Thread plcSrgvReadThread2 = new Thread((plcSrgvRead2)); - plcSrgvReadCustomThread2=new CustomThread(plcSrgvReadThread2,plcSrgvRead2); + PlcSrgvRead plcSrgvRead2 = new PlcSrgvRead(srgv, new PlcConnectInfo(srgv.getIp(), srgv.getPort())); + Thread plcSrgvReadThread2 = new Thread(plcSrgvRead2, "plcSrgvReadCustomThread2"); + plcSrgvReadCustomThread2 = new CustomThread(plcSrgvReadThread2, plcSrgvRead2); break; } } - PlcSrgvRead.deviceSrgvMap=srgvList; + PlcSrgvRead.deviceSrgvMap = srgvList; //监控线程 MonitoringThread monitoringThread = new MonitoringThread(); - monitoringCustomThread = new CustomThread(new Thread(monitoringThread), monitoringThread); + monitoringCustomThread = new CustomThread(new Thread(monitoringThread, "monitoringCustomThread"), monitoringThread); + + refreshThreadMap(); + } + + public void refreshThreadMap() { + registerThread("plcSsjReadCustomThread", plcSsjReadCustomThread, "PLC输送机读取线程", "read"); + registerThread("plcCdzjReadCustomThread", plcCdzjReadCustomThread, "PLC充电桩读取线程", "read"); + registerThread("plcTsjReadCustomThread", plcTsjReadCustomThread, "PLC提升机读取线程", "read"); + registerThread("plcSrgvReadCustomThread1", plcSrgvReadCustomThread1, "PLC四向车1读取线程", "read"); + registerThread("plcSrgvReadCustomThread2", plcSrgvReadCustomThread2, "PLC四向车2读取线程", "read"); + registerThread("monitoringCustomThread", monitoringCustomThread, "监控线程", "monitor"); + registerThread("ssjThreadCustomThread", ssjThreadCustomThread, "输送机调度线程", "schedule"); + registerThread("sRgvThreadCustomThread", sRgvThreadCustomThread, "四向车调度线程", "schedule"); + registerThread("tsjThreadCustomThread", tsjThreadCustomThread, "提升机调度线程", "schedule"); + registerThread("cdzThreadCustomThread", cdzThreadCustomThread, "充电调度线程", "schedule"); + } + + private void registerThread(String key, CustomThread thread, String desc, String type) { + if (thread != null) { + threadMap.put(key, thread); + threadDescMap.put(key, desc); + threadTypeMap.put(key, type); + } } /** - * 开始线程 + * 开始线程 读取 */ public void startAllThread() { plcSsjReadCustomThread.getThread().start(); plcSrgvReadCustomThread1.getThread().start(); -// plcSrgvReadCustomThread2.getThread().start(); + plcSrgvReadCustomThread2.getThread().start(); plcTsjReadCustomThread.getThread().start(); monitoringCustomThread.getThread().start(); //充电桩读取线程 -// plcCdzjReadCustomThread.getThread().start(); + plcCdzjReadCustomThread.getThread().start(); isRun = true; } /** - * 开启线程2 + * 开启线程2 调度 */ public void startAllThread2() { ssjThreadCustomThread.thread.start(); tsjThreadCustomThread.thread.start(); sRgvThreadCustomThread.thread.start(); -// cdzThreadCustomThread.thread.start(); + cdzThreadCustomThread.thread.start(); isRun2 = true; } /** - * 停止线程 + * 停止线程读取 */ public void stopAllThread() { plcSsjReadCustomThread.runnable.isRun = false; -// plcDdj1ReadCustomThread.runnable.isRun = false; - /* plcDdj2ReadCustomThread.runnable.isRun = false; - plcDdj3ReadCustomThread.runnable.isRun = false; - plcDdj4ReadCustomThread.runnable.isRun = false; - plcDdj5ReadCustomThread.runnable.isRun = false; - plcDdj6ReadCustomThread.runnable.isRun = false;*/ + plcSrgvReadCustomThread1.runnable.isRun = false; + plcSrgvReadCustomThread2.runnable.isRun = false; + plcTsjReadCustomThread.runnable.isRun = false; + monitoringCustomThread.runnable.isRun = false; plcReadInit(); isRun = false; } /** - * 停止线程2 + * 停止线程调度 */ public void stopAllThread2() { - monitoringCustomThread.runnable.isRun = false; -// ddj1CustomThread.runnable.isRun = false; - /*ddj2CustomThread.runnable.isRun = false; - ddj3CustomThread.runnable.isRun = false; - ddj4CustomThread.runnable.isRun = false; - ddj5CustomThread.runnable.isRun = false; - ddj6CustomThread.runnable.isRun = false;*/ + ssjThreadCustomThread.runnable.isRun = false; + tsjThreadCustomThread.runnable.isRun = false; + sRgvThreadCustomThread.runnable.isRun = false; scheduleInit(); isRun2 = false; } @@ -220,11 +244,91 @@ public class ScheduleThread { /** * 获取调度状态 */ - public HashMap getScheduleStatus() { - HashMap map = new HashMap<>(); - map.put("isRun",isRun); - map.put("isRun2",isRun2); + public HashMap getScheduleStatus() { + HashMap map = new HashMap<>(); + map.put("isRun", isRun); + map.put("isRun2", isRun2); return map; } + /** + * 获取所有受管线程状态 + */ + public List> getAllThreadStatus() { + List> list = new ArrayList<>(); + for (String key : threadDescMap.keySet()) { + CustomThread ct = threadMap.get(key); + Map info = new HashMap<>(); + info.put("key", key); + info.put("name", threadDescMap.get(key)); + info.put("type", threadTypeMap.get(key)); + boolean alive = false; + boolean isRun = false; + if (ct != null && ct.getRunnable() != null) { + try { + Field field = ct.getRunnable().getClass().getField("isRun"); + isRun = field.getBoolean(ct.getRunnable()); + } catch (Exception e) { + log.error("获取线程[{}]isRun状态异常", key); + } + } + info.put("isRun", isRun); + if (ct != null && ct.getThread() != null) { + alive = ct.getThread().isAlive(); + } + info.put("alive", alive); + list.add(info); + } + return list; + } + + /** + * 启动指定线程 + */ + public synchronized void startThread(String key) { + CustomThread ct = threadMap.get(key); + if (ct == null) { + throw new RuntimeException("未知线程: " + key); + } + if (ct.getThread() != null && ct.getThread().isAlive()) { + log.info("线程 {} 已经在运行中", key); + return; + } + + // 设置Runnable isRun = true + setRunnableIsRun(ct.getRunnable(), true); + + // 创建新线程 + Thread newThread = new Thread((Runnable) ct.getRunnable(), key); + ct.setThread(newThread); + newThread.start(); + log.info("线程 {} 已启动", key); + } + + /** + * 停止指定线程 + */ + public synchronized void stopThread(String key) { + CustomThread ct = threadMap.get(key); + if (ct == null) { + throw new RuntimeException("未知线程: " + key); + } + // 设置Runnable isRun = false + setRunnableIsRun(ct.getRunnable(), false); + log.info("线程 {} 停止指令已下发", key); + } + + private void setRunnableIsRun(Object runnable, boolean isRun) { + try { + Field field = runnable.getClass().getField("isRun"); // 使用getField获取public字段 + field.setBoolean(runnable, isRun); + } catch (NoSuchFieldException e) { + // 尝试查找父类或非public字段? 目前都是public + log.error("无法找到isRun字段: {}", runnable.getClass().getName()); + } catch (IllegalAccessException e) { + log.error("无法访问isRun字段: {}", runnable.getClass().getName()); + } + } + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java index b325691..7eeedcd 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java @@ -99,7 +99,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { for (String code : sRgvCodeList.get("srgv")) { if (PlcSrgvRead.deviceSrgvMap.containsKey(code)) { if (ObjUtil.isNotNull(PlcSrgvRead.deviceSrgvMap.get(code))) { - + log.info("小车处理开始"); DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(code); sRgvTask(deviceSrgv); @@ -109,6 +109,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { inCharging(deviceSrgv); outCharging(deviceSrgv); + log.info("小车处理结束"); } else { log.error("小车设备为空"); diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 4e90c86..12cbaa5 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -64,7 +64,7 @@ spring: devtools: restart: # 热部署开关 - enabled: true + enabled: false # redis 配置 redis: # 地址 diff --git a/ruoyi-ui/src/layout/components/Navbar.vue b/ruoyi-ui/src/layout/components/Navbar.vue index 5646eac..a858bc0 100644 --- a/ruoyi-ui/src/layout/components/Navbar.vue +++ b/ruoyi-ui/src/layout/components/Navbar.vue @@ -7,18 +7,6 @@