设置定时任务,每月1号0点执行 计算 月均日95值,95带宽值/月

This commit is contained in:
gaoyutao
2025-08-28 21:13:05 +08:00
parent 966bd5cbec
commit ea6e65bfaf
15 changed files with 1025 additions and 594 deletions

View File

@@ -1,25 +1,47 @@
package com.ruoyi.system.config; package com.ruoyi.system.config;
import com.ruoyi.system.domain.EpsInitialTrafficData; import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.system.domain.InitialSwitchInfoDetails; import com.ruoyi.system.domain.*;
import com.ruoyi.system.service.EpsInitialTrafficDataService; import com.ruoyi.system.service.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/** /**
* 自动生成数据表 * 自动生成数据表
*/ */
@Configuration @Configuration
@EnableScheduling @EnableScheduling
@Slf4j
public class TableScheduleConfig { public class TableScheduleConfig {
private static final DateTimeFormatter TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Autowired @Autowired
private EpsInitialTrafficDataService epsInitialTrafficDataService; private EpsInitialTrafficDataService epsInitialTrafficDataService;
@Autowired
private IInitialSwitchInfoDetailsService initialSwitchInfoDetailsService;
@Autowired
private IEpsNodeBandwidthService epsNodeBandwidthService;
@Autowired
private IAllInterfaceNameService allInterfaceNameService;
@Autowired
private IEpsServerRevenueConfigService epsServerRevenueConfigService;
@Autowired
private IRmEpsTopologyManagementService rmEpsTopologyManagementService;
@Autowired
private IEpsMethodChangeRecordService epsMethodChangeRecordService;
// 每月25号创建下月表 // 每月25号创建下月表
@Scheduled(cron = "0 0 0 26 * ?") @Scheduled(cron = "0 0 0 25 * ?")
// @Scheduled(initialDelay = 5000, fixedDelay = Long.MAX_VALUE) // @Scheduled(initialDelay = 5000, fixedDelay = Long.MAX_VALUE)
public void createNextMonthTables() { public void createNextMonthTables() {
epsInitialTrafficDataService.createNextMonthTables(); epsInitialTrafficDataService.createNextMonthTables();
@@ -28,11 +50,347 @@ public class TableScheduleConfig {
// 每天12点执行 计算95带宽值/日 // 每天12点执行 计算95带宽值/日
@Scheduled(cron = "0 0 0 * * ?", zone = "Asia/Shanghai") @Scheduled(cron = "0 0 0 * * ?", zone = "Asia/Shanghai")
public void calculate95BandwidthDaily() { public void calculate95BandwidthDaily() {
EpsInitialTrafficData queryParam = new EpsInitialTrafficData(); // 获取昨天的日期范围(北京时间)
epsInitialTrafficDataService.calculate95BandwidthDaily(queryParam); LocalDate yesterday = LocalDate.now(ZoneId.of("Asia/Shanghai")).minusDays(1);
String dailyStartTime = yesterday.atStartOfDay().format(TIME_FORMAT); // 00:00:00
String dailyEndTime = yesterday.atTime(23, 59, 59).format(TIME_FORMAT); // 23:59:59
// 日
String dayOrMonth = "1";
// 有效-95带宽值/日 // 有效-95带宽值/日
epsInitialTrafficDataService.calculateBusiness95BandwidthDaily(queryParam); EpsInitialTrafficData queryParam = new EpsInitialTrafficData();
queryParam.setDayOrMonth(dayOrMonth);
epsInitialTrafficDataService.calculateBusiness95BandwidthDaily(queryParam, dailyStartTime, dailyEndTime);
InitialSwitchInfoDetails initialSwitchInfoDetails = new InitialSwitchInfoDetails(); InitialSwitchInfoDetails initialSwitchInfoDetails = new InitialSwitchInfoDetails();
epsInitialTrafficDataService.calculateSwitch95BandwidthDaily(initialSwitchInfoDetails); initialSwitchInfoDetails.setDayOrMonth(dayOrMonth);
initialSwitchInfoDetailsService.calculateSwitch95BandwidthDaily(initialSwitchInfoDetails, dailyStartTime, dailyEndTime);
}
// 每月1号0点执行 计算95带宽值/月
@Scheduled(cron = "0 0 0 1 * ?", zone = "Asia/Shanghai")
public void calculateMonthlyBandwidthTasks() {
// 获取上个月的日期范围
LocalDate lastMonth = LocalDate.now(ZoneId.of("Asia/Shanghai")).minusMonths(0);
LocalDate firstDayOfMonth = lastMonth.withDayOfMonth(1);
LocalDate lastDayOfMonth = lastMonth.withDayOfMonth(lastMonth.lengthOfMonth());
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);
}
/**
* 延迟执行任务
*/
private void executeWithDelay(Runnable task, int delayMinutes) {
try {
if (delayMinutes > 0) {
Thread.sleep(delayMinutes * 60 * 1000);
}
task.run();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
log.error("任务执行被中断", e);
}
}
/**
* 计算服务器月95带宽值
*/
private void calculateServerMonthlyBandwidth(String monthlyStartTime, String monthlyEndTime) {
log.info("开始计算服务器月95带宽值...");
try {
String dayOrMonth = "2";
EpsInitialTrafficData queryParam = new EpsInitialTrafficData();
queryParam.setDayOrMonth(dayOrMonth);
epsInitialTrafficDataService.calculateBusiness95BandwidthDaily(queryParam, monthlyStartTime, monthlyEndTime);
log.info("服务器月95带宽值计算完成");
} catch (Exception e) {
log.error("计算服务器月95带宽值失败", e);
}
}
/**
* 计算交换机月95带宽值
*/
private void calculateSwitchMonthlyBandwidth(String monthlyStartTime, String monthlyEndTime) {
log.info("开始计算交换机月95带宽值...");
try {
String dayOrMonth = "2";
InitialSwitchInfoDetails queryParam = new InitialSwitchInfoDetails();
queryParam.setDayOrMonth(dayOrMonth);
initialSwitchInfoDetailsService.calculateSwitch95BandwidthDaily(queryParam, monthlyStartTime, monthlyEndTime);
log.info("交换机月95带宽值计算完成");
} catch (Exception e) {
log.error("计算交换机月95带宽值失败", e);
}
}
/**
* 计算服务器月平均95带宽值
*/
private void calculateServerAvgMonthlyBandwidth(String monthlyStartTime, String monthlyEndTime) {
log.info("开始计算服务器月平均95带宽值...");
try {
EpsNodeBandwidth epsNodeBandwidth = new EpsNodeBandwidth();
epsNodeBandwidth.setStartTime(monthlyStartTime);
epsNodeBandwidth.setEndTime(monthlyEndTime);
List<AllInterfaceName> snList = allInterfaceNameService.getAllDeviceSn(new AllInterfaceName());
for (AllInterfaceName allInterfaceName : snList) {
processServerAvgBandwidth(epsNodeBandwidth, allInterfaceName);
}
log.info("服务器月平均95带宽值计算完成");
} catch (Exception e) {
log.error("计算服务器月平均95带宽值失败", e);
}
}
/**
* 处理单个服务器的平均带宽计算
*/
private void processServerAvgBandwidth(EpsNodeBandwidth epsNodeBandwidth, AllInterfaceName allInterfaceName) {
final String deviceSn = allInterfaceName.getDeviceSn();
try {
// 1. 设置基础设备信息
epsNodeBandwidth.setHardwareSn(deviceSn);
// 2. 查询服务器配置
EpsServerRevenueConfig queryConfig = new EpsServerRevenueConfig();
queryConfig.setHardwareSn(deviceSn);
List<EpsServerRevenueConfig> configList = epsServerRevenueConfigService.selectEpsServerRevenueConfigList(queryConfig);
EpsServerRevenueConfig serverConfig = configList.isEmpty() ? new EpsServerRevenueConfig() : configList.get(0);
epsNodeBandwidth.setNodeName(serverConfig.getNodeName());
// 3. 检查是否需要处理业务变更
boolean shouldProcessChange = serverConfig.getUpdateTime() != null
&& epsNodeBandwidth.getStartTime() != null
&& epsNodeBandwidth.getStartTime().length() >= 10
&& "1".equals(serverConfig.getChanged())
&& DateUtils.parseDateToStr("yyyy-MM", serverConfig.getUpdateTime())
.equals(epsNodeBandwidth.getStartTime().substring(0, 7));
// 4. 处理业务变更情况
if (shouldProcessChange) {
// 查询业务变更记录
EpsMethodChangeRecord changeQuery = new EpsMethodChangeRecord();
changeQuery.setHardwareSn(deviceSn);
changeQuery.setStartTime(epsNodeBandwidth.getStartTime());
changeQuery.setEndTime(epsNodeBandwidth.getEndTime());
List<EpsMethodChangeRecord> records = epsMethodChangeRecordService.selectEpsMethodChangeRecordList(changeQuery);
// 按businessCode分组处理修复null key问题
if (!records.isEmpty()) {
Map<String, List<EpsMethodChangeRecord>> groupedRecords = records.stream()
.filter(record -> record.getBusinessCode() != null) // 过滤掉businessCode为null的记录
.collect(Collectors.groupingBy(EpsMethodChangeRecord::getBusinessCode));
// 处理每个业务分组
for (Map.Entry<String, List<EpsMethodChangeRecord>> entry : groupedRecords.entrySet()) {
String businessCode = entry.getKey();
// 取第一个有效业务名称同businessCode的业务名称应该相同
String businessName = entry.getValue().stream()
.filter(r -> r.getBusinessName() != null)
.findFirst()
.map(EpsMethodChangeRecord::getBusinessName)
.orElse("未知业务");
// 创建业务带宽对象
EpsNodeBandwidth bandwidthWithBiz = new EpsNodeBandwidth();
bandwidthWithBiz.setHardwareSn(deviceSn);
bandwidthWithBiz.setNodeName(serverConfig.getNodeName());
bandwidthWithBiz.setStartTime(epsNodeBandwidth.getStartTime());
bandwidthWithBiz.setEndTime(epsNodeBandwidth.getEndTime());
bandwidthWithBiz.setBusinessId(businessCode);
bandwidthWithBiz.setBusinessName(businessName);
bandwidthWithBiz.setResourceType("1");
// 执行计算
epsNodeBandwidthService.calculateAvg(bandwidthWithBiz);
}
// 处理businessCode为null的记录如果有
List<EpsMethodChangeRecord> nullBusinessRecords = records.stream()
.filter(record -> record.getBusinessCode() == null)
.collect(Collectors.toList());
if (!nullBusinessRecords.isEmpty()) {
log.warn("服务器 {} 有 {} 条记录的businessCode为null", deviceSn, nullBusinessRecords.size());
// 可以选择记录日志或进行其他处理
}
return; // 业务变更处理完成后直接返回
}
}
// 5. 处理正常情况(无业务变更或无需处理变更)
EpsNodeBandwidth normalBandwidth = new EpsNodeBandwidth();
normalBandwidth.setHardwareSn(deviceSn);
normalBandwidth.setNodeName(serverConfig.getNodeName());
normalBandwidth.setStartTime(epsNodeBandwidth.getStartTime());
normalBandwidth.setEndTime(epsNodeBandwidth.getEndTime());
normalBandwidth.setBusinessId(serverConfig.getBusinessCode());
normalBandwidth.setBusinessName(serverConfig.getBusinessName());
normalBandwidth.setResourceType("1");
epsNodeBandwidthService.calculateAvg(normalBandwidth);
} catch (Exception e) {
log.error("处理服务器 {} 平均带宽失败", deviceSn, e);
}
}
/**
* 计算交换机月平均95带宽值
*/
private void calculateSwitchAvgMonthlyBandwidth(String monthlyStartTime, String monthlyEndTime) {
log.info("开始计算交换机月平均95带宽值...");
try {
EpsNodeBandwidth epsNodeBandwidth = new EpsNodeBandwidth();
epsNodeBandwidth.setStartTime(monthlyStartTime);
epsNodeBandwidth.setEndTime(monthlyEndTime);
List<AllInterfaceName> switchSnList = allInterfaceNameService.getAllSwitchSn(new AllInterfaceName());
for (AllInterfaceName switchSnMsg : switchSnList) {
processSwitchAvgBandwidth(epsNodeBandwidth, switchSnMsg);
}
log.info("交换机月平均95带宽值计算完成");
} catch (Exception e) {
log.error("计算交换机月平均95带宽值失败", e);
}
}
/**
* 处理单个交换机的平均带宽计算
*/
private void processSwitchAvgBandwidth(EpsNodeBandwidth epsNodeBandwidth, AllInterfaceName switchSnMsg) {
final String switchSn = switchSnMsg.getSwitchSn();
try {
// 1. 查询交换机拓扑信息
RmEpsTopologyManagement managementQuery = new RmEpsTopologyManagement();
managementQuery.setSwitchSn(switchSn);
List<RmEpsTopologyManagement> topologyList = rmEpsTopologyManagementService.selectRmEpsTopologyManagementList(managementQuery);
// 2. 设置基础信息
RmEpsTopologyManagement topology = topologyList.isEmpty() ? new RmEpsTopologyManagement() : topologyList.get(0);
epsNodeBandwidth.setSwitchSn(switchSn);
epsNodeBandwidth.setInterfaceName(topology.getInterfaceName());
// 3. 判断连接设备类型
boolean isServerConnected = "1".equals(topology.getConnectedDeviceType());
// 4. 处理服务器连接的情况
if (isServerConnected && topology.getServerSn() != null) {
String serverSn = topology.getServerSn();
epsNodeBandwidth.setHardwareSn(serverSn);
// 查询服务器配置
EpsServerRevenueConfig queryConfig = new EpsServerRevenueConfig();
queryConfig.setHardwareSn(serverSn);
List<EpsServerRevenueConfig> configList = epsServerRevenueConfigService.selectEpsServerRevenueConfigList(queryConfig);
EpsServerRevenueConfig serverConfig = configList.isEmpty() ? new EpsServerRevenueConfig() : configList.get(0);
epsNodeBandwidth.setNodeName(serverConfig.getNodeName());
// 检查是否需要处理业务变更
boolean shouldProcessChange = serverConfig.getUpdateTime() != null
&& epsNodeBandwidth.getStartTime() != null
&& epsNodeBandwidth.getStartTime().length() >= 10
&& "1".equals(serverConfig.getChanged())
&& DateUtils.parseDateToStr("yyyy-MM", serverConfig.getUpdateTime())
.equals(epsNodeBandwidth.getStartTime().substring(0, 7));
if(shouldProcessChange){
// 查询业务变更记录
EpsMethodChangeRecord changeQuery = new EpsMethodChangeRecord();
changeQuery.setHardwareSn(serverSn);
changeQuery.setStartTime(epsNodeBandwidth.getStartTime());
changeQuery.setEndTime(epsNodeBandwidth.getEndTime());
List<EpsMethodChangeRecord> records = epsMethodChangeRecordService.selectEpsMethodChangeRecordList(changeQuery);
// 按businessCode分组处理
if (!records.isEmpty()) {
Map<String, List<EpsMethodChangeRecord>> groupedRecords = records.stream()
.filter(record -> record.getBusinessCode() != null) // 过滤掉businessCode为null的记录
.collect(Collectors.groupingBy(EpsMethodChangeRecord::getBusinessCode));
// 处理每个业务分组
for (Map.Entry<String, List<EpsMethodChangeRecord>> entry : groupedRecords.entrySet()) {
String businessCode = entry.getKey();
List<EpsMethodChangeRecord> businessRecords = entry.getValue();
// 取第一个有效业务名称
String businessName = businessRecords.stream()
.filter(r -> r.getBusinessName() != null)
.findFirst()
.map(EpsMethodChangeRecord::getBusinessName)
.orElse("未知业务");
// 创建业务带宽对象
EpsNodeBandwidth bandwidthWithBiz = new EpsNodeBandwidth();
bandwidthWithBiz.setSwitchSn(switchSn);
bandwidthWithBiz.setInterfaceName(topology.getInterfaceName());
bandwidthWithBiz.setHardwareSn(serverSn);
bandwidthWithBiz.setNodeName(topology.getServerName());
bandwidthWithBiz.setUplinkSwitch(topology.getSwitchName());
bandwidthWithBiz.setInterfaceLinkDeviceType(topology.getConnectedDeviceType());
bandwidthWithBiz.setStartTime(epsNodeBandwidth.getStartTime());
bandwidthWithBiz.setEndTime(epsNodeBandwidth.getEndTime());
bandwidthWithBiz.setBusinessId(businessCode);
bandwidthWithBiz.setBusinessName(businessName);
bandwidthWithBiz.setResourceType("2");
// 执行计算
epsNodeBandwidthService.calculateAvg(bandwidthWithBiz);
}
// 处理businessCode为null的记录如果有
List<EpsMethodChangeRecord> nullBusinessRecords = records.stream()
.filter(record -> record.getBusinessCode() == null)
.collect(Collectors.toList());
if (!nullBusinessRecords.isEmpty()) {
log.warn("交换机 {} 有 {} 条记录的businessCode为null", switchSn, nullBusinessRecords.size());
// 可以选择记录日志或进行其他处理
}
return; // 业务变更处理完成后直接返回
}
}else{
// 5. 处理普通情况(无变更记录)
EpsNodeBandwidth normalBandwidth = new EpsNodeBandwidth();
normalBandwidth.setSwitchSn(switchSn);
normalBandwidth.setInterfaceName(topology.getInterfaceName());
normalBandwidth.setHardwareSn(topology.getServerSn());
normalBandwidth.setNodeName(topology.getServerName());
normalBandwidth.setUplinkSwitch(topology.getSwitchName());
normalBandwidth.setInterfaceLinkDeviceType(topology.getConnectedDeviceType());
normalBandwidth.setStartTime(epsNodeBandwidth.getStartTime());
normalBandwidth.setEndTime(epsNodeBandwidth.getEndTime());
normalBandwidth.setBusinessId(serverConfig.getBusinessCode());
normalBandwidth.setBusinessName(serverConfig.getBusinessName());
normalBandwidth.setResourceType("2");
epsNodeBandwidthService.calculateAvg(normalBandwidth);
}
}
// 5. 处理机房出口情况
EpsNodeBandwidth normalBandwidth = new EpsNodeBandwidth();
normalBandwidth.setSwitchSn(switchSn);
normalBandwidth.setInterfaceName(topology.getInterfaceName());
normalBandwidth.setInterfaceLinkDeviceType(topology.getConnectedDeviceType());
normalBandwidth.setStartTime(epsNodeBandwidth.getStartTime());
normalBandwidth.setEndTime(epsNodeBandwidth.getEndTime());
normalBandwidth.setResourceType("2");
epsNodeBandwidthService.calculateAvg(normalBandwidth);
} catch (Exception e) {
log.error("处理交换机 {} 平均带宽失败", switchSn, e);
}
} }
} }

View File

@@ -126,6 +126,6 @@ public class EpsNodeBandwidthController extends BaseController
@PostMapping("/calculateAvg") @PostMapping("/calculateAvg")
public AjaxResult calculateAvg(@RequestBody EpsNodeBandwidth epsNodeBandwidth) public AjaxResult calculateAvg(@RequestBody EpsNodeBandwidth epsNodeBandwidth)
{ {
return toAjax(epsNodeBandwidthService.insertEpsNodeBandwidth(epsNodeBandwidth)); return toAjax(epsNodeBandwidthService.calculateAvg(epsNodeBandwidth));
} }
} }

