Browse Source

1.打通HDSDK连接
2.部分优化

wangxiaofei 1 tuần trước cách đây
mục cha
commit
581a6e6b4e
21 tập tin đã thay đổi với 757 bổ sung543 xóa
  1. 144 0
      docker/docker-compose-dev.yml
  2. 1 26
      docker/docker-compose-prod.yml
  3. 144 0
      docker/docker-compose-test.yml
  4. 58 32
      docker/docker-compose.yml
  5. 5 0
      taphole-admin/src/main/resources/application-dev.yml
  6. 20 0
      taphole-common/src/main/java/com/sckj/common/validate/commons/LongIdValidate.java
  7. 21 0
      taphole-common/src/main/java/com/sckj/common/validate/commons/LongIdsValidate.java
  8. 22 33
      taphole-iron/src/main/java/com/sckj/iron/socketio/DeviceEventListener.java
  9. 46 125
      taphole-l2-start/src/main/java/com/sckj/l2start/listener/L2EventListener.java
  10. 0 55
      taphole-l2/src/main/java/com/sckj/l2/dto/L2Data.java
  11. 10 18
      taphole-l2/src/main/java/com/sckj/l2/entity/TL2Data.java
  12. 5 59
      taphole-l2/src/main/java/com/sckj/l2/entity/TL2Material.java
  13. 44 133
      taphole-l2/src/main/java/com/sckj/l2/service/impl/L2DataServiceImpl.java
  14. 2 2
      taphole-l2/src/main/java/com/sckj/l2/service/impl/TL2DataServiceImpl.java
  15. 2 2
      taphole-opc-start/src/main/java/com/sckj/opcstart/TapholeOpcStartApplication.java
  16. 7 0
      taphole-opc/pom.xml
  17. 51 14
      taphole-opc/src/main/java/com/sckj/opc/controller/THdTagController.java
  18. 166 41
      taphole-opc/src/main/java/com/sckj/opc/dataservice/HDServiceImpl.java
  19. 2 2
      taphole-opc/src/main/java/com/sckj/opc/service/THdTagServiceImpl.java
  20. BIN
      taphole-opc/src/main/resources/jar/log4j-1.2.13.jar
  21. 7 1
      taphole-opc/src/main/resources/mapper/HdTagMapper.xml

+ 144 - 0
docker/docker-compose-dev.yml

@@ -0,0 +1,144 @@
+#指定使用的 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
+
+  webrtc:
+    image: webrtc-streamer:latest
+    container_name: taphole-webrtc
+    stdin_open: true
+    tty: true
+    network_mode: "host"
+
+
+  nginx-bigscreen:
+    image: nginx:latest
+    container_name: taphole-nginx-bigscreen
+    volumes:
+      - ./nginx_bigscreen/conf/nginx.conf:/etc/nginx/nginx.conf #配置文件目录挂载
+      - ./nginx_bigscreen/conf/default.conf:/etc/nginx/default.conf #配置文件目录挂载
+      - ./nginx_bigscreen/html:/etc/nginx/html #静态资源根目录挂载
+      - ./nginx_bigscreen/logs:/var/log/nginx #日志文件目录挂载
+    ports:
+      - 15080:80
+    networks:
+      - taphole
+
+  nginx-mgtsys:
+    image: nginx:latest
+    container_name: taphole-nginx-mgtsys
+    volumes:
+      - ./nginx_mgtsys/conf/nginx.conf:/etc/nginx/nginx.conf #配置文件目录挂载
+      - ./nginx_mgtsys/conf/default.conf:/etc/nginx/default.conf #配置文件目录挂载
+      - ./nginx_mgtsys/html:/etc/nginx/html #静态资源根目录挂载
+      - ./nginx_mgtsys/logs:/var/log/nginx #日志文件目录挂载
+    ports:
+      - 25080:80
+    networks:
+      - taphole
+
+  app:
+    image: taphole-app:latest
+    container_name: taphole-app
+    build:
+      context: ./app
+      dockerfile: Dockerfile
+    volumes:
+      - /home/taphole/hcsdk/linux:/home/taphole/hcsdk/linux
+      - /home/taphole/hdsdk/linux:/home/taphole/hdsdk/linux
+      - /home/taphole/upload:/home/taphole/upload
+      - /home/taphole/app/logs:/app/logs
+    ports:
+      - "28080:8080"
+      - "33000: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.100
+
+  l2:
+    image: taphole-l2:latest
+    container_name: taphole-l2
+    build:
+      context: ./l2
+      dockerfile: Dockerfile
+    volumes:
+      - /home/taphole/l2/logs:/app/logs
+    ports:
+      - "48080: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

+ 1 - 26
docker/docker-compose-prod.yml

@@ -96,6 +96,7 @@ services:
       dockerfile: Dockerfile
     volumes:
       - /home/taphole/hcsdk/linux:/home/taphole/hcsdk/linux
+      - /home/taphole/hdsdk/linux:/home/taphole/hdsdk/linux
       - /home/taphole/upload:/home/taphole/upload
       - /home/taphole/app/logs:/app/logs
     ports:
@@ -116,32 +117,6 @@ services:
       taphole:
         ipv4_address: 172.28.1.100
 
-  l1:
-    image: taphole-l1:latest
-    container_name: taphole-l1
-    build:
-      context: ./l1
-      dockerfile: Dockerfile
-    volumes:
-      - /home/taphole/l1/logs:/app/logs
-    ports:
-      - "38080:8080"
-      - "43000: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.150
-
   l2:
     image: taphole-l2:latest
     container_name: taphole-l2

+ 144 - 0
docker/docker-compose-test.yml

@@ -0,0 +1,144 @@
+#指定使用的 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
+
+  webrtc:
+    image: webrtc-streamer:latest
+    container_name: taphole-webrtc
+    stdin_open: true
+    tty: true
+    network_mode: "host"
+
+
+  nginx-bigscreen:
+    image: nginx:latest
+    container_name: taphole-nginx-bigscreen
+    volumes:
+      - ./nginx_bigscreen/conf/nginx.conf:/etc/nginx/nginx.conf #配置文件目录挂载
+      - ./nginx_bigscreen/conf/default.conf:/etc/nginx/default.conf #配置文件目录挂载
+      - ./nginx_bigscreen/html:/etc/nginx/html #静态资源根目录挂载
+      - ./nginx_bigscreen/logs:/var/log/nginx #日志文件目录挂载
+    ports:
+      - 15080:80
+    networks:
+      - taphole
+
+  nginx-mgtsys:
+    image: nginx:latest
+    container_name: taphole-nginx-mgtsys
+    volumes:
+      - ./nginx_mgtsys/conf/nginx.conf:/etc/nginx/nginx.conf #配置文件目录挂载
+      - ./nginx_mgtsys/conf/default.conf:/etc/nginx/default.conf #配置文件目录挂载
+      - ./nginx_mgtsys/html:/etc/nginx/html #静态资源根目录挂载
+      - ./nginx_mgtsys/logs:/var/log/nginx #日志文件目录挂载
+    ports:
+      - 25080:80
+    networks:
+      - taphole
+
+  app:
+    image: taphole-app:latest
+    container_name: taphole-app
+    build:
+      context: ./app
+      dockerfile: Dockerfile
+    volumes:
+      - /home/taphole/hcsdk/linux:/home/taphole/hcsdk/linux
+      - /home/taphole/hdsdk/linux:/home/taphole/hdsdk/linux
+      - /home/taphole/upload:/home/taphole/upload
+      - /home/taphole/app/logs:/app/logs
+    ports:
+      - "28080:8080"
+      - "33000: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.100
+
+  l2:
+    image: taphole-l2:latest
+    container_name: taphole-l2
+    build:
+      context: ./l2
+      dockerfile: Dockerfile
+    volumes:
+      - /home/taphole/l2/logs:/app/logs
+    ports:
+      - "48080: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

+ 58 - 32
docker/docker-compose.yml

@@ -54,23 +54,6 @@ services:
       - "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
@@ -79,36 +62,51 @@ services:
     network_mode: "host"
 
 
-  nginx:
+  nginx-bigscreen:
     image: nginx:latest
-    container_name: taphole-nginx
+    container_name: taphole-nginx-bigscreen
+    restart: always
     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 #日志文件目录挂载
