From ea6e65bfaf07fd6c1a781bb8226f84c8d003073c Mon Sep 17 00:00:00 2001 From: gaoyutao Date: Thu, 28 Aug 2025 21:13:05 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=AE=9A=E6=97=B6=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=EF=BC=8C=E6=AF=8F=E6=9C=881=E5=8F=B70=E7=82=B9?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=20=E8=AE=A1=E7=AE=97=20=E6=9C=88=E5=9D=87?= =?UTF-8?q?=E6=97=A595=E5=80=BC=EF=BC=8C95=E5=B8=A6=E5=AE=BD=E5=80=BC/?= =?UTF-8?q?=E6=9C=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/config/TableScheduleConfig.java | 374 ++++++++++++++++- .../EpsNodeBandwidthController.java | 2 +- .../system/domain/EpsInitialTrafficData.java | 8 +- .../ruoyi/system/domain/EpsNodeBandwidth.java | 286 +------------ .../domain/InitialSwitchInfoDetails.java | 7 + .../service/EpsInitialTrafficDataService.java | 15 +- .../service/IAllInterfaceNameService.java | 7 +- .../IInitialSwitchInfoDetailsService.java | 7 + .../impl/AllInterfaceNameServiceImpl.java | 18 +- .../EpsInitialTrafficDataServiceImpl.java | 382 +++++++----------- .../impl/EpsNodeBandwidthServiceImpl.java | 144 +++++-- .../InitialSwitchInfoDetailsServiceImpl.java | 255 +++++++++++- .../com/ruoyi/system/util/CalculateUtil.java | 71 ++++ .../system/EpsInitialTrafficDataMapper.xml | 10 +- .../mapper/system/EpsNodeBandwidthMapper.xml | 33 +- 15 files changed, 1025 insertions(+), 594 deletions(-) create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/CalculateUtil.java diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/config/TableScheduleConfig.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/config/TableScheduleConfig.java index 3eecbb7..eaf85dc 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/config/TableScheduleConfig.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/config/TableScheduleConfig.java @@ -1,25 +1,47 @@ package com.ruoyi.system.config; -import com.ruoyi.system.domain.EpsInitialTrafficData; -import com.ruoyi.system.domain.InitialSwitchInfoDetails; -import com.ruoyi.system.service.EpsInitialTrafficDataService; +import com.ruoyi.common.core.utils.DateUtils; +import com.ruoyi.system.domain.*; +import com.ruoyi.system.service.*; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; 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 @EnableScheduling +@Slf4j public class TableScheduleConfig { + private static final DateTimeFormatter TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @Autowired 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号创建下月表 - @Scheduled(cron = "0 0 0 26 * ?") + @Scheduled(cron = "0 0 0 25 * ?") // @Scheduled(initialDelay = 5000, fixedDelay = Long.MAX_VALUE) public void createNextMonthTables() { epsInitialTrafficDataService.createNextMonthTables(); @@ -28,11 +50,347 @@ public class TableScheduleConfig { // 每天12点执行 计算95带宽值/日 @Scheduled(cron = "0 0 0 * * ?", zone = "Asia/Shanghai") 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带宽值/日 - epsInitialTrafficDataService.calculateBusiness95BandwidthDaily(queryParam); + EpsInitialTrafficData queryParam = new EpsInitialTrafficData(); + queryParam.setDayOrMonth(dayOrMonth); + epsInitialTrafficDataService.calculateBusiness95BandwidthDaily(queryParam, dailyStartTime, dailyEndTime); 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 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 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 records = epsMethodChangeRecordService.selectEpsMethodChangeRecordList(changeQuery); + + // 按businessCode分组处理(修复null key问题) + if (!records.isEmpty()) { + Map> groupedRecords = records.stream() + .filter(record -> record.getBusinessCode() != null) // 过滤掉businessCode为null的记录 + .collect(Collectors.groupingBy(EpsMethodChangeRecord::getBusinessCode)); + + // 处理每个业务分组 + for (Map.Entry> 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 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 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 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 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 records = epsMethodChangeRecordService.selectEpsMethodChangeRecordList(changeQuery); + + // 按businessCode分组处理 + if (!records.isEmpty()) { + Map> groupedRecords = records.stream() + .filter(record -> record.getBusinessCode() != null) // 过滤掉businessCode为null的记录 + .collect(Collectors.groupingBy(EpsMethodChangeRecord::getBusinessCode)); + + // 处理每个业务分组 + for (Map.Entry> entry : groupedRecords.entrySet()) { + String businessCode = entry.getKey(); + List 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 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); + } } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/EpsNodeBandwidthController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/EpsNodeBandwidthController.java index a9ffc8f..8b99c04 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/EpsNodeBandwidthController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/EpsNodeBandwidthController.java @@ -126,6 +126,6 @@ public class EpsNodeBandwidthController extends BaseController @PostMapping("/calculateAvg") public AjaxResult calculateAvg(@RequestBody EpsNodeBandwidth epsNodeBandwidth) { - return toAjax(epsNodeBandwidthService.insertEpsNodeBandwidth(epsNodeBandwidth)); + return toAjax(epsNodeBandwidthService.calculateAvg(epsNodeBandwidth)); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/EpsInitialTrafficData.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/EpsInitialTrafficData.java index d0016ad..ecea8c5 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/EpsInitialTrafficData.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/EpsInitialTrafficData.java @@ -84,6 +84,7 @@ public class EpsInitialTrafficData { /** 批量插入集合 **/ private List dataList; + /** * 动态表名 * 格式:eps_traffic_[年]_[月]_[日期范围] @@ -124,7 +125,12 @@ public class EpsInitialTrafficData { * 选中的属性名称 */ private String[] properties; - + /** 资源类型 */ + private String resourceType; + /** 带宽类型 */ + private String bandwidthType; + /** 日或月 */ + private String dayOrMonth; } \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/EpsNodeBandwidth.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/EpsNodeBandwidth.java index 95b263e..4dfc23f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/EpsNodeBandwidth.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/EpsNodeBandwidth.java @@ -3,11 +3,9 @@ package com.ruoyi.system.domain; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.annotation.Excel; import com.ruoyi.common.core.web.domain.BaseEntity; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; +import lombok.Data; import java.math.BigDecimal; -import java.time.LocalDate; import java.util.Date; /** @@ -16,6 +14,7 @@ import java.util.Date; * @author gyt * @date 2025-08-12 */ +@Data public class EpsNodeBandwidth extends BaseEntity { private static final long serialVersionUID = 1L; @@ -96,9 +95,9 @@ public class EpsNodeBandwidth extends BaseEntity @Excel(name = "创建人名称") private String creatorName; - /** remark1 */ - @Excel(name = "remark1") - private String remark1; + /** 交换机sn */ + @Excel(name = "交换机sn") + private String switchSn; /** 接口名称 */ @Excel(name = "接口名称") @@ -126,280 +125,7 @@ public class EpsNodeBandwidth extends BaseEntity /** 结束时间 */ private String endTime; /** 月份 */ - @JsonFormat(pattern = "yyyy-MM") - private LocalDate monthTime; + private String 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(); - } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/InitialSwitchInfoDetails.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/InitialSwitchInfoDetails.java index 06aba8f..e048161 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/InitialSwitchInfoDetails.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/InitialSwitchInfoDetails.java @@ -82,4 +82,11 @@ public class InitialSwitchInfoDetails extends BaseEntity private String startTime; private String endTime; + + /** 资源类型 */ + private String resourceType; + /** 带宽类型 */ + private String bandwidthType; + /** 日或月 */ + private String dayOrMonth; } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/EpsInitialTrafficDataService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/EpsInitialTrafficDataService.java index 32b2fbc..5d29c10 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/EpsInitialTrafficDataService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/EpsInitialTrafficDataService.java @@ -1,7 +1,6 @@ package com.ruoyi.system.service; import com.ruoyi.system.domain.EpsInitialTrafficData; -import com.ruoyi.system.domain.InitialSwitchInfoDetails; import java.util.List; @@ -45,18 +44,6 @@ public interface EpsInitialTrafficDataService { * @param queryParam 查询参数实体 * @return 流量数据列表 */ - void calculateBusiness95BandwidthDaily(EpsInitialTrafficData queryParam); - /** - * 计算95带宽值 - * @param queryParam 查询参数实体 - * @return 流量数据列表 - */ - void calculate95BandwidthDaily(EpsInitialTrafficData queryParam); - /** - * 计算交换机95带宽值 - * @param queryParam 查询参数实体 - * @return 流量数据列表 - */ - void calculateSwitch95BandwidthDaily(InitialSwitchInfoDetails queryParam); + void calculateBusiness95BandwidthDaily(EpsInitialTrafficData queryParam, String dailyStartTime, String dailyEndTime); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/IAllInterfaceNameService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/IAllInterfaceNameService.java index 00492bb..5f477e7 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/IAllInterfaceNameService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/IAllInterfaceNameService.java @@ -1,8 +1,9 @@ package com.ruoyi.system.service; -import java.util.List; import com.ruoyi.system.domain.AllInterfaceName; +import java.util.List; + /** * 所有接口名称Service接口 * @@ -58,4 +59,8 @@ public interface IAllInterfaceNameService * @return 结果 */ public int deleteAllInterfaceNameById(Long id); + + List getAllDeviceSn(AllInterfaceName interfaceName); + + List getAllSwitchSn(AllInterfaceName allInterfaceName); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/IInitialSwitchInfoDetailsService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/IInitialSwitchInfoDetailsService.java index 515c283..1535d2a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/IInitialSwitchInfoDetailsService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/IInitialSwitchInfoDetailsService.java @@ -65,4 +65,11 @@ public interface IInitialSwitchInfoDetailsService * @param initialSwitchInfoDetails */ R autoSaveSwitchTraffic(InitialSwitchInfoDetails initialSwitchInfoDetails); + + /** + * 计算交换机95带宽值 + * @param queryParam 查询参数实体 + * @return 流量数据列表 + */ + void calculateSwitch95BandwidthDaily(InitialSwitchInfoDetails queryParam, String dailyStartTime, String dailyEndTime); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AllInterfaceNameServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AllInterfaceNameServiceImpl.java index de9b86f..d0867ab 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AllInterfaceNameServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AllInterfaceNameServiceImpl.java @@ -1,12 +1,13 @@ package com.ruoyi.system.service.impl; -import java.util.List; 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.stereotype.Service; -import com.ruoyi.system.mapper.AllInterfaceNameMapper; -import com.ruoyi.system.domain.AllInterfaceName; -import com.ruoyi.system.service.IAllInterfaceNameService; + +import java.util.List; /** * 所有接口名称Service业务层处理 @@ -93,4 +94,13 @@ public class AllInterfaceNameServiceImpl implements IAllInterfaceNameService { return allInterfaceNameMapper.deleteAllInterfaceNameById(id); } + + @Override + public List getAllDeviceSn(AllInterfaceName interfaceName) { + return allInterfaceNameMapper.getAllDeviceSn(interfaceName); + } + @Override + public List getAllSwitchSn(AllInterfaceName allInterfaceName){ + return allInterfaceNameMapper.getAllSwitchSn(allInterfaceName); + } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EpsInitialTrafficDataServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EpsInitialTrafficDataServiceImpl.java index a5625c9..ec61a4b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EpsInitialTrafficDataServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EpsInitialTrafficDataServiceImpl.java @@ -4,6 +4,7 @@ import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.system.domain.*; import com.ruoyi.system.mapper.*; import com.ruoyi.system.service.EpsInitialTrafficDataService; +import com.ruoyi.system.util.CalculateUtil; import com.ruoyi.system.util.TableRouterUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -13,25 +14,19 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; -import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.*; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.function.Consumer; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import java.util.stream.Collectors; @Service @Slf4j 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 private EpsInitialTrafficDataMapper epsInitialTrafficDataMapper; @Autowired @@ -39,8 +34,6 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe @Autowired private AllInterfaceNameMapper allInterfaceNameMapper; @Autowired - private InitialSwitchInfoDetailsMapper initialSwitchInfoDetailsMapper; - @Autowired private EpsServerRevenueConfigMapper epsServerRevenueConfigMapper; @Autowired private EpsMethodChangeRecordMapper epsMethodChangeRecordMapper; @@ -200,50 +193,106 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe } /** - * 有业务变动的 计算有效95带宽值/日 + * 计算95带宽值/日 * @param queryParam */ @Override - public void calculateBusiness95BandwidthDaily(EpsInitialTrafficData queryParam) { - // 1. 获取所有设备SN列表 + public void calculateBusiness95BandwidthDaily(EpsInitialTrafficData queryParam, String dailyStartTime, String dailyEndTime) { + // 获取所有设备SN列表 List snList = allInterfaceNameMapper.getAllDeviceSn(new AllInterfaceName()); - - // 2. 获取昨天的日期范围(北京时间) - 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) { + // 遍历处理每个设备 + snList.forEach(interfaceName -> { 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 changedList = epsServerRevenueConfigMapper + .selectEpsServerRevenueConfigList(revenueConfig); - // 4. 检查设备是否有业务变更 - EpsServerRevenueConfig revenueConfig = new EpsServerRevenueConfig(); - revenueConfig.setHardwareSn(interfaceName.getDeviceSn()); - List changedList = epsServerRevenueConfigMapper.selectEpsServerRevenueConfigList(revenueConfig); - - 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 records = epsMethodChangeRecordMapper - .selectEpsMethodChangeRecordList(changeQuery); - - if (!records.isEmpty()) { - // 确保按时间降序排列 - records.sort((r1, r2) -> r2.getCreateTime().compareTo(r1.getCreateTime())); - - // 6. 计算各时间段95值 - calculateTimeSegments95(queryParam, records, dailyStartTime, dailyEndTime); - } - } + // 2. 根据业务变更情况选择计算方式 + if (hasTrafficMethodChanged(changedList)) { + calculateChangedDeviceBandwidth(queryParam, dailyStartTime, dailyEndTime); + } else { + calculateNormalDeviceBandwidth(queryParam, dailyStartTime, dailyEndTime); } } + /** + * 判断是否为流量型业务变更 + */ + private boolean hasTrafficMethodChanged(List 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 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 dataList = query(queryParam); + + if (!dataList.isEmpty()) { + calculateAndSave95Bandwidth(dataList, dailyStartTime, queryParam.getDayOrMonth()); + } + } + /** + * 计算并保存95带宽值 + */ + private void calculateAndSave95Bandwidth(List dataList, String dateTime, String dayOrMonth) { + // 1. 提取并转换带宽值 + List 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带宽值 @@ -276,146 +325,18 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe queryParam.setEndTime(endTime); List dataList = query(queryParam); 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 snList = allInterfaceNameMapper.getAllDeviceSn(allInterfaceName); - for (AllInterfaceName interfaceName : snList) { - queryParam.setServiceSn(interfaceName.getDeviceSn()); - // 4. 检查设备是否有业务变更 - EpsServerRevenueConfig revenueConfig = new EpsServerRevenueConfig(); - revenueConfig.setHardwareSn(interfaceName.getDeviceSn()); - List changedList = epsServerRevenueConfigMapper.selectEpsServerRevenueConfigList(revenueConfig); - - if (!changedList.isEmpty() && - "1".equals(changedList.get(0).getChanged()) && - "1".equals(changedList.get(0).getRevenueMethod())) { - - }else{ - // 查询原始数据 - List dataList = query(queryParam); - if(!dataList.isEmpty()){ - // 1. 提取 outSpeed 并转换为 Mbps - List 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 switchSnList = allInterfaceNameMapper.getAllSwitchSn(allInterfaceName); - for (AllInterfaceName interfaceName : switchSnList) { - queryParam.setSwitchSn(interfaceName.getSwitchSn()); - // 查询原始数据 - List dataList = initialSwitchInfoDetailsMapper.selectInitialSwitchInfoDetailsList(queryParam); - if(!dataList.isEmpty()){ - // 1. 提取 outSpeed 并转换为 Mbps - List 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 */ - private void calculate95BandwidthDaily(List dataList){ + private void calculate95BandwidthDaily(List dataList, String startTime, String dayOrMonth){ // 1. 提取 outSpeed 并转换为 Mbps List speedsInMbps = dataList.stream() - .map(data -> parseSpeedToMbps(data.getOutSpeed())) + .map(data -> CalculateUtil.parseSpeedToMbps(data.getOutSpeed())) .sorted() .collect(Collectors.toList()); @@ -434,66 +355,55 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe 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("5"); - bandwidth.setBandwidthResult(dailyResult); - bandwidth.setEffectiveBandwidth95Daily(dailyResult); - bandwidth.setCreateTime(DateUtils.parseDate(epsInitialTrafficData.getStartTime())); - epsNodeBandwidthMapper.insertEpsNodeBandwidth(bandwidth); + epsInitialTrafficData.setResourceType("1"); + if("1".equals(dayOrMonth)){ + epsInitialTrafficData.setBandwidthType("5"); + } + if("2".equals(dayOrMonth)){ + epsInitialTrafficData.setBandwidthType("6"); + } + saveBandwidthResult(epsInitialTrafficData, dailyResult, startTime); } /** - * 单位换算 - * @param speedWithUnit - * @return + * 保存带宽结果 */ - private 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")); + private void saveBandwidthResult(EpsInitialTrafficData data, + BigDecimal result, + String dateTime) { + EpsNodeBandwidth bandwidth = new EpsNodeBandwidth(); + bandwidth.setHardwareSn(data.getServiceSn()); + bandwidth.setNodeName(data.getNodeName()); + bandwidth.setBusinessId(data.getBusinessId()); + bandwidth.setBusinessName(data.getBusinessName()); + 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 speed unit: " + unit); + throw new IllegalArgumentException("Unknown bandwidthType: " + data.getBandwidthType()); } + epsNodeBandwidthMapper.insertEpsNodeBandwidth(bandwidth); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EpsNodeBandwidthServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EpsNodeBandwidthServiceImpl.java index 74d9158..2483d58 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EpsNodeBandwidthServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EpsNodeBandwidthServiceImpl.java @@ -3,10 +3,13 @@ package com.ruoyi.system.service.impl; import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.system.domain.EpsInitialTrafficData; import com.ruoyi.system.domain.EpsNodeBandwidth; +import com.ruoyi.system.domain.EpsServerRevenueConfig; import com.ruoyi.system.mapper.EpsNodeBandwidthMapper; +import com.ruoyi.system.mapper.EpsServerRevenueConfigMapper; import com.ruoyi.system.service.EpsInitialTrafficDataService; import com.ruoyi.system.service.IEpsNodeBandwidthService; import com.ruoyi.system.util.DateUtil; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -18,7 +21,9 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.YearMonth; +import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Optional; /** * 节点带宽信息Service业务层处理 @@ -27,12 +32,15 @@ import java.util.List; * @date 2025-08-12 */ @Service +@Slf4j public class EpsNodeBandwidthServiceImpl implements IEpsNodeBandwidthService { @Autowired private EpsNodeBandwidthMapper epsNodeBandwidthMapper; @Autowired private EpsInitialTrafficDataService epsInitialTrafficDataService; + @Autowired + private EpsServerRevenueConfigMapper epsServerRevenueConfigMapper; /** * 查询节点带宽信息 @@ -53,8 +61,7 @@ public class EpsNodeBandwidthServiceImpl implements IEpsNodeBandwidthService * @return 节点带宽信息 */ @Override - public List relatedData(Long id) - { + public List relatedData(Long id) { // 1. 根据ID查询服务器信息 EpsNodeBandwidth epsNodeBandwidth = epsNodeBandwidthMapper.selectEpsNodeBandwidthById(id); if (epsNodeBandwidth == null) { @@ -140,33 +147,110 @@ public class EpsNodeBandwidthServiceImpl implements IEpsNodeBandwidthService * @param epsNodeBandwidth 节点带宽信息 * @return 结果 */ + /** + * 计算月均日95值 + */ @Override @Transactional(rollbackFor = Exception.class) public int calculateAvg(EpsNodeBandwidth epsNodeBandwidth) { - // 验证是否已经存在记录 - List existingRecords = epsNodeBandwidthMapper.selectEpsNodeBandwidthList(epsNodeBandwidth); + try { + // 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); - // 根据是否存在记录执行更新或插入操作 - return existingRecords.isEmpty() ? - epsNodeBandwidthMapper.insertEpsNodeBandwidth(epsNodeBandwidth) : - epsNodeBandwidthMapper.updateEpsNodeBandwidth(epsNodeBandwidth); + // 3. 获取计算数据(防止空指针) + EpsNodeBandwidth calculatedData = epsNodeBandwidthMapper.calculateAvg(epsNodeBandwidth); + if (calculatedData == null) { + 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 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 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 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 @@ -180,23 +264,25 @@ public class EpsNodeBandwidthServiceImpl implements IEpsNodeBandwidthService } /** - * 根据带宽类型设置时间范围 + * 根据带宽类型设置时间范围(修复T分隔符问题) */ private void setTimeRangeByBandwidthType(EpsInitialTrafficData data, String bandwidthType, LocalDateTime baseTime) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + switch (bandwidthType) { case "1": case "3": case "5": // 日带宽 - data.setStartTime(baseTime.with(LocalTime.MIN) + ""); // 00:00:00 - data.setEndTime(baseTime.with(LocalTime.MAX).withNano(0) + ""); // 23:59:59 + data.setStartTime(baseTime.with(LocalTime.MIN).format(formatter)); // 00:00:00 + data.setEndTime(baseTime.with(LocalTime.MAX).withNano(0).format(formatter)); // 23:59:59 break; case "2": case "4": case "6": case "7": // 月带宽 YearMonth month = YearMonth.from(baseTime); - data.setStartTime(month.atDay(1).atStartOfDay() + ""); // 当月第一天 00:00:00 - data.setEndTime(month.atEndOfMonth().atTime(23, 59, 59) + ""); // 当月最后一天 23:59:59 + data.setStartTime(month.atDay(1).atStartOfDay().format(formatter)); // 当月第一天 00:00:00 + data.setEndTime(month.atEndOfMonth().atTime(23, 59, 59).format(formatter)); // 当月最后一天 23:59:59 break; default: throw new IllegalArgumentException("不支持的带宽类型: " + bandwidthType); diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/InitialSwitchInfoDetailsServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/InitialSwitchInfoDetailsServiceImpl.java index 543bf99..62b33d4 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/InitialSwitchInfoDetailsServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/InitialSwitchInfoDetailsServiceImpl.java @@ -3,17 +3,16 @@ package com.ruoyi.system.service.impl; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.utils.StringUtils; -import com.ruoyi.system.domain.AllInterfaceName; -import com.ruoyi.system.domain.InitialSwitchInfoDetails; -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.domain.*; +import com.ruoyi.system.mapper.*; import com.ruoyi.system.service.IInitialSwitchInfoDetailsService; +import com.ruoyi.system.util.CalculateUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -34,6 +33,12 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe private RmEpsTopologyManagementMapper rmEpsTopologyManagementMapper; @Autowired 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.getSwitchSn(), newRecord.getSwitchSn()); } + + public void calculateSwitch95BandwidthDaily(InitialSwitchInfoDetails queryParam, String dailyStartTime, String dailyEndTime) { + // 查询所有的交换机SN列表 + AllInterfaceName allInterfaceName = new AllInterfaceName(); + List 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 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 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 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 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 dataList = initialSwitchInfoDetailsMapper + .selectInitialSwitchInfoDetailsList(queryParam); + + if (!dataList.isEmpty()) { + calculateAndSaveSwitch95Bandwidth(dataList, dailyStartTime, queryParam.getDayOrMonth()); + } + } + + /** + * 计算并保存交换机95带宽值 + */ + private void calculateAndSaveSwitch95Bandwidth(List dataList, String dateTime, String dayOrMonth) { + // 1. 提取并转换带宽值 + List 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 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 dataList = initialSwitchInfoDetailsMapper + .selectInitialSwitchInfoDetailsList(queryParam); + if (!dataList.isEmpty()) { + calculateSwitch95BandwidthDaily(dataList, startTime, queryParam.getDayOrMonth()); + } + } + + /** + * 计算交换机日95带宽值 + */ + private void calculateSwitch95BandwidthDaily(List dataList, String startTime, String dayOrMonth) { + // 1. 提取并转换带宽值 + List 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); + } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/CalculateUtil.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/CalculateUtil.java new file mode 100644 index 0000000..f0916bd --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/CalculateUtil.java @@ -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 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); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/EpsInitialTrafficDataMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/EpsInitialTrafficDataMapper.xml index 00c36f9..f22d026 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/EpsInitialTrafficDataMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/EpsInitialTrafficDataMapper.xml @@ -16,11 +16,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" `out_dropped` DECIMAL(5,2) COMMENT '出站丢包率(%)', `in_speed` varchar(20) COMMENT '接收带宽(Mbps)', `out_speed` varchar(20) COMMENT '发送带宽(Mbps)', - business_id varchar(12) COMMENT '业务代码', - business_name varchar(50) COMMENT '业务名称', - service_sn varchar(50) COMMENT '服务器SN', - node_name varchar(50) COMMENT '服务器名称', - revenue_method varchar(50) COMMENT '收益方式(1.流量,2包端)', + business_id varchar(50) COMMENT '业务代码', + business_name varchar(200) COMMENT '业务名称', + service_sn varchar(64) COMMENT '服务器SN', + node_name varchar(200) COMMENT '服务器名称', + revenue_method varchar(10) COMMENT '收益方式(1.流量,2包端)', package_bandwidth DECIMAL(10,2) COMMENT '包端带宽值', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/EpsNodeBandwidthMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/EpsNodeBandwidthMapper.xml index 97d035a..1f546f7 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/EpsNodeBandwidthMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/EpsNodeBandwidthMapper.xml @@ -22,7 +22,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + @@ -34,7 +34,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - 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 +