feat: 添加设备数限制
This commit is contained in:
@@ -8,9 +8,11 @@ import org.springframework.web.bind.annotation.PostMapping;
|
|||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
import org.wfc.common.core.domain.LoginUser;
|
||||||
import org.wfc.common.core.domain.R;
|
import org.wfc.common.core.domain.R;
|
||||||
import org.wfc.common.core.web.controller.BaseController;
|
import org.wfc.common.core.web.controller.BaseController;
|
||||||
import org.wfc.common.core.web.page.TableDataInfo;
|
import org.wfc.common.core.web.page.TableDataInfo;
|
||||||
|
import org.wfc.common.security.utils.SecurityUtils;
|
||||||
import org.wfc.user.api.domain.bo.UClientBo;
|
import org.wfc.user.api.domain.bo.UClientBo;
|
||||||
import org.wfc.user.domain.vo.UClientCurrentVo;
|
import org.wfc.user.domain.vo.UClientCurrentVo;
|
||||||
import org.wfc.user.domain.vo.UClientHistoryUserVo;
|
import org.wfc.user.domain.vo.UClientHistoryUserVo;
|
||||||
@@ -52,7 +54,9 @@ public class UClientController extends BaseController {
|
|||||||
@GetMapping("/pageCurrentClient")
|
@GetMapping("/pageCurrentClient")
|
||||||
public TableDataInfo getCurrentClients() {
|
public TableDataInfo getCurrentClients() {
|
||||||
startPage();
|
startPage();
|
||||||
List<UClientCurrentVo> result = clientService.getCurrentClients();
|
LoginUser<Object> loginUser = SecurityUtils.getLoginUser();
|
||||||
|
|
||||||
|
List<UClientCurrentVo> result = clientService.getCurrentClients(loginUser.getUserid());
|
||||||
return getDataTable(result);
|
return getDataTable(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,4 +17,5 @@ public class UClientCurrentVo {
|
|||||||
private Long trafficDown;
|
private Long trafficDown;
|
||||||
private Long trafficUp;
|
private Long trafficUp;
|
||||||
private Long activity;
|
private Long activity;
|
||||||
|
private String SiteId;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ public interface IUClientService extends IService<UClient> {
|
|||||||
|
|
||||||
boolean recordClientUser(UClientBo uClientBo);
|
boolean recordClientUser(UClientBo uClientBo);
|
||||||
|
|
||||||
List<UClientCurrentVo> getCurrentClients();
|
List<UClientCurrentVo> getCurrentClients(Long userId);
|
||||||
|
|
||||||
List<UClientHistoryUserVo> getHistoryByUser();
|
List<UClientHistoryUserVo> getHistoryByUser();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
@@ -33,17 +34,20 @@ import org.wfc.user.domain.UClient;
|
|||||||
import org.wfc.user.domain.vo.UAccountDashboardVo;
|
import org.wfc.user.domain.vo.UAccountDashboardVo;
|
||||||
import org.wfc.user.domain.vo.UCdrLatestHistoryVo;
|
import org.wfc.user.domain.vo.UCdrLatestHistoryVo;
|
||||||
import org.wfc.user.domain.vo.UCdrUserVo;
|
import org.wfc.user.domain.vo.UCdrUserVo;
|
||||||
|
import org.wfc.user.domain.vo.UClientCurrentVo;
|
||||||
import org.wfc.user.mapper.UAccountMapper;
|
import org.wfc.user.mapper.UAccountMapper;
|
||||||
import org.wfc.user.mapper.UBillMapper;
|
import org.wfc.user.mapper.UBillMapper;
|
||||||
import org.wfc.user.mapper.UBillRuleMapper;
|
import org.wfc.user.mapper.UBillRuleMapper;
|
||||||
import org.wfc.user.mapper.UCdrMapper;
|
import org.wfc.user.mapper.UCdrMapper;
|
||||||
import org.wfc.user.mapper.UClientMapper;
|
import org.wfc.user.mapper.UClientMapper;
|
||||||
import org.wfc.user.service.IUAccountService;
|
import org.wfc.user.service.IUAccountService;
|
||||||
|
import org.wfc.user.service.IUClientService;
|
||||||
import org.wfc.user.util.AccountUtil;
|
import org.wfc.user.util.AccountUtil;
|
||||||
import org.wfc.user.util.BillRuleUtil;
|
import org.wfc.user.util.BillRuleUtil;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@@ -82,6 +86,10 @@ public class UAccountServiceImpl extends ServiceImpl<UAccountMapper, UAccount> i
|
|||||||
@Autowired
|
@Autowired
|
||||||
private OmadaClientApi omadaClientApi;
|
private OmadaClientApi omadaClientApi;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
@Lazy
|
||||||
|
private IUClientService uClientService;
|
||||||
|
|
||||||
|
|
||||||
// 定时任务时间间隔
|
// 定时任务时间间隔
|
||||||
private static final int JOB_PERIOD = -30;
|
private static final int JOB_PERIOD = -30;
|
||||||
@@ -269,6 +277,19 @@ public class UAccountServiceImpl extends ServiceImpl<UAccountMapper, UAccount> i
|
|||||||
if (!AccountUtil.isValid(account, current)) {
|
if (!AccountUtil.isValid(account, current)) {
|
||||||
wifiApi.cancelAuthClient(site.getSiteId(), client.getMac());
|
wifiApi.cancelAuthClient(site.getSiteId(), client.getMac());
|
||||||
}
|
}
|
||||||
|
// 设备数超出限制的话,取消在线时间短的设备
|
||||||
|
if (account.getClientNumEnable()) {
|
||||||
|
List<UClientCurrentVo> currentClients = uClientService.getCurrentClients(account.getUserId());
|
||||||
|
if (currentClients.size() <= account.getClientNum()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int limitNum = currentClients.size() - account.getClientNum();
|
||||||
|
List<UClientCurrentVo> cancelClients = currentClients.stream().sorted(Comparator.comparing(UClientCurrentVo::getUpTime))
|
||||||
|
.limit(limitNum).collect(Collectors.toList());
|
||||||
|
for (UClientCurrentVo cancelClient : cancelClients) {
|
||||||
|
wifiApi.cancelAuthClient(cancelClient.getSiteId(), cancelClient.getClientMac());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -281,6 +302,13 @@ public class UAccountServiceImpl extends ServiceImpl<UAccountMapper, UAccount> i
|
|||||||
}
|
}
|
||||||
Date current = new Date();
|
Date current = new Date();
|
||||||
if (AccountUtil.isValid(account, current)) {
|
if (AccountUtil.isValid(account, current)) {
|
||||||
|
|
||||||
|
if (account.getClientNumEnable()) {
|
||||||
|
int onlineClientNum = uClientService.getCurrentClients(client.getUserId()).size();
|
||||||
|
if (onlineClientNum > account.getClientNum()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
wifiApi.authClient(client.getSiteId(), client.getClientMac());
|
wifiApi.authClient(client.getSiteId(), client.getClientMac());
|
||||||
|
|
||||||
// 带宽限速
|
// 带宽限速
|
||||||
|
|||||||
@@ -6,9 +6,14 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.wfc.common.core.constant.WifiConstants;
|
||||||
import org.wfc.common.core.domain.LoginUser;
|
import org.wfc.common.core.domain.LoginUser;
|
||||||
import org.wfc.common.security.utils.SecurityUtils;
|
import org.wfc.common.security.utils.SecurityUtils;
|
||||||
|
import org.wfc.omada.api.client.OmadaClientApi;
|
||||||
|
import org.wfc.omada.api.client.model.ClientInfo;
|
||||||
|
import org.wfc.omada.api.client.model.OperationResponseClientGridVoClientInfo;
|
||||||
import org.wfc.user.api.domain.bo.UClientBo;
|
import org.wfc.user.api.domain.bo.UClientBo;
|
||||||
import org.wfc.user.domain.UClient;
|
import org.wfc.user.domain.UClient;
|
||||||
import org.wfc.user.domain.vo.UClientCurrentVo;
|
import org.wfc.user.domain.vo.UClientCurrentVo;
|
||||||
@@ -17,8 +22,13 @@ import org.wfc.user.mapper.UClientMapper;
|
|||||||
import org.wfc.user.service.IUAccountService;
|
import org.wfc.user.service.IUAccountService;
|
||||||
import org.wfc.user.service.IUClientService;
|
import org.wfc.user.service.IUClientService;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
@@ -34,6 +44,9 @@ public class UClientServiceImpl extends ServiceImpl<UClientMapper, UClient> impl
|
|||||||
@Autowired
|
@Autowired
|
||||||
private IUAccountService accountService;
|
private IUAccountService accountService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private OmadaClientApi omadaClientApi;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean recordClientUser(UClientBo uClientBo) {
|
public boolean recordClientUser(UClientBo uClientBo) {
|
||||||
if (StrUtil.isBlank(uClientBo.getClientMac())) {
|
if (StrUtil.isBlank(uClientBo.getClientMac())) {
|
||||||
@@ -55,12 +68,50 @@ public class UClientServiceImpl extends ServiceImpl<UClientMapper, UClient> impl
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<UClientCurrentVo> getCurrentClients() {
|
public List<UClientCurrentVo> getCurrentClients(Long userId) {
|
||||||
LoginUser<Object> loginUser = SecurityUtils.getLoginUser();
|
|
||||||
if (ObjectUtil.isNull(loginUser)) {
|
List<UClient> clients = this.list(Wrappers.<UClient>lambdaQuery()
|
||||||
return Collections.emptyList();
|
.eq(UClient::getUserId, userId)
|
||||||
|
.isNotNull(UClient::getClientMac)
|
||||||
|
.isNotNull(UClient::getSiteId));
|
||||||
|
|
||||||
|
// 根据site分组
|
||||||
|
Map<String, List<UClient>> siteMap = clients.stream().collect(Collectors.groupingBy(UClient::getSiteId));
|
||||||
|
List<UClientCurrentVo> clientVos = new ArrayList<>();
|
||||||
|
for (Map.Entry<String, List<UClient>> siteEntry : siteMap.entrySet()) {
|
||||||
|
String siteId = siteEntry.getKey();
|
||||||
|
// 查出在线client
|
||||||
|
ResponseEntity<OperationResponseClientGridVoClientInfo> activeClientRes = omadaClientApi.getGridActiveClients(siteId, 1, 1000);
|
||||||
|
if (activeClientRes.getBody() == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (activeClientRes.getBody().getResult() == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
List<ClientInfo> activeClients = activeClientRes.getBody().getResult().getData();
|
||||||
|
List<UClient> loginClients = siteEntry.getValue();
|
||||||
|
long i = 0;
|
||||||
|
for (UClient loginClient : loginClients) {
|
||||||
|
Optional<ClientInfo> clientOptional = activeClients.stream()
|
||||||
|
.filter(c -> Objects.equals(c.getMac(), loginClient.getClientMac()) && c.getAuthStatus() == WifiConstants.AUTH_STATUS_AUTHORIZED).findFirst();
|
||||||
|
if (clientOptional.isPresent()) {
|
||||||
|
ClientInfo clientInfo = clientOptional.get();
|
||||||
|
UClientCurrentVo clientVo = new UClientCurrentVo();
|
||||||
|
clientVo.setId(i);
|
||||||
|
clientVo.setClientMac(clientInfo.getMac());
|
||||||
|
clientVo.setClientName(clientInfo.getName());
|
||||||
|
clientVo.setActivity(clientInfo.getActivity());
|
||||||
|
clientVo.setTrafficDown(clientInfo.getTrafficDown());
|
||||||
|
clientVo.setTrafficUp(clientInfo.getTrafficUp());
|
||||||
|
clientVo.setUpTime(clientInfo.getActivity());
|
||||||
|
clientVo.setSiteId(siteId);
|
||||||
|
clientVos.add(clientVo);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return this.baseMapper.getCurrentClients(loginUser.getUserid());
|
|
||||||
|
return clientVos;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user