Преглед на файлове

实时大屏功能完善

wangxiaofei преди 2 месеца
родител
ревизия
6fa67ee45d
променени са 32 файла, в които са добавени 769 реда и са изтрити 434 реда
  1. 23 13
      taphole-common/src/main/java/com/sckj/common/socketio/SocketHandler.java
  2. 51 0
      taphole-common/src/main/java/com/sckj/common/socketio/SocketServer.java
  3. 15 0
      taphole-iron/src/main/java/com/sckj/iron/controller/IronVisualScreenController.java
  4. 0 2
      taphole-iron/src/main/java/com/sckj/iron/controller/TIronAfterController.java
  5. 0 2
      taphole-iron/src/main/java/com/sckj/iron/controller/TIronBlockController.java
  6. 0 1
      taphole-iron/src/main/java/com/sckj/iron/controller/TIronDataController.java
  7. 0 1
      taphole-iron/src/main/java/com/sckj/iron/controller/TIronParamController.java
  8. 2 0
      taphole-iron/src/main/java/com/sckj/iron/dto/IronStepDTO.java
  9. 38 0
      taphole-iron/src/main/java/com/sckj/iron/dto/RealtimeData.java
  10. 27 0
      taphole-iron/src/main/java/com/sckj/iron/dto/TrendData.java
  11. 86 0
      taphole-iron/src/main/java/com/sckj/iron/entity/TL2Data.java
  12. 14 0
      taphole-iron/src/main/java/com/sckj/iron/mapper/TL2DataMapper.java
  13. 0 64
      taphole-iron/src/main/java/com/sckj/iron/service/ITIronAfterService.java
  14. 0 63
      taphole-iron/src/main/java/com/sckj/iron/service/ITIronBlockService.java
  15. 0 63
      taphole-iron/src/main/java/com/sckj/iron/service/ITIronDataService.java
  16. 0 71
      taphole-iron/src/main/java/com/sckj/iron/service/ITIronParamService.java
  17. 0 4
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronAfterServiceImpl.java
  18. 0 5
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronBlockServiceImpl.java
  19. 0 4
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronDataServiceImpl.java
  20. 0 5
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronParamServiceImpl.java
  21. 22 14
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronStepServiceImpl.java
  22. 62 0
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TL2DataServiceImpl.java
  23. 216 76
      taphole-iron/src/main/java/com/sckj/iron/socketio/DeviceEventListener.java
  24. 1 1
      taphole-iron/src/main/java/com/sckj/iron/socketio/PushData.java
  25. 31 0
      taphole-iron/src/main/java/com/sckj/iron/vo/IronRealTimeVO.java
  26. 12 0
      taphole-iron/src/main/java/com/sckj/iron/vo/IronStepVO.java
  27. 49 0
      taphole-iron/src/main/java/com/sckj/iron/vo/IronTrendVO.java
  28. 77 30
      taphole-opc/src/main/java/com/sckj/opc/dto/L2Data.java
  29. 12 9
      taphole-opc/src/main/java/com/sckj/opc/entity/OPCPoint.java
  30. 9 4
      taphole-opc/src/main/java/com/sckj/opc/entity/OPCServer.java
  31. 21 2
      taphole-opc/src/main/java/com/sckj/opc/opcua/OPCDAServiceImpl.java
  32. 1 0
      taphole-opc/src/main/java/com/sckj/opc/service/OPCDataServiceImpl.java

+ 23 - 13
taphole-common/src/main/java/com/sckj/common/socketio/SocketHandler.java

@@ -1,5 +1,7 @@
 package com.sckj.common.socketio;
 
+import cn.dev33.satoken.stp.StpLogic;
+import cn.dev33.satoken.stp.StpUtil;
 import com.corundumstudio.socketio.SocketIOServer;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
