From 07df3edd01d77d77d2653a6a9ee325e53e607955 Mon Sep 17 00:00:00 2001
From: bsw215583320 <baoshiwei121@163.com>
Date: 星期一, 04 十二月 2023 08:31:09 +0800
Subject: [PATCH] 增加opc设备维护和控制

---
 jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOpcMsgVo.java                          |   41 ++
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java |   38 ++
 jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java                                               |    2 
 jeecg-module-dry/jeecg-module-dry-api/pom.xml                                                                          |   22 +
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryOpcDeviceService.java            |   14 
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/xml/DryOpcDeviceMapper.xml            |    5 
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/runner/OpcCustomRunner.java                  |   58 +++
 jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOrderVo.java                           |    9 
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/OpcController.java                |   67 ++++
 jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeDataVo.java                       |   19 +
 jeecg-module-system/jeecg-system-start/src/main/resources/application.yml                                              |    3 
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryOpcDeviceServiceImpl.java    |   19 +
 jeecg-module-dry/jeecg-module-dry-start/src/main/resources/application.yml                                             |    2 
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/listener/InitListener.java                   |   11 
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryOpcDeviceController.java       |  205 ++++++++++++
 jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryOpcDevice.java                     |   61 +++
 jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/util/DryUtil.java                            |   19 +
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/DryOpcDeviceMapper.java               |   17 +
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryEquipmentController.java       |    9 
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/websocket/DrySocket.java                     |  296 +++++++-----------
 jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/common/CommonDict.java                       |   13 
 21 files changed, 738 insertions(+), 192 deletions(-)

diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java
index fdbb48b..cee82b0 100644
--- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java
+++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java
@@ -32,7 +32,7 @@
         FilterRegistrationBean bean = new FilterRegistrationBean();
         bean.setFilter(websocketFilter());
         //TODO 涓存椂娉ㄩ噴鎺夛紝娴嬭瘯涓嬬嚎涓妔ocket鎬绘柇鐨勯棶棰�
-        bean.addUrlPatterns("/websocket/*","/eoaSocket/*","/eoaNewChatSocket/*", "/newsWebsocket/*", "/vxeSocket/*");
+        bean.addUrlPatterns("/websocket/*","/eoaSocket/*","/eoaNewChatSocket/*", "/newsWebsocket/*", "/vxeSocket/*","/drySocket/*");
         return bean;
     }
 
diff --git a/jeecg-module-dry/jeecg-module-dry-api/pom.xml b/jeecg-module-dry/jeecg-module-dry-api/pom.xml
index d756c41..3ad456f 100644
--- a/jeecg-module-dry/jeecg-module-dry-api/pom.xml
+++ b/jeecg-module-dry/jeecg-module-dry-api/pom.xml
@@ -25,6 +25,28 @@
             <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
         </dependency>
 
+<!--        <dependency>-->
+<!--            <groupId>org.eclipse.milo</groupId>-->
+<!--            <artifactId>sdk-client</artifactId>-->
+<!--            <version>0.6.11</version>-->
+<!--        </dependency>-->
+
+<!--        <dependency>-->
+<!--            <groupId>org.eclipse.milo</groupId>-->
+<!--            <artifactId>sdk-server</artifactId>-->
+<!--            <version>0.6.11</version>-->
+<!--        </dependency>-->
+
+<!--        <dependency>-->
+<!--            <groupId>org.bouncycastle</groupId>-->
+<!--            <artifactId>bcprov-jdk15on</artifactId>-->
+<!--            <version>1.70</version>-->
+<!--        </dependency>-->
+        <dependency>
+            <groupId>com.kangaroohy</groupId>
+            <artifactId>milo-spring-boot-starter</artifactId>
+            <version>3.0.4</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
diff --git a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/common/CommonDict.java b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/common/CommonDict.java
index 0df9477..27ba9f7 100644
--- a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/common/CommonDict.java
+++ b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/common/CommonDict.java
@@ -5,5 +5,18 @@
 
 public class CommonDict {
 
+    /**
+     * 鏁呴殰瀛楀吀
+     */
     public static Map<String, String> faultDict = new HashMap<>();
+
+    /**
+     * 鎶ヨ瀛楀吀
+     */
+    public static Map<String, String> waringDict = new HashMap<>();
+
+    /**
+     * 鐘舵�佸瓧鍏�
+     */
+    public static Map<String, String> statusDict = new HashMap<>();
 }
