Browse Source

代码优化

wangxiaofei 4 months ago
parent
commit
d53e0d97f6
30 changed files with 900 additions and 732 deletions
  1. 1 1
      doc/import_all_images.sh
  2. 40 0
      docker/config/nginx/nginx.conf
  3. 4 4
      docker/docker-compose.yml
  4. 12 0
      docker/docker部署流程.md
  5. 8 8
      taphole-camera/src/main/java/com.sckj.camera/service/CameraServiceImpl.java
  6. 2 1
      taphole-iron/src/main/java/com/sckj/iron/controller/TIronAfterController.java
  7. 2 1
      taphole-iron/src/main/java/com/sckj/iron/controller/TIronBlockController.java
  8. 2 1
      taphole-iron/src/main/java/com/sckj/iron/controller/TIronDataController.java
  9. 2 1
      taphole-iron/src/main/java/com/sckj/iron/controller/TIronParamController.java
  10. 42 11
      taphole-iron/src/main/java/com/sckj/iron/controller/TIronStepController.java
  11. 0 6
      taphole-iron/src/main/java/com/sckj/iron/entity/TIronData.java
  12. 1 1
      taphole-iron/src/main/java/com/sckj/iron/entity/TIronStep.java
  13. 1 0
      taphole-iron/src/main/java/com/sckj/iron/service/ITIronAfterService.java
  14. 3 5
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronAfterServiceImpl.java
  15. 4 5
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronBlockServiceImpl.java
  16. 5 7
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronDataServiceImpl.java
  17. 4 6
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronParamServiceImpl.java
  18. 53 6
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronStepServiceImpl.java
  19. 262 612
      taphole-iron/src/main/java/com/sckj/iron/socketio/DeviceEventListener.java
  20. 77 0
      taphole-iron/src/main/java/com/sckj/iron/socketio/IronRealtimeListener.java
  21. 56 0
      taphole-iron/src/main/java/com/sckj/iron/socketio/IronTrendListener.java
  22. 37 13
      taphole-iron/src/main/java/com/sckj/iron/socketio/PushData.java
  23. 20 3
      taphole-iron/src/main/java/com/sckj/iron/vo/IronStepVO.java
  24. 44 0
      taphole-iron/src/main/java/com/sckj/iron/vo/TIronDataVo.java
  25. 67 0
      taphole-opc/src/main/java/com/sckj/opc/dto/L2Data.java
  26. 125 0
      taphole-opc/src/main/java/com/sckj/opc/opcua/L2DataServiceImpl.java
  27. 5 28
      taphole-opc/src/main/java/com/sckj/opc/opcua/OPCUAServiceImpl.java
  28. 6 3
      taphole-warn/src/main/java/com/sckj/warn/entity/TExceptionLog.java
  29. 5 4
      taphole-warn/src/main/java/com/sckj/warn/service/impl/TExceptionLogServiceImpl.java
  30. 10 5
      taphole-warn/src/main/java/com/sckj/warn/validate/TExceptionLogCreateValidate.java

+ 1 - 1
doc/import_all_images.sh

@@ -1,2 +1,2 @@
 #!/bin/bash
-ls /root/dockerimages/*.tar | xargs -I {} docker load -i {}
+ls /home/document/dockerimages/*.tar | xargs -I {} docker load -i {}

+ 40 - 0
docker/config/nginx/nginx.conf

@@ -0,0 +1,40 @@
+#user  nobody;
+worker_processes  1;
+
+events {
+    worker_connections  1024;
+}
+
+http {
+    include       mime.types;
+    default_type  application/octet-stream;
+
+    sendfile        on;
+    keepalive_timeout  65;
+
+    #gzip  on;
+
+    server {
+        listen       80;
+        server_name  localhost;
+
+        location /api/ {
+            proxy_set_header Host $http_host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header REMOTE-HOST $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_pass http://172.28.1.100:8080/api/;
+        }
+
+        location / {
+            root /etc/nginx/html/dist;
+            try_files $uri $uri/ /index.html;
+            index index.html index.htm;
+        }
+
+        error_page   500 502 503 504  /50x.html;
+        location = /50x.html {
+            root   html;
+        }
+    }
+}

+ 4 - 4
docker/docker-compose.yml

@@ -51,7 +51,7 @@ services:
     networks:
       - taphole
     ports:
-      - "56379:6379"
+      - "16379:6379"
     command: redis-server --appendonly yes
 
 
@@ -101,9 +101,9 @@ services:
       dockerfile: Dockerfile
     volumes:
       # - ./target/taphole-admin-1.0.0.jar:/app/my-springboot-app.jar
-      - ./target/loadFFmpeg.properties:/app/loadFFmpeg.properties
-      - /home/xiaofei/taphole/hcsdk/linux:/home/xiaofei/taphole/hcsdk/linux
-      - /home/xiaofei/uploads/taphole/:/home/xiaofei/uploads/taphole/  #映射资源目录
+      #- ./target/loadFFmpeg.properties:/app/loadFFmpeg.properties
+      - /home/document/taphole/hcsdk/linux:/home/document/taphole/hcsdk/linux
+      - /home/document/uploads/taphole/:/home/document/uploads/taphole/  #映射资源目录
       # - /usr/local/ffmpeg/bin:/usr/local/ffmpeg/bin
     ports:
       - "28080:8080"

+ 12 - 0
docker/docker部署流程.md

@@ -108,4 +108,16 @@
     2.mysql的配置文件mysql.cnf,初始化数据库语句
     3.target文件夹,存放jar包和loadFFmpeg.propertis
 
+六、arm架构
+    docker pull --platform linux/arm64/v8 mpromonet/webrtc-streamer:v0.8.8
+    
+    docker pull --platform linux/arm64/v8 nginx:1.27.3
+    
+    docker pull --platform linux/arm64/v8 mysql:latest
+    
+    docker pull --platform linux/arm64/v8 library/redis:7
+    
+    docker pull --platform linux/arm64/v8 library/redis:7.2
+    
+    docker pull --platform linux/arm64/v8 library/redis:7.2.6
     

+ 8 - 8
taphole-camera/src/main/java/com.sckj.camera/service/CameraServiceImpl.java

@@ -423,14 +423,14 @@ public class CameraServiceImpl extends ServiceImpl<CameraMapper, Camera> {
     }
 
 
-    @PreDestroy
-    public void closeRealStream() {
-        logger.info("关闭推送流");
-        for (CameraFlow cameraFlow : flowService.list()) {
-            String taskName = cameraFlow.getTaskName();
-            ffmpegService.stopTranscoding(taskName);
-        }
-    }
+//    @PreDestroy
+//    public void closeRealStream() {
+//        logger.info("关闭推送流");
+//        for (CameraFlow cameraFlow : flowService.list()) {
+//            String taskName = cameraFlow.getTaskName();
+//            ffmpegService.stopTranscoding(taskName);
+//        }
+//    }
 
 
 }

+ 2 - 1
taphole-iron/src/main/java/com/sckj/iron/controller/TIronAfterController.java

@@ -3,6 +3,7 @@ package com.sckj.iron.controller;
 import com.sckj.common.aop.Log;
 import com.sckj.iron.service.ITIronAfterService;
 import com.sckj.common.validate.commons.IdValidate;
+import com.sckj.iron.service.impl.TIronAfterServiceImpl;
 import com.sckj.iron.validate.TIronAfterCreateValidate;
 import com.sckj.iron.validate.TIronAfterUpdateValidate;
 import com.sckj.iron.validate.TIronAfterSearchValidate;
@@ -26,7 +27,7 @@ import java.util.List;
 public class TIronAfterController {
 
     @Resource
-    ITIronAfterService iTIronAfterService;
+    TIronAfterServiceImpl iTIronAfterService;
 
     @GetMapping("/list")
     @ApiOperation(value="出铁后列表")

+ 2 - 1
taphole-iron/src/main/java/com/sckj/iron/controller/TIronBlockController.java

@@ -3,6 +3,7 @@ package com.sckj.iron.controller;
 import com.sckj.common.aop.Log;
 import com.sckj.iron.service.ITIronBlockService;
 import com.sckj.common.validate.commons.IdValidate;
+import com.sckj.iron.service.impl.TIronBlockServiceImpl;
 import com.sckj.iron.validate.TIronBlockCreateValidate;
 import com.sckj.iron.validate.TIronBlockUpdateValidate;
 import com.sckj.iron.validate.TIronBlockSearchValidate;
@@ -26,7 +27,7 @@ import java.util.List;
 public class TIronBlockController {
 
     @Resource
-    ITIronBlockService iTIronBlockService;
+    TIronBlockServiceImpl iTIronBlockService;
 
     @GetMapping("/list")
     @ApiOperation(value="堵口后列表")

+ 2 - 1
taphole-iron/src/main/java/com/sckj/iron/controller/TIronDataController.java

@@ -7,6 +7,7 @@ import com.sckj.common.validate.commons.IdValidate;
 import com.sckj.common.validate.commons.PageValidate;
 import com.sckj.common.validator.annotation.IDMust;
 import com.sckj.iron.service.ITIronDataService;
+import com.sckj.iron.service.impl.TIronDataServiceImpl;
 import com.sckj.iron.validate.TIronDataCreateValidate;
 import com.sckj.iron.validate.TIronDataSearchValidate;
 import com.sckj.iron.vo.TIronDataDetailVo;
@@ -25,7 +26,7 @@ import java.util.List;
 public class TIronDataController {
 
     @Resource
-    ITIronDataService iTIronDataService;
+    TIronDataServiceImpl iTIronDataService;
 
     @GetMapping("/list")
     @ApiOperation(value="出铁数据列表")

+ 2 - 1
taphole-iron/src/main/java/com/sckj/iron/controller/TIronParamController.java

@@ -3,6 +3,7 @@ package com.sckj.iron.controller;
 import com.sckj.common.aop.Log;
 import com.sckj.iron.service.ITIronParamService;
 import com.sckj.common.validate.commons.IdValidate;
+import com.sckj.iron.service.impl.TIronParamServiceImpl;
 import com.sckj.iron.validate.TIronParamCreateValidate;
 import com.sckj.iron.validate.TIronParamUpdateValidate;
 import com.sckj.iron.validate.TIronParamSearchValidate;
@@ -26,7 +27,7 @@ import java.util.List;
 public class TIronParamController {
 
     @Resource
-    ITIronParamService iTIronParamService;
+    TIronParamServiceImpl iTIronParamService;
 
     @GetMapping("/list")
     @ApiOperation(value="参数设定列表")

+ 42 - 11
taphole-iron/src/main/java/com/sckj/iron/controller/TIronStepController.java

@@ -1,14 +1,15 @@
 package com.sckj.iron.controller;
 
 
+import com.sckj.common.aop.Log;
 import com.sckj.common.aop.NotLogin;
 import com.sckj.common.core.AjaxResult;
+import com.sckj.iron.entity.TIronStep;
 import com.sckj.iron.service.impl.TIronStepServiceImpl;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
@@ -21,21 +22,51 @@ public class TIronStepController {
     @Resource
     TIronStepServiceImpl iTIronStepService;
 
-    @GetMapping("/getSteps")
-    @ApiOperation(value="获取步骤")
+    @GetMapping("/getTreeSteps")
+    @ApiOperation(value = "获取步骤")
     @NotLogin
-    public AjaxResult getSteps() {
-        return AjaxResult.success(iTIronStepService.getSteps());
+    public AjaxResult getTreeSteps() {
+        return AjaxResult.success(iTIronStepService.getTreeSteps());
     }
 
+//    @GetMapping("/getLinkedMapSteps")
+//    @ApiOperation(value = "获取步骤")
+//    @NotLogin
+//    public AjaxResult getLinkedMapSteps() {
+//        return AjaxResult.success(iTIronStepService.getLinkedMapSteps());
+//    }
 
-    @GetMapping("/refreshSteps")
-    @ApiOperation(value="刷新步骤")
+
+    @GetMapping("/refreshTreeSteps")
+    @ApiOperation(value = "刷新步骤")
     @NotLogin
-    public AjaxResult refreshSteps() {
-        iTIronStepService.refreshSteps();
+    public AjaxResult refreshTreeSteps() {
+        iTIronStepService.refreshTreeSteps();
         return AjaxResult.success(LocalDateTime.now());
     }
 
+    @Log(title = "新增或者更新")
+    @PostMapping("/saveOrUpdate")
+    @ApiOperation(value = "新增或者更新")
+    public AjaxResult saveOrUpdate(@Validated @RequestBody TIronStep tIronStep) {
+        iTIronStepService.saveOrUpdate(tIronStep);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "删除")
+    @PostMapping("/del")
+    @ApiOperation(value = "删除")
+    public AjaxResult del(@Validated @RequestBody TIronStep tIronStep) {
+        iTIronStepService.removeById(tIronStep);
+        return AjaxResult.success();
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation(value="详情")
+    public AjaxResult detail(TIronStep tIronStep) {
+        TIronStep detail = iTIronStepService.getById(tIronStep.getStepId());
+        return AjaxResult.success(detail);
+    }
+
 
 }

+ 0 - 6
taphole-iron/src/main/java/com/sckj/iron/entity/TIronData.java

@@ -51,13 +51,7 @@ public class TIronData implements Serializable {
     @ApiModelProperty(value = "危害程度")
     private String whcd;
 
-    @ApiModelProperty(value = "设备区域")
-    private String sbqy;
-
     @ApiModelProperty(value = "时间")
     private String sj;
 
-    @ApiModelProperty(value = "次数")
-    private String cs;
-
 }

+ 1 - 1
taphole-iron/src/main/java/com/sckj/iron/entity/TIronStep.java

@@ -28,7 +28,7 @@ public class TIronStep implements Serializable {
     @ApiModelProperty(value = "更新时间")
     private String updateTime;
 
-    @TableId(value="step_id", type= IdType.AUTO)
+    @TableId(value="step_id", type= IdType.INPUT)
     @ApiModelProperty(value = "stepId")
     private String stepId;
 

+ 1 - 0
taphole-iron/src/main/java/com/sckj/iron/service/ITIronAfterService.java

@@ -8,6 +8,7 @@ import com.sckj.iron.validate.TIronAfterSearchValidate;
 import com.sckj.iron.vo.TIronAfterListedVo;
 import com.sckj.iron.vo.TIronAfterDetailVo;
 import com.sckj.common.core.PageResult;
+import org.springframework.stereotype.Service;
 
 import java.util.List;
 

+ 3 - 5
taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronAfterServiceImpl.java

@@ -3,6 +3,7 @@ package com.sckj.iron.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sckj.common.TapholeAdminThreadLocal;
 import com.sckj.common.core.AjaxResult;
 import com.sckj.common.core.PageResult;
@@ -10,6 +11,7 @@ import com.sckj.common.validate.commons.PageValidate;
 import com.sckj.iron.entity.TIronAfter;
 import com.sckj.iron.entity.TIronData;
 import com.sckj.iron.mapper.TIronAfterMapper;
+import com.sckj.iron.mapper.TIronDataMapper;
 import com.sckj.iron.service.ITIronAfterService;
 import com.sckj.iron.validate.TIronAfterCreateValidate;
 import com.sckj.iron.validate.TIronAfterSearchValidate;
@@ -31,7 +33,7 @@ import java.util.List;
  * @author zhanghao
  */
 @Service
