95值计算方式新增1024

This commit is contained in:
gaoyutao
2025-09-16 09:47:39 +08:00
parent bdfecb7852
commit f9d4835d4c
21 changed files with 383 additions and 119 deletions

View File

@@ -14,6 +14,7 @@ import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
/**
@@ -47,7 +48,7 @@ public class TableScheduleConfig {
epsInitialTrafficDataService.createNextMonthTables();
}
// 每天12点执行 计算95带宽值/日
// 每天0点执行 计算95带宽值/日
@Scheduled(cron = "0 4 0 * * ?", zone = "Asia/Shanghai")
public void calculate95BandwidthDaily() {
// 获取昨天的日期范围(北京时间)
@@ -59,10 +60,17 @@ public class TableScheduleConfig {
// 95带宽值/日
EpsInitialTrafficData queryParam = new EpsInitialTrafficData();
queryParam.setDayOrMonth(dayOrMonth);
epsInitialTrafficDataService.calculateBusiness95BandwidthDaily(queryParam, dailyStartTime, dailyEndTime);
InitialSwitchInfoDetails initialSwitchInfoDetails = new InitialSwitchInfoDetails();
initialSwitchInfoDetails.setDayOrMonth(dayOrMonth);
initialSwitchInfoDetailsService.calculateSwitch95BandwidthDaily(initialSwitchInfoDetails, dailyStartTime, dailyEndTime);
// 顺序执行链
CompletableFuture.runAsync(() -> executeWithLog("业务带宽1000",
() -> epsInitialTrafficDataService.calculateBusiness95BandwidthDaily(queryParam, dailyStartTime, dailyEndTime, "1000")))
.thenRun(() -> executeWithLog("业务带宽1024",
() -> epsInitialTrafficDataService.calculateBusiness95BandwidthDaily(queryParam, dailyStartTime, dailyEndTime, "1024")))
.thenRun(() -> executeWithLog("交换机带宽1000",
() -> initialSwitchInfoDetailsService.calculateSwitch95BandwidthDaily(initialSwitchInfoDetails, dailyStartTime, dailyEndTime, "1000")))
.thenRun(() -> executeWithLog("交换机带宽1024",
() -> initialSwitchInfoDetailsService.calculateSwitch95BandwidthDaily(initialSwitchInfoDetails, dailyStartTime, dailyEndTime, "1024")));
}
// 每月1号0点执行 计算95带宽值/月
@@ -76,38 +84,42 @@ public class TableScheduleConfig {
String monthlyStartTime = firstDayOfMonth.atStartOfDay().format(TIME_FORMAT);
String monthlyEndTime = lastDayOfMonth.atTime(23, 59, 59).format(TIME_FORMAT);
// 顺序执行各任务间隔10分钟
executeWithDelay(() -> calculateServerMonthlyBandwidth(monthlyStartTime, monthlyEndTime), 0);
executeWithDelay(() -> calculateSwitchMonthlyBandwidth(monthlyStartTime, monthlyEndTime), 10);
executeWithDelay(() -> calculateServerAvgMonthlyBandwidth(monthlyStartTime, monthlyEndTime), 10);
executeWithDelay(() -> calculateSwitchAvgMonthlyBandwidth(monthlyStartTime, monthlyEndTime), 10);
// 链式顺序执行(无额外日志封装)
CompletableFuture.runAsync(() -> calculateServerMonthlyBandwidth(monthlyStartTime, monthlyEndTime, "1000"))
.thenRun(() -> calculateServerMonthlyBandwidth(monthlyStartTime, monthlyEndTime, "1024"))
.thenRun(() -> calculateSwitchMonthlyBandwidth(monthlyStartTime, monthlyEndTime, "1000"))
.thenRun(() -> calculateSwitchMonthlyBandwidth(monthlyStartTime, monthlyEndTime, "1024"))
.thenRun(() -> calculateServerAvgMonthlyBandwidth(monthlyStartTime, monthlyEndTime))
.thenRun(() -> calculateSwitchAvgMonthlyBandwidth(monthlyStartTime, monthlyEndTime))
.exceptionally(e -> {
log.error("月度带宽计算链执行异常", e); // 仅保留最终异常捕获
return null;
});
}
/**
* 延迟执行任务
* 执行任务日志
*/
private void executeWithDelay(Runnable task, int delayMinutes) {
private void executeWithLog(String taskName, Runnable task) {
log.info("开始执行: {}", taskName);
try {
if (delayMinutes > 0) {
Thread.sleep(delayMinutes * 60 * 1000);
}
task.run();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
log.error("任务执行被中断", e);
} catch (Exception e) {
log.error("{} 执行失败", taskName, e);
throw e; // 可选:是否终止后续任务
}
log.info("{} 执行完成", taskName);
}
/**
* 计算服务器月95带宽值
*/
private void calculateServerMonthlyBandwidth(String monthlyStartTime, String monthlyEndTime) {
private void calculateServerMonthlyBandwidth(String monthlyStartTime, String monthlyEndTime, String calculationMode) {
log.info("开始计算服务器月95带宽值...");
try {
String dayOrMonth = "2";
EpsInitialTrafficData queryParam = new EpsInitialTrafficData();
queryParam.setDayOrMonth(dayOrMonth);
epsInitialTrafficDataService.calculateBusiness95BandwidthDaily(queryParam, monthlyStartTime, monthlyEndTime);
epsInitialTrafficDataService.calculateBusiness95BandwidthDaily(queryParam, monthlyStartTime, monthlyEndTime, calculationMode);
log.info("服务器月95带宽值计算完成");
} catch (Exception e) {
log.error("计算服务器月95带宽值失败", e);
@@ -117,13 +129,13 @@ public class TableScheduleConfig {
/**
* 计算交换机月95带宽值
*/
private void calculateSwitchMonthlyBandwidth(String monthlyStartTime, String monthlyEndTime) {
private void calculateSwitchMonthlyBandwidth(String monthlyStartTime, String monthlyEndTime, String calculationMode) {
log.info("开始计算交换机月95带宽值...");
try {
String dayOrMonth = "2";
InitialSwitchInfoDetails queryParam = new InitialSwitchInfoDetails();
queryParam.setDayOrMonth(dayOrMonth);
initialSwitchInfoDetailsService.calculateSwitch95BandwidthDaily(queryParam, monthlyStartTime, monthlyEndTime);
initialSwitchInfoDetailsService.calculateSwitch95BandwidthDaily(queryParam, monthlyStartTime, monthlyEndTime, calculationMode);
log.info("交换机月95带宽值计算完成");
} catch (Exception e) {
log.error("计算交换机月95带宽值失败", e);

View File

@@ -145,10 +145,10 @@ public class EpsNodeBandwidthController extends BaseController
String dailyEndTime = timeRange.getEnd();
if("1".equals(epsNodeBandwidth.getResourceType())){
// 重新计算服务器95带宽值
epsInitialTrafficDataService.recalculateServer95Bandwidth(epsNodeBandwidth, dailyStartTime, dailyEndTime);
epsInitialTrafficDataService.recalculateServer95Bandwidth(epsNodeBandwidth, dailyStartTime, dailyEndTime, epsNodeBandwidth.getCalculationMode());
}else{
// 重新计算交换机95带宽值
initialSwitchInfoDetailsService.recalculateSwitch95Bandwidth(epsNodeBandwidth, dailyStartTime, dailyEndTime);
initialSwitchInfoDetailsService.recalculateSwitch95Bandwidth(epsNodeBandwidth, dailyStartTime, dailyEndTime, epsNodeBandwidth.getCalculationMode());
}
return success();
}

View File

@@ -136,5 +136,7 @@ public class EpsNodeBandwidth extends BaseEntity
private List<String> nodeNames;
private List<String> switchNames;
/** 计算方式 */
private String calculationMode;
}

View File

@@ -56,5 +56,9 @@ public class RmResourceGroup extends BaseEntity
/** 修改人名称 */
private String updaterName;
/** 监控项 */
private String monitorItems;
/** 自动发现项 */
private String discoveryRules;
}

View File

@@ -118,5 +118,9 @@ public class RmResourceRegistration extends BaseEntity
/** 修改人名称 */
private String updaterName;
/** 监控项 */
private String monitorItems;
/** 自动发现项 */
private String discoveryRules;
}

View File

@@ -1,8 +1,9 @@
package com.ruoyi.system.mapper;
import java.util.List;
import com.ruoyi.system.domain.RmResourceGroup;
import java.util.List;
/**
* 资源分组Mapper接口
*
@@ -58,4 +59,11 @@ public interface RmResourceGroupMapper
* @return 结果
*/
public int deleteRmResourceGroupByIds(Long[] ids);
/**
* 查询资源分组信息和监控项
* @param id
* @return
*/
public RmResourceGroup selectMonitorMsgAndGroupMsg(Long id);
}

View File

@@ -5,6 +5,7 @@ import com.ruoyi.system.domain.EpsNodeBandwidth;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
/**
* EPS表创建服务接口
@@ -46,7 +47,7 @@ public interface EpsInitialTrafficDataService {
* @param queryParam 查询参数实体
* @return 流量数据列表
*/
void calculateBusiness95BandwidthDaily(EpsInitialTrafficData queryParam, String dailyStartTime, String dailyEndTime);
void calculateBusiness95BandwidthDaily(EpsInitialTrafficData queryParam, String dailyStartTime, String dailyEndTime, String calculationMode);
/**
* 重新计算服务器95带宽值
@@ -54,8 +55,13 @@ public interface EpsInitialTrafficDataService {
* @param dailyStartTime 开始时间
* @param dailyEndTime 结束时间
*/
void recalculateServer95Bandwidth(EpsNodeBandwidth epsNodeBandwidth, String dailyStartTime, String dailyEndTime);
void recalculateServer95Bandwidth(EpsNodeBandwidth epsNodeBandwidth, String dailyStartTime, String dailyEndTime, String calculationMode);
/**
* 计算服务器流量使用率(处理带单位的数据)
* @return 包含总带宽、发送带宽和发送占比的Map
*/
Map<String, Object> trafficRateByServer();
/**
* 当前在线服务器发送带宽总流量
* @return

View File

@@ -73,7 +73,7 @@ public interface IInitialSwitchInfoDetailsService
* @param queryParam 查询参数实体
* @return 流量数据列表
*/
void calculateSwitch95BandwidthDaily(InitialSwitchInfoDetails queryParam, String dailyStartTime, String dailyEndTime);
void calculateSwitch95BandwidthDaily(InitialSwitchInfoDetails queryParam, String dailyStartTime, String dailyEndTime, String calculationMode);
/**
* 重新计算交换机95带宽值
@@ -81,7 +81,7 @@ public interface IInitialSwitchInfoDetailsService
* @param dailyStartTime 开始时间
* @param dailyEndTime 结束时间
*/
void recalculateSwitch95Bandwidth(EpsNodeBandwidth epsNodeBandwidth, String dailyStartTime, String dailyEndTime);
void recalculateSwitch95Bandwidth(EpsNodeBandwidth epsNodeBandwidth, String dailyStartTime, String dailyEndTime, String calculationMode);
/**
* 获取交换机相关数据

View File

@@ -1,7 +1,9 @@
package com.ruoyi.system.service;
import java.util.List;
import com.ruoyi.system.domain.RmResourceGroup;
import com.ruoyi.system.domain.RmResourceRegistration;
import java.util.List;
/**
* 资源分组Service接口
@@ -58,4 +60,6 @@ public interface IRmResourceGroupService
* @return 结果
*/
public int deleteRmResourceGroupById(Long id);
List<RmResourceRegistration> getRegisterList(RmResourceGroup rmResourceGroup);
}

View File

@@ -13,6 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
@@ -215,13 +216,14 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
* @param queryParam
*/
@Override
public void calculateBusiness95BandwidthDaily(EpsInitialTrafficData queryParam, String dailyStartTime, String dailyEndTime) {
public void calculateBusiness95BandwidthDaily(EpsInitialTrafficData queryParam,
String dailyStartTime, String dailyEndTime, String calculationMode) {
// 获取所有设备SN列表
List<AllInterfaceName> snList = allInterfaceNameMapper.getAllDeviceSn(new AllInterfaceName());
// 遍历处理每个设备
snList.forEach(interfaceName -> {
queryParam.setServiceSn(interfaceName.getDeviceSn());
processDeviceBandwidth(queryParam, dailyStartTime, dailyEndTime);
processDeviceBandwidth(queryParam, dailyStartTime, dailyEndTime, calculationMode);
});
}
@@ -232,7 +234,7 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
* @param dailyEndTime 结束时间
*/
@Override
public void recalculateServer95Bandwidth(EpsNodeBandwidth epsNodeBandwidth, String dailyStartTime, String dailyEndTime) {
public void recalculateServer95Bandwidth(EpsNodeBandwidth epsNodeBandwidth, String dailyStartTime, String dailyEndTime, String calculationMode ) {
EpsInitialTrafficData epsInitialTrafficData = new EpsInitialTrafficData();
epsInitialTrafficData.setStartTime(dailyStartTime);
epsInitialTrafficData.setEndTime(dailyEndTime);
@@ -244,7 +246,7 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
if(!dataList.isEmpty()){
// 1. 提取并转换带宽值
List<BigDecimal> speedsInMbps = dataList.stream()
.map(data -> CalculateUtil.parseSpeedToMbps(data.getOutSpeed()))
.map(data -> CalculateUtil.parseSpeedToMbps(data.getOutSpeed(), calculationMode))
.sorted()
.collect(Collectors.toList());
@@ -255,16 +257,97 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
EpsInitialTrafficData initialTrafficData = dataList.get(0);
initialTrafficData.setResourceType("1");
initialTrafficData.setBandwidthType(epsNodeBandwidth.getBandwidthType());
saveBandwidthResult(initialTrafficData, percentile95, dailyStartTime);
saveBandwidthResult(initialTrafficData, percentile95, dailyStartTime, calculationMode);
}
}
/**
* 计算服务器流量使用率(处理带单位的数据)
* @return 包含总带宽、发送带宽和发送占比的Map
*/
@Override
public Map<String, Object> trafficRateByServer() {
Map<String, Object> resultMap = new HashMap<>(3);
// 初始化默认值
resultMap.put("outSpeedTotal", BigDecimal.ZERO);
resultMap.put("speedTotal", BigDecimal.ZERO);
resultMap.put("outSpeedRate", BigDecimal.ZERO);
// 获取近5分钟的流量数据
List<EpsInitialTrafficData> dataList = getTrafficData();
if (CollectionUtils.isEmpty(dataList)) {
return resultMap;
}
BigDecimal total = BigDecimal.ZERO;
BigDecimal outTotal = BigDecimal.ZERO;
boolean hasValidData = false;
// 计算总带宽和发送带宽
for (EpsInitialTrafficData data : dataList) {
// 处理发送带宽假设outSpeed已经是标准单位
try {
BigDecimal outSpeed = CalculateUtil.parseSpeedToMbps(data.getOutSpeed(), "1000");
outTotal = outTotal.add(outSpeed);
} catch (Exception e) {
log.warn("Invalid outSpeed value: {}", data.getOutSpeed());
continue;
}
// 处理总带宽(带单位的值如"10000Mb/s"
String speedWithUnit = data.getSpeed();
if (speedWithUnit != null && !"Unknown!".equalsIgnoreCase(speedWithUnit)) {
try {
// 移除单位部分(如"Mb/s"
String numericPart = speedWithUnit.replaceAll("[^0-9.]", "");
BigDecimal speedValue = new BigDecimal(numericPart);
total = total.add(speedValue);
hasValidData = true;
} catch (NumberFormatException e) {
log.warn("Invalid speed value format: {}", speedWithUnit);
}
}
}
// 存储计算结果
resultMap.put("outSpeedTotal", outTotal.setScale(2, RoundingMode.HALF_UP));
resultMap.put("speedTotal", total.setScale(2, RoundingMode.HALF_UP));
// 计算发送带宽占比(只有存在有效数据时才计算)
if (hasValidData && total.compareTo(BigDecimal.ZERO) != 0) {
BigDecimal outSpeedRate = outTotal.divide(total, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
resultMap.put("outSpeedRate", outSpeedRate);
}
return resultMap;
}
/**
* 当前在线服务器发送带宽总流量
* @return
*/
@Override
public BigDecimal sumTrafficByServer() {
// 总带宽
BigDecimal total = BigDecimal.ZERO;
// 近5分钟的带宽明细
List<EpsInitialTrafficData> dataList = getTrafficData();
if(!dataList.isEmpty()){
for (EpsInitialTrafficData initialTrafficData : dataList) {
// 服务器发送带宽流量
BigDecimal outSpeed = CalculateUtil.parseSpeedToMbps(initialTrafficData.getOutSpeed(), "1000");
total = total.add(outSpeed);
}
}
return total.setScale(0, RoundingMode.HALF_UP);
}
/**
* 提取公共方法
* @return
*/
private List<EpsInitialTrafficData> getTrafficData(){
// 获取当前时间
LocalDateTime now = LocalDateTime.now();
// 结束时间
@@ -276,19 +359,11 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
// 格式化为字符串
String dailyStartTime = startTime.format(formatter);
String dailyEndTime = endTime.format(formatter);
BigDecimal total = BigDecimal.ZERO;
EpsInitialTrafficData epsInitialTrafficData = new EpsInitialTrafficData();
epsInitialTrafficData.setStartTime(dailyStartTime);
epsInitialTrafficData.setEndTime(dailyEndTime);
List<EpsInitialTrafficData> dataList = query(epsInitialTrafficData);
if(!dataList.isEmpty()){
for (EpsInitialTrafficData initialTrafficData : dataList) {
// 服务器发送带宽流量
BigDecimal outSpeed = CalculateUtil.parseSpeedToMbps(initialTrafficData.getOutSpeed());
total = total.add(outSpeed);
}
}
return total.setScale(0, RoundingMode.HALF_UP);
return dataList;
}
/**
@@ -296,7 +371,7 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
*/
private void processDeviceBandwidth(EpsInitialTrafficData queryParam,
String dailyStartTime,
String dailyEndTime) {
String dailyEndTime, String calculationMode) {
// 1. 检查设备是否有业务变更
EpsServerRevenueConfig revenueConfig = new EpsServerRevenueConfig();
revenueConfig.setHardwareSn(queryParam.getServiceSn());
@@ -305,9 +380,9 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
// 2. 根据业务变更情况选择计算方式
if (hasTrafficMethodChanged(changedList)) {
calculateChangedDeviceBandwidth(queryParam, dailyStartTime, dailyEndTime);
calculateChangedDeviceBandwidth(queryParam, dailyStartTime, dailyEndTime, calculationMode);
} else {
calculateNormalDeviceBandwidth(queryParam, dailyStartTime, dailyEndTime);
calculateNormalDeviceBandwidth(queryParam, dailyStartTime, dailyEndTime, calculationMode);
}
}
/**
@@ -323,7 +398,7 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
*/
private void calculateChangedDeviceBandwidth(EpsInitialTrafficData queryParam,
String dailyStartTime,
String dailyEndTime) {
String dailyEndTime, String calculationMode) {
// 1. 获取业务变更记录(按时间降序)
EpsMethodChangeRecord changeQuery = new EpsMethodChangeRecord();
changeQuery.setHardwareSn(queryParam.getServiceSn());
@@ -337,9 +412,9 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
records.sort((r1, r2) -> r2.getCreateTime().compareTo(r1.getCreateTime()));
// 3. 计算各时间段95值
calculateTimeSegments95(queryParam, records, dailyStartTime, dailyEndTime);
calculateTimeSegments95(queryParam, records, dailyStartTime, dailyEndTime, calculationMode);
}else{
calculateNormalDeviceBandwidth(queryParam, dailyStartTime, dailyEndTime);
calculateNormalDeviceBandwidth(queryParam, dailyStartTime, dailyEndTime, calculationMode);
}
}
/**
@@ -347,19 +422,19 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
*/
private void calculateNormalDeviceBandwidth(EpsInitialTrafficData queryParam,
String dailyStartTime,
String dailyEndTime) {
String dailyEndTime, String calculationMode) {
queryParam.setStartTime(dailyStartTime);
queryParam.setEndTime(dailyEndTime);
List<EpsInitialTrafficData> dataList = query(queryParam);
if (!dataList.isEmpty()) {
calculateAndSave95Bandwidth(dataList, dailyStartTime, queryParam.getDayOrMonth());
calculateAndSave95Bandwidth(dataList, dailyStartTime, queryParam.getDayOrMonth(), calculationMode);
}
}
/**
* 计算并保存95带宽值
*/
private void calculateAndSave95Bandwidth(List<EpsInitialTrafficData> dataList, String dateTime, String dayOrMonth) {
private void calculateAndSave95Bandwidth(List<EpsInitialTrafficData> dataList, String dateTime, String dayOrMonth, String calculationMode) {
boolean eff = false;
if(!dataList.isEmpty()){
if(dataList.size()<288){
@@ -367,7 +442,7 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
}
// 1. 提取并转换带宽值
List<BigDecimal> speedsInMbps = dataList.stream()
.map(data -> CalculateUtil.parseSpeedToMbps(data.getOutSpeed()))
.map(data -> CalculateUtil.parseSpeedToMbps(data.getOutSpeed(), calculationMode))
.sorted()
.collect(Collectors.toList());
@@ -396,7 +471,7 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
}
}
}
saveBandwidthResult(epsInitialTrafficData, percentile95, dateTime);
saveBandwidthResult(epsInitialTrafficData, percentile95, dateTime, calculationMode);
}
}
@@ -406,32 +481,32 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
private void calculateTimeSegments95(EpsInitialTrafficData queryParam,
List<EpsMethodChangeRecord> records,
String dailyStartTime,
String dailyEndTime) {
String dailyEndTime, String calculationMode) {
// 1. 处理变更时间段(从最新到最早)
String endTime = records.get(0).getCreateTime() + "";
for (int i = 1; i < records.size(); i++) {
String startTime = records.get(i).getCreateTime() + "";
calculateSegment95(queryParam, startTime, endTime);
calculateSegment95(queryParam, startTime, endTime, calculationMode);
endTime = startTime; // 移动时间窗口
}
// 2. 处理最早变更前的时间段昨天00:00:00 ~ 最早变更时间)
String earliestChangeTime = records.get(records.size()-1).getCreateTime() + "";
calculateSegment95(queryParam, dailyStartTime, earliestChangeTime);
calculateSegment95(queryParam, dailyStartTime, earliestChangeTime, calculationMode);
// 3. 处理最后变更后的时间段(最新变更时间 ~ 昨天23:59:59
calculateSegment95(queryParam, endTime, dailyEndTime);
calculateSegment95(queryParam, endTime, dailyEndTime, calculationMode);
}
/**
* 计算单个时间段的95带宽值
*/
private void calculateSegment95(EpsInitialTrafficData queryParam, String startTime, String endTime) {
private void calculateSegment95(EpsInitialTrafficData queryParam, String startTime, String endTime, String calculationMode) {
queryParam.setStartTime(startTime);
queryParam.setEndTime(endTime);
List<EpsInitialTrafficData> dataList = query(queryParam);
if (!dataList.isEmpty()) {
calculate95BandwidthDaily(dataList, startTime, queryParam.getDayOrMonth());
calculate95BandwidthDaily(dataList, startTime, queryParam.getDayOrMonth(), calculationMode);
}
}
@@ -439,10 +514,10 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
* 计算日95带宽值
* @param dataList
*/
private void calculate95BandwidthDaily(List<EpsInitialTrafficData> dataList, String startTime, String dayOrMonth){
private void calculate95BandwidthDaily(List<EpsInitialTrafficData> dataList, String startTime, String dayOrMonth, String calculationMode){
// 1. 提取 outSpeed 并转换为 Mbps
List<BigDecimal> speedsInMbps = dataList.stream()
.map(data -> CalculateUtil.parseSpeedToMbps(data.getOutSpeed()))
.map(data -> CalculateUtil.parseSpeedToMbps(data.getOutSpeed(), calculationMode))
.sorted()
.collect(Collectors.toList());
@@ -482,16 +557,17 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
}
}
}
saveBandwidthResult(epsInitialTrafficData, dailyResult, startTime);
saveBandwidthResult(epsInitialTrafficData, dailyResult, startTime, calculationMode);
}
/**
* 保存带宽结果
*/
private void saveBandwidthResult(EpsInitialTrafficData data,
BigDecimal result,
String dateTime) {
String dateTime, String calculationMode) {
EpsNodeBandwidth bandwidth = new EpsNodeBandwidth();
bandwidth.setHardwareSn(data.getServiceSn());
bandwidth.setCalculationMode(calculationMode);
bandwidth.setNodeName(data.getNodeName());
bandwidth.setBusinessId(data.getBusinessId());
bandwidth.setBusinessName(data.getBusinessName());

View File

@@ -306,7 +306,8 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
!Objects.equals(oldRecord.getSwitchIp(), newRecord.getSwitchIp());
}
public void calculateSwitch95BandwidthDaily(InitialSwitchInfoDetails queryParam, String dailyStartTime, String dailyEndTime) {
public void calculateSwitch95BandwidthDaily(InitialSwitchInfoDetails queryParam, String dailyStartTime,
String dailyEndTime, String calculationMode) {
// 查询所有的交换机SN列表
AllInterfaceName allInterfaceName = new AllInterfaceName();
List<AllInterfaceName> switchSnList = allInterfaceNameMapper.getAllSwitchSn(allInterfaceName);
@@ -315,7 +316,7 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
switchSnList.forEach(interfaceName -> {
queryParam.setSwitchSn(interfaceName.getSwitchSn());
queryParam.setSwitchIp(interfaceName.getSwitchIp());
processSwitchBandwidth(queryParam, dailyStartTime, dailyEndTime);
processSwitchBandwidth(queryParam, dailyStartTime, dailyEndTime, calculationMode);
});
}
@@ -326,7 +327,8 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
* @param dailyEndTime 结束时间
*/
@Override
public void recalculateSwitch95Bandwidth(EpsNodeBandwidth epsNodeBandwidth, String dailyStartTime, String dailyEndTime) {
public void recalculateSwitch95Bandwidth(EpsNodeBandwidth epsNodeBandwidth, String dailyStartTime,
String dailyEndTime, String calculationMode) {
InitialSwitchInfoDetails switchInfoDetails = new InitialSwitchInfoDetails();
switchInfoDetails.setStartTime(dailyStartTime);
switchInfoDetails.setEndTime(dailyEndTime);
@@ -351,7 +353,7 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
if (speed.matches("^\\d+(\\.\\d+)?$")) {
speed += " B/S";
}
return CalculateUtil.parseSpeedToMbps(speed);
return CalculateUtil.parseSpeedToMbps(speed, calculationMode);
})
.sorted()
.collect(Collectors.toList());
@@ -363,7 +365,7 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
InitialSwitchInfoDetails switchInfo = dataList.get(0);
switchInfo.setResourceType("2");
switchInfo.setBandwidthType(epsNodeBandwidth.getBandwidthType());
saveSwitchBandwidthResult(switchInfo, percentile95, dailyStartTime);
saveSwitchBandwidthResult(switchInfo, percentile95, dailyStartTime, calculationMode);
}
}
@@ -418,7 +420,7 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
if (speed.matches("^\\d+(\\.\\d+)?$")) {
speed += " B/S";
}
BigDecimal inSpeed = CalculateUtil.parseSpeedToMbps(speed);
BigDecimal inSpeed = CalculateUtil.parseSpeedToMbps(speed, "1000");
total = total.add(inSpeed);
}
}
@@ -431,7 +433,7 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
*/
private void processSwitchBandwidth(InitialSwitchInfoDetails queryParam,
String dailyStartTime,
String dailyEndTime) {
String dailyEndTime, String calculationMode) {
// 根据交换机sn查询连接的服务器sn
RmEpsTopologyManagement management = new RmEpsTopologyManagement();
management.setSwitchSn(queryParam.getSwitchSn());
@@ -449,13 +451,13 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
.selectEpsServerRevenueConfigList(revenueConfig);
// 根据业务变更情况选择计算方式
if (hasTrafficMethodChanged(changedList)) {
calculateChangedSwitchBandwidth(queryParam, dailyStartTime, dailyEndTime);
calculateChangedSwitchBandwidth(queryParam, dailyStartTime, dailyEndTime, calculationMode);
} else {
calculateNormalSwitchBandwidth(queryParam, dailyStartTime, dailyEndTime);
calculateNormalSwitchBandwidth(queryParam, dailyStartTime, dailyEndTime, calculationMode);
}
}
if("2".equals(rmEpsTopologyManagement.getConnectedDeviceType())){
calculateNormalSwitchBandwidth(queryParam, dailyStartTime, dailyEndTime);
calculateNormalSwitchBandwidth(queryParam, dailyStartTime, dailyEndTime, calculationMode);
}
}
}
@@ -474,7 +476,7 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
*/
private void calculateChangedSwitchBandwidth(InitialSwitchInfoDetails queryParam,
String dailyStartTime,
String dailyEndTime) {
String dailyEndTime, String calculationMode) {
// 获取业务变更记录(按时间降序)
EpsMethodChangeRecord changeQuery = new EpsMethodChangeRecord();
changeQuery.setHardwareSn(queryParam.getServerSn());
@@ -488,9 +490,9 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
records.sort((r1, r2) -> r2.getCreateTime().compareTo(r1.getCreateTime()));
// 计算各时间段95值
calculateSwitchTimeSegments95(queryParam, records, dailyStartTime, dailyEndTime);
calculateSwitchTimeSegments95(queryParam, records, dailyStartTime, dailyEndTime, calculationMode);
}else {
calculateNormalSwitchBandwidth(queryParam, dailyStartTime, dailyEndTime);
calculateNormalSwitchBandwidth(queryParam, dailyStartTime, dailyEndTime, calculationMode);
}
}
@@ -499,21 +501,22 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
*/
private void calculateNormalSwitchBandwidth(InitialSwitchInfoDetails queryParam,
String dailyStartTime,
String dailyEndTime) {
String dailyEndTime, String calculationMode) {
queryParam.setStartTime(dailyStartTime);
queryParam.setEndTime(dailyEndTime);
List<InitialSwitchInfoDetails> dataList = initialSwitchInfoDetailsMapper
.selectInitialSwitchInfoDetailsList(queryParam);
if (!dataList.isEmpty()) {
calculateAndSaveSwitch95Bandwidth(dataList, dailyStartTime, queryParam.getDayOrMonth());
calculateAndSaveSwitch95Bandwidth(dataList, dailyStartTime, queryParam.getDayOrMonth(), calculationMode);
}
}
/**
* 计算并保存交换机95带宽值
*/
private void calculateAndSaveSwitch95Bandwidth(List<InitialSwitchInfoDetails> dataList, String dateTime, String dayOrMonth) {
private void calculateAndSaveSwitch95Bandwidth(List<InitialSwitchInfoDetails> dataList, String dateTime,
String dayOrMonth, String calculationMode) {
boolean eff = false;
if(!dataList.isEmpty()){
if(dataList.size()<288){
@@ -530,7 +533,7 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
if (speed.matches("^\\d+(\\.\\d+)?$")) {
speed += " B/S";
}
return CalculateUtil.parseSpeedToMbps(speed);
return CalculateUtil.parseSpeedToMbps(speed, calculationMode);
})
.sorted()
.collect(Collectors.toList());
@@ -555,7 +558,7 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
switchInfo.setBandwidthType("2");
}
}
saveSwitchBandwidthResult(switchInfo, percentile95, dateTime);
saveSwitchBandwidthResult(switchInfo, percentile95, dateTime, calculationMode);
}
}
@@ -565,40 +568,41 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
private void calculateSwitchTimeSegments95(InitialSwitchInfoDetails queryParam,
List<EpsMethodChangeRecord> records,
String dailyStartTime,
String dailyEndTime) {
String dailyEndTime, String calculationMode) {
// 1. 处理变更时间段(从最新到最早)
String endTime = records.get(0).getCreateTime() + "";
for (int i = 1; i < records.size(); i++) {
String startTime = records.get(i).getCreateTime() + "";
calculateSwitchSegment95(queryParam, startTime, endTime);
calculateSwitchSegment95(queryParam, startTime, endTime, calculationMode);
endTime = startTime; // 移动时间窗口
}
// 2. 处理最早变更前的时间段昨天00:00:00 ~ 最早变更时间)
String earliestChangeTime = records.get(records.size()-1).getCreateTime() + "";
calculateSwitchSegment95(queryParam, dailyStartTime, earliestChangeTime);
calculateSwitchSegment95(queryParam, dailyStartTime, earliestChangeTime, calculationMode);
// 3. 处理最后变更后的时间段(最新变更时间 ~ 昨天23:59:59
calculateSwitchSegment95(queryParam, endTime, dailyEndTime);
calculateSwitchSegment95(queryParam, endTime, dailyEndTime, calculationMode);
}
/**
* 计算交换机单个时间段的95带宽值
*/
private void calculateSwitchSegment95(InitialSwitchInfoDetails queryParam, String startTime, String endTime) {
private void calculateSwitchSegment95(InitialSwitchInfoDetails queryParam, String startTime, String endTime, String calculationMode) {
queryParam.setStartTime(startTime);
queryParam.setEndTime(endTime);
List<InitialSwitchInfoDetails> dataList = initialSwitchInfoDetailsMapper
.selectInitialSwitchInfoDetailsList(queryParam);
if (!dataList.isEmpty()) {
calculateSwitch95BandwidthDaily(dataList, startTime, queryParam.getDayOrMonth());
calculateSwitch95BandwidthDaily(dataList, startTime, queryParam.getDayOrMonth(), calculationMode);
}
}
/**
* 计算交换机日95带宽值
*/
private void calculateSwitch95BandwidthDaily(List<InitialSwitchInfoDetails> dataList, String startTime, String dayOrMonth) {
private void calculateSwitch95BandwidthDaily(List<InitialSwitchInfoDetails> dataList,
String startTime, String dayOrMonth, String calculationMode) {
// 1. 提取并转换带宽值
List<BigDecimal> speedsInMbps = dataList.stream()
.map(data -> {
@@ -609,7 +613,7 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
if (speed.matches("^\\d+(\\.\\d+)?$")) {
speed += " B/S";
}
return CalculateUtil.parseSpeedToMbps(speed);
return CalculateUtil.parseSpeedToMbps(speed, calculationMode);
})
.sorted()
.collect(Collectors.toList());
@@ -636,7 +640,7 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
switchInfo.setBandwidthType("2");
}
}
saveSwitchBandwidthResult(switchInfo, dailyResult, startTime);
saveSwitchBandwidthResult(switchInfo, dailyResult, startTime, calculationMode);
}
/**
@@ -644,11 +648,12 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
*/
private void saveSwitchBandwidthResult(InitialSwitchInfoDetails data,
BigDecimal result,
String dateTime) {
String dateTime, String calculationMode) {
EpsNodeBandwidth bandwidth = new EpsNodeBandwidth();
bandwidth.setBusinessName(data.getBusinessName());
bandwidth.setBusinessId(data.getBusinessCode());
bandwidth.setHardwareSn(data.getServerSn());
bandwidth.setCalculationMode(calculationMode);
bandwidth.setSwitchSn(data.getSwitchSn());
bandwidth.setNodeName(data.getServerName());
bandwidth.setUplinkSwitch(data.getSwitchName());

View File

@@ -1,12 +1,15 @@
package com.ruoyi.system.service.impl;
import java.util.List;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.system.domain.RmResourceGroup;
import com.ruoyi.system.domain.RmResourceRegistration;
import com.ruoyi.system.mapper.RmResourceGroupMapper;
import com.ruoyi.system.mapper.RmResourceRegistrationMapper;
import com.ruoyi.system.service.IRmResourceGroupService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.RmResourceGroupMapper;
import com.ruoyi.system.domain.RmResourceGroup;
import com.ruoyi.system.service.IRmResourceGroupService;
import java.util.List;
/**
* 资源分组Service业务层处理
@@ -19,6 +22,8 @@ public class RmResourceGroupServiceImpl implements IRmResourceGroupService
{
@Autowired
private RmResourceGroupMapper rmResourceGroupMapper;
@Autowired
private RmResourceRegistrationMapper rmResourceRegistrationMapper;
/**
* 查询资源分组
@@ -93,4 +98,30 @@ public class RmResourceGroupServiceImpl implements IRmResourceGroupService
{
return rmResourceGroupMapper.deleteRmResourceGroupById(id);
}
@Override
public List<RmResourceRegistration> getRegisterList(RmResourceGroup rmResourceGroup) {
if(rmResourceGroup.getId() == null){
RmResourceRegistration queryParam = new RmResourceRegistration();
List<RmResourceRegistration> rmResourceRegistrationList = rmResourceRegistrationMapper.selectRmResourceRegistrationList(queryParam);
for (RmResourceRegistration rmResourceRegistration : rmResourceRegistrationList) {
RmResourceGroup item = rmResourceGroupMapper.selectMonitorMsgAndGroupMsg(rmResourceRegistration.getId());
rmResourceRegistration.setMonitorItems(item.getMonitorItems());
rmResourceRegistration.setDiscoveryRules(item.getDiscoveryRules());
}
return rmResourceRegistrationList;
}else{
RmResourceGroup group = rmResourceGroupMapper.selectRmResourceGroupById(rmResourceGroup.getId());
String ids = group.getIncludedDevicesId();
String[] resourceIds = ids.split(",");
// 拿到资源信息
List<RmResourceRegistration> rmResourceRegistrationList = rmResourceRegistrationMapper.getRegistrationByIds(resourceIds);
for (RmResourceRegistration rmResourceRegistration : rmResourceRegistrationList) {
RmResourceGroup item = rmResourceGroupMapper.selectMonitorMsgAndGroupMsg(rmResourceRegistration.getId());
rmResourceRegistration.setMonitorItems(item.getMonitorItems());
rmResourceRegistration.setDiscoveryRules(item.getDiscoveryRules());
}
return rmResourceRegistrationList;
}
}
}

View File

@@ -14,7 +14,7 @@ public class CalculateUtil {
* @param speedWithUnit
* @return
*/
public static BigDecimal parseSpeedToMbps(String speedWithUnit) {
public static BigDecimal parseSpeedToMbps(String speedWithUnit, String mode) {
if (speedWithUnit == null || speedWithUnit.trim().isEmpty()) {
return BigDecimal.ZERO;
}
@@ -31,31 +31,56 @@ public class CalculateUtil {
if (unit.isEmpty()) {
unit = "B/S"; // 默认单位: Bytes/s
}
// 单位换算逻辑(保持不变)
switch (mode) {
case "1000":
return convertWithDecimalCoefficients(value, unit);
case "1024":
return convertWithBinaryCoefficients(value, unit);
default:
throw new UnsupportedOperationException("Unknown mode: " + mode);
}
}
// 1000进制换算
private static BigDecimal convertWithDecimalCoefficients(BigDecimal value, String unit) {
switch (unit) {
case "B/S":
return value.multiply(new BigDecimal("0.000008"));
case "KBPS":
return value.multiply(new BigDecimal("0.000008")) // 8/1000000
.setScale(2, RoundingMode.HALF_UP);
case "KB/S":
return value.divide(new BigDecimal("1000"), 10, RoundingMode.HALF_UP);
case "MBPS":
return value.multiply(new BigDecimal("0.008")) // 8/1000
.setScale(2, RoundingMode.HALF_UP);
case "MB/S":
return value;
case "GBPS":
return value.setScale(2, RoundingMode.HALF_UP);
case "GB/S":
return value.multiply(new BigDecimal("1000"));
case "TBPS":
return value.multiply(new BigDecimal("8000")) // 1000 * 8
.setScale(2, RoundingMode.HALF_UP);
case "TB/S":
return value.multiply(new BigDecimal("1000000"));
case "KIB/S":
return value.multiply(new BigDecimal("0.008192"));
case "MIB/S":
return value.multiply(new BigDecimal("8.388608"));
case "GIB/S":
return value.multiply(new BigDecimal("8589.934592"));
return value.multiply(new BigDecimal("8000000")) // 1000 * 1000 * 8
.setScale(2, RoundingMode.HALF_UP);
default:
throw new IllegalArgumentException("Unknown speed unit: " + unit);
throw new IllegalArgumentException("Unsupported DECIMAL unit: " + unit);
}
}
// 1024进制换算
private static BigDecimal convertWithBinaryCoefficients(BigDecimal value, String unit) {
switch (unit) {
case "B/S":
return value.multiply(new BigDecimal("0.00000762939")) // 8/1048576
.setScale(2, RoundingMode.HALF_UP);
case "KB/S":
return value.multiply(new BigDecimal("0.0078125")) // 8/1024
.setScale(2, RoundingMode.HALF_UP);
case "MB/S":
return value.setScale(2, RoundingMode.HALF_UP);
case "GB/S":
return value.multiply(new BigDecimal("8192")) // 1024 * 8
.setScale(2, RoundingMode.HALF_UP);
case "TB/S":
return value.multiply(new BigDecimal("8388608")) // 1024 * 1024 * 8
.setScale(2, RoundingMode.HALF_UP);
default:
throw new IllegalArgumentException("Unsupported BINARY unit: " + unit);
}
}

View File

@@ -8,6 +8,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="id" column="id" />
<result property="nodeName" column="node_name" />
<result property="hardwareSn" column="hardware_sn" />
<result property="calculationMode" column="calculation_mode" />
<result property="bandwidthType" column="bandwidth_type" />
<result property="bandwidthResult" column="bandwidth_result" />
<result property="bandwidth95Daily" column="bandwidth_95_daily" />
@@ -36,7 +37,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
<sql id="selectEpsNodeBandwidthVo">
select id, node_name, hardware_sn, bandwidth_type, bandwidth_result, bandwidth_95_daily, bandwidth_95_monthly, avg_monthly_bandwidth_95, package_bandwidth_daily, customer_id, customer_name, service_number, uplink_switch, create_time, update_time, creator_id, creator_name, switch_sn, interface_name, resource_type, interface_link_device_type, effective_bandwidth_95_daily, effective_bandwidth_95_monthly, effective_avg_monthly_bandwidth_95, business_name, business_id, remark1, create_datetime from eps_node_bandwidth
select id, node_name, hardware_sn, calculation_mode, bandwidth_type, bandwidth_result, bandwidth_95_daily, bandwidth_95_monthly, avg_monthly_bandwidth_95, package_bandwidth_daily, customer_id, customer_name, service_number, uplink_switch, create_time, update_time, creator_id, creator_name, switch_sn, interface_name, resource_type, interface_link_device_type, effective_bandwidth_95_daily, effective_bandwidth_95_monthly, effective_avg_monthly_bandwidth_95, business_name, business_id, remark1, create_datetime from eps_node_bandwidth
</sql>
<select id="selectEpsNodeBandwidthList" parameterType="EpsNodeBandwidth" resultMap="EpsNodeBandwidthResult">
@@ -44,6 +45,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<where>
<if test="nodeName != null and nodeName != ''"> and node_name like concat('%', #{nodeName}, '%')</if>
<if test="hardwareSn != null and hardwareSn != ''"> and hardware_sn = #{hardwareSn}</if>
<if test="calculationMode != null and calculationMode != ''"> and calculation_mode = #{calculationMode}</if>
<if test="bandwidthType != null and bandwidthType != ''"> and bandwidth_type = #{bandwidthType}</if>
<if test="bandwidthResult != null "> and bandwidth_result = #{bandwidthResult}</if>
<if test="bandwidth95Daily != null "> and bandwidth_95_daily = #{bandwidth95Daily}</if>
@@ -95,6 +97,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="nodeName != null">node_name,</if>
<if test="hardwareSn != null">hardware_sn,</if>
<if test="calculationMode != null">calculation_mode,</if>
<if test="bandwidthType != null">bandwidth_type,</if>
<if test="bandwidthResult != null">bandwidth_result,</if>
<if test="bandwidth95Daily != null">bandwidth_95_daily,</if>
@@ -124,6 +127,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="nodeName != null">#{nodeName},</if>
<if test="hardwareSn != null">#{hardwareSn},</if>
<if test="calculationMode != null">#{calculationMode},</if>
<if test="bandwidthType != null">#{bandwidthType},</if>
<if test="bandwidthResult != null">#{bandwidthResult},</if>
<if test="bandwidth95Daily != null">#{bandwidth95Daily},</if>
@@ -157,6 +161,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<trim prefix="SET" suffixOverrides=",">
<if test="nodeName != null">node_name = #{nodeName},</if>
<if test="hardwareSn != null">hardware_sn = #{hardwareSn},</if>
<if test="calculationMode != null">calculation_mode = #{calculationMode},</if>
<if test="bandwidthType != null">bandwidth_type = #{bandwidthType},</if>
<if test="bandwidthResult != null">bandwidth_result = #{bandwidthResult},</if>
<if test="bandwidth95Daily != null">bandwidth_95_daily = #{bandwidth95Daily},</if>

View File

@@ -96,4 +96,9 @@
#{id}
</foreach>
</delete>
<select id="selectMonitorMsgAndGroupMsg" parameterType="Long" resultType="RmResourceGroup">
select b.monitor_items monitorItems,b.discovery_rules discoveryRules from rm_resource_group a left join rm_monitor_template b on a.id=b.resource_group_id
where FIND_IN_SET(#{id}, a.included_devices_id) > 0
</select>
</mapper>