Explorar el Código

实时大屏部分代码优化

wangxiaofei hace 1 mes
padre
commit
790a1e326d

+ 1 - 1
taphole-common/src/main/java/com/sckj/common/manager/TaskManager.java → taphole-common/src/main/java/com/sckj/common/manager/ScheduledTaskManager.java

@@ -10,7 +10,7 @@ import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 
 @Component
-public class TaskManager {
+public class ScheduledTaskManager {
 
     private final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);
     private final Map<String, ScheduledFuture<?>> tasks = new HashMap<>();

+ 14 - 1
taphole-common/src/main/java/com/sckj/common/util/RedisUtils.java

@@ -8,6 +8,7 @@ import org.springframework.data.redis.core.ScanOptions;
 import org.springframework.data.redis.serializer.RedisSerializer;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
 
 import javax.annotation.Resource;
 import java.util.*;
@@ -671,7 +672,7 @@ public class RedisUtils {
     public static void addFixedElement(String key, Object element, int maxSize) {
         // 将新的对象数组添加到列表头部
         redisTemplate.opsForList().leftPush(key, element);
-        // 修剪列表,只保留前 6 个元素
+        // 修剪列表,只保留前 maxSize 个元素
         redisTemplate.opsForList().trim(key, 0, maxSize - 1);
     }
 
@@ -685,4 +686,16 @@ public class RedisUtils {
         return redisTemplate.opsForList().range(key, 0, -1);
     }
 
+    /***
+     * 获取定数量最新的一条数据
+     * @param key
+     * @return
+     */
+    public static Object getFixedLatestElement(String key) {
+        // 获取列表中的所有元素
+        // 获取列表第一个元素(索引0)
+        List<Object> result = redisTemplate.opsForList().range(key, 0, 0);
+        return ObjectUtils.isEmpty(result) ? null : result.get(0);
+    }
+
 }

+ 79 - 46
taphole-iron/src/main/java/com/sckj/iron/socketio/DeviceEventListener.java

@@ -1,14 +1,12 @@
 package com.sckj.iron.socketio;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.corundumstudio.socketio.SocketIOClient;
 import com.corundumstudio.socketio.annotation.OnEvent;
 import com.google.common.eventbus.Subscribe;
 import com.sckj.camera.util.LocalDateUtils;
 import com.sckj.common.core.AjaxResult;
 import com.sckj.common.eventbus.EventListener;
-import com.sckj.common.manager.TaskManager;
+import com.sckj.common.manager.ScheduledTaskManager;
 import com.sckj.common.socketio.SocketUtil;
 import com.sckj.common.util.RedisUtils;
 import com.sckj.iron.dto.IronStepDTO;
@@ -25,9 +23,11 @@ import com.sckj.opc.entity.OPCData;
 import com.sckj.opc.opcua.L2DataServiceImpl;
 import com.sckj.opc.opcua.OPCDAServiceImpl;
 import com.sckj.opc.service.OPCDataServiceImpl;
+import com.sckj.opc.utils.CustomUtil;
 import com.sckj.warn.service.ITExceptionLogService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.expression.spel.standard.SpelExpressionParser;
 import org.springframework.expression.spel.support.StandardEvaluationContext;
@@ -127,6 +127,8 @@ public class DeviceEventListener extends EventListener {
     public static final String IRON_WEIGHT = "ironWeight";
     //出铁状态
     private static final String IRON_STATUS = "ironStatus";
+    //总干量
+    private static final String IRON_TOTAL_DRY = "ironTotalDry";
 
     //鱼雷罐车
     private static final String CAR_STATUS = "ylgc";
@@ -161,17 +163,18 @@ public class DeviceEventListener extends EventListener {
 
     //定时器
     @Resource
-    private TaskManager taskManager;
+    private ScheduledTaskManager scheduledTaskManager;
 
     //开口预警
-    private static final String TASKNAME_OPEN = "openHour";
+    private static final String TASKNAME_OPEN_WARN = "TASKNAME_OPEN_WARN";
     //堵口预警
-    private static final String TASKNAME_MUD = "mud";
+    private static final String TASKNAME_CLOSE_WARN = "TASKNAME_CLOSE_WARN";
     //出铁预警
-    private static final String TASKNAME_IRON_START = "ironStart";
+    private static final String TASKNAME_IRON_WARN = "TASKNAME_IRON_WARN";
     //出铁诊断
-    private static final String TASKNAME_IRON_END = "ironEnd";
+    private static final String TASKNAME_IRON_TEST = "TASKNAME_IRON_TEST";
 
+    private static final String TASKNAME_DRY = "dry";
 
     //是否出铁中
     //1 出铁中    0 出铁结束
@@ -193,11 +196,16 @@ public class DeviceEventListener extends EventListener {
     //开口耗时
     private int OPEND_HOUR;
 
+    //redis保存最多数量数据
+    private static final int MAX_REDIS_COUNT = 50;
+
     @PostConstruct
     public void init() {
-        taskManager.addTask("openHour", 0, 10, TimeUnit.SECONDS, () -> {
+        //程序启动后隔断时间启动订阅
+        scheduledTaskManager.addTask("opcsubscribe", 0, 15, TimeUnit.SECONDS, () -> {
             log.info("opcdaService subscribe available");
-//           opcdaService.subscribeAvailable();
+//            opcdaService.subscribeAvailable();
+            scheduledTaskManager.cancelTask("opcsubscribe");
         });
 
         mSteps = ironStepService.getTreeSteps();
@@ -246,7 +254,7 @@ public class DeviceEventListener extends EventListener {
         });
         //将L2实时数据保存到Redis
         taskExecutor.submit(() -> {
-            RedisUtils.addFixedElement(IRON_ELEMENT, l2Data, 6);
+            RedisUtils.addFixedElement(IRON_ELEMENT, l2Data, MAX_REDIS_COUNT);
             PushData.send2TrendIronElement(RedisUtils.getFixedElement(IRON_ELEMENT));
         });
 
@@ -325,6 +333,16 @@ public class DeviceEventListener extends EventListener {
         taskExecutor.submit(() -> {
             tl2MaterialService.saveOrUpdate(tl2Material);
         });
+
+        if (ironLoading1) {
+            BigDecimal bigDecimalNew = new BigDecimal(l2Material.getDryWeight());
+            totalDry = totalDry.add(bigDecimalNew);
+        } else {
+            totalDry = BigDecimal.ZERO;
+        }
+
+        RedisUtils.addFixedElement(IRON_TOTAL_DRY, totalDry, MAX_REDIS_COUNT);
+
     }
 
     //1号铁口正在出铁的操作项目
@@ -341,15 +359,15 @@ public class DeviceEventListener extends EventListener {
 
         //炉前在接受到炉内出铁要求后,10分钟内打开铁口,未打开系统告警并记录
         if (isReady) {
-            taskManager.addTask(TASKNAME_OPEN, 0, OPEND_HOUR, TimeUnit.MINUTES, () -> {
-                log.info("堵口预警:{}", TASKNAME_OPEN);
-                taskManager.cancelTask(TASKNAME_OPEN); // 终止定时器
+            scheduledTaskManager.addTask(TASKNAME_OPEN_WARN, 0, OPEND_HOUR, TimeUnit.MINUTES, () -> {
+                log.info("堵口预警:{}", TASKNAME_OPEN_WARN);
+
                 System.out.println("倒计时结束!10分钟已到。");
                 // 出铁预警,打开系统告警并记录
                 PushData.send2Warn("请立即打开铁口");
                 log.info("准备出铁但是未及时出铁口,此处数据库记录");
+                scheduledTaskManager.cancelTask(TASKNAME_OPEN_WARN); // 终止定时器
             });
-
         }
 
 
@@ -377,21 +395,30 @@ public class DeviceEventListener extends EventListener {
 
         //开始计算打泥量,通过打泥量公式
         //打泥量公式关联因素:铁口深度、钻杆直径、
-        taskManager.addTask(TASKNAME_MUD, 0, 1, TimeUnit.MINUTES, () -> {
+        scheduledTaskManager.addTask(TASKNAME_CLOSE_WARN, 0, 1, TimeUnit.MINUTES, () -> {
             //堵口预警
-            log.info("堵口预警:{},speed1:{},speed2:{},STANDARD_SPEED:{}", speed1, speed2, TASKNAME_OPEN);
+            log.info("堵口预警:{},speed1:{},speed2:{},STANDARD_SPEED:{}", speed1, speed2, TASKNAME_OPEN_WARN);
             if (speed1 > STANDARD_SPEED || speed2 > STANDARD_SPEED) {
-                /// 流速过大可能是由于铁口深度不足或发生跑大流问题,则提示将当前铁口堵口
-                PushData.send2Warn("流速过快请堵口");
+                //流速过大可能是由于铁口深度不足或发生跑大流问题,则提示将当前铁口堵口
+                PushData.send2Warn("流速过快,请堵口");
             } else if ((speed1 < STANDARD_SPEED || speed2 < STANDARD_SPEED) && (ironLoading2 || ironLoading3 || ironLoading4)) {
                 //若流速过小,但其它铁口正在出铁,则提示将当前铁口堵口
                 PushData.send2Warn("请堵口");
             } else if ((speed1 < STANDARD_SPEED || speed2 < STANDARD_SPEED) && (!ironLoading2 && !ironLoading3 && !ironLoading4)) {
                 //若流速过小且其他铁口均未出铁,则提示先将其它铁口打开,再进行堵口
-                PushData.send2Warn("请先将其它铁口打开再堵口");
+                PushData.send2Warn("请先将其它铁口打开,再堵口");
             }
         });
 
+        //计算总干量
+        //
+        scheduledTaskManager.addTask(TASKNAME_DRY, 0, 30, TimeUnit.SECONDS, () -> {
+            log.info("堵口预警:{},speed1:{},speed2:{},STANDARD_SPEED:{}", speed1, speed2, TASKNAME_OPEN_WARN);
+
+            //堵口预警
+            scheduledTaskManager.cancelTask(TASKNAME_DRY);
+        });
+
 
     }
 
@@ -399,24 +426,39 @@ public class DeviceEventListener extends EventListener {
     private void taphole1End() {
         //由 1-> 0 表明1号铁口结束出铁
         totalWeight = BigDecimal.ZERO;
-        taskManager.cancelTask(TASKNAME_OPEN);
-        taskManager.cancelTask(TASKNAME_MUD);
-        taskManager.cancelTask(TASKNAME_IRON_START);
+        totalDry = BigDecimal.ZERO;
+        scheduledTaskManager.cancelTask(TASKNAME_OPEN_WARN);
+        scheduledTaskManager.cancelTask(TASKNAME_CLOSE_WARN);
+        scheduledTaskManager.cancelTask(TASKNAME_IRON_WARN);
+        scheduledTaskManager.cancelTask(TASKNAME_DRY);
         recordAfter();
         recordBlock();
 
         //出铁结束后,查询最近两次的数据
-        LambdaQueryWrapper<TIronData> queryWrapper = new QueryWrapper<TIronData>().lambda().orderByDesc(TIronData::getCtcsbh);
-        List<TIronData> oldIronDataList = ironDataService.list(queryWrapper);
 
         //开始出铁诊断
         //获取开口耗时、出铁时间、实际出铁量、平均铁水流速、平均铁水温度等数据,进行阈值判定,诊断出铁是否正常
 
         //10分钟延迟
-        taskManager.addTask(TASKNAME_IRON_END, 0, 10, TimeUnit.MINUTES, () -> {
+        scheduledTaskManager.addTask(TASKNAME_IRON_TEST, 0, 3, TimeUnit.SECONDS, () -> {
             //堵口预警
-            log.info("定时任务:{},出铁诊断", TASKNAME_IRON_END);
-            taskManager.cancelTask(TASKNAME_IRON_END);
+            log.info("定时任务:{},出铁诊断", TASKNAME_IRON_TEST);
+            L2Data fixedLatestElement = (L2Data) RedisUtils.getFixedLatestElement(IRON_ELEMENT);
+            //平均温度
+            String mudWeight = fixedLatestElement.getAvgTemp();
+
+            //出铁时间
+            String ironCosttime = fixedLatestElement.getIronCosttime();
+            //实际出铁量
+            String ironWeight = fixedLatestElement.getIronWeight();
+
+            TIronData ironData = new TIronData();
+            BeanUtils.copyProperties(ironData, fixedLatestElement);
+
+            ironDataService.save(ironData);
+
+
+            scheduledTaskManager.cancelTask(TASKNAME_IRON_TEST);
         });
 
     }
@@ -431,8 +473,10 @@ public class DeviceEventListener extends EventListener {
         ironBlockService.add(null);
     }
 
-
+    //实时出铁总重量/总流量
     private BigDecimal totalWeight = BigDecimal.ZERO;
+    //总干量
+    private BigDecimal totalDry = BigDecimal.ZERO;
 
 
     /***
@@ -454,7 +498,7 @@ public class DeviceEventListener extends EventListener {
                 realtimeData.setTime(LocalDateUtils.formatDate(opcData.getServerTime()));
                 mRealtimeData.put(IRON_TEMP, realtimeData);
                 //redis添加数据
-                RedisUtils.addFixedElement(IRON_TEMP, realtimeData, 6);
+                RedisUtils.addFixedElement(IRON_TEMP, realtimeData, MAX_REDIS_COUNT);
                 PushData.send2TrendIronTemp(RedisUtils.getFixedElement(IRON_TEMP));
             } else if (opcData.getPointName().contains(TAG_CAR11) || opcData.getPointName().contains(TAG_CAR12)) {
 //            1TH-1号车受铁速度
@@ -490,7 +534,7 @@ public class DeviceEventListener extends EventListener {
                         && ObjectUtils.isNotEmpty(speeds[1]) && ObjectUtils.isNotEmpty(speeds[1].getValue())
                 ) {
                     ironSpeed.setTime(LocalDateUtils.formatDate(opcData.getServerTime()));
-                    RedisUtils.addFixedElement(IRON_SPEED, ironSpeed, 6);
+                    RedisUtils.addFixedElement(IRON_SPEED, ironSpeed, MAX_REDIS_COUNT);
                     PushData.send2TrendIronSpeed(RedisUtils.getFixedElement(IRON_SPEED));
                 }
             } else if (opcData.getPointName().contains(TAG_TAPHOLE1_STATUS)) {
@@ -531,10 +575,10 @@ public class DeviceEventListener extends EventListener {
                 totalWeight = totalWeight.add(bigDecimalNew);
                 ironWeight.setValue(totalWeight);
                 mRealtimeData.put(IRON_WEIGHT, ironWeight);
-                log.info(">>>>>>>>>>>>>{}:{},total:{}", opcData.getPointName(), opcData.getData(), totalWeight.toPlainString());
+//                log.info(">>>>>>>>>>>>>{}:{},total:{}", opcData.getPointName(), opcData.getData(), totalWeight.toPlainString());
 
                 ironWeight.setTime(LocalDateUtils.formatDate(opcData.getServerTime()));
-                RedisUtils.addFixedElement(IRON_WEIGHT, ironWeight, 6);
+                RedisUtils.addFixedElement(IRON_WEIGHT, ironWeight, MAX_REDIS_COUNT);
                 PushData.send2TrendIronWeight(RedisUtils.getFixedElement(IRON_WEIGHT));
 
             } else if (opcData.getPointName().contains(FLUSH_STATUS)) {
@@ -593,7 +637,6 @@ public class DeviceEventListener extends EventListener {
 
     }
 
-
     private synchronized void operate(OPCData mOPCData) {
         String pointName = mOPCData.getPointName();
         Object data = mOPCData.getData();
@@ -610,13 +653,7 @@ public class DeviceEventListener extends EventListener {
                         if (ObjectUtils.isEmpty(newPointName)) {
                             continue;
                         }
-
-                        if (newPointName.contains(".")) {
-                            newPointName = "channel." + newPointName;
-                        } else {
-                            newPointName = "channel.device." + newPointName;
-                        }
-
+                        newPointName =   CustomUtil.createNewPointName(newPointName);
                         if (Objects.equals(newPointName, pointName)) {
                             //3.创建变量上下文,设置变量
                             childchild.setData(data);
@@ -626,11 +663,7 @@ public class DeviceEventListener extends EventListener {
                     if (ObjectUtils.isEmpty(newPointName)) {
                         continue;
                     }
-                    if (newPointName.contains(".")) {
-                        newPointName = "channel." + newPointName;
-                    } else {
-                        newPointName = "channel.device." + newPointName;
-                    }
+                    newPointName = CustomUtil.createNewPointName(newPointName);
                     if (Objects.equals(newPointName, pointName)) {
                         child.setData(data);
                     }

+ 2 - 2
taphole-opc/src/main/java/com/sckj/opc/opcua/L2DataServiceImpl.java

@@ -90,12 +90,12 @@ public class L2DataServiceImpl {
                     if ("L2Data".equals(dataType)) {
                         L2Data receivedData = L2Data.fromDataStream(dis);
                         asyncEventBus.post(receivedData); //出铁操作
-                        System.out.println("Received L2Data from server: \n" + receivedData);
+//                        System.out.println("Received L2Data from server: \n" + receivedData);
                     } else if ("L2Material".equals(dataType)) {
                         L2Material receivedMaterial = L2Material.fromDataStream(dis);
                         // 新增材料处理逻辑,例如:
                          asyncEventBus.post(receivedMaterial);
-                        System.out.println("Received L2Material from server: \n" + receivedMaterial);
+//                        System.out.println("Received L2Material from server: \n" + receivedMaterial);
                     }
                 } catch (IOException e) {
                     System.err.println("Connection lost. Attempting to reconnect...");

+ 3 - 5
taphole-opc/src/main/java/com/sckj/opc/opcua/OPCDAServiceImpl.java

@@ -9,8 +9,10 @@ import com.sckj.opc.entity.OPCServer;
 import com.sckj.opc.service.OPCDataServiceImpl;
 import com.sckj.opc.service.OPCPointServiceImpl;
 import com.sckj.opc.service.OPCServerServiceImpl;
+import com.sckj.opc.utils.CustomUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.jinterop.dcom.common.JIException;
 import org.openscada.opc.lib.common.ConnectionInformation;
 import org.openscada.opc.lib.da.*;
@@ -94,11 +96,7 @@ public class OPCDAServiceImpl {
                             return null;
                         }
 
-                        if (newPointName.contains(".")) {
-                            newPointName = "channel." + newPointName;
-                        } else {
-                            newPointName = "channel.device." + newPointName;
-                        }
+                        newPointName =  CustomUtil.createNewPointName(newPointName);
 
                         log.info("{} start subscribe", newPointName);
 

+ 11 - 1
taphole-opc/src/main/java/com/sckj/opc/utils/CustomUtil.java

@@ -2,8 +2,8 @@ package com.sckj.opc.utils;
 
 import com.google.common.collect.Sets;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId;
-import org.springframework.util.StringUtils;
 
 import java.net.*;
 import java.util.*;
@@ -75,6 +75,16 @@ public class CustomUtil {
     }
 
 
+    public static String createNewPointName(String pointName) {
+        if (pointName.contains(".")) {
+            if (StringUtils.countMatches(pointName, ".") == 1) {
+                pointName = "channel." + pointName;
+            }
+        } else {
+            pointName = "channel.device." + pointName;
+        }
+        return pointName;
+    }
 
 
 }