From 3087685644694c01e9c0f4dc5d4cdbd4402ec913 Mon Sep 17 00:00:00 2001 From: caiyuchao Date: Tue, 24 Dec 2024 17:24:55 +0800 Subject: [PATCH] feat: buy package and auth --- .../java/org/wfc/user/mapper/UCdrMapper.java | 3 +- .../wfc/user/service/IUAccountService.java | 12 +++ .../service/impl/UAccountServiceImpl.java | 99 ++++++++++++++++++- .../user/service/impl/UCdrServiceImpl.java | 8 +- .../user/service/impl/UClientServiceImpl.java | 7 ++ .../user/service/impl/UOrderServiceImpl.java | 1 + .../main/resources/mapper/user/UCdrMapper.xml | 50 ++++++---- 7 files changed, 155 insertions(+), 25 deletions(-) diff --git a/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/mapper/UCdrMapper.java b/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/mapper/UCdrMapper.java index 1b008c9..a85dd0c 100644 --- a/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/mapper/UCdrMapper.java +++ b/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/mapper/UCdrMapper.java @@ -8,6 +8,7 @@ import org.wfc.user.domain.vo.UCdrClientVo; import org.wfc.user.domain.vo.UCdrHistoryUserVo; import org.wfc.user.domain.vo.UCdrUserVo; +import java.util.Date; import java.util.List; /** @@ -20,7 +21,7 @@ import java.util.List; */ public interface UCdrMapper extends BaseMapper { - List getByUser(@Param("userId") Long userId); + List getByUser(@Param("userId") Long userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime); List getByClient(@Param("client") UCdrClientBo client); diff --git a/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/IUAccountService.java b/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/IUAccountService.java index acc2b91..09d4836 100644 --- a/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/IUAccountService.java +++ b/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/IUAccountService.java @@ -1,5 +1,6 @@ package org.wfc.user.service; +import org.wfc.user.api.domain.bo.UClientBo; import org.wfc.user.domain.UAccount; import com.baomidou.mybatisplus.extension.service.IService; @@ -13,4 +14,15 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface IUAccountService extends IService { + /** + * 统计和取消授权用户 + */ + void statAndCancelAuthUser(); + + /** + * 授权设备和限速 + * @param client client + */ + void authClientAndRateLimit(UClientBo client); + } diff --git a/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/impl/UAccountServiceImpl.java b/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/impl/UAccountServiceImpl.java index a2a2d6f..ff7d1ec 100644 --- a/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/impl/UAccountServiceImpl.java +++ b/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/impl/UAccountServiceImpl.java @@ -1,10 +1,30 @@ package org.wfc.user.service.impl; -import org.wfc.user.domain.UAccount; -import org.wfc.user.mapper.UAccountMapper; -import org.wfc.user.service.IUAccountService; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +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.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.wfc.omada.api.client.OmadaClientApi; +import org.wfc.omada.api.client.model.ClientRateLimitSetting; +import org.wfc.omada.api.client.model.CustomRateLimitEntity; +import org.wfc.omada.api.hotspot.OmadaAuthorizedClientApi; +import org.wfc.user.api.domain.bo.UClientBo; +import org.wfc.user.domain.UAccount; +import org.wfc.user.domain.UClient; +import org.wfc.user.domain.vo.UCdrUserVo; +import org.wfc.user.mapper.UAccountMapper; +import org.wfc.user.mapper.UCdrMapper; +import org.wfc.user.mapper.UClientMapper; +import org.wfc.user.service.IUAccountService; + +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; /** *

@@ -17,4 +37,77 @@ import org.springframework.stereotype.Service; @Service public class UAccountServiceImpl extends ServiceImpl implements IUAccountService { + @Autowired + private UCdrMapper ucdrMapper; + + @Autowired + private OmadaAuthorizedClientApi omadaAuthorizedClientApi; + + @Autowired + private UClientMapper clientMapper; + + @Autowired + private OmadaClientApi omadaClientApi; + + @Transactional(rollbackFor = Exception.class) + public void statAndCancelAuthUser() { + // 定时任务查询所有未过期或刚过期(失效时间+定时任务间隔时间)的账户套餐,套餐过期/流量用完/时长用完则取消授权 + Date current = new Date(); + DateTime endTime = DateUtil.offsetSecond(current, -30); + List accounts = this.list(Wrappers.lambdaQuery().gt(UAccount::getEndTime, endTime)); + // 更新账户已使用流量,已使用时长 + List statCdr = ucdrMapper.getByUser(null, current, endTime); + for (UAccount account : accounts) { + for (UCdrUserVo stat : statCdr) { + if (Objects.equals(account.getUserId(), stat.getId())) { + account.setTrafficUsed(stat.getTrafficUp() + stat.getTrafficDown()); + account.setDurationUsed(stat.getDuration()); + } + } + } + this.updateBatchById(accounts); + + // 过期/流量已用完/时长已用完应取消授权 + List userIds = accounts.stream().filter(account -> (account.getEndTime().before(endTime) && account.getEndTime().after(current)) + || (account.getTrafficEnable() && account.getTrafficUsed() > account.getTraffic()) + || (account.getDurationEnable() && account.getDurationUsed() > account.getDuration())) + .map(UAccount::getUserId) + .collect(Collectors.toList()); + + List clients = clientMapper.selectList(Wrappers.lambdaQuery().in(UClient::getUserId, userIds)); + for (UClient client : clients) { + omadaAuthorizedClientApi.cancelAuthClient(client.getSiteId(), client.getClientMac()); + } + + } + + public void authClientAndRateLimit(UClientBo client) { + UAccount account = this.getOne(Wrappers.lambdaQuery().eq(UAccount::getUserId, client.getUserId()), false); + if (ObjectUtil.isNull(account)) { + return; + } + Date current = new Date(); + if (account.getStartTime().before(current) && account.getEndTime().after(current) + && (!account.getTrafficEnable() || account.getTrafficUsed() <= account.getTraffic()) + && (!account.getDurationEnable() || account.getDurationUsed() <= account.getDuration())) { + omadaAuthorizedClientApi.authClient(client.getSiteId(), client.getClientMac()); + + // 带宽限速 + if (account.getRateLimitEnable()) { + ClientRateLimitSetting clientRateLimitSetting = new ClientRateLimitSetting(); + clientRateLimitSetting.setMode(0); + CustomRateLimitEntity customRateLimitEntity = new CustomRateLimitEntity(); + customRateLimitEntity.setDownEnable(account.getDownLimitEnable()); + customRateLimitEntity.setDownLimit(account.getDownLimit() == null ? 0 : account.getDownLimit().intValue()); + customRateLimitEntity.setDownUnit(1); + customRateLimitEntity.setUpEnable(account.getUpLimitEnable()); + customRateLimitEntity.setUpLimit(account.getUpLimit() == null ? 0 : account.getUpLimit().intValue()); + customRateLimitEntity.setUpUnit(1); + clientRateLimitSetting.setCustomRateLimit(customRateLimitEntity); + omadaClientApi.updateClientRateLimitSetting(client.getSiteId(), client.getClientMac(), clientRateLimitSetting); + } + } + + } + } diff --git a/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/impl/UCdrServiceImpl.java b/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/impl/UCdrServiceImpl.java index 2ab71f3..5928401 100644 --- a/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/impl/UCdrServiceImpl.java +++ b/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/impl/UCdrServiceImpl.java @@ -29,6 +29,7 @@ import org.wfc.user.domain.vo.UCdrClientVo; import org.wfc.user.domain.vo.UCdrHistoryUserVo; import org.wfc.user.domain.vo.UCdrUserVo; import org.wfc.user.mapper.UCdrMapper; +import org.wfc.user.service.IUAccountService; import org.wfc.user.service.IUCdrHistoryService; import org.wfc.user.service.IUCdrService; import org.wfc.user.service.IUClientService; @@ -68,10 +69,13 @@ public class UCdrServiceImpl extends ServiceImpl implements IU @Autowired private IUCdrHistoryService cdrHistoryService; + @Autowired + private IUAccountService accountService; + @Override public UCdrUserVo getByUser() { LoginUser loginUser = SecurityUtils.getLoginUser(); - List cdrUsers = this.baseMapper.getByUser(loginUser.getUserid()); + List cdrUsers = this.baseMapper.getByUser(loginUser.getUserid(), null, null); return cdrUsers.stream().findFirst().orElse(null); } @@ -116,6 +120,8 @@ public class UCdrServiceImpl extends ServiceImpl implements IU } } } + + accountService.statAndCancelAuthUser(); } private void addCdrHistory(SiteSummaryInfo site, String mac, Long cdrId) { diff --git a/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/impl/UClientServiceImpl.java b/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/impl/UClientServiceImpl.java index beea191..be53443 100644 --- a/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/impl/UClientServiceImpl.java +++ b/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/impl/UClientServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.wfc.common.core.domain.LoginUser; import org.wfc.common.security.utils.SecurityUtils; @@ -13,6 +14,7 @@ import org.wfc.user.domain.UClient; import org.wfc.user.domain.vo.UClientCurrentVo; import org.wfc.user.domain.vo.UClientHistoryUserVo; import org.wfc.user.mapper.UClientMapper; +import org.wfc.user.service.IUAccountService; import org.wfc.user.service.IUClientService; import java.util.Collections; @@ -29,6 +31,9 @@ import java.util.List; @Service public class UClientServiceImpl extends ServiceImpl implements IUClientService { + @Autowired + private IUAccountService accountService; + @Override public boolean recordClientUser(UClientBo uClientBo) { if (StrUtil.isBlank(uClientBo.getClientMac())) { @@ -41,6 +46,8 @@ public class UClientServiceImpl extends ServiceImpl impl if (hasUClient != null) { uClient.setId(hasUClient.getId()); } + // 登录时如果当前用户有可用套餐和余额授权当前设备访问wifi,且根据套餐限制带宽 + accountService.authClientAndRateLimit(uClientBo); return this.saveOrUpdate(uClient); } diff --git a/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/impl/UOrderServiceImpl.java b/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/impl/UOrderServiceImpl.java index 9f2e778..220f786 100644 --- a/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/impl/UOrderServiceImpl.java +++ b/wfc-modules/wfc-modules-user/src/main/java/org/wfc/user/service/impl/UOrderServiceImpl.java @@ -131,6 +131,7 @@ public class UOrderServiceImpl extends ServiceImpl impleme @Override public boolean saveOrder(UOrder order) { + order.setStatus(OrderStatusEnum.UNPAID.getCode()); this.save(order); // 支付成功回调 paySuccess(order.getId()); diff --git a/wfc-modules/wfc-modules-user/src/main/resources/mapper/user/UCdrMapper.xml b/wfc-modules/wfc-modules-user/src/main/resources/mapper/user/UCdrMapper.xml index 07b8256..22184e0 100644 --- a/wfc-modules/wfc-modules-user/src/main/resources/mapper/user/UCdrMapper.xml +++ b/wfc-modules/wfc-modules-user/src/main/resources/mapper/user/UCdrMapper.xml @@ -3,32 +3,42 @@