|
@@ -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);
|
|
|
}
|