feat(system): 新增租户测试账户增减及奖励类型支持
- BalanceEnum 增加 BONUS 奖励类型 - ErrorCodeConstants 补充测试账户不足/操作错误码 - TenantBalanceMapper 添加乐观锁更新测试账户数方法 - TenantBalanceService 新增 reduceTestAccountNum/addTestAccountNum - TenantBalanceServiceImpl 实现测试账户扣减与奖励发放逻辑 - TenantPointsDO/VO 增加 testAccountNum 字段 - TenantServiceImpl 创建租户时根据套餐类型自动增减测试账户 - 新增 PackageTypeEnum 枚举区分测试/代理/普通套餐
This commit is contained in:
@@ -55,4 +55,8 @@ public class TenantPointsPageRespVO {
|
|||||||
@Schema(description = "租户名称", example = "租户 A")
|
@Schema(description = "租户名称", example = "租户 A")
|
||||||
@ExcelProperty("租户名称")
|
@ExcelProperty("租户名称")
|
||||||
private String tenantName;
|
private String tenantName;
|
||||||
|
|
||||||
|
@Schema(description = "测试账号数", example = "1")
|
||||||
|
@ExcelProperty("测试账号数")
|
||||||
|
private Integer testAccountNum;
|
||||||
}
|
}
|
||||||
@@ -52,4 +52,7 @@ public class TenantPointsRespVO {
|
|||||||
@ExcelProperty("创建时间")
|
@ExcelProperty("创建时间")
|
||||||
private LocalDateTime createdAt;
|
private LocalDateTime createdAt;
|
||||||
|
|
||||||
|
@Schema(description = "测试账号数", example = "1")
|
||||||
|
@ExcelProperty("测试账号数")
|
||||||
|
private Integer testAccountNum;
|
||||||
}
|
}
|
||||||
@@ -65,4 +65,6 @@ public class TenantPointsDO {
|
|||||||
private Long tenantId;
|
private Long tenantId;
|
||||||
|
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
|
private Integer testAccountNum;
|
||||||
}
|
}
|
||||||
@@ -47,4 +47,19 @@ public interface TenantBalanceMapper extends BaseMapperX<TenantBalanceDO> {
|
|||||||
IPage<TenantBalanceRespVO> selectPageWithTenantName(IPage<TenantBalanceRespVO> iPage,@Param("req") TenantBalancePageReqVO pageReqVO);
|
IPage<TenantBalanceRespVO> selectPageWithTenantName(IPage<TenantBalanceRespVO> iPage,@Param("req") TenantBalancePageReqVO pageReqVO);
|
||||||
|
|
||||||
IPage<TenantBalanceRespVO> selectPageWithSelfSubordinateTenant(@Param("iPage") IPage<TenantBalanceRespVO> iPage, @Param("pageReqVO") TenantBalancePageReqVO pageReqVO, @Param("tenantId") Long tenantId);
|
IPage<TenantBalanceRespVO> selectPageWithSelfSubordinateTenant(@Param("iPage") IPage<TenantBalanceRespVO> iPage, @Param("pageReqVO") TenantBalancePageReqVO pageReqVO, @Param("tenantId") Long tenantId);
|
||||||
|
|
||||||
|
default Integer updateTestAccountNumWithVersion(Long currentTenantId, Integer newTestAccountNum, Integer oldVersion){
|
||||||
|
LambdaUpdateWrapper<TenantBalanceDO> wrapper = new LambdaUpdateWrapper<>();
|
||||||
|
|
||||||
|
wrapper.eq(TenantBalanceDO::getId, currentTenantId);
|
||||||
|
wrapper.eq(TenantBalanceDO::getVersion, oldVersion);
|
||||||
|
|
||||||
|
// testAccount = testAccount + -1
|
||||||
|
wrapper.setSql("test_account_num = test_account_num + " + newTestAccountNum);
|
||||||
|
|
||||||
|
// version = version + 1
|
||||||
|
wrapper.setSql("version = version + 1");
|
||||||
|
|
||||||
|
return this.update(null, wrapper);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -136,6 +136,8 @@ public interface ErrorCodeConstants {
|
|||||||
ErrorCode TENANT_BALANCE_TRANSFER_ERROR_TARGET_NOT_SUBORDINATE = new ErrorCode(1_003_017_012, "转账目标租户不是当前租户的下级");
|
ErrorCode TENANT_BALANCE_TRANSFER_ERROR_TARGET_NOT_SUBORDINATE = new ErrorCode(1_003_017_012, "转账目标租户不是当前租户的下级");
|
||||||
ErrorCode TENANT_BALANCE_CONSUMPTION_OPERATION_ERROR = new ErrorCode(1_003_017_013, "租户余额消费操作失败");
|
ErrorCode TENANT_BALANCE_CONSUMPTION_OPERATION_ERROR = new ErrorCode(1_003_017_013, "租户余额消费操作失败");
|
||||||
ErrorCode TENANT_CREATE_FAIL = new ErrorCode(1_003_017_014, "租户创建失败");
|
ErrorCode TENANT_CREATE_FAIL = new ErrorCode(1_003_017_014, "租户创建失败");
|
||||||
|
ErrorCode TENANT_BALANCE_TEST_ACCOUNT_NUM_NOT_ENOUGH = new ErrorCode(1_003_017_015, "当前账户测试账户数量不足");
|
||||||
|
ErrorCode TENANT_BALANCE_TEST_ACCOUNT_NUM_OPERATION_ERROR = new ErrorCode(1_003_017_016, "租户测试账户数量操作错误");
|
||||||
|
|
||||||
// ================= 租户套餐 1-003-018-000 ==================
|
// ================= 租户套餐 1-003-018-000 ==================
|
||||||
ErrorCode TENANT_AGENCY_PACKAGE_NOT_EXISTS = new ErrorCode(1_003_018_000, "代理租户套餐不存在");
|
ErrorCode TENANT_AGENCY_PACKAGE_NOT_EXISTS = new ErrorCode(1_003_018_000, "代理租户套餐不存在");
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package cn.iocoder.yudao.module.system.enums.agencyTenantPackage;
|
||||||
|
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @author: ziin
|
||||||
|
* @date: 2025/11/25 15:22
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
public enum PackageTypeEnum {
|
||||||
|
|
||||||
|
AI(0, "AI"),
|
||||||
|
CRAWL(1, "爬虫"),
|
||||||
|
BROTHER_CRAWL(2, "兄弟爬虫"),
|
||||||
|
TEST(99, "测试账户"),
|
||||||
|
AGENCY(199, "代理");
|
||||||
|
|
||||||
|
private final Integer value;
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
PackageTypeEnum(Integer value, String name) {
|
||||||
|
this.value = value;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,7 +17,8 @@ public enum BalanceEnum {
|
|||||||
RECHARGE("充值"),
|
RECHARGE("充值"),
|
||||||
TRANSFER_OUT("转出"),
|
TRANSFER_OUT("转出"),
|
||||||
TRANSFER_IN("转入"),
|
TRANSFER_IN("转入"),
|
||||||
CONSUMPTION("消费");
|
CONSUMPTION("消费"),
|
||||||
|
BONUS(" 奖励");
|
||||||
|
|
||||||
|
|
||||||
private String desc;
|
private String desc;
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.dept.UserPostMapper;
|
|||||||
import cn.iocoder.yudao.module.system.dal.mysql.tenant.TenantMapper;
|
import cn.iocoder.yudao.module.system.dal.mysql.tenant.TenantMapper;
|
||||||
import cn.iocoder.yudao.module.system.dal.mysql.tenantbalance.TenantBalanceMapper;
|
import cn.iocoder.yudao.module.system.dal.mysql.tenantbalance.TenantBalanceMapper;
|
||||||
import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper;
|
import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper;
|
||||||
|
import cn.iocoder.yudao.module.system.enums.agencyTenantPackage.PackageTypeEnum;
|
||||||
import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum;
|
import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum;
|
||||||
import cn.iocoder.yudao.module.system.enums.permission.RoleTypeEnum;
|
import cn.iocoder.yudao.module.system.enums.permission.RoleTypeEnum;
|
||||||
import cn.iocoder.yudao.module.system.enums.tenant.TenantEnum;
|
import cn.iocoder.yudao.module.system.enums.tenant.TenantEnum;
|
||||||
@@ -178,6 +179,15 @@ public class TenantServiceImpl implements TenantService {
|
|||||||
if (balanceService.consumption(createReqVO.getPackageId(), tenant.getId(), createReqVO.getRemark())) {
|
if (balanceService.consumption(createReqVO.getPackageId(), tenant.getId(), createReqVO.getRemark())) {
|
||||||
log.info("代理: {} 开通租户:{} 成功,套餐 Id:{}", currentTenantId,tenant.getId(),createReqVO.getPackageId());
|
log.info("代理: {} 开通租户:{} 成功,套餐 Id:{}", currentTenantId,tenant.getId(),createReqVO.getPackageId());
|
||||||
}
|
}
|
||||||
|
// 开通测试套餐扣除测试账号数
|
||||||
|
if (tenantAgencyPackageDO.getPackageType().equals(PackageTypeEnum.TEST.getValue())){
|
||||||
|
balanceService.reduceTestAccountNum(currentTenantId);
|
||||||
|
}
|
||||||
|
if (!tenantAgencyPackageDO.getPackageType().equals(PackageTypeEnum.AGENCY.getValue())
|
||||||
|
&& !tenantAgencyPackageDO.getPackageType().equals(PackageTypeEnum.TEST.getValue())) {
|
||||||
|
balanceService.addTestAccountNum(currentTenantId);
|
||||||
|
}
|
||||||
|
|
||||||
// 在新创建的租户上下文中执行管理员初始化操作
|
// 在新创建的租户上下文中执行管理员初始化操作
|
||||||
TenantUtils.execute(tenant.getId(), () -> {
|
TenantUtils.execute(tenant.getId(), () -> {
|
||||||
// 创建租户的默认角色
|
// 创建租户的默认角色
|
||||||
@@ -208,6 +218,7 @@ public class TenantServiceImpl implements TenantService {
|
|||||||
tenantBalance.setId(tenant.getId()); // 钱包ID与租户ID一致
|
tenantBalance.setId(tenant.getId()); // 钱包ID与租户ID一致
|
||||||
tenantBalance.setBalance(0); // 初始余额设为0
|
tenantBalance.setBalance(0); // 初始余额设为0
|
||||||
tenantBalance.setVersion(0); // 初始版本号设为0
|
tenantBalance.setVersion(0); // 初始版本号设为0
|
||||||
|
tenantBalance.setTestAccountNum(15);
|
||||||
tenantBalanceMapper.insert(tenantBalance); // 插入钱包记录
|
tenantBalanceMapper.insert(tenantBalance); // 插入钱包记录
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -68,4 +68,8 @@ public interface TenantBalanceService {
|
|||||||
PageResult<TenantBalanceRespVO> getSelfSubordinateTenantBalancePage(@Valid TenantBalancePageReqVO pageReqVO);
|
PageResult<TenantBalanceRespVO> getSelfSubordinateTenantBalancePage(@Valid TenantBalancePageReqVO pageReqVO);
|
||||||
|
|
||||||
Boolean consumption(Long PackageId, Long targetTenantId,String remark);
|
Boolean consumption(Long PackageId, Long targetTenantId,String remark);
|
||||||
|
|
||||||
|
Boolean reduceTestAccountNum(Long currentTenantId);
|
||||||
|
|
||||||
|
Boolean addTestAccountNum(Long currentTenantId);
|
||||||
}
|
}
|
||||||
@@ -358,4 +358,71 @@ public class TenantBalanceServiceImpl implements TenantBalanceService {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean reduceTestAccountNum(Long currentTenantId) {
|
||||||
|
TenantBalanceDO tenantBalanceDO = tenantBalanceMapper.selectById(currentTenantId);
|
||||||
|
if (tenantBalanceDO.getTestAccountNum()<=0) {
|
||||||
|
throw exception(TENANT_BALANCE_TEST_ACCOUNT_NUM_NOT_ENOUGH);
|
||||||
|
}
|
||||||
|
Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
|
||||||
|
Integer oldVersion = tenantBalanceDO.getVersion();
|
||||||
|
Integer newTestAccountNum = tenantBalanceDO.getTestAccountNum() - 1;
|
||||||
|
|
||||||
|
Integer i = tenantBalanceMapper.updateTestAccountNumWithVersion(currentTenantId, -1, oldVersion);
|
||||||
|
if (i == 0) {
|
||||||
|
throw exception(TENANT_BALANCE_TEST_ACCOUNT_NUM_OPERATION_ERROR);
|
||||||
|
}
|
||||||
|
String consumption = BizNoGenerator.generate("CONSUMPTION");
|
||||||
|
|
||||||
|
// 消费积分变动记录
|
||||||
|
TenantPointsDO tenantPointsDO = new TenantPointsDO();
|
||||||
|
tenantPointsDO.setTenantId(currentTenantId); // 设置租户ID
|
||||||
|
tenantPointsDO.setPoints(-1); // 设置变动积分(负数表示减少)
|
||||||
|
tenantPointsDO.setBalance(tenantPointsDO.getBalance());
|
||||||
|
tenantPointsDO.setTestAccountNum(newTestAccountNum); // 设置变动后的余额
|
||||||
|
tenantPointsDO.setOperatorId(loginUserId); // 设置操作人ID
|
||||||
|
tenantPointsDO.setType(CONSUMPTION.getDesc()); // 设置交易类型为转账
|
||||||
|
tenantPointsDO.setDescription("开通测试账户"); // 设置交易描述
|
||||||
|
tenantPointsDO.setBizNo(consumption); // 设置业务流水号
|
||||||
|
int tenantInsert = tenantPointsMapper.insert(tenantPointsDO); // 插入记录
|
||||||
|
if (tenantInsert == 0) {
|
||||||
|
throw exception(TENANT_BALANCE_CONSUMPTION_OPERATION_ERROR);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean addTestAccountNum(Long currentTenantId) {
|
||||||
|
TenantBalanceDO tenantBalanceDO = tenantBalanceMapper.selectById(currentTenantId);
|
||||||
|
|
||||||
|
Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
|
||||||
|
|
||||||
|
Integer oldVersion = tenantBalanceDO.getVersion();
|
||||||
|
|
||||||
|
Integer newTestAccountNum = tenantBalanceDO.getTestAccountNum() + 5;
|
||||||
|
|
||||||
|
Integer i = tenantBalanceMapper.updateTestAccountNumWithVersion(currentTenantId, 5, oldVersion);
|
||||||
|
if (i == 0) {
|
||||||
|
throw exception(TENANT_BALANCE_TEST_ACCOUNT_NUM_OPERATION_ERROR);
|
||||||
|
}
|
||||||
|
String bonus = BizNoGenerator.generate("BONUS");
|
||||||
|
|
||||||
|
// 消费积分变动记录
|
||||||
|
TenantPointsDO tenantPointsDO = new TenantPointsDO();
|
||||||
|
tenantPointsDO.setTenantId(currentTenantId); // 设置租户ID
|
||||||
|
tenantPointsDO.setPoints(5); // 设置变动积分(负数表示减少)
|
||||||
|
tenantPointsDO.setTestAccountNum(newTestAccountNum); // 设置变动后的余额
|
||||||
|
tenantPointsDO.setBalance(tenantPointsDO.getBalance());
|
||||||
|
tenantPointsDO.setOperatorId(loginUserId); // 设置操作人ID
|
||||||
|
tenantPointsDO.setType(BONUS.getDesc()); // 设置交易类型为转账
|
||||||
|
tenantPointsDO.setDescription("开通测试账户,增加测试账号数量"); // 设置交易描述
|
||||||
|
tenantPointsDO.setBizNo(bonus); // 设置业务流水号
|
||||||
|
int tenantInsert = tenantPointsMapper.insert(tenantPointsDO); // 插入记录
|
||||||
|
if (tenantInsert == 0) {
|
||||||
|
throw exception(TENANT_BALANCE_CONSUMPTION_OPERATION_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user