2
0

feat: 多套餐开启

This commit is contained in:
caiyuchao
2025-03-13 11:51:48 +08:00
parent 08d94cc344
commit 287c4a3b0f
3 changed files with 54 additions and 26 deletions

View File

@@ -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<UAccountMapper, UAccount> 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<UAccountMapper, UAccount> i
continue;
}
UAccount account = this.getOne(Wrappers.<UAccount>lambdaQuery().eq(UAccount::getUserId, loginClient.getUserId()), false);
// 套餐失效,但是还有其他可用套餐
if (!AccountUtil.isPackageValid(account, current)) {
List<UAccountPackage> accountPackages = accountPackageMapper.selectList(Wrappers.<UAccountPackage>lambdaQuery()
.eq(UAccountPackage::getAccountId, account.getId()).orderByAsc(UAccountPackage::getCreateTime));
Optional<UAccountPackage> 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());

View File

@@ -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<UOrderMapper, UOrder> 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<UOrderMapper, UOrder> 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());

View File

@@ -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;
}
}