View File

@@ -84,6 +84,7 @@ public class EpsInitialTrafficData {
/** 批量插入集合 **/ /** 批量插入集合 **/
private List<EpsInitialTrafficData> dataList; private List<EpsInitialTrafficData> dataList;
/** /**
* 动态表名 * 动态表名
* 格式eps_traffic_[年]_[月]_[日期范围] * 格式eps_traffic_[年]_[月]_[日期范围]
@@ -124,7 +125,12 @@ public class EpsInitialTrafficData {
* 选中的属性名称 * 选中的属性名称
*/ */
private String[] properties; private String[] properties;
/** 资源类型 */
private String resourceType;
/** 带宽类型 */
private String bandwidthType;
/** 日或月 */
private String dayOrMonth;
} }

View File

@@ -3,11 +3,9 @@ package com.ruoyi.system.domain;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.annotation.Excel; import com.ruoyi.common.core.annotation.Excel;
import com.ruoyi.common.core.web.domain.BaseEntity; import com.ruoyi.common.core.web.domain.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder; import lombok.Data;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date; import java.util.Date;
/** /**
@@ -16,6 +14,7 @@ import java.util.Date;
* @author gyt * @author gyt
* @date 2025-08-12 * @date 2025-08-12
*/ */
@Data
public class EpsNodeBandwidth extends BaseEntity public class EpsNodeBandwidth extends BaseEntity
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -96,9 +95,9 @@ public class EpsNodeBandwidth extends BaseEntity
@Excel(name = "创建人名称") @Excel(name = "创建人名称")
private String creatorName; private String creatorName;
/** remark1 */ /** 交换机sn */
@Excel(name = "remark1") @Excel(name = "交换机sn")
private String remark1; private String switchSn;
/** 接口名称 */ /** 接口名称 */
@Excel(name = "接口名称") @Excel(name = "接口名称")
@@ -126,280 +125,7 @@ public class EpsNodeBandwidth extends BaseEntity
/** 结束时间 */ /** 结束时间 */
private String endTime; private String endTime;
/** 月份 */ /** 月份 */
@JsonFormat(pattern = "yyyy-MM") private String monthTime;
private LocalDate monthTime;
@Override
public Date getCreateTime() {
return createTime;
}
@Override
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public LocalDate getMonthTime() {
return monthTime;
}
public void setMonthTime(LocalDate monthTime) {
this.monthTime = monthTime;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public String getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
public String getBusinessName() {
return businessName;
}
public void setBusinessName(String businessName) {
this.businessName = businessName;
}
public String getBusinessId() {
return businessId;
}
public void setBusinessId(String businessId) {
this.businessId = businessId;
}
public String getResourceType() {
return resourceType;
}
public void setResourceType(String resourceType) {
this.resourceType = resourceType;
}
public String getInterfaceLinkDeviceType() {
return interfaceLinkDeviceType;
}
public void setInterfaceLinkDeviceType(String interfaceLinkDeviceType) {
this.interfaceLinkDeviceType = interfaceLinkDeviceType;
}
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setNodeName(String nodeName)
{
this.nodeName = nodeName;
}
public String getNodeName()
{
return nodeName;
}
public void setHardwareSn(String hardwareSn)
{
this.hardwareSn = hardwareSn;
}
public String getHardwareSn()
{
return hardwareSn;
}
public void setBandwidth95Daily(BigDecimal bandwidth95Daily)
{
this.bandwidth95Daily = bandwidth95Daily;
}
public BigDecimal getBandwidth95Daily()
{
return bandwidth95Daily;
}
public void setBandwidth95Monthly(BigDecimal bandwidth95Monthly)
{
this.bandwidth95Monthly = bandwidth95Monthly;
}
public BigDecimal getBandwidth95Monthly()
{
return bandwidth95Monthly;
}
public void setPackageBandwidthDaily(BigDecimal packageBandwidthDaily)
{
this.packageBandwidthDaily = packageBandwidthDaily;
}
public BigDecimal getPackageBandwidthDaily()
{
return packageBandwidthDaily;
}
public void setCustomerId(String customerId)
{
this.customerId = customerId;
}
public String getCustomerId()
{
return customerId;
}
public void setCustomerName(String customerName)
{
this.customerName = customerName;
}
public String getCustomerName()
{
return customerName;
}
public void setServiceNumber(String serviceNumber)
{
this.serviceNumber = serviceNumber;
}
public String getServiceNumber()
{
return serviceNumber;
}
public void setUplinkSwitch(String uplinkSwitch)
{
this.uplinkSwitch = uplinkSwitch;
}
public String getUplinkSwitch()
{
return uplinkSwitch;
}
public void setCreatorId(Long creatorId)
{
this.creatorId = creatorId;
}
public Long getCreatorId()
{
return creatorId;
}
public void setCreatorName(String creatorName)
{
this.creatorName = creatorName;
}
public String getCreatorName()
{
return creatorName;
}
public void setRemark1(String remark1)
{
this.remark1 = remark1;
}
public String getRemark1()
{
return remark1;
}
public String getInterfaceName() {
return interfaceName;
}
public void setInterfaceName(String interfaceName) {
this.interfaceName = interfaceName;
}
public String getBandwidthType() {
return bandwidthType;
}
public void setBandwidthType(String bandwidthType) {
this.bandwidthType = bandwidthType;
}
public BigDecimal getBandwidthResult() {
return bandwidthResult;
}
public void setBandwidthResult(BigDecimal bandwidthResult) {
this.bandwidthResult = bandwidthResult;
}
public BigDecimal getAvgMonthlyBandwidth95() {
return avgMonthlyBandwidth95;
}
public void setAvgMonthlyBandwidth95(BigDecimal avgMonthlyBandwidth95) {
this.avgMonthlyBandwidth95 = avgMonthlyBandwidth95;
}
public BigDecimal getEffectiveBandwidth95Daily() {
return effectiveBandwidth95Daily;
}
public void setEffectiveBandwidth95Daily(BigDecimal effectiveBandwidth95Daily) {
this.effectiveBandwidth95Daily = effectiveBandwidth95Daily;
}
public BigDecimal getEffectiveBandwidth95Monthly() {
return effectiveBandwidth95Monthly;
}
public void setEffectiveBandwidth95Monthly(BigDecimal effectiveBandwidth95Monthly) {
this.effectiveBandwidth95Monthly = effectiveBandwidth95Monthly;
}
public BigDecimal getEffectiveAvgMonthlyBandwidth95() {
return effectiveAvgMonthlyBandwidth95;
}
public void setEffectiveAvgMonthlyBandwidth95(BigDecimal effectiveAvgMonthlyBandwidth95) {
this.effectiveAvgMonthlyBandwidth95 = effectiveAvgMonthlyBandwidth95;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("nodeName", getNodeName())
.append("hardwareSn", getHardwareSn())
.append("bandwidth95Daily", getBandwidth95Daily())
.append("bandwidth95Monthly", getBandwidth95Monthly())
.append("packageBandwidthDaily", getPackageBandwidthDaily())
.append("customerId", getCustomerId())
.append("customerName", getCustomerName())
.append("serviceNumber", getServiceNumber())
.append("uplinkSwitch", getUplinkSwitch())
.append("createTime", getCreateTime())
.append("updateTime", getUpdateTime())
.append("creatorId", getCreatorId())
.append("creatorName", getCreatorName())
.append("remark1", getRemark1())
.append("interfaceName", getInterfaceName())
.toString();
}
} }

