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