diff --git a/tongran-api/tongran-api-system/src/main/java/com/tongran/system/api/domain/RmNetworkInterfaceRemote.java b/tongran-api/tongran-api-system/src/main/java/com/tongran/system/api/domain/RmNetworkInterfaceRemote.java index ea51e6d..a4cce00 100644 --- a/tongran-api/tongran-api-system/src/main/java/com/tongran/system/api/domain/RmNetworkInterfaceRemote.java +++ b/tongran-api/tongran-api-system/src/main/java/com/tongran/system/api/domain/RmNetworkInterfaceRemote.java @@ -58,7 +58,11 @@ public class RmNetworkInterfaceRemote extends BaseEntity { private String clientIds; /** 查询所有网卡的clientId集合 */ private String allClientIds; - // 如果是子接口,存储父接口名称 private String parentInterface; + /** 服务器列表传参 */ + private String queryParam; + /** 有ipv4的标识 */ + private boolean ipv4Flag; + } diff --git a/tongran-modules/tongran-system/src/main/java/com/tongran/system/domain/RmResourceRegistration.java b/tongran-modules/tongran-system/src/main/java/com/tongran/system/domain/RmResourceRegistration.java index 46bf2fc..96007ee 100644 --- a/tongran-modules/tongran-system/src/main/java/com/tongran/system/domain/RmResourceRegistration.java +++ b/tongran-modules/tongran-system/src/main/java/com/tongran/system/domain/RmResourceRegistration.java @@ -287,4 +287,6 @@ public class RmResourceRegistration extends BaseEntity private String maxAgentVersion; /** id集合 */ private Long[] ids; + /** 批量查询 */ + private String clientIds; } \ No newline at end of file diff --git a/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/RmResourceRegistrationServiceImpl.java b/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/RmResourceRegistrationServiceImpl.java index fb18289..4f1e9ef 100644 --- a/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/RmResourceRegistrationServiceImpl.java +++ b/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/RmResourceRegistrationServiceImpl.java @@ -29,6 +29,7 @@ import java.time.Duration; import java.time.Instant; import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.function.Function; import java.util.stream.Collectors; import static com.tongran.common.core.utils.PageUtils.startPage; @@ -112,9 +113,25 @@ public class RmResourceRegistrationServiceImpl implements IRmResourceRegistratio resultMap.put("list", list); return resultMap; } - // 情况2: 有查询参数或需要排序,全量查询+内存处理 - List allData = rmResourceRegistrationMapper.getRegistrationTableInfoList(rmResourceRegistration); + // 先查询ip是否存在子网卡列表中 + StringBuilder clientIdsBuilder = new StringBuilder(); + List allData = rmResourceRegistrationMapper.getRegistrationTableInfoList(rmResourceRegistration); + List childData = new ArrayList<>(); + RmNetworkInterfaceRemote query = new RmNetworkInterfaceRemote(); + query.setQueryParam(queryParam); + R> children = remoteRocketMqService.innerGetChildList(query, SecurityConstants.INNER); + if(children != null && children.getData()!=null && !children.getData().isEmpty()){ + for (RmNetworkInterfaceRemote datum : children.getData()) { + if(clientIdsBuilder.length() > 0) { + clientIdsBuilder.append(","); + } + clientIdsBuilder.append(datum.getClientId()); + } + String clientIds = clientIdsBuilder.toString(); + rmResourceRegistration.setClientIds(clientIds); + childData = rmResourceRegistrationMapper.getRegistrationTableInfoList(rmResourceRegistration); + } batchSetNetWorkMsg(allData); // 1. 过滤 @@ -124,7 +141,21 @@ public class RmResourceRegistrationServiceImpl implements IRmResourceRegistratio .filter(item -> item != null && quickMatches(item, queryValue)) .collect(Collectors.toList()); } - + if(!childData.isEmpty()){ + filteredList.addAll(childData); + } + // 按 clientId 去重(保留第一个出现的元素) + filteredList = filteredList.stream() + .filter(Objects::nonNull) + .collect(Collectors.collectingAndThen( + Collectors.toMap( + RmResourceRegistration::getClientId, + Function.identity(), + (first, second) -> first, + LinkedHashMap::new + ), + map -> new ArrayList<>(map.values()) + )); // 2. 排序 if (bandwidthResultSort != null && bandwidthResultSort != 3) { sortList(filteredList, bandwidthResultSort); @@ -168,14 +199,35 @@ public class RmResourceRegistrationServiceImpl implements IRmResourceRegistratio */ @Override public List selectRmResourceRegistrationList(RmResourceRegistration rmResourceRegistration) { - List allData = rmResourceRegistrationMapper.getRegistrationTableInfoList(rmResourceRegistration); - batchSetNetWorkMsg(allData); - // 获取参数 String queryParam = rmResourceRegistration.getQueryParam(); Integer bandwidthResultSort = rmResourceRegistration.getBandwidthResultSort(); boolean hasQueryParam = queryParam != null && !queryParam.trim().isEmpty(); String queryValue = hasQueryParam ? queryParam.trim().toLowerCase() : null; + List allData = rmResourceRegistrationMapper.getRegistrationTableInfoList(rmResourceRegistration); + List childData = new ArrayList<>(); + if(hasQueryParam){ + // 先查询ip是否存在子网卡列表中 + StringBuilder clientIdsBuilder = new StringBuilder(); + RmNetworkInterfaceRemote query = new RmNetworkInterfaceRemote(); + query.setQueryParam(queryParam); + R> children = remoteRocketMqService.innerGetChildList(query, SecurityConstants.INNER); + if(children != null && children.getData()!=null && !children.getData().isEmpty()){ + for (RmNetworkInterfaceRemote datum : children.getData()) { + if(clientIdsBuilder.length() > 0) { + clientIdsBuilder.append(","); + } + clientIdsBuilder.append(datum.getClientId()); + } + String clientIds = clientIdsBuilder.toString(); + rmResourceRegistration.setClientIds(clientIds); + childData = rmResourceRegistrationMapper.getRegistrationTableInfoList(rmResourceRegistration); + }else{ + allData = rmResourceRegistrationMapper.getRegistrationTableInfoList(rmResourceRegistration); + } + } + batchSetNetWorkMsg(allData); + // 过滤 List filteredList = allData; @@ -184,7 +236,21 @@ public class RmResourceRegistrationServiceImpl implements IRmResourceRegistratio .filter(item -> item != null && quickMatches(item, queryValue)) .collect(Collectors.toList()); } - + if(!childData.isEmpty()){ + filteredList.addAll(childData); + } + // 按 clientId 去重(保留第一个出现的元素) + filteredList = filteredList.stream() + .filter(Objects::nonNull) + .collect(Collectors.collectingAndThen( + Collectors.toMap( + RmResourceRegistration::getClientId, + Function.identity(), + (first, second) -> first, + LinkedHashMap::new + ), + map -> new ArrayList<>(map.values()) + )); // 排序 if (bandwidthResultSort != null && bandwidthResultSort != 3) { sortList(filteredList, bandwidthResultSort); @@ -501,15 +567,63 @@ public class RmResourceRegistrationServiceImpl implements IRmResourceRegistratio } if ("2".equals(network.getBindIp()) || "3".equals(network.getBindIp())) { // ip提前 - if(registration.getIp1PublicIp() == null){ + // 先尝试从当前network对象设置值 + if(registration.getIp1PublicIp() == null && network.getPublicIp() != null){ registration.setIp1PublicIp(network.getPublicIp()); } - if(registration.getIp1Isp() == null){ + if(registration.getIp1Isp() == null && network.getIsp() != null){ registration.setIp1Isp(network.getIsp()); } - if(registration.getIp1Province() == null){ + if(registration.getIp1Province() == null && network.getProvince() != null){ registration.setIp1Province(network.getProvince()); } + + // 如果还有字段为null,再尝试从子网卡中获取 + if(registration.getIp1PublicIp() == null || registration.getIp1Isp() == null || registration.getIp1Province() == null){ + // 查询子网卡信息 + RmNetworkInterfaceRemote query = new RmNetworkInterfaceRemote(); + query.setClientId(registration.getClientId()); + query.setIpv4Flag(true); + R> children = remoteRocketMqService.innerGetChildList(query, SecurityConstants.INNER); + + if(children != null && children.getData() != null && !children.getData().isEmpty()){ + // 按ip最后一位排序取最小的 + RmNetworkInterfaceRemote minIpChild = null; + int minLastOctet = Integer.MAX_VALUE; + + for (RmNetworkInterfaceRemote child : children.getData()) { + if (child.getIpv4Address() != null && !child.getIpv4Address().isEmpty()) { + String ip = child.getIpv4Address(); + String[] ipParts = ip.split("\\."); + + if (ipParts.length == 4) { + try { + int lastOctet = Integer.parseInt(ipParts[3]); + if (lastOctet < minLastOctet) { + minLastOctet = lastOctet; + minIpChild = child; + } + } catch (NumberFormatException e) { + // 忽略格式错误的IP + } + } + } + } + + if (minIpChild != null) { + // 只设置还为空的值 + if(registration.getIp1PublicIp() == null){ + registration.setIp1PublicIp(minIpChild.getPublicIp()); + } + if(registration.getIp1Isp() == null){ + registration.setIp1Isp(minIpChild.getIsp()); + } + if(registration.getIp1Province() == null){ + registration.setIp1Province(minIpChild.getProvince()); + } + } + } + } // 管理网IP处理 registration.setMgmtIsp(network.getIsp()); registration.setMgmtProvince(network.getProvince()); diff --git a/tongran-modules/tongran-system/src/main/resources/mapper/system/RmResourceRegistrationMapper.xml b/tongran-modules/tongran-system/src/main/resources/mapper/system/RmResourceRegistrationMapper.xml index de8b6ac..5ffbd3e 100644 --- a/tongran-modules/tongran-system/src/main/resources/mapper/system/RmResourceRegistrationMapper.xml +++ b/tongran-modules/tongran-system/src/main/resources/mapper/system/RmResourceRegistrationMapper.xml @@ -302,6 +302,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and a.multi_public_ip_status = #{multiPublicIpStatus} and a.business_name is null and a.logical_node_id is null + + and a.client_id in + + #{clientId} + + order by a.create_time desc diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/RmNetworkInterfaceChild.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/RmNetworkInterfaceChild.java index a8a43b8..2c925b9 100644 --- a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/RmNetworkInterfaceChild.java +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/RmNetworkInterfaceChild.java @@ -86,4 +86,6 @@ public class RmNetworkInterfaceChild extends BaseEntity private String tableName; /** ping丢包率 */ private Double pingDropped; + /** 服务器列表传参 */ + public String queryParam; } diff --git a/tongran-rocketmq/src/main/resources/mapper/rocketmq/RmNetworkInterfaceChildMapper.xml b/tongran-rocketmq/src/main/resources/mapper/rocketmq/RmNetworkInterfaceChildMapper.xml index 047ebb5..3f9b4e7 100644 --- a/tongran-rocketmq/src/main/resources/mapper/rocketmq/RmNetworkInterfaceChildMapper.xml +++ b/tongran-rocketmq/src/main/resources/mapper/rocketmq/RmNetworkInterfaceChildMapper.xml @@ -42,6 +42,11 @@ and province = #{province} and city = #{city} and public_ip = #{publicIp} + + and (public_ip like concat('%', #{queryParam}, '%') + or ipv4_address like concat('%', #{queryParam}, '%') + or ipv6_address like concat('%', #{queryParam}, '%')) + and interface_name like concat('%', #{interfaceName}, '%') and mac_address = #{macAddress} and interface_type = #{interfaceType}