From 4fdaadee653672e7901a53add5c9147f2da2d541 Mon Sep 17 00:00:00 2001 From: gaoyutao Date: Tue, 21 Oct 2025 18:28:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/RemoteRevenueConfigService.java | 9 + .../ruoyi/system/api/domain/NetworkInfo.java | 32 + .../api/domain/RmRegisterMsgRemote.java | 21 + .../domain/RmResourceRegistrationRemote.java | 44 + .../RemoteRevenueConfigFallbackFactory.java | 5 + .../com/ruoyi/common/core/enums/MsgEnum.java | 4 + .../RmResourceRegistrationController.java | 24 + .../com/ruoyi/system/domain/vo/RspVo.java | 15 + .../IRmResourceRegistrationService.java | 8 + .../RmResourceRegistrationServiceImpl.java | 77 ++ .../system/RmResourceRegistrationMapper.xml | 11 + .../rocketmq/consumer/RocketMsgListener.java | 10 + .../domain/NetworkInfoDeserializer.java | 34 + .../rocketmq/domain/vo/RegisterMsgVo.java | 26 + .../ruoyi/rocketmq/enums/MessageCodeEnum.java | 2 + .../ruoyi/rocketmq/enums/MessageTopic.java | 2 +- .../rocketmq/handler/MessageHandler.java | 947 ++++++++++++++++++ .../mapper/RmMonitorPolicyMapper.java | 10 +- .../mapper/RmNetworkInterfaceMapper.java | 5 +- .../service/IRmMonitorPolicyService.java | 8 + .../service/IRmNetworkInterfaceService.java | 10 +- .../impl/RmMonitorPolicyServiceImpl.java | 30 + .../impl/RmNetworkInterfaceServiceImpl.java | 15 +- .../mapper/rocketmq/RmMonitorPolicyMapper.xml | 13 +- .../rocketmq/RmNetworkInterfaceMapper.xml | 20 + 25 files changed, 1373 insertions(+), 9 deletions(-) create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/NetworkInfo.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/RmRegisterMsgRemote.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RspVo.java create mode 100644 ruoyi-rocketmq/src/main/java/com/ruoyi/rocketmq/domain/NetworkInfoDeserializer.java create mode 100644 ruoyi-rocketmq/src/main/java/com/ruoyi/rocketmq/domain/vo/RegisterMsgVo.java create mode 100644 ruoyi-rocketmq/src/main/java/com/ruoyi/rocketmq/handler/MessageHandler.java diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteRevenueConfigService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteRevenueConfigService.java index 7a83df8..a35bc31 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteRevenueConfigService.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteRevenueConfigService.java @@ -98,4 +98,13 @@ public interface RemoteRevenueConfigService @PostMapping("/switchManagement/getSwitchNameByClientId") public R> getSwitchNameByClientId(@RequestBody RmSwitchManagementRemote rmSwitchManagementRemote, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + /** + * 自动注册 + * @param rmRegisterMsgRemote + * @param source + * @return + */ + @PostMapping("/registration/innerAddRegist") + public R innerAddRegist(@RequestBody RmRegisterMsgRemote rmRegisterMsgRemote, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/NetworkInfo.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/NetworkInfo.java new file mode 100644 index 0000000..002f6d7 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/NetworkInfo.java @@ -0,0 +1,32 @@ +package com.ruoyi.system.api.domain; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +@Data +public class NetworkInfo { + // 运营商 + @JsonProperty("carrier") + private String carrier; + // 市 + @JsonProperty("city") + private String city; + // 网关 + @JsonProperty("gateway") + private String gateway; + // IPv4 地址 + @JsonProperty("ipv4") + private String ipv4; + // MAC 地址 + @JsonProperty("mac") + private String mac; + // 接口名称:eth0, enp3s0 + @JsonProperty("name") + private String name; + // 省 + @JsonProperty("province") + private String province; + // 公网 IP + @JsonProperty("publicIp") + private String publicIp; +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/RmRegisterMsgRemote.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/RmRegisterMsgRemote.java new file mode 100644 index 0000000..9203345 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/RmRegisterMsgRemote.java @@ -0,0 +1,21 @@ +package com.ruoyi.system.api.domain; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class RmRegisterMsgRemote { + @JsonProperty("clientId") + private String clientId; + + @JsonProperty("sn") + private String sn; + + @JsonProperty("networkInfo") + private List networkInfo; + + @JsonProperty("timestamp") + private long timestamp; +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/RmResourceRegistrationRemote.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/RmResourceRegistrationRemote.java index 4402ffb..25e2f9f 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/RmResourceRegistrationRemote.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/RmResourceRegistrationRemote.java @@ -127,5 +127,49 @@ public class RmResourceRegistrationRemote extends BaseEntity private String monitorItems; /** 自动发现项 */ private String discoveryRules; + /** + * 客户端ID + */ + private String clientId; + + /** + * 运营商 + */ + private String operator; + + /** + * 省 + */ + private String province; + + /** + * 公网IP + */ + private String publicIp; + + /** + * 业务名称 + */ + private String businessName; + + /** + * 逻辑节点标识 + */ + private String logicalNodeId; + + /** + * 多公网IP状态 + */ + private String multiPublicIpStatus; + + /** + * 心跳次数 + */ + private Integer heartbeatCount; + + /** + * 心跳周期(单位:秒) + */ + private Integer heartbeatInterval; } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteRevenueConfigFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteRevenueConfigFallbackFactory.java index 181945f..47cea24 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteRevenueConfigFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteRevenueConfigFallbackFactory.java @@ -71,6 +71,11 @@ public class RemoteRevenueConfigFallbackFactory implements FallbackFactory> getSwitchNameByClientId(RmSwitchManagementRemote rmSwitchManagementRemote, String source) { return R.fail("根据clientId获取交换机信息失败" + throwable.getMessage()); } + + @Override + public R innerAddRegist(RmRegisterMsgRemote rmRegisterMsgRemote, String source) { + return R.fail("自动注册失败" + throwable.getMessage()); + } }; } } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/MsgEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/MsgEnum.java index 4c58c1c..a00654d 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/MsgEnum.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/MsgEnum.java @@ -15,6 +15,10 @@ public enum MsgEnum { 多公网IP探测("PUBLICIPDETECT"), + 获取最新策略("GET_POLICY"), + + 获取最新策略应答("GET_POLICY_RSP"), + 注册("REGISTER"), 注册应答("REGISTER_RSP"), diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/RmResourceRegistrationController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/RmResourceRegistrationController.java index 40d1246..3da5805 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/RmResourceRegistrationController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/RmResourceRegistrationController.java @@ -10,6 +10,7 @@ import com.ruoyi.common.log.annotation.Log; import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.security.annotation.InnerAuth; import com.ruoyi.common.security.annotation.RequiresPermissions; +import com.ruoyi.system.api.domain.RmRegisterMsgRemote; import com.ruoyi.system.domain.RmResourceRegistration; import com.ruoyi.system.service.IRmResourceRegistrationService; import org.springframework.beans.factory.annotation.Autowired; @@ -165,5 +166,28 @@ public class RmResourceRegistrationController extends BaseController List list = rmResourceRegistrationService.selectRmResourceRegistrationList(rmResourceRegistration); return R.ok(list.get(0)); } + /** + * 查询资源注册列表 + */ + @RequiresPermissions("system:registration:list") + @PostMapping("/getRegistList") + public AjaxResult getRegistList(@RequestBody RmResourceRegistration rmResourceRegistration) + { + List list = rmResourceRegistrationService.selectRmResourceRegistrationList(rmResourceRegistration); + return success(list); + } + + /** + * 自动注册服务器 + * @param rmResourceRegistration mq接收的消息 + * @return + */ + @PostMapping("/innerAddRegist") + @InnerAuth + public R innerAddRegist(@RequestBody RmRegisterMsgRemote rmResourceRegistration) + { + int rows = rmResourceRegistrationService.innerAddRegist(rmResourceRegistration); + return R.ok(rows); + } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RspVo.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RspVo.java new file mode 100644 index 0000000..6b0eb69 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RspVo.java @@ -0,0 +1,15 @@ +package com.ruoyi.system.domain.vo; + +import lombok.Data; + +import java.time.Instant; + +@Data +public class RspVo { + /** 状态码,0、失败;1、成功*/ + private int resCode; + /** 描述 */ + private String resMag; + /** 时间戳 */ + private long timestamp = Instant.now().getEpochSecond(); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/IRmResourceRegistrationService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/IRmResourceRegistrationService.java index 368bbd8..d42d78c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/IRmResourceRegistrationService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/IRmResourceRegistrationService.java @@ -2,6 +2,7 @@ package com.ruoyi.system.service; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; +import com.ruoyi.system.api.domain.RmRegisterMsgRemote; import com.ruoyi.system.domain.RmResourceRegistration; import java.util.List; @@ -90,4 +91,11 @@ public interface IRmResourceRegistrationService AjaxResult getServerOnlineRate(); List getRegistrationByIds(String[] ids); + + /** + * 自动注册 + * @param rmResourceRegistration + * @return + */ + int innerAddRegist(RmRegisterMsgRemote rmResourceRegistration); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RmResourceRegistrationServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RmResourceRegistrationServiceImpl.java index 3fbce3f..ef66db9 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RmResourceRegistrationServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RmResourceRegistrationServiceImpl.java @@ -8,22 +8,27 @@ import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.RemoteRocketMqService; +import com.ruoyi.system.api.domain.NetworkInfo; +import com.ruoyi.system.api.domain.RmRegisterMsgRemote; import com.ruoyi.system.domain.EpsNodeBandwidth; import com.ruoyi.system.domain.EpsServerRevenueConfig; import com.ruoyi.system.domain.RmEpsTopologyManagement; import com.ruoyi.system.domain.RmResourceRegistration; import com.ruoyi.system.domain.vo.MessageVo; import com.ruoyi.system.domain.vo.ResourceVo; +import com.ruoyi.system.domain.vo.RspVo; import com.ruoyi.system.mapper.EpsNodeBandwidthMapper; import com.ruoyi.system.mapper.EpsServerRevenueConfigMapper; import com.ruoyi.system.mapper.RmEpsTopologyManagementMapper; import com.ruoyi.system.mapper.RmResourceRegistrationMapper; import com.ruoyi.system.service.IRmResourceRegistrationService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -35,6 +40,7 @@ import java.util.Map; * @date 2025-08-12 */ @Service +@Slf4j public class RmResourceRegistrationServiceImpl implements IRmResourceRegistrationService { @Autowired @@ -350,5 +356,76 @@ public class RmResourceRegistrationServiceImpl implements IRmResourceRegistratio return rmResourceRegistrationMapper.getRegistrationByIds(ids); } + /** + * 自动注册 + * @param registerMsg + * @return + */ + @Override + public int innerAddRegist(RmRegisterMsgRemote registerMsg) { + // 解析mq接收的消息 + // 时间戳转换 + long timestamp = registerMsg.getTimestamp(); + long millis = timestamp * 1000; + Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒 + String timeStr = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", createTime); + List networkInfoList = registerMsg.getNetworkInfo(); + if(!networkInfoList.isEmpty()){ + // 查询此数据是否存在 + RmResourceRegistration queryParam = new RmResourceRegistration(); + queryParam.setClientId(registerMsg.getClientId()); + RmResourceRegistration exits = rmResourceRegistrationMapper.selectRegistMsgByClientId(queryParam); + if(exits == null){ + // 构建服务器信息 + RmResourceRegistration insertData = new RmResourceRegistration(); + try { + // 如果网卡信息只有1条,自动绑定多公网IP + if(networkInfoList.size()==1){ + insertData.setClientId(registerMsg.getClientId()); + insertData.setHardwareSn(registerMsg.getSn()); + insertData.setRegistrationStatus("1"); + insertData.setMultiPublicIpStatus("1"); + insertData.setResourceType("1"); + insertData.setCreateTime(createTime); + rmResourceRegistrationMapper.insertRmResourceRegistration(insertData); + }else{ + insertData.setClientId(registerMsg.getClientId()); + insertData.setHardwareSn(registerMsg.getSn()); + insertData.setRegistrationStatus("0"); + insertData.setMultiPublicIpStatus("0"); + insertData.setResourceType("1"); + insertData.setCreateTime(createTime); + rmResourceRegistrationMapper.insertRmResourceRegistration(insertData); + } + // 构建注册应答信息 + MessageVo messageVo = new MessageVo(); + messageVo.setClientId(registerMsg.getClientId()); + messageVo.setDataType(MsgEnum.注册应答.getValue()); + RspVo rspVo = new RspVo(); + rspVo.setResCode(1); + rspVo.setResMag("注册成功"); + messageVo.setData(JSONObject.toJSONString(rspVo)); + remoteRocketMqService.sendAsyncProducerMessage( + "tr_agent_down", "", "", JSONObject.toJSONString(messageVo), SecurityConstants.INNER + ); + }catch (Exception e){ + log.error("注册服务器失败:{}",e.getMessage()); + // 构建注册应答信息 + MessageVo messageVo = new MessageVo(); + messageVo.setClientId(registerMsg.getClientId()); + messageVo.setDataType(MsgEnum.注册应答.getValue()); + RspVo rspVo = new RspVo(); + rspVo.setResCode(1); + rspVo.setResMag("平台错误信息:" + e.getMessage()); + messageVo.setData(JSONObject.toJSONString(rspVo)); + remoteRocketMqService.sendAsyncProducerMessage( + "tr_agent_down", "", "", JSONObject.toJSONString(messageVo), SecurityConstants.INNER + ); + } + } + } + return 1; + } + } diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/RmResourceRegistrationMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/RmResourceRegistrationMapper.xml index 8df0f5f..b8e0c4d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/RmResourceRegistrationMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/RmResourceRegistrationMapper.xml @@ -331,6 +331,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" updater_name = #{updaterName}, where hardware_sn = #{hardwareSn} + + + hardware_sn = #{hardwareSn} + + + client_id = #{clientId} + + + 1=0 + + + + + and resource_type = #{resourceType} + and priority = #{priority} + and status = #{status} + + FIND_IN_SET(#{deployDevice}, REPLACE(deploy_device, '\n', ',')) > 0 + + + limit 1 + \ No newline at end of file diff --git a/ruoyi-rocketmq/src/main/resources/mapper/rocketmq/RmNetworkInterfaceMapper.xml b/ruoyi-rocketmq/src/main/resources/mapper/rocketmq/RmNetworkInterfaceMapper.xml index 626f363..1f6597e 100644 --- a/ruoyi-rocketmq/src/main/resources/mapper/rocketmq/RmNetworkInterfaceMapper.xml +++ b/ruoyi-rocketmq/src/main/resources/mapper/rocketmq/RmNetworkInterfaceMapper.xml @@ -108,6 +108,26 @@ where id = #{id} + + update rm_network_interface + + isp = #{isp}, + province = #{province}, + city = #{city}, + public_ip = #{publicIp}, + interface_name = #{interfaceName}, + mac_address = #{macAddress}, + interface_type = #{interfaceType}, + ipv4_address = #{ipv4Address}, + gateway = #{gateway}, + create_time = #{createTime}, + update_time = #{updateTime}, + create_by = #{createBy}, + update_by = #{updateBy}, + bind_ip = #{bindIp}, + + where mac_address = #{macAddress} + delete from rm_network_interface where id = #{id}