@@ -23,19 +25,19 @@ public class SocketHandler {
     private static final String USERID = "userId";
 
     /**
-     *  容器销毁前,自动调用此方法,关闭 socketIo 服务端
+     * 容器销毁前,自动调用此方法,关闭 socketIo 服务端
      *
-     * @Param []
      * @return
+     * @Param []
      **/
     @PreDestroy
-    private void destroy(){
+    private void destroy() {
         try {
             log.debug("关闭 socket 服务端");
-            if(null != socketIoServer){
+            if (null != socketIoServer) {
                 socketIoServer.stop();
             }
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
         }
     }
@@ -46,22 +48,30 @@ public class SocketHandler {
 
         //添加监听,客户端自动连接到 socket 服务端
         socketIoServer.addConnectListener(client -> {
-            String userId = client.getHandshakeData().getSingleUrlParam(USERID);
-            log.info("客户端userId: {},已连接,客户端ID为:{}",userId,client.getSessionId());
+//            String userId = client.getHandshakeData().getSingleUrlParam(USERID);
+            String token = client.getHandshakeData().getSingleUrlParam("token");
+//            log.info("客户端userId: {},已连接,客户端ID为:{}",userId,client.getSessionId());
 
-            if(ObjectUtils.isNotEmpty(userId)){
+            String userId = ObjectUtils.defaultIfNull(StpUtil.getLoginIdByToken(token), "").toString();
+            System.out.println("loginIdByToken:" + userId);
+
+            if (ObjectUtils.isNotEmpty(userId)) {
                 SocketUtil.connectMap.put(userId, client);
-                SocketUtil.clientUserIds.put(client,userId);
+                SocketUtil.clientUserIds.put(client, userId);
+            } else {
+                System.out.println("该用户未登录!");
             }
+
         });
 
         //添加监听,客户端跟 socket 服务端自动断开
         socketIoServer.addDisconnectListener(client -> {
-            String userId = client.getHandshakeData().getSingleUrlParam(USERID);
-            log.info("客户端userId: {},断开连接,客户端ID为:{}",userId,client.getSessionId());
-            if(ObjectUtils.isNotEmpty(userId)){
+            String token = client.getHandshakeData().getSingleUrlParam("token");
+            String userId = ObjectUtils.defaultIfNull(StpUtil.getLoginIdByToken(token), "").toString();
+            log.info("客户端userId: {},断开连接,客户端ID为:{}", userId, client.getSessionId());
+            if (ObjectUtils.isNotEmpty(userId)) {
                 SocketUtil.connectMap.remove(userId, client);
-                SocketUtil.clientUserIds.remove(client,userId);
+                SocketUtil.clientUserIds.remove(client, userId);
             }
         });
 

+ 51 - 0
taphole-common/src/main/java/com/sckj/common/socketio/SocketServer.java

@@ -0,0 +1,51 @@
+package com.sckj.common.socketio;
+
+import cn.dev33.satoken.stp.StpUtil;
+
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+import java.util.List;
+import java.util.Map;
+
+@ServerEndpoint("/socketio")
+public class SocketServer {
+
+    @OnOpen
+    public void onOpen(Session session) {
+        // 获取Token
+        // 获取HandshakeRequest对象
+        Map<String,String> pathParams = session.getPathParameters();
+        Map<String, List<String>> queryParamMap = session.getRequestParameterMap();
+
+        // 从查询参数中获取Token
+        String token = null;
+        if (queryParamMap.containsKey("token")) {
+            token = queryParamMap.get("token").get(0);
+        }
+        try {
+            // 验证Token
+            StpUtil.checkLogin();
+            // 获取当前用户的角色和权限
+            String username = StpUtil.getLoginIdAsString();
+            // 这里可以根据用户名从数据库或其他存储中获取用户的角色和权限
+            // 根据角色和权限决定是否允许连接
+            if (hasPermission(username)) {
+                // 允许连接
+            } else {
+                session.close();
+            }
+        } catch (Exception e) {
+            try {
+                session.close();
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
+        }
+    }
+
+    private boolean hasPermission(String username) {
+        // 根据用户名检查权限,例如从数据库中查询
+        return true; // 示例中假设用户有权限
+    }
+}

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

@@ -3,7 +3,9 @@ package com.sckj.iron.controller;
 import com.sckj.common.aop.NotLogin;
 import com.sckj.common.aop.NotPower;
 import com.sckj.common.core.AjaxResult;
+import com.sckj.iron.entity.TL2Data;
 import com.sckj.iron.service.impl.IronLoginServiceImpl;
+import com.sckj.iron.service.impl.TL2DataServiceImpl;
 import com.sckj.iron.validate.IronLoginValidate;
 import com.sckj.iron.vo.IronLoginVo;
 import io.swagger.annotations.Api;
@@ -16,6 +18,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 
 /**
  * @Author feng
@@ -30,6 +33,9 @@ public class IronVisualScreenController {
     @Resource
     IronLoginServiceImpl ironLoginService;
 
+    @Resource
+    TL2DataServiceImpl tl2DataService;
+
 
 
     @NotLogin
@@ -58,6 +64,15 @@ public class IronVisualScreenController {
         return AjaxResult.success(vo);
     }
 
+    //获取炼铁数据信息
+    @NotLogin
+    @PostMapping("/getMainElement")
+    @ApiOperation(value="获取设备信息")
+    public AjaxResult<Object> getMainElement(){
+        List<TL2Data> vo = tl2DataService.getLatest6Data();
+        return AjaxResult.success(vo);
+    }
+
 
 
 

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

@@ -1,11 +1,9 @@
 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;
 import com.sckj.common.validate.commons.PageValidate;
 import com.sckj.iron.vo.TIronAfterListedVo;

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

@@ -1,11 +1,9 @@
 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;
 import com.sckj.common.validate.commons.PageValidate;
 import com.sckj.iron.vo.TIronBlockListedVo;

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

@@ -6,7 +6,6 @@ import com.sckj.common.core.PageResult;
 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;

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

@@ -1,7 +1,6 @@
 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;

+ 2 - 0
taphole-iron/src/main/java/com/sckj/iron/dto/IronStepDTO.java

@@ -26,4 +26,6 @@ public class IronStepDTO extends TIronStep {
 
     private List<IronStepDTO> childs;
 
+    private List<String> extraList;
+
 }

+ 38 - 0
taphole-iron/src/main/java/com/sckj/iron/dto/RealtimeData.java

@@ -0,0 +1,38 @@
+package com.sckj.iron.dto;
+
+import lombok.Data;
+import org.springframework.stereotype.Component;
+
+/***
+ * 实时数据
+ * 铁水温度、铁水流速、铁水成分、铁水流量
+ *
+ */
+@Data
+@Component
+public class RealtimeData {
+    private Object ironSpeed;
+
+    private Object ironWeight;
+
+    private Object ironTemp;
+
+    private Object ironElement;
+
+
+    //出铁状态
+    private Object ironState;
+
+    //鱼雷罐车到位状态
+    private Object ironSpeed1;
+
+    //拔炮状态
+    private Object ironSpeed2;
+
+    //摆动溜咀
+    private Object bdlzState;
+
+    //冲渣状态
+    private Object czState;
+
+}

+ 27 - 0
taphole-iron/src/main/java/com/sckj/iron/dto/TrendData.java

@@ -0,0 +1,27 @@
+package com.sckj.iron.dto;
+
+import com.sckj.opc.entity.OPCData;
+import lombok.Data;
+import org.springframework.stereotype.Component;
+
+/***
+ * 趋势数据
+ */
+@Data
+@Component
+public class TrendData {
+    //铁水温度
+    private Object ironTemp;
+
+    //铁水流速1
+    private Object ironSpeed1;
+
+    //铁水流速2
+    private Object ironSpeed2;
+
+
+
+
+
+
+}

+ 86 - 0
taphole-iron/src/main/java/com/sckj/iron/entity/TL2Data.java

@@ -0,0 +1,86 @@
+package com.sckj.iron.entity;
+
+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("L2数据")
+@TableName("t_l2_data")
+public class TL2Data implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @TableId(value="id", type= IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "锅炉编号")
+    private Long boilerId;
+
+    @ApiModelProperty(value = "铁口区域编号")
+    private Long tapholeId;
+
+    @ApiModelProperty(value = "出铁次数编号")
+    private String ironNo;
+
+    @ApiModelProperty(value = "出铁时间")
+    private String ironCosttime;
+
+    @ApiModelProperty(value = "实际出铁量")
+    private double ironWeight;
+
+    @ApiModelProperty(value = "实际渣量")
+    private String slagWeight;
+
+    @ApiModelProperty(value = "铁水平均温度")
+    private String avgTemp;
+
+    @ApiModelProperty(value = "泥炮量")
+    private String mudWeight;
+
+    @ApiModelProperty(value = "钻杆直径")
+    private String pollMm;
+
+    @ApiModelProperty(value = "开口深度")
+    private String openDepth;
+
+    @ApiModelProperty(value = "上料总干量")
+    private double totalDry;
+
+    @ApiModelProperty(value = "开始时间")
+    private Date ironStarttime;
+
+    @ApiModelProperty(value = "结束时间")
+    private Date ironEndtime;
+
+
+    @ApiModelProperty(value = "碳")
+    private String elementC;
+
+    @ApiModelProperty(value = "硅")
+    private String elementSi;
+
+    @ApiModelProperty(value = "锰")
+    private String elementMn;
+
+    @ApiModelProperty(value = "磷")
+    private String elementP;
+
+    @ApiModelProperty(value = "硫")
+    private String elementS;
+
+    @ApiModelProperty(value = "钛")
+    private String elementTi;
+
+
+}

+ 14 - 0
taphole-iron/src/main/java/com/sckj/iron/mapper/TL2DataMapper.java

@@ -0,0 +1,14 @@
+package com.sckj.iron.mapper;
+
+import com.sckj.common.core.basics.IBaseMapper;
+import com.sckj.iron.entity.TIronAfter;
+import com.sckj.iron.entity.TL2Data;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 出铁后Mapper
+ * @author zhanghao
+ */
+@Mapper
+public interface TL2DataMapper extends IBaseMapper<TL2Data> {
+}

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

@@ -1,64 +0,0 @@
-package com.sckj.iron.service;
-
-import com.sckj.common.core.AjaxResult;
-import com.sckj.common.validate.commons.PageValidate;
-import com.sckj.iron.validate.TIronAfterCreateValidate;
-import com.sckj.iron.validate.TIronAfterUpdateValidate;
-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;
-
-/**
- * 出铁后服务接口类
- * @author zhanghao
- */
-public interface ITIronAfterService {
-
-    /**
-     * 出铁后列表
-     *
-     * @author zhanghao
-     * @param pageValidate 分页参数
-     * @param searchValidate 搜索参数
-     * @return PageResult<TIronAfterListedVo>
-     */
-    PageResult<TIronAfterListedVo> list(PageValidate pageValidate, TIronAfterSearchValidate searchValidate);
-
-    /**
-     * 出铁后详情
-     *
-     * @author zhanghao
-     * @param id 主键ID
-     * @return TIronAfterDetailVo
-     */
-    TIronAfterDetailVo detail(Integer id);
-
-    /**
-     * 出铁后新增
-     *
-     * @author zhanghao
-     * @param createValidate 参数
-     */
-    void add(TIronAfterCreateValidate createValidate);
-
-    /**
-     * 出铁后删除
-     *
-     * @author zhanghao
-     * @param id 主键ID
-     */
-    void del(Integer id);
-
-    /**
-     * 出铁后批量删除
-     *
-     * @author zhanghao
-     * @param ids 主键数组
-     */
-    AjaxResult<Object> del_ex(List<Long> ids);
-
-}

+ 0 - 63
taphole-iron/src/main/java/com/sckj/iron/service/ITIronBlockService.java

@@ -1,63 +0,0 @@
-package com.sckj.iron.service;
-
-import com.sckj.common.core.AjaxResult;
-import com.sckj.common.validate.commons.PageValidate;
-import com.sckj.iron.validate.TIronBlockCreateValidate;
-import com.sckj.iron.validate.TIronBlockUpdateValidate;
-import com.sckj.iron.validate.TIronBlockSearchValidate;
-import com.sckj.iron.vo.TIronBlockListedVo;
-import com.sckj.iron.vo.TIronBlockDetailVo;
-import com.sckj.common.core.PageResult;
-
-import java.util.List;
-
-/**
- * 堵口后服务接口类
- * @author zhanghao
- */
-public interface ITIronBlockService {
-
-    /**
-     * 堵口后列表
-     *
-     * @author zhanghao
-     * @param pageValidate 分页参数
-     * @param searchValidate 搜索参数
-     * @return PageResult<TIronBlockListedVo>
-     */
-    PageResult<TIronBlockListedVo> list(PageValidate pageValidate, TIronBlockSearchValidate searchValidate);
-
-    /**
-     * 堵口后详情
-     *
-     * @author zhanghao
-     * @param id 主键ID
-     * @return TIronBlockDetailVo
-     */
-    TIronBlockDetailVo detail(Integer id);
-
-    /**
-     * 堵口后新增
-     *
-     * @author zhanghao
-     * @param createValidate 参数
-     */
-    void add(TIronBlockCreateValidate createValidate);
-
-    /**
-     * 堵口后删除
-     *
-     * @author zhanghao
-     * @param id 主键ID
-     */
-    void del(Integer id);
-
-    /**
-     * 堵口后批量删除
-     *
-     * @author zhanghao
-     * @param ids 主键ID
-     */
-    AjaxResult<Object> del_ex(List<Long> ids);
-
-}

+ 0 - 63
taphole-iron/src/main/java/com/sckj/iron/service/ITIronDataService.java

@@ -1,63 +0,0 @@
-package com.sckj.iron.service;
-
-import com.sckj.common.core.AjaxResult;
-import com.sckj.common.validate.commons.PageValidate;
-import com.sckj.iron.validate.TIronDataCreateValidate;
-import com.sckj.iron.validate.TIronDataUpdateValidate;
-import com.sckj.iron.validate.TIronDataSearchValidate;
-import com.sckj.iron.vo.TIronDataListedVo;
-import com.sckj.iron.vo.TIronDataDetailVo;
-import com.sckj.common.core.PageResult;
-
-import java.util.List;
-
-/**
- * 出铁数据服务接口类
- * @author zhnaghao
- */
-public interface ITIronDataService {
-
-    /**
-     * 出铁数据列表
-     *
-     * @author zhnaghao
-     * @param pageValidate 分页参数
-     * @param searchValidate 搜索参数
-     * @return PageResult<TIronDataListedVo>
-     */
-    PageResult<TIronDataListedVo> list(PageValidate pageValidate, TIronDataSearchValidate searchValidate);
-
-    /**
-     * 出铁数据详情
-     *
-     * @author zhnaghao
-     * @param id 主键ID
-     * @return TIronDataDetailVo
-     */
-    TIronDataDetailVo detail(Integer id);
-
-    /**
-     * 出铁数据新增
-     *
-     * @author zhnaghao
-     * @param createValidate 参数
-     */
-    void add(TIronDataCreateValidate createValidate);
-
-    /**
-     * 出铁数据删除
-     *
-     * @author zhnaghao
-     * @param id 主键ID
-     */
-    void del(Integer id);
-
-    /**
-     * 出铁数据批量删除
-     *
-     * @author zhanghao
-     * @param ids 主键数组
-     */
-    AjaxResult<Object> del_ex(List<Long> ids);
-
-}

+ 0 - 71
taphole-iron/src/main/java/com/sckj/iron/service/ITIronParamService.java

@@ -1,71 +0,0 @@
-package com.sckj.iron.service;
-
-import com.sckj.common.core.AjaxResult;
-import com.sckj.common.validate.commons.PageValidate;
-import com.sckj.iron.validate.TIronParamCreateValidate;
-import com.sckj.iron.validate.TIronParamUpdateValidate;
-import com.sckj.iron.validate.TIronParamSearchValidate;
-import com.sckj.iron.vo.TIronParamListedVo;
-import com.sckj.iron.vo.TIronParamDetailVo;
-import com.sckj.common.core.PageResult;
-
-import java.util.List;
-
-/**
- * 参数设定服务接口类
- * @author zhnaghao
- */
-public interface ITIronParamService {
-
-    /**
-     * 参数设定列表
-     *
-     * @author zhnaghao
-     * @param pageValidate 分页参数
-     * @param searchValidate 搜索参数
-     * @return PageResult<TIronParamListedVo>
-     */
-    PageResult<TIronParamListedVo> list(PageValidate pageValidate, TIronParamSearchValidate searchValidate);
-
-    /**
-     * 参数设定详情
-     *
-     * @author zhnaghao
-     * @param id 主键ID
-     * @return TIronParamDetailVo
-     */
-    TIronParamDetailVo detail(Integer id);
-
-    /**
-     * 参数设定新增
-     *
-     * @author zhnaghao
-     * @param createValidate 参数
-     */
-    void add(TIronParamCreateValidate createValidate);
-
-    /**
-     * 参数设定编辑
-     *
-     * @author zhnaghao
-     * @param updateValidate 参数
-     */
-    void edit(TIronParamUpdateValidate updateValidate);
-
-    /**
-     * 参数设定删除
-     *
-     * @author zhnaghao
-     * @param id 主键ID
-     */
-    void del(Integer id);
-
-    /**
-     * 参数设定批量删除
-     *
-     * @author zhanghao
-     * @param ids 主键数组
-     */
-    AjaxResult<Object> del_ex(List<Long> ids);
-
-}

+ 0 - 4
taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronAfterServiceImpl.java

@@ -9,13 +9,9 @@ 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.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;
-import com.sckj.iron.validate.TIronAfterUpdateValidate;
 import com.sckj.iron.vo.TIronAfterDetailVo;
 import com.sckj.iron.vo.TIronAfterListedVo;
 import org.springframework.beans.BeanUtils;

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

@@ -8,15 +8,10 @@ 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;
 import com.sckj.iron.validate.TIronBlockSearchValidate;
-import com.sckj.iron.validate.TIronBlockUpdateValidate;
 import com.sckj.iron.vo.TIronBlockDetailVo;
 import com.sckj.iron.vo.TIronBlockListedVo;
 import org.springframework.beans.BeanUtils;

+ 0 - 4
taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronDataServiceImpl.java

@@ -10,14 +10,10 @@ import com.sckj.common.core.PageResult;
 import com.sckj.common.validate.commons.PageValidate;
 import com.sckj.iron.entity.TIronData;
 import com.sckj.iron.mapper.TIronDataMapper;
-import com.sckj.iron.service.ITIronDataService;
 import com.sckj.iron.validate.TIronDataCreateValidate;
 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;

+ 0 - 5
taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronParamServiceImpl.java

@@ -7,14 +7,9 @@ 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;
 import com.sckj.iron.validate.TIronParamSearchValidate;
 import com.sckj.iron.validate.TIronParamUpdateValidate;

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

@@ -12,10 +12,7 @@ import org.springframework.beans.BeanUtils;
 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.*;
 import java.util.stream.Collectors;
 
 /**
@@ -40,19 +37,30 @@ public class TIronStepServiceImpl extends ServiceImpl<TIronStepMapper, TIronStep
         QueryWrapper<TIronStep> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(TIronStep::getStatus, "1").orderByAsc(TIronStep::getSort);
         List<TIronStep> stepList = list(queryWrapper);
+        //按照 StepId 长度排序
+        stepList = stepList.stream()
+                .sorted((d1, d2) -> d1.getStepId().length() - d2.getStepId().length())
+                .collect(Collectors.toList());
+
+        Map<String, IronStepVO> stepMap = new HashMap<>();
         List<IronStepVO> stepDTOList = new ArrayList<>();
-        IronStepVO stepDTO = null;
+        // 将所有部门存入 Map 中
+        for (TIronStep step : stepList) {
+            IronStepVO stepVO = new IronStepVO();
+            BeanUtils.copyProperties(step, stepVO);
+            stepMap.put(step.getStepId(), stepVO);
+        }
+
         for (TIronStep step : stepList) {
-            if (step.getStepId().length() == 3) {
-                stepDTO = new IronStepVO();
-                stepDTO.setChilds(new ArrayList<>());
-                BeanUtils.copyProperties(step, stepDTO);
-                stepDTOList.add(stepDTO);
+            String stepId = step.getStepId();
+            IronStepVO currentDto = stepMap.get(stepId);
+            if (stepId.length() == 3) {
+                stepDTOList.add(currentDto);
             } else {
-                if (ObjectUtils.isNotEmpty(stepDTO) && StringUtils.startsWith(step.getStepId(), stepDTO.getStepId())) {
-                    IronStepVO stepChildDTO = new IronStepVO();
-                    BeanUtils.copyProperties(step, stepChildDTO);
-                    stepDTO.getChilds().add(stepChildDTO);
+                String parentId = stepId.substring(0, stepId.length() - 3);
+                IronStepVO parent = stepMap.get(parentId);
+                if (parent != null) {
+                    parent.addChilds(currentDto);
                 }
             }
         }

+ 62 - 0
taphole-iron/src/main/java/com/sckj/iron/service/impl/TL2DataServiceImpl.java

@@ -0,0 +1,62 @@
+package com.sckj.iron.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.TIronData;
+import com.sckj.iron.entity.TL2Data;
+import com.sckj.iron.mapper.TIronDataMapper;
+import com.sckj.iron.mapper.TL2DataMapper;
+import com.sckj.iron.validate.TIronDataCreateValidate;
+import com.sckj.iron.validate.TIronDataSearchValidate;
+import com.sckj.iron.vo.TIronDataDetailVo;
+import com.sckj.iron.vo.TIronDataListedVo;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * L2数据
+ *
+ * @author zhnaghao
+ */
+@Service
+public class TL2DataServiceImpl extends ServiceImpl<TL2DataMapper, TL2Data> {
+
+
+    /***
+     * 获取最新2条数据
+     * @return
+     */
+    public List<TL2Data> getLatest2Data() {
+        LambdaQueryWrapper<TL2Data> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.isNotNull(TL2Data::getIronEndtime).orderByDesc(TL2Data::getIronNo).last("limit 2");
+        List<TL2Data> list = list(queryWrapper);
+        return list;
+    }
+
+    /***
+     * 获取最新6条数据
+     * @return
+     */
+    public List<TL2Data> getLatest6Data() {
+        LambdaQueryWrapper<TL2Data> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.isNotNull(TL2Data::getIronEndtime).orderByDesc(TL2Data::getIronNo).last("limit 6");
+        List<TL2Data> list = list(queryWrapper);
+        return list;
+    }
+
+
+}

+ 216 - 76
taphole-iron/src/main/java/com/sckj/iron/socketio/DeviceEventListener.java

@@ -2,31 +2,38 @@ package com.sckj.iron.socketio;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
 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.dto.RealtimeData;
+import com.sckj.iron.dto.TrendData;
 import com.sckj.iron.entity.TIronData;
 import com.sckj.iron.entity.TIronParam;
+import com.sckj.iron.entity.TL2Data;
 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 com.sckj.opc.opcua.L2DataServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.expression.EvaluationException;
+import org.springframework.expression.ParseException;
 import org.springframework.expression.spel.standard.SpelExpressionParser;
 import org.springframework.expression.spel.support.StandardEvaluationContext;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Objects;
-import java.util.Timer;
-import java.util.TimerTask;
+import java.util.*;
 
 /**
  * @Author feng
@@ -57,6 +64,19 @@ public class DeviceEventListener extends EventListener {
     @Resource
     TIronParamServiceImpl ironParamService;
 
+    //参数
+    @Resource
+    TL2DataServiceImpl tl2DataService;
+
+    //实时数据
+    @Resource
+    RealtimeData realtimeData;
+
+
+    @Resource
+    TrendData trendData;
+
+    private L2Data mL2Data;
 
     // 1.创建表达式解析器
     private SpelExpressionParser parser = new SpelExpressionParser();
@@ -72,20 +92,32 @@ public class DeviceEventListener extends EventListener {
     //定时器,用于铁口开口超时记录
     private Timer timer = new Timer();
 
+    //前2次出铁数据
     private List<TIronData> oldIronDataList;
 
     //是否出铁中
+    //1 出铁中    0 出铁结束
     private boolean ironLoading = false;
 
-    //出铁标记
+    //1号出铁标记
     private static final String IRON_OPERATE_TAG = "AOD25606.PV";
 
+    //锅炉运行情况
+    private static final String glyxqk = "glyxqk";
+    //预判和确认出铁
+    private static final String ypqrct = "lqct";
+
+
+    //铁量差计算
+    private static final String tlc = "tlc";
+    @Autowired
+    private L2DataServiceImpl l2DataServiceImpl;
+
     @PostConstruct
     public void init() {
         mSteps = ironStepService.getTreeSteps();
     }
 
-
     /***
      * L1数据项
      * @param opcData
@@ -97,9 +129,41 @@ public class DeviceEventListener extends EventListener {
         }
         //出铁操作
         operate(opcData);
+        //趋势数据
+        trenddata(opcData);
+
         //实时数据
+        realtime(opcData);
+    }
+
+    //趋势数据
+    private void trenddata(OPCData opcData) {
+        //
+
+    }
+
+    //实时数据显示
+    //
+    private void realtime(OPCData opcData) {
+        //铁水温度
+        //铁水流速
+        //铁水成分
+        //铁水流量
+        if (opcData.getPointName().contains("CL510104.CPV")) {
+            // trendData.put("ironTemp",opcData.getData());
+
+        } else if (opcData.getPointName().contains("WZ540101.PV")) {
+//             trendData.put("ironSpeed1",opcData.getData());
+            realtimeData.setIronSpeed1(opcData.getData());
+        } else if (opcData.getPointName().contains("WZ540201.PV")) {
+//             trendData.put("ironTemp2",opcData.getData());
+            realtimeData.setIronSpeed2(opcData.getData());
+        }
+
+        if (ObjectUtils.isNotEmpty(mL2Data)) {
+
+        }
 
-        //趋势数据
     }
 
 
@@ -112,11 +176,73 @@ public class DeviceEventListener extends EventListener {
         if (SocketUtil.clientUserIds.isEmpty()) {
             return;
         }
+        this.mL2Data = l2Data;
+        TL2Data tl2Data = new TL2Data();
         //出铁操作
+        BeanUtils.copyProperties(l2Data, tl2Data);
 
-        //实时数据
+        //将L2实时数据保存到数据库
+        tl2DataService.saveOrUpdate(tl2Data);
+
+        for (IronStepVO stepDTO : mSteps) {
+            if (NODE.equalsIgnoreCase(stepDTO.getNodeType())) {
+                //处理子项
+                for (IronStepVO child : stepDTO.getChilds()) {
+                    if (tlc.equals(child.getIdentifier())) {
+                        List<TL2Data> latest2Data = tl2DataService.getLatest2Data();
+                        if (latest2Data.size() >= 2) {
+                            HashMap[] hashMaps = new HashMap[6];
+                            child.setExtraInfo(hashMaps);
+                            //理论出铁量 = 矿批 × 综合品位 × 1.06
+                            //铁量差 = 理论出铁量 - 实际出铁量
+                            TL2Data tl2Data1Last = latest2Data.get(0);
+                            double llLast = tl2Data1Last.getTotalDry() * 1.0 * 1.06;
+                            double ironWeightLast = tl2Data1Last.getIronWeight();
+                            double tlcLast = llLast - ironWeightLast;
+
+                            TL2Data tl2Data1LastLast = latest2Data.get(1);
+                            double llLastLast = tl2Data1LastLast.getTotalDry() * 1.0 * 1.06;
+                            double ironWeightLastLast = tl2Data1Last.getIronWeight();
+                            double tlcLastLast = llLastLast - ironWeightLastLast;
+
+                            //铁量差在合理范围内
+                            // 上一次铁量差:-30       上上次铁量差:20 t
+                            // 理论出铁量:1500 t      理论出铁量:1400 t
+                            // 实际出铁量:1530 t      实际出铁量: 1380 t
+
+                            hashMaps[0] = new HashMap();
+                            hashMaps[0].put("value", tlcLast);
+                            hashMaps[0].put("desc", String.format("上一次铁量差:%st", tlcLast));
+
+                            hashMaps[1] = new HashMap();
+                            hashMaps[1].put("value", tlcLastLast);
+                            hashMaps[1].put("desc", String.format("上上次铁量差:%st", tlcLastLast));
+
+                            hashMaps[2] = new HashMap();
+                            hashMaps[2].put("value", llLast);
+                            hashMaps[2].put("desc", String.format("理论出铁量:%st", llLast));
+
+                            hashMaps[3] = new HashMap();
+                            hashMaps[3].put("value", llLastLast);
+                            hashMaps[3].put("desc", String.format("理论出铁量:%st", llLastLast));
+
+                            hashMaps[4] = new HashMap();
+                            hashMaps[4].put("value", ironWeightLast);
+                            hashMaps[4].put("desc", String.format("t实际出铁量:%st", ironWeightLast));
+
+                            hashMaps[5] = new HashMap();
+                            hashMaps[5].put("value", ironWeightLastLast);
+                            hashMaps[5].put("desc", String.format("t实际出铁量:%st", ironWeightLastLast));
+
+                            child.setPassResult(1);
+                        }
+                    }
+                }
+            }
+        }
+
+        setStepResult(mSteps);
 
-        //趋势数据
     }
 
 
@@ -131,11 +257,68 @@ public class DeviceEventListener extends EventListener {
             if (NODE.equalsIgnoreCase(stepDTO.getNodeType())) {
                 //处理子项
                 for (IronStepVO child : stepDTO.getChilds()) {
-                    //plc的point和step的point一致
-                    if (Objects.equals(child.getPointName(), pointName)) {
-                        //3.创建变量上下文,设置变量
+                    for (IronStepVO childchild : child.getChilds()) {
+                        //plc的point和step的point一致
+                        String newPointName = childchild.getPointName();
+
+                        if(ObjectUtils.isEmpty(newPointName)){
+                            continue;
+                        }
+
+                        if(newPointName.contains(".")){
+                            newPointName = "channel." + newPointName;
+                        }else{
+                            newPointName = "channel.device." + newPointName;
+                        }
+
+                        if (Objects.equals(newPointName, pointName)) {
+                            //3.创建变量上下文,设置变量
+                            childchild.setData(data);
+//                            if ("glyc".equals(child.getIdentifier())) {
+//                                //高炉压差正常
+//
+//                                if (ObjectUtils.isEmpty(child.getExtraInfo())) {
+//                                    child.setExtraInfo(new HashMap[4]);
+//                                }
+//
+//                                if (opcData.getPointName().contains("FI1001.PV")) {
+//                                    //送风流量
+//                                    child.getExtraInfo()[0] = new HashMap<>();
+//                                    child.getExtraInfo()[0].put("value", data.toString());
+//                                    child.getExtraInfo()[0].put("desc", String.format("送风流量:%sm3/min", data.toString()));
+//                                } else if (opcData.getPointName().contains("PI1003.PV")) {
+//                                    //送风压力
+//                                    child.getExtraInfo()[1] = new HashMap<>();
+//                                    child.getExtraInfo()[1].put("value", data.toString());
+//                                    child.getExtraInfo()[1].put("desc", String.format("送风压力:%skPa", data.toString()));
+//                                } else if (opcData.getPointName().contains("PC7801.PV")) {
+//                                    //选择后炉顶压力
+//                                    child.getExtraInfo()[2] = new HashMap<>();
+//                                    child.getExtraInfo()[2].put("value", data.toString());
+//                                    child.getExtraInfo()[2].put("desc", String.format("炉顶压力:%skPa", data.toString()));
+//                                }
+//                                //压差
+//                                BigDecimal bdSfyl = new BigDecimal(child.getExtraInfo()[1].getOrDefault("value", "0").toString());
+//                                BigDecimal bdLdyl = new BigDecimal(child.getExtraInfo()[2].getOrDefault("value", "0").toString());
+//                                child.getExtraInfo()[3] = new HashMap<>();
+//                                BigDecimal subtract = bdSfyl.subtract(bdLdyl);
+//                                child.getExtraInfo()[3].put("value", bdSfyl.subtract(bdLdyl));
+//                                child.getExtraInfo()[3].put("desc", String.format("压差:%skPa", bdSfyl.subtract(bdLdyl)));
+//                                child.setPassResult(1);
+//                            }
+                        }
+                    }
+                    String newPointName = child.getPointName();
+                    if(ObjectUtils.isEmpty(newPointName)){
+                        continue;
+                    }
+                    if(newPointName.contains(".")){
+                        newPointName = "channel." + newPointName;
+                    }else{
+                        newPointName = "channel.device." + newPointName;
+                    }
+                    if (Objects.equals(newPointName, pointName)) {
                         child.setData(data);
-                        //log.info("pointName:{},data:{},tj:{},result:{}", pointName, data, child.getStepTj(), result);
                     }
 //                    else {
 //                        if (ObjectUtils.isNotEmpty(child.getData())) {
@@ -149,9 +332,6 @@ public class DeviceEventListener extends EventListener {
 
         setStepResult(mSteps);
 
-//        log.info("==========================================");
-//        log.info("steps after:{}", JSON.toJSONString(mSteps));
-//        log.info("==========================================");
 
         ironReady(opcData);
 
@@ -166,6 +346,19 @@ public class DeviceEventListener extends EventListener {
         //发现第一个pass是false,后续都为false,包括父项和子项
         for (IronStepVO stepDTO : mSteps) {
             for (IronStepVO child : stepDTO.getChilds()) {
+                for (IronStepVO childChild : child.getChilds()) {
+                    //子项的子项 验证是否通过
+                    validateStepTjPass(childChild);
+
+                    if (!foundFalsePass && 0 == childChild.getPassResult()) {
+                        foundFalsePass = true;
+                    }
+
+                    if (foundFalsePass) {
+                        childChild.setPassResult(0);
+                    }
+                }
+
                 //子项验证是否通过
                 validateStepTjPass(child);
                 if (!foundFalsePass && 0 == child.getPassResult()) {
@@ -185,16 +378,6 @@ public class DeviceEventListener extends EventListener {
         }
     }
 
-    //锅炉运行情况
-    private static final String glyxqk = "glyxqk";
-    //预判和确认出铁
-    private static final String ypqrct = "ypqrct";
-
-
-    //理论铁量、铁量差计算
-    private static final String tlcjs = "tlcjs";
-    //出铁方式(单铁口 双铁口)
-    private static final String ctfs = "ctfs";
 
     private void ironReady(OPCData opcData) {
         //通过“预判和确认出铁”标记开始出铁
@@ -229,7 +412,7 @@ public class DeviceEventListener extends EventListener {
         //根据PLC订阅的数据,AOD25606.PV=1为出铁中,AOD25606.PV=0出铁结束的信号,进行判断
         //为1表示开始出铁,此时如果未超过10分钟,就取消定时器
         //出铁结束
-        if (IRON_OPERATE_TAG.equalsIgnoreCase(opcData.getPointName())) {
+        if (opcData.getPointName().contains(IRON_OPERATE_TAG)) {
 
             //1:出铁中
             //0:出铁结束
@@ -265,55 +448,12 @@ public class DeviceEventListener extends EventListener {
                 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;
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
+        }
+        try {
+            String stepNameNew = parser.parseExpression(stepVO.getStepName().contains("#")?stepVO.getStepName():"'"+stepVO.getStepName()+"'").getValue(ctx, String.class);
+            stepVO.setStepName(stepNameNew);
+        } catch (Exception e) {
+            log.error("stepName:{}",stepVO.getStepName());
         }
     }
 

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

@@ -86,7 +86,7 @@ public class PushData {
     }
 
     /***
-     *
+     * 出铁操作
      * @param message 发送的消息内容
      * @param isStopSendMsg  是否停止发送信息
      */

+ 31 - 0
taphole-iron/src/main/java/com/sckj/iron/vo/IronRealTimeVO.java

@@ -0,0 +1,31 @@
+package com.sckj.iron.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author feng
+ * @Date 2024-11-21 上午 11:32
+ * @Description 实时状态数据
+ */
+@Data
+public class IronRealTimeVO {
+
+    @ApiModelProperty(value = "出铁状态")
+    private String AOD25606;
+
+    @ApiModelProperty(value = "鱼雷罐车到位信号")
+    private String ylgcOK;
+
+    @ApiModelProperty(value = "摆动溜咀")
+    private String bdlz;
+
+    @ApiModelProperty(value = "出渣中状态")
+    private String czzt;
+
+
+
+
+
+
+}

+ 12 - 0
taphole-iron/src/main/java/com/sckj/iron/vo/IronStepVO.java

@@ -3,6 +3,7 @@ package com.sckj.iron.vo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -45,8 +46,19 @@ public class IronStepVO {
     @ApiModelProperty(value = "数据")
     private Object data;
 
+
+    public IronStepVO() {
+        this.childs = new ArrayList<>();
+    }
+
+    public void addChilds(IronStepVO child) {
+        this.childs.add(child);
+    }
+
     private List<IronStepVO> childs;
 
+    private Map<String,Object>[] extraInfo;
+
     public void setPass(){
         this.passResult = 1;
     }

+ 49 - 0
taphole-iron/src/main/java/com/sckj/iron/vo/IronTrendVO.java

@@ -0,0 +1,49 @@
+package com.sckj.iron.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author feng
+ * @Date 2024-11-21 上午 11:32
+ * @Description 铁水温度趋势
+ */
+@Data
+public class IronTrendVO {
+
+    @ApiModelProperty(value = "出铁次数编号")
+    private String ironNum;
+
+    @ApiModelProperty(value = "stepId")
+    private String stepId;
+
+    @ApiModelProperty(value = "步骤名称")
+    private String stepName;
+
+    @ApiModelProperty(value = "步骤的唯一标识")
+    private String identifier;
+
+    @ApiModelProperty(value = "节点类型(start、end、node、child)")
+    private String nodeType;
+
+    @ApiModelProperty(value = "订阅点名称(通道.设备.标识)")
+    private String pointName;
+
+    @ApiModelProperty(value = "通过条件")
+    private String stepTj;
+
+    //
+    @ApiModelProperty(value = "通过结果(1通过、0未通过)")
+    private int passResult;
+
+    @ApiModelProperty(value = "确认方式(1自动 2手动)")
+    private String confirmMode;
+
+    @ApiModelProperty(value = "数据")
+    private Object data;
+
+
+
+}

+ 77 - 30
taphole-opc/src/main/java/com/sckj/opc/dto/L2Data.java

@@ -1,67 +1,114 @@
 package com.sckj.opc.dto;
 
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
+import java.util.Date;
 
 /**
  * @Author feng
  * @Date 2024-12-18 上午 09:47
  * @Description TODO
  */
+@Data
 public class L2Data {
-    //操作标记
-    public String processFlag;
 
-    //高炉号码
-    public String boilerId;
+    @ApiModelProperty(value = "铁口区域编号")
+    private String tapholeId;
+
+    @ApiModelProperty(value = "出铁次数编号")
+    private String ironNo;
+
+    @ApiModelProperty(value = "出铁时间")
+    private String ironCosttime;
+
+    @ApiModelProperty(value = "实际出铁量")
+    private String ironWeight;
+
+    @ApiModelProperty(value = "实际渣量")
+    private String slagWeight;
+
+    @ApiModelProperty(value = "铁水平均温度")
+    private String avgTemp;
+
+    @ApiModelProperty(value = "泥炮量")
+    private String mudWeight;
+
+    @ApiModelProperty(value = "钻杆直径")
+    private String pollMm;
+
+    @ApiModelProperty(value = "开口深度")
+    private String openDepth;
 
-    //铁口号
-    public String tapholeId;
+    @ApiModelProperty(value = "上料总干量")
+    private String totalDry;
 
-    //铁次号
-    public String ironNo;
+    @ApiModelProperty(value = "开始时间")
+    private String ironStarttime;
 
-    //出铁开始时间
-    public String startTime;
+    @ApiModelProperty(value = "结束时间")
+    private String ironEndtime;
 
-    //出铁结束时间
-    public String endTime;
+    //铁水成分
+    private String elementC;
+    private String elementSi;
+    private String elementMn;
+    private String elementP;
+    private String elementS;
+    private String elementTi;
 
-    //出铁量
-    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);
+        dos.writeUTF(ironCosttime);
+        dos.writeUTF(ironWeight);
+        dos.writeUTF(slagWeight);
+        dos.writeUTF(avgTemp);
+        dos.writeUTF(mudWeight);
+        dos.writeUTF(pollMm);
+        dos.writeUTF(openDepth);
+        dos.writeUTF(totalDry);
+        dos.writeUTF(ironStarttime);
+        dos.writeUTF(ironEndtime);
     }
 
     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();
+        data.ironCosttime = dis.readUTF();
+        data.ironWeight = dis.readUTF();
+        data.slagWeight = dis.readUTF();
+        data.avgTemp = dis.readUTF();
+        data.mudWeight = dis.readUTF();
+        data.pollMm = dis.readUTF();
+        data.openDepth = dis.readUTF();
+        data.totalDry = dis.readUTF();
+        data.ironStarttime = dis.readUTF();
+        data.ironEndtime = dis.readUTF();
         return data;
     }
 
     @Override
     public String toString() {
         return "L2Data{" +
-                "processFlag='" + processFlag + '\'' +
-                ", boilerId='" + boilerId + '\'' +
-                ", tapholeId='" + tapholeId + '\'' +
+                "tapholeId='" + tapholeId + '\'' +
                 ", ironNo='" + ironNo + '\'' +
-                ", startTime='" + startTime + '\'' +
-                ", endTime='" + endTime + '\'' +
-                ", ironQuantity=" + ironQuantity +
+                ", ironCosttime='" + ironCosttime + '\'' +
+                ", ironWeight='" + ironWeight + '\'' +
+                ", slagWeight='" + slagWeight + '\'' +
+                ", avgTemp='" + avgTemp + '\'' +
+                ", mudWeight='" + mudWeight + '\'' +
+                ", pollMm='" + pollMm + '\'' +
+                ", openDepth='" + openDepth + '\'' +
+                ", totalDry='" + totalDry + '\'' +
+                ", ironStarttime='" + ironStarttime + '\'' +
+                ", ironEndtime='" + ironEndtime + '\'' +
                 '}';
     }
 }

+ 12 - 9
taphole-opc/src/main/java/com/sckj/opc/entity/OPCPoint.java

@@ -25,20 +25,11 @@ public class OPCPoint {
     @ApiModelProperty(value = "所属opcserver")
     private Long opcServerId;
 
-//    @ApiModelProperty(value = "订阅点名称")
-//    private String identifier;
-//
-//    @ApiModelProperty(value = "订阅点说明")
-//    private String identifierDesc;
-
 
     @ApiModelProperty(value = "所属锅炉")
     private String boilerId;
 
 
-    @ApiModelProperty(value = "流程步骤")
-    private String stepId;
-
     @ApiModelProperty(value = "命名空间,默认为2")
     private Integer namespaceIndex;
 
@@ -52,4 +43,16 @@ public class OPCPoint {
     @ApiModelProperty(value = "订阅点说明")
     private String pointDesc;
 
+    @ApiModelProperty(value = "OPC协议,有:UA、DA")
+    private String opcProtocol;
+
+    @ApiModelProperty(value = "铁口区域编号")
+    private Long tapholeId;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "请求频率(秒)")
+    private int period;
+
 }

+ 9 - 4
taphole-opc/src/main/java/com/sckj/opc/entity/OPCServer.java

@@ -45,14 +45,19 @@ public class OPCServer {
     @ApiModelProperty(value = "IP地址")
     private String ip;
 
-
-
-
     @ApiModelProperty(value = "状态")
     private String status;
 
-
     @ApiModelProperty(value = "KEPServer的注册表ID")
     private String clsid;
 
+    @ApiModelProperty(value = "所属锅炉")
+    private String boilerId;
+
+    @ApiModelProperty(value = "铁口区域编号")
+    private Long tapholeId;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
 }

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

@@ -63,6 +63,8 @@ public class OPCDAServiceImpl {
         ci.setPassword(opcServer.getPassword());           // 密码
         ci.setClsid(opcServer.getClsid()); //KEPServer的注册表ID
 
+        log.info("Create Server : {}", opcServer);
+
         log.info("availableProcessors:{}",Runtime.getRuntime().availableProcessors());
         // 启动服务
         final Server server = new Server(ci, Executors.newSingleThreadScheduledExecutor());
@@ -85,8 +87,25 @@ public class OPCDAServiceImpl {
                     try {
                         Server server = createServer(opcServer);
                         AccessBase access = new SyncAccess(server, PERIOD);
-                        log.info("{} start subscribe",opcPoint.getPointName());
-                        access.addItem(opcPoint.getPointName(), (item, itemstate) -> {
+
+
+
+                        String newPointName = opcPoint.getPointName();
+
+
+                        if(ObjectUtils.isEmpty(newPointName)){
+                            return null;
+                        }
+
+                        if(newPointName.contains(".")){
+                            newPointName = "channel." + newPointName;
+                        }else{
+                            newPointName = "channel.device." + newPointName;
+                        }
+
+                        log.info("{} start subscribe",newPointName);
+
+                        access.addItem(newPointName, (item, itemstate) -> {
                             int errorCode = itemstate.getErrorCode();
                             String pointName = item.getId();
                             Calendar calendar = itemstate.getTimestamp();

+ 1 - 0
taphole-opc/src/main/java/com/sckj/opc/service/OPCDataServiceImpl.java

@@ -14,4 +14,5 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class OPCDataServiceImpl extends ServiceImpl<OPCDataMapper, OPCData> {
+
 }