浏览代码

去除冗余代码,添加步骤日志记录,优化代码

wangxiaofei 1 月之前
父节点
当前提交
815bd79414
共有 20 个文件被更改,包括 465 次插入229 次删除
  1. 117 0
      docker/docker-compose-l1.yml
  2. 117 0
      docker/docker-compose-l2.yml
  3. 2 4
      taphole-admin/src/main/resources/application-dev.yml
  4. 7 7
      taphole-admin/src/main/resources/application-prod.yml
  5. 1 1
      taphole-admin/src/main/resources/application-test.yml
  6. 1 1
      taphole-admin/src/main/resources/log4j2-spring.xml
  7. 1 0
      taphole-common/src/main/java/com/sckj/common/socketio/SocketServer.java
  8. 7 7
      taphole-iron/src/main/java/com/sckj/iron/controller/TIronVisualScreenController.java
  9. 69 0
      taphole-iron/src/main/java/com/sckj/iron/entity/TIronStepLog.java
  10. 14 0
      taphole-iron/src/main/java/com/sckj/iron/mapper/TIronStepLogMapper.java
  11. 0 101
      taphole-iron/src/main/java/com/sckj/iron/service/impl/FFmpegServiceImpl.java
  12. 2 1
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronDataServiceImpl.java
  13. 25 0
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronStepLogServiceImpl.java
  14. 64 19
      taphole-iron/src/main/java/com/sckj/iron/socketio/DeviceEventListener.java
  15. 3 0
      taphole-iron/src/main/java/com/sckj/iron/vo/IronStepVO.java
  16. 1 61
      taphole-l2-start/src/main/java/com/sckj/l2start/listener/L2EventListener.java
  17. 7 4
      taphole-l2/src/main/java/com/sckj/l2/entity/TL2Data.java
  18. 10 3
      taphole-l2/src/main/java/com/sckj/l2/service/impl/TL2DataServiceImpl.java
  19. 1 1
      taphole-l2/src/main/resources/mapper/TL2DataMapper.xml
  20. 16 19
      taphole-opc/src/main/java/com/sckj/opc/dauaservice/OPCDAServiceImpl.java

+ 117 - 0
docker/docker-compose-l1.yml

@@ -0,0 +1,117 @@
+#指定使用的 Docker Compose API 版本
+version: '3'
+
+networks:
+  taphole:
+    driver: bridge
+    ipam:
+      config:
+        - subnet: 172.28.1.0/24
+#定义了要运行的服务列表
+services:
+
+  mysql:
+    container_name: taphole-mysql
+    image: mysql:5.7.29 #X86架构
+    #image: amd64/mysql:5.7.29 #arm架构
+    restart: always
+    environment:
+      MYSQL_ROOT_PASSWORD: root
+    #映射宿主机当前目录到容器
+    volumes:
+      - ./mysql57/initdb:/docker-entrypoint-initdb.d
+      - ./mysql57/data:/var/lib/mysql #数据文件目录挂载
+      - ./mysql57/conf:/etc/mysql/conf.d #配置文件目录挂载
+      - ./mysql57/log:/var/log/mysql #日志文件目录挂载
+    networks:
+      - taphole
+    ports:
+      - "13306:3306"
+    privileged: true
+    #容器启动后执行的命令
+    command: [
+      'mysqld',
+      '--innodb-buffer-pool-size=80M',
+      '--character-set-server=utf8mb4',
+      '--collation-server=utf8mb4_unicode_ci',
+      '--default-time-zone=+8:00',
+      '--lower-case-table-names=1'
+    ]
+
+
+  redis:
+    container_name: taphole-redis
+    image: redis:7.0.4
+    privileged: true
+    restart: always
+    volumes:
+      - ./redis/data:/data
+    environment:
+      TZ: "Asia/Shanghai"
+    networks:
+      - taphole
+    ports:
+      - "16379:6379"
+    command: redis-server --appendonly yes
+
+
+#  zlmediakit:
+#    image: zlmediakit:latest
+#    container_name: taphole-zlmediakit
+#    ports:
+#      - "1935:1935"  # RTMP 端口
+#      - "8000:8000"  # HTTP 端口
+#      - "8554:8554"  # RTSP 端口
+#      - "8083:8083"  # WebRTC 端口
+#      - "18000:80"    # HTTP 端口
+#    volumes:
+#      - ./zlmediakit/config:/opt/zlmediakit/config  # 挂载配置文件目录
+#      - ./zlmediakit/media:/opt/zlmediakit/media    # 挂载媒体文件目录
+#    networks:
+#      taphole:
+#        ipv4_address: 172.28.1.10
+
+  webrtc:
+    image: webrtc-streamer:latest
+    container_name: taphole-webrtc
+    stdin_open: true
+    tty: true
+    network_mode: "host"
+
+
+  nginx:
+    image: nginx:latest
+    container_name: taphole-nginx
+    volumes:
+      - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf #配置文件目录挂载
+      - ./nginx/conf/default.conf:/etc/nginx/default.conf #配置文件目录挂载
+      - ./nginx/html:/etc/nginx/html #静态资源根目录挂载
+      - ./nginx/logs:/var/log/nginx #日志文件目录挂载
+    ports:
+      - 15080:80
+    networks:
+      - taphole
+
+  l1:
+    image: taphole-l1:latest
+    container_name: taphole-l1
+    build:
+      context: ./l1
+      dockerfile: Dockerfile
+    ports:
+      - "58080:8080"
+      - "53000:33000"
+    environment:
+      - PREFER_HOST_MODE=hostname
+      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/taphole
+      - SPRING_DATASOURCE_USERNAME=root
+      - SPRING_DATASOURCE_PASSWORD=root
+      - SPRING_REDIS_HOST=redis
+      - SPRING_REDIS_PORT=6379
+    depends_on:
+      - mysql
+      - redis
+      - webrtc
+    networks:
+      taphole:
+        ipv4_address: 172.28.1.200