+      - ./nginx_bigscreen/conf/nginx.conf:/etc/nginx/nginx.conf #配置文件目录挂载
+      - ./nginx_bigscreen/conf/default.conf:/etc/nginx/default.conf #配置文件目录挂载
+      - ./nginx_bigscreen/html:/etc/nginx/html #静态资源根目录挂载
+      - ./nginx_bigscreen/logs:/var/log/nginx #日志文件目录挂载
     ports:
       - 15080:80
     networks:
       - taphole
 
+  nginx-mgtsys:
+    image: nginx:latest
+    container_name: taphole-nginx-mgtsys
+    restart: always
+    volumes:
+      - ./nginx_mgtsys/conf/nginx.conf:/etc/nginx/nginx.conf #配置文件目录挂载
+      - ./nginx_mgtsys/conf/default.conf:/etc/nginx/default.conf #配置文件目录挂载
+      - ./nginx_mgtsys/html:/etc/nginx/html #静态资源根目录挂载
+      - ./nginx_mgtsys/logs:/var/log/nginx #日志文件目录挂载
+    ports:
+      - 25080:80
+    networks:
+      - taphole
+
   app:
     image: taphole-app:latest
     container_name: taphole-app
-    #   command: java -jar /app/my-springboot-app.jar
+    restart: always
     build:
-      context: .
+      context: ./app
       dockerfile: Dockerfile
     volumes:
-      # - ./target/taphole-admin-1.0.0.jar:/app/my-springboot-app.jar
-      #- ./target/loadFFmpeg.properties:/app/loadFFmpeg.properties
-      - /home/document/taphole/hcsdk/linux:/home/document/taphole/hcsdk/linux
-      - /home/document/uploads/taphole/:/home/document/uploads/taphole/  #映射资源目录
-      - /home/taphole/logs:/app/logs
-      # - /usr/local/ffmpeg/bin:/usr/local/ffmpeg/bin
+      - /home/taphole/hcsdk/linux:/home/taphole/hcsdk/linux
+      - /home/taphole/hdsdk/linux:/home/taphole/hdsdk/linux
+      - /home/taphole/upload:/home/taphole/upload
+      - /home/taphole/app/logs:/app/logs
     ports:
       - "28080:8080"
       - "33000:33000"
+      - "34567:4567"
+      - "38087:8087"
     environment:
       - PREFER_HOST_MODE=hostname
       - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/taphole
@@ -122,4 +120,32 @@ services:
       - webrtc
     networks:
       taphole:
-        ipv4_address: 172.28.1.100
+        ipv4_address: 172.28.1.100
+
+  l2:
+    image: taphole-l2:latest
+    container_name: taphole-l2
+    restart: always
+    build:
+      context: ./l2
+      dockerfile: Dockerfile
+    volumes:
+      - /home/taphole/l2/logs:/app/logs
+    ports:
+      - "48080:8080"
+      - "53000:33000"
+      - "4567:4567"
+      - "8087:8087"
+    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
+    networks:
+      taphole:
+        ipv4_address: 172.28.1.200

+ 5 - 0
taphole-admin/src/main/resources/application-dev.yml

@@ -1,6 +1,11 @@
 # 项目配置
 like:
   upload-directory: D:/opt/camera/
+  l2:
+    host: 168.15.14.1
+    port: 4567
+    maxRetries: 10
+    retryInterval: 5000
 
 # 服务配置
 server:

+ 20 - 0
taphole-common/src/main/java/com/sckj/common/validate/commons/LongIdValidate.java

@@ -0,0 +1,20 @@
+package com.sckj.common.validate.commons;
+
+import com.sckj.common.validator.annotation.IDMust;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel("ID参数")
+public class LongIdValidate implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @IDMust(message = "id参数必传且需大于0")
+    @ApiModelProperty(value = "ID", required = true)
+    private Long id;
+
+}

+ 21 - 0
taphole-common/src/main/java/com/sckj/common/validate/commons/LongIdsValidate.java

@@ -0,0 +1,21 @@
+package com.sckj.common.validate.commons;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@ApiModel("IDS参数")
+public class LongIdsValidate implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @NotNull(message = "ids参数缺失")
+    @ApiModelProperty(value = "ID数组", required = true)
+    private List<Long> ids;
+
+}

+ 22 - 33
taphole-iron/src/main/java/com/sckj/iron/socketio/DeviceEventListener.java

@@ -1,5 +1,6 @@
 package com.sckj.iron.socketio;
 
+import com.baosight.hdsdk.domain.data.HDRecord;
 import com.corundumstudio.socketio.SocketIOClient;
 import com.corundumstudio.socketio.annotation.OnEvent;
 import com.google.common.eventbus.Subscribe;
@@ -25,15 +26,14 @@ import com.sckj.iron.service.impl.*;
 import com.sckj.iron.util.LocalDateUtils;
 import com.sckj.iron.vo.IronStepVO;
 import com.sckj.l2.dto.L2Data;
-import com.sckj.l2.dto.L2Material;
 import com.sckj.l2.entity.TL2Data;
-import com.sckj.l2.entity.TL2Material;
 import com.sckj.l2.service.impl.L2DataServiceImpl;
 import com.sckj.l2.service.impl.TL2DataServiceImpl;
 import com.sckj.l2.service.impl.TL2MaterialServiceImpl;
-import com.sckj.opc.dataservice.OPCDAServiceImpl;
+import com.sckj.opc.dataservice.HDServiceImpl;
 import com.sckj.opc.entity.OPCData;
 import com.sckj.opc.service.OPCDataServiceImpl;
+import com.sckj.opc.service.THdTagServiceImpl;
 import com.sckj.opc.utils.CustomUtil;
 import com.sckj.warn.entity.TAudio;
 import com.sckj.warn.service.impl.TAudioServiceImpl;
@@ -110,8 +110,8 @@ public class DeviceEventListener extends EventListener { //
     @Resource
     TAudioServiceImpl audioService;
 
-    @Resource
-    OPCDAServiceImpl opcdaService;
+//    @Resource
+//    OPCDAServiceImpl opcdaService;
 
     @Resource
     TIronModelServiceImpl ironModelService;
@@ -123,6 +123,12 @@ public class DeviceEventListener extends EventListener { //
     @Resource
     TIronScheduleServiceImpl iTIronScheduleService;
 
+    @Resource
+    THdTagServiceImpl iTHdTagService;
+
+    @Resource
+    HDServiceImpl hdService;
+
     //炉前申请出铁
     private static final String STEP_LQSQCT = "lqsqct";
 
@@ -259,7 +265,7 @@ public class DeviceEventListener extends EventListener { //
                 //程序启动后隔断时间启动订阅
                 scheduledTaskManager.addTask(scheduleOpcdasubscribe.getName(), scheduleOpcdasubscribe.getDelay(), scheduleOpcdasubscribe.getPeriod(), TimeUnit.SECONDS, () -> {
                     log.info("opcdaService subscribe available");
-                    opcdaService.subscribeAvailable();
+//                    opcdaService.subscribeAvailable();
                     scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_OPCDASUBSCRIBE);
                 });
             }
@@ -378,12 +384,15 @@ public class DeviceEventListener extends EventListener { //
         }
     }
 
+
     /***
-     * L1数据项
-     * @param opcData
+     * IHD
+     * @param record
      */
     @Subscribe
