From bfc2b218722bc0572b6979b3b7ad7f33dfeaa581 Mon Sep 17 00:00:00 2001 From: ziin Date: Tue, 25 Nov 2025 16:16:28 +0800 Subject: [PATCH] =?UTF-8?q?feat(system):=20=E6=96=B0=E5=A2=9E=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E6=B5=8B=E8=AF=95=E8=B4=A6=E6=88=B7=E5=A2=9E=E5=87=8F?= =?UTF-8?q?=E5=8F=8A=E5=A5=96=E5=8A=B1=E7=B1=BB=E5=9E=8B=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BalanceEnum 增加 BONUS 奖励类型 - ErrorCodeConstants 补充测试账户不足/操作错误码 - TenantBalanceMapper 添加乐观锁更新测试账户数方法 - TenantBalanceService 新增 reduceTestAccountNum/addTestAccountNum - TenantBalanceServiceImpl 实现测试账户扣减与奖励发放逻辑 - TenantPointsDO/VO 增加 testAccountNum 字段 - TenantServiceImpl 创建租户时根据套餐类型自动增减测试账户 - 新增 PackageTypeEnum 枚举区分测试/代理/普通套餐 --- .../vo/TenantPointsPageRespVO.java | 4 ++ .../tenantpoints/vo/TenantPointsRespVO.java | 3 + .../tenantpoints/TenantPointsDO.java | 2 + .../tenantbalance/TenantBalanceMapper.java | 15 +++++ .../system/enums/ErrorCodeConstants.java | 2 + .../agencyTenantPackage/PackageTypeEnum.java | 26 +++++++ .../system/enums/balance/BalanceEnum.java | 3 +- .../service/tenant/TenantServiceImpl.java | 11 +++ .../tenantbalance/TenantBalanceService.java | 4 ++ .../TenantBalanceServiceImpl.java | 67 +++++++++++++++++++ 10 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/enums/agencyTenantPackage/PackageTypeEnum.java diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenantpoints/vo/TenantPointsPageRespVO.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenantpoints/vo/TenantPointsPageRespVO.java index 237e609..f455491 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenantpoints/vo/TenantPointsPageRespVO.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenantpoints/vo/TenantPointsPageRespVO.java @@ -55,4 +55,8 @@ public class TenantPointsPageRespVO { @Schema(description = "租户名称", example = "租户 A") @ExcelProperty("租户名称") private String tenantName; + + @Schema(description = "测试账号数", example = "1") + @ExcelProperty("测试账号数") + private Integer testAccountNum; } \ No newline at end of file diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenantpoints/vo/TenantPointsRespVO.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenantpoints/vo/TenantPointsRespVO.java index a4ba572..79b50a5 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenantpoints/vo/TenantPointsRespVO.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenantpoints/vo/TenantPointsRespVO.java @@ -52,4 +52,7 @@ public class TenantPointsRespVO { @ExcelProperty("创建时间") private LocalDateTime createdAt; + @Schema(description = "测试账号数", example = "1") + @ExcelProperty("测试账号数") + private Integer testAccountNum; } \ No newline at end of file diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenantpoints/TenantPointsDO.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenantpoints/TenantPointsDO.java index 6383cdd..73f5ca3 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenantpoints/TenantPointsDO.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenantpoints/TenantPointsDO.java @@ -65,4 +65,6 @@ public class TenantPointsDO { private Long tenantId; private String remark; + + private Integer testAccountNum; } \ No newline at end of file diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenantbalance/TenantBalanceMapper.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenantbalance/TenantBalanceMapper.java index 5cd453d..173f773 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenantbalance/TenantBalanceMapper.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenantbalance/TenantBalanceMapper.java @@ -47,4 +47,19 @@ public interface TenantBalanceMapper extends BaseMapperX { IPage selectPageWithTenantName(IPage iPage,@Param("req") TenantBalancePageReqVO pageReqVO); IPage selectPageWithSelfSubordinateTenant(@Param("iPage") IPage iPage, @Param("pageReqVO") TenantBalancePageReqVO pageReqVO, @Param("tenantId") Long tenantId); + + default Integer updateTestAccountNumWithVersion(Long currentTenantId, Integer newTestAccountNum, Integer oldVersion){ + LambdaUpdateWrapper 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); + } } \ No newline at end of file diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index e6af3f6..897c9df 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -136,6 +136,8 @@ public interface ErrorCodeConstants { 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_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 ================== ErrorCode TENANT_AGENCY_PACKAGE_NOT_EXISTS = new ErrorCode(1_003_018_000, "代理租户套餐不存在"); diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/enums/agencyTenantPackage/PackageTypeEnum.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/enums/agencyTenantPackage/PackageTypeEnum.java new file mode 100644 index 0000000..aee0460 --- /dev/null +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/enums/agencyTenantPackage/PackageTypeEnum.java @@ -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; + } +} diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/enums/balance/BalanceEnum.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/enums/balance/BalanceEnum.java index 87511b4..8bf2ae2 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/enums/balance/BalanceEnum.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/enums/balance/BalanceEnum.java @@ -17,7 +17,8 @@ public enum BalanceEnum { RECHARGE("充值"), TRANSFER_OUT("转出"), TRANSFER_IN("转入"), - CONSUMPTION("消费"); + CONSUMPTION("消费"), + BONUS(" 奖励"); private String desc; diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java index 6c4fbfa..672e644 100755 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java @@ -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.tenantbalance.TenantBalanceMapper; 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.RoleTypeEnum; 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())) { 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(), () -> { // 创建租户的默认角色 @@ -208,6 +218,7 @@ public class TenantServiceImpl implements TenantService { tenantBalance.setId(tenant.getId()); // 钱包ID与租户ID一致 tenantBalance.setBalance(0); // 初始余额设为0 tenantBalance.setVersion(0); // 初始版本号设为0 + tenantBalance.setTestAccountNum(15); tenantBalanceMapper.insert(tenantBalance); // 插入钱包记录 } diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/tenantbalance/TenantBalanceService.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/tenantbalance/TenantBalanceService.java index 2f9a376..7a0c201 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/tenantbalance/TenantBalanceService.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/tenantbalance/TenantBalanceService.java @@ -68,4 +68,8 @@ public interface TenantBalanceService { PageResult getSelfSubordinateTenantBalancePage(@Valid TenantBalancePageReqVO pageReqVO); Boolean consumption(Long PackageId, Long targetTenantId,String remark); + + Boolean reduceTestAccountNum(Long currentTenantId); + + Boolean addTestAccountNum(Long currentTenantId); } \ No newline at end of file diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/tenantbalance/TenantBalanceServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/tenantbalance/TenantBalanceServiceImpl.java index a1bf7a2..792b1c0 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/tenantbalance/TenantBalanceServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/tenantbalance/TenantBalanceServiceImpl.java @@ -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; + } + } \ No newline at end of file