Browse Source

对项目代码整体优化

wangxiaofei 1 month ago
parent
commit
94a190d20b
34 changed files with 773 additions and 341 deletions
  1. 1 0
      pom.xml
  2. 1 6
      taphole-admin/src/main/resources/application-dev.yml
  3. 1 6
      taphole-admin/src/main/resources/application-prod.yml
  4. 0 6
      taphole-admin/src/main/resources/application-test.yml
  5. 0 9
      taphole-admin/src/main/resources/loadFFmpeg.properties
  6. 58 0
      taphole-iron/src/main/java/com/sckj/iron/constant/ParamsConstants.java
  7. 33 2
      taphole-iron/src/main/java/com/sckj/iron/constant/ScheduledTimeConstants.java
  8. 1 1
      taphole-iron/src/main/java/com/sckj/iron/constant/TaskNameConstants.java
  9. 15 0
      taphole-iron/src/main/java/com/sckj/iron/controller/TIronStepController.java
  10. 8 5
      taphole-iron/src/main/java/com/sckj/iron/dto/WarnData.java
  11. 3 0
      taphole-iron/src/main/java/com/sckj/iron/entity/TIronParam.java
  12. 1 1
      taphole-iron/src/main/java/com/sckj/iron/manager/HikCameraManager.java
  13. 1 1
      taphole-iron/src/main/java/com/sckj/iron/service/impl/CameraFileServiceImpl.java
  14. 0 3
      taphole-iron/src/main/java/com/sckj/iron/service/impl/CameraFlowServiceImpl.java
  15. 14 7
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronStepServiceImpl.java
  16. 229 204
      taphole-iron/src/main/java/com/sckj/iron/socketio/DeviceEventListener.java
  17. 20 3
      taphole-iron/src/main/java/com/sckj/iron/socketio/PushData.java
  18. 0 67
      taphole-iron/src/main/java/com/sckj/iron/vo/IronOperataion.java
  19. 2 1
      taphole-l2-start/pom.xml
  20. 1 1
      taphole-l2-start/src/main/java/com/sckj/l2start/listener/L2EventListener.java
  21. 7 6
      taphole-l2-start/src/main/resources/banner.txt
  22. 1 1
      taphole-l2-start/src/main/resources/log4j2-spring.xml
  23. 2 2
      taphole-l2/src/main/java/com/sckj/l2/entity/TL2Data.java
  24. 12 6
      taphole-l2/src/main/java/com/sckj/l2/service/impl/TL2DataServiceImpl.java
  25. 1 1
      taphole-l2/src/main/resources/mapper/TL2DataMapper.xml
  26. 56 0
      taphole-opc-start/pom.xml
  27. 43 0
      taphole-opc-start/src/main/java/com/sckj/opcstart/TapholeOpcStartApplication.java
  28. 30 0
      taphole-opc-start/src/main/resources/application-dev.yml
  29. 25 0
      taphole-opc-start/src/main/resources/application-prod.yml
  30. 32 0
      taphole-opc-start/src/main/resources/application-test.yml
  31. 78 0
      taphole-opc-start/src/main/resources/application.yml
  32. 10 0
      taphole-opc-start/src/main/resources/banner.txt
  33. 85 0
      taphole-opc-start/src/main/resources/log4j2-spring.xml
  34. 2 2
      taphole-warn/src/main/java/com/sckj/warn/validate/TExceptionLogCreateValidate.java

+ 1 - 0
pom.xml

@@ -18,6 +18,7 @@
         <module>taphole-warn</module>
         <module>taphole-iron</module>
         <module>taphole-opc</module>
+        <module>taphole-opc-start</module>
         <module>taphole-l2</module>
         <module>taphole-l2-start</module>
     </modules>

+ 1 - 6
taphole-admin/src/main/resources/application-dev.yml

@@ -34,12 +34,7 @@ spring:
 #mybatis-plus:
 #    configuration:
 #      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-camera:
-  filepath: D:/opt/camera
-  rtmp:
-    rtmphost: 127.0.0.1:1935
-    httphost: 127.0.0.1:80
-    webrtchost: 117.72.49.153:8000
+
 
 socketio:
  # host: 127.0.0.1		#主机名,默认是 0.0.0.0 (这个设不设置无所谓,因为后面的 SocketConfig 类一般不用设置这个)

+ 1 - 6
taphole-admin/src/main/resources/application-prod.yml

@@ -27,12 +27,7 @@ spring:
 #mybatis-plus:
 #    configuration:
 #      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-camera:
-  filepath: /home/xiaofei/uploads/taphole/
-  rtmp:
-    rtmphost: 192.168.110.130:1935
-    httphost: 192.168.110.130:18000
-    webrtchost: 192.168.110.130:8000
+
 
 socketio:
   #host: 0.0.0.0		#主机名,默认是 0.0.0.0 (这个设不设置无所谓,因为后面的 SocketConfig 类一般不用设置这个)

+ 0 - 6
taphole-admin/src/main/resources/application-test.yml

@@ -34,12 +34,6 @@ spring:
 #mybatis-plus:
 #    configuration:
 #      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-camera:
-  filepath: D:/opt/camera
-  rtmp:
-    rtmphost: 127.0.0.1:1935
-    httphost: 127.0.0.1:80
-    webrtchost: 150.158.22.179:58000
 
 socketio:
   # host: 127.0.0.1		#主机名,默认是 0.0.0.0 (这个设不设置无所谓,因为后面的 SocketConfig 类一般不用设置这个)

+ 0 - 9
taphole-admin/src/main/resources/loadFFmpeg.properties

@@ -1,9 +0,0 @@
-#ffmpeg执行路径,一般为ffmpeg的安装目录,该路径只能是目录,不能为具体文件路径,否则会报错
-# path 必须和Dockerfile中的[复制 FFmpeg 静态二进制文件]保持一致
-#path=/usr/local/ffmpeg/bin/
-#path=/usr/bin/
-path=D:\\project\\xiha\\ffmpeg-2024-10-07-git-496b8d7a13-full_build\\bin\\
-#存放任务的默认Map的初始化大小
-size=10
-#是否输出debug消息
-debug=true

+ 58 - 0
taphole-iron/src/main/java/com/sckj/iron/constant/ParamsConstants.java

@@ -0,0 +1,58 @@
+package com.sckj.iron.constant;
+
+/***
+ * 定时任务延迟和定时常量
+ * 单位:s
+ */
+public class ParamsConstants {
+    //iron_speed
+    public static final String iron_speed = "iron_speed";
+    //pressure_diff_value
+    public static final String pressure_diff_value = "pressure_diff_value";
+    //iron_time
+    public static final String iron_time = "iron_time";
+    //server_url
+    public static final String server_url = "server_url";
+
+    //open_warn_delay
+    public static final String open_warn_delay = "open_warn_delay";
+    //open_warn_period
+    public static final String open_warn_period = "open_warn_period";
+
+    //closure_warn_delay
+    public static final String closure_warn_delay = "closure_warn_delay";
+    //closure_warn_period
+    public static final String closure_warn_period = "closure_warn_period";
+
+    //tapping_warn_delay
+    public static final String tapping_warn_delay = "tapping_warn_delay";
+    //tapping_warn_period
+    public static final String tapping_warn_period = "tapping_warn_period";
+
+    //tapping_timeout_warn_delay
+    public static final String tapping_timeout_warn_delay = "tapping_timeout_warn_delay";
+    //tapping_timeout_warn_period
+    public static final String tapping_timeout_warn_period = "tapping_timeout_warn_period";
+
+    //hit_mud_delay
+    public static final String hit_mud_delay = "hit_mud_delay";
+    //hit_mud_period
+    public static final String hit_mud_period = "hit_mud_period";
+
+    //tapping_consttime_delay
+    public static final String tapping_consttime_delay = "tapping_consttime_delay";
+    //tapping_consttime_period
+    public static final String tapping_consttime_period = "tapping_consttime_period";
+
+    //tapping_test_delay
+    public static final String tapping_test_delay = "tapping_test_delay";
+    //tapping_test_period
+    public static final String tapping_test_period = "tapping_test_period";
+
+    //opcdasubscribe_delay
+    public static final String opcdasubscribe_delay = "opcdasubscribe_delay";
+    //opcdasubscribe_period
+    public static final String opcdasubscribe_period = "opcdasubscribe_period";
+
+
+}

+ 33 - 2
taphole-iron/src/main/java/com/sckj/iron/constant/ScheduledTimeConstants.java