diff --git a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryOpcDevice.java b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryOpcDevice.java
new file mode 100644
index 0000000..c963a18
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryOpcDevice.java
@@ -0,0 +1,61 @@
+package org.jeecg.modules.dry.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: dry_opc_device
+ * @Author: jeecg-boot
+ * @Date:   2023-11-28
+ * @Version: V1.0
+ */
+@Data
+@TableName("dry_opc_device")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="dry_opc_device瀵硅薄", description="dry_opc_device")
+public class DryOpcDevice implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**id*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "id")
+    private java.lang.String id;
+	/**鍚嶇О*/
+	@Excel(name = "鍚嶇О", width = 15)
+    @ApiModelProperty(value = "鍚嶇О")
+    private java.lang.String name;
+	/**鐐逛綅鏍囪瘑*/
+	@Excel(name = "鐐逛綅鏍囪瘑", width = 15)
+    @ApiModelProperty(value = "鐐逛綅鏍囪瘑")
+    private java.lang.String identifier;
+	/**鎺掑簭*/
+	@Excel(name = "鎺掑簭", width = 15)
+    @ApiModelProperty(value = "鎺掑簭")
+    private java.lang.Integer sortOrder;
+	/**绫诲瀷锛�0 鐏紝1 鎽勫儚澶达級*/
+	@Excel(name = "绫诲瀷锛�0 鐏紝1 鎽勫儚澶达級", width = 15, dicCode = "device_type")
+	@Dict(dicCode = "device_type")
+    @ApiModelProperty(value = "绫诲瀷锛�0 鐏紝1 鎽勫儚澶达級")
+    private java.lang.String type;
+	/**閫昏緫鍒犻櫎*/
+	@Excel(name = "閫昏緫鍒犻櫎", width = 15)
+    @ApiModelProperty(value = "閫昏緫鍒犻櫎")
+    private java.lang.Integer del;
+
+    @TableField(exist = false)
+    private boolean value;
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/util/DryUtil.java b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/util/DryUtil.java
new file mode 100644
index 0000000..e5cee45
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/util/DryUtil.java
@@ -0,0 +1,19 @@
+package org.jeecg.modules.dry.util;
+
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.system.util.JwtUtil;
+import org.jeecg.common.util.RedisUtil;
+import org.jeecg.common.util.SpringContextUtils;
+
+public class DryUtil {
+
+    public static String getTemporaryToken() {
+        RedisUtil redisUtil = SpringContextUtils.getBean(RedisUtil.class);
+        // 妯℃嫙鐧诲綍鐢熸垚Token
+        String token = JwtUtil.sign("admin", "b668043e3ea4bc2d");
+        // 璁剧疆Token缂撳瓨鏈夋晥鏃堕棿涓� 5 鍒嗛挓
+        redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
+        redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, 5 * 60 * 1000);
+        return token;
+    }
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOpcMsgVo.java b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOpcMsgVo.java
new file mode 100644
index 0000000..4190525
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOpcMsgVo.java
@@ -0,0 +1,41 @@
+package org.jeecg.modules.dry.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.io.Serializable;
+
+/**
+ * @Description: dry_opc_device
+ * @Author: jeecg-boot
+ * @Date:   2023-11-28
+ * @Version: V1.0
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+public class DryOpcMsgVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+
+	/**鐐逛綅鏍囪瘑*/
+    @ApiModelProperty(value = "鐐逛綅鏍囪瘑")
+    private String identifier;
+
+    /** 鐐逛綅鍊� **/
+    private boolean value;
+
+
+    public DryOpcMsgVo(String id, boolean value) {
+        this.identifier = id;
+        this.value = value;
+    }
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOrderVo.java b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOrderVo.java
index 7560b42..eafad92 100644
--- a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOrderVo.java
+++ b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOrderVo.java
@@ -159,7 +159,16 @@
     /**钂告苯闃�鐘舵�� 0锛氬叧闂� 1锛氬紑鍚�*/
     private Integer state_valve;
 
+    /**鎶ヨ**/
+    private String warning;
 