View File

@@ -82,4 +82,11 @@ public class InitialSwitchInfoDetails extends BaseEntity
private String startTime; private String startTime;
private String endTime; private String endTime;
/** 资源类型 */
private String resourceType;
/** 带宽类型 */
private String bandwidthType;
/** 日或月 */
private String dayOrMonth;
} }

View File

@@ -1,7 +1,6 @@
package com.ruoyi.system.service; package com.ruoyi.system.service;
import com.ruoyi.system.domain.EpsInitialTrafficData; import com.ruoyi.system.domain.EpsInitialTrafficData;
import com.ruoyi.system.domain.InitialSwitchInfoDetails;
import java.util.List; import java.util.List;
@@ -45,18 +44,6 @@ public interface EpsInitialTrafficDataService {
* @param queryParam 查询参数实体 * @param queryParam 查询参数实体
* @return 流量数据列表 * @return 流量数据列表
*/ */
void calculateBusiness95BandwidthDaily(EpsInitialTrafficData queryParam); void calculateBusiness95BandwidthDaily(EpsInitialTrafficData queryParam, String dailyStartTime, String dailyEndTime);
/**
* 计算95带宽值
* @param queryParam 查询参数实体
* @return 流量数据列表
*/
void calculate95BandwidthDaily(EpsInitialTrafficData queryParam);
/**
* 计算交换机95带宽值
* @param queryParam 查询参数实体
* @return 流量数据列表
*/
void calculateSwitch95BandwidthDaily(InitialSwitchInfoDetails queryParam);
} }

View File

@@ -1,8 +1,9 @@
package com.ruoyi.system.service; package com.ruoyi.system.service;
import java.util.List;
import com.ruoyi.system.domain.AllInterfaceName; import com.ruoyi.system.domain.AllInterfaceName;
import java.util.List;
/** /**
* 所有接口名称Service接口 * 所有接口名称Service接口
* *
@@ -58,4 +59,8 @@ public interface IAllInterfaceNameService
* @return 结果 * @return 结果
*/ */
public int deleteAllInterfaceNameById(Long id); public int deleteAllInterfaceNameById(Long id);
List<AllInterfaceName> getAllDeviceSn(AllInterfaceName interfaceName);
List<AllInterfaceName> getAllSwitchSn(AllInterfaceName allInterfaceName);
} }

View File

@@ -65,4 +65,11 @@ public interface IInitialSwitchInfoDetailsService
* @param initialSwitchInfoDetails * @param initialSwitchInfoDetails
*/ */
R<String> autoSaveSwitchTraffic(InitialSwitchInfoDetails initialSwitchInfoDetails); R<String> autoSaveSwitchTraffic(InitialSwitchInfoDetails initialSwitchInfoDetails);
/**
* 计算交换机95带宽值
* @param queryParam 查询参数实体
* @return 流量数据列表
*/
void calculateSwitch95BandwidthDaily(InitialSwitchInfoDetails queryParam, String dailyStartTime, String dailyEndTime);
} }

View File