@@ -7,9 +7,14 @@ package com.sckj.iron.constant;
 public class ScheduledTimeConstants {
     //堵口预警
     //延迟
-    public static   long CLOSE_WARN_DELAY = 0;
+    public static   long OPEN_WARN_DELAY = 0;
     //定时
-    public static   long CLOSE_WARN_PERIOD = 60;
+    public static   long OPEN_WARN_PERIOD = 60;
+    //堵口预警
+    //延迟
+    public static   long CLOSURE_WARN_DELAY = 0;
+    //定时
+    public static   long CLOSURE_WARN_PERIOD = 60;
 
     //出铁预警
     //延时
@@ -49,4 +54,30 @@ public class ScheduledTimeConstants {
     public static   long OPCDASUBSCRIBE_DELAY = 0;
     //定时
     public static   long OPCDASUBSCRIBE_PERIOD = 15;
+
+
+
+    public static String getPrintString() {
+        return "ScheduledTimeConstants{" +
+                "OPEN_WARN_DELAY=" + OPEN_WARN_DELAY +
+                ", OPEN_WARN_PERIOD=" + OPEN_WARN_PERIOD +
+                ", CLOSURE_WARN_DELAY=" + CLOSURE_WARN_DELAY +
+                ", CLOSURE_WARN_PERIOD=" + CLOSURE_WARN_PERIOD +
+                ", TAPPING_WARN_DELAY=" + TAPPING_WARN_DELAY +
+                ", TAPPING_WARN_PERIOD=" + TAPPING_WARN_PERIOD +
+                ", TAPPING_TIMEOUT_WARN_DELAY=" + TAPPING_TIMEOUT_WARN_DELAY +
+                ", TAPPING_TIMEOUT_WARN_PERIOD=" + TAPPING_TIMEOUT_WARN_PERIOD +
+                ", HIT_MUD_DELAY=" + HIT_MUD_DELAY +
+                ", HIT_MUD_PERIOD=" + HIT_MUD_PERIOD +
+                ", TAPPING_CONSTTIME_DELAY=" + TAPPING_CONSTTIME_DELAY +
+                ", TAPPING_CONSTTIME_PERIOD=" + TAPPING_CONSTTIME_PERIOD +
+                ", TAPPING_TEST_DELAY=" + TAPPING_TEST_DELAY +
+                ", TAPPING_TEST_PERIOD=" + TAPPING_TEST_PERIOD +
+                ", OPCDASUBSCRIBE_DELAY=" + OPCDASUBSCRIBE_DELAY +
+                ", OPCDASUBSCRIBE_PERIOD=" + OPCDASUBSCRIBE_PERIOD +
+                '}';
+    }
+
+
+
 }

+ 1 - 1
taphole-iron/src/main/java/com/sckj/iron/constant/TaskNameConstants.java

@@ -7,7 +7,7 @@ public class TaskNameConstants {
     //开口预警
     public static final String TASKNAME_OPEN_WARN = "open_warn";
     //堵口预警,出铁xxx分钟开始
-    public static final String TASKNAME_CLOSE_WARN = "close_warn";
+    public static final String TASKNAME_CLOSURE_WARN = "closure_warn";
     //出铁预警
     public static final String TASKNAME_TAPPING_WARN = "tapping_warn";
     //出铁超时报警

+ 15 - 0
taphole-iron/src/main/java/com/sckj/iron/controller/TIronStepController.java

@@ -52,6 +52,21 @@ public class TIronStepController {
         iTIronStepService.refreshParams();
         return AjaxResult.success(LocalDateTime.now());
     }
+    @NotPower
+    @GetMapping("/refreshModals")
+    @ApiOperation(value = "刷新模型")
+    public AjaxResult refreshModals() {
+        iTIronStepService.refreshModals();
+        return AjaxResult.success(LocalDateTime.now());
+    }
+
+    @NotPower
+    @GetMapping("/refreshAudios")
+    @ApiOperation(value = "刷新报警音频")
+    public AjaxResult refreshAudios() {
+        iTIronStepService.refreshAudios();
+        return AjaxResult.success(LocalDateTime.now());
+    }
 
     @Log(title = "新增或者更新")
     @PostMapping("/saveOrUpdate")

+ 8 - 5
taphole-iron/src/main/java/com/sckj/iron/dto/WarnData.java

@@ -16,7 +16,6 @@ public class WarnData {
 
     //open
     //close
-    //
     private String type;
 
     //类型名称
@@ -30,24 +29,28 @@ public class WarnData {
         return WarnData.builder().type(type).desc(desc).build();
     }
 
+    public static WarnData of(String type) {
+        return WarnData.builder().type(type).build();
+    }
+
     //开口预警
     public static WarnData warnOpen(String desc, String alarmUrl) {
-        return WarnData.builder().type(TaskNameConstants.TASKNAME_OPEN_WARN).typeName("").desc(desc).build();
+        return WarnData.builder().type(TaskNameConstants.TASKNAME_OPEN_WARN).typeName("开口报警").desc(desc).alarmUrl(alarmUrl).build();
     }
 
     //出铁预警
     public static WarnData warnTapping(String desc, String alarmUrl) {
-        return WarnData.builder().type(TaskNameConstants.TASKNAME_TAPPING_WARN).typeName("急需出铁报警").desc(desc).build();
+        return WarnData.builder().type(TaskNameConstants.TASKNAME_TAPPING_WARN).typeName("出铁报警").desc(desc).alarmUrl(alarmUrl).build();
     }
 
     //堵口预警
     public static WarnData warnClose(String desc, String alarmUrl) {
-        return WarnData.builder().type(TaskNameConstants.TASKNAME_CLOSE_WARN).typeName("急需堵口报警").desc(desc).build();
+        return WarnData.builder().type(TaskNameConstants.TASKNAME_CLOSURE_WARN).typeName("堵口报警").desc(desc).alarmUrl(alarmUrl).build();
     }
 
     //炉前出铁超时报警
     public static WarnData warnTappingTimeout(String desc, String alarmUrl) {
-        return WarnData.builder().type(TaskNameConstants.TASKNAME_TAPPING_TIMEOUT_WARN).typeName("炉前出铁超时报警").desc(desc).build();
+        return WarnData.builder().type(TaskNameConstants.TASKNAME_TAPPING_TIMEOUT_WARN).typeName("炉前出铁超时报警").desc(desc).alarmUrl(alarmUrl).build();
     }
 
 }

+ 3 - 0
taphole-iron/src/main/java/com/sckj/iron/entity/TIronParam.java

@@ -61,4 +61,7 @@ public class TIronParam implements Serializable {
     @ApiModelProperty(value = "排序")
     private Integer sort;
 
+    public TIronParam() {
+        this.paramValue = "0";
+    }
 }

+ 1 - 1
taphole-iron/src/main/java/com/sckj/iron/manager/HikCameraManager.java

@@ -25,7 +25,7 @@ public class HikCameraManager {
     @Autowired
     private CameraFileServiceImpl cameraFileService;
 
-    @Value("${camera.filepath}")
+    @Value("${like.upload-directory}")
     private String rootPath;
 
     @Async

+ 1 - 1
taphole-iron/src/main/java/com/sckj/iron/service/impl/CameraFileServiceImpl.java

@@ -27,7 +27,7 @@ public class CameraFileServiceImpl extends ServiceImpl<CameraFileMapper, CameraF
 
     private Logger logger = LoggerFactory.getLogger(CameraFileServiceImpl.class);
 
-    @Value("${camera.filepath}")
+    @Value("${like.upload-directory}")
     private String rootPath;
 
     public String getRootPath() {

+ 0 - 3
taphole-iron/src/main/java/com/sckj/iron/service/impl/CameraFlowServiceImpl.java

@@ -16,9 +16,6 @@ import java.util.List;
 @Transactional
 public class CameraFlowServiceImpl extends ServiceImpl<CameraFlowMapper, CameraFlow> {
 
-    @Value("${camera.filepath}")
-    private String rootPath;
-
 
     public CameraFlow findByRtmpUrl(String rtmp) {
         QueryWrapper<CameraFlow> queryWrapper = new QueryWrapper<>();

+ 14 - 7
taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronStepServiceImpl.java

@@ -101,11 +101,12 @@ public class TIronStepServiceImpl extends ServiceImpl<TIronStepMapper, TIronStep
 ////                stepDTOList.add(stepDTO);
 //            } else {
 //                treeMap.get(key).getChilds().put(entry.getKey(),entry.getValue());
-////                if (ObjectUtils.isNotEmpty(stepDTO) && StringUtils.startsWith(step.getStepId(), stepDTO.getStepId())) {
-////                    IronStepVO stepChildDTO = new IronStepVO();
-////                    BeanUtils.copyProperties(step, stepChildDTO);
-////                    stepDTO.getChilds().add(stepChildDTO);
-////                }
+
+    /// /                if (ObjectUtils.isNotEmpty(stepDTO) && StringUtils.startsWith(step.getStepId(), stepDTO.getStepId())) {
+    /// /                    IronStepVO stepChildDTO = new IronStepVO();
+    /// /                    BeanUtils.copyProperties(step, stepChildDTO);
+    /// /                    stepDTO.getChilds().add(stepChildDTO);
+    /// /                }
 //            }
 //        }
 //
@@ -113,8 +114,6 @@ public class TIronStepServiceImpl extends ServiceImpl<TIronStepMapper, TIronStep
 //        return stepMap;
 //
 //    }
-
-
     public void refreshTreeSteps() {
         asyncEventBus.post("1");
     }
@@ -124,6 +123,14 @@ public class TIronStepServiceImpl extends ServiceImpl<TIronStepMapper, TIronStep
         asyncEventBus.post("2");
     }
 
+    public void refreshModals() {
+        asyncEventBus.post("3");
+    }
+
+    public void refreshAudios() {
+        asyncEventBus.post("4");
+    }
+
 
 }
 

+ 229 - 204
taphole-iron/src/main/java/com/sckj/iron/socketio/DeviceEventListener.java

@@ -3,13 +3,14 @@ package com.sckj.iron.socketio;
 import com.corundumstudio.socketio.SocketIOClient;
 import com.corundumstudio.socketio.annotation.OnEvent;
 import com.google.common.eventbus.Subscribe;
-import com.sckj.iron.util.LocalDateUtils;
+import com.google.common.util.concurrent.AtomicDouble;
 import com.sckj.common.config.GlobalConfig;
 import com.sckj.common.eventbus.EventListener;
 import com.sckj.common.manager.ScheduledTaskManager;
 import com.sckj.common.socketio.SocketUtil;
 import com.sckj.common.util.RedisUtils;
 import com.sckj.iron.constant.L1TagConstants;
+import com.sckj.iron.constant.ParamsConstants;
 import com.sckj.iron.constant.ScheduledTimeConstants;
 import com.sckj.iron.constant.TaskNameConstants;
 import com.sckj.iron.dto.IronStepDTO;
@@ -20,6 +21,7 @@ import com.sckj.iron.entity.TIronData;
 import com.sckj.iron.entity.TIronModel;
 import com.sckj.iron.entity.TIronParam;
 import com.sckj.iron.service.impl.*;
+import com.sckj.iron.util.LocalDateUtils;
 import com.sckj.iron.vo.IronStepVO;
 import com.sckj.l2.dto.L2Data;
 import com.sckj.l2.dto.L2Material;
@@ -41,9 +43,6 @@ import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.autoconfigure.web.ServerProperties;
-import org.springframework.boot.context.event.ApplicationStartedEvent;
-import org.springframework.context.ApplicationListener;
 import org.springframework.expression.Expression;
 import org.springframework.expression.spel.standard.SpelExpressionParser;
 import org.springframework.expression.spel.support.StandardEvaluationContext;
@@ -52,8 +51,8 @@ import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
+import java.io.File;
 import java.math.BigDecimal;
-import java.net.InetAddress;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -61,7 +60,6 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
 
 /**
  * @Author feng
@@ -70,7 +68,7 @@ import java.util.stream.Collectors;
  */
 @Component
 @Slf4j
-public class DeviceEventListener extends EventListener implements ApplicationListener<ApplicationStartedEvent> { //
+public class DeviceEventListener extends EventListener { //
 
     //步骤数据
     @Resource
@@ -118,24 +116,23 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
     @Resource
     TIronModelServiceImpl ironModelService;
 
-
     //炉前申请出铁
-    private static final String STEP_LQCT = "lqct";
+    private static final String STEP_LQSQCT = "lqsqct";
 
     //预判和确认出铁
-    private static final String STEP_YPQRCT = "lnct";
+    private static final String STEP_YPQRCT = "ypqrct";
 
     //铁量差计算
     private static final String STEP_TLC = "tlc";
 
     //铁水成分
-    public static final String IRON_ELEMENT = "ironElement";
+    private static final String IRON_ELEMENT = "ironElement";
     //铁水温度
-    public static final String IRON_TEMP = "ironTemp";
+    private static final String IRON_TEMP = "ironTemp";
     //铁水流速
-    public static final String IRON_SPEED = "ironSpeed";
+    private static final String IRON_SPEED = "ironSpeed";
     //重量
-    public static final String IRON_WEIGHT = "ironWeight";
+    private static final String IRON_WEIGHT = "ironWeight";
     //出铁状态
     private static final String IRON_STATUS = "ironStatus";
     //总干量
@@ -181,14 +178,14 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
     private List<IronStepVO> mSteps;
 
     //出铁参数
-    private Map<String, TIronParam> mIronParamMap;
+//    private Map<String, TIronParam> mIronParamMap;
 
     //出铁参数
-    private Map<String, TAudio> mIronAlarmMap;
+//    private Map<String, TAudio> mIronAlarmMap;
 
     private String alarmUrlOpen;
 
-    private String alarmUrlClose;
+    private String alarmUrlClosure;
 
     private String alramUrlTapping;
 
@@ -201,18 +198,20 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
     //实时状态
     Map<String, Object> mRealtimeStatus = new ConcurrentHashMap<>();
 
-    //最近任一铁口出铁结束时间
-    private Date mIronEndTimeRecently;
-
-    private BigDecimal speed1 = BigDecimal.ZERO;
+    private AtomicDouble speed1 = new AtomicDouble(0);
 
-    private BigDecimal speed2 = BigDecimal.ZERO;
+    private AtomicDouble speed2 = new AtomicDouble(0);
 
     //标准流速
-    private BigDecimal STANDARD_SPEED;
+    private AtomicDouble STANDARD_SPEED = new AtomicDouble(0);
 
     //压差阈值
-    private BigDecimal PRESSURE_DIFF_VALUE;
+    private AtomicDouble PRESSURE_DIFF_VALUE = new AtomicDouble(0);
+
+    //出铁时间
+    private AtomicDouble IRON_TIME = new AtomicDouble(0);
+
+    private String SERVER_URL = "";
 
     //实时出铁总重量/总流量
     private BigDecimal mTotalWeight = BigDecimal.ZERO;
@@ -224,48 +223,6 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
     //redis保存最多数量数据
     private static final int MAX_REDIS_COUNT = 50;
 
-    @Resource
-    private ServerProperties serverProperties;
-
-    private String getSchema() {
-        if (serverProperties.getSsl() != null && serverProperties.getSsl().isEnabled()) {
-            return "https";
-        }
-        return "http";
-    }
-
-    @Override
-    public void onApplicationEvent(ApplicationStartedEvent event) {
-        try {
-            // 获取服务器IP地址
-            InetAddress localhost = InetAddress.getLocalHost();
-
-            String ip = localhost.getHostAddress();
-
-            String host = localhost.getHostName();
-
-            // 获取服务器端口号
-            int port = serverProperties.getPort() != null ? serverProperties.getPort() : 8080;
-
-            // 获取 schema
-            String schema = getSchema();
-            // 获取服务器端口号
-
-            System.out.println("Server IP: " + ip);
-            System.out.println("Server Port: " + port);
-            System.out.println("Server Schema: " + schema);
-
-            String uploadUrl = GlobalConfig.publicPrefix;
-
-            uploadUrl = schema + "://" + host + ":" + port + "/" + uploadUrl + "/";
-
-            log.info("uploadUrl:{}", uploadUrl);
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
     @PostConstruct
     public void init() {
         //程序启动后隔断时间启动订阅
@@ -274,9 +231,21 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
 //            opcdaService.subscribeAvailable();
             scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_OPCDASUBSCRIBE);
         });
-        mSteps = ironStepService.getTreeSteps();
-        updateParams();
-        updateModels();
+        taskExecutor.submit(() -> {
+            mSteps = ironStepService.getTreeSteps();
+        });
+        taskExecutor.submit(() -> {
+            getIronParams();
+        });
+        taskExecutor.submit(() -> {
+            getModels();
+        });
+        taskExecutor.submit(() -> {
+            TL2Data latestData = tl2DataService.getLatestData();
+            if (latestData != null) {
+                getIronTimeNo(latestData.getIronNo());
+            }
+        });
     }
 
 
@@ -286,47 +255,86 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
     /***
      * 更新模型
      */
-    private void updateModels() {
+    private void getModels() {
         modelHitMud = ironModelService.getById(1);
+    }
 
+    private void getAudios() {
+        List<TAudio> list = audioService.lambdaQuery().eq(TAudio::getStatus, "1").eq(TAudio::getDelFlag, "1").list();
+        if (ObjectUtils.isNotEmpty(list)) {
+            for (TAudio tAudio : list) {
+                if (Objects.equals(tAudio.getExceptionType(), TaskNameConstants.TASKNAME_OPEN_WARN)) {
+                    alarmUrlOpen = SERVER_URL + "/" + GlobalConfig.publicPrefix + File.separator + tAudio.getPath();
+                } else if (Objects.equals(tAudio.getExceptionType(), TaskNameConstants.TASKNAME_CLOSURE_WARN)) {
+                    alarmUrlClosure = SERVER_URL + "/" + GlobalConfig.publicPrefix + File.separator + tAudio.getPath();
+                } else if (Objects.equals(tAudio.getExceptionType(), TaskNameConstants.TASKNAME_TAPPING_WARN)) {
+                    alramUrlTapping = SERVER_URL + "/" + GlobalConfig.publicPrefix + File.separator + tAudio.getPath();
+                }
+            }
+            log.info("alarmUrlOpen: " + alarmUrlOpen);
+            log.info("alarmUrlClose: " + alarmUrlClosure);
+            log.info("alramUrlTapping: " + alramUrlTapping);
+        }
     }
 
 
     /***
      * 更新参数
      */
-    private void updateParams() {
-        List<TIronParam> mIronParams = ironParamService.lambdaQuery().eq(TIronParam::getStatus, "1").in(TIronParam::getParamType, "iron_judge", "iron_judge2", "scheduledtime").orderByAsc(TIronParam::getSort).list();
+    private void getIronParams() {
+        List<TIronParam> mIronParams = ironParamService.lambdaQuery().eq(TIronParam::getStatus, "1").in(TIronParam::getParamType, "iron_judge", "iron_judge_extra", "scheduledtime", "server_info").orderByAsc(TIronParam::getSort).list();
         if (ObjectUtils.isNotEmpty(mIronParams)) {
-            mIronParamMap = mIronParams.stream()
-                    .collect(Collectors.toMap(TIronParam::getParamName, ironParam -> ironParam, (existing, replacement) -> existing));
-            STANDARD_SPEED = new BigDecimal(mIronParamMap.get("iron_speed").getParamValue());
-            PRESSURE_DIFF_VALUE = new BigDecimal(mIronParamMap.get("pressure_diff_value").getParamValue());
+            for (TIronParam mIronParam : mIronParams) {
+                if (Objects.equals(mIronParam.getParamName(), ParamsConstants.iron_speed)) {
+                    STANDARD_SPEED = new AtomicDouble(Double.parseDouble(mIronParam.getParamValue()));
+                } else if (Objects.equals(mIronParam.getParamName(), ParamsConstants.pressure_diff_value)) {
+                    PRESSURE_DIFF_VALUE = new AtomicDouble(Double.parseDouble(mIronParam.getParamValue()));
+                } else if (Objects.equals(mIronParam.getParamName(), ParamsConstants.iron_time)) {
+                    IRON_TIME = new AtomicDouble(Double.parseDouble(mIronParam.getParamValue()));
+                } else if (Objects.equals(mIronParam.getParamName(), ParamsConstants.server_url)) {
+                    SERVER_URL = mIronParam.getParamValue();
+                    if (ObjectUtils.isNotEmpty(SERVER_URL)) {
+                        taskExecutor.submit(() -> {
+                            getAudios();
+                        });
+                    }
+                } else if (Objects.equals(mIronParam.getParamName(), ParamsConstants.open_warn_delay)) {
+                    ScheduledTimeConstants.OPEN_WARN_DELAY = Long.parseLong(mIronParam.getParamValue());
+                } else if (Objects.equals(mIronParam.getParamName(), ParamsConstants.open_warn_period)) {
+                    ScheduledTimeConstants.OPEN_WARN_PERIOD = Long.parseLong(mIronParam.getParamValue());
+                } else if (Objects.equals(mIronParam.getParamName(), ParamsConstants.closure_warn_delay)) {
+                    ScheduledTimeConstants.CLOSURE_WARN_DELAY = Long.parseLong(mIronParam.getParamValue());
+                } else if (Objects.equals(mIronParam.getParamName(), ParamsConstants.closure_warn_period)) {
+                    ScheduledTimeConstants.CLOSURE_WARN_PERIOD = Long.parseLong(mIronParam.getParamValue());
+                } else if (Objects.equals(mIronParam.getParamName(), ParamsConstants.tapping_warn_delay)) {
+                    ScheduledTimeConstants.TAPPING_WARN_DELAY = Long.parseLong(mIronParam.getParamValue());
+                } else if (Objects.equals(mIronParam.getParamName(), ParamsConstants.tapping_warn_period)) {
+                    ScheduledTimeConstants.TAPPING_WARN_PERIOD = Long.parseLong(mIronParam.getParamValue());
+                } else if (Objects.equals(mIronParam.getParamName(), ParamsConstants.tapping_timeout_warn_delay)) {
+                    ScheduledTimeConstants.TAPPING_TIMEOUT_WARN_DELAY = Long.parseLong(mIronParam.getParamValue());
+                } else if (Objects.equals(mIronParam.getParamName(), ParamsConstants.tapping_timeout_warn_period)) {
+                    ScheduledTimeConstants.TAPPING_TIMEOUT_WARN_PERIOD = Long.parseLong(mIronParam.getParamValue());
+                } else if (Objects.equals(mIronParam.getParamName(), ParamsConstants.hit_mud_delay)) {
+                    ScheduledTimeConstants.HIT_MUD_DELAY = Long.parseLong(mIronParam.getParamValue());
+                } else if (Objects.equals(mIronParam.getParamName(), ParamsConstants.hit_mud_period)) {
+                    ScheduledTimeConstants.HIT_MUD_PERIOD = Long.parseLong(mIronParam.getParamValue());
+                } else if (Objects.equals(mIronParam.getParamName(), ParamsConstants.tapping_consttime_delay)) {
+                    ScheduledTimeConstants.TAPPING_CONSTTIME_DELAY = Long.parseLong(mIronParam.getParamValue());
+                } else if (Objects.equals(mIronParam.getParamName(), ParamsConstants.tapping_consttime_period)) {
+                    ScheduledTimeConstants.TAPPING_CONSTTIME_PERIOD = Long.parseLong(mIronParam.getParamValue());
+                } else if (Objects.equals(mIronParam.getParamName(), ParamsConstants.tapping_test_delay)) {
+                    ScheduledTimeConstants.TAPPING_TEST_DELAY = Long.parseLong(mIronParam.getParamValue());
+                } else if (Objects.equals(mIronParam.getParamName(), ParamsConstants.tapping_test_period)) {
+                    ScheduledTimeConstants.TAPPING_TEST_PERIOD = Long.parseLong(mIronParam.getParamValue());
+                } else if (Objects.equals(mIronParam.getParamName(), ParamsConstants.opcdasubscribe_delay)) {
+                    ScheduledTimeConstants.OPCDASUBSCRIBE_DELAY = Long.parseLong(mIronParam.getParamValue());
+                } else if (Objects.equals(mIronParam.getParamName(), ParamsConstants.opcdasubscribe_period)) {
+                    ScheduledTimeConstants.OPCDASUBSCRIBE_PERIOD = Long.parseLong(mIronParam.getParamValue());
+                }
+            }
             log.info("STANDARD_SPEED: {},PRESSURE_DIFF_VALUE:{}", STANDARD_SPEED, PRESSURE_DIFF_VALUE);
-
-            ScheduledTimeConstants.CLOSE_WARN_DELAY = Long.parseLong(mIronParamMap.get("close_warn_delay").getParamValue());
-            ScheduledTimeConstants.CLOSE_WARN_PERIOD = Long.parseLong(mIronParamMap.get("close_warn_period").getParamValue());
-
-            ScheduledTimeConstants.TAPPING_WARN_DELAY = Long.parseLong(mIronParamMap.get("tapping_warn_delay").getParamValue());
-            ScheduledTimeConstants.TAPPING_WARN_PERIOD = Long.parseLong(mIronParamMap.get("tapping_warn_period").getParamValue());
-
-            ScheduledTimeConstants.TAPPING_TIMEOUT_WARN_DELAY = Long.parseLong(mIronParamMap.get("tapping_timeout_warn_delay").getParamValue());
-            ScheduledTimeConstants.TAPPING_TIMEOUT_WARN_PERIOD = Long.parseLong(mIronParamMap.get("tapping_timeout_warn_period").getParamValue());
-
-            ScheduledTimeConstants.HIT_MUD_DELAY = Long.parseLong(mIronParamMap.get("hit_mud_delay").getParamValue());
-            ScheduledTimeConstants.HIT_MUD_PERIOD = Long.parseLong(mIronParamMap.get("hit_mud_period").getParamValue());
-
-            ScheduledTimeConstants.TAPPING_CONSTTIME_DELAY = Long.parseLong(mIronParamMap.get("tapping_consttime_delay").getParamValue());
-            ScheduledTimeConstants.TAPPING_CONSTTIME_PERIOD = Long.parseLong(mIronParamMap.get("tapping_consttime_period").getParamValue());
-
-            ScheduledTimeConstants.TAPPING_TEST_DELAY = Long.parseLong(mIronParamMap.get("tapping_test_delay").getParamValue());
-            ScheduledTimeConstants.TAPPING_TEST_PERIOD = Long.parseLong(mIronParamMap.get("tapping_test_period").getParamValue());
-
-            ScheduledTimeConstants.OPCDASUBSCRIBE_DELAY = Long.parseLong(mIronParamMap.get("opcdasubscribe_delay").getParamValue());
-            ScheduledTimeConstants.OPCDASUBSCRIBE_PERIOD = Long.parseLong(mIronParamMap.get("opcdasubscribe_period").getParamValue());
-
-            log.info(">>>{}", mIronParamMap);
-
+            log.info("IRON_TIME: {},SERVER_URL:{}", IRON_TIME, SERVER_URL);
+            log.info("{}", ScheduledTimeConstants.getPrintString());
         }
     }
 
@@ -363,24 +371,39 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
             //只要是新的出铁次数编号,后续都一直用这个编号,直到有新的出铁编号
             mIronNo = l2Data.getIronNo();
         }
-        //记录出铁日期和次数,并返回给前端
-        IronTimeNoDTO ironTimeNoDTO = new IronTimeNoDTO();
-        String dateString = LocalDateUtils.formatDate(new Date(), DateTimeFormatter.ofPattern("MM月dd日"));
-        ironTimeNoDTO.setDate(dateString);
-        ironTimeNoDTO.setIronNo(mIronNo);
-        ironTimeNoDTO.setDesc(String.format("%s第%s次出铁", dateString, ironTimeNoDTO.getIronNo()));
-        PushData.send2IronTimeNo(ironTimeNoDTO);
+
+        taskExecutor.submit(() -> {
+            TL2Data latestData = tl2DataService.getLatestData();
+            if (latestData != null) {
+                getIronTimeNo(latestData.getIronNo());
+            }
+        });
 
 
         //推送实时数据
         taskExecutor.submit(() -> {
             setRealtimeDataAndStatus(null, l2Data);
         });
+    }
 
-
+    /***
+     * 记录出铁日期和次数,并返回给前端
+     * @param mIronNo
+     */
+    private void getIronTimeNo(Long mIronNo) {
+        IronTimeNoDTO ironTimeNoDTO = new IronTimeNoDTO();
+        String dateString = LocalDateUtils.formatDate(new Date(), DateTimeFormatter.ofPattern("MM月dd日"));
+        ironTimeNoDTO.setDate(dateString);
+        ironTimeNoDTO.setIronNo(mIronNo);
+        ironTimeNoDTO.setDesc(String.format("%s第%s次出铁", dateString, ironTimeNoDTO.getIronNo()));
+        PushData.send2IronTimeNo(ironTimeNoDTO);
     }
 
-    private void showTheoryWeight(List<TL2Data> latest2DataList) {
+    /***
+     * 显示“铁量差在合理范围内”
+     * @param latest2DataList
+     */
+    private void getTheoryWeight(List<TL2Data> latest2DataList) {
         taskExecutor.submit(() -> {
             for (IronStepVO stepDTO : mSteps) {
                 if (NODE.equalsIgnoreCase(stepDTO.getNodeType())) {
@@ -397,10 +420,10 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
                                 BigDecimal ironWeightLast = new BigDecimal(tl2Data1Last.getIronWeight()).setScale(2, BigDecimal.ROUND_HALF_UP);
                                 BigDecimal tlcLast = llLast.subtract(ironWeightLast).setScale(2, BigDecimal.ROUND_HALF_UP);
 
-                                TL2Data tl2Data1LastLast = latest2DataList.get(1);
-                                BigDecimal llLastLast = new BigDecimal(tl2Data1LastLast.getTheoryWeight()).setScale(2, BigDecimal.ROUND_HALF_UP);
-                                BigDecimal ironWeightLastLast = new BigDecimal(tl2Data1LastLast.getIronWeight()).setScale(2, BigDecimal.ROUND_HALF_UP);
-                                BigDecimal tlcLastLast = llLastLast.subtract(ironWeightLastLast).setScale(2, BigDecimal.ROUND_HALF_UP);
+                                TL2Data tl2Data1GrandLast = latest2DataList.get(1);
+                                BigDecimal llGrandLast = new BigDecimal(tl2Data1GrandLast.getTheoryWeight()).setScale(2, BigDecimal.ROUND_HALF_UP);
+                                BigDecimal ironWeightGrandLast = new BigDecimal(tl2Data1GrandLast.getIronWeight()).setScale(2, BigDecimal.ROUND_HALF_UP);
+                                BigDecimal tlcGrandLast = llGrandLast.subtract(ironWeightGrandLast).setScale(2, BigDecimal.ROUND_HALF_UP);
 
                                 //铁量差在合理范围内
                                 // 上一次铁量差:-30       上上次铁量差:20 t
@@ -418,19 +441,19 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
                                         grandChild.setData(tlcLast);
                                         grandChild.setStepName(StringUtils.substringBefore(grandChild.getStepName(), ":") + ":" + grandChild.getData());
                                     } else if (ssctlc.equals(grandChild.getIdentifier())) {
-                                        grandChild.setData(tlcLastLast);
+                                        grandChild.setData(tlcGrandLast);
                                         grandChild.setStepName(StringUtils.substringBefore(grandChild.getStepName(), ":") + ":" + grandChild.getData());
                                     } else if (scll.equals(grandChild.getIdentifier())) {
                                         grandChild.setData(llLast);
                                         grandChild.setStepName(StringUtils.substringBefore(grandChild.getStepName(), ":") + ":" + grandChild.getData());
                                     } else if (sscll.equals(grandChild.getIdentifier())) {
-                                        grandChild.setData(llLastLast);
+                                        grandChild.setData(llGrandLast);
                                         grandChild.setStepName(StringUtils.substringBefore(grandChild.getStepName(), ":") + ":" + grandChild.getData());
                                     } else if (scsj.equals(grandChild.getIdentifier())) {
                                         grandChild.setData(ironWeightLast);
                                         grandChild.setStepName(StringUtils.substringBefore(grandChild.getStepName(), ":") + ":" + grandChild.getData());
                                     } else if (sscsj.equals(grandChild.getIdentifier())) {
-                                        grandChild.setData(ironWeightLastLast);
+                                        grandChild.setData(ironWeightGrandLast);
                                         grandChild.setStepName(StringUtils.substringBefore(grandChild.getStepName(), ":") + ":" + grandChild.getData());
                                     }
                                 }
@@ -467,47 +490,18 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
 
     //1号铁口正在出铁的操作项目
     private void taphole1Start() {
-        //通过“预判和确认出铁”标记开始出铁
-        boolean isReady = false;
-
-        for (IronStepVO stepDTO : mSteps) {
-            if (STEP_YPQRCT.equalsIgnoreCase(stepDTO.getIdentifier()) && 1 == stepDTO.getPassResult()) {
-                isReady = true;
-                break;
-            }
-        }
+        //关闭定时任务:出铁预警、开口预警
+        //开启定时任务:出铁超时报警、堵口预警、打泥量选择计算、
 
-        //炉前在接受到炉内出铁要求后,10分钟内打开铁口,未打开系统告警并记录
-//        if (isReady) {
-//            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); // 终止定时器
-//            });
-//        }
+        scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_TAPPING_WARN);
+        scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_OPEN_WARN);
 
+        //出铁计时
+        scheduledTaskManager.addTask(TaskNameConstants.TASKNAME_TAPPING_CONSTTIME, ScheduledTimeConstants.TAPPING_CONSTTIME_DELAY, ScheduledTimeConstants.TAPPING_CONSTTIME_PERIOD, TimeUnit.SECONDS, () -> {
+            getIronTime();
+            mSecondsElapsed.incrementAndGet();
+        });
 
-        //由 0 -> 1 表明1号铁口开始出铁
-        //
-        //根据理论铁量、实时铁水流速,推测距离出铁结束的剩余时间
-//      Date ironTime = mOPCData.getServerTime();
-//      lastIronEndTimeRecently
-        //获取总干量
-//        BigDecimal totalDry = new BigDecimal(ObjectUtils.defaultIfNull(mL2Data.getTotalDry(), "0"));
-//        //计算出理论铁量
-//        BigDecimal multiply = totalDry.multiply(new BigDecimal(1.0)).multiply(new BigDecimal(1.0));
-
-//        float totalSpeed = speed1.add(speed2);
-//        if (totalSpeed > 0) {
-//            //理论时间
-//            BigDecimal divide = multiply.divide(new BigDecimal(totalSpeed), 2, BigDecimal.ROUND_HALF_UP);
-//            String plainString = divide.toPlainString();
-//            log.info("理论出铁时间:{}min", plainString);
-//        }
 
         //出铁超时报警
         scheduledTaskManager.addTask(TaskNameConstants.TASKNAME_TAPPING_TIMEOUT_WARN, ScheduledTimeConstants.TAPPING_TIMEOUT_WARN_DELAY, ScheduledTimeConstants.TAPPING_TIMEOUT_WARN_PERIOD, TimeUnit.SECONDS, () -> {
@@ -515,27 +509,33 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
 
             System.out.println("倒计时结束!10分钟已到。");
             // 出铁预警,打开系统告警并记录
-            PushData.send2Warn("请立即打开铁口");
+            PushData.send2Warn(WarnData.warnOpen("请立即打开铁口", alarmUrlOpen));
             log.info("准备出铁但是未及时出铁口,此处数据库记录");
-            scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_TAPPING_TIMEOUT_WARN); // 终止定时器
+            //scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_TAPPING_TIMEOUT_WARN); // 终止定时器
         });
 
         //堵口预警
-        scheduledTaskManager.addTask(TaskNameConstants.TASKNAME_CLOSE_WARN, ScheduledTimeConstants.CLOSE_WARN_DELAY, ScheduledTimeConstants.CLOSE_WARN_PERIOD, TimeUnit.SECONDS, () -> {
+        scheduledTaskManager.addTask(TaskNameConstants.TASKNAME_CLOSURE_WARN, ScheduledTimeConstants.CLOSURE_WARN_DELAY, ScheduledTimeConstants.CLOSURE_WARN_PERIOD, TimeUnit.SECONDS, () -> {
             //堵口预警
-            log.info("堵口预警:{},speed1:{},speed2:{},STANDARD_SPEED:{}", speed1, speed2, TaskNameConstants.TASKNAME_CLOSE_WARN);
-            if (speed1.compareTo(STANDARD_SPEED) > 0 || speed2.compareTo(STANDARD_SPEED) > 0) {
+            log.info("堵口预警:{},speed1:{},speed2:{},STANDARD_SPEED:{}", speed1.get(), speed2.get(), TaskNameConstants.TASKNAME_CLOSURE_WARN);
+            if (speed1.get() > STANDARD_SPEED.get() || speed2.get() > STANDARD_SPEED.get()) {
                 //流速过大可能是由于铁口深度不足或发生跑大流问题,则提示将当前铁口堵口
-                PushData.send2Warn(WarnData.warnClose("流速过快,请将当前铁口堵口", alarmUrlClose));
-                exceptionLogService.add(TExceptionLogCreateValidate.builder().exceptionType(4).exceptionDesc("流速过快,请将当前铁口堵口").build());
-            } else if ((speed1.compareTo(STANDARD_SPEED) < 0 || speed2.compareTo(STANDARD_SPEED) < 0) && (ironLoading2.get() || ironLoading3.get() || ironLoading4.get())) {
+                PushData.send2Warn(WarnData.warnClose("流速过快,请将当前铁口堵口", alarmUrlClosure));
+                taskExecutor.submit(() -> {
+                    exceptionLogService.add(TExceptionLogCreateValidate.builder().exceptionType(4).exceptionDesc("流速过快,请将当前铁口堵口").build());
+                });
+            } else if ((speed1.get() < STANDARD_SPEED.get() || speed2.get() < STANDARD_SPEED.get()) && (ironLoading2.get() || ironLoading3.get() || ironLoading4.get())) {
                 //若流速过小,但其它铁口正在出铁,则提示将当前铁口堵口
-                PushData.send2Warn(WarnData.warnClose("流速过小,请将当前铁口堵口", alarmUrlClose));
-                exceptionLogService.add(TExceptionLogCreateValidate.builder().exceptionType(4).exceptionDesc("流速过小,请将当前铁口堵口").build());
-            } else if ((speed1.compareTo(STANDARD_SPEED) < 0 || speed2.compareTo(STANDARD_SPEED) < 0) && (!ironLoading2.get() && !ironLoading3.get() && !ironLoading4.get())) {
+                PushData.send2Warn(WarnData.warnClose("流速过小,请将当前铁口堵口", alarmUrlClosure));
+                taskExecutor.submit(() -> {
+                    exceptionLogService.add(TExceptionLogCreateValidate.builder().exceptionType(4).exceptionDesc("流速过小,请将当前铁口堵口").build());
+                });
+            } else if ((speed1.get() < STANDARD_SPEED.get() || speed2.get() < STANDARD_SPEED.get()) && (!ironLoading2.get() && !ironLoading3.get() && !ironLoading4.get())) {
                 //若流速过小且其他铁口均未出铁,则提示先将其它铁口打开,再进行堵口
-                PushData.send2Warn(WarnData.warnClose("请先打开其它铁口,再堵口", alarmUrlClose));
-                exceptionLogService.add(TExceptionLogCreateValidate.builder().exceptionType(4).exceptionDesc("请先打开其它铁口,再堵口").build());
+                PushData.send2Warn(WarnData.warnClose("请先打开其它铁口,再堵口", alarmUrlClosure));
+                taskExecutor.submit(() -> {
+                    exceptionLogService.add(TExceptionLogCreateValidate.builder().exceptionType(4).exceptionDesc("请先打开其它铁口,再堵口").build());
+                });
             }
         });
 
@@ -543,12 +543,18 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
         //打泥量公式关联因素:铁口深度、钻杆直径、
         //调用打泥量模型,计算预计使用多少打泥量进行堵口
         scheduledTaskManager.addTask(TaskNameConstants.TASKNAME_HIT_MUD, ScheduledTimeConstants.HIT_MUD_DELAY, ScheduledTimeConstants.HIT_MUD_PERIOD, TimeUnit.SECONDS, () -> {
-            log.info("堵口预警:{},speed1:{},speed2:{},", speed1, speed2);
+            log.info("堵口预警:speed1:{},speed2:{},", speed1.get(), speed2.get());
 
             TL2Data tappingData = tl2DataService.getTappingData();
             if (ObjectUtils.isNotEmpty(tappingData) && ObjectUtils.isNotEmpty(modelHitMud)) {
+                log.info("开口深度openDepth(mm):{}", tappingData.getOpenDepth());
+                log.info("Tap对应铁水估计铁量ironWeight(t): {}", tappingData.getTheoryWeight());
+                log.info("出铁时间ironCosttime(min): {}", mSecondsElapsed.get() / 60);
+                log.info("平均流速ironSpeed(t/s): {}", speed1.get() > speed2.get() ? speed1.get() : speed2.get());
+
                 try {
                     String modelExpression = modelHitMud.getModelExpression();
+                    log.info("打泥量计算公式:{}", modelExpression);
                     SpelExpressionParser parser = new SpelExpressionParser();
                     Expression expression = parser.parseExpression(modelExpression);
                     StandardEvaluationContext context = new StandardEvaluationContext();
@@ -556,13 +562,14 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
                     context.setVariable("openDepth", tappingData.getOpenDepth());
                     context.setVariable("ironWeight", tappingData.getTheoryWeight());
                     context.setVariable("ironCosttime", mSecondsElapsed.get() / 60);
-                    context.setVariable("ironSpeed", speed1.compareTo(speed2) > 0 ? speed1 : speed2);
-                    String result = (String) expression.getValue(context);
-                    log.info("openDepth:{},ironWeight: {}", tappingData.getOpenDepth(), tappingData.getTheoryWeight());
-                    log.info("ironCosttime(min): {},ironSpeed: {}", mSecondsElapsed.get() / 60, speed1.compareTo(speed2) > 0 ? speed1 : speed2);
-                    log.info("打泥量计算公式:{},结果: {}", modelExpression, result);
+                    context.setVariable("ironSpeed", speed1.get() > speed2.get() ? speed1.get() : speed2.get());
+                    int result = (int) ((double) expression.getValue(context));
+                    // 使用 DecimalFormat 保留两位小数
+//                    DecimalFormat decimalFormat = new DecimalFormat("#.00");
+//                    String formattedResult = decimalFormat.format(result);
+                    log.info("计算结果: {}", result);
                 } catch (Exception e) {
-
+                    e.printStackTrace();
                 }
             }
 
@@ -571,14 +578,13 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
             scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_HIT_MUD);
         });
 
-        //出铁计时
-        scheduledTaskManager.addTask(TaskNameConstants.TASKNAME_TAPPING_CONSTTIME, ScheduledTimeConstants.TAPPING_CONSTTIME_DELAY, ScheduledTimeConstants.TAPPING_CONSTTIME_PERIOD, TimeUnit.SECONDS, () -> {
-            pushIronTime();
-            mSecondsElapsed.incrementAndGet();
-        });
+
     }
 
-    private void pushIronTime() {
+    /***
+     * 出铁计时
+     */
+    private void getIronTime() {
         int totalSeconds = mSecondsElapsed.get();
         int hours = totalSeconds / 3600;
         int minutes = (totalSeconds % 3600) / 60;
@@ -601,12 +607,21 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
         mTotalWeight = BigDecimal.ZERO;
 //        mTotalDry = BigDecimal.ZERO;
         scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_OPEN_WARN);
-        scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_CLOSE_WARN);
-        scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_TAPPING_WARN);
+        scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_CLOSURE_WARN);
+
         scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_HIT_MUD);
         scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_TAPPING_CONSTTIME);
+        scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_TAPPING_TIMEOUT_WARN);
         mSecondsElapsed.set(0);
-        pushIronTime();
+        getIronTime();
+        mSteps = ironStepService.getTreeSteps();
+
+        //开口
+        PushData.send2CancelWarn(WarnData.warnOpen("", ""));
+        //堵口
+        PushData.send2CancelWarn(WarnData.warnClose("", ""));
+        //出铁预警
+        PushData.send2CancelWarn(WarnData.warnTapping("", ""));
 
 //        recordAfter();
 //        recordBlock();
@@ -616,7 +631,7 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
         //xxx分钟延迟
         scheduledTaskManager.addTask(TaskNameConstants.TASKNAME_TAPPING_TEST, ScheduledTimeConstants.TAPPING_TEST_DELAY, ScheduledTimeConstants.TAPPING_TEST_PERIOD, TimeUnit.SECONDS, () -> {
             //堵口预警
-            log.info("定时任务:{},出铁诊断", TaskNameConstants.TASKNAME_TAPPING_TEST);
+            log.info("出铁结束,定时任务:{},出铁诊断", TaskNameConstants.TASKNAME_TAPPING_TEST);
             L2Data fixedLatestElement = (L2Data) RedisUtils.getFixedLatestElement(IRON_ELEMENT);
             //平均温度
             String mudWeight = fixedLatestElement.getAvgTemp();
@@ -685,11 +700,11 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
                 if (opcData.getPointName().contains(L1TagConstants.TAG_CAR11)) {
                     realtimeData.setDesc("1号车");
                     speeds[0] = realtimeData;
-                    speed1 = new BigDecimal(opcData.getData().toString());
+                    speed1 = new AtomicDouble(Double.parseDouble(opcData.getData().toString()));
                 } else {
                     realtimeData.setDesc("2号车");
                     speeds[1] = realtimeData;
-                    speed2 = new BigDecimal(opcData.getData().toString());
+                    speed2 = new AtomicDouble(Double.parseDouble(opcData.getData().toString()));
                 }
 
                 //只在两个都有数据的时候才添加
@@ -716,19 +731,13 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
 
             } else if (opcData.getPointName().contains(L1TagConstants.TAG_TAPHOLE2_STATUS)) {
                 ironLoading2.set("1".equals(opcData.getData().toString()));
-                if (ironLoading2.get()) {
-                    mIronEndTimeRecently = opcData.getServerTime();
-                }
+
             } else if (opcData.getPointName().contains(L1TagConstants.TAG_TAPHOLE3_STATUS)) {
                 ironLoading3.set("1".equals(opcData.getData().toString()));
-                if (ironLoading3.get()) {
-                    mIronEndTimeRecently = opcData.getServerTime();
-                }
+
             } else if (opcData.getPointName().contains(L1TagConstants.TAG_TAPHOLE4_STATUS)) {
                 ironLoading4.set("1".equals(opcData.getData().toString()));
-                if (!ironLoading4.get()) {
-                    mIronEndTimeRecently = opcData.getServerTime();
-                }
+
             } else if (opcData.getPointName().contains(L1TagConstants.TAG_IRON_WEIGHT11) || opcData.getPointName().contains(L1TagConstants.TAG_IRON_WEIGHT12)) {
                 //铁水流量
                 RealtimeData ironWeight = new RealtimeData();
@@ -751,10 +760,10 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
             }
 
 
-            BigDecimal yc = new BigDecimal(ObjectUtils.defaultIfNull(mContext.lookupVariable("yc"), "0").toString());
-            if (PRESSURE_DIFF_VALUE.compareTo(yc) < 0) {
+            double yc = Double.parseDouble(ObjectUtils.defaultIfNull(mContext.lookupVariable("yc"), "0").toString());
+            if (PRESSURE_DIFF_VALUE.get() < yc && !ironLoading1.get()) {
                 //xxx分钟延迟
-                scheduledTaskManager.addTask(TaskNameConstants.TASKNAME_TAPPING_WARN, 0, 3, TimeUnit.SECONDS, () -> {
+                scheduledTaskManager.addTask(TaskNameConstants.TASKNAME_TAPPING_WARN, ScheduledTimeConstants.TAPPING_WARN_DELAY, ScheduledTimeConstants.TAPPING_WARN_PERIOD, TimeUnit.SECONDS, () -> {
                     //堵口预警
                     log.info("出铁预警:{}", TaskNameConstants.TASKNAME_TAPPING_WARN);
                     PushData.send2Warn(WarnData.warnTapping("压差超过阈值,请出铁", alramUrlTapping));
@@ -762,9 +771,9 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
                 });
             } else {
                 scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_TAPPING_WARN);
+                PushData.send2CancelWarn(WarnData.warnTapping("压差正常", alramUrlTapping));
             }
 
-
         }
 
         L2Data fixedLatestElement = (L2Data) RedisUtils.getFixedLatestElement(IRON_ELEMENT);
@@ -958,10 +967,20 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
         PushData.send2Operation(mSteps, ironLoading1.get());
 
         for (IronStepVO stepDTO : mSteps) {
-            if (STEP_LQCT.equals(stepDTO.getIdentifier()) && stepDTO.getPassResult() == 1) {
+            if (STEP_LQSQCT.equals(stepDTO.getIdentifier()) && stepDTO.getPassResult() == 1) {
                 //
-                List<TL2Data> tl2DataList = tl2DataService.getLatest2Data();
-                showTheoryWeight(tl2DataList);
+                List<TL2Data> tl2DataList = tl2DataService.getTappedLatest2Datas();
+                getTheoryWeight(tl2DataList);
+            } else if (STEP_YPQRCT.equals(stepDTO.getIdentifier()) && stepDTO.getPassResult() == 1) {
+                //炉前在接受到炉内出铁要求后,10分钟内打开铁口,未打开系统告警并记录
+                scheduledTaskManager.addTask(TaskNameConstants.TASKNAME_OPEN_WARN, ScheduledTimeConstants.OPEN_WARN_DELAY, ScheduledTimeConstants.OPEN_WARN_PERIOD, TimeUnit.SECONDS, () -> {
+                    log.info("开口预警:{}", TaskNameConstants.TASKNAME_OPEN_WARN);
+
+                    // 出铁预警,打开系统告警并记录
+                    PushData.send2Warn(WarnData.warnOpen("请立即打开铁口", "xxxxxxxxxxxxxx"));
+                    log.info("准备出铁但是未及时出铁口,此处数据库记录");
+//                    scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_OPEN_WARN); // 终止定时器
+                });
             }
 
             for (IronStepVO child : stepDTO.getChilds()) {
@@ -1039,10 +1058,16 @@ public class DeviceEventListener extends EventListener implements ApplicationLis
                 PushData.send2Operation(mSteps, ironLoading1.get());
                 break;
             case "2":
-                updateParams();
+                getIronParams();
+                log.info("参数数据刷新:{}", LocalDateTime.now());
                 break;
             case "3":
-                updateModels();
+                getModels();
+                log.info("模型数据刷新:{}", LocalDateTime.now());
+                break;
+            case "4":
+                getAudios();
+                log.info("音频数据刷新:{}", LocalDateTime.now());
                 break;
             default:
                 break;

+ 20 - 3
taphole-iron/src/main/java/com/sckj/iron/socketio/PushData.java

@@ -12,7 +12,7 @@ import java.util.Objects;
 /**
  * @Author feng
  * @Date 2024-11-19 下午 12:12
- * @Description TODO
+ * @Description socket.io 推拉事件名及其封装
  */
 @Slf4j
 public class PushData {
@@ -103,7 +103,7 @@ public class PushData {
                 //单独给他发消息
                 socketClient.sendEvent(PushData.IRON_OPERATION, AjaxResult.success(message));
             } else {
-                log.info(userId + "已下线,暂不发送消息。");
+                log.info("{}已下线,无法发送消息", userId);
             }
         }
     }
@@ -114,7 +114,7 @@ public class PushData {
      * @param isStopSendMsg  是否停止发送信息
      */
     public static void send2Operation(Object message, boolean isStopSendMsg) {
-        if (SocketUtil.connectMap.isEmpty() ) {//|| isStopSendMsg
+        if (SocketUtil.connectMap.isEmpty()) {//|| isStopSendMsg
             return;
         }
         //
@@ -173,6 +173,22 @@ public class PushData {
     }
 
     /**
+     * 取消发出的预警
+     *
+     * @return
+     * @Param
+     **/
+    public static void send2CancelWarn(Object message) {
+        if (SocketUtil.connectMap.isEmpty()) {
+            return;
+        }
+        //
+        for (Map.Entry<String, SocketIOClient> entry : SocketUtil.connectMap.entrySet()) {
+            entry.getValue().sendEvent(PushData.IRON_CANCEL_WARN, AjaxResult.success(message));
+        }
+    }
+
+    /**
      * 开始出铁计时
      *
      * @return
@@ -187,6 +203,7 @@ public class PushData {
             entry.getValue().sendEvent(PushData.IRON_COSTTIME, AjaxResult.success(message));
         }
     }
+
     /**
      * 出铁时间和次数
      *

+ 0 - 67
taphole-iron/src/main/java/com/sckj/iron/vo/IronOperataion.java

@@ -1,67 +0,0 @@
-package com.sckj.iron.vo;
-
-import lombok.Data;
-
-/**
- * @Author feng
- * @Date 2024-11-22 下午 01:32
- * @Description 出铁操作
- */
-@Data
-public class IronOperataion {
-    private String userId;
-
-    //鱼雷罐车到位
-    private String ylgcdw;
-
-    //铁摆系统正常
-    private String tbxtzc;
-
-    // 泥炮、开口机准备完毕
-    private String npkkjzbwb;
-
-    //人员到位
-    private String rydw;
-
-    //炉前准备
-    private String lqzb;
-
-
-    //水闸泵已开启,水闸槽水量正常
-    private String szbykq;
-
-    //除尘开启出铁模式
-    private String ctmskq;
-
-    //主沟盖板吊装机处于待机位
-    private String zggbdj;
-
-    //外围条件
-    private String wwtj;
-
-
-    //炉前申请出铁
-    private String lqsqct;
-
-
-    //高炉运行情况
-    private String glyxqk;
-
-    //理论铁量、铁铁差计算
-    private String tlcjs;
-
-    //出铁方式(单铁口 双铁口)
-    private String ctfs;
-
-    //炉内出铁条件
-    private String lncttj;
-
-
-
-    //预判和确认出铁
-    private String ypqrct;
-
-    //炉前出铁操作
-    private String lqctcz;
-
-}

+ 2 - 1
taphole-l2-start/pom.xml

@@ -27,8 +27,9 @@
                 <artifactId>spring-boot-maven-plugin</artifactId>
                 <version>2.6.4</version>
                 <configuration>
+                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
+                    <includeSystemScope>true</includeSystemScope>
                     <mainClass>com.sckj.l2start.TapholeL2StartApplication</mainClass>
-                    <skip>true</skip>
                 </configuration>
                 <executions>
                     <execution>

+ 1 - 1
taphole-l2-start/src/main/java/com/sckj/l2start/listener/L2EventListener.java

@@ -190,7 +190,7 @@ public class L2EventListener extends EventListener {
                 TL2Data tl2Data = new TL2Data();
                 tl2Data.setIronNo(mIronNo);
                 //保存计算的理论铁量
-                tl2Data.setTheoryWeight(theoryWeight.toPlainString());
+                tl2Data.setTheoryWeight(theoryWeight.doubleValue());
                 tl2DataService.saveOrUpdate(tl2Data);
 
             }

+ 7 - 6
taphole-l2-start/src/main/resources/banner.txt

@@ -1,9 +1,10 @@
 Spring Boot Version: ${spring-boot.version}
 
 
-#####   ##   #####  #    #  ####  #      ######
-  #    #  #  #    # #    # #    # #      #
-  #   #    # #    # ###### #    # #      #####
-  #   ###### #####  #    # #    # #      #
-  #   #    # #      #    # #    # #      #
-  #   #    # #      #    #  ####  ###### ######
+#        #####
+#       #     #
+#             #
+#        #####
+#       #
+#       #
+####### #######

+ 1 - 1
taphole-l2-start/src/main/resources/log4j2-spring.xml

@@ -7,7 +7,7 @@
     <Properties>
         <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
         <property name="FILE_PATH" value="./logs/l2" />
-        <property name="FILE_NAME" value="admin-log4j2" />
+        <property name="FILE_NAME" value="l2-log4j2" />
     </Properties>
 
     <appenders>

+ 2 - 2
taphole-l2/src/main/java/com/sckj/l2/entity/TL2Data.java

@@ -77,7 +77,7 @@ public class TL2Data implements Serializable {
 
     @ApiModelProperty(value = "开口深度")
     @ExcelIgnore
-    private String openDepth;
+    private Double openDepth;
 
     @ApiModelProperty(value = "上料总干量")
     @ExcelIgnore
@@ -117,6 +117,6 @@ public class TL2Data implements Serializable {
 
     @ApiModelProperty(value = "理论铁量")
     @ExcelIgnore
-    private String theoryWeight;
+    private Double theoryWeight;
 
 }

+ 12 - 6
taphole-l2/src/main/java/com/sckj/l2/service/impl/TL2DataServiceImpl.java

@@ -9,9 +9,7 @@ import com.sckj.l2.dto.TrendRequest;
 import com.sckj.l2.entity.TL2Data;
 import com.sckj.l2.mapper.TL2DataMapper;
 import org.apache.commons.lang3.ObjectUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import springfox.documentation.spi.service.contexts.Defaults;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
@@ -34,22 +32,30 @@ public class TL2DataServiceImpl extends ServiceImpl<TL2DataMapper, TL2Data> {
      * 获取最新2条数据
      * @return
      */
-    public List<TL2Data> getLatest2Data() {
+    public List<TL2Data> getTappedLatest2Datas() {
         LambdaQueryWrapper<TL2Data> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.isNotNull(TL2Data::getIronNo).isNotNull(TL2Data::getIronWeight).isNotNull(TL2Data::getTheoryWeight).orderByDesc(TL2Data::getIronNo).last("limit 2");
         List<TL2Data> list = list(queryWrapper);
         return list;
     }
+    /***
+     * 获取最新1条数据
+     * @return
+     */
+    public TL2Data getLatestData() {
+        LambdaQueryWrapper<TL2Data> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.isNotNull(TL2Data::getIronNo).orderByDesc(TL2Data::getIronNo).last("limit 1");
+        List<TL2Data> list = list(queryWrapper);
+        return ObjectUtils.isEmpty(list) ? null : list.get(0);
+    }
 
     /***
      * 获取正在出铁的数据
+     * 标记正在出铁的数据:出铁号有了,但是出铁量还没出来,理论铁量也在实时更新
      * @return
      */
     public TL2Data getTappingData() {
         LambdaQueryWrapper<TL2Data> queryWrapper = new LambdaQueryWrapper<>();
-        //出铁号有了
-        //但是出铁量还没出来
-        //理论铁量也在实时更新
         queryWrapper.isNotNull(TL2Data::getIronNo).isNull(TL2Data::getIronWeight).isNotNull(TL2Data::getTheoryWeight).orderByDesc(TL2Data::getIronNo).last("limit 1");
         List<TL2Data> list = list(queryWrapper);
         return ObjectUtils.isEmpty(list) ? null : list.get(0);

+ 1 - 1
taphole-l2/src/main/resources/mapper/TL2DataMapper.xml

@@ -7,7 +7,7 @@
 
     <select id="getTrendDataByDiffDay" resultType="com.sckj.l2.dto.TL2DataDTO">
         select
-        create_time createTime,
+        DATE_FORMAT(create_time, '%H:%i') createTime,
         avg_temp avgTemp,
         iron_weight ironWeight,
         ROUND((iron_weight/iron_costtime),2) ironSpeed,

+ 56 - 0
taphole-opc-start/pom.xml

@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <!-- 父工程 -->
+    <parent>
+        <artifactId>taphole-java</artifactId>
+        <groupId>com.sckj</groupId>
+        <version>1.0.0</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>taphole-opc-start</artifactId>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.sckj</groupId>
+            <artifactId>taphole-opc</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.6.4</version>
+                <configuration>
+                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
+                    <includeSystemScope>true</includeSystemScope>
+                    <mainClass>com.sckj.opcstart.TapholeOpcStartApplication</mainClass>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>repackage</id>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+
+        </plugins>
+    </build>
+
+</project>

+ 43 - 0
taphole-opc-start/src/main/java/com/sckj/opcstart/TapholeOpcStartApplication.java

@@ -0,0 +1,43 @@
+package com.sckj.opcstart;
+
+import com.sckj.opc.dauaservice.OPCDAServiceImpl;
+import lombok.extern.log4j.Log4j2;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+
+@Configuration
+@ComponentScan(basePackages = {"com.sckj"})
+@MapperScan(basePackages = {"com.sckj.**.mapper"})
+@EnableTransactionManagement
+@SpringBootApplication(exclude = {RedisRepositoriesAutoConfiguration.class})
+@Log4j2
+public class TapholeOpcStartApplication {
+
+    @Resource
+    OPCDAServiceImpl opcuaService;
+
+
+    @PostConstruct
+    public void init() {
+        try {
+            opcuaService.subscribeAvailable();
+            log.info("Subscribed to available opcda succesfully");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    public static void main(String[] args) {
+        SpringApplication.run(TapholeOpcStartApplication.class, args);
+    }
+
+}

+ 30 - 0
taphole-opc-start/src/main/resources/application-dev.yml

@@ -0,0 +1,30 @@
+# 服务配置
+server:
+  port: 48080
+  servlet:
+    context-path: /
+
+# 框架配置
+spring:
+  # 数据源配置
+  datasource:
+    url: jdbc:mysql://192.168.110.130:13306/taphole?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
+    type: com.alibaba.druid.pool.DruidDataSource # 数据源类型
+    driver-class-name: com.mysql.jdbc.Driver # MySql的驱动
+    username: root # 数据库账号
+    password: root # 数据库密码
+  # Redis配置
+  redis:
+    host: 192.168.110.130   # Redis服务地址
+    port: 16379        # Redis端口
+    password:         # Redis密码
+    database: 5       # 数据库索引
+#    lettuce:
+#      pool:
+#        max-wait: 30000 # 连接池最大阻塞等待时间(使用负数表示没有限制,默认-1)
+#        max-active: 100 # 连接池最大连接数(使用负数表示没有限制,默认8)
+#        max-idle: 20    # 连接池中的最大空闲连接(默认8)
+#        min-idle: 0     # 连接池中的最小空闲连接(默认0)
+
+
+

+ 25 - 0
taphole-opc-start/src/main/resources/application-prod.yml

@@ -0,0 +1,25 @@
+# 服务配置
+server:
+  port: 48080
+  servlet:
+    context-path: /
+# 框架配置
+spring:
+  # 数据源配置
+  datasource:
+    url: jdbc:mysql://mysql:3306/taphole?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
+    type: com.alibaba.druid.pool.DruidDataSource # 数据源类型
+    driver-class-name: com.mysql.jdbc.Driver # MySql的驱动
+    username: root # 数据库账号
+    password: root # 数据库密码
+  # Redis配置
+  redis:
+    host: redis   # Redis服务地址
+    port: 6379        # Redis端口
+#    password: sckj@1234        # Redis密码
+#    database: 5       # 数据库索引
+
+# Mybatis-plus配置 【是否开启SQL日志输出】
+#mybatis-plus:
+#    configuration:
+#      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

+ 32 - 0
taphole-opc-start/src/main/resources/application-test.yml

@@ -0,0 +1,32 @@
+# 服务配置
+server:
+  port: 48080
+  servlet:
+    context-path: /
+
+# 框架配置
+spring:
+  # 数据源配置
+  datasource:
+    url: jdbc:mysql://192.168.110.130:13306/taphole?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
+    type: com.alibaba.druid.pool.DruidDataSource # 数据源类型
+    driver-class-name: com.mysql.jdbc.Driver # MySql的驱动
+    username: root # 数据库账号
+    password: root # 数据库密码
+  # Redis配置
+  redis:
+    host: 192.168.110.130   # Redis服务地址
+    port: 16379        # Redis端口
+    password:         # Redis密码
+    database: 5       # 数据库索引
+#    lettuce:
+#      pool:
+#        max-wait: 30000 # 连接池最大阻塞等待时间(使用负数表示没有限制,默认-1)
+#        max-active: 100 # 连接池最大连接数(使用负数表示没有限制,默认8)
+#        max-idle: 20    # 连接池中的最大空闲连接(默认8)
+#        min-idle: 0     # 连接池中的最小空闲连接(默认0)
+
+# Mybatis-plus配置 【是否开启SQL日志输出】
+#mybatis-plus:
+#    configuration:
+#      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

+ 78 - 0
taphole-opc-start/src/main/resources/application.yml

@@ -0,0 +1,78 @@
+# 项目配置
+like:
+  #upload-directory: /www/uploads/likeadmin-java/ # 上传目录
+  # 验证码配置
+  captcha:
+    # 是否开启验证码
+    status: false
+    # 验证码有效时长
+    expire: 120
+    # 验证码缓存键名
+    token: "captcha:key:"
+  # Swagger配置
+  swagger:
+    # 是否开启swagger
+    enabled: true
+    # 请求前缀
+    pathMapping: /
+
+# 框架配置
+spring:
+  profiles:
+    active: dev
+  mvc:
+    static-path-pattern: /api/static/**
+    throw-exception-if-no-handler-found: true
+    pathmatch:
+      matching-strategy: ant_path_matcher
+  # 限制配置
+  servlet:
+    multipart:
+      max-file-size: 100MB    # 文件上传大小限制
+      max-request-size: 100MB # 文件最大请求限制
+      enabled: true
+  # Redis配置
+  redis:
+    lettuce:
+      pool:
+        max-wait: 30000 # 连接池最大阻塞等待时间(使用负数表示没有限制,默认-1)
+        max-active: 100 # 连接池最大连接数(使用负数表示没有限制,默认8)
+        max-idle: 20    # 连接池中的最大空闲连接(默认8)
+        min-idle: 0     # 连接池中的最小空闲连接(默认0)
+  jackson:
+    date-format: yyyy-MM-dd HH:mm:ss
+    time-zone: GMT+8
+
+# Mybatis-plus配置
+mybatis-plus:
+  mapper-locations: classpath*:/mapper/**Mapper.xml
+  typeAliasesPackage: com.sckj.**.mapper
+  global-config:
+    banner: false
+    db-config:
+      table-prefix: la_
+  configuration-properties:
+    prefix: la_
+
+# Sa-token配置
+sa-token:
+  token-name: token  # token的名称
+  timeout: 2592000        # token有效期单位s(默认30天,-1代表永不过期)
+  activity-timeout: -1    # token临时有效期(指定时间无操作掉线)
+  is-concurrent: true     # 是否允许同一账号并发登录
+  is-share: false         # 多人同登账号共用token
+  token-style: random-64  # token生成的风格
+  is-print: false         # 打印版本字符画
+  is-log: false           # 是否输出操作日志
+
+socketio:
+  # host: 127.0.0.1		#主机名,默认是 0.0.0.0 (这个设不设置无所谓,因为后面的 SocketConfig 类一般不用设置这个)
+  port: 43000			#监听端口
+  maxFramePayloadLength: 1048576
+  maxHttpContentLength: 1048576
+  bossCount: 1
+  workCount: 100
+  allowCustomRequests: true
+  upgradeTimeout: 1000000		#协议升级超时时间(毫秒),默认10000。HTTP握手升级为ws协议超时时间
+  pingTimeout: 6000000		    #Ping消息超时时间(毫秒),默认60000,这个时间间隔内没有接收到心跳消息就会发送超时事件
+  pingInterval: 25000			#Ping消息间隔(毫秒),默认25000。客户端向服务器发送一条心跳消息间隔

+ 10 - 0
taphole-opc-start/src/main/resources/banner.txt

@@ -0,0 +1,10 @@
+Spring Boot Version: ${spring-boot.version}
+
+
+####### ######   #####
+#     # #     # #     #
+#     # #     # #
+#     # ######  #
+#     # #       #
+#     # #       #     #
+####### #        #####

+ 85 - 0
taphole-opc-start/src/main/resources/log4j2-spring.xml

@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- 日志级别排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
+<configuration monitorInterval="5">
+
+    <!-- 变量配置 -->
+    <Properties>
+        <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
+        <property name="FILE_PATH" value="./logs/opc" />
+        <property name="FILE_NAME" value="opc-log4j2" />
+    </Properties>
+
+    <appenders>
+        <!-- 控制台输出 -->
+        <console name="Console" target="SYSTEM_OUT">
+            <PatternLayout pattern="${LOG_PATTERN}"/>
+            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
+        </console>
+
+        <!-- 临时测试日志 -->
+        <File name="Filelog" fileName="${FILE_PATH}/test.log" append="false">
+            <PatternLayout pattern="${LOG_PATTERN}"/>
+        </File>
+
+        <!-- Info日志分割压缩 -->
+        <RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
+            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
+            <PatternLayout pattern="${LOG_PATTERN}"/>
+            <Policies>
+                <TimeBasedTriggeringPolicy interval="1"/>
+                <SizeBasedTriggeringPolicy size="10MB"/>
+            </Policies>
+            <DefaultRolloverStrategy max="15"/>
+        </RollingFile>
+
+        <!-- warn日志分割压缩 -->
+        <RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
+            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
+            <PatternLayout pattern="${LOG_PATTERN}"/>
+            <Policies>
+                <TimeBasedTriggeringPolicy interval="1"/>
+                <SizeBasedTriggeringPolicy size="10MB"/>
+            </Policies>
+            <DefaultRolloverStrategy max="15"/>
+        </RollingFile>
+
+        <!-- error日志分割压缩 -->
+        <RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
+            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
+            <PatternLayout pattern="${LOG_PATTERN}"/>
+            <Policies>
+                <TimeBasedTriggeringPolicy interval="1"/>
+                <SizeBasedTriggeringPolicy size="10MB"/>
+            </Policies>
+            <DefaultRolloverStrategy max="15"/>
+        </RollingFile>
+    </appenders>
+
+    <loggers>
+        <!-- 过滤指定DEBUG信息 -->
+        <logger name="org.mybatis" level="info" additivity="false">
+            <AppenderRef ref="Console"/>
+        </logger>
+
+        <!-- 监控系统信息 -->
+        <Logger name="org.springframework" level="info" additivity="false">
+            <AppenderRef ref="Console"/>
+        </Logger>
+
+        <!-- 监控系统信息 -->
+        <Logger name="org.jinterop" level="error" additivity="false">
+            <AppenderRef ref="Console"/>
+        </Logger>
+
+        <!-- 初始化日志 -->
+        <root level="info">
+            <appender-ref ref="Console"/>
+            <appender-ref ref="Filelog"/>
+            <appender-ref ref="RollingFileInfo"/>
+            <appender-ref ref="RollingFileWarn"/>
+            <appender-ref ref="RollingFileError"/>
+        </root>
+    </loggers>
+
+</configuration>

+ 2 - 2
taphole-warn/src/main/java/com/sckj/warn/validate/TExceptionLogCreateValidate.java

@@ -18,7 +18,7 @@ public class TExceptionLogCreateValidate implements Serializable {
 
 
     @NotNull(message = "exceptionType参数缺失")
-    @ApiModelProperty(value = "异常类型(开口耗时、出铁时间、出铁量、流速、铁水温度变化)")
+    @ApiModelProperty(value = "异常类型(1开口耗时、2出铁时间、3出铁量、4流速、5铁水温度变化、6压力值、7堵口)")
     private Integer exceptionType;
 
 //    @NotNull(message = "exceptionArea参数缺失")
@@ -26,7 +26,7 @@ public class TExceptionLogCreateValidate implements Serializable {
 //    private String exceptionArea;
 
     @NotNull(message = "exceptionLevel参数缺失")
-    @ApiModelProperty(value = "危害程度(轻微、中等、重度)")
+    @ApiModelProperty(value = "危害程度(轻微1、中等2、重度3)")
     private String exceptionLevel;
 
     @NotNull(message = "exceptionDesc参数缺失")