diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/SpeedUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/SpeedUtils.java index bedb8c1..4182921 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/SpeedUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/SpeedUtils.java @@ -95,8 +95,8 @@ public class SpeedUtils { totalOutSpeedBit = totalOutSpeedBit.add(outSpeedBit); // 转换为Gb并更新最大值 - BigDecimal inSpeedGb = inSpeedBit.divide(GB_DIVISOR, 10, RoundingMode.HALF_UP); - BigDecimal outSpeedGb = outSpeedBit.divide(GB_DIVISOR, 10, RoundingMode.HALF_UP); + BigDecimal inSpeedGb = inSpeedBit.divide(GB_DIVISOR, 0, RoundingMode.HALF_UP); + BigDecimal outSpeedGb = outSpeedBit.divide(GB_DIVISOR, 0, RoundingMode.HALF_UP); maxInSpeedGb = maxInSpeedGb.max(inSpeedGb); maxOutSpeedGb = maxOutSpeedGb.max(outSpeedGb); @@ -111,9 +111,9 @@ public class SpeedUtils { // 计算Gb平均值 BigDecimal size = new BigDecimal(list.size()); - BigDecimal avgInSpeedGb = totalInSpeedBit.divide(GB_DIVISOR, 10, RoundingMode.HALF_UP) + BigDecimal avgInSpeedGb = totalInSpeedBit.divide(GB_DIVISOR, 0, RoundingMode.HALF_UP) .divide(size, 2, RoundingMode.HALF_UP); - BigDecimal avgOutSpeedGb = totalOutSpeedBit.divide(GB_DIVISOR, 10, RoundingMode.HALF_UP) + BigDecimal avgOutSpeedGb = totalOutSpeedBit.divide(GB_DIVISOR, 0, RoundingMode.HALF_UP) .divide(size, 2, RoundingMode.HALF_UP); // 基于平均值的较大值确定推荐单位 @@ -201,6 +201,177 @@ public class SpeedUtils { recommendedUnit = "Kb"; } + return recommendedUnit; + } + /** + * 计算String类型(存储数字)的速度统计结果 + * @param list 数据列表 + * @param inSpeedField 输入速度字段名 + * @param outSpeedField 输出速度字段名 + * @return SpeedResult 速度统计结果 + */ + public static SpeedResult calculateWithStringTraffic(List list, + String inSpeedField, String outSpeedField) + throws NoSuchFieldException, IllegalAccessException { + + if (list == null || list.isEmpty()) { + return new SpeedResult( + BigDecimal.ZERO, BigDecimal.ZERO, + BigDecimal.ZERO, BigDecimal.ZERO, + BigDecimal.ZERO, BigDecimal.ZERO, + "bit" + ); + } + + BigDecimal totalInSpeedBit = BigDecimal.ZERO; + BigDecimal totalOutSpeedBit = BigDecimal.ZERO; + BigDecimal maxInSpeedGb = BigDecimal.ZERO; + BigDecimal maxOutSpeedGb = BigDecimal.ZERO; + BigDecimal lastInSpeedGb = BigDecimal.ZERO; + BigDecimal lastOutSpeedGb = BigDecimal.ZERO; + + final BigDecimal GB_DIVISOR = new BigDecimal("1000000000"); + + // 计算总和(bit)和Gb值 + for (Object obj : list) { + try { + java.lang.reflect.Field inField = obj.getClass().getDeclaredField(inSpeedField); + java.lang.reflect.Field outField = obj.getClass().getDeclaredField(outSpeedField); + + inField.setAccessible(true); + outField.setAccessible(true); + + // 处理String类型的数字值 + String inSpeedStr = (String) inField.get(obj); + String outSpeedStr = (String) outField.get(obj); + + BigDecimal inSpeedBit = convertStringToBigDecimal(inSpeedStr); + BigDecimal outSpeedBit = convertStringToBigDecimal(outSpeedStr); + + // 累加bit值(用于计算平均值) + totalInSpeedBit = totalInSpeedBit.add(inSpeedBit); + totalOutSpeedBit = totalOutSpeedBit.add(outSpeedBit); + + // 转换为Gb并更新最大值 + BigDecimal inSpeedGb = inSpeedBit.divide(GB_DIVISOR, 2, RoundingMode.HALF_UP); + BigDecimal outSpeedGb = outSpeedBit.divide(GB_DIVISOR, 2, RoundingMode.HALF_UP); + + maxInSpeedGb = maxInSpeedGb.max(inSpeedGb); + maxOutSpeedGb = maxOutSpeedGb.max(outSpeedGb); + + // 记录最后一个值 + lastInSpeedGb = inSpeedGb; + lastOutSpeedGb = outSpeedGb; + } catch (Exception e) { + throw new RuntimeException("无法获取或转换速度字段值", e); + } + } + + // 计算Gb平均值 + BigDecimal size = new BigDecimal(list.size()); + BigDecimal avgInSpeedGb = totalInSpeedBit.divide(GB_DIVISOR, 2, RoundingMode.HALF_UP) + .divide(size, 2, RoundingMode.HALF_UP); + BigDecimal avgOutSpeedGb = totalOutSpeedBit.divide(GB_DIVISOR, 2, RoundingMode.HALF_UP) + .divide(size, 2, RoundingMode.HALF_UP); + + // 基于平均值的较大值确定推荐单位 + BigDecimal maxAvgBit = avgInSpeedGb.compareTo(avgOutSpeedGb) > 0 ? + avgInSpeedGb.multiply(GB_DIVISOR) : + avgOutSpeedGb.multiply(GB_DIVISOR); + + String recommendedUnit; + if (maxAvgBit.compareTo(new BigDecimal("1000000000")) >= 0) { + recommendedUnit = "Gb"; + } else if (maxAvgBit.compareTo(new BigDecimal("1000000")) >= 0) { + recommendedUnit = "Mb"; + } else { + recommendedUnit = "Kb"; + } + + return new SpeedResult( + avgInSpeedGb, avgOutSpeedGb, + maxInSpeedGb, maxOutSpeedGb, + lastInSpeedGb, lastOutSpeedGb, + recommendedUnit + ); + } + + /** + * 将String类型的数字转换为BigDecimal + * @param numberStr 数字字符串 + * @return BigDecimal值,转换失败返回0 + */ + private static BigDecimal convertStringToBigDecimal(String numberStr) { + if (numberStr == null || numberStr.trim().isEmpty()) { + return BigDecimal.ZERO; + } + + try { + return new BigDecimal(numberStr.trim()); + } catch (Exception e) { + return BigDecimal.ZERO; + } + } + + /** + * 仅计算String类型(存储数字)的推荐单位 + * @param list 数据列表 + * @param inSpeedField 输入速度字段名 + * @param outSpeedField 输出速度字段名 + * @return 推荐单位 + */ + public static String calculateUnitWithStringTraffic(List list, + String inSpeedField, String outSpeedField) + throws NoSuchFieldException, IllegalAccessException { + + if (list == null || list.isEmpty()) { + return null; + } + + BigDecimal totalInSpeedBit = BigDecimal.ZERO; + BigDecimal totalOutSpeedBit = BigDecimal.ZERO; + + // 计算总和(bit) + for (Object obj : list) { + try { + java.lang.reflect.Field inField = obj.getClass().getDeclaredField(inSpeedField); + java.lang.reflect.Field outField = obj.getClass().getDeclaredField(outSpeedField); + + inField.setAccessible(true); + outField.setAccessible(true); + + // 处理String类型的数字值 + String inSpeedStr = (String) inField.get(obj); + String outSpeedStr = (String) outField.get(obj); + + BigDecimal inSpeedBit = convertStringToBigDecimal(inSpeedStr); + BigDecimal outSpeedBit = convertStringToBigDecimal(outSpeedStr); + + totalInSpeedBit = totalInSpeedBit.add(inSpeedBit); + totalOutSpeedBit = totalOutSpeedBit.add(outSpeedBit); + } catch (Exception e) { + throw new RuntimeException("无法获取或转换速度字段值", e); + } + } + + // 计算平均值 + BigDecimal size = new BigDecimal(list.size()); + BigDecimal avgInSpeedBit = totalInSpeedBit.divide(size, 2, RoundingMode.HALF_UP); + BigDecimal avgOutSpeedBit = totalOutSpeedBit.divide(size, 2, RoundingMode.HALF_UP); + + // 基于平均值的较大值确定推荐单位 + BigDecimal maxAvgBit = avgInSpeedBit.compareTo(avgOutSpeedBit) > 0 ? + avgInSpeedBit : avgOutSpeedBit; + + String recommendedUnit; + if (maxAvgBit.compareTo(new BigDecimal("1000000000")) >= 0) { + recommendedUnit = "Gb"; + } else if (maxAvgBit.compareTo(new BigDecimal("1000000")) >= 0) { + recommendedUnit = "Mb"; + } else { + recommendedUnit = "Kb"; + } + return recommendedUnit; } } \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/EpsTaskStatisticsController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/EpsTaskStatisticsController.java new file mode 100644 index 0000000..7f66590 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/EpsTaskStatisticsController.java @@ -0,0 +1,147 @@ +package com.ruoyi.system.controller; + +import com.github.pagehelper.PageInfo; +import com.ruoyi.common.core.utils.poi.ExcelUtil; +import com.ruoyi.common.core.web.controller.BaseController; +import com.ruoyi.common.core.web.domain.AjaxResult; +import com.ruoyi.common.core.web.page.PageDomain; +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.EpsTaskStatistics; +import com.ruoyi.system.service.IEpsTaskStatisticsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 业务95值计算任务Controller + * + * @author gyt + * @date 2025-10-29 + */ +@RestController +@RequestMapping("/taskStatistics") +public class EpsTaskStatisticsController extends BaseController +{ + @Autowired + private IEpsTaskStatisticsService epsTaskStatisticsService; + + /** + * 查询业务95值计算任务列表 + */ + @RequiresPermissions("system:taskStatistics:list") + @PostMapping("/list") + public TableDataInfo list(@RequestBody EpsTaskStatistics epsTaskStatistics) + { + PageDomain pageDomain = new PageDomain(); + pageDomain.setPageNum(epsTaskStatistics.getPageNum()); + pageDomain.setPageSize(epsTaskStatistics.getPageSize()); + startPage(pageDomain); + List list = epsTaskStatisticsService.selectEpsTaskStatisticsList(epsTaskStatistics); + return getDataTable(list); + } + + /** + * 导出业务95值计算任务列表 + */ + @RequiresPermissions("system:taskStatistics:export") + @Log(title = "业务95值计算任务", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, EpsTaskStatistics epsTaskStatistics) + { + List list = epsTaskStatisticsService.selectEpsTaskStatisticsList(epsTaskStatistics); + ExcelUtil util = new ExcelUtil(EpsTaskStatistics.class); + util.showColumn(epsTaskStatistics.getProperties()); + util.exportExcel(response, list, "业务95值计算任务数据"); + } + + /** + * 获取业务95值计算任务详细信息 + */ + @RequiresPermissions("system:taskStatistics:query") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(epsTaskStatisticsService.selectEpsTaskStatisticsById(id)); + } + + /** + * 新增业务95值计算任务 + */ + @RequiresPermissions("system:taskStatistics:add") + @Log(title = "业务95值计算任务", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody EpsTaskStatistics epsTaskStatistics) + { + return toAjax(epsTaskStatisticsService.insertEpsTaskStatistics(epsTaskStatistics)); + } + + /** + * 修改业务95值计算任务 + */ + @RequiresPermissions("system:taskStatistics:edit") + @Log(title = "业务95值计算任务", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody EpsTaskStatistics epsTaskStatistics) + { + return toAjax(epsTaskStatisticsService.updateEpsTaskStatistics(epsTaskStatistics)); + } + + /** + * 删除业务95值计算任务 + */ + @RequiresPermissions("system:taskStatistics:remove") + @Log(title = "业务95值计算任务", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(epsTaskStatisticsService.deleteEpsTaskStatisticsByIds(ids)); + } + /** + * 相关数据查询 + */ + @RequiresPermissions("system:taskStatistics:list") + @PostMapping("/getRelateData") + public TableDataInfo getRelateData(@RequestBody EpsTaskStatistics epsTaskStatistics) + { + PageInfo list = epsTaskStatisticsService.getRelateData(epsTaskStatistics); + return getDataTable(list.getList(), list.getTotal()); + } + /** + * 修改相关数据 + * @param epsTaskStatistics + * @return + */ + @RequiresPermissions("system:taskStatistics:edit") + @PostMapping("/updateRelateData") + public AjaxResult updateRelateData(@RequestBody EpsTaskStatistics epsTaskStatistics) + { + int rows = epsTaskStatisticsService.updateRelateData(epsTaskStatistics); + return toAjax(rows); + } + /** + * 重新计算 + */ + @RequiresPermissions("system:taskStatistics:list") + @PostMapping("/recaculate") + public AjaxResult recaculate(@RequestBody EpsTaskStatistics epsTaskStatistics) + { + int rows = epsTaskStatisticsService.recaculate(epsTaskStatistics); + return toAjax(rows); + } + /** + * 图形查看 + */ + @RequiresPermissions("system:taskStatistics:list") + @PostMapping("/getRraphicalMsg") + public AjaxResult getRraphicalMsg(@RequestBody EpsTaskStatistics epsTaskStatistics) + { + Map echartsMap = epsTaskStatisticsService.getRraphicalMsg(epsTaskStatistics); + return success(echartsMap); + } +} 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 1304e6e..3fe24e5 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 @@ -112,6 +112,10 @@ public class EpsInitialTrafficData extends BaseEntity { private String dayOrMonth; /** 金山流量 */ private String machineFlow; + /** 包含设备 */ + private String clientIds; + /** 是否95值 */ + private boolean flag95 = false; } \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/EpsTaskStatistics.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/EpsTaskStatistics.java new file mode 100644 index 0000000..6442719 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/EpsTaskStatistics.java @@ -0,0 +1,73 @@ +package com.ruoyi.system.domain; + +import com.ruoyi.common.core.annotation.Excel; +import com.ruoyi.common.core.web.domain.BaseEntity; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 业务95值计算任务对象 eps_task_statistics + * + * @author gyt + * @date 2025-10-29 + */ +@Data +public class EpsTaskStatistics extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键ID */ + private Long id; + + /** 任务名称 */ + @Excel(name = "任务名称") + private String taskName; + + /** 业务名称 */ + @Excel(name = "业务名称") + private String businessName; + /** 业务代码 */ + private String businessCode; + + /** 开始时间 */ + @Excel(name = "开始时间") + private String startTime; + + /** 结束时间 */ + @Excel(name = "结束时间") + private String endTime; + + /** 95值 */ + @Excel(name = "95值") + private BigDecimal percentile95; + + /** 月均日95值 */ + @Excel(name = "月均日95值") + private BigDecimal monthlyAvgPercentile95; + + /** 资源类型 */ + @Excel(name = "资源类型") + private String resourceType; + + /** 包含资源 */ + @Excel(name = "包含资源") + private String includedResources; + + /** 计算类型 */ + @Excel(name = "计算类型") + private String calculationType; + + /** 计算模式 */ + @Excel(name = "计算模式") + private String calculationMode; + + /** 任务状态(1-计算中,2-计算完成) */ + @Excel(name = "任务状态(1-计算中,2-计算完成)") + private String taskStatus; + /** 需要修改的流量值 */ + private BigDecimal needSpeed; + /** 需要修改的值对应的时间 */ + private String needTime; + +} 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 4fcde01..2588b60 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 @@ -112,4 +112,8 @@ public class InitialSwitchInfoDetails extends BaseEntity private String ifIndex; /** 计算方式 */ public String calculationMode; + /** 包含资源 */ + public String clientIds; + /** 是否95值 */ + private boolean flag95 = false; } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/EpsInitialTrafficDataMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/EpsInitialTrafficDataMapper.java index 1e81774..1a37350 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/EpsInitialTrafficDataMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/EpsInitialTrafficDataMapper.java @@ -47,4 +47,6 @@ public interface EpsInitialTrafficDataMapper { * @return */ int updateMachineTraffic(EpsInitialTrafficData epsInitialTrafficData); + + List getTrafficListByClientIds(EpsInitialTrafficData condition); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/EpsTaskStatisticsMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/EpsTaskStatisticsMapper.java new file mode 100644 index 0000000..aa4a2f4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/EpsTaskStatisticsMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import com.ruoyi.system.domain.EpsTaskStatistics; + +/** + * 业务95值计算任务Mapper接口 + * + * @author gyt + * @date 2025-10-29 + */ +public interface EpsTaskStatisticsMapper +{ + /** + * 查询业务95值计算任务 + * + * @param id 业务95值计算任务主键 + * @return 业务95值计算任务 + */ + public EpsTaskStatistics selectEpsTaskStatisticsById(Long id); + + /** + * 查询业务95值计算任务列表 + * + * @param epsTaskStatistics 业务95值计算任务 + * @return 业务95值计算任务集合 + */ + public List selectEpsTaskStatisticsList(EpsTaskStatistics epsTaskStatistics); + + /** + * 新增业务95值计算任务 + * + * @param epsTaskStatistics 业务95值计算任务 + * @return 结果 + */ + public int insertEpsTaskStatistics(EpsTaskStatistics epsTaskStatistics); + + /** + * 修改业务95值计算任务 + * + * @param epsTaskStatistics 业务95值计算任务 + * @return 结果 + */ + public int updateEpsTaskStatistics(EpsTaskStatistics epsTaskStatistics); + + /** + * 删除业务95值计算任务 + * + * @param id 业务95值计算任务主键 + * @return 结果 + */ + public int deleteEpsTaskStatisticsById(Long id); + + /** + * 批量删除业务95值计算任务 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEpsTaskStatisticsByIds(Long[] ids); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/InitialSwitchInfoDetailsMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/InitialSwitchInfoDetailsMapper.java index af00f70..6c3b055 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/InitialSwitchInfoDetailsMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/InitialSwitchInfoDetailsMapper.java @@ -28,6 +28,8 @@ public interface InitialSwitchInfoDetailsMapper */ public List selectInitialSwitchInfoDetailsList(InitialSwitchInfoDetails initialSwitchInfoDetails); + public List getswitchDetailList(InitialSwitchInfoDetails initialSwitchInfoDetails); + /** * 新增交换机监控信息 * @@ -73,4 +75,11 @@ public interface InitialSwitchInfoDetailsMapper * @return */ List getAllSwitchInfoMsg(InitialSwitchInfoDetails initialSwitchInfoDetails); + + /** + * 计算业务95值 + * @param queryParam + * @return + */ + List sumSwitchTrafficByclientIds(InitialSwitchInfoDetails queryParam); } 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 ab2b0fd..d7b6590 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 @@ -37,6 +37,13 @@ public interface EpsInitialTrafficDataService { */ List query(EpsInitialTrafficData queryParam); + /** + * 查询多台设备的流量数据 + * @param queryParam + * @return + */ + List getTrafficListByClientIds(EpsInitialTrafficData queryParam); + /** * 查询初始流量信息 * @param queryParam 查询参数实体 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/IEpsTaskStatisticsService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/IEpsTaskStatisticsService.java new file mode 100644 index 0000000..70fae68 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/IEpsTaskStatisticsService.java @@ -0,0 +1,72 @@ +package com.ruoyi.system.service; + +import com.github.pagehelper.PageInfo; +import com.ruoyi.system.domain.EpsTaskStatistics; + +import java.util.List; +import java.util.Map; + +/** + * 业务95值计算任务Service接口 + * + * @author gyt + * @date 2025-10-29 + */ +public interface IEpsTaskStatisticsService +{ + /** + * 查询业务95值计算任务 + * + * @param id 业务95值计算任务主键 + * @return 业务95值计算任务 + */ + public EpsTaskStatistics selectEpsTaskStatisticsById(Long id); + + /** + * 查询业务95值计算任务列表 + * + * @param epsTaskStatistics 业务95值计算任务 + * @return 业务95值计算任务集合 + */ + public List selectEpsTaskStatisticsList(EpsTaskStatistics epsTaskStatistics); + + /** + * 新增业务95值计算任务 + * + * @param epsTaskStatistics 业务95值计算任务 + * @return 结果 + */ + public int insertEpsTaskStatistics(EpsTaskStatistics epsTaskStatistics); + + /** + * 修改业务95值计算任务 + * + * @param epsTaskStatistics 业务95值计算任务 + * @return 结果 + */ + public int updateEpsTaskStatistics(EpsTaskStatistics epsTaskStatistics); + + /** + * 批量删除业务95值计算任务 + * + * @param ids 需要删除的业务95值计算任务主键集合 + * @return 结果 + */ + public int deleteEpsTaskStatisticsByIds(Long[] ids); + + /** + * 删除业务95值计算任务信息 + * + * @param id 业务95值计算任务主键 + * @return 结果 + */ + public int deleteEpsTaskStatisticsById(Long id); + + PageInfo getRelateData(EpsTaskStatistics epsTaskStatistics); + + int updateRelateData(EpsTaskStatistics epsTaskStatistics); + + int recaculate(EpsTaskStatistics epsTaskStatistics); + + Map getRraphicalMsg(EpsTaskStatistics epsTaskStatistics); +} 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 c3936de..ab1dffa 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 @@ -194,6 +194,32 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe .collect(Collectors.toList()); } + /** + * 查询多台设备的流量数据 + * @param queryParam + * @return + */ + @Override + public List getTrafficListByClientIds(EpsInitialTrafficData queryParam) { + + // 获取涉及的表名 + Set tableNames = TableRouterUtil.getTableNamesBetween(queryParam.getStartTime(), queryParam.getEndTime()); + + // 并行查询各表 + return tableNames.parallelStream() + .flatMap(tableName -> { + EpsInitialTrafficData condition = new EpsInitialTrafficData(); + condition.setTableName(tableName); + condition.setStartTime(queryParam.getStartTime()); + condition.setEndTime(queryParam.getEndTime()); + condition.setBusinessId(queryParam.getBusinessId()); + condition.setBusinessName(queryParam.getBusinessName()); + condition.setClientIds(queryParam.getClientIds()); + return epsInitialTrafficDataMapper.getTrafficListByClientIds(condition).stream(); + }) + .collect(Collectors.toList()); + } + @Override public List getAllTraficMsg(EpsInitialTrafficData queryParam) { @@ -223,8 +249,9 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe List snList = allInterfaceNameMapper.getAllDeviceSn(new AllInterfaceName()); // 遍历处理每个设备 snList.forEach(interfaceName -> { - queryParam.setServiceSn(interfaceName.getDeviceSn()); - processDeviceBandwidth(queryParam, dailyStartTime, dailyEndTime, calculationMode); + queryParam.setClientId(interfaceName.getClientId()); + queryParam.setName(interfaceName.getInterfaceName()); + calculateChangedDeviceBandwidth(queryParam, dailyStartTime, dailyEndTime, calculationMode); }); } /** @@ -412,33 +439,6 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe return dataList; } - /** - * 处理单个设备的带宽计算 - */ - private void processDeviceBandwidth(EpsInitialTrafficData queryParam, - String dailyStartTime, - String dailyEndTime, String calculationMode) { - // 1. 检查设备是否有业务变更 - EpsServerRevenueConfig revenueConfig = new EpsServerRevenueConfig(); - revenueConfig.setHardwareSn(queryParam.getServiceSn()); - List changedList = epsServerRevenueConfigMapper - .selectEpsServerRevenueConfigList(revenueConfig); - - // 2. 根据业务变更情况选择计算方式 - if (hasTrafficMethodChanged(changedList)) { - calculateChangedDeviceBandwidth(queryParam, dailyStartTime, dailyEndTime, calculationMode); - } else { - calculateNormalDeviceBandwidth(queryParam, dailyStartTime, dailyEndTime, calculationMode); - } - } - /** - * 判断是否为流量型业务变更 - */ - private boolean hasTrafficMethodChanged(List changedList) { - return !changedList.isEmpty() && - "1".equals(changedList.get(0).getChanged()) && - "1".equals(changedList.get(0).getRevenueMethod()); - } /** * 计算有业务变更设备的带宽 */ @@ -447,7 +447,8 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe String dailyEndTime, String calculationMode) { // 1. 获取业务变更记录(按时间降序) EpsMethodChangeRecord changeQuery = new EpsMethodChangeRecord(); - changeQuery.setHardwareSn(queryParam.getServiceSn()); + changeQuery.setClientId(queryParam.getClientId()); + changeQuery.setTrafficPort(queryParam.getName()); changeQuery.setStartTime(dailyStartTime); changeQuery.setEndTime(dailyEndTime); List records = epsMethodChangeRecordMapper @@ -583,6 +584,7 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe EpsNodeBandwidth bandwidth = new EpsNodeBandwidth(); bandwidth.setClientId(data.getClientId()); bandwidth.setHardwareSn(data.getServiceSn()); + bandwidth.setInterfaceName(data.getName()); bandwidth.setCalculationMode(calculationMode); bandwidth.setNodeName(data.getNodeName()); bandwidth.setBusinessId(data.getBusinessId()); 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 1c9d180..fb5440f 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 @@ -4,7 +4,6 @@ import com.github.pagehelper.PageInfo; import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.web.page.PageDomain; import com.ruoyi.system.domain.EpsInitialTrafficData; -import com.ruoyi.system.domain.EpsMethodChangeRecord; import com.ruoyi.system.domain.EpsNodeBandwidth; import com.ruoyi.system.mapper.EpsMethodChangeRecordMapper; import com.ruoyi.system.mapper.EpsNodeBandwidthMapper; @@ -180,15 +179,6 @@ public class EpsNodeBandwidthServiceImpl implements IEpsNodeBandwidthService if (epsNodeBandwidth == null) { log.warn("参数为空,无法计算月均日95值"); return 0; - } - EpsMethodChangeRecord query = new EpsMethodChangeRecord(); - query.setClientId(epsNodeBandwidth.getClientId()); - query.setTrafficPort(epsNodeBandwidth.getInterfaceName()); - query.setBusinessName(epsNodeBandwidth.getBusinessName()); - query.setBusinessCode(epsNodeBandwidth.getBusinessId()); - List records = epsMethodChangeRecordMapper.selectEpsMethodChangeRecordList(query); - if(!records.isEmpty()){ - } // 3. 获取计算数据(防止空指针) EpsNodeBandwidth calculatedData = epsNodeBandwidthMapper.calculateAvg(epsNodeBandwidth); diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EpsTaskStatisticsServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EpsTaskStatisticsServiceImpl.java new file mode 100644 index 0000000..350d115 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EpsTaskStatisticsServiceImpl.java @@ -0,0 +1,405 @@ +package com.ruoyi.system.service.impl; + +import com.github.pagehelper.PageInfo; +import com.ruoyi.common.core.utils.DateUtils; +import com.ruoyi.common.core.utils.EchartsDataUtils; +import com.ruoyi.common.core.utils.SpeedUtils; +import com.ruoyi.common.core.utils.StringUtils; +import com.ruoyi.system.domain.EpsInitialTrafficData; +import com.ruoyi.system.domain.EpsNodeBandwidth; +import com.ruoyi.system.domain.EpsTaskStatistics; +import com.ruoyi.system.domain.InitialSwitchInfoDetails; +import com.ruoyi.system.mapper.EpsNodeBandwidthMapper; +import com.ruoyi.system.mapper.EpsTaskStatisticsMapper; +import com.ruoyi.system.mapper.InitialSwitchInfoDetailsMapper; +import com.ruoyi.system.service.EpsInitialTrafficDataService; +import com.ruoyi.system.service.IEpsTaskStatisticsService; +import com.ruoyi.system.service.IInitialSwitchInfoDetailsService; +import com.ruoyi.system.util.CalculateUtil; +import com.ruoyi.system.util.TrafficRedisHashUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.YearMonth; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 业务95值计算任务Service业务层处理 + * + * @author gyt + * @date 2025-10-29 + */ +@Service +public class EpsTaskStatisticsServiceImpl implements IEpsTaskStatisticsService +{ + @Autowired + private EpsTaskStatisticsMapper epsTaskStatisticsMapper; + @Autowired + private EpsInitialTrafficDataService epsInitialTrafficDataService; + @Autowired + private EpsNodeBandwidthMapper epsNodeBandwidthMapper; + @Autowired + private IInitialSwitchInfoDetailsService initialSwitchInfoDetailsService; + @Autowired + private InitialSwitchInfoDetailsMapper initialSwitchInfoDetailsMapper; + @Autowired + private TrafficRedisHashUtil trafficRedisHashUtil; + + /** + * 查询业务95值计算任务 + * + * @param id 业务95值计算任务主键 + * @return 业务95值计算任务 + */ + @Override + public EpsTaskStatistics selectEpsTaskStatisticsById(Long id) + { + return epsTaskStatisticsMapper.selectEpsTaskStatisticsById(id); + } + + /** + * 查询业务95值计算任务列表 + * + * @param epsTaskStatistics 业务95值计算任务 + * @return 业务95值计算任务 + */ + @Override + public List selectEpsTaskStatisticsList(EpsTaskStatistics epsTaskStatistics) + { + return epsTaskStatisticsMapper.selectEpsTaskStatisticsList(epsTaskStatistics); + } + + /** + * 新增业务95值计算任务 + * + * @param epsTaskStatistics 业务95值计算任务 + * @return 结果 + */ + @Override + public int insertEpsTaskStatistics(EpsTaskStatistics epsTaskStatistics) + { + epsTaskStatistics.setCreateTime(DateUtils.getNowDate()); + epsTaskStatisticsMapper.insertEpsTaskStatistics(epsTaskStatistics); + // 开始计算 + if(StringUtils.equals(epsTaskStatistics.getResourceType(), "1")){ + if(StringUtils.equals(epsTaskStatistics.getCalculationType(), "1")){ + EpsInitialTrafficData queryParam = new EpsInitialTrafficData(); + queryParam.setStartTime(epsTaskStatistics.getStartTime()); + queryParam.setEndTime(epsTaskStatistics.getEndTime()); + queryParam.setBusinessId(epsTaskStatistics.getBusinessCode()); + queryParam.setClientIds(epsTaskStatistics.getIncludedResources()); + List dataList = epsInitialTrafficDataService.getTrafficListByClientIds(queryParam); + if(!dataList.isEmpty()){ + // 存储数据到redis缓存 + trafficRedisHashUtil.addItemToHash(epsTaskStatistics.getId().toString(), dataList); + // 计算95数据 + processServer95Data(dataList, epsTaskStatistics); + } + }else{ + processAvg95Data(epsTaskStatistics); + } + }else{ + if(StringUtils.equals(epsTaskStatistics.getCalculationType(), "1")){ + InitialSwitchInfoDetails queryParam = new InitialSwitchInfoDetails(); + queryParam.setStartTime(epsTaskStatistics.getStartTime()); + queryParam.setEndTime(epsTaskStatistics.getEndTime()); + queryParam.setBusinessCode(epsTaskStatistics.getBusinessCode()); + queryParam.setClientIds(epsTaskStatistics.getIncludedResources()); + List dataList = initialSwitchInfoDetailsMapper + .sumSwitchTrafficByclientIds(queryParam); + if(!dataList.isEmpty()){ + trafficRedisHashUtil.addItemToHash(epsTaskStatistics.getId().toString(), dataList); + processSwitch95Data(dataList, epsTaskStatistics); + } + }else{ + processAvg95Data(epsTaskStatistics); + } + } + return 1; + } + + public void processServer95Data(List dataList, EpsTaskStatistics epsTaskStatistics){ + if(!dataList.isEmpty()){ + // 1. 提取并转换带宽值 + List speedsInMbps = dataList.stream() + .map(data -> CalculateUtil.parseSpeedToMbps(data.getOutSpeed(), epsTaskStatistics.getCalculationMode())) + .sorted() + .collect(Collectors.toList()); + // 计算95百分位 + BigDecimal percentile95 = CalculateUtil.calculatePercentile(speedsInMbps, 0.95); + + // 保存计算结果 + EpsTaskStatistics updateData = new EpsTaskStatistics(); + updateData.setId(epsTaskStatistics.getId()); + updateData.setTaskStatus("2"); + updateData.setPercentile95(percentile95.setScale(0, RoundingMode.HALF_UP)); + updateData.setUpdateTime(DateUtils.getNowDate()); + epsTaskStatisticsMapper.updateEpsTaskStatistics(updateData); + } + } + public void processSwitch95Data(List dataList, EpsTaskStatistics epsTaskStatistics){ + if(!dataList.isEmpty()){ + // 1. 提取并转换带宽值 + List speedsInMbps = dataList.stream() + .map(data -> { + // 根据 interfaceDeviceType 选择 inSpeed 或 outSpeed + String speed = data.getMaxSpeed() != null ? data.getMaxSpeed().toString() : BigDecimal.ZERO.toString(); + // 如果 speed 是纯数字,补充单位 "B/S"(Bytes/s) + if (speed.matches("^\\d+(\\.\\d+)?$")) { + speed += " B/S"; + } + return CalculateUtil.parseSpeedToMbps(speed, epsTaskStatistics.getCalculationMode()); + }) + .sorted() + .collect(Collectors.toList()); + + // 2. 计算95百分位 + BigDecimal percentile95 = CalculateUtil.calculatePercentile(speedsInMbps, 0.95); + + // 保存计算结果 + EpsTaskStatistics updateData = new EpsTaskStatistics(); + updateData.setId(epsTaskStatistics.getId()); + updateData.setTaskStatus("2"); + updateData.setPercentile95(percentile95.setScale(0, RoundingMode.HALF_UP)); + updateData.setUpdateTime(DateUtils.getNowDate()); + epsTaskStatisticsMapper.updateEpsTaskStatistics(updateData); + } + } + + public void processAvg95Data(EpsTaskStatistics epsTaskStatistics) { + EpsNodeBandwidth epsNodeBandwidth = new EpsNodeBandwidth(); + epsNodeBandwidth.setMonthTime(epsTaskStatistics.getStartTime()); + epsNodeBandwidth.setBusinessId(epsTaskStatistics.getBusinessCode()); + EpsNodeBandwidth calculatedData = epsNodeBandwidthMapper.calculateAvg(epsNodeBandwidth); + if (calculatedData != null) { + BigDecimal sum95Daily = Optional.ofNullable(calculatedData.getBandwidth95Daily()).orElse(BigDecimal.ZERO); + LocalDate monthTime = null; + try { + String monthStr = epsNodeBandwidth.getMonthTime() == null + ? epsNodeBandwidth.getStartTime().substring(0, 7) + : epsNodeBandwidth.getMonthTime(); + + YearMonth yearMonth = YearMonth.parse(monthStr); + monthTime = yearMonth.atDay(1); // 转换为当月第一天 + } catch (Exception e) { + System.err.println("月份格式错误:" + e.getMessage()); + } + int daysInMonth = YearMonth.from(monthTime).lengthOfMonth(); + if (daysInMonth == 0) { + System.err.println("当月天数为0,月份: " + epsNodeBandwidth.getMonthTime() == null + ? epsNodeBandwidth.getStartTime() : epsNodeBandwidth.getMonthTime()); + } + // 月均日95值 + BigDecimal avgMonthly = sum95Daily.divide(BigDecimal.valueOf(daysInMonth), 0, RoundingMode.HALF_UP); + // 保存计算结果 + EpsTaskStatistics updateData = new EpsTaskStatistics(); + updateData.setId(epsTaskStatistics.getId()); + updateData.setTaskStatus("2"); + updateData.setMonthlyAvgPercentile95(avgMonthly); + updateData.setUpdateTime(DateUtils.getNowDate()); + epsTaskStatisticsMapper.updateEpsTaskStatistics(updateData); + } + } + /** + * 修改业务95值计算任务 + * + * @param epsTaskStatistics 业务95值计算任务 + * @return 结果 + */ + @Override + public int updateEpsTaskStatistics(EpsTaskStatistics epsTaskStatistics) + { + epsTaskStatistics.setUpdateTime(DateUtils.getNowDate()); + return epsTaskStatisticsMapper.updateEpsTaskStatistics(epsTaskStatistics); + } + + /** + * 批量删除业务95值计算任务 + * + * @param ids 需要删除的业务95值计算任务主键 + * @return 结果 + */ + @Override + public int deleteEpsTaskStatisticsByIds(Long[] ids) + { + return epsTaskStatisticsMapper.deleteEpsTaskStatisticsByIds(ids); + } + + /** + * 删除业务95值计算任务信息 + * + * @param id 业务95值计算任务主键 + * @return 结果 + */ + @Override + public int deleteEpsTaskStatisticsById(Long id) + { + return epsTaskStatisticsMapper.deleteEpsTaskStatisticsById(id); + } + + @Override + public PageInfo getRelateData(EpsTaskStatistics epsTaskStatistics) { + // 分页参数 + Integer pageNum = epsTaskStatistics.getPageNum(); + Integer pageSize = epsTaskStatistics.getPageSize(); + // 查询任务详情 + Long taskId = epsTaskStatistics.getId(); + EpsTaskStatistics taskMsg = epsTaskStatisticsMapper.selectEpsTaskStatisticsById(taskId); + if(StringUtils.equals("1", taskMsg.getResourceType())){ + List list = trafficRedisHashUtil.getListFromHash(taskId.toString(), EpsInitialTrafficData.class); + int index = CalculateUtil.calculate95Index(list, 0.05); + list.get(index).setFlag95(true); + List pageList = list.stream() + .skip((long) (pageNum - 1) * pageSize) + .limit(pageSize) + .collect(Collectors.toList()); + for (EpsInitialTrafficData epsInitialTrafficData : pageList) { + epsInitialTrafficData.setBusinessId(taskMsg.getBusinessCode()); + epsInitialTrafficData.setClientId(taskMsg.getIncludedResources()); + } + PageInfo pageInfo = new PageInfo<>(); + pageInfo.setPageNum(pageNum); + pageInfo.setPageSize(pageSize); + pageInfo.setTotal(list.size()); + pageInfo.setList(pageList); + return pageInfo; + }else{ + List list = trafficRedisHashUtil.getListFromHash(taskId.toString(), InitialSwitchInfoDetails.class); + int index = CalculateUtil.calculate95Index(list, 0.05); + list.get(index).setFlag95(true); + List pageList = list.stream() + .skip((long) (pageNum - 1) * pageSize) + .limit(pageSize) + .collect(Collectors.toList()); + for (InitialSwitchInfoDetails initialSwitchInfoDetails : pageList) { + initialSwitchInfoDetails.setName(taskMsg.getIncludedResources()); + } + PageInfo pageInfo = new PageInfo<>(); + pageInfo.setPageNum(pageNum); + pageInfo.setPageSize(pageSize); + pageInfo.setTotal(list.size()); + pageInfo.setList(pageList); + return pageInfo; + } + } + + @Override + public int updateRelateData(EpsTaskStatistics epsTaskStatistics) { + // 查询任务详情 + Long taskId = epsTaskStatistics.getId(); + EpsTaskStatistics taskMsg = epsTaskStatisticsMapper.selectEpsTaskStatisticsById(taskId); + if(StringUtils.equals("1", taskMsg.getResourceType())){ + EpsInitialTrafficData epsInitialTrafficData = new EpsInitialTrafficData(); + epsInitialTrafficData.setOutSpeed(epsTaskStatistics.getNeedSpeed().toString()); + epsInitialTrafficData.setCreateTime(DateUtils.parseDate(epsTaskStatistics.getNeedTime())); + trafficRedisHashUtil.updateItemInHash(taskId.toString(), epsInitialTrafficData, + item -> { + Object createTime = trafficRedisHashUtil.getCreateTimeFromObject(item); + return createTime != null && createTime.toString().equals(epsTaskStatistics.getNeedTime().toString()); + } + ); + }else{ + InitialSwitchInfoDetails initialSwitchInfoDetails = new InitialSwitchInfoDetails(); + initialSwitchInfoDetails.setMaxSpeed(epsTaskStatistics.getNeedSpeed()); + initialSwitchInfoDetails.setCreateTime(DateUtils.parseDate(epsTaskStatistics.getNeedTime())); + trafficRedisHashUtil.updateItemInHash(taskId.toString(), initialSwitchInfoDetails, + item -> { + Object createTime = trafficRedisHashUtil.getCreateTimeFromObject(item); + return createTime != null && createTime.toString().equals(epsTaskStatistics.getNeedTime().toString()); + } + ); + } + return 1; + } + + @Override + public int recaculate(EpsTaskStatistics epsTaskStatistics) { + // 查询任务详情 + Long taskId = epsTaskStatistics.getId(); + EpsTaskStatistics taskMsg = epsTaskStatisticsMapper.selectEpsTaskStatisticsById(taskId); + // 任务状态改为计算中 + EpsTaskStatistics updateParam = new EpsTaskStatistics(); + updateParam.setId(taskId); + updateParam.setTaskStatus("1"); + epsTaskStatisticsMapper.updateEpsTaskStatistics(updateParam); + // 开始计算 + if(StringUtils.equals("1", taskMsg.getResourceType())){ + List dataList = trafficRedisHashUtil.getListFromHash(taskId.toString(), EpsInitialTrafficData.class); + if(StringUtils.equals(epsTaskStatistics.getCalculationType(), "1")){ + processServer95Data(dataList, epsTaskStatistics); + }else{ + processAvg95Data(epsTaskStatistics); + } + }else{ + List dataList = trafficRedisHashUtil.getListFromHash(taskId.toString(), InitialSwitchInfoDetails.class); + if(StringUtils.equals(epsTaskStatistics.getCalculationType(), "1")){ + processSwitch95Data(dataList, epsTaskStatistics); + }else{ + processAvg95Data(epsTaskStatistics); + } + } + return 1; + } + + @Override + public Map getRraphicalMsg(EpsTaskStatistics epsTaskStatistics) { + // 查询任务详情 + Long taskId = epsTaskStatistics.getId(); + EpsTaskStatistics taskMsg = epsTaskStatisticsMapper.selectEpsTaskStatisticsById(taskId); + if(StringUtils.equals("1", taskMsg.getResourceType())){ + if(StringUtils.equals("1", taskMsg.getCalculationType())){ + List list = trafficRedisHashUtil.getListFromHash(taskId.toString(), EpsInitialTrafficData.class); + if(!list.isEmpty()){ + try{ + SpeedUtils.SpeedResult result = SpeedUtils.calculateWithStringTraffic(list, "inSpeed", "outSpeed"); + BigDecimal divisor = SpeedUtils.getDivisor(result.getRecommendedUnit()); + Map> extractors = new LinkedHashMap<>(); + + extractors.put("netOutSpeedData", info -> + info != null && info.getOutSpeed() != null ? + new BigDecimal(info.getOutSpeed()).divide(divisor, 0, RoundingMode.HALF_UP) : + 0); + Map resultMap = EchartsDataUtils.buildEchartsData(list, EpsInitialTrafficData::getCreateTime, extractors); + resultMap.put("other", result); + resultMap.put("percentile95", taskMsg.getPercentile95()); + return resultMap; + }catch (Exception e){ + System.err.println(e.getMessage()); + } + } + } + }else{ + if(StringUtils.equals("1", taskMsg.getCalculationType())){ + List list = trafficRedisHashUtil.getListFromHash(taskId.toString(), InitialSwitchInfoDetails.class); + if(!list.isEmpty()){ + try{ + SpeedUtils.SpeedResult result = SpeedUtils.calculateWithAverageBasedUnit(list, "inSpeed", "outSpeed"); + BigDecimal divisor = SpeedUtils.getDivisor(result.getRecommendedUnit()); + Map> extractors = new LinkedHashMap<>(); + extractors.put("netInSpeedData", info -> + info != null && info.getInSpeed() != null ? + info.getInSpeed().divide(divisor, 0, RoundingMode.HALF_UP) : + 0); + + extractors.put("netOutSpeedData", info -> + info != null && info.getOutSpeed() != null ? + info.getOutSpeed().divide(divisor, 0, RoundingMode.HALF_UP) : + 0); + Map resultMap = EchartsDataUtils.buildEchartsData(list, InitialSwitchInfoDetails::getCreateTime, extractors); + resultMap.put("other", result); + resultMap.put("percentile95", taskMsg.getPercentile95()); + return resultMap; + }catch (Exception e){ + System.err.println(e.getMessage()); + } + } + } + } + return new HashMap(); + } +} 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 0ea0e10..63616bc 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 @@ -723,22 +723,31 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe BeanUtils.copyProperties(initialSwitchInfoDetails, dailyQuery); // 复制原有属性 dailyQuery.setStartTime(dayStart); dailyQuery.setEndTime(dayEnd); - try { - Map resultMap = switchNetSpeedEcharts(dailyQuery); - // 查询95值 - EpsNodeBandwidth query = new EpsNodeBandwidth(); - query.setBandwidthType("1"); - query.setCreateTime(DateUtils.parseDate(date)); - query.setCalculationMode(initialSwitchInfoDetails.getCalculationMode()); - query.setClientId(initialSwitchInfoDetails.getClientId()); - List epsNodeBandwidthList = epsNodeBandwidthMapper.selectEpsNodeBandwidthList(query); - if(!epsNodeBandwidthList.isEmpty()){ - EpsNodeBandwidth nodeBandwidth = epsNodeBandwidthList.get(0); - resultMap.put("95value", nodeBandwidth.getBandwidthResult()); + // 根据clientId查询交换机接口名称 + AllInterfaceName queryParam = new AllInterfaceName(); + queryParam.setSwitchIp(initialSwitchInfoDetails.getSwitchIp()); + queryParam.setClientId(initialSwitchInfoDetails.getClientId()); + List allInterfaceNames = allInterfaceNameMapper.selectAllInterfaceNameList(queryParam); + for (AllInterfaceName allInterfaceName : allInterfaceNames) { + try { + dailyQuery.setName(allInterfaceName.getInterfaceName()); + Map resultMap = switchNetSpeedEcharts(dailyQuery); + // 查询95值 + EpsNodeBandwidth query = new EpsNodeBandwidth(); + query.setBandwidthType("1"); + query.setCreateTime(DateUtils.parseDate(date)); + query.setCalculationMode(initialSwitchInfoDetails.getCalculationMode()); + query.setClientId(initialSwitchInfoDetails.getClientId()); + query.setInterfaceName(allInterfaceName.getInterfaceName()); + List epsNodeBandwidthList = epsNodeBandwidthMapper.selectEpsNodeBandwidthList(query); + if(!epsNodeBandwidthList.isEmpty()){ + EpsNodeBandwidth nodeBandwidth = epsNodeBandwidthList.get(0); + resultMap.put("95value", nodeBandwidth.getBandwidthResult()); + } + resultList.add(resultMap); + } catch (Exception e){ + e.printStackTrace(); } - resultList.add(resultMap); - } catch (Exception e){ - e.printStackTrace(); } } return resultList.isEmpty() ? new ArrayList<>() : resultList; @@ -795,7 +804,7 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe * @return */ public Map switchNetSpeedEcharts(InitialSwitchInfoDetails initialSwitchInfoDetails) { - List list = initialSwitchInfoDetailsMapper.selectInitialSwitchInfoDetailsList(initialSwitchInfoDetails); + List list = initialSwitchInfoDetailsMapper.getswitchDetailList(initialSwitchInfoDetails); try { SpeedUtils.SpeedResult result = SpeedUtils.calculateWithAverageBasedUnit(list, "inSpeed", "outSpeed"); BigDecimal divisor = SpeedUtils.getDivisor(result.getRecommendedUnit()); diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RmResourceRegistrationServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RmResourceRegistrationServiceImpl.java index 095e5e2..c7b3561 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RmResourceRegistrationServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RmResourceRegistrationServiceImpl.java @@ -490,6 +490,10 @@ public class RmResourceRegistrationServiceImpl implements IRmResourceRegistratio */ @Override public int innerAddRegist(RmRegisterMsgRemote registerMsg) { + if(registerMsg.getClientId() == null) { + log.error("注册失败:clientId为null"); + return 0; + } // 解析mq接收的消息 // 时间戳转换 long timestamp = registerMsg.getTimestamp(); @@ -513,6 +517,8 @@ public class RmResourceRegistrationServiceImpl implements IRmResourceRegistratio insertData.setHardwareSn(registerMsg.getSn()); insertData.setRegistrationStatus("1"); insertData.setMultiPublicIpStatus("1"); + insertData.setHeartbeatCount(3); + insertData.setHeartbeatInterval(30); insertData.setResourceType("1"); insertData.setCreateTime(createTime); rmResourceRegistrationMapper.insertRmResourceRegistration(insertData); @@ -577,16 +583,30 @@ public class RmResourceRegistrationServiceImpl implements IRmResourceRegistratio queryParam.setClientId(rmResourceRegistration.getClientId()); RmResourceRegistration exits = rmResourceRegistrationMapper.selectRegistMsgByClientId(queryParam); if(exits != null){ - // 如果逻辑节点为空或者有变化 设置新节点 + RmResourceRegistration updateData = new RmResourceRegistration(); + boolean needUpdate = false; + // 如果上机时间为空 设置上机时间 + if(exits.getOnboardTime() == null){ + // 如果服务器已注册 增加节点标识 + updateData.setOnboardTime(DateUtils.getNowDate()); + needUpdate = true; + } if(exits.getLogicalNodeId() == null || !StringUtils.equals(rmResourceRegistration.getLogicalNodeId(),exits.getLogicalNodeId())){ // 如果服务器已注册 增加节点标识 - RmResourceRegistration updateData = new RmResourceRegistration(); - updateData.setId(exits.getId()); updateData.setLogicalNodeId(rmResourceRegistration.getLogicalNodeId()); - updateData.setOnboardTime(DateUtils.getNowDate()); + needUpdate = true; + } + if(exits.getAgentVersion() == null || + !StringUtils.equals(rmResourceRegistration.getAgentVersion(),exits.getAgentVersion())){ + // 如果服务器已注册 增加版本信息 + updateData.setAgentVersion(rmResourceRegistration.getAgentVersion()); + needUpdate = true; + } + if(needUpdate){ + updateData.setId(exits.getId()); rmResourceRegistrationMapper.updateRmResourceRegistration(updateData); - log.info("设备:{},逻辑节点增加成功",rmResourceRegistration.getClientId()); + log.info("设备:{},更新成功",rmResourceRegistration.getClientId()); return 1; } } 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 index 76237ed..2cd1fd0 100644 --- 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 @@ -134,6 +134,19 @@ public class CalculateUtil { return sortedValues.get(position).setScale(2, RoundingMode.HALF_UP); } + /** + * 计算95值位置 从大到小 + * @param sortedValues + * @param percentile + * @return + */ + public static int calculate95Index(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 position; + } + /** * 根据带宽类型设置时间范围(修复T分隔符问题) */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/TrafficRedisHashUtil.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/TrafficRedisHashUtil.java new file mode 100644 index 0000000..2bd39f3 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/TrafficRedisHashUtil.java @@ -0,0 +1,329 @@ +package com.ruoyi.system.util; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; + +@Component +@SuppressWarnings("unchecked") +public class TrafficRedisHashUtil { + private static final String TRAFFIC_DATA_HASH_KEY = "eps:traffic:hash"; + + @Autowired + private RedisTemplate redisTemplate; + + /** + * 使用Hash结构存储,每个taskId对应一个列表(支持泛型) + */ + public void saveListToHash(String taskId, List dataList) { + if (dataList == null) { + return; + } + + String hashKey = generateHashKey(taskId); + redisTemplate.opsForHash().put(TRAFFIC_DATA_HASH_KEY, hashKey, dataList); + + // 可选:设置过期时间 +// redisTemplate.expire(TRAFFIC_DATA_HASH_KEY, 1, TimeUnit.HOURS); + } + + /** + * 从Hash获取数据(支持泛型) + */ + public List getListFromHash(String taskId, Class clazz) { + String hashKey = generateHashKey(taskId); + Object result = redisTemplate.opsForHash().get(TRAFFIC_DATA_HASH_KEY, hashKey); + + if (result instanceof List) { + return (List) result; + } + return null; + } + + /** + * 从Hash获取数据(不指定类型,返回原始List) + */ + public List getListFromHash(String taskId) { + String hashKey = generateHashKey(taskId); + Object result = redisTemplate.opsForHash().get(TRAFFIC_DATA_HASH_KEY, hashKey); + + if (result instanceof List) { + return (List) result; + } + return null; + } + + /** + * 更新Hash中的特定项(通过createTime匹配) + */ + public void updateItemInHash(String taskId, T updatedItem, Object createTime) { + List dataList = (List) getListFromHash(taskId); + + if (dataList != null) { + for (int i = 0; i < dataList.size(); i++) { + T item = dataList.get(i); + Object itemCreateTime = getCreateTimeFromObject(item); + if (itemCreateTime != null && itemCreateTime.equals(createTime)) { + dataList.set(i, updatedItem); + break; + } + } + saveListToHash(taskId, dataList); + } + } + + /** + * 更新Hash中的特定项(使用自定义匹配器) + */ + public void updateItemInHash(String taskId, T updatedItem, Predicate matcher) { + List dataList = (List) getListFromHash(taskId); + + if (dataList != null) { + for (int i = 0; i < dataList.size(); i++) { + if (matcher.test(dataList.get(i))) { + dataList.set(i, updatedItem); + break; + } + } + saveListToHash(taskId, dataList); + } + } + + /** + * 添加新数据项到指定taskId的列表 + */ + public void addItemToHash(String taskId, T newItem) { + List dataList = (List) getListFromHash(taskId); + + if (dataList == null) { + dataList = new ArrayList<>(); + } + dataList.add(newItem); + saveListToHash(taskId, dataList); + } + + /** + * 从指定taskId的列表中删除数据项(通过createTime匹配) + */ + public void deleteItemFromHash(String taskId, Object createTime) { + List dataList = (List) getListFromHash(taskId); + + if (dataList != null) { + dataList.removeIf(item -> { + Object itemCreateTime = getCreateTimeFromObject(item); + return itemCreateTime != null && itemCreateTime.equals(createTime); + }); + saveListToHash(taskId, dataList); + } + } + + /** + * 从指定taskId的列表中删除数据项(使用自定义匹配器) + */ + public void deleteItemFromHash(String taskId, Predicate matcher) { + List dataList = (List) getListFromHash(taskId); + + if (dataList != null) { + dataList.removeIf(matcher); + saveListToHash(taskId, dataList); + } + } + + /** + * 根据createTime范围删除数据项 + */ + public void deleteItemsByCreateTimeRange(String taskId, Object startTime, Object endTime) { + List dataList = (List) getListFromHash(taskId); + + if (dataList != null) { + dataList.removeIf(item -> { + Object itemCreateTime = getCreateTimeFromObject(item); + if (itemCreateTime == null) return false; + + // 假设createTime是可比较的类型(如Date、Long、LocalDateTime等) + if (itemCreateTime instanceof Comparable) { + Comparable time = (Comparable) itemCreateTime; + return time.compareTo(startTime) >= 0 && time.compareTo(endTime) <= 0; + } + return false; + }); + saveListToHash(taskId, dataList); + } + } + + /** + * 根据createTime查找数据项 + */ + public T findItemByCreateTime(String taskId, Object createTime) { + List dataList = (List) getListFromHash(taskId); + + if (dataList != null) { + for (T item : dataList) { + Object itemCreateTime = getCreateTimeFromObject(item); + if (itemCreateTime != null && itemCreateTime.equals(createTime)) { + return item; + } + } + } + return null; + } + + /** + * 根据createTime范围查找数据项 + */ + public List findItemsByCreateTimeRange(String taskId, Object startTime, Object endTime) { + List dataList = (List) getListFromHash(taskId); + List result = new ArrayList<>(); + + if (dataList != null) { + for (T item : dataList) { + Object itemCreateTime = getCreateTimeFromObject(item); + if (itemCreateTime != null && itemCreateTime instanceof Comparable) { + Comparable time = (Comparable) itemCreateTime; + if (time.compareTo(startTime) >= 0 && time.compareTo(endTime) <= 0) { + result.add(item); + } + } + } + } + return result; + } + + /** + * 获取最早的createTime数据项 + */ + public T getEarliestItem(String taskId) { + List dataList = (List) getListFromHash(taskId); + + if (dataList == null || dataList.isEmpty()) { + return null; + } + + T earliestItem = dataList.get(0); + Object earliestTime = getCreateTimeFromObject(earliestItem); + + for (int i = 1; i < dataList.size(); i++) { + T currentItem = dataList.get(i); + Object currentTime = getCreateTimeFromObject(currentItem); + + if (currentTime instanceof Comparable && earliestTime instanceof Comparable) { + Comparable currentComparable = (Comparable) currentTime; + Comparable earliestComparable = (Comparable) earliestTime; + + if (currentComparable.compareTo(earliestComparable) < 0) { + earliestItem = currentItem; + earliestTime = currentTime; + } + } + } + return earliestItem; + } + + /** + * 获取最晚的createTime数据项 + */ + public T getLatestItem(String taskId) { + List dataList = (List) getListFromHash(taskId); + + if (dataList == null || dataList.isEmpty()) { + return null; + } + + T latestItem = dataList.get(0); + Object latestTime = getCreateTimeFromObject(latestItem); + + for (int i = 1; i < dataList.size(); i++) { + T currentItem = dataList.get(i); + Object currentTime = getCreateTimeFromObject(currentItem); + + if (currentTime instanceof Comparable && latestTime instanceof Comparable) { + Comparable currentComparable = (Comparable) currentTime; + Comparable latestComparable = (Comparable) latestTime; + + if (currentComparable.compareTo(latestComparable) > 0) { + latestItem = currentItem; + latestTime = currentTime; + } + } + } + return latestItem; + } + + /** + * 删除整个taskId对应的缓存 + */ + public void deleteTaskData(String taskId) { + String hashKey = generateHashKey(taskId); + redisTemplate.opsForHash().delete(TRAFFIC_DATA_HASH_KEY, hashKey); + } + + /** + * 检查taskId是否存在缓存 + */ + public boolean hasTaskData(String taskId) { + String hashKey = generateHashKey(taskId); + return redisTemplate.opsForHash().hasKey(TRAFFIC_DATA_HASH_KEY, hashKey); + } + + /** + * 获取所有已缓存的taskId列表 + */ + public Set getAllCachedTaskIds() { + return redisTemplate.opsForHash().keys(TRAFFIC_DATA_HASH_KEY); + } + + /** + * 设置整个Hash的过期时间 + */ + public void setExpire(long timeout, TimeUnit unit) { + redisTemplate.expire(TRAFFIC_DATA_HASH_KEY, timeout, unit); + } + + /** + * 获取Hash中所有数据的总数 + */ + public long getTotalSize() { + return redisTemplate.opsForHash().size(TRAFFIC_DATA_HASH_KEY); + } + + /** + * 从对象中提取createTime字段值 + */ + public Object getCreateTimeFromObject(T item) { + if (item == null) { + return null; + } + + try { + // 尝试通过反射获取createTime字段 + java.lang.reflect.Field createTimeField = item.getClass().getDeclaredField("createTime"); + createTimeField.setAccessible(true); + return createTimeField.get(item); + } catch (NoSuchFieldException e) { + // 如果字段名不是createTime,尝试常见的时间字段名 + String[] timeFieldNames = {"createTime", "create_time", "createdTime", "timestamp", "createAt"}; + for (String fieldName : timeFieldNames) { + try { + java.lang.reflect.Field timeField = item.getClass().getDeclaredField(fieldName); + timeField.setAccessible(true); + return timeField.get(item); + } catch (Exception ex) { + // 继续尝试下一个字段名 + } + } + return null; + } catch (Exception e) { + return null; + } + } + + private String generateHashKey(String taskId) { + return "task:" + taskId; + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/AllInterfaceNameMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/AllInterfaceNameMapper.xml index cfee62b..8b93050 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/AllInterfaceNameMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/AllInterfaceNameMapper.xml @@ -198,13 +198,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + SELECT + sum(ifnull(out_speed,0)) AS outSpeed, + create_time AS createTime + FROM ${tableName} + + + and business_id = #{businessId} + + + and create_time >= #{startTime} + + + and create_time <= #{endTime} + + + and client_id in + + #{clientId} + + + + group by create_time + ORDER BY out_speed desc + \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/EpsTaskStatisticsMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/EpsTaskStatisticsMapper.xml new file mode 100644 index 0000000..1b7efe9 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/EpsTaskStatisticsMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select id, task_name, business_code, business_name, start_time, end_time, percentile_95, monthly_avg_percentile_95, resource_type, included_resources, calculation_type, calculation_mode, task_status, create_time, update_time, create_by, update_by from eps_task_statistics + + + + + + + + insert into eps_task_statistics + + task_name, + business_code, + business_name, + start_time, + end_time, + percentile_95, + monthly_avg_percentile_95, + resource_type, + included_resources, + calculation_type, + calculation_mode, + task_status, + create_time, + update_time, + create_by, + update_by, + + + #{taskName}, + #{businessCode}, + #{businessName}, + #{startTime}, + #{endTime}, + #{percentile95}, + #{monthlyAvgPercentile95}, + #{resourceType}, + #{includedResources}, + #{calculationType}, + #{calculationMode}, + #{taskStatus}, + #{createTime}, + #{updateTime}, + #{createBy}, + #{updateBy}, + + + + + update eps_task_statistics + + task_name = #{taskName}, + business_code = #{businessCode}, + business_name = #{businessName}, + start_time = #{startTime}, + end_time = #{endTime}, + percentile_95 = #{percentile95}, + monthly_avg_percentile_95 = #{monthlyAvgPercentile95}, + resource_type = #{resourceType}, + included_resources = #{includedResources}, + calculation_type = #{calculationType}, + calculation_mode = #{calculationMode}, + task_status = #{taskStatus}, + create_time = #{createTime}, + update_time = #{updateTime}, + create_by = #{createBy}, + update_by = #{updateBy}, + + where id = #{id} + + + + delete from eps_task_statistics where id = #{id} + + + + delete from eps_task_statistics where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/InitialSwitchInfoDetailsMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/InitialSwitchInfoDetailsMapper.xml index ed5cf54..d13489c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/InitialSwitchInfoDetailsMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/InitialSwitchInfoDetailsMapper.xml @@ -298,4 +298,56 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ) + + \ No newline at end of file diff --git a/ruoyi-rocketmq/src/main/java/com/ruoyi/rocketmq/handler/DeviceMessageHandler.java b/ruoyi-rocketmq/src/main/java/com/ruoyi/rocketmq/handler/DeviceMessageHandler.java index 958f353..d9bef3c 100644 --- a/ruoyi-rocketmq/src/main/java/com/ruoyi/rocketmq/handler/DeviceMessageHandler.java +++ b/ruoyi-rocketmq/src/main/java/com/ruoyi/rocketmq/handler/DeviceMessageHandler.java @@ -128,6 +128,7 @@ public class DeviceMessageHandler { registerHandler(MsgEnum.心跳上报.getValue(), this::handleHeartbeatMessage); } + /** * agent更新响应 * @param message @@ -475,6 +476,13 @@ public class DeviceMessageHandler { private void handleSwitchNetMessage(CollectDataVo switchDataVo, String clientId) { List switchInfos = SwitchJsonDataParser.parseJsonData(switchDataVo.getValue(), InitialSwitchInfo.class); if(!switchInfos.isEmpty()){ + // 根据clientId查询交换机ip + RmResourceRegistrationRemote queryParam = new RmResourceRegistrationRemote(); + queryParam.setHardwareSn(clientId); + R registMsgR = remoteRevenueConfigService.getListByHardwareSn(queryParam, SecurityConstants.INNER); + if(registMsgR != null){ + RmResourceRegistrationRemote registMsg = registMsgR.getData(); + } // 时间戳转换 long timestamp = switchDataVo.getTimestamp(); long millis = timestamp * 1000; @@ -500,6 +508,9 @@ public class DeviceMessageHandler { switchInfos.forEach(switchInfo -> { switchInfo.setClientId(clientId); switchInfo.setCreateTime(createTime); + if(registMsgR != null && registMsgR.getData()!=null && registMsgR.getData().getSnmpCollectAddr()!=null){ + switchInfo.setSwitchIp(registMsgR.getData().getSnmpCollectAddr()); + } InitialSwitchInfoTemp tempInfo = tempMap.get(switchInfo.getName()); if (tempInfo != null) { // 计算inSpeed @@ -523,6 +534,9 @@ public class DeviceMessageHandler { switchInfos.forEach(switchInfo -> { switchInfo.setClientId(clientId); switchInfo.setCreateTime(createTime); + if(registMsgR != null && registMsgR.getData()!=null && registMsgR.getData().getSnmpCollectAddr()!=null){ + switchInfo.setSwitchIp(registMsgR.getData().getSnmpCollectAddr()); + } }); } // 清空临时表对应switch信息 @@ -723,9 +737,7 @@ public class DeviceMessageHandler { log.info("开启更新资源状态========"); RmResourceRegistrationRemote rmResourceRegistrationRemote = new RmResourceRegistrationRemote(); rmResourceRegistrationRemote.setOnlineStatus(status); - if("0".equals(status)){ - rmResourceRegistrationRemote.setRegistrationStatus(status); - } + rmResourceRegistrationRemote.setRegistrationStatus(status); rmResourceRegistrationRemote.setHardwareSn(clientId); remoteRevenueConfigService.updateStatusByResource(rmResourceRegistrationRemote, SecurityConstants.INNER); }