2
0

feat: add cdr schedule task

This commit is contained in:
caiyuchao
2024-12-10 11:07:17 +08:00
parent 95d4b02aad
commit b1848e3ab3
17 changed files with 277 additions and 30 deletions

View File

@@ -70,6 +70,11 @@
<groupId>org.wfc</groupId>
<artifactId>wfc-common-swagger</artifactId>
</dependency>
<dependency>
<groupId>org.wfc</groupId>
<artifactId>wfc-api-user</artifactId>
</dependency>
</dependencies>

View File

@@ -0,0 +1,25 @@
package org.wfc.job.task;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.wfc.user.api.RemoteUUserService;
/**
* @description: 话单信息任务
* @author: cyc
* @since: 2024-12-10
*/
@Slf4j
@Component("cdrInfoTask")
public class CdrInfoTask {
@Autowired
private RemoteUUserService remoteUUserService;
public void addCdrInfo() {
log.info("开始执行话单信息任务");
remoteUUserService.addCdrInfoByOmadaApi();
log.info("话单信息任务执行成功");
}
}

View File

@@ -1,7 +1,11 @@
package org.wfc.user.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.wfc.common.core.domain.R;
import org.wfc.user.service.IUCdrService;
/**
* <p>
@@ -15,4 +19,16 @@ import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/user/uCdr")
public class UCdrController {
@Autowired
private IUCdrService cdrService;
/**
* 添加话单信息通过OmadaApi
*/
@GetMapping("/addCdrInfo")
public R<Boolean> addCdrInfoByOmadaApi() {
cdrService.addCdrInfoByOmadaApi();
return R.ok(true);
}
}

View File

