net类型新增speed,duplex字段,新增重新计算,相关数据,图形分析接口
This commit is contained in:
+1
-1
@@ -56,7 +56,7 @@ public class TableScheduleConfig {
|
||||
String dailyEndTime = yesterday.atTime(23, 59, 59).format(TIME_FORMAT); // 23:59:59
|
||||
// 日
|
||||
String dayOrMonth = "1";
|
||||
// 有效-95带宽值/日
|
||||
// 95带宽值/日
|
||||
EpsInitialTrafficData queryParam = new EpsInitialTrafficData();
|
||||
queryParam.setDayOrMonth(dayOrMonth);
|
||||
epsInitialTrafficDataService.calculateBusiness95BandwidthDaily(queryParam, dailyStartTime, dailyEndTime);
|
||||
|
||||
+190
-11
@@ -1,5 +1,7 @@
|
||||
package com.ruoyi.system.controller;
|
||||
|
||||
import com.ruoyi.common.core.exception.ServiceException;
|
||||
import com.ruoyi.common.core.utils.DateUtils;
|
||||
import com.ruoyi.common.core.utils.poi.ExcelUtil;
|
||||
import com.ruoyi.common.core.web.controller.BaseController;
|
||||
import com.ruoyi.common.core.web.domain.AjaxResult;
|
||||
@@ -8,13 +10,25 @@ import com.ruoyi.common.core.web.page.TableDataInfo;
|
||||
import com.ruoyi.common.log.annotation.Log;
|
||||
import com.ruoyi.common.log.enums.BusinessType;
|
||||
import com.ruoyi.common.security.annotation.RequiresPermissions;
|
||||
import com.ruoyi.system.domain.EpsInitialTrafficData;
|
||||
import com.ruoyi.system.domain.EpsNodeBandwidth;
|
||||
import com.ruoyi.system.domain.InitialSwitchInfoDetails;
|
||||
import com.ruoyi.system.service.EpsInitialTrafficDataService;
|
||||
import com.ruoyi.system.service.IEpsNodeBandwidthService;
|
||||
import com.ruoyi.system.service.IInitialSwitchInfoDetailsService;
|
||||
import com.ruoyi.system.util.CalculateUtil;
|
||||
import com.ruoyi.system.util.DateUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.webjars.NotFoundException;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.time.ZoneId;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 节点带宽信息Controller
|
||||
@@ -24,10 +38,18 @@ import java.util.List;
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/bandwidth")
|
||||
@Slf4j
|
||||
public class EpsNodeBandwidthController extends BaseController
|
||||
{
|
||||
private static final DateTimeFormatter TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
private static final ZoneId ZONE = ZoneId.of("Asia/Shanghai");
|
||||
@Autowired
|
||||
private IEpsNodeBandwidthService epsNodeBandwidthService;
|
||||
@Autowired
|
||||
private IInitialSwitchInfoDetailsService initialSwitchInfoDetailsService;
|
||||
@Autowired
|
||||
private EpsInitialTrafficDataService epsInitialTrafficDataService;
|
||||
|
||||
/**
|
||||
* 查询节点带宽信息列表
|
||||
@@ -41,6 +63,17 @@ public class EpsNodeBandwidthController extends BaseController
|
||||
pageDomain.setPageNum(epsNodeBandwidth.getPageNum());
|
||||
pageDomain.setPageSize(epsNodeBandwidth.getPageSize());
|
||||
startPage(pageDomain);
|
||||
// 获取时间类型 1--日, 2--月
|
||||
if(epsNodeBandwidth.getBandwidthType() != null){
|
||||
String type = CalculateUtil.getTypeByBandwidthType(epsNodeBandwidth.getBandwidthType());
|
||||
// 获取开始时间 结束时间
|
||||
DateUtil.TimeRange startTimeRange = DateUtil.getTimeRange(DateUtils.parseDate(epsNodeBandwidth.getStartTime()),type);
|
||||
DateUtil.TimeRange endTimeRange = DateUtil.getTimeRange(DateUtils.parseDate(epsNodeBandwidth.getEndTime()),type);
|
||||
String startTime = startTimeRange.getStart();
|
||||
String endTime = endTimeRange.getEnd();
|
||||
epsNodeBandwidth.setStartTime(startTime);
|
||||
epsNodeBandwidth.setEndTime(endTime);
|
||||
}
|
||||
List<EpsNodeBandwidth> list = epsNodeBandwidthService.selectEpsNodeBandwidthList(epsNodeBandwidth);
|
||||
return getDataTable(list);
|
||||
}
|
||||
@@ -97,26 +130,87 @@ public class EpsNodeBandwidthController extends BaseController
|
||||
@GetMapping(value = "recalculate/{id}")
|
||||
public AjaxResult recalculate(@PathVariable("id") Long id)
|
||||
{
|
||||
return success(epsNodeBandwidthService.selectEpsNodeBandwidthById(id));//TODO 待逻辑处理
|
||||
// 获取需要重新计算的信息
|
||||
EpsNodeBandwidth epsNodeBandwidth = epsNodeBandwidthService.selectEpsNodeBandwidthById(id);
|
||||
if (epsNodeBandwidth == null) {
|
||||
throw new NotFoundException("未找到ID为" + id + "的服务器信息");
|
||||
}
|
||||
// 获取时间类型 1--日, 2--月
|
||||
String type = CalculateUtil.getTypeByBandwidthType(epsNodeBandwidth.getBandwidthType());
|
||||
// 设置开始时间,结束时间
|
||||
DateUtil.TimeRange timeRange = DateUtil.getTimeRange(epsNodeBandwidth.getCreateTime(),type);
|
||||
String dailyStartTime = timeRange.getStart();
|
||||
String dailyEndTime = timeRange.getEnd();
|
||||
if("1".equals(epsNodeBandwidth.getResourceType())){
|
||||
// 重新计算服务器95带宽值
|
||||
epsInitialTrafficDataService.recalculateServer95Bandwidth(epsNodeBandwidth, dailyStartTime, dailyEndTime);
|
||||
}else{
|
||||
// 重新计算交换机95带宽值
|
||||
initialSwitchInfoDetailsService.recalculateSwitch95Bandwidth(epsNodeBandwidth, dailyStartTime, dailyEndTime);
|
||||
}
|
||||
return success();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 相关数据
|
||||
*/
|
||||
@RequiresPermissions("system:bandwidth:query")
|
||||
@GetMapping(value = "relatedData/{id}")
|
||||
public AjaxResult relatedData(@PathVariable("id") Long id)
|
||||
{
|
||||
return success(epsNodeBandwidthService.relatedData(id));
|
||||
}
|
||||
/**
|
||||
* 相关数据-月均日95值
|
||||
* 根据ID获取相关数据
|
||||
* @param id 资源ID
|
||||
* @return 表格数据信息
|
||||
*/
|
||||
@RequiresPermissions("system:bandwidth:query")
|
||||
@GetMapping(value = "getAvgDetailMsg/{id}")
|
||||
public AjaxResult getAvgDetailMsg(@PathVariable("id") Long id)
|
||||
{
|
||||
return success(epsNodeBandwidthService.getAvgDetailMsg(id));
|
||||
public TableDataInfo relatedData(@PathVariable("id") Long id) {
|
||||
// 1. 参数校验
|
||||
if (id == null || id <= 0) {
|
||||
throw new IllegalArgumentException("无效的资源ID");
|
||||
}
|
||||
try {
|
||||
// 2. 查询服务器信息
|
||||
EpsNodeBandwidth epsNodeBandwidth = epsNodeBandwidthService.selectEpsNodeBandwidthById(id);
|
||||
if (epsNodeBandwidth == null) {
|
||||
log.warn("未找到ID为{}的服务器信息", id);
|
||||
throw new NotFoundException("未找到ID为" + id + "的服务器信息");
|
||||
}
|
||||
|
||||
// 3. 获取时间范围
|
||||
String type = CalculateUtil.getTypeByBandwidthType(epsNodeBandwidth.getBandwidthType());
|
||||
DateUtil.TimeRange timeRange = DateUtil.getTimeRange(epsNodeBandwidth.getCreateTime(), type);
|
||||
String dailyStartTime = timeRange.getStart();
|
||||
String dailyEndTime = timeRange.getEnd();
|
||||
|
||||
// 4. 设置分页参数
|
||||
PageDomain pageDomain = new PageDomain();
|
||||
pageDomain.setPageNum(epsNodeBandwidth.getPageNum());
|
||||
pageDomain.setPageSize(epsNodeBandwidth.getPageSize());
|
||||
startPage(pageDomain);
|
||||
|
||||
// 5. 根据资源类型处理不同数据
|
||||
String resourceType = epsNodeBandwidth.getResourceType();
|
||||
String bandwidthType = epsNodeBandwidth.getBandwidthType();
|
||||
|
||||
if ("4".equals(bandwidthType) || "7".equals(bandwidthType)) {
|
||||
// 处理特定带宽类型数据
|
||||
List<EpsNodeBandwidth> nodeBandwidthList = epsNodeBandwidthService.getAvgDetailMsg(id);
|
||||
return getDataTable(nodeBandwidthList);
|
||||
}
|
||||
if ("1".equals(resourceType)) {
|
||||
// 处理服务器流量数据
|
||||
List<EpsInitialTrafficData> trafficList = epsNodeBandwidthService.relatedData(
|
||||
epsNodeBandwidth, dailyStartTime, dailyEndTime);
|
||||
return getDataTable(trafficList);
|
||||
} else{
|
||||
// 处理交换机信息
|
||||
List<InitialSwitchInfoDetails> switchInfoDetails = initialSwitchInfoDetailsService.getRelevantSwitch(
|
||||
epsNodeBandwidth, dailyStartTime, dailyEndTime);
|
||||
return getDataTable(switchInfoDetails);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("获取ID为{}的相关数据失败", id, e);
|
||||
throw new ServiceException("获取数据失败,请稍后重试");
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 生成月均日95值
|
||||
@@ -128,4 +222,89 @@ public class EpsNodeBandwidthController extends BaseController
|
||||
{
|
||||
return toAjax(epsNodeBandwidthService.calculateAvg(epsNodeBandwidth));
|
||||
}
|
||||
|
||||
/**
|
||||
* 图形分析-95带宽值mbps/日
|
||||
*/
|
||||
@RequiresPermissions("system:bandwidth:list")
|
||||
@PostMapping("/graphicalAnalysisDaily")
|
||||
public AjaxResult graphicalAnalysisDaily(@RequestBody EpsNodeBandwidth epsNodeBandwidth)
|
||||
{
|
||||
// 设置时间
|
||||
DateUtil.setTimeDay(epsNodeBandwidth);
|
||||
Map list = epsNodeBandwidthService.graphicalAnalysis(epsNodeBandwidth, "1", ChronoUnit.DAYS);
|
||||
return success(list);
|
||||
}
|
||||
/**
|
||||
* 图形分析-95带宽值mbps/月
|
||||
*/
|
||||
@RequiresPermissions("system:bandwidth:list")
|
||||
@PostMapping("/graphicalAnalysisMonthly")
|
||||
public AjaxResult graphicalAnalysisMonthly(@RequestBody EpsNodeBandwidth epsNodeBandwidth)
|
||||
{
|
||||
// 设置时间
|
||||
DateUtil.setTimeMonth(epsNodeBandwidth);
|
||||
Map list = epsNodeBandwidthService.graphicalAnalysis(epsNodeBandwidth, "2", ChronoUnit.MONTHS);
|
||||
return success(list);
|
||||
}
|
||||
/**
|
||||
* 图形分析-包端带宽值Mbps/日
|
||||
*/
|
||||
@RequiresPermissions("system:bandwidth:list")
|
||||
@PostMapping("/graphicalAnalysisPackage")
|
||||
public AjaxResult graphicalAnalysisPackage(@RequestBody EpsNodeBandwidth epsNodeBandwidth)
|
||||
{
|
||||
// 设置时间
|
||||
DateUtil.setTimeDay(epsNodeBandwidth);
|
||||
Map list = epsNodeBandwidthService.graphicalAnalysis(epsNodeBandwidth, "3", ChronoUnit.DAYS);
|
||||
return success(list);
|
||||
}
|
||||
/**
|
||||
* 图形分析-月均日95值
|
||||
*/
|
||||
@RequiresPermissions("system:bandwidth:list")
|
||||
@PostMapping("/graphicalAnalysisAvgMonthly")
|
||||
public AjaxResult graphicalAnalysisAvgMonthly(@RequestBody EpsNodeBandwidth epsNodeBandwidth)
|
||||
{
|
||||
// 设置时间
|
||||
DateUtil.setTimeMonth(epsNodeBandwidth);
|
||||
Map list = epsNodeBandwidthService.graphicalAnalysis(epsNodeBandwidth, "4", ChronoUnit.MONTHS);
|
||||
return success(list);
|
||||
}
|
||||
/**
|
||||
* 图形分析-有效-95带宽值Mbps/日
|
||||
*/
|
||||
@RequiresPermissions("system:bandwidth:list")
|
||||
@PostMapping("/graphicalAnalysisEffectiveDaily")
|
||||
public AjaxResult graphicalAnalysisEffectiveDaily(@RequestBody EpsNodeBandwidth epsNodeBandwidth)
|
||||
{
|
||||
// 设置时间
|
||||
DateUtil.setTimeDay(epsNodeBandwidth);
|
||||
Map list = epsNodeBandwidthService.graphicalAnalysis(epsNodeBandwidth, "5", ChronoUnit.DAYS);
|
||||
return success(list);
|
||||
}
|
||||
/**
|
||||
* 图形分析-有效-95带宽值Mbps/月
|
||||
*/
|
||||
@RequiresPermissions("system:bandwidth:list")
|
||||
@PostMapping("/graphicalAnalysisEffectiveMonthly")
|
||||
public AjaxResult graphicalAnalysisEffectiveMonthly(@RequestBody EpsNodeBandwidth epsNodeBandwidth)
|
||||
{
|
||||
// 设置时间
|
||||
DateUtil.setTimeMonth(epsNodeBandwidth);
|
||||
Map list = epsNodeBandwidthService.graphicalAnalysis(epsNodeBandwidth, "6", ChronoUnit.MONTHS);
|
||||
return success(list);
|
||||
}
|
||||
/**
|
||||
* 图形分析-有效-月均日95值
|
||||
*/
|
||||
@RequiresPermissions("system:bandwidth:list")
|
||||
@PostMapping("/graphicalAnalysisEffectiveAvgMonthly")
|
||||
public AjaxResult graphicalAnalysisEffectiveAvgMonthly(@RequestBody EpsNodeBandwidth epsNodeBandwidth)
|
||||
{
|
||||
// 设置时间
|
||||
DateUtil.setTimeMonth(epsNodeBandwidth);
|
||||
Map list = epsNodeBandwidthService.graphicalAnalysis(epsNodeBandwidth, "7", ChronoUnit.MONTHS);
|
||||
return success(list);
|
||||
}
|
||||
}
|
||||
|
||||
-12
@@ -29,7 +29,6 @@ public class InitialSwitchInfoDetailsController extends BaseController
|
||||
{
|
||||
@Autowired
|
||||
private IInitialSwitchInfoDetailsService initialSwitchInfoDetailsService;
|
||||
|
||||
/**
|
||||
* 查询交换机监控信息列表
|
||||
*/
|
||||
@@ -106,15 +105,4 @@ public class InitialSwitchInfoDetailsController extends BaseController
|
||||
{
|
||||
return initialSwitchInfoDetailsService.autoSaveSwitchTraffic(initialSwitchInfoDetails);
|
||||
}
|
||||
/**
|
||||
* 获取交换机监控信息详细信息
|
||||
*/
|
||||
@RequiresPermissions("system:switchInfoDetails:query")
|
||||
@GetMapping(value = "recalculateSwitch/{id}")
|
||||
public AjaxResult recalculateSwitch(@PathVariable("id") Long id)
|
||||
{
|
||||
initialSwitchInfoDetailsService.recalculateSwitch95Bandwidth(id);
|
||||
return success();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+6
@@ -58,6 +58,12 @@ public class EpsInitialTrafficData {
|
||||
@Excel(name = "发送带宽(Mbps)")
|
||||
private String outSpeed;
|
||||
|
||||
/** 协商速度 */
|
||||
private String speed;
|
||||
|
||||
/** 工作模式 */
|
||||
private String duplex;
|
||||
|
||||
/** 业务代码 */
|
||||
@Excel(name = "业务代码")
|
||||
private String businessId;
|
||||
|
||||
@@ -7,6 +7,7 @@ import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 节点带宽信息对象 eps_node_bandwidth
|
||||
@@ -126,6 +127,11 @@ public class EpsNodeBandwidth extends BaseEntity
|
||||
private String endTime;
|
||||
/** 月份 */
|
||||
private String monthTime;
|
||||
/** 备注 */
|
||||
private String remark1;
|
||||
|
||||
private List<String> nodeNames;
|
||||
|
||||
private List<String> switchNames;
|
||||
|
||||
}
|
||||
|
||||
+9
@@ -1,6 +1,7 @@
|
||||
package com.ruoyi.system.service;
|
||||
|
||||
import com.ruoyi.system.domain.EpsInitialTrafficData;
|
||||
import com.ruoyi.system.domain.EpsNodeBandwidth;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -46,4 +47,12 @@ public interface EpsInitialTrafficDataService {
|
||||
*/
|
||||
void calculateBusiness95BandwidthDaily(EpsInitialTrafficData queryParam, String dailyStartTime, String dailyEndTime);
|
||||
|
||||
/**
|
||||
* 重新计算服务器95带宽值
|
||||
* @param epsNodeBandwidth 95带宽值收益详情
|
||||
* @param dailyStartTime 开始时间
|
||||
* @param dailyEndTime 结束时间
|
||||
*/
|
||||
void recalculateServer95Bandwidth(EpsNodeBandwidth epsNodeBandwidth, String dailyStartTime, String dailyEndTime);
|
||||
|
||||
}
|
||||
|
||||
+11
-2
@@ -3,7 +3,9 @@ package com.ruoyi.system.service;
|
||||
import com.ruoyi.system.domain.EpsInitialTrafficData;
|
||||
import com.ruoyi.system.domain.EpsNodeBandwidth;
|
||||
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 节点带宽信息Service接口
|
||||
@@ -23,10 +25,10 @@ public interface IEpsNodeBandwidthService
|
||||
|
||||
/**
|
||||
* 相关数据
|
||||
* @param id
|
||||
* @param epsNodeBandwidth
|
||||
* @return
|
||||
*/
|
||||
public List<EpsInitialTrafficData> relatedData(Long id);
|
||||
public List<EpsInitialTrafficData> relatedData(EpsNodeBandwidth epsNodeBandwidth, String dailyStartTime, String dailyEndTime);
|
||||
|
||||
/**
|
||||
* 查询节点带宽信息列表
|
||||
@@ -77,4 +79,11 @@ public interface IEpsNodeBandwidthService
|
||||
public int calculateAvg(EpsNodeBandwidth epsNodeBandwidth);
|
||||
|
||||
List<EpsNodeBandwidth> getAvgDetailMsg(Long id);
|
||||
|
||||
/**
|
||||
* 图形分析
|
||||
* @param epsNodeBandwidth
|
||||
* @return
|
||||
*/
|
||||
Map graphicalAnalysis(EpsNodeBandwidth epsNodeBandwidth, String bandwidthType, ChronoUnit timeUnit);
|
||||
}
|
||||
|
||||
+12
-2
@@ -1,6 +1,7 @@
|
||||
package com.ruoyi.system.service;
|
||||
|
||||
import com.ruoyi.common.core.domain.R;
|
||||
import com.ruoyi.system.domain.EpsNodeBandwidth;
|
||||
import com.ruoyi.system.domain.InitialSwitchInfoDetails;
|
||||
|
||||
import java.util.List;
|
||||
@@ -75,7 +76,16 @@ public interface IInitialSwitchInfoDetailsService
|
||||
|
||||
/**
|
||||
* 重新计算交换机95带宽值
|
||||
* @param id
|
||||
* @param epsNodeBandwidth 95带宽值收益详情
|
||||
* @param dailyStartTime 开始时间
|
||||
* @param dailyEndTime 结束时间
|
||||
*/
|
||||
void recalculateSwitch95Bandwidth(Long id);
|
||||
void recalculateSwitch95Bandwidth(EpsNodeBandwidth epsNodeBandwidth, String dailyStartTime, String dailyEndTime);
|
||||
|
||||
/**
|
||||
* 获取交换机相关数据
|
||||
* @param epsNodeBandwidth
|
||||
* @return
|
||||
*/
|
||||
List<InitialSwitchInfoDetails> getRelevantSwitch(EpsNodeBandwidth epsNodeBandwidth, String dailyStartTime, String dailyEndTime);
|
||||
}
|
||||
|
||||
+55
-10
@@ -206,6 +206,41 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
|
||||
processDeviceBandwidth(queryParam, dailyStartTime, dailyEndTime);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 重新计算服务器95带宽值
|
||||
* @param epsNodeBandwidth 95带宽值收益详情
|
||||
* @param dailyStartTime 开始时间
|
||||
* @param dailyEndTime 结束时间
|
||||
*/
|
||||
@Override
|
||||
public void recalculateServer95Bandwidth(EpsNodeBandwidth epsNodeBandwidth, String dailyStartTime, String dailyEndTime) {
|
||||
EpsInitialTrafficData epsInitialTrafficData = new EpsInitialTrafficData();
|
||||
epsInitialTrafficData.setStartTime(dailyStartTime);
|
||||
epsInitialTrafficData.setEndTime(dailyEndTime);
|
||||
epsInitialTrafficData.setServiceSn(epsNodeBandwidth.getHardwareSn());
|
||||
epsInitialTrafficData.setNodeName(epsNodeBandwidth.getNodeName());
|
||||
epsInitialTrafficData.setBusinessName(epsNodeBandwidth.getBusinessName());
|
||||
epsInitialTrafficData.setBusinessId(epsNodeBandwidth.getBusinessId());
|
||||
List<EpsInitialTrafficData> dataList = query(epsInitialTrafficData);
|
||||
if(!dataList.isEmpty()){
|
||||
// 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 initialTrafficData = dataList.get(0);
|
||||
initialTrafficData.setResourceType("1");
|
||||
initialTrafficData.setBandwidthType(epsNodeBandwidth.getBandwidthType());
|
||||
saveBandwidthResult(initialTrafficData, percentile95, dailyStartTime);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理单个设备的带宽计算
|
||||
*/
|
||||
@@ -285,11 +320,16 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
|
||||
// 3. 保存结果
|
||||
EpsInitialTrafficData epsInitialTrafficData = dataList.get(0);
|
||||
epsInitialTrafficData.setResourceType("1");
|
||||
if("1".equals(dayOrMonth)){
|
||||
epsInitialTrafficData.setBandwidthType("1");
|
||||
}
|
||||
if("2".equals(dayOrMonth)){
|
||||
epsInitialTrafficData.setBandwidthType("2");
|
||||
if("2".equals(epsInitialTrafficData.getRevenueMethod())){
|
||||
percentile95 = epsInitialTrafficData.getPackageBandwidth();
|
||||
epsInitialTrafficData.setBandwidthType("3");
|
||||
}else {
|
||||
if("1".equals(dayOrMonth)){
|
||||
epsInitialTrafficData.setBandwidthType("1");
|
||||
}
|
||||
if("2".equals(dayOrMonth)){
|
||||
epsInitialTrafficData.setBandwidthType("2");
|
||||
}
|
||||
}
|
||||
saveBandwidthResult(epsInitialTrafficData, percentile95, dateTime);
|
||||
}
|
||||
@@ -356,11 +396,16 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
|
||||
// 服务器信息
|
||||
EpsInitialTrafficData epsInitialTrafficData = dataList.get(0);
|
||||
epsInitialTrafficData.setResourceType("1");
|
||||
if("1".equals(dayOrMonth)){
|
||||
epsInitialTrafficData.setBandwidthType("5");
|
||||
}
|
||||
if("2".equals(dayOrMonth)){
|
||||
epsInitialTrafficData.setBandwidthType("6");
|
||||
if("2".equals(epsInitialTrafficData.getRevenueMethod())){
|
||||
dailyResult = epsInitialTrafficData.getPackageBandwidth();
|
||||
epsInitialTrafficData.setBandwidthType("3");
|
||||
}else{
|
||||
if("1".equals(dayOrMonth)){
|
||||
epsInitialTrafficData.setBandwidthType("5");
|
||||
}
|
||||
if("2".equals(dayOrMonth)){
|
||||
epsInitialTrafficData.setBandwidthType("6");
|
||||
}
|
||||
}
|
||||
saveBandwidthResult(epsInitialTrafficData, dailyResult, startTime);
|
||||
}
|
||||
|
||||
+75
-43
@@ -8,7 +8,7 @@ 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 com.ruoyi.system.util.EchartsDataConverter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -18,12 +18,10 @@ import org.webjars.NotFoundException;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
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;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 节点带宽信息Service业务层处理
|
||||
@@ -57,26 +55,18 @@ public class EpsNodeBandwidthServiceImpl implements IEpsNodeBandwidthService
|
||||
/**
|
||||
* 查询节点带宽信息
|
||||
*
|
||||
* @param id 节点带宽信息主键
|
||||
* @param epsNodeBandwidth 节点带宽信息
|
||||
* @return 节点带宽信息
|
||||
*/
|
||||
@Override
|
||||
public List<EpsInitialTrafficData> relatedData(Long id) {
|
||||
// 1. 根据ID查询服务器信息
|
||||
EpsNodeBandwidth epsNodeBandwidth = epsNodeBandwidthMapper.selectEpsNodeBandwidthById(id);
|
||||
if (epsNodeBandwidth == null) {
|
||||
throw new NotFoundException("未找到ID为" + id + "的服务器信息");
|
||||
}
|
||||
|
||||
// 2. 设置查询条件
|
||||
public List<EpsInitialTrafficData> relatedData(EpsNodeBandwidth epsNodeBandwidth,String dailyStartTime, String dailyEndTime) {
|
||||
// 设置查询条件
|
||||
EpsInitialTrafficData queryParams = new EpsInitialTrafficData();
|
||||
queryParams.setServiceSn(epsNodeBandwidth.getHardwareSn());
|
||||
|
||||
// 3. 根据带宽类型设置时间范围
|
||||
LocalDateTime createTime = DateUtil.dateToLocalDateTime(epsNodeBandwidth.getCreateTime());
|
||||
setTimeRangeByBandwidthType(queryParams, epsNodeBandwidth.getBandwidthType(), createTime);
|
||||
|
||||
// 4. 查询并返回数据
|
||||
queryParams.setBusinessId(epsNodeBandwidth.getBusinessId());
|
||||
queryParams.setStartTime(dailyStartTime);
|
||||
queryParams.setEndTime(dailyEndTime);
|
||||
// 查询并返回数据
|
||||
return epsInitialTrafficDataService.query(queryParams);
|
||||
}
|
||||
/**
|
||||
@@ -262,30 +252,72 @@ public class EpsNodeBandwidthServiceImpl implements IEpsNodeBandwidthService
|
||||
}
|
||||
return epsNodeBandwidthMapper.getAvgDetailMsg(epsNodeBandwidth);
|
||||
}
|
||||
@Override
|
||||
public Map graphicalAnalysis(EpsNodeBandwidth epsNodeBandwidth, String bandwidthType, ChronoUnit timeUnit){
|
||||
Map<String, Object> nodeData = new HashMap<>();
|
||||
// 拿到列表
|
||||
List<EpsNodeBandwidth> nodeBandwidthList = epsNodeBandwidthMapper.selectEpsNodeBandwidthList(epsNodeBandwidth);
|
||||
Map<String, EpsNodeBandwidth> uniqueNodes = nodeBandwidthList.stream()
|
||||
.collect(Collectors.toMap(
|
||||
// Key生成策略:根据条件动态构建复合键
|
||||
item -> generateCompositeKey(item),
|
||||
// Value转换:创建简化对象
|
||||
item -> createSimplifiedNode(item),
|
||||
// 合并策略:保留第一个出现的记录
|
||||
(existing, replacement) -> existing
|
||||
));
|
||||
uniqueNodes.values().forEach(node -> {
|
||||
|
||||
/**
|
||||
* 根据带宽类型设置时间范围(修复T分隔符问题)
|
||||
*/
|
||||
private void setTimeRangeByBandwidthType(EpsInitialTrafficData data, String bandwidthType, LocalDateTime baseTime) {
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
// 基础信息
|
||||
nodeData.put("nodeName", node.getNodeName());
|
||||
nodeData.put("businessName", node.getBusinessName());
|
||||
nodeData.put("switchName", node.getUplinkSwitch());
|
||||
nodeData.put("interfaceName", node.getInterfaceName());
|
||||
|
||||
switch (bandwidthType) {
|
||||
case "1":
|
||||
case "3":
|
||||
case "5": // 日带宽
|
||||
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().format(formatter)); // 当月第一天 00:00:00
|
||||
data.setEndTime(month.atEndOfMonth().atTime(23, 59, 59).format(formatter)); // 当月最后一天 23:59:59
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("不支持的带宽类型: " + bandwidthType);
|
||||
// 日带宽数据
|
||||
nodeData.put("resultData", EchartsDataConverter.convertToLineChart(
|
||||
nodeBandwidthList,
|
||||
bandwidthType,
|
||||
node.getBusinessName(),
|
||||
epsNodeBandwidth.getStartTime(),
|
||||
epsNodeBandwidth.getEndTime(),
|
||||
timeUnit
|
||||
));
|
||||
});
|
||||
return nodeData;
|
||||
}
|
||||
|
||||
// 动态生成复合键
|
||||
private String generateCompositeKey(EpsNodeBandwidth item) {
|
||||
if ("2".equals(item.getResourceType()) && "2".equals(item.getInterfaceLinkDeviceType())) {
|
||||
// 特殊条件:忽略nodeName和businessName
|
||||
return String.join("|",
|
||||
item.getInterfaceName(),
|
||||
item.getUplinkSwitch()
|
||||
);
|
||||
} else {
|
||||
// 默认情况:使用完整字段
|
||||
return String.join("|",
|
||||
Objects.toString(item.getNodeName(), ""),
|
||||
Objects.toString(item.getBusinessName(), ""),
|
||||
item.getInterfaceName(),
|
||||
item.getUplinkSwitch()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// 创建简化节点对象
|
||||
private EpsNodeBandwidth createSimplifiedNode(EpsNodeBandwidth source) {
|
||||
EpsNodeBandwidth simplified = new EpsNodeBandwidth();
|
||||
simplified.setInterfaceName(source.getInterfaceName());
|
||||
simplified.setUplinkSwitch(source.getUplinkSwitch());
|
||||
|
||||
// 仅当非特殊条件时复制这些字段
|
||||
if (!("2".equals(source.getResourceType()) && "2".equals(source.getInterfaceLinkDeviceType()))) {
|
||||
simplified.setNodeName(source.getNodeName());
|
||||
simplified.setBusinessName(source.getBusinessName());
|
||||
}
|
||||
|
||||
return simplified;
|
||||
}
|
||||
}
|
||||
|
||||
+8
@@ -17,6 +17,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -183,6 +184,13 @@ public class EpsServerRevenueConfigServiceImpl implements IEpsServerRevenueConfi
|
||||
initialTrafficData.setRevenueMethod(nodeMsg.get("revenueMethod") + "");
|
||||
initialTrafficData.setBusinessId(nodeMsg.get("businessCode") + "");
|
||||
initialTrafficData.setBusinessName(nodeMsg.get("businessName") + "");
|
||||
if("2".equals(String.valueOf(nodeMsg.get("revenueMethod")))
|
||||
&& nodeMsg.containsKey("packageBandwidth")){
|
||||
Object bandwidth = nodeMsg.get("packageBandwidth");
|
||||
if (bandwidth instanceof BigDecimal) {
|
||||
initialTrafficData.setPackageBandwidth((BigDecimal) bandwidth);
|
||||
}
|
||||
}
|
||||
}
|
||||
// id自增
|
||||
initialTrafficData.setId(null);
|
||||
|
||||
+52
-40
@@ -13,9 +13,6 @@ import org.springframework.stereotype.Service;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.LocalTime;
|
||||
import java.time.ZoneId;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
@@ -284,24 +281,12 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
|
||||
|
||||
/**
|
||||
* 重新计算交换机95带宽值
|
||||
* @param id
|
||||
* @param epsNodeBandwidth 95带宽值收益详情
|
||||
* @param dailyStartTime 开始时间
|
||||
* @param dailyEndTime 结束时间
|
||||
*/
|
||||
@Override
|
||||
public void recalculateSwitch95Bandwidth(Long id) {
|
||||
// 获取需要重新计算的信息
|
||||
EpsNodeBandwidth epsNodeBandwidth = epsNodeBandwidthMapper.selectEpsNodeBandwidthById(id);
|
||||
// 将Date转换为LocalDateTime
|
||||
LocalDateTime createDateTime = epsNodeBandwidth.getCreateTime().toInstant()
|
||||
.atZone(ZoneId.systemDefault())
|
||||
.toLocalDateTime();
|
||||
// 获取当天的开始时间(00:00:00)
|
||||
String dailyStartTime = createDateTime.with(LocalTime.MIN)
|
||||
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
||||
|
||||
// 获取当天的结束时间(23:59:59)
|
||||
String dailyEndTime = createDateTime.with(LocalTime.MAX)
|
||||
.withNano(0) // 去除纳秒部分
|
||||
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
||||
public void recalculateSwitch95Bandwidth(EpsNodeBandwidth epsNodeBandwidth, String dailyStartTime, String dailyEndTime) {
|
||||
InitialSwitchInfoDetails switchInfoDetails = new InitialSwitchInfoDetails();
|
||||
switchInfoDetails.setStartTime(dailyStartTime);
|
||||
switchInfoDetails.setEndTime(dailyEndTime);
|
||||
@@ -314,31 +299,58 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
|
||||
switchInfoDetails.setBusinessName(epsNodeBandwidth.getBusinessName());
|
||||
List<InitialSwitchInfoDetails> dataList = initialSwitchInfoDetailsMapper
|
||||
.selectInitialSwitchInfoDetailsList(switchInfoDetails);
|
||||
// 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());
|
||||
if(!dataList.isEmpty()){
|
||||
// 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);
|
||||
// 2. 计算95百分位
|
||||
BigDecimal percentile95 = CalculateUtil.calculatePercentile(speedsInMbps, 0.95);
|
||||
|
||||
// 3. 保存结果
|
||||
InitialSwitchInfoDetails switchInfo = dataList.get(0);
|
||||
switchInfo.setResourceType("2");
|
||||
switchInfo.setBandwidthType(epsNodeBandwidth.getBandwidthType());
|
||||
saveSwitchBandwidthResult(switchInfo, percentile95, dailyStartTime);
|
||||
// 3. 保存结果
|
||||
InitialSwitchInfoDetails switchInfo = dataList.get(0);
|
||||
switchInfo.setResourceType("2");
|
||||
switchInfo.setBandwidthType(epsNodeBandwidth.getBandwidthType());
|
||||
saveSwitchBandwidthResult(switchInfo, percentile95, dailyStartTime);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 交换机相关数据
|
||||
* @param epsNodeBandwidth
|
||||
* @param dailyStartTime
|
||||
* @param dailyEndTime
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<InitialSwitchInfoDetails> getRelevantSwitch(EpsNodeBandwidth epsNodeBandwidth, String dailyStartTime, String dailyEndTime) {
|
||||
InitialSwitchInfoDetails switchInfoDetails = new InitialSwitchInfoDetails();
|
||||
switchInfoDetails.setStartTime(dailyStartTime);
|
||||
switchInfoDetails.setEndTime(dailyEndTime);
|
||||
switchInfoDetails.setSwitchSn(epsNodeBandwidth.getSwitchSn());
|
||||
switchInfoDetails.setSwitchName(epsNodeBandwidth.getUplinkSwitch());
|
||||
switchInfoDetails.setServerSn(epsNodeBandwidth.getHardwareSn());
|
||||
switchInfoDetails.setInterfaceDeviceType(epsNodeBandwidth.getInterfaceLinkDeviceType());
|
||||
switchInfoDetails.setName(epsNodeBandwidth.getInterfaceName());
|
||||
switchInfoDetails.setBusinessCode(epsNodeBandwidth.getBusinessId());
|
||||
switchInfoDetails.setBusinessName(epsNodeBandwidth.getBusinessName());
|
||||
List<InitialSwitchInfoDetails> dataList = initialSwitchInfoDetailsMapper
|
||||
.selectInitialSwitchInfoDetailsList(switchInfoDetails);
|
||||
return dataList;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 处理单个交换机的带宽计算
|
||||
*/
|
||||
|
||||
@@ -68,4 +68,23 @@ public class CalculateUtil {
|
||||
position = Math.max(0, Math.min(position, total - 1));
|
||||
return sortedValues.get(position).setScale(2, RoundingMode.HALF_UP);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据带宽类型设置时间范围(修复T分隔符问题)
|
||||
*/
|
||||
public static String getTypeByBandwidthType(String bandwidthType) {
|
||||
switch (bandwidthType) {
|
||||
case "1":
|
||||
case "3":
|
||||
case "5": // 日带宽
|
||||
return "1";
|
||||
case "2":
|
||||
case "4":
|
||||
case "6":
|
||||
case "7": // 月带宽
|
||||
return "2";
|
||||
default:
|
||||
throw new IllegalArgumentException("不支持的带宽类型: " + bandwidthType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,58 @@
|
||||
package com.ruoyi.system.util;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
import com.ruoyi.common.core.utils.DateUtils;
|
||||
import com.ruoyi.system.domain.EpsNodeBandwidth;
|
||||
|
||||
import java.time.*;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.temporal.TemporalAdjusters;
|
||||
import java.util.Date;
|
||||
|
||||
public class DateUtil {
|
||||
private static final DateTimeFormatter FORMATTER =
|
||||
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
private static final ZoneId ZONE = ZoneId.of("Asia/Shanghai");
|
||||
|
||||
public static class TimeRange {
|
||||
private String start;
|
||||
private String end;
|
||||
|
||||
// 构造器
|
||||
public TimeRange(String start, String end) {
|
||||
this.start = start;
|
||||
this.end = end;
|
||||
}
|
||||
|
||||
// Getter
|
||||
public String getStart() { return start; }
|
||||
public String getEnd() { return end; }
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当天/当月日期
|
||||
* @param createTime
|
||||
* @param type
|
||||
* @return
|
||||
*/
|
||||
public static TimeRange getTimeRange(Date createTime, String type) {
|
||||
LocalDateTime baseTime = createTime.toInstant()
|
||||
.atZone(ZoneId.systemDefault())
|
||||
.toLocalDateTime();
|
||||
|
||||
if ("1".equals(type)) {
|
||||
return new TimeRange(
|
||||
baseTime.with(LocalTime.MIN).format(FORMATTER),
|
||||
baseTime.with(LocalTime.MAX).withNano(0).format(FORMATTER)
|
||||
);
|
||||
} else {
|
||||
YearMonth month = YearMonth.from(baseTime);
|
||||
return new TimeRange(
|
||||
month.atDay(1).atStartOfDay().format(FORMATTER),
|
||||
month.atEndOfMonth().atTime(23, 59, 59).format(FORMATTER)
|
||||
);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Date 类型 转为 LocalDateTime 类型
|
||||
* @param date
|
||||
@@ -16,4 +63,50 @@ public class DateUtil {
|
||||
.atZone(ZoneId.systemDefault())
|
||||
.toLocalDateTime();
|
||||
}
|
||||
public static void setTimeDay(EpsNodeBandwidth epsNodeBandwidth){
|
||||
if(epsNodeBandwidth.getStartTime() == null || epsNodeBandwidth.getEndTime() == null) {
|
||||
// 获取这个月第一天
|
||||
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(FORMATTER);
|
||||
String monthlyEndTime = lastDayOfMonth.atTime(23, 59, 59).format(FORMATTER);
|
||||
epsNodeBandwidth.setStartTime(monthlyStartTime);
|
||||
epsNodeBandwidth.setEndTime(monthlyEndTime);
|
||||
}
|
||||
// 获取时间类型 1--日, 2--月
|
||||
String type = "1";
|
||||
processTime(epsNodeBandwidth, type);
|
||||
}
|
||||
public static void setTimeMonth(EpsNodeBandwidth epsNodeBandwidth){
|
||||
if(epsNodeBandwidth.getStartTime() == null || epsNodeBandwidth.getEndTime() == null) {
|
||||
// 获取今年第一个月第一天
|
||||
// 当年1月1日 00:00:00
|
||||
LocalDateTime startOfYear = LocalDate.now(ZONE)
|
||||
.withMonth(1)
|
||||
.withDayOfMonth(1)
|
||||
.atStartOfDay();
|
||||
|
||||
// 上个月最后一天 23:59:59
|
||||
LocalDateTime endOfLastMonth = LocalDate.now(ZONE)
|
||||
.minusMonths(1)
|
||||
.with(TemporalAdjusters.lastDayOfMonth())
|
||||
.atTime(23, 59, 59);
|
||||
epsNodeBandwidth.setStartTime(startOfYear.format(FORMATTER));
|
||||
epsNodeBandwidth.setEndTime(endOfLastMonth.format(FORMATTER));
|
||||
}
|
||||
// 获取时间类型 1--日, 2--月
|
||||
String type = "2";
|
||||
processTime(epsNodeBandwidth, type);
|
||||
}
|
||||
|
||||
public static void processTime(EpsNodeBandwidth epsNodeBandwidth, String type){
|
||||
// 获取开始时间 结束时间
|
||||
DateUtil.TimeRange startTimeRange = DateUtil.getTimeRange(DateUtils.parseDate(epsNodeBandwidth.getStartTime()),type);
|
||||
DateUtil.TimeRange endTimeRange = DateUtil.getTimeRange(DateUtils.parseDate(epsNodeBandwidth.getEndTime()),type);
|
||||
String startTime = startTimeRange.getStart();
|
||||
String endTime = endTimeRange.getEnd();
|
||||
epsNodeBandwidth.setStartTime(startTime);
|
||||
epsNodeBandwidth.setEndTime(endTime);
|
||||
}
|
||||
}
|
||||
|
||||
+104
@@ -0,0 +1,104 @@
|
||||
package com.ruoyi.system.util;
|
||||
|
||||
import com.ruoyi.common.core.utils.DateUtils;
|
||||
import com.ruoyi.system.domain.EpsNodeBandwidth;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class EchartsDataConverter {
|
||||
|
||||
/**
|
||||
* 转换为ECharts折线图数据
|
||||
* @param dataList 原始数据列表
|
||||
* @return { lineXData: [], data: [] }
|
||||
*/
|
||||
public static Map<String, Object> convertToLineChart(
|
||||
List<EpsNodeBandwidth> dataList,
|
||||
String bandwidthType, String businessName, String startTime, String endTime, ChronoUnit timeUnit
|
||||
) {
|
||||
// 定义时间格式化器
|
||||
SimpleDateFormat sdf = new SimpleDateFormat(
|
||||
timeUnit == ChronoUnit.DAYS ? "yyyy-MM-dd" : "yyyy-MM"
|
||||
);
|
||||
// 2. 生成完整时间序列
|
||||
List<Date> fullSeries = generateTimeSeries(DateUtils.parseDate(startTime), DateUtils.parseDate(endTime), timeUnit);
|
||||
// 过滤+排序
|
||||
List<EpsNodeBandwidth> validList = dataList.stream()
|
||||
.filter(item ->
|
||||
item.getCreateTime() != null &&
|
||||
item.getBandwidthResult() != null &&
|
||||
(bandwidthType == null || bandwidthType.equals(item.getBandwidthType())) &&
|
||||
(businessName == null || businessName.equals(item.getBusinessName()))
|
||||
)
|
||||
.sorted(Comparator.comparing(EpsNodeBandwidth::getCreateTime))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 3. 创建数据映射
|
||||
Map<Date, BigDecimal> dataMap = createDataMap(validList);
|
||||
// 4. 补全数据
|
||||
List<String> xData = new ArrayList<>();
|
||||
List<BigDecimal> yData = new ArrayList<>();
|
||||
|
||||
for (Date time : fullSeries) {
|
||||
xData.add(sdf.format(time));
|
||||
yData.add(dataMap.getOrDefault(time, BigDecimal.ZERO));
|
||||
}
|
||||
Map map = new HashMap();
|
||||
map.put("lineXData", xData);
|
||||
map.put("data", yData);
|
||||
return map;
|
||||
}
|
||||
private static List<Date> generateTimeSeries(Date start, Date end, ChronoUnit unit) {
|
||||
List<Date> series = new ArrayList<>();
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.setTime(start);
|
||||
|
||||
// 重置到时间单位起始点
|
||||
switch (unit) {
|
||||
case DAYS:
|
||||
cal.set(Calendar.HOUR_OF_DAY, 0);
|
||||
cal.set(Calendar.MINUTE, 0);
|
||||
cal.set(Calendar.SECOND, 0);
|
||||
cal.set(Calendar.MILLISECOND, 0);
|
||||
break;
|
||||
case MONTHS:
|
||||
cal.set(Calendar.DAY_OF_MONTH, 1);
|
||||
cal.set(Calendar.HOUR_OF_DAY, 0);
|
||||
cal.set(Calendar.MINUTE, 0);
|
||||
cal.set(Calendar.SECOND, 0);
|
||||
cal.set(Calendar.MILLISECOND, 0);
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("仅支持 DAYS 或 MONTHS 单位");
|
||||
}
|
||||
|
||||
|
||||
// 生成序列
|
||||
while (!cal.getTime().after(end)) {
|
||||
series.add(cal.getTime());
|
||||
|
||||
switch (unit) {
|
||||
case DAYS:
|
||||
cal.add(Calendar.DATE, 1); // 按天递增
|
||||
break;
|
||||
case MONTHS:
|
||||
cal.add(Calendar.MONTH, 1); // 按月递增
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return series;
|
||||
}
|
||||
private static Map<Date, BigDecimal> createDataMap(List<EpsNodeBandwidth> dataList) {
|
||||
return dataList.stream()
|
||||
.collect(Collectors.toMap(
|
||||
EpsNodeBandwidth::getCreateTime,
|
||||
EpsNodeBandwidth::getBandwidthResult,
|
||||
(v1, v2) -> v1 // 如果参数冲突 保留有值的 补充x轴
|
||||
));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user