+    /**鐘舵��**/
+    private Map<String, Object> eqp_state;
+
+    /**璁惧鐘舵��**/
+    private String eqp_status;
+
+    private String level;
 
     public DryOrderVo(RealTimeDataVo realTimeDataVo) {
         this.id = IdUtil.fastSimpleUUID();
diff --git a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeDataVo.java b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeDataVo.java
index 2ad8865..9bc8ea9 100644
--- a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeDataVo.java
+++ b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeDataVo.java
@@ -8,6 +8,7 @@
 
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 @Data
 @ToString
@@ -84,7 +85,7 @@
 
 
     /**鏁呴殰**/
-    private String fault;
+    private String eqp_fault;
 
     private Integer ai_total_time;
 
@@ -111,6 +112,22 @@
     /**宸ュ崟鐘舵��*/
     private Integer workorder_status;
 
+    /**鍚勯儴浣嶇姸鎬�**/
+    private Map<String, Object> eqp_state;
+
+    /**璁惧鐘舵��**/
+    private String eqp_status;
+
+
+    /**璁惧鎶ヨ**/
+    private String eqp_warning;
+
+
+    private String level;
+
+    /**璁惧鏁呴殰**/
+   // private String fault;
+
     /**---------------------鐢熶骇璁板綍鐩稿叧瀛楁瀹氫箟---s-------------------------*/
 
     private Boolean report_flag;       // 鎻愪氦鏍囧織
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryEquipmentController.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryEquipmentController.java
index 88b8858..3a172ed 100644
--- a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryEquipmentController.java
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryEquipmentController.java
@@ -12,8 +12,10 @@
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.config.TenantContext;
 import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.RedisUtil;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.config.mybatis.MybatisPlusSaasConfig;
+import org.jeecg.modules.dry.common.CacheConstants;
 import org.jeecg.modules.dry.entity.DryEquipment;
 import org.jeecg.modules.dry.service.IDryEqpTypeService;
 import org.jeecg.modules.dry.service.IDryEquipmentService;
@@ -57,6 +59,9 @@
 	@Autowired
 	private IDryEqpTypeService dryEqpTypeService;
 
+
+	 @Autowired
+	 private RedisUtil redisUtil;
 	/**
 	 * 鍒嗛〉鍒楄〃鏌ヨ
 	 *
@@ -134,7 +139,9 @@
 	@RequiresPermissions("dry:dry_equipment:edit")
 	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
 	public Result<String> edit(@RequestBody DryEquipment dryEquipment) {
+		redisUtil.del(CacheConstants.RedisKeyEnum.EQP_MAP.getCode());
 		dryEquipmentService.updateById(dryEquipment);
+
 		return Result.OK("缂栬緫鎴愬姛!");
 	}
 
@@ -149,6 +156,7 @@
 	@RequiresPermissions("dry:dry_equipment:delete")
 	@DeleteMapping(value = "/delete")
 	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		redisUtil.del(CacheConstants.RedisKeyEnum.EQP_MAP.getCode());
 		dryEquipmentService.removeById(id);
 		return Result.OK("鍒犻櫎鎴愬姛!");
 	}
@@ -164,6 +172,7 @@
 	@RequiresPermissions("dry:dry_equipment:deleteBatch")
 	@DeleteMapping(value = "/deleteBatch")
 	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		redisUtil.del(CacheConstants.RedisKeyEnum.EQP_MAP.getCode());
 		this.dryEquipmentService.removeByIds(Arrays.asList(ids.split(",")));
 		return Result.OK("鎵归噺鍒犻櫎鎴愬姛!");
 	}
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryOpcDeviceController.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryOpcDeviceController.java
new file mode 100644
index 0000000..fdb5f5a
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryOpcDeviceController.java
@@ -0,0 +1,205 @@
+package org.jeecg.modules.dry.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.kangaroohy.milo.model.ReadWriteEntity;
+import com.kangaroohy.milo.service.MiloService;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.dry.entity.DryOpcDevice;
+import org.jeecg.modules.dry.service.IDryOpcDeviceService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+
+ /**
+ * @Description: dry_opc_device
+ * @Author: jeecg-boot
+ * @Date:   2023-11-28
+ * @Version: V1.0
+ */
+@Api(tags="dry_opc_device")
+@RestController
+@RequestMapping("/dry/dryOpcDevice")
+@Slf4j
+public class DryOpcDeviceController extends JeecgController<DryOpcDevice, IDryOpcDeviceService> {
+	@Autowired
+	private IDryOpcDeviceService dryOpcDeviceService;
+
+
+	@Autowired
+	private MiloService miloService;
+
+	
+	/**
+	 * 鍒嗛〉鍒楄〃鏌ヨ
+	 *
+	 * @param dryOpcDevice
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "dry_opc_device-鍒嗛〉鍒楄〃鏌ヨ")
+	@ApiOperation(value="dry_opc_device-鍒嗛〉鍒楄〃鏌ヨ", notes="dry_opc_device-鍒嗛〉鍒楄〃鏌ヨ")
+	@GetMapping(value = "/list")
+	public Result<IPage<DryOpcDevice>> queryPageList(DryOpcDevice dryOpcDevice,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+		QueryWrapper<DryOpcDevice> queryWrapper = QueryGenerator.initQueryWrapper(dryOpcDevice, req.getParameterMap());
+		Page<DryOpcDevice> page = new Page<DryOpcDevice>(pageNo, pageSize);
+		IPage<DryOpcDevice> pageList = dryOpcDeviceService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+
+	 @GetMapping(value = "/listAll")
+	 public Result<List<DryOpcDevice>> queryList(DryOpcDevice dryOpcDevice,
+
+													  HttpServletRequest req) {
+		 QueryWrapper<DryOpcDevice> queryWrapper = QueryGenerator.initQueryWrapper(dryOpcDevice, req.getParameterMap());
+		 queryWrapper.orderByAsc("sort_order");
+		 List<DryOpcDevice> list = dryOpcDeviceService.list(queryWrapper);
+		list.forEach(item -> {
+			try {
+				ReadWriteEntity readWriteEntity = miloService.readFromOpcUa(item.getIdentifier());
+				item.setValue((Boolean) readWriteEntity.getValue());
+			} catch (Exception e) {
+				throw new RuntimeException(e);
+			}
+		});
+		 return Result.OK(list);
+	 }
+
+	
+	/**
+	 *   娣诲姞
+	 *
+	 * @param dryOpcDevice
+	 * @return
+	 */
+	@AutoLog(value = "dry_opc_device-娣诲姞")
+	@ApiOperation(value="dry_opc_device-娣诲姞", notes="dry_opc_device-娣诲姞")
+	@RequiresPermissions("dry:dry_opc_device:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody DryOpcDevice dryOpcDevice) {
+		dryOpcDeviceService.save(dryOpcDevice);
+		return Result.OK("娣诲姞鎴愬姛锛�");
+	}
+	
+	/**
+	 *  缂栬緫
+	 *
+	 * @param dryOpcDevice
+	 * @return
+	 */
+	@AutoLog(value = "dry_opc_device-缂栬緫")
+	@ApiOperation(value="dry_opc_device-缂栬緫", notes="dry_opc_device-缂栬緫")
+	@RequiresPermissions("dry:dry_opc_device:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody DryOpcDevice dryOpcDevice) {
+		dryOpcDeviceService.updateById(dryOpcDevice);
+		return Result.OK("缂栬緫鎴愬姛!");
+	}
+	
+	/**
+	 *   閫氳繃id鍒犻櫎
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "dry_opc_device-閫氳繃id鍒犻櫎")
+	@ApiOperation(value="dry_opc_device-閫氳繃id鍒犻櫎", notes="dry_opc_device-閫氳繃id鍒犻櫎")
+	@RequiresPermissions("dry:dry_opc_device:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		dryOpcDeviceService.removeById(id);
+		return Result.OK("鍒犻櫎鎴愬姛!");
+	}
+	
+	/**
+	 *  鎵归噺鍒犻櫎
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "dry_opc_device-鎵归噺鍒犻櫎")
+	@ApiOperation(value="dry_opc_device-鎵归噺鍒犻櫎", notes="dry_opc_device-鎵归噺鍒犻櫎")
+	@RequiresPermissions("dry:dry_opc_device:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.dryOpcDeviceService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("鎵归噺鍒犻櫎鎴愬姛!");
+	}
+	
+	/**
+	 * 閫氳繃id鏌ヨ
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "dry_opc_device-閫氳繃id鏌ヨ")
+	@ApiOperation(value="dry_opc_device-閫氳繃id鏌ヨ", notes="dry_opc_device-閫氳繃id鏌ヨ")
+	@GetMapping(value = "/queryById")
+	public Result<DryOpcDevice> queryById(@RequestParam(name="id",required=true) String id) {
+		DryOpcDevice dryOpcDevice = dryOpcDeviceService.getById(id);
+		if(dryOpcDevice==null) {
+			return Result.error("鏈壘鍒板搴旀暟鎹�");
+		}
+		return Result.OK(dryOpcDevice);
+	}
+
+    /**
+    * 瀵煎嚭excel
+    *
+    * @param request
+    * @param dryOpcDevice
+    */
+    @RequiresPermissions("dry:dry_opc_device:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, DryOpcDevice dryOpcDevice) {
+        return super.exportXls(request, dryOpcDevice, DryOpcDevice.class, "dry_opc_device");
+    }
+
+    /**
+      * 閫氳繃excel瀵煎叆鏁版嵁
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    @RequiresPermissions("dry:dry_opc_device:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, DryOpcDevice.class);
+    }
+
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/OpcController.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/OpcController.java
new file mode 100644
index 0000000..fa55951
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/OpcController.java
@@ -0,0 +1,67 @@
+package org.jeecg.modules.dry.controller;
+
+import com.kangaroohy.milo.model.ReadWriteEntity;
+import com.kangaroohy.milo.service.MiloService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
+import org.eclipse.milo.opcua.stack.core.types.builtin.DataValue;
+import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId;
+import org.eclipse.milo.opcua.stack.core.types.builtin.StatusCode;
+import org.eclipse.milo.opcua.stack.core.types.builtin.Variant;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.dry.common.OPCUA;
+import org.jeecg.modules.dry.entity.DryOpcDevice;
+import org.jeecg.modules.dry.service.IDryOpcDeviceService;
+import org.jeecg.modules.dry.vo.CommandMessageVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+
+/**
+ * opc鎺у埗鍣紝鐢ㄤ簬鎺у埗鐜板満鎽勫儚澶寸數婧愶紝鐏殑寮�鍏�
+ */
+
+@Api(tags="OPC鎺у埗鍣�")
+@RestController
+@RequestMapping("/dry/opc")
+@Slf4j
+public class OpcController {
+
+    @Autowired
+    private MiloService miloService;
+
+    @Autowired
+    private IDryOpcDeviceService opcDeviceService;
+
+
+    @ApiOperation(value="鍙戦�佹帶鍒舵寚浠�", notes="鍚戞湇鍔$鍙戦�佹帶鍒舵寚浠わ紝鐢辨湇鍔$杞彂缁欐帶鍒舵ā鍧�")
+    @PostMapping("/sendWriteCommand")
+    public Result<?> sendWriteCommand(@RequestBody CommandMessageVo msgVo) throws Exception {
+
+        miloService.writeToOpcUa(ReadWriteEntity.builder()
+                .identifier(msgVo.getCode())
+                //Kep涓槸Boolean绫诲瀷
+                .value(Boolean.valueOf(msgVo.getMsg()))
+                .build());
+        return Result.OK();
+    }
+
+    @ApiOperation(value="鍙戦�佹帶鍒舵寚浠�", notes="鍚戞湇鍔$鍙戦�佹帶鍒舵寚浠わ紝鐢辨湇鍔$杞彂缁欐帶鍒舵ā鍧�")
+    @PostMapping("/initDevice")
+    public Result<?> initDevice() throws Exception {
+        List<DryOpcDevice> list = opcDeviceService.list();
+
+        list.forEach(item -> {
+
+        });
+
+        return Result.OK();
+    }
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/listener/InitListener.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/listener/InitListener.java
index 762f302..ecfd45b 100644
--- a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/listener/InitListener.java
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/listener/InitListener.java
@@ -4,8 +4,10 @@
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.io.ByteStreams;
+import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
 import org.jeecg.modules.dry.common.CacheConstants;
 import org.jeecg.modules.dry.common.CommonDict;
+import org.jeecg.modules.dry.common.OPCUA;
 import org.jeecg.modules.dry.vo.DryFault;
 import org.springframework.boot.context.event.ApplicationStartedEvent;
 import org.springframework.context.ApplicationListener;
@@ -17,10 +19,17 @@
 import java.util.List;
 import java.util.Map;
 
-@Component
+//@Component
 public class InitListener implements ApplicationListener<ApplicationStartedEvent> {
     @Override
     public void onApplicationEvent(ApplicationStartedEvent event) {
+//        try {
+//            OpcUaClient client = OPCUA.createClient();
+//            client.connect().get();
+//            OPCUA.managedSubscriptionEvent(client);
+//        } catch (Exception e) {
+//            throw new RuntimeException(e);
+//        }
         InputStream fault = getClass().getResourceAsStream("/fault.json");
         try {
             JSONObject jsonObject = JSONObject.parseObject(fault, JSONObject.class);
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/DryOpcDeviceMapper.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/DryOpcDeviceMapper.java
new file mode 100644
index 0000000..bc90d43
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/DryOpcDeviceMapper.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.dry.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.dry.entity.DryOpcDevice;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: dry_opc_device
+ * @Author: jeecg-boot
+ * @Date:   2023-11-28
+ * @Version: V1.0
+ */
+public interface DryOpcDeviceMapper extends BaseMapper<DryOpcDevice> {
+
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/xml/DryOpcDeviceMapper.xml b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/xml/DryOpcDeviceMapper.xml
new file mode 100644
index 0000000..6a6c4af
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/xml/DryOpcDeviceMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.dry.mapper.DryOpcDeviceMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/runner/OpcCustomRunner.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/runner/OpcCustomRunner.java
new file mode 100644
index 0000000..e9149dd
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/runner/OpcCustomRunner.java
@@ -0,0 +1,58 @@
+package org.jeecg.modules.dry.runner;
+
+import com.alibaba.fastjson.JSON;
+import com.kangaroohy.milo.service.MiloService;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.modules.dry.entity.DryOpcDevice;
+import org.jeecg.modules.dry.service.IDryOpcDeviceService;
+import org.jeecg.modules.dry.vo.DryOpcMsgVo;
+import org.jeecg.modules.dry.websocket.DrySocket;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+@Slf4j
+public class OpcCustomRunner implements ApplicationRunner {
+    @Autowired
+    private MiloService miloService;
+
+
+    @Autowired
+    private IDryOpcDeviceService dryOpcDeviceService;
+
+    @Autowired
+    private DrySocket drySocket;
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+
+        subscript();
+
+    }
+
+    private void subscript() throws Exception {
+        List<String> ids = new ArrayList<>();
+        List<DryOpcDevice> list = dryOpcDeviceService.list();
+        list.forEach(item -> {
+            ids.add(item.getIdentifier());
+        });
+//        ids.add("閫氶亾 1.璁惧 1.鏍囪 1");
+//        ids.add("閫氶亾 1.璁惧 1.鏍囪 2");
+//        ids.add("channel1.device1.tag1");
+//        ids.add("channel1.device1.tag2");
+//        ids.add("channel1.device1.tag3");
+//        ids.add("channel1.device1.tag4");
+//        ids.add("channel1.device1.tag5");
+//        ids.add("channel1.device1.tag6");
+        miloService.subscriptionFromOpcUa(ids, (id,value)->{
+            log.info("subscription 鐐逛綅锛歿} 璁㈤槄鍒版秷鎭細{}", id, value);
+
+            DryOpcMsgVo dryOpcMsgVo = new DryOpcMsgVo(id, (Boolean) value);
+            drySocket.pushMessage("1003", JSON.toJSONString(dryOpcMsgVo));
+        } );
+    }
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryOpcDeviceService.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryOpcDeviceService.java
new file mode 100644
index 0000000..2026d03
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryOpcDeviceService.java
@@ -0,0 +1,14 @@
+package org.jeecg.modules.dry.service;
+
+import org.jeecg.modules.dry.entity.DryOpcDevice;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: dry_opc_device
+ * @Author: jeecg-boot
+ * @Date:   2023-11-28
+ * @Version: V1.0
+ */
+public interface IDryOpcDeviceService extends IService<DryOpcDevice> {
+
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryOpcDeviceServiceImpl.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryOpcDeviceServiceImpl.java
new file mode 100644
index 0000000..be16997
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryOpcDeviceServiceImpl.java
@@ -0,0 +1,19 @@
+package org.jeecg.modules.dry.service.impl;
+
+import org.jeecg.modules.dry.entity.DryOpcDevice;
+import org.jeecg.modules.dry.mapper.DryOpcDeviceMapper;
+import org.jeecg.modules.dry.service.IDryOpcDeviceService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: dry_opc_device
+ * @Author: jeecg-boot
+ * @Date:   2023-11-28
+ * @Version: V1.0
+ */
+@Service
+public class DryOpcDeviceServiceImpl extends ServiceImpl<DryOpcDeviceMapper, DryOpcDevice> implements IDryOpcDeviceService {
+
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java
index a28e5cd..cb98cfc 100644
--- a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java
@@ -8,14 +8,21 @@
 import org.apache.mina.core.service.IoAcceptor;
 import org.apache.mina.core.service.IoHandler;
 import org.apache.mina.core.session.IoSession;
+import org.jeecg.common.api.CommonAPI;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.config.TenantContext;
+import org.jeecg.common.config.mqtoken.UserTokenContext;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.system.util.JwtUtil;
 import org.jeecg.common.util.RedisUtil;
+import org.jeecg.common.util.SpringContextUtils;
+import org.jeecg.modules.dry.api.JeecgSystemApi;
 import org.jeecg.modules.dry.common.CacheConstants;
 import org.jeecg.modules.dry.entity.*;
 import org.jeecg.modules.dry.service.*;
 import org.jeecg.modules.dry.socket.ServerHandler;
 import org.jeecg.modules.dry.socket.SocketServerConfig;
+import org.jeecg.modules.dry.util.DryUtil;
 import org.jeecg.modules.dry.vo.*;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -52,13 +59,31 @@
     private IDryProdRecordService prodRecordService;
 
     @Autowired
-    private IoAcceptor ioAcceptor;
+    private CommonAPI commonAPI;
+
+    private String token;
+
+
+
+    public String getTemporaryToken() {
+        if (token == null) {
+            RedisUtil redisUtil = SpringContextUtils.getBean(RedisUtil.class);
+            // 妯℃嫙鐧诲綍鐢熸垚Token
+            token = JwtUtil.sign("admin", "b668043e3ea4bc2d");
+            // 璁剧疆Token缂撳瓨鏈夋晥鏃堕棿涓� 5 鍒嗛挓
+            redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
+            redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, 5 * 60 * 1000);
+        }
+
+        return token;
+    }
 
     @Override
     @Transactional
     public Result<?> realTimeDataHandle(RealTimeDataVo realTimeDataVo) {
         TenantContext.setTenant(realTimeDataVo.getTenantid()+"");
         log.info("瀹炴椂鏁版嵁锛�"+realTimeDataVo.toString());
+
 
         // 1 鏌ヨ鎴栧垱寤哄伐鍗�
         // 1.1 浠巖edis鍙栧嚭宸ュ崟缂撳瓨
@@ -99,12 +124,12 @@
         orderVo.setState_windbox(realTimeDataVo.getState_windbox());
         orderVo.setState_valve(realTimeDataVo.getState_valve());
         orderVo.setOrderStatus(realTimeDataVo.getWorkorder_status());
+        orderVo.setEqp_status(realTimeDataVo.getEqp_status());
+        orderVo.setEqp_state(realTimeDataVo.getEqp_state());
+        orderVo.setWarning(realTimeDataVo.getEqp_warning());
+        orderVo.setFault(realTimeDataVo.getEqp_fault());
+        orderVo.setLevel(realTimeDataVo.getLevel());
 
-        String fault = realTimeDataVo.getFault();
-//        String[] split = fault.split(",");
-//        for (String s : split) {
-//
-//        }
 
         DryOrderTrendVo trendVo = new DryOrderTrendVo(realTimeDataVo);
         // 2.2 淇濆瓨宸ュ崟鍚按鐜囧彉鍖� 鎴� 閲嶉噺鍙樺寲
@@ -293,6 +318,7 @@
 
 
         LambdaQueryWrapper<DryEquipment> queryWrapper = new LambdaQueryWrapper<>();
+
         queryWrapper.eq(DryEquipment::getTenantId, realTimeDataVo.getTenantid());
         queryWrapper.eq(DryEquipment::getEnable, "Y");
 
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/websocket/DrySocket.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/websocket/DrySocket.java
index 6103217..8b908b6 100644
--- a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/websocket/DrySocket.java
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/websocket/DrySocket.java
@@ -1,214 +1,146 @@
 package org.jeecg.modules.dry.websocket;
 
-import cn.hutool.core.bean.BeanUtil;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
-import org.jeecg.common.constant.DrySocketConst;
-import org.jeecg.common.util.SpringContextUtils;
-import org.jeecg.modules.dry.service.IDryRealTimeDataService;
-import org.jeecg.modules.dry.vo.RealTimeDataVo;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.jeecg.common.constant.WebsocketConst;
 import org.springframework.stereotype.Component;
 
-import javax.websocket.OnClose;
-import javax.websocket.OnMessage;
-import javax.websocket.OnOpen;
-import javax.websocket.Session;
+import javax.websocket.*;
 import javax.websocket.server.PathParam;
 import javax.websocket.server.ServerEndpoint;
-import java.util.Collection;
-import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
-@Slf4j
+/**
+ * @Author scott
+ * @Date 2019/11/29 9:41
+ * @Description: 姝ゆ敞瑙g浉褰撲簬璁剧疆璁块棶URL
+ */
 @Component
-@ServerEndpoint("/drySocket/{tenantId}/{machineId}")
+@Slf4j
+@ServerEndpoint("/drySocket/{tenantId}")
 public class DrySocket {
+    
+    /**绾跨▼瀹夊叏Map*/
+    private static ConcurrentHashMap<String, Session> sessionPool = new ConcurrentHashMap<>();
 
-    /**
-     * 褰撳墠 session
-     */
-    private Session session;
-    /**
-     * 褰撳墠绉熸埛id
-     */
-    private String tenantId;
-    /**
-     * 璁惧id锛岀敤浜庢爣璇嗗悓涓�绉熸埛锛屼笉鍚岃澶囩殑鏁版嵁
-     */
-    private String machineId;
-    /**
-     * 褰撳墠socket鍞竴id
-     */
-    private String socketId;
 
-    /**
-     * 绉熸埛杩炴帴姹狅紝鍖呭惈鍗曚釜绉熸埛鐨勬墍鏈塻ocket杩炴帴锛�
-     * 鍥犱负涓�涓鎴峰彲鑳芥墦寮�澶氫釜璁惧锛屽涓澶囧氨浼氭湁澶氫釜杩炴帴锛�
-     * key鏄痶enantId锛寁alue鏄疢ap瀵硅薄锛涘瓙Map鐨刱ey鏄痬achineId锛寁alue鏄痙rySocket瀵硅薄
-     */
-    private static Map<String, Map<String, DrySocket>> tenantPool = new HashMap<>();
-    /**
-     * 杩炴帴姹狅紝鍖呭惈鎵�鏈塛ebSocket杩炴帴锛�
-     * key鏄痵ocketId锛寁alue鏄痙rySocket瀵硅薄
-     */
-    private static Map<String, DrySocket> machinePool = new HashMap<>();
 
-    /**
-     * 鑾峰彇鏌愪釜绉熸埛鎵�鏈夌殑璁惧
-     */
-    public static Map<String, DrySocket> getTenantPool(String tenantId) {
-        return tenantPool.computeIfAbsent(tenantId, k -> new HashMap<>(5));
-    }
 
-    /**
-     * 鍚戝綋鍓嶇鎴峰彂閫佹秷鎭�
-     *
-     * @param message 娑堟伅鍐呭
-     */
-    public void sendMessage(String message) {
-        try {
-            this.session.getAsyncRemote().sendText(message);
-        } catch (Exception e) {
-            log.error("銆恉rySocket銆戞秷鎭彂閫佸け璐ワ細" + e.getMessage());
-        }
-    }
-
-    /**
-     * 灏佽娑堟伅json
-     *
-     * @param data 娑堟伅鍐呭
-     */
-    public static String packageMessage(String type, Object data) {
-        JSONObject message = new JSONObject();
-        message.put(DrySocketConst.TYPE, type);
-        message.put(DrySocketConst.DATA, data);
-        return message.toJSONString();
-    }
-
-    /**
-     * 鍚戞寚瀹氱鎴风殑鎵�鏈夎澶囧彂閫佹秷鎭�
-     *
-     * @param tenantId  鎺ユ敹娑堟伅鐨勭鎴稩D
-     * @param message 娑堟伅鍐呭
-     */
-    public static void sendMessageTo(String tenantId, String message) {
-        Collection<DrySocket> values = getTenantPool(tenantId).values();
-        if (values.size() > 0) {
-            for (DrySocket socketItem : values) {
-                socketItem.sendMessage(message);
-            }
-        } else {
-            log.warn("銆恉rySocket銆戞秷鎭彂閫佸け璐ワ細tenantId\"" + tenantId + "\"涓嶅瓨鍦ㄦ垨鏈湪绾匡紒");
-        }
-    }
-
-    /**
-     * 鍚戞寚瀹氱鎴风殑鎸囧畾璁惧鍙戦�佹秷鎭�
-     *
-     * @param tenantId  鎺ユ敹娑堟伅鐨勭鎴稩D
-     * @param message 娑堟伅鍐呭
-     */
-    public static void sendMessageTo(String tenantId, String machineId, String message) {
-        DrySocket socketItem = getTenantPool(tenantId).get(machineId);
-        if (socketItem != null) {
-            socketItem.sendMessage(message);
-        } else {
-            log.warn("銆恉rySocket銆戞秷鎭彂閫佸け璐ワ細tenantId\"" + tenantId + "\"鐨刴achineId\"" + machineId + "\"涓嶅瓨鍦ㄦ垨鏈湪绾匡紒");
-        }
-    }
-
-    /**
-     * 鍚戝涓鎴风殑鎵�鏈夎澶囧彂閫佹秷鎭�
-     *
-     * @param tenantIds 鎺ユ敹娑堟伅鐨勭鎴稩D鏁扮粍
-     * @param message 娑堟伅鍐呭
-     */
-    public static void sendMessageTo(String[] tenantIds, String message) {
-        for (String tenantId : tenantIds) {
-            DrySocket.sendMessageTo(tenantId, message);
-        }
-    }
-
-    /**
-     * 鍚戞墍鏈夌鎴风殑鎵�鏈夎澶囧彂閫佹秷鎭�
-     *
-     * @param message 娑堟伅鍐呭
-     */
-    public static void sendMessageToAll(String message) {
-        for (DrySocket socketItem : machinePool.values()) {
-            socketItem.sendMessage(message);
-        }
-    }
-
-    /**
-     * websocket 寮�鍚繛鎺�
-     */
+    //==========銆恮ebsocket鎺ュ彈銆佹帹閫佹秷鎭瓑鏂规硶 鈥斺�� 鍏蜂綋鏈嶅姟鑺傜偣鎺ㄩ�亀s娑堟伅銆�========================================================================================
     @OnOpen
-    public void onOpen(Session session, @PathParam("tenantId") String tenantId, @PathParam("machineId") String machineId) {
+    public void onOpen(Session session, @PathParam(value = "tenantId") String tenantId) {
         try {
-            this.tenantId = tenantId;
-            this.machineId = machineId;
-            this.socketId = tenantId + machineId;
-            this.session = session;
-
-            machinePool.put(this.socketId, this);
-            getTenantPool(tenantId).put(this.machineId, this);
-
-            log.info("銆恉rySocket銆戞湁鏂扮殑杩炴帴锛屾�绘暟涓�:" + machinePool.size());
-        } catch (Exception ignored) {
+            sessionPool.put(tenantId, session);
+            log.info("銆愮郴缁� WebSocket銆戞湁鏂扮殑杩炴帴锛屾�绘暟涓�:" + sessionPool.size());
+        } catch (Exception e) {
         }
     }
 
-    /**
-     * websocket 鏂紑杩炴帴
-     */
     @OnClose
-    public void onClose() {
+    public void onClose(@PathParam("tenantId") String tenantId) {
         try {
-            machinePool.remove(this.socketId);
-            getTenantPool(this.tenantId).remove(this.machineId);
-
-            log.info("銆恉rySocket銆戣繛鎺ユ柇寮�锛屾�绘暟涓�:" + machinePool.size());
-        } catch (Exception ignored) {
+            sessionPool.remove(tenantId);
+            log.info("銆愮郴缁� WebSocket銆戣繛鎺ユ柇寮�锛屾�绘暟涓�:" + sessionPool.size());
+        } catch (Exception e) {
+            e.printStackTrace();
         }
     }
 
     /**
-     * websocket 鏀跺埌娑堟伅
+     * ws鎺ㄩ�佹秷鎭�
+     *
+     * @param tenantId
+     * @param message
+     */
+    public void pushMessage(String tenantId, String message) {
+        for (Map.Entry<String, Session> item : sessionPool.entrySet()) {
+            //userId key鍊�= {鐢ㄦ埛id + "_"+ 鐧诲綍token鐨刴d5涓瞹
+            //TODO vue2鏈敼key鏂拌鍒欙紝鏆傛椂涓嶅奖鍝嶉�昏緫
+            if (item.getKey().contains(tenantId)) {
+                Session session = item.getValue();
+                try {
+                    //update-begin-author:taoyan date:20211012 for: websocket鎶ラ敊 https://gitee.com/jeecg/jeecg-boot/issues/I4C0MU
+                    synchronized (session){
+                        log.info("銆愮郴缁� WebSocket銆戞帹閫佸崟浜烘秷鎭�:" + message);
+                        session.getBasicRemote().sendText(message);
+                    }
+                    //update-end-author:taoyan date:20211012 for: websocket鎶ラ敊 https://gitee.com/jeecg/jeecg-boot/issues/I4C0MU
+                } catch (Exception e) {
+                    log.error(e.getMessage(),e);
+                }
+            }
+        }
+    }
+
+    /**
+     * ws閬嶅巻缇ゅ彂娑堟伅
+     */
+    public void pushMessage(String message) {
+        try {
+            for (Map.Entry<String, Session> item : sessionPool.entrySet()) {
+                try {
+                    item.getValue().getAsyncRemote().sendText(message);
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                }
+            }
+            log.info("銆愮郴缁� WebSocket銆戠兢鍙戞秷鎭�:" + message);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+    }
+
+
+    /**
+     * ws鎺ュ彈瀹㈡埛绔秷鎭�
      */
     @OnMessage
-    public void onMessage(String message) {
-        log.info("銆恉rySocket銆憃nMessage:" + message);
-        IDryRealTimeDataService realTimeDataService = SpringContextUtils.getBean(IDryRealTimeDataService.class);
-        JSONObject json;
-        try {
-            json = JSON.parseObject(message);
-        } catch (Exception e) {
-            log.warn("銆恉rySocket銆戞敹鍒颁笉鍚堟硶鐨勬秷鎭�:" + message);
-            return;
+    public void onMessage(String message, @PathParam(value = "tenantId") String tenantId) {
+        if(!"ping".equals(message) && !WebsocketConst.CMD_CHECK.equals(message)){
+            log.info("銆愮郴缁� WebSocket銆戞敹鍒板鎴风娑堟伅:" + message);
+        }else{
+            log.debug("銆愮郴缁� WebSocket銆戞敹鍒板鎴风娑堟伅:" + message);
         }
-        String type = json.getString(DrySocketConst.TYPE);
-        switch (type) {
-            // 蹇冭烦妫�娴�
-            case DrySocketConst.TYPE_HB:
-                this.sendMessage(DrySocket.packageMessage(type, true));
-                break;
-            // 瀹炴椂鏁版嵁澶勭悊
-            case DrySocketConst.TYPE_RDT:
-                Object o = json.get(DrySocketConst.DATA);
-                RealTimeDataVo realTimeDataVo = BeanUtil.toBean(o, RealTimeDataVo.class);
-                realTimeDataService.realTimeDataHandle(realTimeDataVo);
-                break;
-
-            default:
-                log.warn("銆恉rySocket銆戞敹鍒颁笉璇嗗埆鐨勬秷鎭被鍨�:" + type);
-                break;
-        }
-
-
+        
+//        //------------------------------------------------------------------------------
+//        JSONObject obj = new JSONObject();
+//        //涓氬姟绫诲瀷
+//        obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_CHECK);
+//        //娑堟伅鍐呭
+//        obj.put(WebsocketConst.MSG_TXT, "蹇冭烦鍝嶅簲");
+//        this.pushMessage(userId, obj.toJSONString());
+//        //------------------------------------------------------------------------------
     }
 
+    /**
+     * 閰嶇疆閿欒淇℃伅澶勭悊
+     *
+     * @param session
+     * @param t
+     */
+    @OnError
+    public void onError(Session session, Throwable t) {
+        log.warn("銆愮郴缁� WebSocket銆戞秷鎭嚭鐜伴敊璇�");
+        t.printStackTrace();
+    }
+    //==========銆愮郴缁� WebSocket鎺ュ彈銆佹帹閫佹秷鎭瓑鏂规硶 鈥斺�� 鍏蜂綋鏈嶅姟鑺傜偣鎺ㄩ�亀s娑堟伅銆�========================================================================================
+    
 
-}
+    //==========銆愰噰鐢╮edis鍙戝竷璁㈤槄妯″紡鈥斺�旀帹閫佹秷鎭��========================================================================================
+
+
+
+    /**
+     * 姝や负鍗曠偣娑堟伅(澶氫汉) redis
+     *
+     * @param userIds
+     * @param message
+     */
+//    public void sendMessage(String[] userIds, String message) {
+//        for (String userId : userIds) {
+//            sendMessage(userId, message);
+//        }
+//    }
+    //=======銆愰噰鐢╮edis鍙戝竷璁㈤槄妯″紡鈥斺�旀帹閫佹秷鎭��==========================================================================================
+    
+}
\ No newline at end of file
diff --git a/jeecg-module-dry/jeecg-module-dry-start/src/main/resources/application.yml b/jeecg-module-dry/jeecg-module-dry-start/src/main/resources/application.yml
index 0c515c9..059f5f3 100644
--- a/jeecg-module-dry/jeecg-module-dry-start/src/main/resources/application.yml
+++ b/jeecg-module-dry/jeecg-module-dry-start/src/main/resources/application.yml
@@ -14,4 +14,4 @@
       discovery:
         server-addr: ${spring.cloud.nacos.config.server-addr}
     inetutils:
-      preferred-networks: 192.168
\ No newline at end of file
+      preferred-networks: 192.168
diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/application.yml b/jeecg-module-system/jeecg-system-start/src/main/resources/application.yml
index 2cf6c0d..02c8ca3 100644
--- a/jeecg-module-system/jeecg-system-start/src/main/resources/application.yml
+++ b/jeecg-module-system/jeecg-system-start/src/main/resources/application.yml
@@ -3,3 +3,6 @@
     name: jeecg-system
   profiles:
     active: '@profile.name@'
+  cloud:
+    inetutils:
+      preferred-networks: 192.168

--
Gitblit v1.9.3