diff --git a/tongran-common/tongran-common-core/src/main/java/com/tongran/common/core/enums/MsgEnum.java b/tongran-common/tongran-common-core/src/main/java/com/tongran/common/core/enums/MsgEnum.java
index 71e2d14..bbea723 100644
--- a/tongran-common/tongran-common-core/src/main/java/com/tongran/common/core/enums/MsgEnum.java
+++ b/tongran-common/tongran-common-core/src/main/java/com/tongran/common/core/enums/MsgEnum.java
@@ -21,6 +21,8 @@ public enum MsgEnum {
iops结果上报("IOPS_RESULT"),
+ tcpdump结果上报("TCPDUMP_RESULT"),
+
获取最新策略("GET_POLICY"),
获取最新策略应答("GET_POLICY_RSP"),
@@ -45,6 +47,8 @@ public enum MsgEnum {
网络上报("NET"),
+ 网络上报重试("NET_RECOVER"),
+
挂载上报("POINT"),
系统其他上报("OTHER_SYSTEM"),
diff --git a/tongran-rocketmq/pom.xml b/tongran-rocketmq/pom.xml
index d1ba322..91361bc 100644
--- a/tongran-rocketmq/pom.xml
+++ b/tongran-rocketmq/pom.xml
@@ -125,7 +125,7 @@
org.redisson
redisson-spring-boot-starter
- 3.27.2
+ 3.18.0
diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/RmOutboundTrafficStatisticsController.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/RmOutboundTrafficStatisticsController.java
new file mode 100644
index 0000000..30d6c17
--- /dev/null
+++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/RmOutboundTrafficStatisticsController.java
@@ -0,0 +1,98 @@
+package com.tongran.rocketmq.controller;
+
+import com.tongran.common.core.utils.poi.ExcelUtil;
+import com.tongran.common.core.web.controller.BaseController;
+import com.tongran.common.core.web.domain.AjaxResult;
+import com.tongran.common.core.web.page.TableDataInfo;
+import com.tongran.common.log.annotation.Log;
+import com.tongran.common.log.enums.BusinessType;
+import com.tongran.common.security.annotation.RequiresPermissions;
+import com.tongran.rocketmq.domain.RmOutboundTrafficStatistics;
+import com.tongran.rocketmq.service.IRmOutboundTrafficStatisticsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 出省流量统计Controller
+ *
+ * @author tongran
+ * @date 2026-01-21
+ */
+@RestController
+@RequestMapping("/rmOutboundTrafficStatistics")
+public class RmOutboundTrafficStatisticsController extends BaseController
+{
+ @Autowired
+ private IRmOutboundTrafficStatisticsService rmOutboundTrafficStatisticsService;
+
+ /**
+ * 查询出省流量统计列表
+ */
+ @RequiresPermissions("rocketmq:rmOutboundTrafficStatistics:list")
+ @GetMapping("/list")
+ public TableDataInfo list(RmOutboundTrafficStatistics rmOutboundTrafficStatistics)
+ {
+ startPage();
+ List list = rmOutboundTrafficStatisticsService.selectRmOutboundTrafficStatisticsList(rmOutboundTrafficStatistics);
+ return getDataTable(list);
+ }
+
+ /**
+ * 导出出省流量统计列表
+ */
+ @RequiresPermissions("rocketmq:rmOutboundTrafficStatistics:export")
+ @Log(title = "出省流量统计", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, RmOutboundTrafficStatistics rmOutboundTrafficStatistics)
+ {
+ List list = rmOutboundTrafficStatisticsService.selectRmOutboundTrafficStatisticsList(rmOutboundTrafficStatistics);
+ ExcelUtil util = new ExcelUtil(RmOutboundTrafficStatistics.class);
+ util.exportExcel(response, list, "出省流量统计数据");
+ }
+
+ /**
+ * 获取出省流量统计详细信息
+ */
+ @RequiresPermissions("rocketmq:rmOutboundTrafficStatistics:query")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") Long id)
+ {
+ return success(rmOutboundTrafficStatisticsService.selectRmOutboundTrafficStatisticsById(id));
+ }
+
+ /**
+ * 新增出省流量统计
+ */
+ @RequiresPermissions("rocketmq:rmOutboundTrafficStatistics:add")
+ @Log(title = "出省流量统计", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody RmOutboundTrafficStatistics rmOutboundTrafficStatistics)
+ {
+ return toAjax(rmOutboundTrafficStatisticsService.insertRmOutboundTrafficStatistics(rmOutboundTrafficStatistics));
+ }
+
+ /**
+ * 修改出省流量统计
+ */
+ @RequiresPermissions("rocketmq:rmOutboundTrafficStatistics:edit")
+ @Log(title = "出省流量统计", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody RmOutboundTrafficStatistics rmOutboundTrafficStatistics)
+ {
+ return toAjax(rmOutboundTrafficStatisticsService.updateRmOutboundTrafficStatistics(rmOutboundTrafficStatistics));
+ }
+
+ /**
+ * 删除出省流量统计
+ */
+ @RequiresPermissions("rocketmq:rmOutboundTrafficStatistics:remove")
+ @Log(title = "出省流量统计", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable Long[] ids)
+ {
+ return toAjax(rmOutboundTrafficStatisticsService.deleteRmOutboundTrafficStatisticsByIds(ids));
+ }
+}
diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/RmTcpdumpConfigController.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/RmTcpdumpConfigController.java
new file mode 100644
index 0000000..b2b18d9
--- /dev/null
+++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/RmTcpdumpConfigController.java
@@ -0,0 +1,59 @@
+package com.tongran.rocketmq.controller;
+
+import com.tongran.common.core.web.controller.BaseController;
+import com.tongran.common.core.web.domain.AjaxResult;
+import com.tongran.common.log.annotation.Log;
+import com.tongran.common.log.enums.BusinessType;
+import com.tongran.common.security.annotation.RequiresPermissions;
+import com.tongran.rocketmq.domain.RmTcpdumpConfig;
+import com.tongran.rocketmq.service.IRmTcpdumpConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * tcpdump探测策略Controller
+ *
+ * @author tongran
+ * @date 2026-01-21
+ */
+@RestController
+@RequestMapping("/rmTcpdumpConfig")
+@RequiresPermissions("rocketmq:traffic")
+public class RmTcpdumpConfigController extends BaseController
+{
+ @Autowired
+ private IRmTcpdumpConfigService rmTcpdumpConfigService;
+
+ /**
+ * 查询tcpdump探测策略列表
+ */
+ @PostMapping("/list")
+ public AjaxResult list(RmTcpdumpConfig rmTcpdumpConfig)
+ {
+ List list = rmTcpdumpConfigService.selectRmTcpdumpConfigList(rmTcpdumpConfig);
+ return success(list);
+ }
+
+
+ /**
+ * 获取tcpdump探测策略详细信息
+ */
+ @GetMapping(value = "/{clientId}")
+ public AjaxResult getInfo(@PathVariable("clientId") String clientId)
+ {
+ return success(rmTcpdumpConfigService.selectRmTcpdumpConfigByClientId(clientId));
+ }
+
+ /**
+ * 新增tcpdump探测策略
+ */
+ @Log(title = "tcpdump探测策略", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody RmTcpdumpConfig rmTcpdumpConfig)
+ {
+ return toAjax(rmTcpdumpConfigService.insertRmTcpdumpConfig(rmTcpdumpConfig));
+ }
+
+}
diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/RmOutboundTrafficStatistics.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/RmOutboundTrafficStatistics.java
new file mode 100644
index 0000000..0cdf123
--- /dev/null
+++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/RmOutboundTrafficStatistics.java
@@ -0,0 +1,71 @@
+package com.tongran.rocketmq.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.tongran.common.core.annotation.Excel;
+import com.tongran.common.core.web.domain.BaseEntity;
+
+/**
+ * 出省流量统计对象 rm_outbound_traffic_statistics
+ *
+ * @author tongran
+ * @date 2026-01-21
+ */
+public class RmOutboundTrafficStatistics extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ /** 主键ID */
+ private Long id;
+
+ /** 客户端ID */
+ @Excel(name = "客户端ID")
+ private String clientId;
+
+ /** 出省流量统计详情 */
+ @Excel(name = "出省流量统计详情")
+ private String description;
+
+ public void setId(Long id)
+ {
+ this.id = id;
+ }
+
+ public Long getId()
+ {
+ return id;
+ }
+
+ public void setClientId(String clientId)
+ {
+ this.clientId = clientId;
+ }
+
+ public String getClientId()
+ {
+ return clientId;
+ }
+
+ public void setDescription(String description)
+ {
+ this.description = description;
+ }
+
+ public String getDescription()
+ {
+ return description;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+ .append("id", getId())
+ .append("clientId", getClientId())
+ .append("description", getDescription())
+ .append("createTime", getCreateTime())
+ .append("updateTime", getUpdateTime())
+ .append("createBy", getCreateBy())
+ .append("updateBy", getUpdateBy())
+ .toString();
+ }
+}
diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/RmTcpdumpConfig.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/RmTcpdumpConfig.java
new file mode 100644
index 0000000..02e5846
--- /dev/null
+++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/RmTcpdumpConfig.java
@@ -0,0 +1,101 @@
+package com.tongran.rocketmq.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.tongran.common.core.annotation.Excel;
+import com.tongran.common.core.web.domain.BaseEntity;
+
+/**
+ * tcpdump探测策略对象 rm_tcpdump_config
+ *
+ * @author tongran
+ * @date 2026-01-21
+ */
+public class RmTcpdumpConfig extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ /** 主键ID */
+ private Long id;
+
+ /** 客户端ID */
+ @Excel(name = "客户端ID")
+ private String clientId;
+
+ /** 开启探测(0:否,1:是) */
+ @Excel(name = "开启探测(0:否,1:是)")
+ private Integer detectFlag;
+
+ /** 探测频率 */
+ @Excel(name = "探测频率")
+ private String frequency;
+
+ /** 探测时间列表(多个时间用;分隔) */
+ @Excel(name = "探测时间列表(多个时间用;分隔)")
+ private String detectTimes;
+
+ public void setId(Long id)
+ {
+ this.id = id;
+ }
+
+ public Long getId()
+ {
+ return id;
+ }
+
+ public void setClientId(String clientId)
+ {
+ this.clientId = clientId;
+ }
+
+ public String getClientId()
+ {
+ return clientId;
+ }
+
+ public void setDetectFlag(Integer detectFlag)
+ {
+ this.detectFlag = detectFlag;
+ }
+
+ public Integer getDetectFlag()
+ {
+ return detectFlag;
+ }
+
+ public void setFrequency(String frequency)
+ {
+ this.frequency = frequency;
+ }
+
+ public String getFrequency()
+ {
+ return frequency;
+ }
+
+ public void setDetectTimes(String detectTimes)
+ {
+ this.detectTimes = detectTimes;
+ }
+
+ public String getDetectTimes()
+ {
+ return detectTimes;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+ .append("id", getId())
+ .append("clientId", getClientId())
+ .append("detectFlag", getDetectFlag())
+ .append("frequency", getFrequency())
+ .append("detectTimes", getDetectTimes())
+ .append("createTime", getCreateTime())
+ .append("updateTime", getUpdateTime())
+ .append("createBy", getCreateBy())
+ .append("updateBy", getUpdateBy())
+ .toString();
+ }
+}
diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/vo/PolicyTypeVo.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/vo/PolicyTypeVo.java
index 9f837f1..d7d3cc1 100644
--- a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/vo/PolicyTypeVo.java
+++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/vo/PolicyTypeVo.java
@@ -27,6 +27,8 @@ public class PolicyTypeVo {
private String umountDisk;
/** 需要删除的时间戳 */
private String trafficUsedTimestamp;
+ /** tcpdump探测时间 */
+ private String tcpdumpTimes;
/** 时间戳 */
private Long timestamp = Instant.now().getEpochSecond();
}
diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/vo/TcpdumpVo.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/vo/TcpdumpVo.java
new file mode 100644
index 0000000..cfed817
--- /dev/null
+++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/vo/TcpdumpVo.java
@@ -0,0 +1,11 @@
+package com.tongran.rocketmq.domain.vo;
+
+import lombok.Data;
+
+@Data
+public class TcpdumpVo {
+ /** ip地址 */
+ private String ip;
+ /** 出现次数 */
+ private Integer count;
+}
diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/handler/MessageHandler.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/handler/MessageHandler.java
index 740f3ad..e2d26b0 100644
--- a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/handler/MessageHandler.java
+++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/handler/MessageHandler.java
@@ -20,6 +20,12 @@ import com.tongran.rocketmq.utils.WeChatWorkBot;
import com.tongran.system.api.RemoteRevenueConfigService;
import com.tongran.system.api.domain.*;
import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.BeanUtils;
@@ -33,6 +39,7 @@ import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
+import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
@@ -143,6 +150,33 @@ public class MessageHandler {
registerHandler(MsgEnum.修改frp配置文件应答.getValue(), this::handleUpdateFrpMessage);
registerHandler(MsgEnum.macvlan状态上报.getValue(), this::handleMacvlanMessage);
registerHandler(MsgEnum.iops结果上报.getValue(), this::handleIopsResultMessage);
+ registerHandler(MsgEnum.tcpdump结果上报.getValue(), this::handleTcpdumpResultMessage);
+ }
+
+ private void handleTcpdumpResultMessage(DeviceMessage message) {
+ List tcpdumpVoList = JsonDataParser.parseJsonData(message.getData(), TcpdumpVo.class);
+ if(tcpdumpVoList != null && !tcpdumpVoList.isEmpty()){
+ for (TcpdumpVo tcpdumpVo : tcpdumpVoList) {
+ String ip = tcpdumpVo.getIp();
+ Integer count = tcpdumpVo.getCount();
+ String type = checkIPVersion(ip);
+ // 查询IP地址归属地信息
+ Map locationInfo = queryIpLocation(ip);
+ if (locationInfo != null) {
+ String operator = locationInfo.get("operator"); // 运营商
+ String province = locationInfo.get("province"); // 省份
+
+ System.out.println("IP: " + ip +
+ ", 运营商: " + operator +
+ ", 省份: " + province +
+ ", 抓包数量: " + count);
+
+ // 设置到对象中(如果TcpdumpVo有这些字段)
+ // tcpdumpVo.setOperator(operator);
+ // tcpdumpVo.setProvince(province);
+ }
+ }
+ }
}
private void handleIopsResultMessage(DeviceMessage message) {
@@ -1805,4 +1839,122 @@ public class MessageHandler {
rmNetworkInterfaceService.updateNetMsgByMac(updateData);
}
}
+ public String checkIPVersion(String ipAddress) {
+ // 检查是否为 IPv4 地址
+ if (ipAddress.contains(".")) {
+ // 简单的格式验证:IPv4 应该有 4 个部分,每个部分用点分隔
+ String[] parts = ipAddress.split("\\.");
+ if (parts.length == 4) {
+ try {
+ // 验证每个部分是否在 0-255 范围内
+ for (String part : parts) {
+ int num = Integer.parseInt(part);
+ if (num < 0 || num > 255) {
+ return "Invalid IP Address";
+ }
+ }
+ return "IPv4";
+ } catch (NumberFormatException e) {
+ return "Invalid IP Address";
+ }
+ }
+ }
+
+ // 检查是否为 IPv6 地址
+ if (ipAddress.contains(":")) {
+ // 简单的格式验证:IPv6 应该包含冒号分隔的十六进制数
+ String[] parts = ipAddress.split(":");
+ if (parts.length >= 3 && parts.length <= 8) {
+ try {
+ // 验证每个部分是否为有效的十六进制数
+ for (String part : parts) {
+ if (!part.isEmpty()) {
+ // 允许空的部分(表示连续的零)
+ Integer.parseInt(part, 16);
+ }
+ }
+ return "IPv6";
+ } catch (NumberFormatException e) {
+ return "Invalid IP Address";
+ }
+ }
+ }
+
+ return "Invalid IP Address";
+ }
+ /**
+ * 查询IP地址归属地信息,返回运营商和省份
+ */
+ private Map queryIpLocation(String ip) {
+ String apiUrl = "http://172.16.15.51:10000/?ip=" + ip;
+ CloseableHttpClient httpClient = HttpClients.createDefault();
+ HttpGet httpGet = new HttpGet(apiUrl);
+
+ try {
+ CloseableHttpResponse response = httpClient.execute(httpGet);
+
+ if (response.getStatusLine().getStatusCode() == 200) {
+ HttpEntity entity = response.getEntity();
+ if (entity != null) {
+ String jsonResponse = EntityUtils.toString(entity, "UTF-8");
+
+ // 使用Map直接解析JSON
+ Map resultMap = JsonDataParser.parseJsonData(jsonResponse, Map.class);
+ if (resultMap != null) {
+ return extractLocationInfo(resultMap);
+ }
+ }
+ } else {
+ System.err.println("获取IP归属地信息失败,HTTP状态码: " + response.getStatusLine().getStatusCode());
+ }
+ } catch (Exception e) {
+ System.err.println("查询IP归属地时发生异常: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ httpClient.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 从JSON Map中提取运营商和省份
+ */
+ private Map extractLocationInfo(Map resultMap) {
+ Map info = new HashMap<>();
+
+ // 提取运营商(从as.info获取中文名称)
+ if (resultMap.containsKey("as")) {
+ Object asObj = resultMap.get("as");
+ if (asObj instanceof Map) {
+ Map, ?> asMap = (Map, ?>) asObj;
+ if (asMap.containsKey("info")) {
+ info.put("operator", asMap.get("info").toString());
+ }
+ }
+ }
+
+ // 提取省份
+ if (resultMap.containsKey("regions_short")) {
+ Object regionsObj = resultMap.get("regions_short");
+ if (regionsObj instanceof List && ((List>) regionsObj).size() > 0) {
+ info.put("province", ((List>) regionsObj).get(0).toString());
+ }
+ } else if (resultMap.containsKey("regions")) {
+ Object regionsObj = resultMap.get("regions");
+ if (regionsObj instanceof List && ((List>) regionsObj).size() > 0) {
+ String province = ((List>) regionsObj).get(0).toString();
+ // 处理"浙江省" -> "浙江"
+ if (province.endsWith("省")) {
+ province = province.substring(0, province.length() - 1);
+ }
+ info.put("province", province);
+ }
+ }
+
+ return info;
+ }
}
\ No newline at end of file
diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/RmOutboundTrafficStatisticsMapper.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/RmOutboundTrafficStatisticsMapper.java
new file mode 100644
index 0000000..fce2a0c
--- /dev/null
+++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/RmOutboundTrafficStatisticsMapper.java
@@ -0,0 +1,61 @@
+package com.tongran.rocketmq.mapper;
+
+import java.util.List;
+import com.tongran.rocketmq.domain.RmOutboundTrafficStatistics;
+
+/**
+ * 出省流量统计Mapper接口
+ *
+ * @author tongran
+ * @date 2026-01-21
+ */
+public interface RmOutboundTrafficStatisticsMapper
+{
+ /**
+ * 查询出省流量统计
+ *
+ * @param id 出省流量统计主键
+ * @return 出省流量统计
+ */
+ public RmOutboundTrafficStatistics selectRmOutboundTrafficStatisticsById(Long id);
+
+ /**
+ * 查询出省流量统计列表
+ *
+ * @param rmOutboundTrafficStatistics 出省流量统计
+ * @return 出省流量统计集合
+ */
+ public List selectRmOutboundTrafficStatisticsList(RmOutboundTrafficStatistics rmOutboundTrafficStatistics);
+
+ /**
+ * 新增出省流量统计
+ *
+ * @param rmOutboundTrafficStatistics 出省流量统计
+ * @return 结果
+ */
+ public int insertRmOutboundTrafficStatistics(RmOutboundTrafficStatistics rmOutboundTrafficStatistics);
+
+ /**
+ * 修改出省流量统计
+ *
+ * @param rmOutboundTrafficStatistics 出省流量统计
+ * @return 结果
+ */
+ public int updateRmOutboundTrafficStatistics(RmOutboundTrafficStatistics rmOutboundTrafficStatistics);
+
+ /**
+ * 删除出省流量统计
+ *
+ * @param id 出省流量统计主键
+ * @return 结果
+ */
+ public int deleteRmOutboundTrafficStatisticsById(Long id);
+
+ /**
+ * 批量删除出省流量统计
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ public int deleteRmOutboundTrafficStatisticsByIds(Long[] ids);
+}
diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/RmTcpdumpConfigMapper.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/RmTcpdumpConfigMapper.java
new file mode 100644
index 0000000..d0c3970
--- /dev/null
+++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/RmTcpdumpConfigMapper.java
@@ -0,0 +1,65 @@
+package com.tongran.rocketmq.mapper;
+
+import com.tongran.rocketmq.domain.RmTcpdumpConfig;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
+
+/**
+ * tcpdump探测策略Mapper接口
+ *
+ * @author tongran
+ * @date 2026-01-21
+ */
+public interface RmTcpdumpConfigMapper
+{
+ /**
+ * 查询tcpdump探测策略
+ *
+ * @param id tcpdump探测策略主键
+ * @return tcpdump探测策略
+ */
+ public RmTcpdumpConfig selectRmTcpdumpConfigById(Long id);
+
+ /**
+ * 查询tcpdump探测策略列表
+ *
+ * @param rmTcpdumpConfig tcpdump探测策略
+ * @return tcpdump探测策略集合
+ */
+ public List selectRmTcpdumpConfigList(RmTcpdumpConfig rmTcpdumpConfig);
+
+ /**
+ * 新增tcpdump探测策略
+ *
+ * @param rmTcpdumpConfig tcpdump探测策略
+ * @return 结果
+ */
+ public int insertRmTcpdumpConfig(RmTcpdumpConfig rmTcpdumpConfig);
+
+ /**
+ * 修改tcpdump探测策略
+ *
+ * @param rmTcpdumpConfig tcpdump探测策略
+ * @return 结果
+ */
+ public int updateRmTcpdumpConfig(RmTcpdumpConfig rmTcpdumpConfig);
+
+ /**
+ * 删除tcpdump探测策略
+ *
+ * @param id tcpdump探测策略主键
+ * @return 结果
+ */
+ public int deleteRmTcpdumpConfigById(Long id);
+
+ /**
+ * 批量删除tcpdump探测策略
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ public int deleteRmTcpdumpConfigByIds(Long[] ids);
+
+ RmTcpdumpConfig selectRmTcpdumpConfigByClientId(@Param("clientId") String clientId);
+}
diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IRmOutboundTrafficStatisticsService.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IRmOutboundTrafficStatisticsService.java
new file mode 100644
index 0000000..d415aec
--- /dev/null
+++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IRmOutboundTrafficStatisticsService.java
@@ -0,0 +1,61 @@
+package com.tongran.rocketmq.service;
+
+import java.util.List;
+import com.tongran.rocketmq.domain.RmOutboundTrafficStatistics;
+
+/**
+ * 出省流量统计Service接口
+ *
+ * @author tongran
+ * @date 2026-01-21
+ */
+public interface IRmOutboundTrafficStatisticsService
+{
+ /**
+ * 查询出省流量统计
+ *
+ * @param id 出省流量统计主键
+ * @return 出省流量统计
+ */
+ public RmOutboundTrafficStatistics selectRmOutboundTrafficStatisticsById(Long id);
+
+ /**
+ * 查询出省流量统计列表
+ *
+ * @param rmOutboundTrafficStatistics 出省流量统计
+ * @return 出省流量统计集合
+ */
+ public List selectRmOutboundTrafficStatisticsList(RmOutboundTrafficStatistics rmOutboundTrafficStatistics);
+
+ /**
+ * 新增出省流量统计
+ *
+ * @param rmOutboundTrafficStatistics 出省流量统计
+ * @return 结果
+ */
+ public int insertRmOutboundTrafficStatistics(RmOutboundTrafficStatistics rmOutboundTrafficStatistics);
+
+ /**
+ * 修改出省流量统计
+ *
+ * @param rmOutboundTrafficStatistics 出省流量统计
+ * @return 结果
+ */
+ public int updateRmOutboundTrafficStatistics(RmOutboundTrafficStatistics rmOutboundTrafficStatistics);
+
+ /**
+ * 批量删除出省流量统计
+ *
+ * @param ids 需要删除的出省流量统计主键集合
+ * @return 结果
+ */
+ public int deleteRmOutboundTrafficStatisticsByIds(Long[] ids);
+
+ /**
+ * 删除出省流量统计信息
+ *
+ * @param id 出省流量统计主键
+ * @return 结果
+ */
+ public int deleteRmOutboundTrafficStatisticsById(Long id);
+}
diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IRmTcpdumpConfigService.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IRmTcpdumpConfigService.java
new file mode 100644
index 0000000..b636b9a
--- /dev/null
+++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IRmTcpdumpConfigService.java
@@ -0,0 +1,64 @@
+package com.tongran.rocketmq.service;
+
+import com.tongran.rocketmq.domain.RmTcpdumpConfig;
+
+import java.util.List;
+
+/**
+ * tcpdump探测策略Service接口
+ *
+ * @author tongran
+ * @date 2026-01-21
+ */
+public interface IRmTcpdumpConfigService
+{
+ /**
+ * 查询tcpdump探测策略
+ *
+ * @param id tcpdump探测策略主键
+ * @return tcpdump探测策略
+ */
+ public RmTcpdumpConfig selectRmTcpdumpConfigById(Long id);
+
+ /**
+ * 查询tcpdump探测策略列表
+ *
+ * @param rmTcpdumpConfig tcpdump探测策略
+ * @return tcpdump探测策略集合
+ */
+ public List selectRmTcpdumpConfigList(RmTcpdumpConfig rmTcpdumpConfig);
+
+ /**
+ * 新增tcpdump探测策略
+ *
+ * @param rmTcpdumpConfig tcpdump探测策略
+ * @return 结果
+ */
+ public int insertRmTcpdumpConfig(RmTcpdumpConfig rmTcpdumpConfig);
+
+ /**
+ * 修改tcpdump探测策略
+ *
+ * @param rmTcpdumpConfig tcpdump探测策略
+ * @return 结果
+ */
+ public int updateRmTcpdumpConfig(RmTcpdumpConfig rmTcpdumpConfig);
+
+ /**
+ * 批量删除tcpdump探测策略
+ *
+ * @param ids 需要删除的tcpdump探测策略主键集合
+ * @return 结果
+ */
+ public int deleteRmTcpdumpConfigByIds(Long[] ids);
+
+ /**
+ * 删除tcpdump探测策略信息
+ *
+ * @param id tcpdump探测策略主键
+ * @return 结果
+ */
+ public int deleteRmTcpdumpConfigById(Long id);
+
+ RmTcpdumpConfig selectRmTcpdumpConfigByClientId(String clientId);
+}
diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/RmOutboundTrafficStatisticsServiceImpl.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/RmOutboundTrafficStatisticsServiceImpl.java
new file mode 100644
index 0000000..1d0c516
--- /dev/null
+++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/RmOutboundTrafficStatisticsServiceImpl.java
@@ -0,0 +1,96 @@
+package com.tongran.rocketmq.service.impl;
+
+import java.util.List;
+import com.tongran.common.core.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.tongran.rocketmq.mapper.RmOutboundTrafficStatisticsMapper;
+import com.tongran.rocketmq.domain.RmOutboundTrafficStatistics;
+import com.tongran.rocketmq.service.IRmOutboundTrafficStatisticsService;
+
+/**
+ * 出省流量统计Service业务层处理
+ *
+ * @author tongran
+ * @date 2026-01-21
+ */
+@Service
+public class RmOutboundTrafficStatisticsServiceImpl implements IRmOutboundTrafficStatisticsService
+{
+ @Autowired
+ private RmOutboundTrafficStatisticsMapper rmOutboundTrafficStatisticsMapper;
+
+ /**
+ * 查询出省流量统计
+ *
+ * @param id 出省流量统计主键
+ * @return 出省流量统计
+ */
+ @Override
+ public RmOutboundTrafficStatistics selectRmOutboundTrafficStatisticsById(Long id)
+ {
+ return rmOutboundTrafficStatisticsMapper.selectRmOutboundTrafficStatisticsById(id);
+ }
+
+ /**
+ * 查询出省流量统计列表
+ *
+ * @param rmOutboundTrafficStatistics 出省流量统计
+ * @return 出省流量统计
+ */
+ @Override
+ public List selectRmOutboundTrafficStatisticsList(RmOutboundTrafficStatistics rmOutboundTrafficStatistics)
+ {
+ return rmOutboundTrafficStatisticsMapper.selectRmOutboundTrafficStatisticsList(rmOutboundTrafficStatistics);
+ }
+
+ /**
+ * 新增出省流量统计
+ *
+ * @param rmOutboundTrafficStatistics 出省流量统计
+ * @return 结果
+ */
+ @Override
+ public int insertRmOutboundTrafficStatistics(RmOutboundTrafficStatistics rmOutboundTrafficStatistics)
+ {
+ rmOutboundTrafficStatistics.setCreateTime(DateUtils.getNowDate());
+ return rmOutboundTrafficStatisticsMapper.insertRmOutboundTrafficStatistics(rmOutboundTrafficStatistics);
+ }
+
+ /**
+ * 修改出省流量统计
+ *
+ * @param rmOutboundTrafficStatistics 出省流量统计
+ * @return 结果
+ */
+ @Override
+ public int updateRmOutboundTrafficStatistics(RmOutboundTrafficStatistics rmOutboundTrafficStatistics)
+ {
+ rmOutboundTrafficStatistics.setUpdateTime(DateUtils.getNowDate());
+ return rmOutboundTrafficStatisticsMapper.updateRmOutboundTrafficStatistics(rmOutboundTrafficStatistics);
+ }
+
+ /**
+ * 批量删除出省流量统计
+ *
+ * @param ids 需要删除的出省流量统计主键
+ * @return 结果
+ */
+ @Override
+ public int deleteRmOutboundTrafficStatisticsByIds(Long[] ids)
+ {
+ return rmOutboundTrafficStatisticsMapper.deleteRmOutboundTrafficStatisticsByIds(ids);
+ }
+
+ /**
+ * 删除出省流量统计信息
+ *
+ * @param id 出省流量统计主键
+ * @return 结果
+ */
+ @Override
+ public int deleteRmOutboundTrafficStatisticsById(Long id)
+ {
+ return rmOutboundTrafficStatisticsMapper.deleteRmOutboundTrafficStatisticsById(id);
+ }
+}
diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/RmTcpdumpConfigServiceImpl.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/RmTcpdumpConfigServiceImpl.java
new file mode 100644
index 0000000..2c416d0
--- /dev/null
+++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/RmTcpdumpConfigServiceImpl.java
@@ -0,0 +1,131 @@
+package com.tongran.rocketmq.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.tongran.common.core.enums.MsgEnum;
+import com.tongran.common.core.utils.DateUtils;
+import com.tongran.rocketmq.domain.DeviceMessage;
+import com.tongran.rocketmq.domain.RmTcpdumpConfig;
+import com.tongran.rocketmq.domain.vo.PolicyTypeVo;
+import com.tongran.rocketmq.mapper.RmTcpdumpConfigMapper;
+import com.tongran.rocketmq.model.ProducerMode;
+import com.tongran.rocketmq.producer.MessageProducer;
+import com.tongran.rocketmq.service.IRmTcpdumpConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * tcpdump探测策略Service业务层处理
+ *
+ * @author tongran
+ * @date 2026-01-21
+ */
+@Service
+public class RmTcpdumpConfigServiceImpl implements IRmTcpdumpConfigService
+{
+ @Autowired
+ private RmTcpdumpConfigMapper rmTcpdumpConfigMapper;
+ @Autowired
+ private ProducerMode producerMode;
+
+ /**
+ * 查询tcpdump探测策略
+ *
+ * @param id tcpdump探测策略主键
+ * @return tcpdump探测策略
+ */
+ @Override
+ public RmTcpdumpConfig selectRmTcpdumpConfigById(Long id)
+ {
+ return rmTcpdumpConfigMapper.selectRmTcpdumpConfigById(id);
+ }
+
+ /**
+ * 查询tcpdump探测策略列表
+ *
+ * @param rmTcpdumpConfig tcpdump探测策略
+ * @return tcpdump探测策略
+ */
+ @Override
+ public List selectRmTcpdumpConfigList(RmTcpdumpConfig rmTcpdumpConfig)
+ {
+ return rmTcpdumpConfigMapper.selectRmTcpdumpConfigList(rmTcpdumpConfig);
+ }
+
+ /**
+ * 新增tcpdump探测策略
+ *
+ * @param rmTcpdumpConfig tcpdump探测策略
+ * @return 结果
+ */
+ @Override
+ public int insertRmTcpdumpConfig(RmTcpdumpConfig rmTcpdumpConfig)
+ {
+ rmTcpdumpConfig.setCreateTime(DateUtils.getNowDate());
+ rmTcpdumpConfigMapper.insertRmTcpdumpConfig(rmTcpdumpConfig);
+ // 下发消息给agent
+ PolicyTypeVo policyTypeVo = new PolicyTypeVo();
+ if(rmTcpdumpConfig.getDetectFlag() == 1 && rmTcpdumpConfig.getDetectTimes() != null){
+ policyTypeVo.setTcpdumpTimes(rmTcpdumpConfig.getDetectTimes());
+ }else{
+ policyTypeVo.setTcpdumpTimes("");
+ }
+ MessageProducer messageProducer = new MessageProducer();
+ String configJson = JSONObject.toJSONString(policyTypeVo);
+ DeviceMessage message = new DeviceMessage();
+ message.setClientId(rmTcpdumpConfig.getClientId());
+ message.setData(configJson);
+ message.setDataType(MsgEnum.获取最新策略应答.getValue());
+
+ messageProducer.sendAsyncProducerMessage(
+ producerMode.getAgentTopic(),
+ "",
+ "",
+ JSONObject.toJSONString(message)
+ );
+ return 1;
+ }
+
+ /**
+ * 修改tcpdump探测策略
+ *
+ * @param rmTcpdumpConfig tcpdump探测策略
+ * @return 结果
+ */
+ @Override
+ public int updateRmTcpdumpConfig(RmTcpdumpConfig rmTcpdumpConfig)
+ {
+ rmTcpdumpConfig.setUpdateTime(DateUtils.getNowDate());
+ return rmTcpdumpConfigMapper.updateRmTcpdumpConfig(rmTcpdumpConfig);
+ }
+
+ /**
+ * 批量删除tcpdump探测策略
+ *
+ * @param ids 需要删除的tcpdump探测策略主键
+ * @return 结果
+ */
+ @Override
+ public int deleteRmTcpdumpConfigByIds(Long[] ids)
+ {
+ return rmTcpdumpConfigMapper.deleteRmTcpdumpConfigByIds(ids);
+ }
+
+ /**
+ * 删除tcpdump探测策略信息
+ *
+ * @param id tcpdump探测策略主键
+ * @return 结果
+ */
+ @Override
+ public int deleteRmTcpdumpConfigById(Long id)
+ {
+ return rmTcpdumpConfigMapper.deleteRmTcpdumpConfigById(id);
+ }
+
+ @Override
+ public RmTcpdumpConfig selectRmTcpdumpConfigByClientId(String clientId) {
+ return rmTcpdumpConfigMapper.selectRmTcpdumpConfigByClientId(clientId);
+ }
+}
diff --git a/tongran-rocketmq/src/main/resources/mapper/rocketmq/RmOutboundTrafficStatisticsMapper.xml b/tongran-rocketmq/src/main/resources/mapper/rocketmq/RmOutboundTrafficStatisticsMapper.xml
new file mode 100644
index 0000000..0b149d4
--- /dev/null
+++ b/tongran-rocketmq/src/main/resources/mapper/rocketmq/RmOutboundTrafficStatisticsMapper.xml
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id, client_id, description, create_time, update_time, create_by, update_by from rm_outbound_traffic_statistics
+
+
+
+
+
+
+
+ insert into rm_outbound_traffic_statistics
+
+ client_id,
+ description,
+ create_time,
+ update_time,
+ create_by,
+ update_by,
+
+
+ #{clientId},
+ #{description},
+ #{createTime},
+ #{updateTime},
+ #{createBy},
+ #{updateBy},
+
+
+
+
+ update rm_outbound_traffic_statistics
+
+ client_id = #{clientId},
+ description = #{description},
+ create_time = #{createTime},
+ update_time = #{updateTime},
+ create_by = #{createBy},
+ update_by = #{updateBy},
+
+ where id = #{id}
+
+
+
+ delete from rm_outbound_traffic_statistics where id = #{id}
+
+
+
+ delete from rm_outbound_traffic_statistics where id in
+
+ #{id}
+
+
+
\ No newline at end of file
diff --git a/tongran-rocketmq/src/main/resources/mapper/rocketmq/RmTcpdumpConfigMapper.xml b/tongran-rocketmq/src/main/resources/mapper/rocketmq/RmTcpdumpConfigMapper.xml
new file mode 100644
index 0000000..77f4c08
--- /dev/null
+++ b/tongran-rocketmq/src/main/resources/mapper/rocketmq/RmTcpdumpConfigMapper.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id, client_id, detect_flag, frequency, detect_times, create_time, update_time, create_by, update_by from rm_tcpdump_config
+
+
+
+
+
+
+
+ insert into rm_tcpdump_config
+
+ client_id,
+ detect_flag,
+ frequency,
+ detect_times,
+ create_time,
+ update_time,
+ create_by,
+ update_by,
+
+
+ #{clientId},
+ #{detectFlag},
+ #{frequency},
+ #{detectTimes},
+ #{createTime},
+ #{updateTime},
+ #{createBy},
+ #{updateBy},
+
+ on duplicate key update
+
+ detect_flag = #{detectFlag},
+ frequency = #{frequency},
+ detect_times = #{detectTimes},
+ update_time = #{updateTime},
+ update_by = #{updateBy},
+
+
+
+
+ update rm_tcpdump_config
+
+ client_id = #{clientId},
+ detect_flag = #{detectFlag},
+ frequency = #{frequency},
+ detect_times = #{detectTimes},
+ create_time = #{createTime},
+ update_time = #{updateTime},
+ create_by = #{createBy},
+ update_by = #{updateBy},
+
+ where id = #{id}
+
+
+
+ delete from rm_tcpdump_config where id = #{id}
+
+
+
+ delete from rm_tcpdump_config where id in
+
+ #{id}
+
+
+
+
\ No newline at end of file