-    public void onMessageEvent(OPCData opcData) {
+    public void onMessageEvent(HDRecord record) {
+        OPCData opcData = OPCData.builder().data(record.getValueStr()).pointName(record.getBelongTagID() + "").serverTime(new Date(record.getSecond() * 1000)).build();
+
         //异步保存OPC数据
         taskExecutor.submit(() -> {
             opcDataService.save(opcData);
@@ -455,12 +464,12 @@ public class DeviceEventListener extends EventListener { //
                                 //理论出铁量 = 矿批 × 综合品位 × 1.06
                                 //铁量差 = 理论出铁量 - 实际出铁量
                                 TL2Data tl2Data1Last = latest2DataList.get(0);
-                                BigDecimal llLast = new BigDecimal(tl2Data1Last.getTheoryWeight()).setScale(2, BigDecimal.ROUND_HALF_UP);
+                                BigDecimal llLast = new BigDecimal(tl2Data1Last.getCalcWeight()).setScale(2, BigDecimal.ROUND_HALF_UP);
                                 BigDecimal ironWeightLast = new BigDecimal(tl2Data1Last.getIronWeight()).setScale(2, BigDecimal.ROUND_HALF_UP);
                                 BigDecimal tlcLast = llLast.subtract(ironWeightLast).setScale(2, BigDecimal.ROUND_HALF_UP);
 
                                 TL2Data tl2Data1GrandLast = latest2DataList.get(1);
-                                BigDecimal llGrandLast = new BigDecimal(tl2Data1GrandLast.getTheoryWeight()).setScale(2, BigDecimal.ROUND_HALF_UP);
+                                BigDecimal llGrandLast = new BigDecimal(tl2Data1GrandLast.getCalcWeight()).setScale(2, BigDecimal.ROUND_HALF_UP);
                                 BigDecimal ironWeightGrandLast = new BigDecimal(tl2Data1GrandLast.getIronWeight()).setScale(2, BigDecimal.ROUND_HALF_UP);
                                 BigDecimal tlcGrandLast = llGrandLast.subtract(ironWeightGrandLast).setScale(2, BigDecimal.ROUND_HALF_UP);
 
@@ -507,26 +516,6 @@ public class DeviceEventListener extends EventListener { //
     }
 
 
-    @Subscribe
-    public void onL2MaterialMessageEvent(L2Material material) {
-        TL2Material tl2Material = new TL2Material();
-        tl2Material.setIronNo(mIronNo);
-        //出铁操作
-        BeanUtils.copyProperties(material, tl2Material);
-        //将L2上料实时数据保存到数据库
-        taskExecutor.submit(() -> {
-            tl2MaterialService.save(tl2Material);
-        });
-
-//        if (ironLoading1.get()) {
-//            BigDecimal bigDecimalNew = new BigDecimal(material.getDryWeight());
-//            mTotalDry = mTotalDry.add(bigDecimalNew);
-//        } else {
-//            mTotalDry = BigDecimal.ZERO;
-//        }
-
-    }
-
     /***
      * 返回出铁计时开始,单位分钟
      * @return
@@ -660,7 +649,7 @@ public class DeviceEventListener extends EventListener { //
                 TL2Data tappingData = tl2DataService.getTappingData();
                 if (ObjectUtils.isNotEmpty(tappingData) && ObjectUtils.isNotEmpty(modelHitMud)) {
                     log.info("开口深度openDepth(mm):{}", tappingData.getOpenDepth());
-                    log.info("Tap对应铁水估计铁量ironWeight(t): {}", tappingData.getTheoryWeight());
+                    log.info("Tap对应铁水估计铁量ironWeight(t): {}", tappingData.getCalcWeight());
                     log.info("出铁时间ironCosttime(min): {}", getIronElapsedMinute());
                     log.info("平均流速ironSpeed(t/s): {}", speed1.get() > speed2.get() ? speed1.get() : speed2.get());
 
@@ -672,7 +661,7 @@ public class DeviceEventListener extends EventListener { //
                         StandardEvaluationContext context = new StandardEvaluationContext();
                         // 设置占位符对应的值
                         context.setVariable("openDepth", tappingData.getOpenDepth());
-                        context.setVariable("ironWeight", tappingData.getTheoryWeight());
+                        context.setVariable("ironWeight", tappingData.getCalcWeight());
                         context.setVariable("ironCosttime", getIronElapsedMinute());
                         context.setVariable("ironSpeed", speed1.get() > speed2.get() ? speed1.get() : speed2.get());
                         //计算打泥量

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

@@ -1,29 +1,21 @@
 package com.sckj.l2start.listener;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.google.common.eventbus.Subscribe;
 import com.sckj.common.eventbus.EventListener;
-import com.sckj.common.util.RedisUtils;
-import com.sckj.l2.dto.L2Data;
-import com.sckj.l2.dto.L2Material;
 import com.sckj.l2.entity.TL2Data;
 import com.sckj.l2.entity.TL2Material;
 import com.sckj.l2.service.impl.TL2DataServiceImpl;
 import com.sckj.l2.service.impl.TL2MaterialServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.BeanUtils;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
-import java.math.BigDecimal;
 import java.util.List;
 
 /***
- * DeviceEventListener
+ * L2EventListener
  */
 @Component
 @Slf4j
@@ -35,136 +27,65 @@ public class L2EventListener extends EventListener {
     @Resource
     TL2MaterialServiceImpl tl2MaterialService;
 
-    //出铁次数编号
-    private Long mIronNo;
-
     //多任务
     @Resource(name = "taskExecutor")
     ThreadPoolTaskExecutor taskExecutor;
 
-    //总干量
-    private BigDecimal mTotalDry = BigDecimal.ZERO;
-
     /***
      * L2数据项
-     * @param l2Data
+     * @param
      */
     @Subscribe
-    public void onL2DataMessageEvent(L2Data l2Data) {
-        log.info("L2EventListener >>> {}", l2Data);
-        if (ObjectUtils.isNotEmpty(l2Data.getIronNo())) {
-            if (!mIronNo.equals(l2Data.getIronNo())) {
-                mTotalDry = BigDecimal.ZERO;
-            }
-            //只要是新的出铁次数编号,后续都一直用这个编号,直到有新的出铁编号
-            mIronNo = l2Data.getIronNo();
+    public void onL2DataMessageEvent(List<String> dataList) {
+        if (ObjectUtils.isEmpty(dataList)) {
+            return;
+        }
+        log.info("onL2DataMessageEvent");
+        for (String data : dataList) {
+            log.info(data);
         }
-//        //记录出铁日期和次数,并返回给前端
-//        IronTimeNoDTO ironTimeNoDTO = new IronTimeNoDTO();
-//        String dateString = LocalDateUtils.formatDate(new Date(), DateTimeFormatter.ofPattern("MM月dd日"));
-//        ironTimeNoDTO.setDate(dateString);
-//        ironTimeNoDTO.setIronNo(mIronNo);
-//        ironTimeNoDTO.setDesc(String.format("%s第%s次出铁", dateString, ironTimeNoDTO.getIronNo()));
-//        PushData.send2IronTimeNo(ironTimeNoDTO);
+        log.info("onL2DataMessageEvent");
+        if (dataList.size() == 22) {
+            TL2Material tl2Material = new TL2Material();
+            tl2Material.setChargeNo(dataList.get(0));
+            tl2Material.setTheoryWeight(dataList.get(1));
+            tl2Material.setLoadMaterialTime(dataList.get(2));
+            //上料数据
+//            taskExecutor.submit(() -> {
 //
-        TL2Data tl2Data = new TL2Data();
-        //出铁操作
-        BeanUtils.copyProperties(l2Data, tl2Data);
-        //将L2实时数据保存到数据库
-        taskExecutor.submit(() -> {
-            tl2DataService.saveOrUpdate(tl2Data);
-        });
-
-        //将L2实时数据保存到Redis
-        taskExecutor.submit(() -> {
-            RedisUtils.addFixedElement("ironElement", l2Data, 10);
-        });
+//            });
+            boolean materialResult = tl2MaterialService.saveOrUpdate(tl2Material);
+
+            TL2Data tl2Data = new TL2Data();
+            //l2数据
+            tl2Data.setBoilerId(dataList.get(3));
+            tl2Data.setTapholeId(dataList.get(4));
+            tl2Data.setIronNo(Double.valueOf(dataList.get(5)).longValue());
+            tl2Data.setElementSi(dataList.get(6));
+            tl2Data.setElementS(dataList.get(7));
+            tl2Data.setElementTi(dataList.get(8));
+            tl2Data.setElementP(dataList.get(9));
+            tl2Data.setElementMn(dataList.get(10));
+            tl2Data.setElementC(dataList.get(11));
+            tl2Data.setIronStarttime(dataList.get(12));
+            tl2Data.setIronEndtime(dataList.get(13));
+            tl2Data.setIronCosttime(Double.valueOf(dataList.get(14)).intValue());
+            tl2Data.setIronWeight(Double.parseDouble(dataList.get(15)));
+            tl2Data.setCalcWeight(Double.parseDouble(dataList.get(16)));
+            tl2Data.setSlagWeight(Double.parseDouble(dataList.get(17)));
+            tl2Data.setMudWeight(Double.parseDouble(dataList.get(18)));
+            tl2Data.setPollMm(Double.parseDouble(dataList.get(19)));
+            tl2Data.setOpenDepth(Double.parseDouble(dataList.get(20)));
+            tl2Data.setAvgTemp(Double.parseDouble(dataList.get(21)));
+//            taskExecutor.submit(() -> {
 //
+//            });
+            boolean dataResult = tl2DataService.saveOrUpdate(tl2Data);
 
+            log.info("tl2Material:{},tl2Data:{}", materialResult, dataResult);
 
+        }
     }
 
 
-    @Subscribe
-    public void onL2MaterialMessageEvent(L2Material material) {
-        TL2Material tl2Material = new TL2Material();
-        tl2Material.setIronNo(mIronNo);
-        //出铁操作
-        BeanUtils.copyProperties(material, tl2Material);
-        //将L2上料实时数据保存到数据库
-        taskExecutor.submit(() -> {
-            tl2MaterialService.save(tl2Material);
-            LambdaQueryWrapper<TL2Material> eq = new QueryWrapper<TL2Material>().lambda().eq(TL2Material::getIronNo, mIronNo);
-            List<TL2Material> materialList = tl2MaterialService.list(eq);
-            if (ObjectUtils.isNotEmpty(materialList)) {
-                //计算矿石中铁的总量
-                BigDecimal totalIron = BigDecimal.ZERO;
-                //焦炭总量
-                BigDecimal totalCoke = BigDecimal.ZERO;
-                //副原料总量
-                BigDecimal totalAsstmaterial = BigDecimal.ZERO;
-
-                for (TL2Material mater : materialList) {
-                    //干量
-                    String dryWeight = mater.getDryWeight();
-                    //矿石装入量
-                    String oreWeight = StringUtils.defaultIfBlank(mater.getOreWeight(), "0");
-                    //焦炭装入量
-                    String cokeWeight = StringUtils.defaultIfBlank(mater.getCokeWeight(), "0");
-                    //副原料装入量
-                    String asstmaterialWeight = StringUtils.defaultIfBlank(mater.getAsstmaterialWeight(), "0");
-                    //综合品味(小数)
-                    String compositeTaste = mater.getCompositeTaste();
-                    //
-                    totalIron = totalIron.add(new BigDecimal(oreWeight).multiply(new BigDecimal(compositeTaste)));
-                    totalCoke = totalCoke.add(new BigDecimal(cokeWeight));
-                    totalAsstmaterial = totalAsstmaterial.add(new BigDecimal(asstmaterialWeight));
-                }
-                //计算理论铁量
-                BigDecimal a = new BigDecimal("0.004");
-                BigDecimal b = new BigDecimal("0.002");
-
-                BigDecimal theoryWeight = calculateTheoreticalIron(totalIron, totalCoke, totalAsstmaterial, a, b);
-
-
-                TL2Data tl2Data = new TL2Data();
-                tl2Data.setIronNo(mIronNo);
-                //保存计算的理论铁量
-                tl2Data.setTheoryWeight(theoryWeight.doubleValue());
-                tl2DataService.saveOrUpdate(tl2Data);
-
-            }
-        });
-
-
-//        if (ironLoading1.get()) {
-//            BigDecimal bigDecimalNew = new BigDecimal(material.getDryWeight());
-//            mTotalDry = mTotalDry.add(bigDecimalNew);
-//        } else {
-//            mTotalDry = BigDecimal.ZERO;
-//        }
-
-    }
-
-
-    /***
-     * 计算理论铁量
-     *
-     * @param totalIron
-     * @param totalCoke
-     * @param totalAsstmaterial
-     * @param a  每吨焦炭使铁的回收率提高0.4%
-     * @param b  每吨副原料使铁的回收率0.2%
-     * @return
-     */
-    public static BigDecimal calculateTheoreticalIron(BigDecimal totalIron, BigDecimal totalCoke, BigDecimal totalAsstmaterial, BigDecimal a, BigDecimal b) {
-        // 计算焦炭和副原料对铁回收率的影响
-        BigDecimal cokeEffect = a.multiply(totalCoke).divide(totalIron, 10, BigDecimal.ROUND_HALF_UP);
-        BigDecimal asstmaterialEffect = b.multiply(totalAsstmaterial).divide(totalIron, 10, BigDecimal.ROUND_HALF_UP);
-
-        // 计算理论铁量
-        BigDecimal recoveryFactor = BigDecimal.ONE.add(cokeEffect).add(asstmaterialEffect);
-        return totalIron.multiply(recoveryFactor).setScale(2, BigDecimal.ROUND_HALF_UP);
-    }
-
 }

+ 0 - 55
taphole-l2/src/main/java/com/sckj/l2/dto/L2Data.java

@@ -2,9 +2,6 @@ package com.sckj.l2.dto;
 
 import lombok.Data;
 
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-
 /**
  * @Author feng
  * @Date 2024-12-18 上午 09:47
@@ -78,58 +75,6 @@ public class L2Data {
     //铁水平均温度
     private String avgTemp;
 
-    public void toDataStream(DataOutputStream dos) throws Exception {
-        dos.writeUTF(chargeNo);
-        dos.writeUTF(theoryWeight);
-        dos.writeUTF(loadMaterialTime);
-        dos.writeUTF(boilerId);
-        dos.writeUTF(tapholeId);
-        dos.writeUTF(ironNo);
-        dos.writeUTF(elementSi);
-        dos.writeUTF(elementS);
-        dos.writeUTF(elementTi);
-        dos.writeUTF(elementP);
-        dos.writeUTF(elementMn);
-        dos.writeUTF(elementC);
-        dos.writeUTF(ironStarttime);
-        dos.writeUTF(ironEndtime);
-        dos.writeUTF(ironCosttime);
-        dos.writeUTF(ironWeight);
-        dos.writeUTF(calcWeight);
-        dos.writeUTF(slagWeight);
-        dos.writeUTF(mudWeight);
-        dos.writeUTF(pollMm);
-        dos.writeUTF(openDepth);
-        dos.writeUTF(avgTemp);
-    }
-
-    public static L2Data fromDataStream(DataInputStream dis) throws Exception {
-        L2Data data = new L2Data();
-        data.chargeNo = dis.readUTF();
-        data.theoryWeight = dis.readUTF();
-        data.loadMaterialTime = dis.readUTF();
-        data.boilerId = dis.readUTF();
-        data.tapholeId = dis.readUTF();
-        data.ironNo = dis.readUTF();
-        data.elementSi = dis.readUTF();
-        data.elementS = dis.readUTF();
-        data.elementTi = dis.readUTF();
-        data.elementP = dis.readUTF();
-        data.elementMn = dis.readUTF();
-        data.elementC = dis.readUTF();
-        data.ironStarttime = dis.readUTF();
-        data.ironEndtime = dis.readUTF();
-        data.ironCosttime = dis.readUTF();
-        data.ironWeight = dis.readUTF();
-        data.calcWeight = dis.readUTF();
-        data.slagWeight = dis.readUTF();
-        data.mudWeight = dis.readUTF();
-        data.pollMm = dis.readUTF();
-        data.openDepth = dis.readUTF();
-        data.avgTemp = dis.readUTF();
-        return data;
-    }
-
     @Override
     public String toString() {
         return "L2Data{" +

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

@@ -31,10 +31,6 @@ public class TL2Data implements Serializable {
     @ExcelIgnore
     private Date createTime;
 
-    @ApiModelProperty(value = "id")
-    @ExcelIgnore
-    private Long id;
-
     @ApiModelProperty(value = "高炉编号")
     @ExcelIgnore
     private String boilerId;
@@ -43,7 +39,7 @@ public class TL2Data implements Serializable {
     @ExcelIgnore
     private String tapholeId;
 
-    @TableId(value = "id", type = IdType.INPUT)
+    @TableId(value = "iron_no", type = IdType.INPUT)
     @ApiModelProperty(value = "出铁次数编号")
     @ExcelProperty("出铁次数编号")
     @ColumnWidth(25)
@@ -72,7 +68,7 @@ public class TL2Data implements Serializable {
     private Double avgTemp;
 
     @ApiModelProperty(value = "泥炮量")
-    @ExcelProperty("铁水平均温度(L)")
+    @ExcelProperty("泥炮量(L)")
     @ColumnWidth(25)
     private Double mudWeight;
 
@@ -85,10 +81,6 @@ public class TL2Data implements Serializable {
     @ExcelIgnore
     private Double openDepth;
 
-    @ApiModelProperty(value = "上料总干量")
-    @ExcelIgnore
-    private Double totalDry;
-
     @ApiModelProperty(value = "开始时间")
     @ExcelIgnore
     private String ironStarttime;
@@ -99,30 +91,30 @@ public class TL2Data implements Serializable {
 
     @ApiModelProperty(value = "碳")
     @ExcelIgnore
-    private Double elementC;
+    private String elementC;
 
     @ApiModelProperty(value = "硅")
     @ExcelIgnore
-    private Double elementSi;
+    private String elementSi;
 
     @ApiModelProperty(value = "锰")
     @ExcelIgnore
-    private Double elementMn;
+    private String elementMn;
 
     @ApiModelProperty(value = "磷")
     @ExcelIgnore
-    private Double elementP;
+    private String elementP;
 
     @ApiModelProperty(value = "硫")
     @ExcelIgnore
-    private Double elementS;
+    private String elementS;
 
     @ApiModelProperty(value = "钛")
     @ExcelIgnore
-    private Double elementTi;
+    private String elementTi;
 
-    @ApiModelProperty(value = "理论铁量")
+    @ApiModelProperty(value = "估计出铁量")
     @ExcelIgnore
-    private Double theoryWeight;
+    private Double calcWeight;
 
 }

+ 5 - 59
taphole-l2/src/main/java/com/sckj/l2/entity/TL2Material.java

@@ -7,8 +7,6 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
 import java.io.Serializable;
 import java.util.Date;
 
@@ -23,66 +21,14 @@ public class TL2Material implements Serializable {
     @ApiModelProperty(value = "创建时间")
     private Date createTime;
 
-    @TableId(value = "id", type = IdType.AUTO)
-    @ApiModelProperty(value = "id")
-    private Long id;
-
-    @ApiModelProperty(value = "高炉编号")
-    private String boilerId;
-
-    @ApiModelProperty(value = "铁口区域编号")
-    private String tapholeId;
-
-    @ApiModelProperty(value = "出铁次数编号")
-    private String ironNo;
-
+    @TableId(value = "charge_no", type = IdType.INPUT)
     @ApiModelProperty(value = "L1发过来的charge号")
     private String chargeNo;
 
-    @ApiModelProperty(value = "下料时间点")
-    private String downTime;
-
-    @ApiModelProperty(value = "干量")
-    private String dryWeight;
-
-    @ApiModelProperty(value = "矿石装入量")
-    private String oreWeight;
-
-    @ApiModelProperty(value = "焦炭装入量")
-    private String cokeWeight;
-
-    @ApiModelProperty(value = "副原料装入量")
-    private String asstmaterialWeight;
-
-    @ApiModelProperty(value = "综合品味")
-    private String compositeTaste;
-
-
-    public void toDataStream(DataOutputStream dos) throws Exception {
-        dos.writeUTF(tapholeId);
-        dos.writeUTF(boilerId);
-        dos.writeUTF(chargeNo);
-        dos.writeUTF(downTime);
-        dos.writeUTF(dryWeight);
-        dos.writeUTF(oreWeight);
-        dos.writeUTF(cokeWeight);
-        dos.writeUTF(asstmaterialWeight);
-        dos.writeUTF(compositeTaste);
-    }
-
-    public static TL2Material fromDataStream(DataInputStream dis) throws Exception {
-        TL2Material data = new TL2Material();
-        data.tapholeId = dis.readUTF();
-        data.boilerId = dis.readUTF();
-        data.chargeNo = dis.readUTF();
-        data.downTime = dis.readUTF();
-        data.dryWeight = dis.readUTF();
-        data.oreWeight = dis.readUTF();
-        data.cokeWeight = dis.readUTF();
-        data.asstmaterialWeight = dis.readUTF();
-        data.compositeTaste = dis.readUTF();
-        return data;
-    }
+    @ApiModelProperty(value = "理论出铁量")
+    private String theoryWeight;
 
+    @ApiModelProperty(value = "装入时间点")
+    private String loadMaterialTime;
 
 }

+ 44 - 133
taphole-l2/src/main/java/com/sckj/l2/service/impl/L2DataServiceImpl.java

@@ -1,8 +1,6 @@
 package com.sckj.l2.service.impl;
 
 import com.google.common.eventbus.AsyncEventBus;
-import com.sckj.l2.dto.L2Data;
-import com.sckj.l2.dto.L2Properties;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@@ -10,12 +8,14 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
-import java.io.ByteArrayInputStream;
-import java.io.DataInputStream;
-import java.io.EOFException;
-import java.io.IOException;
-import java.net.*;
+import java.io.*;
+import java.net.ServerSocket;
+import java.net.Socket;
 import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * @Author feng
@@ -32,33 +32,31 @@ public class L2DataServiceImpl {
     @Resource(name = "taskExecutor")
     ThreadPoolTaskExecutor taskExecutor;
 
-    @Resource
-    L2Properties l2Properties;
 
     //客户端最大重试次数
-    private int maxRetries;
-
-    //客户端重试间隔时间(毫秒)
-    private long retryInterval;
-
-    //服务端访问地址
-    private String host;
 
     // 服务端端口/客户端访问端口
     private Integer port;
 
-    //客户端尝试连接次数
-    int attempt = 0;
 
     @PostConstruct
     public void init() {
-        maxRetries = l2Properties.getMaxRetries();
-        retryInterval = l2Properties.getRetryInterval();
-        host = l2Properties.getHost();
-        port = l2Properties.getPort();
-//        taskExecutor.submit(this::connectL2);
+        port = 4567;
         taskExecutor.submit(this::startTCPServer);
-        taskExecutor.submit(this::startUDPServer);
+    }
+
+    private static List<String> extractValues(String input) {
+        // 定义正则表达式,用于匹配整数和浮点数
+        Pattern pattern = Pattern.compile("[-+]?\\d*\\.\\d+|[-+]?\\d+");
+        Matcher matcher = pattern.matcher(input);
+        List<String> strings = new ArrayList<>();
+
+        // 遍历所有匹配到的数字
+        while (matcher.find()) {
+            String numberStr = matcher.group();
+            strings.add(numberStr);
+        }
+        return strings;
     }
 
     /**
@@ -68,46 +66,28 @@ public class L2DataServiceImpl {
         try (ServerSocket serverSocket = new ServerSocket(port)) {
             System.out.println("TCP 服务器已启动,等待客户端连接...");
             while (true) {
-                try (Socket socket = serverSocket.accept();
-                     DataInputStream dis = new DataInputStream(socket.getInputStream())) {
-                    System.out.println(LocalDateTime.now() + ",TCP客户端已连接:" + socket.getInetAddress());
-                    while (true) {
-                        // 从输入流读取L2Data对象
-                        L2Data data = L2Data.fromDataStream(dis);
-                        System.out.println(LocalDateTime.now() + "TCP接收到的数据: " + data);
-                        asyncEventBus.post(data); //L2出铁数据
-                    }
-                } catch (EOFException e) {
-                    // 客户端正常关闭连接
-                    System.out.println("TCP客户端断开连接");
-                } catch (Exception e) {
-                    System.err.println("TCP处理客户端连接时出错: " + e.getMessage());
-                    e.printStackTrace();
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /***
-     * 服务端UDP
-     */
-    public void startUDPServer() {
-        try (DatagramSocket socket = new DatagramSocket(port)) {
-            System.out.println("UDP 服务器已启动,监听端口 " + port);
-            byte[] buffer = new byte[65507];
-            while (true) {
-                DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
-                socket.receive(packet);
-                ByteArrayInputStream bais = new ByteArrayInputStream(packet.getData(), 0, packet.getLength());
-                DataInputStream dis = new DataInputStream(bais);
-                try {
-                    L2Data data = L2Data.fromDataStream(dis);
-                    System.out.println(LocalDateTime.now() + " 接收到数据: " + data);
-                    asyncEventBus.post(data); //L2出铁数据
-                } catch (Exception e) {
-                    System.err.println("反序列化数据时出错: " + e.getMessage());
+                try (
+                        Socket clientSocket = serverSocket.accept();
+                        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
+                        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()))
+                ) {
+                    System.out.println("客户端已连接:" + clientSocket.getInetAddress());
+
+                    // 读取客户端消息
+                    char[] buffer = new char[1024];
+                    int len = in.read(buffer);
+                    String received = new String(buffer, 0, len);
+                    System.out.println(LocalDateTime.now() + "收到客户端消息: " + received);
+
+                    List<String> strings = extractValues(received.trim());
+                    asyncEventBus.post(strings);
+                    // 回复客户端
+                    String response = LocalDateTime.now() + "接收客户端数据个数: " + strings.size();
+                    out.write(response);
+                    out.flush();
+                    System.out.println("已回复客户端: " + response);
+                } catch (IOException e) {
+                    System.out.println("处理客户端时出错: " + e.getMessage());
                 }
             }
         } catch (Exception e) {
@@ -116,73 +96,4 @@ public class L2DataServiceImpl {
     }
 
 
-    public Socket connect() {
-        System.out.println("TCP start connect");
-        final String serverIP = host; // 服务端IP地址
-        final int serverPort = port; // 服务端端口号
-        Socket socket = null;
-        // 连接重试机制
-        while (attempt < maxRetries) {
-            try {
-                socket = new Socket(serverIP, serverPort);
-                System.out.println("Connected to server at " + serverIP + ":" + serverPort);
-                return socket;
-            } catch (UnknownHostException e) {
-                System.err.println("Unknown host: " + serverIP);
-                break;
-            } catch (IOException e) {
-                attempt++;
-                System.err.println("Attempt " + attempt + ": Connection failed. Retrying in " + retryInterval / 1000 + " seconds...");
-                try {
-                    Thread.sleep(retryInterval);
-                } catch (InterruptedException ie) {
-                    Thread.currentThread().interrupt();
-                    System.err.println("Thread interrupted while sleeping.");
-                    break;
-                }
-            }
-        }
-
-        if (socket == null) {
-            System.err.println("Failed to connect to server after " + maxRetries + " attempts.");
-        }
-        return socket;
-    }
-
-    /***
-     * L2数据源
-     */
-    public void readObject() {
-        Socket socket = connect();
-        DataInputStream dis;
-        try {
-            dis = new DataInputStream(socket.getInputStream());
-            while (true) {
-                try {
-                    // 从输入流读取L2Data对象
-                    L2Data receivedData = L2Data.fromDataStream(dis);
-                    asyncEventBus.post(receivedData); //出铁操作
-                } catch (IOException e) {
-                    System.err.println("Connection lost. Attempting to reconnect...");
-                    socket.close();
-                    socket = null;
-                    attempt = 0;
-                    socket = connect();
-                    if (socket != null) {
-                        dis = new DataInputStream(socket.getInputStream());
-                    }
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            if (socket != null && !socket.isClosed()) {
-                try {
-                    socket.close();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-        }
-    }
 }

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

@@ -97,7 +97,7 @@ public class TL2DataServiceImpl extends ServiceImpl<TL2DataMapper, TL2Data> {
      */
     public List<TL2Data> getTappedLatest2Datas() {
         LambdaQueryWrapper<TL2Data> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.isNotNull(TL2Data::getIronNo).isNotNull(TL2Data::getIronWeight).isNotNull(TL2Data::getTheoryWeight).orderByDesc(TL2Data::getIronNo).last("limit 2");
+        queryWrapper.isNotNull(TL2Data::getIronNo).isNotNull(TL2Data::getIronWeight).isNotNull(TL2Data::getCalcWeight).orderByDesc(TL2Data::getIronNo).last("limit 2");
         List<TL2Data> list = list(queryWrapper);
         return list;
     }
@@ -120,7 +120,7 @@ public class TL2DataServiceImpl extends ServiceImpl<TL2DataMapper, TL2Data> {
      */
     public TL2Data getTappingData() {
         LambdaQueryWrapper<TL2Data> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.isNotNull(TL2Data::getIronNo).isNull(TL2Data::getIronWeight).isNotNull(TL2Data::getTheoryWeight).orderByDesc(TL2Data::getIronNo).last("limit 1");
+        queryWrapper.isNotNull(TL2Data::getIronNo).isNull(TL2Data::getIronWeight).isNotNull(TL2Data::getCalcWeight).orderByDesc(TL2Data::getIronNo).last("limit 1");
         List<TL2Data> list = list(queryWrapper);
         return ObjectUtils.isEmpty(list) ? null : list.get(0);
     }

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

@@ -1,6 +1,6 @@
 package com.sckj.opcstart;
 
-import com.sckj.opc.dataservice.OPCDAServiceImpl;
+import com.sckj.opc.dataservice.HDServiceImpl;
 import lombok.extern.log4j.Log4j2;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
@@ -22,7 +22,7 @@ import javax.annotation.Resource;
 public class TapholeOpcStartApplication {
 
     @Resource
-    OPCDAServiceImpl opcuaService;
+    HDServiceImpl opcuaService;
 
 
     @PostConstruct

+ 7 - 0
taphole-opc/pom.xml

@@ -27,6 +27,13 @@
             <scope>system</scope>
             <systemPath>${project.basedir}/src/main/resources/jar/hd-datasdk-3.9.3.jar</systemPath>
         </dependency>
+        <dependency>
+            <groupId>org.log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>1.2.13</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/src/main/resources/jar/log4j-1.2.13.jar</systemPath>
+        </dependency>
     </dependencies>
 
 </project>

+ 51 - 14
taphole-opc/src/main/java/com/sckj/opc/controller/THdTagController.java

@@ -5,9 +5,8 @@ import com.sckj.common.aop.NotLogin;
 import com.sckj.common.core.AjaxResult;
 import com.sckj.common.core.PageResult;
 import com.sckj.common.enums.ErrorEnum;
-import com.sckj.common.validate.commons.IdValidate;
+import com.sckj.common.validate.commons.LongIdValidate;
 import com.sckj.common.validate.commons.PageValidate;
-import com.sckj.common.validator.annotation.IDMust;
 import com.sckj.opc.dataservice.HDServiceImpl;
 import com.sckj.opc.entity.OPCServer;
 import com.sckj.opc.entity.THdTag;
@@ -36,7 +35,7 @@ public class THdTagController {
     HDServiceImpl hdService;
 
     @GetMapping("/list")
-    @ApiOperation(value="TAG标记列表")
+    @ApiOperation(value = "TAG标记列表")
     public AjaxResult<PageResult<THdTagListedVo>> list(@Validated PageValidate pageValidate,
                                                        @Validated THdTagSearchValidate searchValidate) {
         PageResult<THdTagListedVo> list = iTHdTagService.list(pageValidate, searchValidate);
@@ -44,15 +43,15 @@ public class THdTagController {
     }
 
     @GetMapping("/detail")
-    @ApiOperation(value="TAG标记详情")
-    public AjaxResult<THdTagDetailVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+    @ApiOperation(value = "TAG标记详情")
+    public AjaxResult<THdTagDetailVo> detail(@Validated @RequestParam("id") Long id) {
         THdTagDetailVo detail = iTHdTagService.detail(id);
         return AjaxResult.success(detail);
     }
 
     @Log(title = "TAG标记新增")
     @PostMapping("/add")
-    @ApiOperation(value="IHD标记新增")
+    @ApiOperation(value = "IHD标记新增")
     public AjaxResult<Object> add(@Validated @RequestBody THdTagCreateValidate createValidate) {
         iTHdTagService.add(createValidate);
         return AjaxResult.success();
@@ -60,7 +59,7 @@ public class THdTagController {
 
     @Log(title = "TAG标记编辑")
     @PostMapping("/edit")
-    @ApiOperation(value="IHD标记编辑")
+    @ApiOperation(value = "IHD标记编辑")
     public AjaxResult<Object> edit(@Validated @RequestBody THdTagUpdateValidate updateValidate) {
         iTHdTagService.edit(updateValidate);
         return AjaxResult.success();
@@ -68,8 +67,8 @@ public class THdTagController {
 
     @Log(title = "TAG标记删除")
     @PostMapping("/del")
-    @ApiOperation(value="IHD标记删除")
-    public AjaxResult<Object> del(@Validated @RequestBody IdValidate idValidate) {
+    @ApiOperation(value = "IHD标记删除")
+    public AjaxResult<Object> del(@Validated @RequestBody LongIdValidate idValidate) {
         iTHdTagService.del(idValidate.getId());
         return AjaxResult.success();
     }
@@ -83,10 +82,10 @@ public class THdTagController {
     @PostMapping("/connect")
     @ResponseBody
     @NotLogin
-    @ApiOperation(value = "连接")
+    @ApiOperation(value = "测试连接")
     public AjaxResult connect(OPCServer opcServer) {
         try {
-            hdService.createServer(opcServer);
+            hdService.testConnection(opcServer);
         } catch (Exception e) {
             e.printStackTrace();
             return AjaxResult.failed(e.getMessage());
@@ -95,7 +94,6 @@ public class THdTagController {
     }
 
 
-
     /**
      * @return
      * @MethodName: subscribe
@@ -146,7 +144,8 @@ public class THdTagController {
     @ApiOperation(value = "订阅")
     public AjaxResult subscribe(THdTag hdTag) {
         try {
-            return  AjaxResult.success(hdService.subscribe(hdTag));
+            hdService.subscribe(hdTag);
+            return AjaxResult.success();
         } catch (Exception e) {
             e.printStackTrace();
             return AjaxResult.failed(e.getMessage());
@@ -184,7 +183,45 @@ public class THdTagController {
     @ApiOperation(value = "读取节点数据")
     public AjaxResult readNodeValue(THdTag hdTag) {
         try {
-            return AjaxResult.success(ErrorEnum.SUCCESS.getCode(), ErrorEnum.SUCCESS.getMsg(), hdService.readNodeValue(hdTag));
+            return AjaxResult.success(ErrorEnum.SUCCESS.getCode(), ErrorEnum.SUCCESS.getMsg(), hdService.readTagValue(hdTag));
+        } catch (Exception e) {
+            e.printStackTrace();
+            return AjaxResult.failed(e.getMessage());
+        }
+    }
+
+    /**
+     * @return
+     * @MethodName: refreshTagIds
+     * @Description: 根据tagName刷新TagId
+     */
+    @PostMapping("/refreshTagIds")
+    @ResponseBody
+    @NotLogin
+    @ApiOperation(value = "根据tagName刷新TagId")
+    public AjaxResult refreshTagIds(THdTag hdTag) {
+        try {
+            hdService.refreshTagIds();
+            return AjaxResult.success();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return AjaxResult.failed(e.getMessage());
+        }
+    }
+
+    /**
+     * @return
+     * @MethodName: getBasicTagByName
+     * @Description: 根据Tag名称获取普通类型Tag对象
+     */
+    @PostMapping("/getBasicTagByName")
+    @ResponseBody
+    @NotLogin
+    @ApiOperation(value = "根据Tag名称获取普通类型Tag对象")
+    public AjaxResult getBasicTagByName(THdTag hdTag) {
+        try {
+            hdService.getBasicTagByName(hdTag);
+            return AjaxResult.success();
         } catch (Exception e) {
             e.printStackTrace();
             return AjaxResult.failed(e.getMessage());

+ 166 - 41
taphole-opc/src/main/java/com/sckj/opc/dataservice/HDServiceImpl.java

@@ -1,14 +1,18 @@
 package com.sckj.opc.dataservice;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baosight.hdsdk.HDConnectionFactory;
 import com.baosight.hdsdk.HDDataProvider;
 import com.baosight.hdsdk.HDServerFactory;
+import com.baosight.hdsdk.HDTagManager;
+import com.baosight.hdsdk.domain.data.HDBasicTag;
 import com.baosight.hdsdk.domain.data.HDDataConnection;
 import com.baosight.hdsdk.domain.data.HDDataServer;
 import com.baosight.hdsdk.domain.data.HDRecord;
 import com.baosight.hdsdk.exception.HDSdkException;
 import com.google.common.eventbus.AsyncEventBus;
+import com.sckj.common.exception.OperateException;
 import com.sckj.common.manager.ScheduledTaskManager;
 import com.sckj.opc.dto.HdTagDTO;
 import com.sckj.opc.entity.OPCServer;
@@ -19,7 +23,6 @@ import com.sckj.opc.service.THdTagServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.BeanUtils;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.PreDestroy;
@@ -46,29 +49,80 @@ public class HDServiceImpl {
     @Resource
     private AsyncEventBus asyncEventBus;
 
-    @Resource(name = "taskExecutor")
-    ThreadPoolTaskExecutor taskExecutor;
-
-
     //定时器
     @Resource
     private ScheduledTaskManager scheduledTaskManager;
 
     private ConcurrentHashMap<Long, HDDataConnection> mOPCDaClientMap = new ConcurrentHashMap<>();
 
+    //存储ihd标记的定时任务
     private Set<String> taskNameSet = new HashSet<>();
 
+    static {
+        boolean isWindows = System.getProperty("os.name").toLowerCase().contains("windows");
+
+        System.setProperty("java.library.path", isWindows ? "D:\\project\\xiha\\iron\\ihd\\win64_3.9.2_hdSDK3\\hdsdk\\executable_x64" : "/home/taphole/hdsdk/linux");
+        try {
+            java.lang.reflect.Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
+            fieldSysPath.setAccessible(true);
+            fieldSysPath.set(null, null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        final String soDir = System.getProperty("java.library.path");
+
+        System.out.println("hdsdk path >>> java.library.path:" + soDir);
+
+        if (isWindows) {
+            System.loadLibrary("hdOS");
+            System.loadLibrary("hdNetClient");
+            System.loadLibrary("hdDNAPI");
+            System.loadLibrary("hdKingAPI");
+            System.loadLibrary("hdProcComm");
+            System.loadLibrary("hdDataSDK");
+        } else {
+            final String SO_EXT = ".so.1.0.0";
+            System.load(soDir + "/" + "libhdOS" + SO_EXT);
+            System.load(soDir + "/" + "libhdNetClient" + SO_EXT);
+            System.load(soDir + "/" + "libhdKingAPI" + SO_EXT);
+            System.load(soDir + "/" + "libhdProcComm" + SO_EXT);
+            System.load(soDir + "/" + "libhdDNAPI" + SO_EXT);
+            System.load(soDir + "/" + "libhdDataSDK" + SO_EXT);
+        }
+
+
+    }
+
+
+    /**
+     * 测试连接
+     */
+    public void testConnection(OPCServer opcServer) throws HDSdkException {
+        HDDataServer server = HDServerFactory.getHDDataServer(opcServer.getIp(), opcServer.getPort(), "", opcServer.getPort());
+        HDDataConnection dataConn = null;
+        try {
+            dataConn = HDConnectionFactory.getHDDataConnection(server);
+            dataConn.loginToServer(opcServer.getUsername(), opcServer.getPassword());
+            System.out.println(dataConn);
+        } finally {
+            if (dataConn != null) {
+                log.info("ihdk connection close");
+                dataConn.dispose();
+            }
+        }
+    }
+
     /**
      * 获得基础的连接信息
      */
-    public HDDataConnection createServer(OPCServer opcServer) {
+    public HDDataConnection createConnection(OPCServer opcServer) {
         return mOPCDaClientMap.computeIfAbsent(opcServer.getId(), id -> {
             HDDataServer server = HDServerFactory.getHDDataServer(opcServer.getIp(), opcServer.getPort(), "", opcServer.getPort());
             HDDataConnection dataConn = null;
             try {
                 dataConn = HDConnectionFactory.getHDDataConnection(server);
                 dataConn.loginToServer(opcServer.getUsername(), opcServer.getPassword());
-                dataConn.dispose();
             } catch (HDSdkException e) {
                 e.printStackTrace();
             }
@@ -77,36 +131,40 @@ public class HDServiceImpl {
     }
 
 
-    public Object createSubscription(OPCServer opcServer, THdTag hdTag) {
-        StringBuilder sb = new StringBuilder();
-        if (ObjectUtils.isNotEmpty(hdTag)) {
-            scheduledTaskManager.addTask(hdTag.getTagName(), 0, hdTag.getPeriod(), TimeUnit.SECONDS, () -> {
-                HDDataConnection connection = createServer(opcServer);
-                HDDataProvider dp = new HDDataProvider(connection);
-                try {
-                    HDRecord hdRecord = dp.querySnapshotByTagID(hdTag.getTagId());
-                    asyncEventBus.post(hdRecord);
-                } catch (HDSdkException e) {
-                    e.printStackTrace();
-                    log.info("{}订阅异常:{}", hdTag.getTagName(), e.getMessage());
-                }
-            });
+    private void createSubscription(OPCServer opcServer, THdTag hdTag) {
+        if (ObjectUtils.isEmpty(opcServer) || ObjectUtils.isEmpty(hdTag)) {
+            throw new OperateException("未获取到服务器信息或未获取到标记信号");
         }
-        return sb;
+        scheduledTaskManager.addTask(hdTag.getTagName(), 0, hdTag.getPeriod(), TimeUnit.SECONDS, () -> {
+            HDDataConnection connection = createConnection(opcServer);
+            HDDataProvider dp = new HDDataProvider(connection);
+            try {
+                HDRecord hdRecord = dp.querySnapshotByTagID(hdTag.getTagId());
+                log.info("{}:{}", hdTag.getTagName(), hdRecord.toString());
+                asyncEventBus.post(hdRecord);
+            } catch (HDSdkException e) {
+                e.printStackTrace();
+                log.info("{}订阅异常:{}", hdTag.getTagName(), e.getMessage());
+            }
+        });
     }
 
-    public Object subscribe(THdTag hdTag) {
-        try {
-            HdTagDTO opcPointDTO = hdTagService.selectInfoWithServer(hdTag);
-            QueryWrapper<HdTagDTO> pointQueryWrapper = new QueryWrapper<>();
-            pointQueryWrapper.lambda().eq(HdTagDTO::getStatus, "1");
-            OPCServer opcServer = new OPCServer();
-            BeanUtils.copyProperties(opcPointDTO, opcServer);
-            return createSubscription(opcServer, opcPointDTO);
-        } catch (Exception e) {
-            e.printStackTrace();
+    /***
+     * 订阅指定节点
+     * @param hdTag
+     */
+    public void subscribe(THdTag hdTag) {
+        HdTagDTO opcPointDTO = hdTagService.selectInfoWithServer(hdTag);
+        if (ObjectUtils.isEmpty(opcPointDTO)) {
+            throw new OperateException("未查询到该节点数据");
         }
-        return null;
+
+        QueryWrapper<HdTagDTO> pointQueryWrapper = new QueryWrapper<>();
+        pointQueryWrapper.lambda().eq(HdTagDTO::getStatus, "1");
+        OPCServer opcServer = new OPCServer();
+        BeanUtils.copyProperties(opcPointDTO, opcServer);
+        opcServer.setId(opcPointDTO.getOpcServerId());
+        createSubscription(opcServer, opcPointDTO);
     }
 
 
@@ -137,7 +195,7 @@ public class HDServiceImpl {
         serverQueryWrapper.lambda().eq(OPCServer::getStatus, "1");
         List<OPCServer> opcServerList = opcServerService.list(serverQueryWrapper);
         if (ObjectUtils.isEmpty(opcServerList)) {
-            return;
+            throw new OperateException("没有可用的服务器!");
         }
         for (OPCServer opcServer : opcServerList) {
             QueryWrapper<THdTag> pointQueryWrapper = new QueryWrapper<>();
@@ -156,25 +214,91 @@ public class HDServiceImpl {
 
     /**
      * 读取节点数据
-     * <p>
-     * identifier也可以通过UaExpert客户端去查询,这个值=通道名称.设备名称.标记名称
      *
-     * @param opcPoint
+     * @param hdTag
      * @throws Exception
      */
-    public HDRecord readNodeValue(THdTag opcPoint) throws Exception {
-        HdTagDTO opcPointDTO = hdTagService.selectInfoWithServer(opcPoint);
+    public HDRecord readTagValue(THdTag hdTag) throws Exception {
+        HdTagDTO opcPointDTO = hdTagService.selectInfoWithServer(hdTag);
         if (ObjectUtils.isEmpty(opcPointDTO)) {
             return null;
         }
         OPCServer opcServer = new OPCServer();
         BeanUtils.copyProperties(opcPointDTO, opcServer);
-        HDDataConnection connection = createServer(opcServer);
+        opcServer.setId(opcPointDTO.getOpcServerId());
+        HDDataConnection connection = createConnection(opcServer);
         HDDataProvider dp = new HDDataProvider(connection);
-        HDRecord hdRecord = dp.querySnapshotByTagID(opcPoint.getTagId());
+        HDRecord hdRecord = dp.querySnapshotByTagID(hdTag.getTagId());
         return hdRecord;
     }
 
+    /***
+     * 根据tagName刷新TagId
+     */
+    public void refreshTagIds() throws HDSdkException {
+        QueryWrapper<OPCServer> serverQueryWrapper = new QueryWrapper<>();
+        serverQueryWrapper.lambda().eq(OPCServer::getType, "3");
+        List<OPCServer> opcServerList = opcServerService.list(serverQueryWrapper);
+        if (ObjectUtils.isEmpty(opcServerList)) {
+            throw new OperateException("没有可用的服务器!");
+        }
+        for (OPCServer opcServer : opcServerList) {
+            HDDataConnection connection = createConnection(opcServer);
+            if (null == connection) {
+                continue;
+            }
+            try {
+                QueryWrapper<THdTag> pointQueryWrapper = new QueryWrapper<>();
+                List<THdTag> opcPointList = hdTagService.list(pointQueryWrapper);
+                if (ObjectUtils.isNotEmpty(opcPointList)) {
+                    for (THdTag opcPoint : opcPointList) {
+                        log.info(opcPoint.getTagName());
+                        HDTagManager tagManager = connection.getTagManager();
+                        HDBasicTag basicTag = tagManager.getBasicTagByName(opcPoint.getTagName());
+                        if (ObjectUtils.isEmpty(basicTag)) {
+                            log.info("{}未查询到数据", opcPoint.getTagName());
+                            continue;
+                        }
+                        UpdateWrapper<THdTag> updateWrapper = new UpdateWrapper<>();
+                        updateWrapper.lambda()
+                                .set(THdTag::getTagId, basicTag.getId())
+                                .set(THdTag::getTagType, basicTag.getTagDataType().name())
+                                .eq(THdTag::getId, opcPoint.getId());
+                    }
+                }
+            } catch (HDSdkException e) {
+                throw new RuntimeException(e);
+            } finally {
+                connection.dispose();
+            }
+        }
+    }
+
+    /***
+     * 根据Tag名称获取普通类型Tag对象
+     */
+    public HDBasicTag getBasicTagByName(THdTag hdTag) throws HDSdkException {
+        HDBasicTag basicTag = null;
+        HdTagDTO opcPointDTO = hdTagService.selectInfoWithServer(hdTag);
+        if (ObjectUtils.isEmpty(opcPointDTO)) {
+            return basicTag;
+        }
+        OPCServer opcServer = new OPCServer();
+        BeanUtils.copyProperties(opcPointDTO, opcServer);
+        opcServer.setId(opcPointDTO.getOpcServerId());
+        HDDataConnection connection = null;
+        try {
+            connection = createConnection(opcServer);
+            HDTagManager tm = connection.getTagManager();
+            basicTag = tm.getBasicTagByName(opcPointDTO.getTagName());
+        } finally {
+            if (connection != null) {
+                connection.dispose();
+            }
+        }
+        return basicTag;
+    }
+
     @PreDestroy
     public void releaseServer() {
         if (ObjectUtils.isNotEmpty(mOPCDaClientMap)) {
@@ -188,4 +312,5 @@ public class HDServiceImpl {
         }
     }
 
+
 }

+ 2 - 2
taphole-opc/src/main/java/com/sckj/opc/service/THdTagServiceImpl.java

@@ -79,7 +79,7 @@ public class THdTagServiceImpl  extends ServiceImpl<THdTagMapper, THdTag> {
      * @return THdTag
      */
     
-    public THdTagDetailVo detail(Integer id) {
+    public THdTagDetailVo detail(Long id) {
         THdTag model = tHdTagMapper.selectOne(
                 new QueryWrapper<THdTag>()
                     .eq("id", id)
@@ -145,7 +145,7 @@ public class THdTagServiceImpl  extends ServiceImpl<THdTagMapper, THdTag> {
      * @param id 主键ID
      */
     
-    public void del(Integer id) {
+    public void del(Long id) {
         THdTag model = tHdTagMapper.selectOne(
                 new QueryWrapper<THdTag>()
                     .eq("id", id)

BIN
taphole-opc/src/main/resources/jar/log4j-1.2.13.jar


+ 7 - 1
taphole-opc/src/main/resources/mapper/HdTagMapper.xml

@@ -8,7 +8,13 @@
         from t_hd_tag a left join t_opc_server b on a.opc_server_id=b.id
         <where>
             <if test="id != null">
-                a.id = #{id}
+                and a.id = #{id}
+            </if>
+            <if test="tagId != null">
+                and a.tag_id = #{tagId}
+            </if>
+            <if test="tagName != null">
+                and a.tag_name = #{tagName}
             </if>
         </where>
         limit 1