+ 117 - 0
docker/docker-compose-l2.yml

@@ -0,0 +1,117 @@
+#指定使用的 Docker Compose API 版本
+version: '3'
+
+networks:
+  taphole:
+    driver: bridge
+    ipam:
+      config:
+        - subnet: 172.28.1.0/24
+#定义了要运行的服务列表
+services:
+
+  mysql:
+    container_name: taphole-mysql
+    image: mysql:5.7.29 #X86架构
+    #image: amd64/mysql:5.7.29 #arm架构
+    restart: always
+    environment:
+      MYSQL_ROOT_PASSWORD: root
+    #映射宿主机当前目录到容器
+    volumes:
+      - ./mysql57/initdb:/docker-entrypoint-initdb.d
+      - ./mysql57/data:/var/lib/mysql #数据文件目录挂载
+      - ./mysql57/conf:/etc/mysql/conf.d #配置文件目录挂载
+      - ./mysql57/log:/var/log/mysql #日志文件目录挂载
+    networks:
+      - taphole
+    ports:
+      - "13306:3306"
+    privileged: true
+    #容器启动后执行的命令
+    command: [
+      'mysqld',
+      '--innodb-buffer-pool-size=80M',
+      '--character-set-server=utf8mb4',
+      '--collation-server=utf8mb4_unicode_ci',
+      '--default-time-zone=+8:00',
+      '--lower-case-table-names=1'
+    ]
+
+
+  redis:
+    container_name: taphole-redis
+    image: redis:7.0.4
+    privileged: true
+    restart: always
+    volumes:
+      - ./redis/data:/data
+    environment:
+      TZ: "Asia/Shanghai"
+    networks:
+      - taphole
+    ports:
+      - "16379:6379"
+    command: redis-server --appendonly yes
+
+
+#  zlmediakit:
+#    image: zlmediakit:latest
+#    container_name: taphole-zlmediakit
+#    ports:
+#      - "1935:1935"  # RTMP 端口
+#      - "8000:8000"  # HTTP 端口
+#      - "8554:8554"  # RTSP 端口
+#      - "8083:8083"  # WebRTC 端口
+#      - "18000:80"    # HTTP 端口
+#    volumes:
+#      - ./zlmediakit/config:/opt/zlmediakit/config  # 挂载配置文件目录
+#      - ./zlmediakit/media:/opt/zlmediakit/media    # 挂载媒体文件目录
+#    networks:
+#      taphole:
+#        ipv4_address: 172.28.1.10
+
+  webrtc:
+    image: webrtc-streamer:latest
+    container_name: taphole-webrtc
+    stdin_open: true
+    tty: true
+    network_mode: "host"
+
+
+  nginx:
+    image: nginx:latest
+    container_name: taphole-nginx
+    volumes:
+      - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf #配置文件目录挂载
+      - ./nginx/conf/default.conf:/etc/nginx/default.conf #配置文件目录挂载
+      - ./nginx/html:/etc/nginx/html #静态资源根目录挂载
+      - ./nginx/logs:/var/log/nginx #日志文件目录挂载
+    ports:
+      - 15080:80
+    networks:
+      - taphole
+
+  l2:
+    image: taphole-l2:latest
+    container_name: taphole-l2
+    build:
+      context: ./l2
+      dockerfile: Dockerfile
+    ports:
+      - "58080:8080"
+      - "53000:33000"
+    environment:
+      - PREFER_HOST_MODE=hostname
+      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/taphole
+      - SPRING_DATASOURCE_USERNAME=root
+      - SPRING_DATASOURCE_PASSWORD=root
+      - SPRING_REDIS_HOST=redis
+      - SPRING_REDIS_PORT=6379
+    depends_on:
+      - mysql
+      - redis
+      - webrtc
+    networks:
+      taphole:
+        ipv4_address: 172.28.1.300

+ 2 - 4
taphole-admin/src/main/resources/application-dev.yml

@@ -31,10 +31,6 @@ spring:
 #        min-idle: 0     # 连接池中的最小空闲连接(默认0)
 
 # Mybatis-plus配置 【是否开启SQL日志输出】
-#mybatis-plus:
-#    configuration:
-#      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-
 
 socketio:
  # host: 127.0.0.1		#主机名,默认是 0.0.0.0 (这个设不设置无所谓,因为后面的 SocketConfig 类一般不用设置这个)
@@ -51,3 +47,5 @@ mybatis-plus:
   global-config:
     db-config:
       update-strategy: not_empty
+#  configuration:
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

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

@@ -1,27 +1,27 @@
 # 项目配置
 like:
-  upload-directory: /home/xiaofei/uploads/taphole/ # 上传目录
+  upload-directory: /home/taphole/upload # 上传目录
 
 # 服务配置
 server:
-  port: 8080
+  port: 28080
   servlet:
     context-path: /
 # 框架配置
 spring:
   # 数据源配置
   datasource:
-    url: jdbc:mysql://mysql:3306/taphole?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
+    url: jdbc:mysql://168.15.15.38:13306/taphole?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
     type: com.alibaba.druid.pool.DruidDataSource # 数据源类型
     driver-class-name: com.mysql.jdbc.Driver # MySql的驱动
     username: root # 数据库账号
     password: root # 数据库密码
   # Redis配置
   redis:
-    host: redis   # Redis服务地址
-    port: 6379        # Redis端口
-#    password: sckj@1234        # Redis密码
-#    database: 5       # 数据库索引
+    host: 168.15.15.38   # Redis服务地址
+    port: 16379        # Redis端口
+    password:         # Redis密码
+    database: 5       # 数据库索引
 
 # Mybatis-plus配置 【是否开启SQL日志输出】
 #mybatis-plus:

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

@@ -1,6 +1,6 @@
 # 项目配置
 like:
-  upload-directory: D:/opt/camera/
+  upload-directory: /home/document/taphole/target/ # 上传目录
 
 # 服务配置
 server:

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

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

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

