金山云服务API调用并入库,交换机管理功能新增

This commit is contained in:
gaoyutao
2025-10-10 18:17:53 +08:00
parent 7b5c782079
commit 6ffdf8d355
31 changed files with 2176 additions and 99 deletions
@@ -0,0 +1,259 @@
package com.ruoyi.system.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.system.domain.EpsInitialTrafficData;
import com.ruoyi.system.domain.RmRegistrationMachine;
import com.ruoyi.system.service.EpsInitialTrafficDataService;
import com.ruoyi.system.service.IRmRegistrationMachineService;
import com.ruoyi.system.util.TableRouterUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.math.BigDecimal;
import java.net.URI;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@Component
public class HmacScheduledTask {
private static final String MAC_NAME = "HmacSHA1";
private static final String ENCODING = "UTF-8";
@Autowired
private IRmRegistrationMachineService rmRegistrationMachineService;
@Autowired
private EpsInitialTrafficDataService epsInitialTrafficDataService;
/**
* 每小时执行一次,查询4小时前的数据
* 例如:9:39执行时查询4:00-5:00的数据
*/
@Scheduled(cron = "0 0 * * * ?") // 每小时整点执行
// 或者每5分钟执行一次:@Scheduled(cron = "0 */5 * * * ?")
// @Scheduled(initialDelay = 5000, fixedDelay = Long.MAX_VALUE)
public void executeHourlyTask() {
RestTemplate restTemplate = new RestTemplate();
try {
System.out.println("开始执行定时任务,时间:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
// 计算时间范围:当前时间往前推4小时的整点时间段
LocalDateTime now = LocalDateTime.now();
// 计算查询的时间段(4小时前的整点小时)
LocalDateTime queryBaseTime = now.minusHours(4);
LocalDateTime startTime = queryBaseTime.withMinute(0).withSecond(0).withNano(0);
LocalDateTime endTime = startTime.plusHours(1);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String startTimeStr = startTime.format(formatter);
String endTimeStr = endTime.format(formatter);
System.out.println("查询时间范围:" + startTimeStr + "" + endTimeStr);
long timestamp = System.currentTimeMillis();
String plainText = "efea5f0218c84a24b9fdab3264de3da5" + timestamp + "/supplier/outer/dev/getFlow";
String secretKey = getHmac(plainText, "91a73fd806ab2c005c13b4dc19130a884e909dea3f72d46e30266fe1a1f588d8");
// 设置请求头
HttpHeaders headers = new HttpHeaders();
headers.set("Content-Type", "application/json");
headers.set("TOKEN", "efea5f0218c84a24b9fdab3264de3da5");
headers.set("secret-key", secretKey);
headers.set("timestamps", String.valueOf(timestamp));
// 查询绑定的machinecode
List<RmRegistrationMachine> machineList = rmRegistrationMachineService.selectRmRegistrationMachineList(new RmRegistrationMachine());
for (RmRegistrationMachine rmRegistrationMachine : machineList) {
// 构建URL
URI uri = UriComponentsBuilder
.fromHttpUrl("https://ecscm-openapi.ksyun.com/supplier/outer/dev/getFlow")
.queryParam("srmChannel", "1000121954")
.queryParam("startTime", startTimeStr)
.queryParam("endTime", endTimeStr)
.queryParam("machineCode", rmRegistrationMachine.getMachineCode())
.build()
.toUri();
HttpEntity<String> entity = new HttpEntity<>(headers);
// GET 请求
ResponseEntity<String> response = restTemplate.exchange(
uri,
HttpMethod.GET,
entity,
String.class
);
String result = response.getBody();
// 保存流量数据
parseAndProcessResponse(result, rmRegistrationMachine.getClientId());
}
System.out.println("定时任务执行完成");
} catch (Exception e) {
System.err.println("定时任务执行失败:" + e.getMessage());
e.printStackTrace();
}
}
/**
* 解析和处理API响应
*/
private void parseAndProcessResponse(String responseBody, String clientId) {
ObjectMapper objectMapper = new ObjectMapper();
try {
Map<String, Object> responseMap = objectMapper.readValue(responseBody, Map.class);
if (responseMap.get("code").equals(200)) {
Map<String, Object> dataMap = (Map<String, Object>) responseMap.get("data");
Integer total = (Integer) dataMap.get("total");
List<Map<String, Object>> dataList = (List<Map<String, Object>>) dataMap.get("data");
System.out.println("成功获取数据,总记录数:" + total);
// 处理每条数据
for (Map<String, Object> item : dataList) {
processFlowData(item, clientId);
}
} else {
System.out.println("API返回错误:" + responseMap.get("msg"));
}
} catch (Exception e) {
System.err.println("JSON解析失败:" + e.getMessage());
}
}
/**
* 处理单条流量数据
*/
private void processFlowData(Map<String, Object> flowData, String clientId) {
String time = (String) flowData.get("time");
// 科学计数法转换为BigDecimal
BigDecimal flow = Optional.ofNullable(flowData.get("flow"))
.map(Object::toString)
.map(str -> {
try {
return new BigDecimal(str);
} catch (NumberFormatException e) {
return BigDecimal.ZERO;
}
})
.orElse(BigDecimal.ZERO);
// 字节转bit
flow = flow.multiply(new BigDecimal(8));
String flowPlain = flow.toPlainString();
String deviceid = (String) flowData.get("deviceid");
String ip = (String) flowData.get("ip");
String province = (String) flowData.get("province");
System.out.println(String.format("时间:%s, 流量:%.2f, 设备:%s, IP%s, 省份:%s",
time, flow, deviceid, ip, province));
String tableName = TableRouterUtil.getTableName(TableRouterUtil.parseDateTime(time));
EpsInitialTrafficData epsInitialTrafficData = new EpsInitialTrafficData();
epsInitialTrafficData.setTableName(tableName);
epsInitialTrafficData.setCreateTime(DateUtils.parseDate(time));
epsInitialTrafficData.setClientId(clientId);
epsInitialTrafficData.setMachineFlow(flowPlain);
epsInitialTrafficDataService.updateMachineTraffic(epsInitialTrafficData);
}
/**
* 测试方法:手动执行查询指定时间段
*/
public void manualExecuteForTimeRange(LocalDateTime start, LocalDateTime end) {
RestTemplate restTemplate = new RestTemplate();
try {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String startTimeStr = start.format(formatter);
String endTimeStr = end.format(formatter);
System.out.println("手动执行查询,时间范围:" + startTimeStr + "" + endTimeStr);
long timestamp = System.currentTimeMillis();
String plainText = "efea5f0218c84a24b9fdab3264de3da5" + timestamp + "/supplier/outer/dev/getFlow";
String secretKey = getHmac(plainText, "91a73fd806ab2c005c13b4dc19130a884e909dea3f72d46e30266fe1a1f588d8");
// 设置请求头
HttpHeaders headers = new HttpHeaders();
headers.set("Content-Type", "application/json");
headers.set("TOKEN", "efea5f0218c84a24b9fdab3264de3da5");
headers.set("secret-key", secretKey);
headers.set("timestamps", String.valueOf(timestamp));
// 构建URL
URI uri = UriComponentsBuilder
.fromHttpUrl("https://ecscm-openapi.ksyun.com/supplier/outer/dev/getFlow")
.queryParam("srmChannel", "1000121954")
.queryParam("startTime", startTimeStr)
.queryParam("endTime", endTimeStr)
.build()
.toUri();
HttpEntity<String> entity = new HttpEntity<>(headers);
// GET 请求
ResponseEntity<String> response = restTemplate.exchange(
uri,
HttpMethod.GET,
entity,
String.class
);
System.out.println("手动执行API响应结果:" + response.getBody());
} catch (Exception e) {
System.err.println("手动执行失败:" + e.getMessage());
e.printStackTrace();
}
}
/**
* HMAC加密方法
*/
public static String getHmac(String plainText, String encryptKey) {
try{
byte[] dataKey = encryptKey.getBytes(ENCODING);
byte[] dataValue = plainText.getBytes(ENCODING);
SecretKey secretKey = new SecretKeySpec(dataKey, MAC_NAME);
Mac mac = Mac.getInstance(MAC_NAME);
mac.init(secretKey);
byte[] bytes = mac.doFinal(dataValue);
String rs = encodeHex(bytes, false);
return rs;
} catch (Exception e){
throw new IllegalArgumentException(e.getMessage());
}
}
/**
* 数据转16进制编码
*/
public static String encodeHex(final byte[] data, final boolean toLowerCase) {
final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
final char[] toDigits = toLowerCase ? DIGITS_LOWER : DIGITS_UPPER;
final int l = data.length;
final char[] out = new char[l << 1];
for (int i = 0, j = 0; i < l; i++) {
out[j++] = toDigits[(0xF0 & data[i]) >>> 4];
out[j++] = toDigits[0x0F & data[i]];
}
return new String(out);
}
}
@@ -72,6 +72,26 @@ public class TableScheduleConfig {
.thenRun(() -> executeWithLog("交换机带宽1024",
() -> initialSwitchInfoDetailsService.calculateSwitch95BandwidthDaily(initialSwitchInfoDetails, dailyStartTime, dailyEndTime, "1024")));
}
// 每天5点04执行 计算金山95带宽值/日
@Scheduled(cron = "0 4 5 * * ?", zone = "Asia/Shanghai")
public void calculateJinShan95() {
// 获取昨天的日期范围(北京时间)
LocalDate yesterday = LocalDate.now(ZoneId.of("Asia/Shanghai")).minusDays(1);
String dailyStartTime = yesterday.atStartOfDay().format(TIME_FORMAT); // 00:00:00
String dailyEndTime = yesterday.atTime(23, 59, 59).format(TIME_FORMAT); // 23:59:59
// 日
String dayOrMonth = "1";
// 95带宽值/日
EpsInitialTrafficData queryParam = new EpsInitialTrafficData();
queryParam.setDayOrMonth(dayOrMonth);
InitialSwitchInfoDetails initialSwitchInfoDetails = new InitialSwitchInfoDetails();
initialSwitchInfoDetails.setDayOrMonth(dayOrMonth);
// 顺序执行链
CompletableFuture.runAsync(() -> executeWithLog("金山业务带宽1000",
() -> epsInitialTrafficDataService.calculate95ByJinShan(queryParam, dailyStartTime, dailyEndTime, "1000")))
.thenRun(() -> executeWithLog("金山业务带宽1024",
() -> epsInitialTrafficDataService.calculate95ByJinShan(queryParam, dailyStartTime, dailyEndTime, "1024")));
}
// 每月1号0点执行 计算95带宽值/月
@Scheduled(cron = "0 3 0 1 * ?", zone = "Asia/Shanghai")
@@ -0,0 +1,105 @@
package com.ruoyi.system.controller;
import java.util.List;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
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.RmRegistrationMachine;
import com.ruoyi.system.service.IRmRegistrationMachineService;
import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.utils.poi.ExcelUtil;
import com.ruoyi.common.core.web.page.TableDataInfo;
/**
* 绑定金山machinecodeController
*
* @author gyt
* @date 2025-10-10
*/
@RestController
@RequestMapping("/machine")
public class RmRegistrationMachineController extends BaseController
{
@Autowired
private IRmRegistrationMachineService rmRegistrationMachineService;
/**
* 查询绑定金山machinecode列表
*/
@RequiresPermissions("system:machine:list")
@GetMapping("/list")
public TableDataInfo list(RmRegistrationMachine rmRegistrationMachine)
{
startPage();
List<RmRegistrationMachine> list = rmRegistrationMachineService.selectRmRegistrationMachineList(rmRegistrationMachine);
return getDataTable(list);
}
/**
* 导出绑定金山machinecode列表
*/
@RequiresPermissions("system:machine:export")
@Log(title = "绑定金山machinecode", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, RmRegistrationMachine rmRegistrationMachine)
{
List<RmRegistrationMachine> list = rmRegistrationMachineService.selectRmRegistrationMachineList(rmRegistrationMachine);
ExcelUtil<RmRegistrationMachine> util = new ExcelUtil<RmRegistrationMachine>(RmRegistrationMachine.class);
util.exportExcel(response, list, "绑定金山machinecode数据");
}
/**
* 获取绑定金山machinecode详细信息
*/
@RequiresPermissions("system:machine:query")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(rmRegistrationMachineService.selectRmRegistrationMachineById(id));
}
/**
* 新增绑定金山machinecode
*/
@RequiresPermissions("system:machine:add")
@Log(title = "绑定金山machinecode", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody RmRegistrationMachine rmRegistrationMachine)
{
return toAjax(rmRegistrationMachineService.insertRmRegistrationMachine(rmRegistrationMachine));
}
/**
* 修改绑定金山machinecode
*/
@RequiresPermissions("system:machine:edit")
@Log(title = "绑定金山machinecode", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody RmRegistrationMachine rmRegistrationMachine)
{
return toAjax(rmRegistrationMachineService.updateRmRegistrationMachine(rmRegistrationMachine));
}
/**
* 删除绑定金山machinecode
*/
@RequiresPermissions("system:machine:remove")
@Log(title = "绑定金山machinecode", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
return toAjax(rmRegistrationMachineService.deleteRmRegistrationMachineByIds(ids));
}
}
@@ -0,0 +1,105 @@
package com.ruoyi.system.controller;
import java.util.List;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
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.RmSwitchInterfaceInfo;
import com.ruoyi.system.service.IRmSwitchInterfaceInfoService;
import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.utils.poi.ExcelUtil;
import com.ruoyi.common.core.web.page.TableDataInfo;
/**
* 交换机接口信息Controller
*
* @author gyt
* @date 2025-10-10
*/
@RestController
@RequestMapping("/switchInterfaceInfo")
public class RmSwitchInterfaceInfoController extends BaseController
{
@Autowired
private IRmSwitchInterfaceInfoService rmSwitchInterfaceInfoService;
/**
* 查询交换机接口信息列表
*/
@RequiresPermissions("system:switchInterfaceInfo:list")
@GetMapping("/list")
public TableDataInfo list(RmSwitchInterfaceInfo rmSwitchInterfaceInfo)
{
startPage();
List<RmSwitchInterfaceInfo> list = rmSwitchInterfaceInfoService.selectRmSwitchInterfaceInfoList(rmSwitchInterfaceInfo);
return getDataTable(list);
}
/**
* 导出交换机接口信息列表
*/
@RequiresPermissions("system:switchInterfaceInfo:export")
@Log(title = "交换机接口信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, RmSwitchInterfaceInfo rmSwitchInterfaceInfo)
{
List<RmSwitchInterfaceInfo> list = rmSwitchInterfaceInfoService.selectRmSwitchInterfaceInfoList(rmSwitchInterfaceInfo);
ExcelUtil<RmSwitchInterfaceInfo> util = new ExcelUtil<RmSwitchInterfaceInfo>(RmSwitchInterfaceInfo.class);
util.exportExcel(response, list, "交换机接口信息数据");
}
/**
* 获取交换机接口信息详细信息
*/
@RequiresPermissions("system:switchInterfaceInfo:query")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(rmSwitchInterfaceInfoService.selectRmSwitchInterfaceInfoById(id));
}
/**
* 新增交换机接口信息
*/
@RequiresPermissions("system:switchInterfaceInfo:add")
@Log(title = "交换机接口信息", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody RmSwitchInterfaceInfo rmSwitchInterfaceInfo)
{
return toAjax(rmSwitchInterfaceInfoService.insertRmSwitchInterfaceInfo(rmSwitchInterfaceInfo));
}
/**
* 修改交换机接口信息
*/
@RequiresPermissions("system:switchInterfaceInfo:edit")
@Log(title = "交换机接口信息", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody RmSwitchInterfaceInfo rmSwitchInterfaceInfo)
{
return toAjax(rmSwitchInterfaceInfoService.updateRmSwitchInterfaceInfo(rmSwitchInterfaceInfo));
}
/**
* 删除交换机接口信息
*/
@RequiresPermissions("system:switchInterfaceInfo:remove")
@Log(title = "交换机接口信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
return toAjax(rmSwitchInterfaceInfoService.deleteRmSwitchInterfaceInfoByIds(ids));
}
}
@@ -0,0 +1,103 @@
package com.ruoyi.system.controller;
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.RmSwitchManagement;
import com.ruoyi.system.service.IRmSwitchManagementService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 交换机管理Controller
*
* @author gyt
* @date 2025-10-10
*/
@RestController
@RequestMapping("/switchManagement")
public class RmSwitchManagementController extends BaseController
{
@Autowired
private IRmSwitchManagementService rmSwitchManagementService;
/**
* 查询交换机管理列表
*/
@RequiresPermissions("system:switchManagement:list")
@PostMapping("/list")
public TableDataInfo list(RmSwitchManagement rmSwitchManagement)
{
PageDomain pageDomain = new PageDomain();
pageDomain.setPageNum(rmSwitchManagement.getPageNum());
pageDomain.setPageSize(rmSwitchManagement.getPageSize());
startPage(pageDomain);
List<RmSwitchManagement> list = rmSwitchManagementService.selectRmSwitchManagementList(rmSwitchManagement);
return getDataTable(list);
}
/**
* 导出交换机管理列表
*/
@RequiresPermissions("system:switchManagement:export")
@Log(title = "交换机管理", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, RmSwitchManagement rmSwitchManagement)
{
List<RmSwitchManagement> list = rmSwitchManagementService.selectRmSwitchManagementList(rmSwitchManagement);
ExcelUtil<RmSwitchManagement> util = new ExcelUtil<RmSwitchManagement>(RmSwitchManagement.class);
util.showColumn(rmSwitchManagement.getProperties());
util.exportExcel(response, list, "交换机管理数据");
}
/**
* 获取交换机管理详细信息
*/
@RequiresPermissions("system:switchManagement:query")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(rmSwitchManagementService.selectRmSwitchManagementById(id));
}
/**
* 新增交换机管理
*/
@RequiresPermissions("system:switchManagement:add")
@Log(title = "交换机管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody RmSwitchManagement rmSwitchManagement)
{
return toAjax(rmSwitchManagementService.insertRmSwitchManagement(rmSwitchManagement));
}
/**
* 修改交换机管理
*/
@RequiresPermissions("system:switchManagement:edit")
@Log(title = "交换机管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody RmSwitchManagement rmSwitchManagement)
{
return toAjax(rmSwitchManagementService.updateRmSwitchManagement(rmSwitchManagement));
}
/**
* 删除交换机管理
*/
@RequiresPermissions("system:switchManagement:remove")
@Log(title = "交换机管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
return toAjax(rmSwitchManagementService.deleteRmSwitchManagementByIds(ids));
}
}
@@ -110,6 +110,8 @@ public class EpsInitialTrafficData extends BaseEntity {
private String bandwidthType;
/** 日或月 */
private String dayOrMonth;
/** 金山流量 */
private String machineFlow;
}
@@ -71,6 +71,8 @@ public class EpsNodeBandwidth extends BaseEntity
/** 有效-月均95值 */
@Excel(name = "有效-月均95值")
private BigDecimal effectiveAvgMonthlyBandwidth95;
/** 金山流量Mbps/日 */
private BigDecimal machineFlow;
/** 设备业务客户id */
@Excel(name = "设备业务客户id")
@@ -0,0 +1,71 @@
package com.ruoyi.system.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.core.annotation.Excel;
import com.ruoyi.common.core.web.domain.BaseEntity;
/**
* 绑定金山machinecode对象 rm_registration_machine
*
* @author gyt
* @date 2025-10-10
*/
public class RmRegistrationMachine extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键ID */
private Long id;
/** 客户端ID */
@Excel(name = "客户端ID")
private String clientId;
/** 机器码 */
@Excel(name = "机器码")
private String machineCode;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setClientId(String clientId)
{
this.clientId = clientId;
}
public String getClientId()
{
return clientId;
}
public void setMachineCode(String machineCode)
{
this.machineCode = machineCode;
}
public String getMachineCode()
{
return machineCode;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("clientId", getClientId())
.append("machineCode", getMachineCode())
.append("createTime", getCreateTime())
.append("updateTime", getUpdateTime())
.append("createBy", getCreateBy())
.append("updateBy", getUpdateBy())
.toString();
}
}
@@ -0,0 +1,101 @@
package com.ruoyi.system.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.core.annotation.Excel;
import com.ruoyi.common.core.web.domain.BaseEntity;
/**
* 交换机接口信息对象 rm_switch_interface_info
*
* @author gyt
* @date 2025-10-10
*/
public class RmSwitchInterfaceInfo extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键ID */
private Long id;
/** 硬件SN序列号 */
@Excel(name = "硬件SN序列号")
private String hardwareSn;
/** 交换机名称 */
@Excel(name = "交换机名称")
private String switchName;
/** 交换机接口名称 */
@Excel(name = "交换机接口名称")
private String interfaceName;
/** 接口备注 */
@Excel(name = "接口备注")
private String interfaceRemark;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setHardwareSn(String hardwareSn)
{
this.hardwareSn = hardwareSn;
}
public String getHardwareSn()
{
return hardwareSn;
}
public void setSwitchName(String switchName)
{
this.switchName = switchName;
}
public String getSwitchName()
{
return switchName;
}
public void setInterfaceName(String interfaceName)
{
this.interfaceName = interfaceName;
}
public String getInterfaceName()
{
return interfaceName;
}
public void setInterfaceRemark(String interfaceRemark)
{
this.interfaceRemark = interfaceRemark;
}
public String getInterfaceRemark()
{
return interfaceRemark;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("hardwareSn", getHardwareSn())
.append("switchName", getSwitchName())
.append("interfaceName", getInterfaceName())
.append("interfaceRemark", getInterfaceRemark())
.append("createTime", getCreateTime())
.append("updateTime", getUpdateTime())
.append("createBy", getCreateBy())
.append("updateBy", getUpdateBy())
.toString();
}
}
@@ -0,0 +1,251 @@
package com.ruoyi.system.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.core.annotation.Excel;
import com.ruoyi.common.core.web.domain.BaseEntity;
/**
* 交换机管理对象 rm_switch_management
*
* @author gyt
* @date 2025-10-10
*/
public class RmSwitchManagement extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键ID */
private Long id;
/** 交换机名称 */
@Excel(name = "交换机名称")
private String switchName;
/** 硬件SN序列号 */
@Excel(name = "硬件SN序列号")
private String hardwareSn;
/** SNMP采集地址 */
@Excel(name = "SNMP采集地址")
private String snmpAddress;
/** SNMP采集端口 */
@Excel(name = "SNMP采集端口")
private Long snmpPort;
/** 在线状态(0-离线,1-在线) */
@Excel(name = "在线状态(0-离线,1-在线)")
private Integer onlineStatus;
/** 心跳监测次数 */
@Excel(name = "心跳监测次数")
private Long heartbeatCount;
/** 心跳监测周期(秒) */
@Excel(name = "心跳监测周期(秒)")
private Long heartbeatInterval;
/** 心跳检测OID */
@Excel(name = "心跳检测OID")
private String heartbeatOid;
/** SNMP版本(v1/v2c/v3) */
@Excel(name = "SNMP版本(v1/v2c/v3)")
private String snmpVersion;
/** 读写权限 */
@Excel(name = "读写权限")
private String readWritePermission;
/** 安全级别 */
@Excel(name = "安全级别")
private String securityLevel;
/** 加密方式 */
@Excel(name = "加密方式")
private String encryptionMethod;
/** 团体名称 */
@Excel(name = "团体名称")
private String communityName;
/** 密码 */
@Excel(name = "密码")
private String switchPassword;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setSwitchName(String switchName)
{
this.switchName = switchName;
}
public String getSwitchName()
{
return switchName;
}
public void setHardwareSn(String hardwareSn)
{
this.hardwareSn = hardwareSn;
}
public String getHardwareSn()
{
return hardwareSn;
}
public void setSnmpAddress(String snmpAddress)
{
this.snmpAddress = snmpAddress;
}
public String getSnmpAddress()
{
return snmpAddress;
}
public void setSnmpPort(Long snmpPort)
{
this.snmpPort = snmpPort;
}
public Long getSnmpPort()
{
return snmpPort;
}
public void setOnlineStatus(Integer onlineStatus)
{
this.onlineStatus = onlineStatus;
}
public Integer getOnlineStatus()
{
return onlineStatus;
}
public void setHeartbeatCount(Long heartbeatCount)
{
this.heartbeatCount = heartbeatCount;
}
public Long getHeartbeatCount()
{
return heartbeatCount;
}
public void setHeartbeatInterval(Long heartbeatInterval)
{
this.heartbeatInterval = heartbeatInterval;
}
public Long getHeartbeatInterval()
{
return heartbeatInterval;
}
public void setHeartbeatOid(String heartbeatOid)
{
this.heartbeatOid = heartbeatOid;
}
public String getHeartbeatOid()
{
return heartbeatOid;
}
public void setSnmpVersion(String snmpVersion)
{
this.snmpVersion = snmpVersion;
}
public String getSnmpVersion()
{
return snmpVersion;
}
public void setReadWritePermission(String readWritePermission)
{
this.readWritePermission = readWritePermission;
}
public String getReadWritePermission()
{
return readWritePermission;
}
public void setSecurityLevel(String securityLevel)
{
this.securityLevel = securityLevel;
}
public String getSecurityLevel()
{
return securityLevel;
}
public void setEncryptionMethod(String encryptionMethod)
{
this.encryptionMethod = encryptionMethod;
}
public String getEncryptionMethod()
{
return encryptionMethod;
}
public void setCommunityName(String communityName)
{
this.communityName = communityName;
}
public String getCommunityName()
{
return communityName;
}
public void setSwitchPassword(String switchPassword)
{
this.switchPassword = switchPassword;
}
public String getSwitchPassword()
{
return switchPassword;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("switchName", getSwitchName())
.append("hardwareSn", getHardwareSn())
.append("snmpAddress", getSnmpAddress())
.append("snmpPort", getSnmpPort())
.append("onlineStatus", getOnlineStatus())
.append("heartbeatCount", getHeartbeatCount())
.append("heartbeatInterval", getHeartbeatInterval())
.append("heartbeatOid", getHeartbeatOid())
.append("snmpVersion", getSnmpVersion())
.append("readWritePermission", getReadWritePermission())
.append("securityLevel", getSecurityLevel())
.append("encryptionMethod", getEncryptionMethod())
.append("communityName", getCommunityName())
.append("switchPassword", getSwitchPassword())
.append("createTime", getCreateTime())
.append("updateTime", getUpdateTime())
.append("createBy", getCreateBy())
.append("updateBy", getUpdateBy())
.toString();
}
}
@@ -41,4 +41,10 @@ public interface EpsInitialTrafficDataMapper {
*/
List<EpsInitialTrafficData> getAllTraficMsg(EpsInitialTrafficData condition);
/**
* 保存金山流量信息
* @param epsInitialTrafficData
* @return
*/
int updateMachineTraffic(EpsInitialTrafficData epsInitialTrafficData);
}
@@ -0,0 +1,61 @@
package com.ruoyi.system.mapper;
import java.util.List;
import com.ruoyi.system.domain.RmRegistrationMachine;
/**
* 绑定金山machinecodeMapper接口
*
* @author gyt
* @date 2025-10-10
*/
public interface RmRegistrationMachineMapper
{
/**
* 查询绑定金山machinecode
*
* @param id 绑定金山machinecode主键
* @return 绑定金山machinecode
*/
public RmRegistrationMachine selectRmRegistrationMachineById(Long id);
/**
* 查询绑定金山machinecode列表
*
* @param rmRegistrationMachine 绑定金山machinecode
* @return 绑定金山machinecode集合
*/
public List<RmRegistrationMachine> selectRmRegistrationMachineList(RmRegistrationMachine rmRegistrationMachine);
/**
* 新增绑定金山machinecode
*
* @param rmRegistrationMachine 绑定金山machinecode
* @return 结果
*/
public int insertRmRegistrationMachine(RmRegistrationMachine rmRegistrationMachine);
/**
* 修改绑定金山machinecode
*
* @param rmRegistrationMachine 绑定金山machinecode
* @return 结果
*/
public int updateRmRegistrationMachine(RmRegistrationMachine rmRegistrationMachine);
/**
* 删除绑定金山machinecode
*
* @param id 绑定金山machinecode主键
* @return 结果
*/
public int deleteRmRegistrationMachineById(Long id);
/**
* 批量删除绑定金山machinecode
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteRmRegistrationMachineByIds(Long[] ids);
}
@@ -0,0 +1,61 @@
package com.ruoyi.system.mapper;
import java.util.List;
import com.ruoyi.system.domain.RmSwitchInterfaceInfo;
/**
* 交换机接口信息Mapper接口
*
* @author gyt
* @date 2025-10-10
*/
public interface RmSwitchInterfaceInfoMapper
{
/**
* 查询交换机接口信息
*
* @param id 交换机接口信息主键
* @return 交换机接口信息
*/
public RmSwitchInterfaceInfo selectRmSwitchInterfaceInfoById(Long id);
/**
* 查询交换机接口信息列表
*
* @param rmSwitchInterfaceInfo 交换机接口信息
* @return 交换机接口信息集合
*/
public List<RmSwitchInterfaceInfo> selectRmSwitchInterfaceInfoList(RmSwitchInterfaceInfo rmSwitchInterfaceInfo);
/**
* 新增交换机接口信息
*
* @param rmSwitchInterfaceInfo 交换机接口信息
* @return 结果
*/
public int insertRmSwitchInterfaceInfo(RmSwitchInterfaceInfo rmSwitchInterfaceInfo);
/**
* 修改交换机接口信息
*
* @param rmSwitchInterfaceInfo 交换机接口信息
* @return 结果
*/
public int updateRmSwitchInterfaceInfo(RmSwitchInterfaceInfo rmSwitchInterfaceInfo);
/**
* 删除交换机接口信息
*
* @param id 交换机接口信息主键
* @return 结果
*/
public int deleteRmSwitchInterfaceInfoById(Long id);
/**
* 批量删除交换机接口信息
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteRmSwitchInterfaceInfoByIds(Long[] ids);
}
@@ -0,0 +1,61 @@
package com.ruoyi.system.mapper;
import java.util.List;
import com.ruoyi.system.domain.RmSwitchManagement;
/**
* 交换机管理Mapper接口
*
* @author gyt
* @date 2025-10-10
*/
public interface RmSwitchManagementMapper
{
/**
* 查询交换机管理
*
* @param id 交换机管理主键
* @return 交换机管理
*/
public RmSwitchManagement selectRmSwitchManagementById(Long id);
/**
* 查询交换机管理列表
*
* @param rmSwitchManagement 交换机管理
* @return 交换机管理集合
*/
public List<RmSwitchManagement> selectRmSwitchManagementList(RmSwitchManagement rmSwitchManagement);
/**
* 新增交换机管理
*
* @param rmSwitchManagement 交换机管理
* @return 结果
*/
public int insertRmSwitchManagement(RmSwitchManagement rmSwitchManagement);
/**
* 修改交换机管理
*
* @param rmSwitchManagement 交换机管理
* @return 结果
*/
public int updateRmSwitchManagement(RmSwitchManagement rmSwitchManagement);
/**
* 删除交换机管理
*
* @param id 交换机管理主键
* @return 结果
*/
public int deleteRmSwitchManagementById(Long id);
/**
* 批量删除交换机管理
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteRmSwitchManagementByIds(Long[] ids);
}
@@ -48,6 +48,12 @@ public interface EpsInitialTrafficDataService {
* @return 流量数据列表
*/
void calculateBusiness95BandwidthDaily(EpsInitialTrafficData queryParam, String dailyStartTime, String dailyEndTime, String calculationMode);
/**
* 计算95带宽值-金山带宽/日
* @param queryParam 查询参数实体
* @return 流量数据列表
*/
void calculate95ByJinShan(EpsInitialTrafficData queryParam, String dailyStartTime, String dailyEndTime, String calculationMode);
/**
* 重新计算服务器95带宽值
@@ -67,4 +73,6 @@ public interface EpsInitialTrafficDataService {
* @return
*/
BigDecimal sumTrafficByServer();
int updateMachineTraffic(EpsInitialTrafficData epsInitialTrafficData);
}
@@ -0,0 +1,61 @@
package com.ruoyi.system.service;
import java.util.List;
import com.ruoyi.system.domain.RmRegistrationMachine;
/**
* 绑定金山machinecodeService接口
*
* @author gyt
* @date 2025-10-10
*/
public interface IRmRegistrationMachineService
{
/**
* 查询绑定金山machinecode
*
* @param id 绑定金山machinecode主键
* @return 绑定金山machinecode
*/
public RmRegistrationMachine selectRmRegistrationMachineById(Long id);
/**
* 查询绑定金山machinecode列表
*
* @param rmRegistrationMachine 绑定金山machinecode
* @return 绑定金山machinecode集合
*/
public List<RmRegistrationMachine> selectRmRegistrationMachineList(RmRegistrationMachine rmRegistrationMachine);
/**
* 新增绑定金山machinecode
*
* @param rmRegistrationMachine 绑定金山machinecode
* @return 结果
*/
public int insertRmRegistrationMachine(RmRegistrationMachine rmRegistrationMachine);
/**
* 修改绑定金山machinecode
*
* @param rmRegistrationMachine 绑定金山machinecode
* @return 结果
*/
public int updateRmRegistrationMachine(RmRegistrationMachine rmRegistrationMachine);
/**
* 批量删除绑定金山machinecode
*
* @param ids 需要删除的绑定金山machinecode主键集合
* @return 结果
*/
public int deleteRmRegistrationMachineByIds(Long[] ids);
/**
* 删除绑定金山machinecode信息
*
* @param id 绑定金山machinecode主键
* @return 结果
*/
public int deleteRmRegistrationMachineById(Long id);
}
@@ -0,0 +1,61 @@
package com.ruoyi.system.service;
import java.util.List;
import com.ruoyi.system.domain.RmSwitchInterfaceInfo;
/**
* 交换机接口信息Service接口
*
* @author gyt
* @date 2025-10-10
*/
public interface IRmSwitchInterfaceInfoService
{
/**
* 查询交换机接口信息
*
* @param id 交换机接口信息主键
* @return 交换机接口信息
*/
public RmSwitchInterfaceInfo selectRmSwitchInterfaceInfoById(Long id);
/**
* 查询交换机接口信息列表
*
* @param rmSwitchInterfaceInfo 交换机接口信息
* @return 交换机接口信息集合
*/
public List<RmSwitchInterfaceInfo> selectRmSwitchInterfaceInfoList(RmSwitchInterfaceInfo rmSwitchInterfaceInfo);
/**
* 新增交换机接口信息
*
* @param rmSwitchInterfaceInfo 交换机接口信息
* @return 结果
*/
public int insertRmSwitchInterfaceInfo(RmSwitchInterfaceInfo rmSwitchInterfaceInfo);
/**
* 修改交换机接口信息
*
* @param rmSwitchInterfaceInfo 交换机接口信息
* @return 结果
*/
public int updateRmSwitchInterfaceInfo(RmSwitchInterfaceInfo rmSwitchInterfaceInfo);
/**
* 批量删除交换机接口信息
*
* @param ids 需要删除的交换机接口信息主键集合
* @return 结果
*/
public int deleteRmSwitchInterfaceInfoByIds(Long[] ids);
/**
* 删除交换机接口信息信息
*
* @param id 交换机接口信息主键
* @return 结果
*/
public int deleteRmSwitchInterfaceInfoById(Long id);
}
@@ -0,0 +1,61 @@
package com.ruoyi.system.service;
import java.util.List;
import com.ruoyi.system.domain.RmSwitchManagement;
/**
* 交换机管理Service接口
*
* @author gyt
* @date 2025-10-10
*/
public interface IRmSwitchManagementService
{
/**
* 查询交换机管理
*
* @param id 交换机管理主键
* @return 交换机管理
*/
public RmSwitchManagement selectRmSwitchManagementById(Long id);
/**
* 查询交换机管理列表
*
* @param rmSwitchManagement 交换机管理
* @return 交换机管理集合
*/
public List<RmSwitchManagement> selectRmSwitchManagementList(RmSwitchManagement rmSwitchManagement);
/**
* 新增交换机管理
*
* @param rmSwitchManagement 交换机管理
* @return 结果
*/
public int insertRmSwitchManagement(RmSwitchManagement rmSwitchManagement);
/**
* 修改交换机管理
*
* @param rmSwitchManagement 交换机管理
* @return 结果
*/
public int updateRmSwitchManagement(RmSwitchManagement rmSwitchManagement);
/**
* 批量删除交换机管理
*
* @param ids 需要删除的交换机管理主键集合
* @return 结果
*/
public int deleteRmSwitchManagementByIds(Long[] ids);
/**
* 删除交换机管理信息
*
* @param id 交换机管理主键
* @return 结果
*/
public int deleteRmSwitchManagementById(Long id);
}
@@ -226,6 +226,40 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
processDeviceBandwidth(queryParam, dailyStartTime, dailyEndTime, calculationMode);
});
}
/**
* 计算金山95带宽值/日
* @param queryParam
*/
@Override
public void calculate95ByJinShan(EpsInitialTrafficData queryParam,
String dailyStartTime, String dailyEndTime, String calculationMode) {
// 获取所有设备SN列表
List<AllInterfaceName> snList = allInterfaceNameMapper.getAllDeviceSn(new AllInterfaceName());
// 遍历处理每个设备
snList.forEach(interfaceName -> {
queryParam.setServiceSn(interfaceName.getDeviceSn());
queryParam.setStartTime(dailyStartTime);
queryParam.setEndTime(dailyEndTime);
List<EpsInitialTrafficData> dataList = query(queryParam);
if (!dataList.isEmpty()) {
// 1. 提取并转换带宽值
List<BigDecimal> speedsInMbps = dataList.stream()
.map(data -> CalculateUtil.parseSpeedToMbps(data.getMachineFlow(), calculationMode))
.sorted()
.collect(Collectors.toList());
// 2. 计算95百分位
BigDecimal percentile95 = CalculateUtil.calculatePercentile(speedsInMbps, 0.95);
// 3. 保存结果
EpsInitialTrafficData epsInitialTrafficData = dataList.get(0);
epsInitialTrafficData.setResourceType("1");
epsInitialTrafficData.setBandwidthType("8");
saveBandwidthResult(epsInitialTrafficData, percentile95, dailyStartTime, calculationMode);
}
});
}
/**
* 重新计算服务器95带宽值
@@ -343,6 +377,17 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
return total.setScale(0, RoundingMode.HALF_UP);
}
/**
* 金山流量插入数据
* @param epsInitialTrafficData
* @return
*/
@Override
public int updateMachineTraffic(EpsInitialTrafficData epsInitialTrafficData) {
int rows = epsInitialTrafficDataMapper.updateMachineTraffic(epsInitialTrafficData);
return rows;
}
/**
* 提取公共方法
* @return
@@ -599,6 +644,9 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
case "7":
bandwidth.setEffectiveAvgMonthlyBandwidth95(result);
break;
case "8":
bandwidth.setMachineFlow(result);
break;
default:
throw new IllegalArgumentException("Unknown bandwidthType: " + data.getBandwidthType());
}
@@ -0,0 +1,96 @@
package com.ruoyi.system.service.impl;
import java.util.List;
import com.ruoyi.common.core.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.RmRegistrationMachineMapper;
import com.ruoyi.system.domain.RmRegistrationMachine;
import com.ruoyi.system.service.IRmRegistrationMachineService;
/**
* 绑定金山machinecodeService业务层处理
*
* @author gyt
* @date 2025-10-10
*/
@Service
public class RmRegistrationMachineServiceImpl implements IRmRegistrationMachineService
{
@Autowired
private RmRegistrationMachineMapper rmRegistrationMachineMapper;
/**
* 查询绑定金山machinecode
*
* @param id 绑定金山machinecode主键
* @return 绑定金山machinecode
*/
@Override
public RmRegistrationMachine selectRmRegistrationMachineById(Long id)
{
return rmRegistrationMachineMapper.selectRmRegistrationMachineById(id);
}
/**
* 查询绑定金山machinecode列表
*
* @param rmRegistrationMachine 绑定金山machinecode
* @return 绑定金山machinecode
*/
@Override
public List<RmRegistrationMachine> selectRmRegistrationMachineList(RmRegistrationMachine rmRegistrationMachine)
{
return rmRegistrationMachineMapper.selectRmRegistrationMachineList(rmRegistrationMachine);
}
/**
* 新增绑定金山machinecode
*
* @param rmRegistrationMachine 绑定金山machinecode
* @return 结果
*/
@Override
public int insertRmRegistrationMachine(RmRegistrationMachine rmRegistrationMachine)
{
rmRegistrationMachine.setCreateTime(DateUtils.getNowDate());
return rmRegistrationMachineMapper.insertRmRegistrationMachine(rmRegistrationMachine);
}
/**
* 修改绑定金山machinecode
*
* @param rmRegistrationMachine 绑定金山machinecode
* @return 结果
*/
@Override
public int updateRmRegistrationMachine(RmRegistrationMachine rmRegistrationMachine)
{
rmRegistrationMachine.setUpdateTime(DateUtils.getNowDate());
return rmRegistrationMachineMapper.updateRmRegistrationMachine(rmRegistrationMachine);
}
/**
* 批量删除绑定金山machinecode
*
* @param ids 需要删除的绑定金山machinecode主键
* @return 结果
*/
@Override
public int deleteRmRegistrationMachineByIds(Long[] ids)
{
return rmRegistrationMachineMapper.deleteRmRegistrationMachineByIds(ids);
}
/**
* 删除绑定金山machinecode信息
*
* @param id 绑定金山machinecode主键
* @return 结果
*/
@Override
public int deleteRmRegistrationMachineById(Long id)
{
return rmRegistrationMachineMapper.deleteRmRegistrationMachineById(id);
}
}
@@ -0,0 +1,96 @@
package com.ruoyi.system.service.impl;
import java.util.List;
import com.ruoyi.common.core.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.RmSwitchInterfaceInfoMapper;
import com.ruoyi.system.domain.RmSwitchInterfaceInfo;
import com.ruoyi.system.service.IRmSwitchInterfaceInfoService;
/**
* 交换机接口信息Service业务层处理
*
* @author gyt
* @date 2025-10-10
*/
@Service
public class RmSwitchInterfaceInfoServiceImpl implements IRmSwitchInterfaceInfoService
{
@Autowired
private RmSwitchInterfaceInfoMapper rmSwitchInterfaceInfoMapper;
/**
* 查询交换机接口信息
*
* @param id 交换机接口信息主键
* @return 交换机接口信息
*/
@Override
public RmSwitchInterfaceInfo selectRmSwitchInterfaceInfoById(Long id)
{
return rmSwitchInterfaceInfoMapper.selectRmSwitchInterfaceInfoById(id);
}
/**
* 查询交换机接口信息列表
*
* @param rmSwitchInterfaceInfo 交换机接口信息
* @return 交换机接口信息
*/
@Override
public List<RmSwitchInterfaceInfo> selectRmSwitchInterfaceInfoList(RmSwitchInterfaceInfo rmSwitchInterfaceInfo)
{
return rmSwitchInterfaceInfoMapper.selectRmSwitchInterfaceInfoList(rmSwitchInterfaceInfo);
}
/**
* 新增交换机接口信息
*
* @param rmSwitchInterfaceInfo 交换机接口信息
* @return 结果
*/
@Override
public int insertRmSwitchInterfaceInfo(RmSwitchInterfaceInfo rmSwitchInterfaceInfo)
{
rmSwitchInterfaceInfo.setCreateTime(DateUtils.getNowDate());
return rmSwitchInterfaceInfoMapper.insertRmSwitchInterfaceInfo(rmSwitchInterfaceInfo);
}
/**
* 修改交换机接口信息
*
* @param rmSwitchInterfaceInfo 交换机接口信息
* @return 结果
*/
@Override
public int updateRmSwitchInterfaceInfo(RmSwitchInterfaceInfo rmSwitchInterfaceInfo)
{
rmSwitchInterfaceInfo.setUpdateTime(DateUtils.getNowDate());
return rmSwitchInterfaceInfoMapper.updateRmSwitchInterfaceInfo(rmSwitchInterfaceInfo);
}
/**
* 批量删除交换机接口信息
*
* @param ids 需要删除的交换机接口信息主键
* @return 结果
*/
@Override
public int deleteRmSwitchInterfaceInfoByIds(Long[] ids)
{
return rmSwitchInterfaceInfoMapper.deleteRmSwitchInterfaceInfoByIds(ids);
}
/**
* 删除交换机接口信息信息
*
* @param id 交换机接口信息主键
* @return 结果
*/
@Override
public int deleteRmSwitchInterfaceInfoById(Long id)
{
return rmSwitchInterfaceInfoMapper.deleteRmSwitchInterfaceInfoById(id);
}
}
@@ -0,0 +1,96 @@
package com.ruoyi.system.service.impl;
import java.util.List;
import com.ruoyi.common.core.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.RmSwitchManagementMapper;
import com.ruoyi.system.domain.RmSwitchManagement;
import com.ruoyi.system.service.IRmSwitchManagementService;
/**
* 交换机管理Service业务层处理
*
* @author gyt
* @date 2025-10-10
*/
@Service
public class RmSwitchManagementServiceImpl implements IRmSwitchManagementService
{
@Autowired
private RmSwitchManagementMapper rmSwitchManagementMapper;
/**
* 查询交换机管理
*
* @param id 交换机管理主键
* @return 交换机管理
*/
@Override
public RmSwitchManagement selectRmSwitchManagementById(Long id)
{
return rmSwitchManagementMapper.selectRmSwitchManagementById(id);
}
/**
* 查询交换机管理列表
*
* @param rmSwitchManagement 交换机管理
* @return 交换机管理
*/
@Override
public List<RmSwitchManagement> selectRmSwitchManagementList(RmSwitchManagement rmSwitchManagement)
{
return rmSwitchManagementMapper.selectRmSwitchManagementList(rmSwitchManagement);
}
/**
* 新增交换机管理
*
* @param rmSwitchManagement 交换机管理
* @return 结果
*/
@Override
public int insertRmSwitchManagement(RmSwitchManagement rmSwitchManagement)
{
rmSwitchManagement.setCreateTime(DateUtils.getNowDate());
return rmSwitchManagementMapper.insertRmSwitchManagement(rmSwitchManagement);
}
/**
* 修改交换机管理
*
* @param rmSwitchManagement 交换机管理
* @return 结果
*/
@Override
public int updateRmSwitchManagement(RmSwitchManagement rmSwitchManagement)
{
rmSwitchManagement.setUpdateTime(DateUtils.getNowDate());
return rmSwitchManagementMapper.updateRmSwitchManagement(rmSwitchManagement);
}
/**
* 批量删除交换机管理
*
* @param ids 需要删除的交换机管理主键
* @return 结果
*/
@Override
public int deleteRmSwitchManagementByIds(Long[] ids)
{
return rmSwitchManagementMapper.deleteRmSwitchManagementByIds(ids);
}
/**
* 删除交换机管理信息
*
* @param id 交换机管理主键
* @return 结果
*/
@Override
public int deleteRmSwitchManagementById(Long id)
{
return rmSwitchManagementMapper.deleteRmSwitchManagementById(id);
}
}
@@ -1,91 +1,115 @@
package com.ruoyi.system.util;
import com.ruoyi.common.core.utils.DateUtils;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.net.URI;
public class HmacUtils {
private static final String MAC_NAME = "HmacSHA1";
private static final String ENCODING = "UTF-8";
/**
*@param encryptKey 秘钥由中控系统分配
*@param plainText 加密内容:token + 时间戳 + URI
*/
public static String getHmac(String plainText,String encryptKey) {
try{
byte[] dataKey=encryptKey.getBytes(ENCODING);
byte[] dataValue=plainText.getBytes(ENCODING);
//根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
SecretKey secretKey = new SecretKeySpec(dataKey, MAC_NAME);
// 2、创建MAC对象
Mac mac = Mac.getInstance(MAC_NAME);
// 3、设置密钥
mac.init(secretKey);
// 4、数据加密
byte[] bytes = mac.doFinal(dataValue);
// 5、生成数据
String rs = encodeHex(bytes,false);
return rs;
}catch (Exception e){
throw new IllegalArgumentException(e.getMessage());
}
}
// 数据转16进制编码
public static String encodeHex(final byte[] data, final boolean toLowerCase) {
final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
final char[] toDigits = toLowerCase ? DIGITS_LOWER : DIGITS_UPPER;
final int l = data.length;
final char[] out = new char[l << 1];
// two characters form the hex value.
for (int i = 0, j = 0; i < l; i++) {
out[j++] = toDigits[(0xF0 & data[i]) >>> 4];
out[j++] = toDigits[0x0F & data[i]];
}
return new String(out);
}
public static void main(String[] args) {
long timestamp = DateUtils.getNowDate().getTime();
String plainText = "efea5f0218c84a24b9fdab3264de3da5" + timestamp + "/supplier/outer/dev/getFlow";
String secretKey = getHmac(plainText, "91a73fd806ab2c005c13b4dc19130a884e909dea3f72d46e30266fe1a1f588d8");
System.out.println(secretKey);
RestTemplate restTemplate = new RestTemplate();
// 设置请求头
HttpHeaders headers = new HttpHeaders();
headers.set("Content-Type", "application/json");
headers.set("TOKEN", "efea5f0218c84a24b9fdab3264de3da5");
headers.set("secret-key", secretKey);
headers.set("timestamps", String.valueOf(timestamp));
// 使用 UriComponentsBuilder 构建URL(推荐)
URI uri = UriComponentsBuilder
.fromHttpUrl("https://ecscm-openapi.ksyun.com/supplier/outer/dev/getFlow")
.queryParam("srmChannel", "1000121954")
.queryParam("startTime", "2025-10-09 00:00:00")
.queryParam("endTime", "2025-10-09 01:00:00")
.build()
.toUri();
HttpEntity<String> entity = new HttpEntity<>(headers);
// GET 请求
ResponseEntity<String> response = restTemplate.exchange(
uri,
HttpMethod.GET,
entity,
String.class
);
System.out.println(response.getBody());
}
}
//package com.ruoyi.system.util;
//
//import org.springframework.http.HttpEntity;
//import org.springframework.http.HttpHeaders;
//import org.springframework.http.HttpMethod;
//import org.springframework.http.ResponseEntity;
//import org.springframework.web.client.RestTemplate;
//import org.springframework.web.util.UriComponentsBuilder;
//
//import javax.crypto.Mac;
//import javax.crypto.SecretKey;
//import javax.crypto.spec.SecretKeySpec;
//import java.net.URI;
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//
//public class HmacUtils {
// private static final String MAC_NAME = "HmacSHA1";
// private static final String ENCODING = "UTF-8";
// /**
// *@param encryptKey 秘钥由中控系统分配
// *@param plainText 加密内容:token + 时间戳 + URI
// */
// public static String getHmac(String plainText,String encryptKey) {
// try{
// byte[] dataKey=encryptKey.getBytes(ENCODING);
// byte[] dataValue=plainText.getBytes(ENCODING);
// //根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
// SecretKey secretKey = new SecretKeySpec(dataKey, MAC_NAME);
// // 2、创建MAC对象
// Mac mac = Mac.getInstance(MAC_NAME);
// // 3、设置密钥
// mac.init(secretKey);
// // 4、数据加密
// byte[] bytes = mac.doFinal(dataValue);
// // 5、生成数据
// String rs = encodeHex(bytes,false);
// return rs;
// }catch (Exception e){
// throw new IllegalArgumentException(e.getMessage());
// }
//
// }
// // 数据转16进制编码
// public static String encodeHex(final byte[] data, final boolean toLowerCase) {
// final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
// final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
// final char[] toDigits = toLowerCase ? DIGITS_LOWER : DIGITS_UPPER;
// final int l = data.length;
// final char[] out = new char[l << 1];
// // two characters form the hex value.
// for (int i = 0, j = 0; i < l; i++) {
// out[j++] = toDigits[(0xF0 & data[i]) >>> 4];
// out[j++] = toDigits[0x0F & data[i]];
// }
// return new String(out);
// }
// public static void main(String[] args) {
// RestTemplate restTemplate = new RestTemplate();
// try {
// System.out.println("开始执行定时任务,时间:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
//
// // 计算时间范围:当前时间往前推3小时的整点时间段
// LocalDateTime now = LocalDateTime.now();
//
// // 计算查询的时间段(4小时前的整点小时)
// LocalDateTime queryBaseTime = now.minusHours(4);
// LocalDateTime startTime = queryBaseTime.withMinute(0).withSecond(0).withNano(0);
// LocalDateTime endTime = startTime.plusHours(1);
//
// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// String startTimeStr = startTime.format(formatter);
// String endTimeStr = endTime.format(formatter);
//
// System.out.println("查询时间范围:" + startTimeStr + " 至 " + endTimeStr);
//
// long timestamp = System.currentTimeMillis();
// String plainText = "efea5f0218c84a24b9fdab3264de3da5" + timestamp + "/supplier/outer/dev/getFlow";
// String secretKey = getHmac(plainText, "91a73fd806ab2c005c13b4dc19130a884e909dea3f72d46e30266fe1a1f588d8");
//
// // 设置请求
// HttpHeaders headers = new HttpHeaders();
// headers.set("Content-Type", "application/json");
// headers.set("TOKEN", "efea5f0218c84a24b9fdab3264de3da5");
// headers.set("secret-key", secretKey);
// headers.set("timestamps", String.valueOf(timestamp));
//
// // 构建URL
// URI uri = UriComponentsBuilder
// .fromHttpUrl("https://ecscm-openapi.ksyun.com/supplier/outer/dev/getFlow")
// .queryParam("srmChannel", "1000121954")
// .queryParam("startTime", startTimeStr)
// .queryParam("endTime", endTimeStr)
// .build()
// .toUri();
//
// HttpEntity<String> entity = new HttpEntity<>(headers);
//
// // GET 请求
// ResponseEntity<String> response = restTemplate.exchange(
// uri,
// HttpMethod.GET,
// entity,
// String.class
// );
//
// System.out.println("API响应结果:" + response.getBody());
// System.out.println("定时任务执行完成");
//
// } catch (Exception e) {
// System.err.println("定时任务执行失败:" + e.getMessage());
// e.printStackTrace();
// }
// }
//}
@@ -102,7 +102,7 @@ public class TableRouterUtil {
return tableNames;
}
// 解析字符串为LocalDateTime
private static LocalDateTime parseDateTime(String dateTimeStr) {
public static LocalDateTime parseDateTime(String dateTimeStr) {
if (dateTimeStr == null || dateTimeStr.trim().isEmpty()) {
throw new IllegalArgumentException("时间字符串不能为空");
}