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