@@ -1,12 +1,13 @@
package com.ruoyi.system.service.impl; package com.ruoyi.system.service.impl;
import java.util.List;
import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.system.domain.AllInterfaceName;
import com.ruoyi.system.mapper.AllInterfaceNameMapper;
import com.ruoyi.system.service.IAllInterfaceNameService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.AllInterfaceNameMapper;
import com.ruoyi.system.domain.AllInterfaceName; import java.util.List;
import com.ruoyi.system.service.IAllInterfaceNameService;
/** /**
* 所有接口名称Service业务层处理 * 所有接口名称Service业务层处理
@@ -93,4 +94,13 @@ public class AllInterfaceNameServiceImpl implements IAllInterfaceNameService
{ {
return allInterfaceNameMapper.deleteAllInterfaceNameById(id); return allInterfaceNameMapper.deleteAllInterfaceNameById(id);
} }
@Override
public List<AllInterfaceName> getAllDeviceSn(AllInterfaceName interfaceName) {
return allInterfaceNameMapper.getAllDeviceSn(interfaceName);
}
@Override
public List<AllInterfaceName> getAllSwitchSn(AllInterfaceName allInterfaceName){
return allInterfaceNameMapper.getAllSwitchSn(allInterfaceName);
}
} }

View File

@@ -4,6 +4,7 @@ import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.system.domain.*; import com.ruoyi.system.domain.*;
import com.ruoyi.system.mapper.*; import com.ruoyi.system.mapper.*;
import com.ruoyi.system.service.EpsInitialTrafficDataService; import com.ruoyi.system.service.EpsInitialTrafficDataService;
import com.ruoyi.system.util.CalculateUtil;
import com.ruoyi.system.util.TableRouterUtil; import com.ruoyi.system.util.TableRouterUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
@@ -13,25 +14,19 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneId; import java.util.LinkedHashMap;
import java.time.format.DateTimeFormatter; import java.util.List;
import java.util.*; import java.util.Map;
import java.util.Set;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Service @Service
@Slf4j @Slf4j
public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataService { public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataService {
private static final Pattern SPEED_PATTERN = Pattern.compile("(\\d+\\.?\\d*)\\s*(\\S*)");
private static final DateTimeFormatter TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Autowired @Autowired
private EpsInitialTrafficDataMapper epsInitialTrafficDataMapper; private EpsInitialTrafficDataMapper epsInitialTrafficDataMapper;
@Autowired @Autowired
@@ -39,8 +34,6 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
@Autowired @Autowired
private AllInterfaceNameMapper allInterfaceNameMapper; private AllInterfaceNameMapper allInterfaceNameMapper;
@Autowired @Autowired
private InitialSwitchInfoDetailsMapper initialSwitchInfoDetailsMapper;
@Autowired
private EpsServerRevenueConfigMapper epsServerRevenueConfigMapper; private EpsServerRevenueConfigMapper epsServerRevenueConfigMapper;
@Autowired @Autowired
private EpsMethodChangeRecordMapper epsMethodChangeRecordMapper; private EpsMethodChangeRecordMapper epsMethodChangeRecordMapper;
@@ -200,50 +193,106 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
} }
/** /**
* 有业务变动的 计算有效95带宽值/日 * 计算95带宽值/日
* @param queryParam * @param queryParam
*/ */
@Override @Override
public void calculateBusiness95BandwidthDaily(EpsInitialTrafficData queryParam) { public void calculateBusiness95BandwidthDaily(EpsInitialTrafficData queryParam, String dailyStartTime, String dailyEndTime) {
// 1. 获取所有设备SN列表 // 获取所有设备SN列表
List<AllInterfaceName> snList = allInterfaceNameMapper.getAllDeviceSn(new AllInterfaceName()); List<AllInterfaceName> snList = allInterfaceNameMapper.getAllDeviceSn(new AllInterfaceName());
// 遍历处理每个设备
// 2. 获取昨天的日期范围(北京时间) snList.forEach(interfaceName -> {
LocalDate yesterday = LocalDate.now(ZoneId.of("Asia/Shanghai")).minusDays(1);
String dailyStartTime = yesterday.atStartOfDay().format(TIME_FORMAT); // 00:00:00
String dailyEndTime = yesterday.atTime(23, 59, 59).format(TIME_FORMAT); // 23:59:59
// 3. 遍历每个设备
for (AllInterfaceName interfaceName : snList) {
queryParam.setServiceSn(interfaceName.getDeviceSn()); queryParam.setServiceSn(interfaceName.getDeviceSn());
processDeviceBandwidth(queryParam, dailyStartTime, dailyEndTime);
});
}
/**
* 处理单个设备的带宽计算
*/
private void processDeviceBandwidth(EpsInitialTrafficData queryParam,
String dailyStartTime,
String dailyEndTime) {
// 1. 检查设备是否有业务变更
EpsServerRevenueConfig revenueConfig = new EpsServerRevenueConfig();
revenueConfig.setHardwareSn(queryParam.getServiceSn());
List<EpsServerRevenueConfig> changedList = epsServerRevenueConfigMapper
.selectEpsServerRevenueConfigList(revenueConfig);
// 4. 检查设备是否有业务变更 // 2. 根据业务变更情况选择计算方式
EpsServerRevenueConfig revenueConfig = new EpsServerRevenueConfig(); if (hasTrafficMethodChanged(changedList)) {
revenueConfig.setHardwareSn(interfaceName.getDeviceSn()); calculateChangedDeviceBandwidth(queryParam, dailyStartTime, dailyEndTime);
List<EpsServerRevenueConfig> changedList = epsServerRevenueConfigMapper.selectEpsServerRevenueConfigList(revenueConfig); } else {
calculateNormalDeviceBandwidth(queryParam, dailyStartTime, dailyEndTime);
if (!changedList.isEmpty() &&
"1".equals(changedList.get(0).getChanged()) &&
"1".equals(changedList.get(0).getRevenueMethod())) {
// 5. 获取业务变更记录(按时间降序)
EpsMethodChangeRecord changeQuery = new EpsMethodChangeRecord();
changeQuery.setHardwareSn(interfaceName.getDeviceSn());
changeQuery.setStartTime(dailyStartTime);
changeQuery.setEndTime(dailyEndTime);
List<EpsMethodChangeRecord> records = epsMethodChangeRecordMapper
.selectEpsMethodChangeRecordList(changeQuery);
if (!records.isEmpty()) {
// 确保按时间降序排列
records.sort((r1, r2) -> r2.getCreateTime().compareTo(r1.getCreateTime()));
// 6. 计算各时间段95值
calculateTimeSegments95(queryParam, records, dailyStartTime, dailyEndTime);
}
}
} }
} }
/**
* 判断是否为流量型业务变更
*/
private boolean hasTrafficMethodChanged(List<EpsServerRevenueConfig> changedList) {
return !changedList.isEmpty() &&
"1".equals(changedList.get(0).getChanged()) &&
"1".equals(changedList.get(0).getRevenueMethod());
}
/**
* 计算有业务变更设备的带宽
*/
private void calculateChangedDeviceBandwidth(EpsInitialTrafficData queryParam,
String dailyStartTime,
String dailyEndTime) {
// 1. 获取业务变更记录(按时间降序)
EpsMethodChangeRecord changeQuery = new EpsMethodChangeRecord();
changeQuery.setHardwareSn(queryParam.getServiceSn());
changeQuery.setStartTime(dailyStartTime);
changeQuery.setEndTime(dailyEndTime);
List<EpsMethodChangeRecord> records = epsMethodChangeRecordMapper
.selectEpsMethodChangeRecordList(changeQuery);
if (!records.isEmpty()) {
// 2. 确保按时间降序排列
records.sort((r1, r2) -> r2.getCreateTime().compareTo(r1.getCreateTime()));
// 3. 计算各时间段95值
calculateTimeSegments95(queryParam, records, dailyStartTime, dailyEndTime);
}
}
/**
* 计算无业务变更设备的带宽
*/
private void calculateNormalDeviceBandwidth(EpsInitialTrafficData queryParam,
String dailyStartTime,
String dailyEndTime) {
queryParam.setStartTime(dailyStartTime);
queryParam.setEndTime(dailyEndTime);
List<EpsInitialTrafficData> dataList = query(queryParam);
if (!dataList.isEmpty()) {
calculateAndSave95Bandwidth(dataList, dailyStartTime, queryParam.getDayOrMonth());
}
}
/**
* 计算并保存95带宽值
*/
private void calculateAndSave95Bandwidth(List<EpsInitialTrafficData> dataList, String dateTime, String dayOrMonth) {
// 1. 提取并转换带宽值
List<BigDecimal> speedsInMbps = dataList.stream()
.map(data -> CalculateUtil.parseSpeedToMbps(data.getOutSpeed()))
.sorted()
.collect(Collectors.toList());
// 2. 计算95百分位
BigDecimal percentile95 = CalculateUtil.calculatePercentile(speedsInMbps, 0.95);
// 3. 保存结果
EpsInitialTrafficData epsInitialTrafficData = dataList.get(0);
epsInitialTrafficData.setResourceType("1");
if("1".equals(dayOrMonth)){
epsInitialTrafficData.setBandwidthType("1");
}
if("2".equals(dayOrMonth)){
epsInitialTrafficData.setBandwidthType("2");
}
saveBandwidthResult(epsInitialTrafficData, percentile95, dateTime);
}
/** /**
* 计算设备各时间段的95带宽值 * 计算设备各时间段的95带宽值
@@ -276,146 +325,18 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
queryParam.setEndTime(endTime); queryParam.setEndTime(endTime);
List<EpsInitialTrafficData> dataList = query(queryParam); List<EpsInitialTrafficData> dataList = query(queryParam);
if (!dataList.isEmpty()) { if (!dataList.isEmpty()) {
calculate95BandwidthDaily(dataList); calculate95BandwidthDaily(dataList, startTime, queryParam.getDayOrMonth());
} }
} }
@Override
public void calculate95BandwidthDaily(EpsInitialTrafficData queryParam) {
// 1. 获取昨天的日期(北京时间)
LocalDate yesterday = LocalDate.now(ZoneId.of("Asia/Shanghai")).minusDays(1);
// 2. 定义时间范围字符串
String startTimeStr = yesterday.atStartOfDay().format(TIME_FORMAT); // 00:00:00
String endTimeStr = yesterday.atTime(23, 59, 59).format(TIME_FORMAT); // 23:59:59
queryParam.setStartTime(startTimeStr);
queryParam.setEndTime(endTimeStr);
queryParam.setRevenueMethod("1");
// 查询所有的服务器sn
AllInterfaceName allInterfaceName = new AllInterfaceName();
List<AllInterfaceName> snList = allInterfaceNameMapper.getAllDeviceSn(allInterfaceName);
for (AllInterfaceName interfaceName : snList) {
queryParam.setServiceSn(interfaceName.getDeviceSn());
// 4. 检查设备是否有业务变更
EpsServerRevenueConfig revenueConfig = new EpsServerRevenueConfig();
revenueConfig.setHardwareSn(interfaceName.getDeviceSn());
List<EpsServerRevenueConfig> changedList = epsServerRevenueConfigMapper.selectEpsServerRevenueConfigList(revenueConfig);
if (!changedList.isEmpty() &&
"1".equals(changedList.get(0).getChanged()) &&
"1".equals(changedList.get(0).getRevenueMethod())) {
}else{
// 查询原始数据
List<EpsInitialTrafficData> dataList = query(queryParam);
if(!dataList.isEmpty()){
// 1. 提取 outSpeed 并转换为 Mbps
List<BigDecimal> speedsInMbps = dataList.stream()
.map(data -> parseSpeedToMbps(data.getOutSpeed()))
.sorted()
.collect(Collectors.toList());
// 2. 计算 95% 位置(向上取整)
int total = speedsInMbps.size();
int position = (int) Math.ceil(0.95 * total) - 1; // 转换为 0-based 索引
if (position < 0){
position = 0;
}
if (position >= total){
position = total - 1;
}
// 3. 获取 95 值并四舍五入到两位小数
BigDecimal percentile95 = speedsInMbps.get(position);
BigDecimal dailyResult = percentile95.setScale(2, RoundingMode.HALF_UP);
// 服务器信息
EpsInitialTrafficData epsInitialTrafficData = dataList.get(0);
// 落入带宽计算结果表
EpsNodeBandwidth bandwidth = new EpsNodeBandwidth();
bandwidth.setHardwareSn(epsInitialTrafficData.getServiceSn());
bandwidth.setNodeName(epsInitialTrafficData.getNodeName());
bandwidth.setBusinessId(epsInitialTrafficData.getBusinessId());
bandwidth.setBusinessName(epsInitialTrafficData.getBusinessName());
bandwidth.setResourceType("1");
bandwidth.setBandwidthType("1");
bandwidth.setBandwidthResult(dailyResult);
bandwidth.setBandwidth95Daily(dailyResult);
bandwidth.setCreateTime(DateUtils.parseDate(startTimeStr));
epsNodeBandwidthMapper.insertEpsNodeBandwidth(bandwidth);
}
}
}
}
@Override
public void calculateSwitch95BandwidthDaily(InitialSwitchInfoDetails queryParam) {
Date now = DateUtils.getNowDate();
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.HOUR_OF_DAY, -24);
Date startDate = calendar.getTime();
// 格式化时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String startTime = sdf.format(startDate);
String endTime = sdf.format(now);
queryParam.setStartTime(startTime);
queryParam.setEndTime(endTime);
// 查询所有的服务器sn
AllInterfaceName allInterfaceName = new AllInterfaceName();
List<AllInterfaceName> switchSnList = allInterfaceNameMapper.getAllSwitchSn(allInterfaceName);
for (AllInterfaceName interfaceName : switchSnList) {
queryParam.setSwitchSn(interfaceName.getSwitchSn());
// 查询原始数据
List<InitialSwitchInfoDetails> dataList = initialSwitchInfoDetailsMapper.selectInitialSwitchInfoDetailsList(queryParam);
if(!dataList.isEmpty()){
// 1. 提取 outSpeed 并转换为 Mbps
List<BigDecimal> speedsInMbps = dataList.stream()
.map(data -> {
// 根据 type 选择 inSpeed 或 outSpeed
String speed = ("1".equals(data.getInterfaceDeviceType())) ? data.getInSpeed()+"" : data.getOutSpeed()+"";
// 如果 speed 是纯数字,补充单位 "B/S"Bytes/s
if (speed.matches("^\\d+(\\.\\d+)?$")) {
speed += " B/S";
}
return parseSpeedToMbps(speed);
})
.sorted()
.collect(Collectors.toList());
// 2. 计算 95% 位置(向上取整)
int total = speedsInMbps.size();
int position = (int) Math.ceil(0.95 * total) - 1; // 转换为 0-based 索引
if (position < 0){
position = 0;
}
if (position >= total){
position = total - 1;
}
// 3. 获取 95 值并四舍五入到两位小数
BigDecimal percentile95 = speedsInMbps.get(position);
BigDecimal dailyResult = percentile95.setScale(2, RoundingMode.HALF_UP);
// 服务器信息
InitialSwitchInfoDetails initialSwitchInfoDetails = dataList.get(0);
// 落入带宽计算结果表
EpsNodeBandwidth bandwidth = new EpsNodeBandwidth();
bandwidth.setHardwareSn(initialSwitchInfoDetails.getServerSn());
bandwidth.setNodeName(initialSwitchInfoDetails.getServerName());
bandwidth.setResourceType("2");
bandwidth.setBandwidthType("1");
bandwidth.setBandwidthResult(dailyResult);
bandwidth.setBandwidth95Daily(dailyResult);
bandwidth.setCreateTime(startDate);
epsNodeBandwidthMapper.insertEpsNodeBandwidth(bandwidth);
}
}
}
/** /**
* 计算有效-日95带宽值 * 计算日95带宽值
* @param dataList * @param dataList
*/ */
private void calculate95BandwidthDaily(List<EpsInitialTrafficData> dataList){ private void calculate95BandwidthDaily(List<EpsInitialTrafficData> dataList, String startTime, String dayOrMonth){
// 1. 提取 outSpeed 并转换为 Mbps // 1. 提取 outSpeed 并转换为 Mbps
List<BigDecimal> speedsInMbps = dataList.stream() List<BigDecimal> speedsInMbps = dataList.stream()
.map(data -> parseSpeedToMbps(data.getOutSpeed())) .map(data -> CalculateUtil.parseSpeedToMbps(data.getOutSpeed()))
.sorted() .sorted()
.collect(Collectors.toList()); .collect(Collectors.toList());
@@ -434,66 +355,55 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
BigDecimal dailyResult = percentile95.setScale(2, RoundingMode.HALF_UP); BigDecimal dailyResult = percentile95.setScale(2, RoundingMode.HALF_UP);
// 服务器信息 // 服务器信息
EpsInitialTrafficData epsInitialTrafficData = dataList.get(0); EpsInitialTrafficData epsInitialTrafficData = dataList.get(0);
// 落入带宽计算结果表 epsInitialTrafficData.setResourceType("1");
EpsNodeBandwidth bandwidth = new EpsNodeBandwidth(); if("1".equals(dayOrMonth)){
bandwidth.setHardwareSn(epsInitialTrafficData.getServiceSn()); epsInitialTrafficData.setBandwidthType("5");
bandwidth.setNodeName(epsInitialTrafficData.getNodeName()); }
bandwidth.setBusinessId(epsInitialTrafficData.getBusinessId()); if("2".equals(dayOrMonth)){
bandwidth.setBusinessName(epsInitialTrafficData.getBusinessName()); epsInitialTrafficData.setBandwidthType("6");
bandwidth.setResourceType("1"); }
bandwidth.setBandwidthType("5"); saveBandwidthResult(epsInitialTrafficData, dailyResult, startTime);
bandwidth.setBandwidthResult(dailyResult);
bandwidth.setEffectiveBandwidth95Daily(dailyResult);
bandwidth.setCreateTime(DateUtils.parseDate(epsInitialTrafficData.getStartTime()));
epsNodeBandwidthMapper.insertEpsNodeBandwidth(bandwidth);
} }
/** /**
* 单位换算 * 保存带宽结果
* @param speedWithUnit
* @return
*/ */
private static BigDecimal parseSpeedToMbps(String speedWithUnit) { private void saveBandwidthResult(EpsInitialTrafficData data,
if (speedWithUnit == null || speedWithUnit.trim().isEmpty()) { BigDecimal result,
return BigDecimal.ZERO; String dateTime) {
} EpsNodeBandwidth bandwidth = new EpsNodeBandwidth();
bandwidth.setHardwareSn(data.getServiceSn());
Matcher matcher = SPEED_PATTERN.matcher(speedWithUnit.trim()); bandwidth.setNodeName(data.getNodeName());
if (!matcher.find()) { bandwidth.setBusinessId(data.getBusinessId());
throw new IllegalArgumentException("Invalid speed format: " + speedWithUnit); bandwidth.setBusinessName(data.getBusinessName());
} bandwidth.setResourceType(data.getResourceType());
bandwidth.setBandwidthType(data.getBandwidthType());
BigDecimal value = new BigDecimal(matcher.group(1)); bandwidth.setBandwidthResult(result);
String unit = matcher.group(2).toUpperCase(); bandwidth.setCreateTime(DateUtils.parseDate(dateTime));
switch (data.getBandwidthType()){
// 处理纯数字(单位为空) case "1":
if (unit.isEmpty()) { bandwidth.setBandwidth95Daily(result);
unit = "B/S"; // 默认单位: Bytes/s break;
} case "2":
bandwidth.setBandwidth95Monthly(result);
// 单位换算逻辑(保持不变) break;
switch (unit) { case "3":
case "B/S": bandwidth.setPackageBandwidthDaily(result);
return value.multiply(new BigDecimal("0.000008")); break;
case "KBPS": case "4":
case "KB/S": bandwidth.setAvgMonthlyBandwidth95(result);
return value.divide(new BigDecimal("1000"), 10, RoundingMode.HALF_UP); break;
case "MBPS": case "5":
case "MB/S": bandwidth.setEffectiveBandwidth95Daily(result);
return value; break;
case "GBPS": case "6":
case "GB/S": bandwidth.setEffectiveBandwidth95Monthly(result);
return value.multiply(new BigDecimal("1000")); break;
case "TBPS": case "7":
case "TB/S": bandwidth.setEffectiveAvgMonthlyBandwidth95(result);
return value.multiply(new BigDecimal("1000000")); break;
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"));
default: default:
throw new IllegalArgumentException("Unknown speed unit: " + unit); throw new IllegalArgumentException("Unknown bandwidthType: " + data.getBandwidthType());
} }
epsNodeBandwidthMapper.insertEpsNodeBandwidth(bandwidth);
} }
} }