-public class TIronAfterServiceImpl implements ITIronAfterService {
+public class TIronAfterServiceImpl  extends ServiceImpl<TIronAfterMapper, TIronAfter> {
         
     @Resource
     TIronAfterMapper tIronAfterMapper;
@@ -44,7 +46,6 @@ public class TIronAfterServiceImpl implements ITIronAfterService {
      * @param searchValidate 搜索参数
      * @return PageResult<TIronAfterListedVo>
      */
-    @Override
     public PageResult<TIronAfterListedVo> list(PageValidate pageValidate, TIronAfterSearchValidate searchValidate) {
         Integer page  = pageValidate.getPageNo();
         Integer limit = pageValidate.getPageSize();
@@ -78,7 +79,6 @@ public class TIronAfterServiceImpl implements ITIronAfterService {
      * @param id 主键参数
      * @return TIronAfter
      */
-    @Override
     public TIronAfterDetailVo detail(Integer id) {
         TIronAfter model = tIronAfterMapper.selectOne(
                 new QueryWrapper<TIronAfter>()
@@ -98,7 +98,6 @@ public class TIronAfterServiceImpl implements ITIronAfterService {
      * @author zhanghao
      * @param createValidate 参数
      */
-    @Override
     public void add(TIronAfterCreateValidate createValidate) {
         TIronAfter model = new TIronAfter();
         model.setCreateBy(String.valueOf(TapholeAdminThreadLocal.getAdminUsername()));
@@ -118,7 +117,6 @@ public class TIronAfterServiceImpl implements ITIronAfterService {
      * @author zhanghao
      * @param id 主键ID
      */
-    @Override
     public void del(Integer id) {
         TIronAfter model = tIronAfterMapper.selectOne(
                 new QueryWrapper<TIronAfter>()

+ 4 - 5
taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronBlockServiceImpl.java

@@ -3,12 +3,15 @@ package com.sckj.iron.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sckj.common.TapholeAdminThreadLocal;
 import com.sckj.common.core.AjaxResult;
 import com.sckj.common.core.PageResult;
 import com.sckj.common.validate.commons.PageValidate;
+import com.sckj.iron.entity.TIronAfter;
 import com.sckj.iron.entity.TIronBlock;
 import com.sckj.iron.entity.TIronData;
+import com.sckj.iron.mapper.TIronAfterMapper;
 import com.sckj.iron.mapper.TIronBlockMapper;
 import com.sckj.iron.service.ITIronBlockService;
 import com.sckj.iron.validate.TIronBlockCreateValidate;
@@ -31,7 +34,7 @@ import java.util.List;
  * @author zhanghao
  */
 @Service
-public class TIronBlockServiceImpl implements ITIronBlockService {
+public class TIronBlockServiceImpl  extends ServiceImpl<TIronBlockMapper, TIronBlock> {
         
     @Resource
     TIronBlockMapper tIronBlockMapper;
@@ -44,7 +47,6 @@ public class TIronBlockServiceImpl implements ITIronBlockService {
      * @param searchValidate 搜索参数
      * @return PageResult<TIronBlockListedVo>
      */
-    @Override
     public PageResult<TIronBlockListedVo> list(PageValidate pageValidate, TIronBlockSearchValidate searchValidate) {
         Integer page  = pageValidate.getPageNo();
         Integer limit = pageValidate.getPageSize();
@@ -78,7 +80,6 @@ public class TIronBlockServiceImpl implements ITIronBlockService {
      * @param id 主键参数
      * @return TIronBlock
      */
-    @Override
     public TIronBlockDetailVo detail(Integer id) {
         TIronBlock model = tIronBlockMapper.selectOne(
                 new QueryWrapper<TIronBlock>()
@@ -98,7 +99,6 @@ public class TIronBlockServiceImpl implements ITIronBlockService {
      * @author zhanghao
      * @param createValidate 参数
      */
-    @Override
     public void add(TIronBlockCreateValidate createValidate) {
         TIronBlock model = new TIronBlock();
         model.setCreateBy(String.valueOf(TapholeAdminThreadLocal.getAdminUsername()));
@@ -118,7 +118,6 @@ public class TIronBlockServiceImpl implements ITIronBlockService {
      * @author zhanghao
      * @param id 主键ID
      */
-    @Override
     public void del(Integer id) {
         TIronBlock model = tIronBlockMapper.selectOne(
                 new QueryWrapper<TIronBlock>()

+ 5 - 7
taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronDataServiceImpl.java

@@ -3,6 +3,7 @@ package com.sckj.iron.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sckj.common.TapholeAdminThreadLocal;
 import com.sckj.common.core.AjaxResult;
 import com.sckj.common.core.PageResult;
@@ -15,6 +16,8 @@ import com.sckj.iron.validate.TIronDataSearchValidate;
 import com.sckj.iron.validate.TIronDataUpdateValidate;
 import com.sckj.iron.vo.TIronDataDetailVo;
 import com.sckj.iron.vo.TIronDataListedVo;
+import com.sckj.opc.entity.OPCData;
+import com.sckj.opc.mapper.OPCDataMapper;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
@@ -31,7 +34,7 @@ import java.util.List;
  * @author zhnaghao
  */
 @Service
-public class TIronDataServiceImpl implements ITIronDataService {
+public class TIronDataServiceImpl extends ServiceImpl<TIronDataMapper, TIronData> {
 
     @Resource
     TIronDataMapper tIronDataMapper;
@@ -44,7 +47,6 @@ public class TIronDataServiceImpl implements ITIronDataService {
      * @return PageResult<TIronDataListedVo>
      * @author zhnaghao
      */
-    @Override
     public PageResult<TIronDataListedVo> list(PageValidate pageValidate, TIronDataSearchValidate searchValidate) {
         Integer page = pageValidate.getPageNo();
         Integer limit = pageValidate.getPageSize();
@@ -83,7 +85,6 @@ public class TIronDataServiceImpl implements ITIronDataService {
      * @return TIronData
      * @author zhnaghao
      */
-    @Override
     public TIronDataDetailVo detail(Integer id) {
         TIronData model = tIronDataMapper.selectOne(
                 new QueryWrapper<TIronData>()
@@ -103,7 +104,6 @@ public class TIronDataServiceImpl implements ITIronDataService {
      * @param createValidate 参数
      * @author zhnaghao
      */
-    @Override
     public void add(TIronDataCreateValidate createValidate) {
         TIronData model = new TIronData();
         model.setCreateBy(String.valueOf(TapholeAdminThreadLocal.getAdminUsername()));
@@ -114,9 +114,8 @@ public class TIronDataServiceImpl implements ITIronDataService {
         model.setCtl(createValidate.getCtl());
         model.setZl(createValidate.getZl());
         model.setWhcd(createValidate.getWhcd());
-        model.setSbqy(createValidate.getSbqy());
+        //model.setSbqy(createValidate.getSbqy());
         model.setSj(createValidate.getSj());
-        model.setCs(createValidate.getCs());
         tIronDataMapper.insert(model);
     }
 
@@ -126,7 +125,6 @@ public class TIronDataServiceImpl implements ITIronDataService {
      * @param id 主键ID
      * @author zhnaghao
      */
-    @Override
     public void del(Integer id) {
         TIronData model = tIronDataMapper.selectOne(
                 new QueryWrapper<TIronData>()

+ 4 - 6
taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronParamServiceImpl.java

@@ -3,13 +3,16 @@ package com.sckj.iron.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sckj.common.TapholeAdminThreadLocal;
 import com.sckj.common.core.AjaxResult;
 import com.sckj.common.core.PageResult;
 import com.sckj.common.util.TimeUtils;
 import com.sckj.common.validate.commons.PageValidate;
+import com.sckj.iron.entity.TIronBlock;
 import com.sckj.iron.entity.TIronData;
 import com.sckj.iron.entity.TIronParam;
+import com.sckj.iron.mapper.TIronBlockMapper;
 import com.sckj.iron.mapper.TIronParamMapper;
 import com.sckj.iron.service.ITIronParamService;
 import com.sckj.iron.validate.TIronParamCreateValidate;
@@ -32,7 +35,7 @@ import java.util.List;
  * @author zhnaghao
  */
 @Service
-public class TIronParamServiceImpl implements ITIronParamService {
+public class TIronParamServiceImpl extends ServiceImpl<TIronParamMapper, TIronParam> {
         
     @Resource
     TIronParamMapper tIronParamMapper;
@@ -45,7 +48,6 @@ public class TIronParamServiceImpl implements ITIronParamService {
      * @param searchValidate 搜索参数
      * @return PageResult<TIronParamListedVo>
      */
-    @Override
     public PageResult<TIronParamListedVo> list(PageValidate pageValidate, TIronParamSearchValidate searchValidate) {
         Integer page  = pageValidate.getPageNo();
         Integer limit = pageValidate.getPageSize();
@@ -78,7 +80,6 @@ public class TIronParamServiceImpl implements ITIronParamService {
      * @param id 主键参数
      * @return TIronParam
      */
-    @Override
     public TIronParamDetailVo detail(Integer id) {
         TIronParam model = tIronParamMapper.selectOne(
                 new QueryWrapper<TIronParam>()
@@ -98,7 +99,6 @@ public class TIronParamServiceImpl implements ITIronParamService {
      * @author zhnaghao
      * @param createValidate 参数
      */
-    @Override
     public void add(TIronParamCreateValidate createValidate) {
         TIronParam model = new TIronParam();
         model.setCreateTime(new Date(System.currentTimeMillis()));
@@ -117,7 +117,6 @@ public class TIronParamServiceImpl implements ITIronParamService {
      * @author zhnaghao
      * @param updateValidate 参数
      */
-    @Override
     public void edit(TIronParamUpdateValidate updateValidate) {
         TIronParam model = tIronParamMapper.selectOne(
                 new QueryWrapper<TIronParam>()
@@ -142,7 +141,6 @@ public class TIronParamServiceImpl implements ITIronParamService {
      * @author zhnaghao
      * @param id 主键ID
      */
-    @Override
     public void del(Integer id) {
         TIronParam model = tIronParamMapper.selectOne(
                 new QueryWrapper<TIronParam>()

+ 53 - 6
taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronStepServiceImpl.java

@@ -3,11 +3,9 @@ package com.sckj.iron.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.eventbus.AsyncEventBus;
-import com.sckj.iron.dto.IronStepDTO;
 import com.sckj.iron.entity.TIronStep;
 import com.sckj.iron.mapper.TIronStepMapper;
 import com.sckj.iron.vo.IronStepVO;
-import com.sckj.opc.entity.OPCData;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -15,7 +13,10 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 出铁步骤配置实现类
@@ -35,7 +36,7 @@ public class TIronStepServiceImpl extends ServiceImpl<TIronStepMapper, TIronStep
      * 获取步骤及其子步骤
      * @return
      */
-    public List<IronStepVO> getSteps() {
+    public List<IronStepVO> getTreeSteps() {
         QueryWrapper<TIronStep> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(TIronStep::getStatus, "1").orderByAsc(TIronStep::getSort);
         List<TIronStep> stepList = list(queryWrapper);
@@ -58,10 +59,56 @@ public class TIronStepServiceImpl extends ServiceImpl<TIronStepMapper, TIronStep
         return stepDTOList;
     }
 
+//    public Map<String,IronStepVO> getLinkedMapSteps(){
+//        QueryWrapper<TIronStep> queryWrapper = new QueryWrapper<>();
+//        queryWrapper.lambda().eq(TIronStep::getStatus, "1").orderByAsc(TIronStep::getSort);
+//        List<TIronStep> stepList = list(queryWrapper);
+//
+//        //将 stepList 转换为 LinkedHashMap
+//        Map<String, IronStepVO> stepMap = stepList.stream()
+//                .map(step->{
+//                    IronStepVO vo = new IronStepVO();
+//                    BeanUtils.copyProperties(step, vo);
+//                    return vo;
+//                })
+//                .collect(Collectors.toMap(
+//                        IronStepVO::getStepId,
+//                        step -> step,
+//                        (existing, replacement) -> existing,
+//                        LinkedHashMap::new
+//                ));
+//
+//        Map<String,IronStepVO> treeMap = new LinkedHashMap<>();
+//
+//        String key = "";
+//        for(Map.Entry<String,IronStepVO> entry: stepMap.entrySet()){
+//            IronStepVO step = entry.getValue();
+//            if (step.getStepId().length() == 3) {
+//                key = entry.getKey();
+//                step.setChilds(new LinkedHashMap<>());
+//                treeMap.put(key,step);
+////                stepDTO = new IronStepVO();
+////                stepDTO.setChilds(new ArrayList<>());
+////                BeanUtils.copyProperties(step, stepDTO);
+////                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);
+////                }
+//            }
+//        }
+//
+//
+//        return stepMap;
+//
+//    }
 
-    public void refreshSteps() {
-        List<IronStepVO> steps = this.getSteps();
-        asyncEventBus.post(steps);
+
+    public void refreshTreeSteps() {
+        asyncEventBus.post(Boolean.TRUE);
     }
 
 

+ 262 - 612
taphole-iron/src/main/java/com/sckj/iron/socketio/DeviceEventListener.java

@@ -1,15 +1,18 @@
 package com.sckj.iron.socketio;
 
-import com.alibaba.fastjson2.JSON;
+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.common.eventbus.EventListener;
 import com.sckj.common.socketio.SocketUtil;
 import com.sckj.iron.dto.IronStepDTO;
-import com.sckj.iron.service.impl.TIronStepServiceImpl;
-import com.sckj.iron.vo.IronOperataion;
+import com.sckj.iron.entity.TIronData;
+import com.sckj.iron.entity.TIronParam;
+import com.sckj.iron.service.impl.*;
 import com.sckj.iron.vo.IronStepVO;
+import com.sckj.opc.dto.L2Data;
 import com.sckj.opc.entity.OPCData;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
@@ -19,11 +22,11 @@ import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
+import java.time.LocalDateTime;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Stream;
+import java.util.Timer;
+import java.util.TimerTask;
 
 /**
  * @Author feng
@@ -34,31 +37,26 @@ import java.util.stream.Stream;
 @Slf4j
 public class DeviceEventListener extends EventListener {
 
-    private static final String TAG1 = "TAG1";
-    private static final String TAG2 = "TAG2";
-    private static final String TAG3 = "TAG3";
-    private static final String TAG4 = "TAG4";
-    private static final String TAG5 = "TAG5";
-    private static final String TAG6 = "TAG6";
-    private static final String TAG7 = "TAG7";
-    private static final String TAG8 = "TAG8";
-    private static final String TAG9 = "TAG9";
-    private static final String TAG10 = "TAG10";
-    private static final String TAG11 = "TAG11";
-    private static final String TAG12 = "TAG12";
-    private static final String TAG13 = "TAG13";
-    private static final String TAG14 = "TAG14";
-    private static final String TAG15 = "TAG15";
-
+    //步骤数据
     @Resource
     TIronStepServiceImpl ironStepService;
 
-    @Deprecated
-    private Map<String, IronOperataion> operateMap = new ConcurrentHashMap<>();
+    //出铁数据
+    @Resource
+    TIronDataServiceImpl ironDataService;
+
+    //出铁后
+    @Resource
+    TIronAfterServiceImpl ironAfterService;
+
+    //堵口后
+    @Resource
+    TIronBlockServiceImpl ironBlockService;
 
-    private Map<SocketIOClient, IronOperataion> operateMap2 = new ConcurrentHashMap<>();
+    //参数
+    @Resource
+    TIronParamServiceImpl ironParamService;
 
-    private Map<SocketIOClient, List<IronStepDTO>> operateMap3 = new ConcurrentHashMap<>();
 
     // 1.创建表达式解析器
     private SpelExpressionParser parser = new SpelExpressionParser();
@@ -66,674 +64,326 @@ public class DeviceEventListener extends EventListener {
     // 2.创建变量上下文,设置变量
     private StandardEvaluationContext ctx = new StandardEvaluationContext();
 
+    //出铁步骤
     private List<IronStepVO> mSteps;
 
+    private static final String NODE = "node";
+
+    //定时器,用于铁口开口超时记录
+    private Timer timer = new Timer();
+
+    private List<TIronData> oldIronDataList;
+
+    //是否出铁中
+    private boolean ironLoading = false;
+
+    //出铁标记
+    private static final String IRON_OPERATE_TAG = "AOD25606.PV";
+
     @PostConstruct
     public void init() {
-        mSteps = ironStepService.getSteps();
+        mSteps = ironStepService.getTreeSteps();
     }
 
+
+    /***
+     * L1数据项
+     * @param opcData
+     */
     @Subscribe
     public void onMessageEvent(OPCData opcData) {
-        if (SocketUtil.connectMap.isEmpty()) {
+        if (SocketUtil.clientUserIds.isEmpty()) {
             return;
         }
+        //出铁操作
+        operate(opcData);
+        //实时数据
 
-        operate3(opcData);
-
-//        for (Map.Entry<SocketIOClient, String> entry : SocketUtil.clientUserIds.entrySet()) {
-//            //根据在线用户初始化炼铁操作数据
-//            if (!operateMap2.containsKey(entry.getKey())) {
-//                operateMap2.put(entry.getKey(), new IronOperataion());
-//            }
-//        }
-//
-//        for (Map.Entry<SocketIOClient, String> entry : SocketUtil.clientUserIds.entrySet()) {
-//            //根据在线用户初始化炼铁操作数据
-//            if (!operateMap3.containsKey(entry.getKey())) {
-//                operateMap3.put(entry.getKey(), ironStepService.getSteps());
-//            }
-//        }
-//
-//
-//        for (Map.Entry<SocketIOClient, List<IronStepDTO>> entry : operateMap3.entrySet()) {
-//            //根据公共数据和私有数据进行填充
-//            List<IronStepDTO> ironOperate = entry.getValue();
-////            if (!operateMap3.containsKey(entry.getKey())) {
-////                operateMap3.put()
-////            }
-//
-//            operate3(ironOperate, opcData, entry.getKey());
-//        }
-
-
-//        for (Map.Entry<SocketIOClient, IronOperataion> entry : operateMap2.entrySet()) {
-//            //根据公共数据和私有数据进行填充
-//            IronOperataion ironOperate = entry.getValue();
-//            operate2(ironOperate, opcData, entry.getKey());
-//        }
-//        for (Map.Entry<String, SocketIOClient> entry : SocketUtil.connectMap.entrySet()) {
-//            //根据在线用户初始化炼铁操作数据
-//            if (!operateMap.containsKey(entry.getKey())) {
-//                operateMap.put(entry.getKey(), new IronOperataion());
-//            }
-//        }
-//        for (Map.Entry<String, IronOperataion> entry : operateMap.entrySet()) {
-//            //根据公共数据和私有数据进行填充
-//            IronOperataion ironOperate = entry.getValue();
-//            operate(ironOperate, opcData, entry.getKey());
-//        }
+        //趋势数据
     }
 
-    @Deprecated
-    private void operate(IronOperataion ironOperate, OPCData opcData, String userId) {
-        String identifier = opcData.getPointName();
-        try {
-            identifier = identifier.split("\\.")[2];
-        } catch (Exception e) {
-            e.printStackTrace();
-            return;
-        }
-        Object data = opcData.getData();
-
-        //出铁
-        if (TAG1.equals(identifier)
-                || TAG2.equals(identifier)
-                || TAG3.equals(identifier)
-                || TAG4.equals(identifier)
-                || TAG5.equals(identifier)
-                || TAG6.equals(identifier)
-                || TAG7.equals(identifier)
-                || TAG8.equals(identifier)
-                || TAG9.equals(identifier)
-                || TAG10.equals(identifier)
-        ) {
-            //ylgcdw 鱼雷罐车到位
-            if (identifier.equals(TAG1)) {
-                if ("0".equals(data)) {
-                    ironOperate.setYlgcdw("0");
-                } else {
-                    ironOperate.setYlgcdw("1");
-                }
-            }
-
-            //tbxtzc 铁摆系统正常
-            if (identifier.equals(TAG2)) {
-                if ("0".equals(data)) {
-                    ironOperate.setTbxtzc("0");
-                } else {
-                    ironOperate.setTbxtzc("1");
-                }
-            }
-
-            //npkkjzbwb 泥炮、开口机准备完毕
-            if (identifier.equals(TAG3)) {
-                if ("0".equals(data)) {
-                    ironOperate.setNpkkjzbwb("0");
-                } else {
-                    ironOperate.setNpkkjzbwb("1");
-                }
-            }
-
-
-            //炉前准备
-            if ("1".equals(ironOperate.getYlgcdw())
-                    && "1".equals(ironOperate.getTbxtzc())
-                    && "1".equals(ironOperate.getNpkkjzbwb())
-                    && "1".equals(ironOperate.getRydw())
-            ) {
-                ironOperate.setLqzb("1");
-            } else {
-                log.info("lqzb failed => ylgcdw:{},tbxtzc:{},npkkjzbwb:{},rydw:{}", ironOperate.getYlgcdw(), ironOperate.getTbxtzc(), ironOperate.getNpkkjzbwb(), ironOperate.getRydw());
-
-                ironOperate.setRydw("0");
-                ironOperate.setLqzb("0");
-
-                ironOperate.setSzbykq("0");
-                ironOperate.setCtmskq("0");
-                ironOperate.setZggbdj("0");
-                ironOperate.setWwtj("0");
-
-                ironOperate.setLqsqct("0");
-
-                ironOperate.setGlyxqk("0");
-                ironOperate.setTlcjs("0");
-                ironOperate.setCtfs("0");
-                ironOperate.setLncttj("0");
-
-                ironOperate.setYpqrct("0");
-
-                ironOperate.setLqctcz("0");
-
-                PushData.send2Operation(ironOperate, userId);
-                return;
-            }
-
-//            if (identifier.contains(TAG4)) {
-//                ironOperate.setRydw(data);
-//            }
-
-            //水闸泵已开启,水闸槽水量正常
-            if (identifier.equals(TAG4)) {
-                if ("0".equals(data)) {
-                    ironOperate.setSzbykq("0");
-                } else {
-                    ironOperate.setSzbykq("1");
-                }
-            }
-
-            //除尘开启出铁模式
-            if (identifier.equals(TAG5)) {
-                if ("0".equals(data)) {
-                    ironOperate.setCtmskq("0");
-                } else {
-                    ironOperate.setCtmskq("1");
-                }
-            }
-
-            //主沟盖板吊装机处于待机位
-            if (identifier.equals(TAG6)) {
-                if ("0".equals(data)) {
-                    ironOperate.setZggbdj("0");
-                } else {
-                    ironOperate.setZggbdj("1");
-                }
-            }
-
-            //外围条件
-            if ("1".equals(ironOperate.getSzbykq())
-                    && "1".equals(ironOperate.getCtmskq())
-                    && "1".equals(ironOperate.getZggbdj())
-            ) {
-                ironOperate.setWwtj("1");
-            } else {
-                log.info("wwtj failed => szbykq:{},ctmskq:{},zggbdj:{}", ironOperate.getSzbykq(), ironOperate.getCtmskq(), ironOperate.getZggbdj());
-
-                ironOperate.setWwtj("0");
-
-                ironOperate.setLqsqct("0");
-
-                ironOperate.setGlyxqk("0");
-                ironOperate.setTlcjs("0");
-                ironOperate.setCtfs("0");
-                ironOperate.setLncttj("0");
-
-                ironOperate.setYpqrct("0");
-
-                ironOperate.setLqctcz("0");
-
-                PushData.send2Operation(ironOperate, userId);
 
-                return;
-
-            }
-
-            if ("0".equals(ironOperate.getLqsqct())) {
-                ironOperate.setGlyxqk("0");
-                ironOperate.setTlcjs("0");
-                ironOperate.setCtfs("0");
-                ironOperate.setLncttj("0");
-
-                ironOperate.setYpqrct("0");
-
-                ironOperate.setLqctcz("0");
-
-                PushData.send2Operation(ironOperate, userId);
-                return;
-            }
-
-
-            //高炉运行情况
-            if (identifier.equals(TAG7)) {
-                if ("0".equals(data)) {
-                    ironOperate.setGlyxqk("0");
-                } else {
-                    ironOperate.setGlyxqk("1");
-                }
-            }
-
-            //理论铁量、铁铁差计算
-            if (identifier.equals(TAG8)) {
-                if ("0".equals(data)) {
-                    ironOperate.setTlcjs("0");
-                } else {
-                    ironOperate.setTlcjs("1");
-                }
-            }
-
-            //出铁口模式
-            if (identifier.equals(TAG9)) {
-                if ("0".equals(data)) {
-                    ironOperate.setCtfs("0");
-                } else {
-                    ironOperate.setCtfs("1");
-                }
-            }
-
-            //炉内出铁条件
-            if ("1".equals(ironOperate.getLqsqct())
-                    && "1".equals(ironOperate.getGlyxqk())
-                    && "1".equals(ironOperate.getTlcjs())
-                    && "1".equals(ironOperate.getCtfs())
-            ) {
-                ironOperate.setLncttj("1");
-            } else {
-                ironOperate.setLncttj("0");
-
-                log.info("lncttj failed => glyxqk:{},tlcjs:{},ctkms:{}", ironOperate.getGlyxqk(), ironOperate.getTlcjs(), ironOperate.getCtfs());
-
-                ironOperate.setYpqrct("0");
-
-                ironOperate.setLqctcz("0");
-
-                PushData.send2Operation(ironOperate, userId);
-                return;
-            }
-
-            if ("1".equals(ironOperate.getYpqrct())) {
-                ironOperate.setLqctcz("1");
-            } else {
-                ironOperate.setLqctcz("0");
-            }
-
-            PushData.send2Operation(ironOperate, userId);
-        }
-
-        //glyxqk 高炉运行情况
-        //tlcjs 理论铁量、铁铁差计算
-        //ctkms 出铁口模式
-
-        //趋势
-        if (Stream.of("TAG5", "TAG6", "TAG7", "TAG8").anyMatch(identifier::contains)) {
-            // PushData.sendToTrend(JSON.toJSONString(opcData));
-            //铁水成分
-            //铁水流速
-            //铁水流量
-            //铁水温度
+    /***
+     * L2数据项
+     * @param l2Data
+     */
+    @Subscribe
+    public void onL2MessageEvent(L2Data l2Data) {
+        if (SocketUtil.clientUserIds.isEmpty()) {
+            return;
         }
+        //出铁操作
 
         //实时数据
-        if (Stream.of("TAG9", "TAG10").anyMatch(identifier::contains)) {
-//            PushData.sendToRealtime(JSON.toJSONString(opcData));
-            //除铁中
-            //
-            //
-            //
-            //
-        }
+
+        //趋势数据
     }
 
-    private void operate2(IronOperataion ironOperate, OPCData opcData, SocketIOClient socketIOClient) {
-        String identifier = opcData.getPointName();
-        try {
-            identifier = identifier.split("\\.")[2];
-        } catch (Exception e) {
-            e.printStackTrace();
+
+    private void operate(OPCData opcData) {
+        if (ObjectUtils.isEmpty(opcData)) {
             return;
         }
+        String pointName = opcData.getPointName();
         Object data = opcData.getData();
+        for (IronStepVO stepDTO : mSteps) {
+            //log.info("nodetype:{},pointname:{},opc pointname:{}",stepDTO.getNodeType(),stepDTO.getPointName(),pointName);
+            if (NODE.equalsIgnoreCase(stepDTO.getNodeType())) {
+                //处理子项
+                for (IronStepVO child : stepDTO.getChilds()) {
+                    //plc的point和step的point一致
+                    if (Objects.equals(child.getPointName(), pointName)) {
+                        //3.创建变量上下文,设置变量
+                        child.setData(data);
+                        //log.info("pointName:{},data:{},tj:{},result:{}", pointName, data, child.getStepTj(), result);
+                    }
+//                    else {
+//                        if (ObjectUtils.isNotEmpty(child.getData())) {
+//                            ctx.setVariable(child.getIdentifier(), child.getData());
+//                        }
+//                    }
 
-        //出铁
-        if (TAG1.equals(identifier)
-                || TAG2.equals(identifier)
-                || TAG3.equals(identifier)
-                || TAG4.equals(identifier)
-                || TAG5.equals(identifier)
-                || TAG6.equals(identifier)
-                || TAG7.equals(identifier)
-                || TAG8.equals(identifier)
-                || TAG9.equals(identifier)
-                || TAG10.equals(identifier)
-        ) {
-            //ylgcdw 鱼雷罐车到位
-            if (identifier.equals(TAG1)) {
-                if ("0".equals(data)) {
-                    ironOperate.setYlgcdw("0");
-                } else {
-                    ironOperate.setYlgcdw("1");
-                }
-            }
-
-            //tbxtzc 铁摆系统正常
-            if (identifier.equals(TAG2)) {
-                if ("0".equals(data)) {
-                    ironOperate.setTbxtzc("0");
-                } else {
-                    ironOperate.setTbxtzc("1");
-                }
-            }
-
-            //npkkjzbwb 泥炮、开口机准备完毕
-            if (identifier.equals(TAG3)) {
-                if ("0".equals(data)) {
-                    ironOperate.setNpkkjzbwb("0");
-                } else {
-                    ironOperate.setNpkkjzbwb("1");
-                }
-            }
-
-
-            //炉前准备
-            if ("1".equals(ironOperate.getYlgcdw())
-                    && "1".equals(ironOperate.getTbxtzc())
-                    && "1".equals(ironOperate.getNpkkjzbwb())
-                    && "1".equals(ironOperate.getRydw())
-            ) {
-                ironOperate.setLqzb("1");
-            } else {
-                log.info("lqzb failed => ylgcdw:{},tbxtzc:{},npkkjzbwb:{},rydw:{}", ironOperate.getYlgcdw(), ironOperate.getTbxtzc(), ironOperate.getNpkkjzbwb(), ironOperate.getRydw());
-
-                ironOperate.setRydw("0");
-                ironOperate.setLqzb("0");
-
-                ironOperate.setSzbykq("0");
-                ironOperate.setCtmskq("0");
-                ironOperate.setZggbdj("0");
-                ironOperate.setWwtj("0");
-
-                ironOperate.setLqsqct("0");
-
-                ironOperate.setGlyxqk("0");
-                ironOperate.setTlcjs("0");
-                ironOperate.setCtfs("0");
-                ironOperate.setLncttj("0");
-
-                ironOperate.setYpqrct("0");
-
-                ironOperate.setLqctcz("0");
-
-
-                PushData.send2Operation(ironOperate, socketIOClient);
-                return;
-            }
-
-//            if (identifier.contains(TAG4)) {
-//                ironOperate.setRydw(data);
-//            }
-
-            //水闸泵已开启,水闸槽水量正常
-            if (identifier.equals(TAG4)) {
-                if ("0".equals(data)) {
-                    ironOperate.setSzbykq("0");
-                } else {
-                    ironOperate.setSzbykq("1");
-                }
-            }
-
-            //除尘开启出铁模式
-            if (identifier.equals(TAG5)) {
-                if ("0".equals(data)) {
-                    ironOperate.setCtmskq("0");
-                } else {
-                    ironOperate.setCtmskq("1");
-                }
-            }
-
-            //主沟盖板吊装机处于待机位
-            if (identifier.equals(TAG6)) {
-                if ("0".equals(data)) {
-                    ironOperate.setZggbdj("0");
-                } else {
-                    ironOperate.setZggbdj("1");
                 }
             }
+        }
 
-            //外围条件
-            if ("1".equals(ironOperate.getSzbykq())
-                    && "1".equals(ironOperate.getCtmskq())
-                    && "1".equals(ironOperate.getZggbdj())
-            ) {
-                ironOperate.setWwtj("1");
-            } else {
-                log.info("wwtj failed => szbykq:{},ctmskq:{},zggbdj:{}", ironOperate.getSzbykq(), ironOperate.getCtmskq(), ironOperate.getZggbdj());
-
-                ironOperate.setWwtj("0");
-
-                ironOperate.setLqsqct("0");
-
-                ironOperate.setGlyxqk("0");
-                ironOperate.setTlcjs("0");
-                ironOperate.setCtfs("0");
-                ironOperate.setLncttj("0");
-
-                ironOperate.setYpqrct("0");
-
-                ironOperate.setLqctcz("0");
-
-                PushData.send2Operation(ironOperate, socketIOClient);
-
-                return;
+        setStepResult(mSteps);
 
-            }
+//        log.info("==========================================");
+//        log.info("steps after:{}", JSON.toJSONString(mSteps));
+//        log.info("==========================================");
 
-            if ("0".equals(ironOperate.getLqsqct())) {
-                ironOperate.setGlyxqk("0");
-                ironOperate.setTlcjs("0");
-                ironOperate.setCtfs("0");
-                ironOperate.setLncttj("0");
+        ironReady(opcData);
 
-                ironOperate.setYpqrct("0");
 
-                ironOperate.setLqctcz("0");
-
-                PushData.send2Operation(ironOperate, socketIOClient);
-                return;
-            }
+        PushData.send2Operation(mSteps, ironLoading);
 
+    }
 
-            //高炉运行情况
-            if (identifier.equals(TAG7)) {
-                if ("0".equals(data)) {
-                    ironOperate.setGlyxqk("0");
-                } else {
-                    ironOperate.setGlyxqk("1");
+    //计算每步结果
+    private void setStepResult(List<IronStepVO> mSteps) {
+        boolean foundFalsePass = false;
+        //发现第一个pass是false,后续都为false,包括父项和子项
+        for (IronStepVO stepDTO : mSteps) {
+            for (IronStepVO child : stepDTO.getChilds()) {
+                //子项验证是否通过
+                validateStepTjPass(child);
+                if (!foundFalsePass && 0 == child.getPassResult()) {
+                    foundFalsePass = true;
                 }
-            }
-
-            //理论铁量、铁铁差计算
-            if (identifier.equals(TAG8)) {
-                if ("0".equals(data)) {
-                    ironOperate.setTlcjs("0");
-                } else {
-                    ironOperate.setTlcjs("1");
+                //子项
+                if (foundFalsePass) {
+                    child.setPassResult(0);
                 }
             }
-
-            //出铁口模式
-            if (identifier.equals(TAG9)) {
-                if ("0".equals(data)) {
-                    ironOperate.setCtfs("0");
-                } else {
-                    ironOperate.setCtfs("1");
-                }
+            //父项
+            validateStepTjPass(stepDTO);
+            //父项
+            if (foundFalsePass) {
+                stepDTO.setPassResult(0);
             }
+        }
+    }
 
-            //炉内出铁条件
-            if ("1".equals(ironOperate.getLqsqct())
-                    && "1".equals(ironOperate.getGlyxqk())
-                    && "1".equals(ironOperate.getTlcjs())
-                    && "1".equals(ironOperate.getCtfs())
-            ) {
-                ironOperate.setLqsqct(ironOperate.getLqsqct());
-                ironOperate.setLncttj("1");
-            } else {
-                ironOperate.setLncttj("0");
-
-                log.info("lncttj failed => glyxqk:{},tlcjs:{},ctkms:{}", ironOperate.getGlyxqk(), ironOperate.getTlcjs(), ironOperate.getCtfs());
+    //锅炉运行情况
+    private static final String glyxqk = "glyxqk";
+    //预判和确认出铁
+    private static final String ypqrct = "ypqrct";
 
-                ironOperate.setYpqrct("0");
 
-                ironOperate.setLqctcz("0");
+    //理论铁量、铁量差计算
+    private static final String tlcjs = "tlcjs";
+    //出铁方式(单铁口 双铁口)
+    private static final String ctfs = "ctfs";
 
-                PushData.send2Operation(ironOperate, socketIOClient);
-                return;
-            }
+    private void ironReady(OPCData opcData) {
+        //通过“预判和确认出铁”标记开始出铁
+        boolean isReady = false;
 
-            if ("1".equals(ironOperate.getYpqrct())) {
-                ironOperate.setLqctcz("1");
-            } else {
-                ironOperate.setLqctcz("0");
+        for (IronStepVO stepDTO : mSteps) {
+            if (ypqrct.equalsIgnoreCase(stepDTO.getIdentifier()) && 1 == stepDTO.getPassResult()) {
+                isReady = true;
+                break;
             }
-
-            PushData.send2Operation(ironOperate, socketIOClient);
         }
 
-        //glyxqk 高炉运行情况
-        //tlcjs 理论铁量、铁铁差计算
-        //ctkms 出铁口模式
-
-        //趋势
-        if (Stream.of("TAG5", "TAG6", "TAG7", "TAG8").anyMatch(identifier::contains)) {
-            // PushData.sendToTrend(JSON.toJSONString(opcData));
-            //铁水成分
-            //铁水流速
-            //铁水流量
-            //铁水温度
-        }
+        //炉前在接受到炉内出铁要求后,10分钟内打开铁口,未打开系统告警并记录
+        if (isReady) {
+            TimerTask task = new TimerTask() {
+                @Override
+                public void run() {
+                    System.out.println("倒计时结束!10分钟已到。");
+                    timer.cancel(); // 终止定时器
+                    // 打开系统告警并记录
+                    PushData.send2Warn("warn");
+                    log.info("准备出铁但是未及时出铁口,此处数据库记录");
+                }
+            };
 
-        //实时数据
-        if (Stream.of("TAG9", "TAG10").anyMatch(identifier::contains)) {
-//            PushData.sendToRealtime(JSON.toJSONString(opcData));
-            //除铁中
-            //
-            //
-            //
-            //
+            // 倒计时10分钟(600秒)
+            long delay = 10 * 60 * 1000; // 10分钟转换为毫秒
+            // 在指定延迟后执行任务
+            timer.schedule(task, delay);
         }
-    }
 
-    private void operate3(OPCData opcData) {
-        String pointName = opcData.getPointName();
-        Object data = opcData.getData();
+        //根据PLC订阅的数据,AOD25606.PV=1为出铁中,AOD25606.PV=0出铁结束的信号,进行判断
+        //为1表示开始出铁,此时如果未超过10分钟,就取消定时器
+        //出铁结束
+        if (IRON_OPERATE_TAG.equalsIgnoreCase(opcData.getPointName())) {
 
-        for (IronStepVO stepDTO : mSteps) {
-            //log.info("nodetype:{},pointname:{},opc pointname:{}",stepDTO.getNodeType(),stepDTO.getPointName(),pointName);
-            if ("node".equalsIgnoreCase(stepDTO.getNodeType())) {
-                //处理子项
-                for (IronStepVO child : stepDTO.getChilds()) {
-                    if (Objects.equals(child.getPointName(), pointName)) {
-                        //3.创建变量上下文,设置变量
-                        ctx.setVariable(child.getIdentifier(), data);
-                        child.setData(data);
-
-                        boolean result = false;
-
-                        if (ObjectUtils.isNotEmpty(child.getStepTj())) {
-                            try {
-                                result = parser.parseExpression(child.getStepTj()).getValue(ctx, Boolean.class);
-                            } catch (Exception e) {
-
-                            }
-                        }
+            //1:出铁中
+            //0:出铁结束
+            ironLoading = "1".equals(opcData.getData());
 
-                        child.setPass(result);
-
-                        //log.info("pointName:{},data:{},tj:{},result:{}", pointName, data, child.getStepTj(), result);
-                    }
-                }
+            if ("0".equals(opcData.getData())) {
                 try {
-                    boolean result = false;
-                    if (ObjectUtils.isNotEmpty(stepDTO.getStepTj())) {
-                        try {
-                            result = parser.parseExpression(stepDTO.getStepTj()).getValue(ctx, Boolean.class);
-                        } catch (Exception e) {
-
-                        }
-                    }
-                    stepDTO.setPass(result);
+                    timer.cancel(); // 终止定时器
                 } catch (Exception e) {
-                    stepDTO.setPass(false);
+                    e.printStackTrace();
                 }
+                recordAfter();
+                recordBlock();
 
+                //出铁结束后,查询最近两次的数据
+                LambdaQueryWrapper<TIronData> queryWrapper = new QueryWrapper<TIronData>().lambda().orderByDesc(TIronData::getCtcsbh);
+                oldIronDataList = ironDataService.list(queryWrapper);
             }
         }
+    }
 
-        log.info("==========================================");
-        //log.info("steps before:{}", JSON.toJSONString(mSteps));
-        log.info("==========================================");
-
-        boolean foundFalsePass = false;
-
-        //发现第一个pass是false,后续的手动操作都为false,包括父项和子项
-        for (IronStepVO stepDTO : mSteps) {
-            for (IronStepVO child : stepDTO.getChilds()) {
-                if (!foundFalsePass && !child.isPass()) {
-                    foundFalsePass = true;
-                }
-                if (foundFalsePass) {
-                    child.setPass(false);
+    /***
+     * 判断是否通过
+     * @param stepVO
+     */
+    private void validateStepTjPass(IronStepVO stepVO) {
+        ctx.setVariable(stepVO.getIdentifier(), stepVO.getData());
+        if (ObjectUtils.isNotEmpty(stepVO.getStepTj())) {
+            boolean result = false;
+            try {
+                result = parser.parseExpression(stepVO.getStepTj()).getValue(ctx, Boolean.class);
+            } catch (Exception e) {
+                result = false;
+            }
+            stepVO.setPassResult(result ? 1 : 0);
+        } else {
+            //stepTj为空
+            //理论铁量、铁量差计算
+            //出铁方式(单铁口 双铁口)
+            if (tlcjs.equalsIgnoreCase(stepVO.getIdentifier())
+                    || ctfs.equalsIgnoreCase(stepVO.getIdentifier())
+            ) {
+                for (int i = 0, size = mSteps.size(); i < size; i++) {
+                    IronStepVO ironStepVO = mSteps.get(i);
+                    for (int j = 0, childSize = ironStepVO.getChilds().size(); j < childSize; j++) {
+                        IronStepVO child = ironStepVO.getChilds().get(j);
+                        if (tlcjs.equalsIgnoreCase(child.getIdentifier())) {
+                            IronStepVO beforeItem = ironStepVO.getChilds().get(j - 1);
+                            if (1 == beforeItem.getPassResult()) {
+                                TIronParam ironParam = ironParamService.lambdaQuery().last("limit 1").one();
+                                oldIronDataList = ironDataService.lambdaQuery().orderByDesc(TIronData::getCtcsbh).last("limit 2").list();
+                                if (ObjectUtils.isNotEmpty(oldIronDataList)) {
+                                    //处理理论铁量、铁量差计算
+                                    //出铁方式(单铁口 双铁口)
+                                    String ctl_append = "";
+                                    for (TIronData tIronData : oldIronDataList) {
+                                        String ctl = tIronData.getCtl();
+                                        ctl_append += ctl + ",";
+                                    }
+                                    child.setData(ctl_append);
+                                    child.setPassResult(1);
+                                }
+                            }
+                        } else if (ctfs.equalsIgnoreCase(child.getIdentifier())) {
+                            IronStepVO beforeItem = ironStepVO.getChilds().get(j - 1);
+                            if (1 == beforeItem.getPassResult()) {
+                                String[] split = beforeItem.getData().toString().split(",");
+                                if (ObjectUtils.isNotEmpty(split)) {
+                                    boolean ismanzu = true;
+                                    child.setData(2);
+                                    child.setPassResult(1);
+                                    for (String ctl : split) {
+                                        Float float_num = Float.valueOf(ctl);
+                                        if (float_num < 200) {
+                                            child.setData(1);
+                                            break;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
                 }
             }
-            if (foundFalsePass) {
-                stepDTO.setPass(false);
-            }
         }
+    }
 
-        log.info("==========================================");
-        log.info("steps after:{}", JSON.toJSONString(mSteps));
-        log.info("==========================================");
-
+    //出铁后,记录炉次、开口时间、鱼雷罐车车号、铁口深度、铁水流速
+    private void recordAfter() {
+        ironAfterService.add(null);
+    }
 
-        PushData.send2Operation(mSteps);
+    //堵口后,记录堵口时间、出铁量,打泥量、是否喷溅、是否跑泥
+    private void recordBlock() {
+        ironBlockService.add(null);
     }
 
+    /***
+     * 用户端点击触发
+     * @param client
+     * @param message
+     */
     @OnEvent(value = PushData.IRON_CONFIRM)
     public void confirmIron(SocketIOClient client, IronStepDTO message) {
-        if (ObjectUtils.isEmpty(message) || ObjectUtils.isEmpty(client)) {
+        String userId;
+        if (ObjectUtils.isEmpty(client) || ObjectUtils.isEmpty(userId = SocketUtil.clientUserIds.get(client))) {
+            log.info("该客户已下线");
+            PushData.send2Operation("该客户已下线", false);
             return;
         }
-        log.info("---> {}", SocketUtil.clientUserIds.get(client));
+
+        if (ObjectUtils.isEmpty(message)) {
+            log.info("请求数据为空");
+            PushData.send2Operation("请求数据为空", false);
+            return;
+        }
+
+
+        log.info("--->userId : {}", userId);
         for (IronStepVO stepDTO : mSteps) {
             for (IronStepVO child : stepDTO.getChilds()) {
-                if (child.getStepId().equals(message.getStepId())) {
-                    ctx.setVariable(child.getIdentifier(), message.getData());
-                    child.setPass(message.isPass());
-                    PushData.send2Operation(mSteps);
+                if (validateUserData(message, userId, child)) {
                     return;
                 }
             }
+            if (validateUserData(message, userId, stepDTO)) {
+                return;
+            }
         }
     }
 
+    private boolean validateUserData(IronStepDTO message, String userId, IronStepVO stepDTO) {
+        if (stepDTO.getStepId().equals(message.getStepId())) {
+            stepDTO.setData(message.getData());
+            setStepResult(mSteps);
+            PushData.send2Operation(mSteps, ironLoading);
+            //这里手动记录时间
+            log.info("userId:{},stepId:{},identifier:{},data:{},pass:{}", userId, message.getStepId(), message.getIdentifier(), message.getData(), message.isPass());
+            return true;
+        }
+        return false;
+    }
+
 
     /***
      * 数据库更改后调用接口刷新步骤
-     * @param steps
      */
     @Subscribe
-    public void onIronStep(List<IronStepVO> steps) {
-        if (ObjectUtils.isNotEmpty(steps)) {
-            this.mSteps = steps;
+    public void onIronStep(Boolean refresh) {
+        if (ObjectUtils.isNotEmpty(refresh) && refresh) {
+            mSteps = ironStepService.getTreeSteps();
+            log.info("流程步骤数据刷新:{}", LocalDateTime.now());
         }
     }
 
 
-//    @OnEvent(value = PushData.IRON_CONFIRM)
-//    public void confirmIron(SocketIOClient client, IronOperataion message) {
-//        if (ObjectUtils.isEmpty(message) || ObjectUtils.isEmpty(client)) {
-//            return;
-//        }
-//        log.info("---> {}", SocketUtil.clientUserIds.get(client));
-//        log.info("人员到位(rydw):{},{}", message.getUserId(), message.getRydw());
-//        log.info("炉前申请出铁(rydw):{},{}", message.getUserId(), message.getLqsqct());
-//        log.info("预判和确认出铁(rydw):{},{}", message.getUserId(), message.getYpqrct());
-//        IronOperataion ironOperataion = operateMap2.get(client);
-//        if (ObjectUtils.isNotEmpty(ironOperataion)) {
-//            if (ObjectUtils.isNotEmpty(message.getRydw())) {
-//                ironOperataion.setRydw(message.getRydw());
-//            }
-//            if (ObjectUtils.isNotEmpty(message.getLqsqct())) {
-//                ironOperataion.setLqsqct(message.getLqsqct());
-//            }
-//            if (ObjectUtils.isNotEmpty(message.getYpqrct())) {
-//                ironOperataion.setYpqrct(message.getYpqrct());
-//            }
-//            PushData.send2Operation(ironOperataion, client);
-//        } else {
-//            log.info("失效的会话");
-//        }
-//
-//    }
-
-
 }

+ 77 - 0
taphole-iron/src/main/java/com/sckj/iron/socketio/IronRealtimeListener.java

@@ -0,0 +1,77 @@
+package com.sckj.iron.socketio;
+
+import com.google.common.eventbus.Subscribe;
+import com.sckj.common.eventbus.EventListener;
+import com.sckj.common.socketio.SocketUtil;
+import com.sckj.iron.service.impl.TIronStepServiceImpl;
+import com.sckj.opc.entity.OPCData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @Author feng
+ * @Date 2024-11-19 上午 11:05
+ * @Description 实时数据推送
+ */
+@Component
+@Slf4j
+public class IronRealtimeListener extends EventListener {
+
+    @Resource
+    TIronStepServiceImpl ironStepService;
+
+
+
+    @Subscribe
+    public void onMessageEvent(OPCData opcData) {
+        if (SocketUtil.clientUserIds.isEmpty()) {
+            return;
+        }
+        realtime(opcData);
+    }
+
+    private Map<String,Object> mRealtimeMap = new ConcurrentHashMap<>();
+
+     {
+         //流速
+         mRealtimeMap.put("speed",0);
+         //流量
+         mRealtimeMap.put("flow",0);
+         //温度
+         mRealtimeMap.put("temp",0);
+         //成分
+         mRealtimeMap.put("element",0);
+
+         //开口或堵口  AOD25606.PV=0
+         //出铁时及拔炮 AOD25606.PV=1
+         //鱼雷罐车到位
+         //溜咀摆动
+         //冲渣启动           渣流量(L1)>0 下渣;渣流量(L1)= 0 下渣
+
+    }
+
+    /***
+     * 铁水成分
+     * 铁水流速
+     * 铁水流量
+     * 铁水温度
+     * @param opcData
+     */
+    private void realtime(OPCData opcData) {
+        String pointName = opcData.getPointName();
+        Object data = opcData.getData();
+
+        PushData.send2Realtime("");
+    }
+
+
+
+
+
+
+
+}

+ 56 - 0
taphole-iron/src/main/java/com/sckj/iron/socketio/IronTrendListener.java

@@ -0,0 +1,56 @@
+package com.sckj.iron.socketio;
+
+import com.google.common.eventbus.Subscribe;
+import com.sckj.common.eventbus.EventListener;
+import com.sckj.common.socketio.SocketUtil;
+import com.sckj.iron.service.impl.TIronStepServiceImpl;
+import com.sckj.opc.entity.OPCData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * @Author feng
+ * @Date 2024-11-19 上午 11:05
+ * @Description 趋势数据推送
+ */
+@Component
+@Slf4j
+public class IronTrendListener extends EventListener {
+
+    @Resource
+    TIronStepServiceImpl ironStepService;
+
+
+
+    @Subscribe
+    public void onMessageEvent(OPCData opcData) {
+        if (SocketUtil.clientUserIds.isEmpty()) {
+            return;
+        }
+        trend(opcData);
+    }
+
+
+    /***
+     * 铁水成分
+     * 铁水流速
+     * 铁水流量
+     * 铁水温度
+     * @param opcData
+     */
+    private void trend(OPCData opcData) {
+        String pointName = opcData.getPointName();
+        Object data = opcData.getData();
+
+        PushData.send2Trend("");
+    }
+
+
+
+
+
+
+
+}

+ 37 - 13
taphole-iron/src/main/java/com/sckj/iron/socketio/PushData.java

@@ -1,6 +1,7 @@
 package com.sckj.iron.socketio;
 
 import com.corundumstudio.socketio.SocketIOClient;
+import com.sckj.common.core.AjaxResult;
 import com.sckj.common.socketio.SocketUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
@@ -32,10 +33,18 @@ public class PushData {
     public static final String IRON_REALTIME = "IRON_REALTIME";
 
     /***
-     * 人员到位、炉前确认出铁、预判和确认出铁
+     * 一、炉前准备:铁摆系统正常、泥炮开口机准备完毕、人员到位
+     * 二、炉前申请出铁
+     * 三、炉内出铁条件:高炉运行情况
+     * 四、预判和确认出铁
      */
     public static final String IRON_CONFIRM = "IRON_CONFIRM";
 
+    /***
+     * 发出预警
+     */
+    public static final String IRON_WARN = "IRON_WARN";
+
 
     /**
      * 出铁操作
@@ -48,7 +57,7 @@ public class PushData {
             return;
         }
         //单独发消息
-        socketClient.sendEvent(PushData.IRON_OPERATION, message);
+        socketClient.sendEvent(PushData.IRON_OPERATION, AjaxResult.success(message));
     }
     /**
      * 出铁操作
@@ -62,66 +71,81 @@ public class PushData {
         }
         if (ObjectUtils.isEmpty(userId)) {
             for (Map.Entry<String, SocketIOClient> entry : SocketUtil.connectMap.entrySet()) {
-                entry.getValue().sendEvent(PushData.IRON_OPERATION, message);
+                entry.getValue().sendEvent(PushData.IRON_OPERATION, AjaxResult.success(message));
             }
         } else {
             //某个客户端信息
             SocketIOClient socketClient = SocketUtil.getSocketClient(userId);
             if (Objects.nonNull(socketClient)) {
                 //单独给他发消息
-                socketClient.sendEvent(PushData.IRON_OPERATION, message);
+                socketClient.sendEvent(PushData.IRON_OPERATION, AjaxResult.success(message));
             } else {
                 log.info(userId + "已下线,暂不发送消息。");
             }
         }
     }
 
+    /***
+     *
+     * @param message 发送的消息内容
+     * @param isStopSendMsg  是否停止发送信息
+     */
+    public static void send2Operation(Object message,boolean isStopSendMsg) {
+        if (SocketUtil.connectMap.isEmpty() || isStopSendMsg) {
+            return;
+        }
+        //
+        for (Map.Entry<String, SocketIOClient> entry : SocketUtil.connectMap.entrySet()) {
+            entry.getValue().sendEvent(PushData.IRON_OPERATION, AjaxResult.success(message));
+        }
+    }
+
+
     /**
      * 趋势
      *
      * @return
      * @Param
      **/
-    public static void send2Operation(Object message) {
+    public static void send2Trend(Object message) {
         if (SocketUtil.connectMap.isEmpty()) {
             return;
         }
         //
         for (Map.Entry<String, SocketIOClient> entry : SocketUtil.connectMap.entrySet()) {
-            entry.getValue().sendEvent(PushData.IRON_OPERATION, message);
+            entry.getValue().sendEvent(PushData.IRON_TREND, AjaxResult.success(message));
         }
     }
 
-
     /**
-     * 趋势
+     * 实时数据
      *
      * @return
      * @Param
      **/
-    public static void send2Trend(Object message) {
+    public static void send2Realtime(Object message) {
         if (SocketUtil.connectMap.isEmpty()) {
             return;
         }
         //
         for (Map.Entry<String, SocketIOClient> entry : SocketUtil.connectMap.entrySet()) {
-            entry.getValue().sendEvent(PushData.IRON_TREND, message);
+            entry.getValue().sendEvent(PushData.IRON_REALTIME, AjaxResult.success(message));
         }
     }
 
     /**
-     * 实时数据
+     * 发出预警
      *
      * @return
      * @Param
      **/
-    public static void send2Realtime(Object message) {
+    public static void send2Warn(Object message) {
         if (SocketUtil.connectMap.isEmpty()) {
             return;
         }
         //
         for (Map.Entry<String, SocketIOClient> entry : SocketUtil.connectMap.entrySet()) {
-            entry.getValue().sendEvent(PushData.IRON_REALTIME, message);
+            entry.getValue().sendEvent(PushData.IRON_WARN, AjaxResult.success(message));
         }
     }
 

+ 20 - 3
taphole-iron/src/main/java/com/sckj/iron/vo/IronStepVO.java

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Author feng
@@ -13,13 +14,16 @@ import java.util.List;
 @Data
 public class IronStepVO {
 
+    @ApiModelProperty(value = "出铁次数编号")
+    private String ironNum;
+
     @ApiModelProperty(value = "stepId")
     private String stepId;
 
     @ApiModelProperty(value = "步骤名称")
     private String stepName;
 
-    @ApiModelProperty(value = "唯一名称")
+    @ApiModelProperty(value = "步骤的唯一标识")
     private String identifier;
 
     @ApiModelProperty(value = "节点类型(start、end、node、child)")
@@ -31,8 +35,9 @@ public class IronStepVO {
     @ApiModelProperty(value = "通过条件")
     private String stepTj;
 
-    @ApiModelProperty(value = "是否通过(1是 0否)")
-    private boolean pass;
+    //
+    @ApiModelProperty(value = "通过结果(1通过、0未通过)")
+    private int passResult;
 
     @ApiModelProperty(value = "确认方式(1自动 2手动)")
     private String confirmMode;
@@ -42,4 +47,16 @@ public class IronStepVO {
 
     private List<IronStepVO> childs;
 
+    public void setPass(){
+        this.passResult = 1;
+    }
+
+    public void setNotPass(){
+        this.passResult = 0;
+    }
+
+    public boolean ispass(){
+        return 1 == passResult;
+    }
+
 }

+ 44 - 0
taphole-iron/src/main/java/com/sckj/iron/vo/TIronDataVo.java

@@ -0,0 +1,44 @@
+package com.sckj.iron.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@ApiModel("出铁数据实体")
+public class TIronDataVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value="id", type= IdType.AUTO)
+    @ApiModelProperty(value = "")
+    private Long id;
+
+    @ApiModelProperty(value = "铁口编号")
+    private Integer tkbh;
+
+    @ApiModelProperty(value = "出铁次数编号")
+    private Integer ctcsbh;
+
+    @ApiModelProperty(value = "出铁时间")
+    private String ctsj;
+
+    @ApiModelProperty(value = "出铁量")
+    private String ctl;
+
+    @ApiModelProperty(value = "渣量")
+    private String zl;
+
+    @ApiModelProperty(value = "危害程度")
+    private String whcd;
+
+    @ApiModelProperty(value = "时间")
+    private String sj;
+
+}

+ 67 - 0
taphole-opc/src/main/java/com/sckj/opc/dto/L2Data.java

@@ -0,0 +1,67 @@
+package com.sckj.opc.dto;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+
+/**
+ * @Author feng
+ * @Date 2024-12-18 上午 09:47
+ * @Description TODO
+ */
+public class L2Data {
+    //操作标记
+    public String processFlag;
+
+    //高炉号码
+    public String boilerId;
+
+    //铁口号
+    public String tapholeId;
+
+    //铁次号
+    public String ironNo;
+
+    //出铁开始时间
+    public String startTime;
+
+    //出铁结束时间
+    public String endTime;
+
+    //出铁量
+    public String ironQuantity;
+
+    public void toDataStream(DataOutputStream dos) throws Exception {
+        dos.writeUTF(processFlag);
+        dos.writeUTF(boilerId);
+        dos.writeUTF(tapholeId);
+        dos.writeUTF(ironNo);
+        dos.writeUTF(startTime);
+        dos.writeUTF(endTime);
+        dos.writeUTF(ironQuantity);
+    }
+
+    public static L2Data fromDataStream(DataInputStream dis) throws Exception {
+        L2Data data = new L2Data();
+        data.processFlag = dis.readUTF();
+        data.boilerId = dis.readUTF();
+        data.tapholeId = dis.readUTF();
+        data.ironNo = dis.readUTF();
+        data.startTime = dis.readUTF();
+        data.endTime = dis.readUTF();
+        data.ironQuantity = dis.readUTF();
+        return data;
+    }
+
+    @Override
+    public String toString() {
+        return "L2Data{" +
+                "processFlag='" + processFlag + '\'' +
+                ", boilerId='" + boilerId + '\'' +
+                ", tapholeId='" + tapholeId + '\'' +
+                ", ironNo='" + ironNo + '\'' +
+                ", startTime='" + startTime + '\'' +
+                ", endTime='" + endTime + '\'' +
+                ", ironQuantity=" + ironQuantity +
+                '}';
+    }
+}

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

@@ -0,0 +1,125 @@
+package com.sckj.opc.opcua;
+
+import com.google.common.eventbus.AsyncEventBus;
+import com.sckj.opc.dto.L2Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.Socket;
+import java.net.UnknownHostException;
+
+/**
+ * @Author feng
+ * @Date 2024-12-19 上午 11:42
+ * @Description TODO
+ */
+@Service
+@Slf4j
+public class L2DataServiceImpl {
+
+    @Autowired
+    private AsyncEventBus asyncEventBus;
+
+    /***
+     * L2数据源
+     */
+    private void initTCP(){
+        final String serverIP = "127.0.0.1"; // 服务端IP地址
+        final int serverPort = 8888; // 服务端端口号
+        final int maxRetries = 10; // 最大重试次数
+        final long retryInterval = 5000; // 重试间隔时间(毫秒)
+
+        Socket socket = null;
+        DataOutputStream dos;
+        DataInputStream dis;
+        int attempt = 0;
+
+        // 连接重试机制
+        while (attempt < maxRetries) {
+            try {
+                socket = new Socket(serverIP, serverPort);
+                System.out.println("Connected to server at " + serverIP + ":" + serverPort);
+                break;
+            } catch (UnknownHostException e) {
+                System.err.println("Unknown host: " + serverIP);
+                break;
+            } catch (IOException e) {
+                attempt++;
+                System.err.println("Attempt " + attempt + ": Connection failed. Retrying in " + retryInterval / 1000 + " seconds...");
+                try {
+                    Thread.sleep(retryInterval);
+                } catch (InterruptedException ie) {
+                    Thread.currentThread().interrupt();
+                    System.err.println("Thread interrupted while sleeping.");
+                    break;
+                }
+            }
+        }
+
+        if (socket == null) {
+            System.err.println("Failed to connect to server after " + maxRetries + " attempts.");
+            return;
+        }
+        try{
+            dos = new DataOutputStream(socket.getOutputStream());
+            dis = new DataInputStream(socket.getInputStream());
+            while (true) {
+                try {
+                    // 从输入流读取L2Data对象
+                    L2Data receivedData = L2Data.fromDataStream(dis);
+                    //出铁操作
+                    asyncEventBus.post(receivedData);
+                    System.out.println("Received L2Data from server: \n" + receivedData);
+                } catch (IOException e) {
+                    System.err.println("Connection lost. Attempting to reconnect...");
+                    socket.close();
+                    socket = null;
+                    attempt = 0;
+
+                    // 重新连接重试机制
+                    while (attempt < maxRetries) {
+                        try {
+                            socket = new Socket(serverIP, serverPort);
+                            System.out.println("Reconnected to server at " + serverIP + ":" + serverPort);
+                            dos = new DataOutputStream(socket.getOutputStream());
+                            dis = new DataInputStream(socket.getInputStream());
+                            break;
+                        } catch (UnknownHostException ex) {
+                            System.err.println("Unknown host: " + serverIP);
+                            break;
+                        } catch (IOException ex) {
+                            attempt++;
+                            System.err.println("Attempt " + attempt + ": Reconnection failed. Retrying in " + retryInterval / 1000 + " seconds...");
+                            try {
+                                Thread.sleep(retryInterval);
+                            } catch (InterruptedException ie) {
+                                Thread.currentThread().interrupt();
+                                System.err.println("Thread interrupted while sleeping.");
+                                break;
+                            }
+                        }
+                    }
+
+                    if (socket == null) {
+                        System.err.println("Failed to reconnect to server after " + maxRetries + " attempts.");
+                        return;
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (socket != null && !socket.isClosed()) {
+                try {
+                    socket.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+}

+ 5 - 28
taphole-opc/src/main/java/com/sckj/opc/opcua/OPCUAServiceImpl.java

@@ -158,29 +158,6 @@ public class OPCUAServiceImpl {
                 }
         );
         //创建连接
-        //Thread.sleep(5*1000); // 线程休眠一下再返回对象,给创建过程一个时间。
-        opcUaClient.addFaultListener(new ServiceFaultListener() {
-            @Override
-            public void onServiceFault(ServiceFault serviceFault) {
-                log.info("Added ServiceFaultListener >> : {}", serviceFault.toString());
-//                if (serviceFault.getResponseHeader().getServiceResult().isBad()) {
-//                    opcUaClient.disconnect();
-//                }
-            }
-        });
-
-        opcUaClient.addSessionActivityListener(new SessionActivityListener() {
-            @Override
-            public void onSessionActive(UaSession session) {
-                log.info("onSessionActive: {}", JSON.toJSONString(session));
-            }
-
-            @Override
-            public void onSessionInactive(UaSession session) {
-                log.info("onSessionInactive: {}", JSON.toJSONString(session));
-            }
-        });
-
         opcUaClient.connect().get();
 
         mOPCUaClientMap.put(opcServer.getId(), opcUaClient);
@@ -216,11 +193,11 @@ public class OPCUAServiceImpl {
         for (OPCPoint opcPoint : opcPointList) {
             //创建监控的参数
             MonitoringParameters parameters = new MonitoringParameters(
-                    subscription.nextClientHandle(),
-                    1000.0,     // sampling interval
-                    null,       // filter, null means use default
-                    uint(10),   // queue size
-                    true        // discard oldest
+                    subscription.nextClientHandle(),// 客户端句柄
+                    1000.0,     // 采样间隔 sampling interval
+                    null,       // 过滤器filter, null means use default
+                    uint(10),   // 队列大小
+                    true        // 丢弃旧值
             );
             //创建订阅
             NodeId nodeId = new NodeId(opcPoint.getNamespaceIndex(), opcPoint.getPointName());

+ 6 - 3
taphole-warn/src/main/java/com/sckj/warn/entity/TExceptionLog.java

@@ -36,8 +36,8 @@ public class TExceptionLog implements Serializable {
     @ApiModelProperty(value = "异常类型(开口耗时、出铁时间、出铁量、流速、铁水温度变化)")
     private Integer exceptionType;
 
-    @ApiModelProperty(value = "异常区域(铁口区域,目前只有1号铁口区域)")
-    private String exceptionArea;
+//    @ApiModelProperty(value = "异常区域(铁口区域,目前只有1号铁口区域)")
+//    private String exceptionArea;
 
     @ApiModelProperty(value = "危害程度(轻微、中等、重度)")
     private String exceptionLevel;
@@ -46,6 +46,9 @@ public class TExceptionLog implements Serializable {
     private String reportedStatus;
 
     @ApiModelProperty(value = "锅炉编号")
-    private Integer glId;
+    private Integer boilerId;
+
+    @ApiModelProperty(value = "铁口区域编号")
+    private Integer tapholeId;
 
 }

+ 5 - 4
taphole-warn/src/main/java/com/sckj/warn/service/impl/TExceptionLogServiceImpl.java

@@ -119,10 +119,11 @@ public class TExceptionLogServiceImpl implements ITExceptionLogService {
         model.setCreateTime(new Date(System.currentTimeMillis()));//gg
         model.setUpdateTime(new Date(System.currentTimeMillis()));//gg
         model.setExceptionType(createValidate.getExceptionType());
-        model.setExceptionArea(createValidate.getExceptionArea());
+       // model.setExceptionArea(createValidate.getExceptionArea());
         model.setExceptionLevel(createValidate.getExceptionLevel());
         model.setReportedStatus(createValidate.getReportedStatus());
-        model.setGlId(createValidate.getGlId());
+        model.setBoilerId(createValidate.getBoilerId());
+        model.setTapholeId(createValidate.getTapholeId());
         tExceptionLogMapper.insert(model);
     }
 
@@ -193,9 +194,9 @@ public class TExceptionLogServiceImpl implements ITExceptionLogService {
         for (int i = 0; i < tExceptionLogList.size(); i++) {
             Row row = sheet.createRow(i + 1);
             TExceptionLog tExceptionLog = tExceptionLogList.get(i);
-            row.createCell(0).setCellValue(tExceptionLog.getGlId());
+            row.createCell(0).setCellValue(tExceptionLog.getBoilerId());
             row.createCell(1).setCellValue(tExceptionLog.getExceptionType());
-            row.createCell(2).setCellValue(tExceptionLog.getExceptionArea());
+            row.createCell(2).setCellValue(tExceptionLog.getTapholeId());
             row.createCell(3).setCellValue(tExceptionLog.getExceptionLevel());
             row.createCell(4).setCellValue(tExceptionLog.getReportedStatus().equals("0") ? "未上报" : "已上报");
             row.createCell(5).setCellValue(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(tExceptionLog.getCreateTime()));

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

@@ -21,9 +21,9 @@ public class TExceptionLogCreateValidate implements Serializable {
     @ApiModelProperty(value = "异常类型(开口耗时、出铁时间、出铁量、流速、铁水温度变化)")
     private Integer exceptionType;
 
-    @NotNull(message = "exceptionArea参数缺失")
-    @ApiModelProperty(value = "异常区域(铁口区域,目前只有1号铁口区域)")
-    private String exceptionArea;
+//    @NotNull(message = "exceptionArea参数缺失")
+//    @ApiModelProperty(value = "异常区域(铁口区域,目前只有1号铁口区域)")
+//    private String exceptionArea;
 
     @NotNull(message = "exceptionLevel参数缺失")
     @ApiModelProperty(value = "危害程度(轻微、中等、重度)")
@@ -33,8 +33,13 @@ public class TExceptionLogCreateValidate implements Serializable {
     @ApiModelProperty(value = "上报状态,将异常事件上报至视频以及 AI 融合系统(1是 0否)")
     private String reportedStatus;
 
-    @NotNull(message = "glId参数缺失")
+    @NotNull(message = "boilerId参数缺失")
     @ApiModelProperty(value = "锅炉编号")
-    private Integer glId;
+    private Integer boilerId;
+
+
+    @NotNull(message = "boilerId参数缺失")
+    @ApiModelProperty(value = "铁口区域编号")
+    private Integer tapholeId;
 
 }