@@ -2,8 +2,9 @@ package org.wfc.user.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.wfc.common.mybatis.domain.BaseData;
/**
@@ -14,8 +15,9 @@ import org.wfc.common.mybatis.domain.BaseData;
* @author cyc
* @since 2024-12-09
*/
@Getter
@Setter
@Data
@EqualsAndHashCode(callSuper = true)
@Builder
@TableName("u_cdr")
@Schema(name = "UCdr", description = "用户平台_用户话单表")
public class UCdr extends BaseData {
@@ -35,10 +37,10 @@ public class UCdr extends BaseData {
private String ssid;
@Schema(description = "tx rate ")
private Integer rxRate;
private Long rxRate;
@Schema(description = "tx rate")
private Integer txRate;
private Long txRate;
@Schema(description = "Number of downstream packets. ")
private Long downPacket;

View File

@@ -1,12 +1,13 @@
package org.wfc.user.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import org.wfc.common.mybatis.domain.BaseData;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.wfc.common.mybatis.domain.BaseData;
import java.util.Date;
/**
* <p>
@@ -16,8 +17,9 @@ import lombok.Setter;
* @author cyc
* @since 2024-12-09
*/
@Getter
@Setter
@Data
@EqualsAndHashCode(callSuper = true)
@Builder
@TableName("u_cdr_detail")
@Schema(name = "UCdrDetail", description = "用户平台_话单明细表")
public class UCdrDetail extends BaseData {

View File

@@ -2,8 +2,9 @@ package org.wfc.user.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.wfc.common.mybatis.domain.BaseData;
/**
@@ -14,8 +15,9 @@ import org.wfc.common.mybatis.domain.BaseData;
* @author cyc
* @since 2024-12-09
*/
@Getter
@Setter
@Data
@EqualsAndHashCode(callSuper = true)
@Builder
@TableName("u_client")
@Schema(name = "UClient", description = "用户平台_用户设备表")
public class UClient extends BaseData {

View File

@@ -1,11 +1,11 @@
package org.wfc.user.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import org.wfc.common.mybatis.domain.BaseData;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.wfc.common.mybatis.domain.BaseData;
/**
* <p>
@@ -15,8 +15,9 @@ import lombok.Setter;
* @author cyc
* @since 2024-12-09
*/
@Getter
@Setter
@Data
@EqualsAndHashCode(callSuper = true)
@Builder
@TableName("u_device")
@Schema(name = "UDevice", description = "用户平台_AP设备表")
public class UDevice extends BaseData {

View File

@@ -13,4 +13,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IUCdrService extends IService<UCdr> {
void addCdrInfoByOmadaApi();
}

View File

@@ -1,10 +1,35 @@
package org.wfc.user.service.impl;
import org.wfc.user.domain.UCdr;
import org.wfc.user.mapper.UCdrMapper;
import org.wfc.user.service.IUCdrService;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.wfc.omada.api.client.OmadaClientApi;
import org.wfc.omada.api.client.OmadaClientInsightApi;
import org.wfc.omada.api.client.model.ClientHistoryInfo;
import org.wfc.omada.api.client.model.ClientInfo;
import org.wfc.omada.api.client.model.OperationResponseClientGridVoClientInfo;
import org.wfc.omada.api.client.model.OperationResponseGridVoClientHistoryInfo;
import org.wfc.omada.api.device.OmadaDeviceApi;
import org.wfc.omada.api.device.model.DeviceInfo;
import org.wfc.omada.api.device.model.OperationResponseGridVoDeviceInfo;
import org.wfc.omada.api.organization.OmadaSiteApi;
import org.wfc.omada.api.organization.model.OperationResponseGridVoSiteSummaryInfo;
import org.wfc.omada.api.organization.model.SiteSummaryInfo;
import org.wfc.user.domain.UCdr;
import org.wfc.user.domain.UCdrDetail;
import org.wfc.user.domain.UClient;
import org.wfc.user.domain.UDevice;
import org.wfc.user.mapper.UCdrMapper;
import org.wfc.user.service.IUCdrDetailService;
import org.wfc.user.service.IUCdrService;
import org.wfc.user.service.IUClientService;
import org.wfc.user.service.IUDeviceService;
import java.util.Date;
import java.util.List;
/**
* <p>
@@ -17,4 +42,139 @@ import org.springframework.stereotype.Service;
@Service
public class UCdrServiceImpl extends ServiceImpl<UCdrMapper, UCdr> implements IUCdrService {
@Autowired
private OmadaSiteApi omadaSiteApi;
@Autowired
private OmadaDeviceApi omadaDeviceApi;
@Autowired
private OmadaClientApi omadaClientApi;
@Autowired
private OmadaClientInsightApi omadaClientInsightApi;
@Autowired
private IUDeviceService deviceService;
@Autowired
private IUClientService clientService;
@Autowired
private IUCdrDetailService cdrDetailService;
@Override
public void addCdrInfoByOmadaApi() {
ResponseEntity<OperationResponseGridVoSiteSummaryInfo> siteResp = omadaSiteApi.getSiteList(1, 1000);
if (ObjectUtil.isNull(siteResp.getBody())) {
return;
}
List<SiteSummaryInfo> sites = siteResp.getBody().getResult().getData();
// 添加AP设备
addDevices(sites);
for (SiteSummaryInfo site : sites) {
ResponseEntity<OperationResponseClientGridVoClientInfo> clientResp = omadaClientApi.getGridActiveClients(site.getSiteId(), 1, 1000);
if (ObjectUtil.isNull(clientResp.getBody())) {
continue;
}
List<ClientInfo> clients = clientResp.getBody().getResult().getData();
for (ClientInfo client : clients) {
// 添加用户设备
Long clientId = addClient(client);
// 添加话单
Long cdrId = addCdr(client, clientId);
// 添加话单明细
addCdrDetail(site, client, cdrId);
}
}
}
private void addCdrDetail(SiteSummaryInfo site, ClientInfo client, Long cdrId) {
// 话单明细
ResponseEntity<OperationResponseGridVoClientHistoryInfo> pastConnResp = omadaClientInsightApi.getGridPastConnections(site.getSiteId(), 1, 1000, client.getMac());
if (ObjectUtil.isNull(pastConnResp.getBody())) {
return;
}
List<ClientHistoryInfo> pastConns = pastConnResp.getBody().getResult().getData();
for (ClientHistoryInfo pastConn : pastConns) {
UCdrDetail uCdrDetail = cdrDetailService.getOne(Wrappers.<UCdrDetail>lambdaQuery().eq(UCdrDetail::getCdrId, cdrId).eq(UCdrDetail::getStartTime, pastConn.getFirstSeen()), false);
if (ObjectUtil.isNotNull(uCdrDetail)) {
continue;
}
UCdrDetail uCdrDetail1 = UCdrDetail.builder().cdrId(cdrId).startTime(new Date(pastConn.getFirstSeen()))
.endTime(new Date(pastConn.getLastSeen()))
.trafficUp(pastConn.getUpload())
.trafficDown(pastConn.getDownload())
.duration(pastConn.getDuration())
.build();
cdrDetailService.save(uCdrDetail1);
}
}
private Long addCdr(ClientInfo client, Long clientId) {
// 话单
UCdr hasUCdr = this.getOne(Wrappers.<UCdr>lambdaQuery().eq(UCdr::getClientId, clientId), false);
Long cdrId;
if (ObjectUtil.isNull(hasUCdr)) {
UDevice hasDevice = deviceService.getOne(Wrappers.<UDevice>lambdaQuery().eq(UDevice::getDeviceMac, client.getApMac()), false);
UCdr uCdr = UCdr.builder().clientId(clientId)
.deviceId(hasDevice.getId())
.ssid(client.getSsid())
.rxRate(client.getRxRate())
.txRate(client.getTxRate())
.lastSeenTime(client.getLastSeen())
.upTime(client.getUptime())
.upPacket(client.getUpPacket())
.downPacket(client.getDownPacket())
.trafficDown(client.getTrafficDown())
.trafficUp(client.getTrafficUp())
.build();
this.save(uCdr);
cdrId = uCdr.getId();
} else {
cdrId = hasUCdr.getId();
}
return cdrId;
}
private Long addClient(ClientInfo client) {
// 用户设备
UClient hasClient = clientService.getOne(Wrappers.<UClient>lambdaQuery().eq(UClient::getClientMac, client.getMac()), false);
Long clientId;
if (ObjectUtil.isNull(hasClient)) {
UClient uClient = UClient.builder().clientMac(client.getMac())
.clientName(client.getName())
.clientDeviceType(client.getDeviceType())
.build();
clientService.save(uClient);
clientId = uClient.getId();
} else {
clientId = hasClient.getId();
}
return clientId;
}
private void addDevices(List<SiteSummaryInfo> sites) {
// ap设备
for (SiteSummaryInfo site : sites) {
ResponseEntity<OperationResponseGridVoDeviceInfo> deviceResp = omadaDeviceApi.getDeviceList(site.getSiteId(), 1, 1000);
if (ObjectUtil.isNull(deviceResp.getBody())) {
return;
}
List<DeviceInfo> devices = deviceResp.getBody().getResult().getData();
for (DeviceInfo device : devices) {
UDevice hasUDevice = deviceService.getOne(Wrappers.<UDevice>lambdaQuery().eq(UDevice::getDeviceMac, device.getMac()), false);
if (ObjectUtil.isNotNull(hasUDevice)) {
continue;
}
UDevice uDevice = UDevice.builder().deviceIp(device.getIp())
.deviceMac(device.getMac())
.deviceName(device.getName())
.deviceModel(device.getModel())
.build();
deviceService.save(uDevice);
}
}
}
}

View File

@@ -3,7 +3,7 @@ package org.wfc.user;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.wfc.user.service.IUClientService;
import org.wfc.user.service.IUCdrService;
/**
* @description: 设备单元测试
@@ -14,10 +14,11 @@ import org.wfc.user.service.IUClientService;
public class UClientTest {
@Autowired
private IUClientService clientService;
private IUCdrService cdrService;
@Test
public void test() {
cdrService.test();
}
}