@@ -24,6 +24,7 @@ public class SocketServer {
             token = queryParamMap.get("token").get(0);
         }
         try {
+            System.out.println("user open connection!!!");
             // 验证Token
             StpUtil.checkLogin();
             // 获取当前用户的角色和权限

+ 7 - 7
taphole-iron/src/main/java/com/sckj/iron/controller/TIronVisualScreenController.java

@@ -17,6 +17,7 @@ import com.sckj.iron.vo.IronLoginVo;
 import com.sckj.l2.dto.TL2DataDTO;
 import com.sckj.l2.dto.TrendDTO;
 import com.sckj.l2.dto.TrendRequest;
+import com.sckj.l2.entity.TL2Data;
 import com.sckj.l2.service.impl.TL2DataServiceImpl;
 import com.sckj.opc.service.OPCDataServiceImpl;
 import com.sckj.warn.dto.WarnDTO;
@@ -158,14 +159,14 @@ public class TIronVisualScreenController {
     @NotPower
     @PostMapping("/getIronData")
     @ApiOperation(value = "查询出铁数据")
-    public AjaxResult<TableDataInfo<TIronData>> queryIronData(@RequestBody TIronDataSearchScreenValidate ironDataSearchScreenValidate) {
+    public AjaxResult<TableDataInfo<TL2Data>> queryIronData(@RequestBody TIronDataSearchScreenValidate ironDataSearchScreenValidate) {
         //出铁操作
-        TIronData tl2Data = new TIronData();
+        TL2Data tl2Data = new TL2Data();
         BeanUtils.copyProperties(ironDataSearchScreenValidate, tl2Data);
         PageHelper.startPage(ironDataSearchScreenValidate.getPageNo(), ironDataSearchScreenValidate.getPageSize());
-        List<TIronData> ironDataList = tIronDataService.queryIronData(tl2Data);
+        List<TL2Data> ironDataList = tl2DataService.queryIronData(tl2Data);
         PageInfo pageInfo = new PageInfo(ironDataList);
-        TableDataInfo<TIronData> tableDataInfo = new TableDataInfo<>();
+        TableDataInfo<TL2Data> tableDataInfo = new TableDataInfo<>();
         BeanUtils.copyProperties(pageInfo, tableDataInfo);
         return AjaxResult.success(tableDataInfo);
     }
@@ -173,12 +174,11 @@ public class TIronVisualScreenController {
     @NotPower
     @PostMapping("/exportIronData")
     @ApiOperation(value = "导出出铁数据")
-    @Log(title = "更新出铁参数设置")
     public void exportIronData(@RequestBody TIronDataSearchScreenValidate ironDataSearchScreenValidate, HttpServletResponse response) throws IOException {
         //出铁操作
-        TIronData tl2Data = new TIronData();
+        TL2Data tl2Data = new TL2Data();
         BeanUtils.copyProperties(ironDataSearchScreenValidate, tl2Data);
-        tIronDataService.exportIronData(tl2Data, response);
+        tl2DataService.exportIronData(tl2Data, response);
     }
 
     /**

+ 69 - 0
taphole-iron/src/main/java/com/sckj/iron/entity/TIronStepLog.java

@@ -0,0 +1,69 @@
+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;
+
+@Data
+@ApiModel("出铁步骤日志记录")
+@TableName("t_iron_step_log")
+public class TIronStepLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    @ApiModelProperty(value = "创建时间")
+    private String createTime;
+
+
+    @TableId(value="step_id", type= IdType.INPUT)
+    @ApiModelProperty(value = "stepId")
+    private String stepId;
+
+    @ApiModelProperty(value = "是否流程必须项(0否 1是)")
+    private String required;
+
+    @ApiModelProperty(value = "步骤名称")
+    private String stepName;
+
+    @ApiModelProperty(value = "通过条件")
+    private String stepCondition;
+
+    @ApiModelProperty(value = "节点类型(start、end、node、child)")
+    private String nodeType;
+
+    @ApiModelProperty(value = "状态(1正常 0停用)")
+    private String status;
+
+    @ApiModelProperty(value = "确认方式(1自动 2手动)")
+    private String confirmMode;
+
+    @ApiModelProperty(value = "唯一名称")
+    private String identifier;
+
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
+
+    @ApiModelProperty(value = "订阅点名称(通道.设备.标识)")
+    private String pointName;
+
+    @ApiModelProperty(value = "步骤名称表达式")
+    private String stepNameExpression;
+
+    @ApiModelProperty(value = "数据内容")
+    private Object data;
+
+    @ApiModelProperty(value = "标记一组数据")
+    private String uuid;
+
+    @ApiModelProperty(value = "通过结果(1通过、0未通过)")
+    private int passResult;
+
+}

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

@@ -0,0 +1,14 @@
+package com.sckj.iron.mapper;
+
+import com.sckj.common.core.basics.IBaseMapper;
+import com.sckj.iron.entity.TIronStep;
+import com.sckj.iron.entity.TIronStepLog;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 出铁步骤配置Mapper
+ * @author LikeAdmin
+ */
+@Mapper
+public interface TIronStepLogMapper extends IBaseMapper<TIronStepLog> {
+}

+ 0 - 101
taphole-iron/src/main/java/com/sckj/iron/service/impl/FFmpegServiceImpl.java

@@ -1,101 +0,0 @@
-//package com.sckj.iron.service.impl;
-//
-//import cc.eguid.FFmpegCommandManager.FFmpegManager;
-//import cc.eguid.FFmpegCommandManager.FFmpegManagerImpl;
-//import org.springframework.stereotype.Service;
-//
-//import javax.annotation.PostConstruct;
-//
-//@Service
-//public class FFmpegServiceImpl {
-//
-//    private FFmpegManager manager;
-//
-//    @PostConstruct
-//    public void init() {
-//        manager = new FFmpegManagerImpl();
-//    }
-//
-//    /**
-//     * 开始推流
-//     * @param appName 进程名称,为相机ip去"."
-//     * @param rtspName rtsp流
-//     * @param rtmpName rtmp流
-//     * @return String
-//     */
-//    public String startTranscoding(String appName, String rtspName, String rtmpName)  {
-//        if(taskerIsRun(appName)) {
-//            return appName; //如果进程存在,则直接返回进程名
-//        }
-//        // 执行任务,id就是appName,如果执行失败返回为null
-//        String start = manager.start(appName,"ffmpeg -i " + rtspName + "  -probesize 5000000 -analyzeduration 5000000   -max_delay 5000000  -threads 10 -c copy -f flv " + rtmpName);
-//        return start;
-//    }
-//
-//    /**
-//     * 开始记录
-//     * @param appName 进程名称
-//     * @param rtmpUrl rtmp流
-//     */
-//    public String startRecord(String appName, String rtmpUrl, String filePath) {
-//        return manager.start("recordTo" + appName,"ffmpeg -y -i " + rtmpUrl + " -c copy -f flv " + filePath);
-//    }
-//
-//    /**
-//     * 关闭进程
-//     * @param tasker 进程名称
-//     * @return boolean
-//     */
-//    public boolean stopTranscoding(String tasker){
-//        if(!taskerIsRun(tasker)) {
-//            return true;
-//        }
-//        return manager.stop(tasker);
-//    }
-//
-//    /**
-//     * 判断当前推流进程是否存在
-//     * @param appName 进程名称
-//     * @return 进程名称,为"0"时表示进程不存在
-//     */
-//    public boolean taskerIsRun(String appName){
-//        if(manager == null){
-//            manager = new FFmpegManagerImpl();
-//        }
-//        return (manager.queryAll().size()>0 && manager.query(appName) != null);
-//    }
-//
-//
-//    /**
-//     * 下载是屁
-//     * @param appName 进程名称,为相机ip去"."
-//     * @param rtspName rtsp流
-//     * @param videoPath 文件路径
-//     * @return String
-//     */
-//    public String downloadVideo(String appName, String rtspName, String videoPath)  {
-//        if(taskerIsRun(appName)) {
-//            return appName; //如果进程存在,则直接返回进程名
-//        }
-//        // 执行任务,id就是appName,如果执行失败返回为null
-//        String start = manager.start(appName,"ffmpeg -i rtsp://" + rtspName + " " + videoPath);
-//        return start;
-//    }
-//
-//    /**
-//     * 抓图
-//     * @param appName 进程名称,为相机ip去"."
-//     * @param rtspName rtsp流
-//     * @param picPath 文件路径
-//     * @return String
-//     */
-//    public String catchPicture(String appName, String rtspName, String picPath)  {
-//        if(taskerIsRun(appName)) {
-//            return appName; //如果进程存在,则直接返回进程名
-//        }
-//        // 执行任务,id就是appName,如果执行失败返回为null
-//        String start = manager.start(appName,"ffmpeg -i rtsp://" + rtspName + " -frames:v 1 -f image2 " + picPath);
-//        return start;
-//    }
-//
-//}

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

@@ -145,6 +145,7 @@ public class TIronDataServiceImpl extends ServiceImpl<TIronDataMapper, TIronData
                 .eq(ObjectUtils.isNotEmpty(ironData.getIronCosttime()), TIronData::getIronCosttime, ironData.getIronCosttime())
                 .eq(ObjectUtils.isNotEmpty(ironData.getIronNo()), TIronData::getIronNo, ironData.getIronNo())
                 .eq(ObjectUtils.isNotEmpty(ironData.getTapholeId()), TIronData::getTapholeId, ironData.getTapholeId())
+                .eq(ObjectUtils.isNotEmpty(ironData.getBoilerId()), TIronData::getBoilerId, ironData.getBoilerId())
                 .orderByAsc(TIronData::getIronNo);
         ;
         if (StringUtils.isNotBlank(ironData.getIronStarttime()) && StringUtils.isNotBlank(ironData.getIronEndtime())) {
@@ -161,7 +162,7 @@ public class TIronDataServiceImpl extends ServiceImpl<TIronDataMapper, TIronData
      * @throws IOException
      */
     public void exportIronData(TIronData ironData, HttpServletResponse response) throws IOException {
-        if (ObjectUtils.isNotEmpty(ironData.getIronStarttime()) && ObjectUtils.isNotEmpty(ironData.getIronEndtime())) {
+        if (ObjectUtils.isEmpty(ironData.getIronStarttime()) || ObjectUtils.isEmpty(ironData.getIronEndtime())) {
             throw new OperateException("导出请选择开始时间和结束时间!");
         }
         List<TIronData> tl2DataList = queryIronData(ironData);

+ 25 - 0
taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronStepLogServiceImpl.java

@@ -0,0 +1,25 @@
+package com.sckj.iron.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckj.iron.entity.TIronStepLog;
+import com.sckj.iron.mapper.TIronStepLogMapper;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+ * 出铁步骤配置实现类
+ *
+ * @author LikeAdmin
+ */
+@Service
+public class TIronStepLogServiceImpl extends ServiceImpl<TIronStepLogMapper, TIronStepLog> {
+
+    @Resource
+    TIronStepLogMapper tIronStepLogMapper;
+
+
+
+
+}
+

+ 64 - 19
taphole-iron/src/main/java/com/sckj/iron/socketio/DeviceEventListener.java

@@ -17,9 +17,9 @@ import com.sckj.iron.dto.IronStepDTO;
 import com.sckj.iron.dto.IronTimeNoDTO;
 import com.sckj.iron.dto.RealtimeData;
 import com.sckj.iron.dto.WarnData;
-import com.sckj.iron.entity.TIronData;
 import com.sckj.iron.entity.TIronModel;
 import com.sckj.iron.entity.TIronParam;
+import com.sckj.iron.entity.TIronStepLog;
 import com.sckj.iron.service.impl.*;
 import com.sckj.iron.util.LocalDateUtils;
 import com.sckj.iron.vo.IronStepVO;
@@ -116,6 +116,10 @@ public class DeviceEventListener extends EventListener { //
     @Resource
     TIronModelServiceImpl ironModelService;
 
+    //步骤数据
+    @Resource
+    TIronStepLogServiceImpl ironStepLogService;
+
     //炉前申请出铁
     private static final String STEP_LQSQCT = "lqsqct";
 
@@ -189,6 +193,8 @@ public class DeviceEventListener extends EventListener { //
 
     private String alramUrlTapping;
 
+    private String alramUrlTappingTimeout;
+
     //节点标记
     private static final String NODE = "node";
 
@@ -269,11 +275,14 @@ public class DeviceEventListener extends EventListener { //
                     alarmUrlClosure = SERVER_URL + "/" + GlobalConfig.publicPrefix + File.separator + tAudio.getPath();
                 } else if (Objects.equals(tAudio.getExceptionType(), TaskNameConstants.TASKNAME_TAPPING_WARN)) {
                     alramUrlTapping = SERVER_URL + "/" + GlobalConfig.publicPrefix + File.separator + tAudio.getPath();
+                } else if (Objects.equals(tAudio.getExceptionType(), TaskNameConstants.TASKNAME_TAPPING_TIMEOUT_WARN)) {
+                    alramUrlTappingTimeout = SERVER_URL + "/" + GlobalConfig.publicPrefix + File.separator + tAudio.getPath();
                 }
             }
             log.info("alarmUrlOpen: " + alarmUrlOpen);
             log.info("alarmUrlClose: " + alarmUrlClosure);
             log.info("alramUrlTapping: " + alramUrlTapping);
+            log.info("alramUrlTappingTimeout: " + alramUrlTappingTimeout);
         }
     }
 
@@ -503,17 +512,6 @@ public class DeviceEventListener extends EventListener { //
         });
 
 
-        //出铁超时报警
-        scheduledTaskManager.addTask(TaskNameConstants.TASKNAME_TAPPING_TIMEOUT_WARN, ScheduledTimeConstants.TAPPING_TIMEOUT_WARN_DELAY, ScheduledTimeConstants.TAPPING_TIMEOUT_WARN_PERIOD, TimeUnit.SECONDS, () -> {
-            log.info("堵口预警:{}", TaskNameConstants.TASKNAME_TAPPING_TIMEOUT_WARN);
-
-            System.out.println("倒计时结束!10分钟已到。");
-            // 出铁预警,打开系统告警并记录
-            PushData.send2Warn(WarnData.warnOpen("请立即打开铁口", alarmUrlOpen));
-            log.info("准备出铁但是未及时出铁口,此处数据库记录");
-            //scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_TAPPING_TIMEOUT_WARN); // 终止定时器
-        });
-
         //堵口预警
         scheduledTaskManager.addTask(TaskNameConstants.TASKNAME_CLOSURE_WARN, ScheduledTimeConstants.CLOSURE_WARN_DELAY, ScheduledTimeConstants.CLOSURE_WARN_PERIOD, TimeUnit.SECONDS, () -> {
             //堵口预警
@@ -598,6 +596,19 @@ public class DeviceEventListener extends EventListener { //
         realtimeData.setDesc("出铁计时");
 
         PushData.send2CostTime(realtimeData);
+
+        if ((totalSeconds / 60) > IRON_TIME.get()) {
+            //出铁超时报警
+            scheduledTaskManager.addTask(TaskNameConstants.TASKNAME_TAPPING_TIMEOUT_WARN, ScheduledTimeConstants.TAPPING_TIMEOUT_WARN_DELAY, ScheduledTimeConstants.TAPPING_TIMEOUT_WARN_PERIOD, TimeUnit.SECONDS, () -> {
+                log.info("出铁超时报警:{}", TaskNameConstants.TASKNAME_TAPPING_TIMEOUT_WARN);
+
+                PushData.send2Warn(WarnData.warnTappingTimeout("出铁时间超时", alramUrlTapping));
+                taskExecutor.submit(() -> {
+                    exceptionLogService.add(TExceptionLogCreateValidate.builder().exceptionType(2).exceptionDesc("出铁时间超过设定时间").build());
+                });
+            });
+
+        }
     }
 
 
@@ -640,10 +651,10 @@ public class DeviceEventListener extends EventListener { //
             //实际出铁量
             String ironWeight = fixedLatestElement.getIronWeight();
 
-            TIronData ironData = new TIronData();
-            BeanUtils.copyProperties(ironData, fixedLatestElement);
-
-            ironDataService.save(ironData);
+//            TIronData ironData = new TIronData();
+//            BeanUtils.copyProperties(ironData, fixedLatestElement);
+//
+//            ironDataService.save(ironData);
 
             scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_TAPPING_TEST);
         });
@@ -854,8 +865,11 @@ public class DeviceEventListener extends EventListener { //
 
     }
 
+    private String uuid;
+
     //计算每步结果
-    private void setStepResult(List<IronStepVO> mSteps) {
+    private synchronized void setStepResult(List<IronStepVO> mSteps) {
+        uuid = UUID.randomUUID().toString().replace("-","");
         boolean foundFalsePass = false;
         //发现第一个pass是false,后续都为false,包括父项和子项
         for (IronStepVO stepDTO : mSteps) {
@@ -869,7 +883,18 @@ public class DeviceEventListener extends EventListener { //
 
                     if (foundFalsePass) {
                         grandchild.setPassResult(0);
+                        if(Objects.equals(grandchild.getConfirmMode(),"2")){
+                            grandchild.setData("0");
+                        }
                     }
+
+                    taskExecutor.execute(()->{
+                        TIronStepLog stepLog = new TIronStepLog();
+                        stepLog.setUuid(uuid);
+                        BeanUtils.copyProperties(grandchild, stepLog);
+                        ironStepLogService.save(stepLog);
+                    });
+
                 }
 
                 //子项验证是否通过
@@ -880,7 +905,16 @@ public class DeviceEventListener extends EventListener { //
                 //子项
                 if (foundFalsePass) {
                     child.setPassResult(0);
+                    if(Objects.equals(child.getConfirmMode(),"2")){
+                        child.setData("0");
+                    }
                 }
+                taskExecutor.execute(()->{
+                    TIronStepLog stepLog = new TIronStepLog();
+                    stepLog.setUuid(uuid);
+                    BeanUtils.copyProperties(child, stepLog);
+                    ironStepLogService.save(stepLog);
+                });
             }
             //父项
             validateStepPass(stepDTO);
@@ -890,7 +924,16 @@ public class DeviceEventListener extends EventListener { //
             //父项
             if (foundFalsePass) {
                 stepDTO.setPassResult(0);
+                if(Objects.equals(stepDTO.getConfirmMode(),"2")){
+                    stepDTO.setData("0");
+                }
             }
+            taskExecutor.execute(()->{
+                TIronStepLog stepLog = new TIronStepLog();
+                stepLog.setUuid(uuid);
+                BeanUtils.copyProperties(stepDTO, stepLog);
+                ironStepLogService.save(stepLog);
+            });
         }
     }
 
@@ -977,8 +1020,10 @@ public class DeviceEventListener extends EventListener { //
                     log.info("开口预警:{}", TaskNameConstants.TASKNAME_OPEN_WARN);
 
                     // 出铁预警,打开系统告警并记录
-                    PushData.send2Warn(WarnData.warnOpen("请立即打开铁口", "xxxxxxxxxxxxxx"));
-                    log.info("准备出铁但是未及时出铁口,此处数据库记录");
+                    PushData.send2Warn(WarnData.warnOpen("请立即打开铁口", alarmUrlOpen));
+                    taskExecutor.submit(() -> {
+                        exceptionLogService.add(TExceptionLogCreateValidate.builder().exceptionType(1).exceptionDesc("打开铁口超时").build());
+                    });
 //                    scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_OPEN_WARN); // 终止定时器
                 });
             }

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

@@ -52,6 +52,9 @@ public class IronStepVO {
     @ApiModelProperty(value = "步骤名称表达式")
     private String stepNameExpression;
 
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
+
     public IronStepVO() {
         this.childs = new ArrayList<>();
     }

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

@@ -80,67 +80,7 @@ public class L2EventListener extends EventListener {
             RedisUtils.addFixedElement("ironElement", l2Data, 10);
         });
 //
-//        //推送实时数据
-//        taskExecutor.submit(() -> {
-//            setRealtimeDataAndStatus(null, l2Data);
-//        });
-//
-//        taskExecutor.submit(() -> {
-//            for (IronStepVO stepDTO : mSteps) {
-//                if (NODE.equalsIgnoreCase(stepDTO.getNodeType())) {
-//                    //处理子项
-//                    for (IronStepVO child : stepDTO.getChilds()) {
-//                        if (STEP_TLC.equals(child.getIdentifier())) {
-//                            List<L2Data> latest2Data = (List<L2Data>) RedisUtils.getFixedElement(IRON_ELEMENT, 2);
-//                            if (latest2Data.size() >= 2) {
-//                                HashMap[] hashMaps = new HashMap[6];
-//                                child.setExtraInfo(hashMaps);
-//                                //理论出铁量 = 矿批 × 综合品位 × 1.06
-//                                //铁量差 = 理论出铁量 - 实际出铁量
-//                                L2Data tl2Data1Last = latest2Data.get(0);
-//                                BigDecimal llLast = new BigDecimal(tl2Data1Last.getTotalDry()).multiply(new BigDecimal(1.0)).multiply(new BigDecimal(1.06));
-//                                BigDecimal ironWeightLast = new BigDecimal(tl2Data1Last.getIronWeight());
-//                                BigDecimal tlcLast = llLast.subtract(ironWeightLast);
-//
-//                                L2Data tl2Data1LastLast = latest2Data.get(1);
-//                                BigDecimal llLastLast = new BigDecimal(tl2Data1LastLast.getTotalDry()).multiply(new BigDecimal(1.0)).multiply(new BigDecimal(1.06));
-//                                BigDecimal ironWeightLastLast = new BigDecimal(tl2Data1Last.getIronWeight());
-//                                BigDecimal tlcLastLast = llLastLast.subtract(ironWeightLastLast);
-//
-//                                //铁量差在合理范围内
-//                                // 上一次铁量差:-30       上上次铁量差:20 t
-//                                // 理论出铁量:1500 t      理论出铁量:1400 t
-//                                // 实际出铁量:1530 t      实际出铁量: 1380 t
-//                                final String sctlc = "sctlc";
-//                                final String ssctlc = "ssctlc";
-//                                final String scll = "scll";
-//                                final String sscll = "sscll";
-//                                final String scsj = "scsj";
-//                                final String sscsj = "sscsj";
-//
-//                                for (IronStepVO grandChild : child.getChilds()) {
-//                                    if (sctlc.equals(grandChild.getIdentifier())) {
-//                                        grandChild.setData(tlcLast);
-//                                    } else if (ssctlc.equals(grandChild.getIdentifier())) {
-//                                        grandChild.setData(tlcLastLast);
-//                                    } else if (scll.equals(grandChild.getIdentifier())) {
-//                                        grandChild.setData(llLast);
-//                                    } else if (sscll.equals(grandChild.getIdentifier())) {
-//                                        grandChild.setData(llLastLast);
-//                                    } else if (scsj.equals(grandChild.getIdentifier())) {
-//                                        grandChild.setData(ironWeightLast);
-//                                    } else if (sscsj.equals(grandChild.getIdentifier())) {
-//                                        grandChild.setData(ironWeightLastLast);
-//                                    }
-//                                }
-//                            }
-//                        }
-//                    }
-//                }
-//            }
-//            setStepResult(mSteps);
-//            PushData.send2Operation(mSteps, ironLoading1.get());
-//        });
+
 
     }
 

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

@@ -50,25 +50,28 @@ public class TL2Data implements Serializable {
     private Long ironNo;
 
     @ApiModelProperty(value = "出铁时间")
-    @ExcelProperty("出铁时间")
+    @ExcelProperty("出铁时间(min)")
     @ColumnWidth(25)
     private String ironCosttime;
 
     @ApiModelProperty(value = "实际出铁量")
-    @ExcelProperty("实际出铁量")
+    @ExcelProperty("实际出铁量(t)")
     @ColumnWidth(25)
     private Double ironWeight;
 
     @ApiModelProperty(value = "实际渣量")
-    @ExcelProperty("实际渣量")
+    @ExcelProperty("实际渣量(t)")
     @ColumnWidth(25)
     private String slagWeight;
 
     @ApiModelProperty(value = "铁水平均温度")
-    @ExcelIgnore
+    @ExcelProperty("铁水平均温度(℃)")
+    @ColumnWidth(25)
     private String avgTemp;
 
     @ApiModelProperty(value = "泥炮量")
+    @ExcelProperty("铁水平均温度(L)")
+    @ColumnWidth(25)
     private String mudWeight;
 
     @ApiModelProperty(value = "钻杆直径")

+ 10 - 3
taphole-l2/src/main/java/com/sckj/l2/service/impl/TL2DataServiceImpl.java

@@ -3,7 +3,9 @@ package com.sckj.l2.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckj.common.exception.OperateException;
 import com.sckj.common.util.ExcelUtils;
+import com.sckj.common.util.StringUtils;
 import com.sckj.l2.dto.TL2DataDTO;
 import com.sckj.l2.dto.TrendRequest;
 import com.sckj.l2.entity.TL2Data;
@@ -72,10 +74,12 @@ public class TL2DataServiceImpl extends ServiceImpl<TL2DataMapper, TL2Data> {
                 .eq(ObjectUtils.isNotEmpty(tl2Data.getIronWeight()), TL2Data::getIronWeight, tl2Data.getIronWeight())
                 .eq(ObjectUtils.isNotEmpty(tl2Data.getIronCosttime()), TL2Data::getIronCosttime, tl2Data.getIronCosttime())
                 .eq(ObjectUtils.isNotEmpty(tl2Data.getIronNo()), TL2Data::getIronNo, tl2Data.getIronNo())
-                .eq(ObjectUtils.isNotEmpty(tl2Data.getIronStarttime()), TL2Data::getIronStarttime, tl2Data.getIronStarttime())
-                .eq(ObjectUtils.isNotEmpty(tl2Data.getIronEndtime()), TL2Data::getIronEndtime, tl2Data.getIronEndtime())
                 .eq(ObjectUtils.isNotEmpty(tl2Data.getTapholeId()), TL2Data::getTapholeId, tl2Data.getTapholeId())
-        ;
+                .eq(ObjectUtils.isNotEmpty(tl2Data.getBoilerId()), TL2Data::getBoilerId, tl2Data.getBoilerId())
+                .orderByAsc(TL2Data::getIronNo);
+        if (StringUtils.isNotBlank(tl2Data.getIronStarttime()) && StringUtils.isNotBlank(tl2Data.getIronEndtime())) {
+            queryWrapper.lambda().between(TL2Data::getCreateTime, tl2Data.getIronStarttime(), tl2Data.getIronEndtime());
+        }
         return list(queryWrapper);
     }
 
@@ -86,6 +90,9 @@ public class TL2DataServiceImpl extends ServiceImpl<TL2DataMapper, TL2Data> {
      * @throws IOException
      */
     public void exportIronData(TL2Data tl2Data, HttpServletResponse response) throws IOException {
+        if (ObjectUtils.isEmpty(tl2Data.getIronStarttime()) || ObjectUtils.isEmpty(tl2Data.getIronEndtime())) {
+            throw new OperateException("导出请选择开始时间和结束时间!");
+        }
         List<TL2Data> tl2DataList = queryIronData(tl2Data);
         ExcelUtils.exportExcel(tl2DataList, TL2Data.class, "出铁数据", "出铁数据", response);
     }

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

@@ -31,7 +31,7 @@
 
     <select id="getTrendDataByDiffDays" resultType="com.sckj.l2.dto.TL2DataDTO">
         SELECT
-            DATE(create_time) createTime,
+            DATE_FORMAT(create_time, '%m-%d') createTime,
             ROUND(AVG(avg_temp),0) avgTemp,
             ROUND(AVG(iron_weight),2) ironWeight,
             ROUND(AVG(iron_weight/iron_costtime),2) ironSpeed,

+ 16 - 19
taphole-opc/src/main/java/com/sckj/opc/dauaservice/OPCDAServiceImpl.java

@@ -62,25 +62,21 @@ public class OPCDAServiceImpl {
      * 获得基础的连接信息
      */
     public Server createServer(OPCServer opcServer) {
-//        if (mOPCDaClientMap.containsKey(opcServer.getId())) {
-//            return mOPCDaClientMap.get(opcServer.getId());
-//        }
-        final ConnectionInformation ci = new ConnectionInformation();
-        ci.setHost(opcServer.getIp());          // OPCDA IP
-        ci.setUser(opcServer.getUsername());              // 用户名,配置DCOM时配置的
-        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());
-        AutoReconnectController controller = new AutoReconnectController(server);
-        // 连接到服务
-        controller.connect();
-//        mOPCDaClientMap.put(opcServer.getId(), server);
-        return server;
+        return mOPCDaClientMap.computeIfAbsent(opcServer.getId(), id -> {
+            final ConnectionInformation ci = new ConnectionInformation();
+            ci.setHost(opcServer.getIp());
+            ci.setUser(opcServer.getUsername());
+            ci.setPassword(opcServer.getPassword());
+            ci.setClsid(opcServer.getClsid());
+
+            log.info("Create Server : {}", opcServer);
+            log.info("availableProcessors:{}", Runtime.getRuntime().availableProcessors());
+
+            final Server server = new Server(ci, Executors.newSingleThreadScheduledExecutor());
+            AutoReconnectController controller = new AutoReconnectController(server);
+            controller.connect();
+            return server;
+        });
     }
 
 
@@ -154,6 +150,7 @@ public class OPCDAServiceImpl {
 
                         while (mOPCDaPointsMap.containsKey(opcPoint.getPointName())) {
                             //阻塞,直到关闭订阅
+                            Thread.sleep(100); // 避免 CPU 空转
                         }
                         access.unbind();
                         log.info("{} stop subscribe", opcPoint.getPointName());