View File

@@ -3,10 +3,13 @@ package com.ruoyi.system.service.impl;
import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.system.domain.EpsInitialTrafficData; import com.ruoyi.system.domain.EpsInitialTrafficData;
import com.ruoyi.system.domain.EpsNodeBandwidth; import com.ruoyi.system.domain.EpsNodeBandwidth;
import com.ruoyi.system.domain.EpsServerRevenueConfig;
import com.ruoyi.system.mapper.EpsNodeBandwidthMapper; import com.ruoyi.system.mapper.EpsNodeBandwidthMapper;
import com.ruoyi.system.mapper.EpsServerRevenueConfigMapper;
import com.ruoyi.system.service.EpsInitialTrafficDataService; import com.ruoyi.system.service.EpsInitialTrafficDataService;
import com.ruoyi.system.service.IEpsNodeBandwidthService; import com.ruoyi.system.service.IEpsNodeBandwidthService;
import com.ruoyi.system.util.DateUtil; import com.ruoyi.system.util.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -18,7 +21,9 @@ import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime; import java.time.LocalTime;
import java.time.YearMonth; import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.util.List; import java.util.List;
import java.util.Optional;
/** /**
* 节点带宽信息Service业务层处理 * 节点带宽信息Service业务层处理
@@ -27,12 +32,15 @@ import java.util.List;
* @date 2025-08-12 * @date 2025-08-12
*/ */
@Service @Service
@Slf4j
public class EpsNodeBandwidthServiceImpl implements IEpsNodeBandwidthService public class EpsNodeBandwidthServiceImpl implements IEpsNodeBandwidthService
{ {
@Autowired @Autowired
private EpsNodeBandwidthMapper epsNodeBandwidthMapper; private EpsNodeBandwidthMapper epsNodeBandwidthMapper;
@Autowired @Autowired
private EpsInitialTrafficDataService epsInitialTrafficDataService; private EpsInitialTrafficDataService epsInitialTrafficDataService;
@Autowired
private EpsServerRevenueConfigMapper epsServerRevenueConfigMapper;
/** /**
* 查询节点带宽信息 * 查询节点带宽信息
@@ -53,8 +61,7 @@ public class EpsNodeBandwidthServiceImpl implements IEpsNodeBandwidthService
* @return 节点带宽信息 * @return 节点带宽信息
*/ */
@Override @Override
public List<EpsInitialTrafficData> relatedData(Long id) public List<EpsInitialTrafficData> relatedData(Long id) {
{
// 1. 根据ID查询服务器信息 // 1. 根据ID查询服务器信息
EpsNodeBandwidth epsNodeBandwidth = epsNodeBandwidthMapper.selectEpsNodeBandwidthById(id); EpsNodeBandwidth epsNodeBandwidth = epsNodeBandwidthMapper.selectEpsNodeBandwidthById(id);
if (epsNodeBandwidth == null) { if (epsNodeBandwidth == null) {
@@ -140,33 +147,110 @@ public class EpsNodeBandwidthServiceImpl implements IEpsNodeBandwidthService
* @param epsNodeBandwidth 节点带宽信息 * @param epsNodeBandwidth 节点带宽信息
* @return 结果 * @return 结果
*/ */
/**
* 计算月均日95值
*/
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public int calculateAvg(EpsNodeBandwidth epsNodeBandwidth) { public int calculateAvg(EpsNodeBandwidth epsNodeBandwidth) {
// 验证是否已经存在记录 try {
List<EpsNodeBandwidth> existingRecords = epsNodeBandwidthMapper.selectEpsNodeBandwidthList(epsNodeBandwidth); // 1. 参数验证
if (epsNodeBandwidth == null) {
log.warn("参数为空无法计算月均日95值");
return 0;
}
EpsNodeBandwidth calculatedData = epsNodeBandwidthMapper.calculateAvg(epsNodeBandwidth);
// 日95值总和
BigDecimal sum95Daily = calculatedData.getBandwidth95Daily();
// 日有效95值总和
BigDecimal sumEffectiveBandwidth95Daily = calculatedData.getEffectiveBandwidth95Daily();
// 计算当月天数并求平均值
LocalDate monthTime = epsNodeBandwidth.getMonthTime();
int daysInMonth = YearMonth.from(monthTime).lengthOfMonth();
// 月均日95值
BigDecimal avgMonthlyBandwidth95 = daysInMonth == 0 ? BigDecimal.ZERO :
sum95Daily.divide(BigDecimal.valueOf(daysInMonth), 2, RoundingMode.HALF_UP);
epsNodeBandwidth.setAvgMonthlyBandwidth95(avgMonthlyBandwidth95);
// 有效-月均日95值
BigDecimal effectiveAvgMonthlyBandwidth95 = daysInMonth == 0 ? BigDecimal.ZERO :
sumEffectiveBandwidth95Daily.divide(BigDecimal.valueOf(daysInMonth), 2, RoundingMode.HALF_UP);
epsNodeBandwidth.setEffectiveAvgMonthlyBandwidth95(effectiveAvgMonthlyBandwidth95);
// 根据是否存在记录执行更新或插入操作 // 3. 获取计算数据(防止空指针)
return existingRecords.isEmpty() ? EpsNodeBandwidth calculatedData = epsNodeBandwidthMapper.calculateAvg(epsNodeBandwidth);
epsNodeBandwidthMapper.insertEpsNodeBandwidth(epsNodeBandwidth) : if (calculatedData == null) {
epsNodeBandwidthMapper.updateEpsNodeBandwidth(epsNodeBandwidth); log.warn("未找到计算数据硬件SN: {}", epsNodeBandwidth.getHardwareSn());
return 0;
}
// 4. 安全获取求和值
BigDecimal sum95Daily = Optional.ofNullable(calculatedData.getBandwidth95Daily()).orElse(BigDecimal.ZERO);
BigDecimal sumEffectiveBandwidth95Daily = Optional.ofNullable(calculatedData.getEffectiveBandwidth95Daily()).orElse(BigDecimal.ZERO);
// 5. 计算当月天数
LocalDate monthTime;
try {
monthTime = LocalDate.parse(epsNodeBandwidth.getMonthTime() == null
? epsNodeBandwidth.getStartTime().substring(0,10) : epsNodeBandwidth.getMonthTime());
} catch (Exception e) {
log.error("月份时间格式错误: {}", epsNodeBandwidth.getMonthTime() == null
? epsNodeBandwidth.getStartTime() : epsNodeBandwidth.getMonthTime(), e);
return 0;
}
int daysInMonth = YearMonth.from(monthTime).lengthOfMonth();
if (daysInMonth == 0) {
log.warn("当月天数为0月份: {}", epsNodeBandwidth.getMonthTime() == null
? epsNodeBandwidth.getStartTime() : epsNodeBandwidth.getMonthTime());
return 0;
}
// 6. 检查业务变动
boolean hasBusinessChange = false;
if (epsNodeBandwidth.getHardwareSn() != null) {
EpsServerRevenueConfig revenueConfig = new EpsServerRevenueConfig();
revenueConfig.setHardwareSn(epsNodeBandwidth.getHardwareSn());
List<EpsServerRevenueConfig> changedList = epsServerRevenueConfigMapper.selectEpsServerRevenueConfigList(revenueConfig);
if (!changedList.isEmpty()) {
EpsServerRevenueConfig epsServerRevenueConfig = changedList.get(0);
if (epsServerRevenueConfig.getUpdateTime() != null &&
epsNodeBandwidth.getStartTime() != null &&
"1".equals(epsServerRevenueConfig.getChanged())) {
String configTime = DateUtils.parseDateToStr("yyyy-MM", epsServerRevenueConfig.getUpdateTime());
hasBusinessChange = epsNodeBandwidth.getStartTime().equals(configTime);
}
}
}
// 7. 计算平均值
if (hasBusinessChange) {
epsNodeBandwidth.setBandwidthType("7");
// 2. 验证是否已经存在记录
List<EpsNodeBandwidth> existingRecords = epsNodeBandwidthMapper.selectEpsNodeBandwidthList(epsNodeBandwidth);
if(!existingRecords.isEmpty()){
epsNodeBandwidth.setId(existingRecords.get(0).getId());
epsNodeBandwidth.setUpdateTime(DateUtils.getNowDate());
}else{
epsNodeBandwidth.setCreateTime(DateUtils.parseDate(epsNodeBandwidth.getStartTime()));
}
// 有效-月均日95值
BigDecimal effectiveAvg = sumEffectiveBandwidth95Daily.divide(BigDecimal.valueOf(daysInMonth), 2, RoundingMode.HALF_UP);
epsNodeBandwidth.setEffectiveAvgMonthlyBandwidth95(effectiveAvg);
epsNodeBandwidth.setBandwidthResult(effectiveAvg);
// 8. 执行插入或更新操作
return existingRecords.isEmpty() ?
epsNodeBandwidthMapper.insertEpsNodeBandwidth(epsNodeBandwidth) :
epsNodeBandwidthMapper.updateEpsNodeBandwidth(epsNodeBandwidth);
} else {
epsNodeBandwidth.setBandwidthType("4");
// 2. 验证是否已经存在记录
List<EpsNodeBandwidth> existingRecords = epsNodeBandwidthMapper.selectEpsNodeBandwidthList(epsNodeBandwidth);
if(!existingRecords.isEmpty()){
epsNodeBandwidth.setId(existingRecords.get(0).getId());
epsNodeBandwidth.setUpdateTime(DateUtils.getNowDate());
}else{
epsNodeBandwidth.setCreateTime(DateUtils.parseDate(epsNodeBandwidth.getStartTime()));
}
// 月均日95值
BigDecimal avgMonthly = sum95Daily.divide(BigDecimal.valueOf(daysInMonth), 2, RoundingMode.HALF_UP);
epsNodeBandwidth.setAvgMonthlyBandwidth95(avgMonthly);
epsNodeBandwidth.setBandwidthResult(avgMonthly);
// 8. 执行插入或更新操作
return existingRecords.isEmpty() ?
epsNodeBandwidthMapper.insertEpsNodeBandwidth(epsNodeBandwidth) :
epsNodeBandwidthMapper.updateEpsNodeBandwidth(epsNodeBandwidth);
}
} catch (Exception e) {
log.error("计算月均日95值失败", e);
throw new RuntimeException("计算月均日95值失败", e);
}
} }
@Override @Override
@@ -180,23 +264,25 @@ public class EpsNodeBandwidthServiceImpl implements IEpsNodeBandwidthService
} }
/** /**
* 根据带宽类型设置时间范围 * 根据带宽类型设置时间范围修复T分隔符问题
*/ */
private void setTimeRangeByBandwidthType(EpsInitialTrafficData data, String bandwidthType, LocalDateTime baseTime) { private void setTimeRangeByBandwidthType(EpsInitialTrafficData data, String bandwidthType, LocalDateTime baseTime) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
switch (bandwidthType) { switch (bandwidthType) {
case "1": case "1":
case "3": case "3":
case "5": // 日带宽 case "5": // 日带宽
data.setStartTime(baseTime.with(LocalTime.MIN) + ""); // 00:00:00 data.setStartTime(baseTime.with(LocalTime.MIN).format(formatter)); // 00:00:00
data.setEndTime(baseTime.with(LocalTime.MAX).withNano(0) + ""); // 23:59:59 data.setEndTime(baseTime.with(LocalTime.MAX).withNano(0).format(formatter)); // 23:59:59
break; break;
case "2": case "2":
case "4": case "4":
case "6": case "6":
case "7": // 月带宽 case "7": // 月带宽
YearMonth month = YearMonth.from(baseTime); YearMonth month = YearMonth.from(baseTime);
data.setStartTime(month.atDay(1).atStartOfDay() + ""); // 当月第一天 00:00:00 data.setStartTime(month.atDay(1).atStartOfDay().format(formatter)); // 当月第一天 00:00:00
data.setEndTime(month.atEndOfMonth().atTime(23, 59, 59) + ""); // 当月最后一天 23:59:59 data.setEndTime(month.atEndOfMonth().atTime(23, 59, 59).format(formatter)); // 当月最后一天 23:59:59
break; break;
default: default:
throw new IllegalArgumentException("不支持的带宽类型: " + bandwidthType); throw new IllegalArgumentException("不支持的带宽类型: " + bandwidthType);

View File

@@ -3,17 +3,16 @@ package com.ruoyi.system.service.impl;
import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.system.domain.AllInterfaceName; import com.ruoyi.system.domain.*;
import com.ruoyi.system.domain.InitialSwitchInfoDetails; import com.ruoyi.system.mapper.*;
import com.ruoyi.system.domain.RmEpsTopologyManagement;
import com.ruoyi.system.mapper.AllInterfaceNameMapper;
import com.ruoyi.system.mapper.InitialSwitchInfoDetailsMapper;
import com.ruoyi.system.mapper.RmEpsTopologyManagementMapper;
import com.ruoyi.system.service.IInitialSwitchInfoDetailsService; import com.ruoyi.system.service.IInitialSwitchInfoDetailsService;
import com.ruoyi.system.util.CalculateUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*; import java.util.*;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -34,6 +33,12 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
private RmEpsTopologyManagementMapper rmEpsTopologyManagementMapper; private RmEpsTopologyManagementMapper rmEpsTopologyManagementMapper;
@Autowired @Autowired
private AllInterfaceNameMapper allInterfaceNameMapper; private AllInterfaceNameMapper allInterfaceNameMapper;
@Autowired
private EpsServerRevenueConfigMapper epsServerRevenueConfigMapper;
@Autowired
private EpsMethodChangeRecordMapper epsMethodChangeRecordMapper;
@Autowired
private EpsNodeBandwidthMapper epsNodeBandwidthMapper;
/** /**
* 查询交换机监控信息 * 查询交换机监控信息
@@ -229,4 +234,242 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
!Objects.equals(oldRecord.getSwitchName(), newRecord.getSwitchName()) || !Objects.equals(oldRecord.getSwitchName(), newRecord.getSwitchName()) ||
!Objects.equals(oldRecord.getSwitchSn(), newRecord.getSwitchSn()); !Objects.equals(oldRecord.getSwitchSn(), newRecord.getSwitchSn());
} }
public void calculateSwitch95BandwidthDaily(InitialSwitchInfoDetails queryParam, String dailyStartTime, String dailyEndTime) {
// 查询所有的交换机SN列表
AllInterfaceName allInterfaceName = new AllInterfaceName();
List<AllInterfaceName> switchSnList = allInterfaceNameMapper.getAllSwitchSn(allInterfaceName);
// 遍历处理每个交换机
switchSnList.forEach(interfaceName -> {
queryParam.setSwitchSn(interfaceName.getSwitchSn());
processSwitchBandwidth(queryParam, dailyStartTime, dailyEndTime);
});
}
/**
* 处理单个交换机的带宽计算
*/
private void processSwitchBandwidth(InitialSwitchInfoDetails queryParam,
String dailyStartTime,
String dailyEndTime) {
// 根据交换机sn查询连接的服务器sn
RmEpsTopologyManagement management = new RmEpsTopologyManagement();
management.setSwitchSn(queryParam.getSwitchSn());
List<RmEpsTopologyManagement> serverSnList = rmEpsTopologyManagementMapper.selectRmEpsTopologyManagementList(management);
if(!serverSnList.isEmpty()){
if("1".equals(serverSnList.get(0).getConnectedDeviceType())){
queryParam.setServerSn(serverSnList.get(0).getServerSn());
// 检查交换机连接的服务器是否有业务变更(如果有相关配置)
EpsServerRevenueConfig revenueConfig = new EpsServerRevenueConfig();
revenueConfig.setHardwareSn(serverSnList.get(0).getServerSn());
List<EpsServerRevenueConfig> changedList = epsServerRevenueConfigMapper
.selectEpsServerRevenueConfigList(revenueConfig);
// 根据业务变更情况选择计算方式
if (hasTrafficMethodChanged(changedList)) {
calculateChangedSwitchBandwidth(queryParam, dailyStartTime, dailyEndTime);
} else {
calculateNormalSwitchBandwidth(queryParam, dailyStartTime, dailyEndTime);
}
}
if("2".equals(serverSnList.get(0).getConnectedDeviceType())){
calculateNormalSwitchBandwidth(queryParam, dailyStartTime, dailyEndTime);
}
}
}
/**
* 判断是否为流量型业务变更
*/
private boolean hasTrafficMethodChanged(List<EpsServerRevenueConfig> changedList) {
return !changedList.isEmpty() &&
"1".equals(changedList.get(0).getChanged()) &&
"1".equals(changedList.get(0).getRevenueMethod());
}
/**
* 计算有业务变更交换机的带宽
*/
private void calculateChangedSwitchBandwidth(InitialSwitchInfoDetails queryParam,
String dailyStartTime,
String dailyEndTime) {
// 获取业务变更记录(按时间降序)
EpsMethodChangeRecord changeQuery = new EpsMethodChangeRecord();
changeQuery.setHardwareSn(queryParam.getServerSn());
changeQuery.setStartTime(dailyStartTime);
changeQuery.setEndTime(dailyEndTime);
List<EpsMethodChangeRecord> records = epsMethodChangeRecordMapper
.selectEpsMethodChangeRecordList(changeQuery);
if (!records.isEmpty()) {
// 确保按时间降序排列
records.sort((r1, r2) -> r2.getCreateTime().compareTo(r1.getCreateTime()));
// 计算各时间段95值
calculateSwitchTimeSegments95(queryParam, records, dailyStartTime, dailyEndTime);
}
}
/**
* 计算无业务变更交换机的带宽
*/
private void calculateNormalSwitchBandwidth(InitialSwitchInfoDetails queryParam,
String dailyStartTime,
String dailyEndTime) {
queryParam.setStartTime(dailyStartTime);
queryParam.setEndTime(dailyEndTime);
List<InitialSwitchInfoDetails> dataList = initialSwitchInfoDetailsMapper
.selectInitialSwitchInfoDetailsList(queryParam);
if (!dataList.isEmpty()) {
calculateAndSaveSwitch95Bandwidth(dataList, dailyStartTime, queryParam.getDayOrMonth());
}
}
/**
* 计算并保存交换机95带宽值
*/
private void calculateAndSaveSwitch95Bandwidth(List<InitialSwitchInfoDetails> dataList, String dateTime, String dayOrMonth) {
// 1. 提取并转换带宽值
List<BigDecimal> speedsInMbps = dataList.stream()
.map(data -> {
// 根据 interfaceDeviceType 选择 inSpeed 或 outSpeed
String speed = ("1".equals(data.getInterfaceDeviceType())) ?
data.getInSpeed() + "" : data.getOutSpeed() + "";
// 如果 speed 是纯数字,补充单位 "B/S"Bytes/s
if (speed.matches("^\\d+(\\.\\d+)?$")) {
speed += " B/S";
}
return CalculateUtil.parseSpeedToMbps(speed);
})
.sorted()
.collect(Collectors.toList());
// 2. 计算95百分位
BigDecimal percentile95 = CalculateUtil.calculatePercentile(speedsInMbps, 0.95);
// 3. 保存结果
InitialSwitchInfoDetails switchInfo = dataList.get(0);
switchInfo.setResourceType("2");
if("1".equals(dayOrMonth)){
switchInfo.setBandwidthType("1");
}
if("2".equals(dayOrMonth)){
switchInfo.setBandwidthType("2");
}
saveSwitchBandwidthResult(switchInfo, percentile95, dateTime);
}
/**
* 计算交换机各时间段的95带宽值
*/
private void calculateSwitchTimeSegments95(InitialSwitchInfoDetails queryParam,
List<EpsMethodChangeRecord> records,
String dailyStartTime,
String dailyEndTime) {
// 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);
endTime = startTime; // 移动时间窗口
}
// 2. 处理最早变更前的时间段昨天00:00:00 ~ 最早变更时间)
String earliestChangeTime = records.get(records.size()-1).getCreateTime() + "";
calculateSwitchSegment95(queryParam, dailyStartTime, earliestChangeTime);
// 3. 处理最后变更后的时间段(最新变更时间 ~ 昨天23:59:59
calculateSwitchSegment95(queryParam, endTime, dailyEndTime);
}
/**
* 计算交换机单个时间段的95带宽值
*/
private void calculateSwitchSegment95(InitialSwitchInfoDetails queryParam, String startTime, String endTime) {
queryParam.setStartTime(startTime);
queryParam.setEndTime(endTime);
List<InitialSwitchInfoDetails> dataList = initialSwitchInfoDetailsMapper
.selectInitialSwitchInfoDetailsList(queryParam);
if (!dataList.isEmpty()) {
calculateSwitch95BandwidthDaily(dataList, startTime, queryParam.getDayOrMonth());
}
}
/**
* 计算交换机日95带宽值
*/
private void calculateSwitch95BandwidthDaily(List<InitialSwitchInfoDetails> dataList, String startTime, String dayOrMonth) {
// 1. 提取并转换带宽值
List<BigDecimal> speedsInMbps = dataList.stream()
.map(data -> {
String speed = ("1".equals(data.getInterfaceDeviceType())) ?
data.getInSpeed() + "" : data.getOutSpeed() + "";
if (speed.matches("^\\d+(\\.\\d+)?$")) {
speed += " B/S";
}
return CalculateUtil.parseSpeedToMbps(speed);
})
.sorted()
.collect(Collectors.toList());
// 2. 计算95百分位
BigDecimal percentile95 = CalculateUtil.calculatePercentile(speedsInMbps, 0.95);
BigDecimal dailyResult = percentile95.setScale(2, RoundingMode.HALF_UP);
// 3. 保存结果
InitialSwitchInfoDetails switchInfo = dataList.get(0);
switchInfo.setResourceType("2");
if("1".equals(dayOrMonth)){
switchInfo.setBandwidthType("5");
}
if("2".equals(dayOrMonth)){
switchInfo.setBandwidthType("6");
}
saveSwitchBandwidthResult(switchInfo, dailyResult, startTime);
}
/**
* 保存交换机带宽结果
*/
private void saveSwitchBandwidthResult(InitialSwitchInfoDetails data,
BigDecimal result,
String dateTime) {
EpsNodeBandwidth bandwidth = new EpsNodeBandwidth();
bandwidth.setHardwareSn(data.getServerSn());
bandwidth.setSwitchSn(data.getSwitchSn());
bandwidth.setNodeName(data.getServerName());
bandwidth.setUplinkSwitch(data.getSwitchName());
bandwidth.setInterfaceName(data.getName());
bandwidth.setBandwidthResult(result);
bandwidth.setResourceType(data.getResourceType());
bandwidth.setBandwidthType(data.getBandwidthType());
bandwidth.setBandwidthResult(result);
bandwidth.setCreateTime(DateUtils.parseDate(dateTime));
switch (data.getBandwidthType()){
case "1":
bandwidth.setBandwidth95Daily(result);
break;
case "2":
bandwidth.setBandwidth95Monthly(result);
break;
case "3":
bandwidth.setPackageBandwidthDaily(result);
break;
case "4":
bandwidth.setAvgMonthlyBandwidth95(result);
break;
case "5":
bandwidth.setEffectiveBandwidth95Daily(result);
break;
case "6":
bandwidth.setEffectiveBandwidth95Monthly(result);
break;
case "7":
bandwidth.setEffectiveAvgMonthlyBandwidth95(result);
break;
default:
throw new IllegalArgumentException("Unknown bandwidthType: " + data.getBandwidthType());
}
epsNodeBandwidthMapper.insertEpsNodeBandwidth(bandwidth);
}
} }

View File

@@ -0,0 +1,71 @@
package com.ruoyi.system.util;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CalculateUtil {
private static final Pattern SPEED_PATTERN = Pattern.compile("(\\d+\\.?\\d*)\\s*(\\S*)");
/**
* 单位换算
* @param speedWithUnit
* @return
*/
public static BigDecimal parseSpeedToMbps(String speedWithUnit) {
if (speedWithUnit == null || speedWithUnit.trim().isEmpty()) {
return BigDecimal.ZERO;
}
Matcher matcher = SPEED_PATTERN.matcher(speedWithUnit.trim());
if (!matcher.find()) {
throw new IllegalArgumentException("Invalid speed format: " + speedWithUnit);
}
BigDecimal value = new BigDecimal(matcher.group(1));
String unit = matcher.group(2).toUpperCase();
// 处理纯数字(单位为空)
if (unit.isEmpty()) {
unit = "B/S"; // 默认单位: Bytes/s
}
// 单位换算逻辑(保持不变)
switch (unit) {
case "B/S":
return value.multiply(new BigDecimal("0.000008"));
case "KBPS":
case "KB/S":
return value.divide(new BigDecimal("1000"), 10, RoundingMode.HALF_UP);
case "MBPS":
case "MB/S":
return value;
case "GBPS":
case "GB/S":
return value.multiply(new BigDecimal("1000"));
case "TBPS":
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"));
default:
throw new IllegalArgumentException("Unknown speed unit: " + unit);
}
}
/**
* 计算百分位值
*/
public static BigDecimal calculatePercentile(List<BigDecimal> sortedValues, double percentile) {
int total = sortedValues.size();
int position = (int) Math.ceil(percentile * total) - 1;
position = Math.max(0, Math.min(position, total - 1));
return sortedValues.get(position).setScale(2, RoundingMode.HALF_UP);
}
}

View File

@@ -16,11 +16,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
`out_dropped` DECIMAL(5,2) COMMENT '出站丢包率(%)', `out_dropped` DECIMAL(5,2) COMMENT '出站丢包率(%)',
`in_speed` varchar(20) COMMENT '接收带宽(Mbps)', `in_speed` varchar(20) COMMENT '接收带宽(Mbps)',
`out_speed` varchar(20) COMMENT '发送带宽(Mbps)', `out_speed` varchar(20) COMMENT '发送带宽(Mbps)',
business_id varchar(12) COMMENT '业务代码', business_id varchar(50) COMMENT '业务代码',
business_name varchar(50) COMMENT '业务名称', business_name varchar(200) COMMENT '业务名称',
service_sn varchar(50) COMMENT '服务器SN', service_sn varchar(64) COMMENT '服务器SN',
node_name varchar(50) COMMENT '服务器名称', node_name varchar(200) COMMENT '服务器名称',
revenue_method varchar(50) COMMENT '收益方式(1.流量,2包端)', revenue_method varchar(10) COMMENT '收益方式(1.流量,2包端)',
package_bandwidth DECIMAL(10,2) COMMENT '包端带宽值', package_bandwidth DECIMAL(10,2) COMMENT '包端带宽值',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',

View File

@@ -22,7 +22,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="updateTime" column="update_time" /> <result property="updateTime" column="update_time" />
<result property="creatorId" column="creator_id" /> <result property="creatorId" column="creator_id" />
<result property="creatorName" column="creator_name" /> <result property="creatorName" column="creator_name" />
<result property="remark1" column="remark1" /> <result property="switchSn" column="switch_sn" />
<result property="interfaceName" column="interface_name" /> <result property="interfaceName" column="interface_name" />
<result property="resourceType" column="resource_type" /> <result property="resourceType" column="resource_type" />
<result property="interfaceLinkDeviceType" column="interface_link_device_type" /> <result property="interfaceLinkDeviceType" column="interface_link_device_type" />
@@ -34,7 +34,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap> </resultMap>
<sql id="selectEpsNodeBandwidthVo"> <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, remark1, 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 from eps_node_bandwidth 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 from eps_node_bandwidth
</sql> </sql>
<select id="selectEpsNodeBandwidthList" parameterType="EpsNodeBandwidth" resultMap="EpsNodeBandwidthResult"> <select id="selectEpsNodeBandwidthList" parameterType="EpsNodeBandwidth" resultMap="EpsNodeBandwidthResult">
@@ -54,7 +54,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="uplinkSwitch != null and uplinkSwitch != ''"> and uplink_switch like concat('%', #{uplinkSwitch}, '%')</if> <if test="uplinkSwitch != null and uplinkSwitch != ''"> and uplink_switch like concat('%', #{uplinkSwitch}, '%')</if>
<if test="creatorId != null "> and creator_id = #{creatorId}</if> <if test="creatorId != null "> and creator_id = #{creatorId}</if>
<if test="creatorName != null and creatorName != ''"> and creator_name like concat('%', #{creatorName}, '%')</if> <if test="creatorName != null and creatorName != ''"> and creator_name like concat('%', #{creatorName}, '%')</if>
<if test="remark1 != null and remark1 != ''"> and remark1 = #{remark1}</if> <if test="switchSn != null and switchSn != ''"> and switch_sn = #{switchSn}</if>
<if test="interfaceName != null and interfaceName != ''"> and interface_name = #{interfaceName}</if> <if test="interfaceName != null and interfaceName != ''"> and interface_name = #{interfaceName}</if>
<if test="resourceType != null and resourceType != ''"> and resource_type = #{resourceType}</if> <if test="resourceType != null and resourceType != ''"> and resource_type = #{resourceType}</if>
<if test="interfaceLinkDeviceType != null and interfaceLinkDeviceType != ''"> and interface_link_device_type = #{interfaceLinkDeviceType}</if> <if test="interfaceLinkDeviceType != null and interfaceLinkDeviceType != ''"> and interface_link_device_type = #{interfaceLinkDeviceType}</if>
@@ -92,7 +92,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updateTime != null">update_time,</if> <if test="updateTime != null">update_time,</if>
<if test="creatorId != null">creator_id,</if> <if test="creatorId != null">creator_id,</if>
<if test="creatorName != null">creator_name,</if> <if test="creatorName != null">creator_name,</if>
<if test="remark1 != null">remark1,</if> <if test="switchSn != null">switch_sn,</if>
<if test="interfaceName != null">interface_name,</if> <if test="interfaceName != null">interface_name,</if>
<if test="resourceType != null">resource_type,</if> <if test="resourceType != null">resource_type,</if>
<if test="interfaceLinkDeviceType != null">interface_link_device_type,</if> <if test="interfaceLinkDeviceType != null">interface_link_device_type,</if>
@@ -119,7 +119,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updateTime != null">#{updateTime},</if> <if test="updateTime != null">#{updateTime},</if>
<if test="creatorId != null">#{creatorId},</if> <if test="creatorId != null">#{creatorId},</if>
<if test="creatorName != null">#{creatorName},</if> <if test="creatorName != null">#{creatorName},</if>
<if test="remark1 != null">#{remark1},</if> <if test="switchSn != null">#{switchSn},</if>
<if test="interfaceName != null">#{interfaceName},</if> <if test="interfaceName != null">#{interfaceName},</if>
<if test="resourceType != null">#{resourceType},</if> <if test="resourceType != null">#{resourceType},</if>
<if test="interfaceLinkDeviceType != null">#{interfaceLinkDeviceType},</if> <if test="interfaceLinkDeviceType != null">#{interfaceLinkDeviceType},</if>
@@ -150,7 +150,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updateTime != null">update_time = #{updateTime},</if> <if test="updateTime != null">update_time = #{updateTime},</if>
<if test="creatorId != null">creator_id = #{creatorId},</if> <if test="creatorId != null">creator_id = #{creatorId},</if>
<if test="creatorName != null">creator_name = #{creatorName},</if> <if test="creatorName != null">creator_name = #{creatorName},</if>
<if test="remark1 != null">remark1 = #{remark1},</if> <if test="switchSn != null">switch_sn = #{switchSn},</if>
<if test="interfaceName != null">interface_name = #{interfaceName},</if> <if test="interfaceName != null">interface_name = #{interfaceName},</if>
<if test="resourceType != null">resource_type = #{resourceType},</if> <if test="resourceType != null">resource_type = #{resourceType},</if>
<if test="interfaceLinkDeviceType != null">interface_link_device_type = #{interfaceLinkDeviceType},</if> <if test="interfaceLinkDeviceType != null">interface_link_device_type = #{interfaceLinkDeviceType},</if>
@@ -174,17 +174,32 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach> </foreach>
</delete> </delete>
<select id="calculateAvg" parameterType="EpsNodeBandwidth" resultMap="EpsNodeBandwidthResult"> <select id="calculateAvg" parameterType="EpsNodeBandwidth" resultType="EpsNodeBandwidth">
select sum(ifnull(bandwidth_95_daily,0)) bandwidth95Daily, select sum(ifnull(bandwidth_95_daily,0)) bandwidth95Daily,
sum(ifnull(effective_bandwidth_95_daily,0)) effectiveBandwidth95Daily sum(ifnull(effective_bandwidth_95_daily,0)) effectiveBandwidth95Daily
from eps_node_bandwidth from eps_node_bandwidth
<where> <where>
<if test="createTime != null"> <if test="startTime != null">
and left(create_time,7) = #{createTime} and create_time &gt;= #{startTime}
</if>
<if test="endTime != null">
and create_time &lt;= #{endTime}
</if>
<if test="monthTime != null">
and left(create_time,7) = #{monthTime}
</if> </if>
<if test="nodeName != '' and nodeName != null"> <if test="nodeName != '' and nodeName != null">
and node_name = #{nodeName} and node_name = #{nodeName}
</if> </if>
<if test="hardwareSn != '' and hardwareSn != null">
and hardware_sn = #{hardwareSn}
</if>
<if test="switchSn != '' and switchSn != null">
and switch_sn = #{switchSn}
</if>
<if test="interfaceName != '' and interfaceName != null">
and interface_name = #{interfaceName}
</if>
<if test="businessName != '' and businessName != null"> <if test="businessName != '' and businessName != null">
and business_name = #{businessName} and business_name = #{businessName}
</if> </if>