From 287c4a3b0f2ef06c22b0790c0f51fb2c49a43c06 Mon Sep 17 00:00:00 2001 From: caiyuchao Date: Thu, 13 Mar 2025 11:51:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A4=9A=E5=A5=97=E9=A4=90=E5=BC=80?= =?UTF-8?q?=E5=90=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/UAccountServiceImpl.java | 28 +++++++++++++++++++ .../user/service/impl/UOrderServiceImpl.java | 28 ++----------------- .../java/org/wfc/user/util/AccountUtil.java | 24 ++++++++++++++++ 3 files changed, 54 insertions(+), 26 deletions(-) diff --git a/wfc-modules/wfc-user/src/main/java/org/wfc/user/service/impl/UAccountServiceImpl.java b/wfc-modules/wfc-user/src/main/java/org/wfc/user/service/impl/UAccountServiceImpl.java index 852b02f..00137e1 100644 --- a/wfc-modules/wfc-user/src/main/java/org/wfc/user/service/impl/UAccountServiceImpl.java +++ b/wfc-modules/wfc-user/src/main/java/org/wfc/user/service/impl/UAccountServiceImpl.java @@ -1,6 +1,7 @@ package org.wfc.user.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -26,6 +27,7 @@ import org.wfc.user.api.domain.bo.UClientBo; import org.wfc.user.api.omada.domain.convert.OmadaConvert; import org.wfc.user.api.omada.domain.dto.ClientRateLimitSettingDto; import org.wfc.user.domain.UAccount; +import org.wfc.user.domain.UAccountPackage; import org.wfc.user.domain.UBill; import org.wfc.user.domain.UBillRule; import org.wfc.user.domain.UClient; @@ -35,6 +37,7 @@ import org.wfc.user.domain.vo.UAccountDashboardVo; 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.UAccountPackageMapper; import org.wfc.user.mapper.UBillMapper; import org.wfc.user.mapper.UBillRuleMapper; import org.wfc.user.mapper.UCdrMapper; @@ -88,6 +91,9 @@ public class UAccountServiceImpl extends ServiceImpl i @Lazy private IUClientService uClientService; + @Autowired + private UAccountPackageMapper accountPackageMapper; + @Transactional(rollbackFor = Exception.class) public void statAndCancelAuthUser() { // 定时任务查询所有未过期或刚过期(失效时间+定时任务间隔时间)的账户套餐,套餐过期/流量用完/时长用完则取消授权 @@ -163,6 +169,28 @@ public class UAccountServiceImpl extends ServiceImpl i continue; } UAccount account = this.getOne(Wrappers.lambdaQuery().eq(UAccount::getUserId, loginClient.getUserId()), false); + // 套餐失效,但是还有其他可用套餐 + if (!AccountUtil.isPackageValid(account, current)) { + List accountPackages = accountPackageMapper.selectList(Wrappers.lambdaQuery() + .eq(UAccountPackage::getAccountId, account.getId()).orderByAsc(UAccountPackage::getCreateTime)); + Optional accountPackageOptional = accountPackages.stream().findFirst(); + if (accountPackageOptional.isPresent()) { + wifiApi.reconnectClient(site.getSiteId(), client.getMac()); + UAccountPackage accountPackage = accountPackageOptional.get(); + BeanUtils.copyProperties(accountPackage, account); + account.setTrafficUsed(0L); + account.setDurationUsed(0L); + account.setClientNumUsed(0); + Date startTime = new Date(); + DateTime endTime = AccountUtil.getEndTime(accountPackage.getPeriodType(), accountPackage.getPeriodNum(), startTime); + account.setStartTime(current); + account.setEndTime(endTime); + // 更新账号套餐和删除使用套餐 + this.updateById(account); + accountPackageMapper.deleteById(accountPackage.getId()); + } + } + // 套餐失效,但是有余额且没有已使用余额,reconnect if (AccountUtil.isPackageUnValidBalanceValid(account, current)) { wifiApi.reconnectClient(site.getSiteId(), client.getMac()); diff --git a/wfc-modules/wfc-user/src/main/java/org/wfc/user/service/impl/UOrderServiceImpl.java b/wfc-modules/wfc-user/src/main/java/org/wfc/user/service/impl/UOrderServiceImpl.java index db48d1b..57058f3 100644 --- a/wfc-modules/wfc-user/src/main/java/org/wfc/user/service/impl/UOrderServiceImpl.java +++ b/wfc-modules/wfc-user/src/main/java/org/wfc/user/service/impl/UOrderServiceImpl.java @@ -1,8 +1,6 @@ package org.wfc.user.service.impl; -import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -26,7 +24,6 @@ import org.wfc.user.domain.UPackage; import org.wfc.user.domain.URateLimit; import org.wfc.user.domain.constant.OrderStatusEnum; import org.wfc.user.domain.constant.OrderTypeEnum; -import org.wfc.user.domain.constant.PeriodTypeEnum; import org.wfc.user.mapper.UAccountPackageMapper; import org.wfc.user.mapper.UBillMapper; import org.wfc.user.mapper.UBillRuleMapper; @@ -115,7 +112,7 @@ public class UOrderServiceImpl extends ServiceImpl impleme } if (OrderTypeEnum.PACKAGE.getCode().equals(order.getType())) { // 套餐 - callbackPackage(order, account, false); + callbackPackage(order, account, isValid); } else if (OrderTypeEnum.RECHARGE.getCode().equals(order.getType())) { // 充值 // 更新账户余额 @@ -206,33 +203,12 @@ public class UOrderServiceImpl extends ServiceImpl impleme account.setDurationUsed(0L); account.setClientNumUsed(0); Date current = new Date(); - DateTime endTime = getEndTime(uPackage, current); + DateTime endTime = AccountUtil.getEndTime(uPackage.getPeriodType(), uPackage.getPeriodNum(), current); account.setStartTime(current); account.setEndTime(endTime); } } - private static DateTime getEndTime(UPackage uPackage, Date current) { - DateTime endTime = null; - // 计算有效时间 - switch (PeriodTypeEnum.getByCode(uPackage.getPeriodType())) { - case HOUR: - endTime = DateUtil.offset(current, DateField.HOUR, uPackage.getPeriodNum()); - break; - case DAY: - endTime = DateUtil.offset(current, DateField.DAY_OF_YEAR, uPackage.getPeriodNum()); - break; - case MONTH: - endTime = DateUtil.offset(current, DateField.MONTH, uPackage.getPeriodNum()); - break; - case YEAR: - endTime = DateUtil.offset(current, DateField.YEAR, uPackage.getPeriodNum()); - break; - default: - } - return endTime; - } - @Override public Long saveOrder(UOrder order) { order.setUserId(SecurityUtils.getUserId()); diff --git a/wfc-modules/wfc-user/src/main/java/org/wfc/user/util/AccountUtil.java b/wfc-modules/wfc-user/src/main/java/org/wfc/user/util/AccountUtil.java index 0d85731..aece986 100644 --- a/wfc-modules/wfc-user/src/main/java/org/wfc/user/util/AccountUtil.java +++ b/wfc-modules/wfc-user/src/main/java/org/wfc/user/util/AccountUtil.java @@ -1,8 +1,11 @@ package org.wfc.user.util; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import org.wfc.user.domain.UAccount; +import org.wfc.user.domain.constant.PeriodTypeEnum; import java.math.BigDecimal; import java.util.Date; @@ -69,4 +72,25 @@ public class AccountUtil { && (!account.getDurationEnable() || account.getDurationUsed() <= account.getDuration())) && (ObjectUtil.isNull(account.getBalanceUsed()) || account.getBalanceUsed().compareTo(BigDecimal.ZERO) == 0); } + + public static DateTime getEndTime(Integer periodType, Integer periodNum, Date current) { + DateTime endTime = null; + // 计算有效时间 + switch (PeriodTypeEnum.getByCode(periodType)) { + case HOUR: + endTime = DateUtil.offset(current, DateField.HOUR, periodNum); + break; + case DAY: + endTime = DateUtil.offset(current, DateField.DAY_OF_YEAR, periodNum); + break; + case MONTH: + endTime = DateUtil.offset(current, DateField.MONTH, periodNum); + break; + case YEAR: + endTime = DateUtil.offset(current, DateField.YEAR, periodNum); + break; + default: + } + return endTime; + } }