feat(system): 新增代理租户套餐管理模块

- 新增 TenantAgencyPackage 实体、Mapper、Service 及 Controller 全套后端
- 新增租户余额消费接口及 VO(预留实现)
- 移除废弃的社交登录相关错误码,补充代理套餐错误码 TENANT_AGENCY_PACKAGE_NOT_EXISTS
- 配置文件增加 system_tenant_agency_package 缓存忽略

共 15 个文件,+578 −7 行,复杂度:非常复杂
This commit is contained in:
2025-11-24 15:59:04 +08:00
parent f03877c1d5
commit 016b4df3e8
15 changed files with 582 additions and 11 deletions

View File

@@ -0,0 +1,103 @@
package cn.iocoder.yudao.module.system.controller.admin.tenantagencypackage;
import cn.iocoder.yudao.module.system.dal.dataobject.tenantagencypackage.TenantAgencyPackageDO;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
import cn.iocoder.yudao.module.system.controller.admin.tenantagencypackage.vo.*;
import cn.iocoder.yudao.module.system.service.tenantagencypackage.TenantAgencyPackageService;
@Tag(name = "管理后台 - 代理租户套餐")
@RestController
@RequestMapping("/system/tenant-agency-package")
@Validated
public class TenantAgencyPackageController {
@Resource
private TenantAgencyPackageService tenantAgencyPackageService;
@PostMapping("/create")
@Operation(summary = "创建代理租户套餐")
@PreAuthorize("@ss.hasPermission('system:tenant-agency-package:create')")
public CommonResult<Long> createTenantAgencyPackage(@Valid @RequestBody TenantAgencyPackageSaveReqVO createReqVO) {
return success(tenantAgencyPackageService.createTenantAgencyPackage(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新代理租户套餐")
@PreAuthorize("@ss.hasPermission('system:tenant-agency-package:update')")
public CommonResult<Boolean> updateTenantAgencyPackage(@Valid @RequestBody TenantAgencyPackageSaveReqVO updateReqVO) {
tenantAgencyPackageService.updateTenantAgencyPackage(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除代理租户套餐")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('system:tenant-agency-package:delete')")
public CommonResult<Boolean> deleteTenantAgencyPackage(@RequestParam("id") Long id) {
tenantAgencyPackageService.deleteTenantAgencyPackage(id);
return success(true);
}
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除代理租户套餐")
@PreAuthorize("@ss.hasPermission('system:tenant-agency-package:delete')")
public CommonResult<Boolean> deleteTenantAgencyPackageList(@RequestParam("ids") List<Long> ids) {
tenantAgencyPackageService.deleteTenantAgencyPackageListByIds(ids);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得代理租户套餐")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('system:tenant-agency-package:query')")
public CommonResult<TenantAgencyPackageRespVO> getTenantAgencyPackage(@RequestParam("id") Long id) {
TenantAgencyPackageDO tenantAgencyPackage = tenantAgencyPackageService.getTenantAgencyPackage(id);
return success(BeanUtils.toBean(tenantAgencyPackage, TenantAgencyPackageRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得代理租户套餐分页")
@PreAuthorize("@ss.hasPermission('system:tenant-agency-package:query')")
public CommonResult<PageResult<TenantAgencyPackageRespVO>> getTenantAgencyPackagePage(@Valid TenantAgencyPackagePageReqVO pageReqVO) {
PageResult<TenantAgencyPackageDO> pageResult = tenantAgencyPackageService.getTenantAgencyPackagePage(pageReqVO);
return success(BeanUtils.toBean(pageResult, TenantAgencyPackageRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出代理租户套餐 Excel")
@PreAuthorize("@ss.hasPermission('system:tenant-agency-package:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportTenantAgencyPackageExcel(@Valid TenantAgencyPackagePageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<TenantAgencyPackageDO> list = tenantAgencyPackageService.getTenantAgencyPackagePage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "代理租户套餐.xls", "数据", TenantAgencyPackageRespVO.class,
BeanUtils.toBean(list, TenantAgencyPackageRespVO.class));
}
}

View File

@@ -0,0 +1,50 @@
package cn.iocoder.yudao.module.system.controller.admin.tenantagencypackage.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 代理租户套餐分页 Request VO")
@Data
public class TenantAgencyPackagePageReqVO extends PageParam {
@Schema(description = "套餐名", example = "芋艿")
private String name;
@Schema(description = "租户状态0正常 1停用", example = "2")
private Integer status;
@Schema(description = "备注", example = "你猜")
private String remark;
@Schema(description = "关联的菜单编号")
private String menuIds;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "套餐天数")
private Integer days;
@Schema(description = "套餐价格", example = "22890")
private Integer price;
@Schema(description = "爬主播客户端 0 关闭 1 开启")
private Integer hostslClient;
@Schema(description = "爬大哥客户端 0 关闭 1 开启")
private Integer brotherClient;
@Schema(description = "AI 客户端 0 关闭 1 开启")
private Integer aiClient;
@Schema(description = "套餐类型", example = "2")
private Integer packageType;
}

View File

@@ -0,0 +1,63 @@
package cn.iocoder.yudao.module.system.controller.admin.tenantagencypackage.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 代理租户套餐 Response VO")
@Data
@ExcelIgnoreUnannotated
public class TenantAgencyPackageRespVO {
@Schema(description = "套餐编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20125")
@ExcelProperty("套餐编号")
private Long id;
@Schema(description = "套餐名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
@ExcelProperty("套餐名")
private String name;
@Schema(description = "租户状态0正常 1停用", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
@ExcelProperty("租户状态0正常 1停用")
private Integer status;
@Schema(description = "备注", example = "你猜")
@ExcelProperty("备注")
private String remark;
@Schema(description = "关联的菜单编号", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("关联的菜单编号")
private String menuIds;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "套餐天数", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("套餐天数")
private Integer days;
@Schema(description = "套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "22890")
@ExcelProperty("套餐价格")
private Integer price;
@Schema(description = "爬主播客户端 0 关闭 1 开启")
@ExcelProperty("爬主播客户端 0 关闭 1 开启")
private Integer hostslClient;
@Schema(description = "爬大哥客户端 0 关闭 1 开启")
@ExcelProperty("爬大哥客户端 0 关闭 1 开启")
private Integer brotherClient;
@Schema(description = "AI 客户端 0 关闭 1 开启")
@ExcelProperty("AI 客户端 0 关闭 1 开启")
private Integer aiClient;
@Schema(description = "套餐类型", example = "2")
@ExcelProperty("套餐类型")
private Integer packageType;
}

View File

@@ -0,0 +1,50 @@
package cn.iocoder.yudao.module.system.controller.admin.tenantagencypackage.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 代理租户套餐新增/修改 Request VO")
@Data
public class TenantAgencyPackageSaveReqVO {
@Schema(description = "套餐编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20125")
private Long id;
@Schema(description = "套餐名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
@NotEmpty(message = "套餐名不能为空")
private String name;
@Schema(description = "租户状态0正常 1停用", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
@NotNull(message = "租户状态0正常 1停用不能为空")
private Integer status;
@Schema(description = "备注", example = "你猜")
private String remark;
@Schema(description = "关联的菜单编号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "关联的菜单编号不能为空")
private String menuIds;
@Schema(description = "套餐天数", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "套餐天数不能为空")
private Integer days;
@Schema(description = "套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "22890")
@NotNull(message = "套餐价格不能为空")
private Integer price;
@Schema(description = "爬主播客户端 0 关闭 1 开启")
private Integer hostslClient;
@Schema(description = "爬大哥客户端 0 关闭 1 开启")
private Integer brotherClient;
@Schema(description = "AI 客户端 0 关闭 1 开启")
private Integer aiClient;
@Schema(description = "套餐类型", example = "2")
private Integer packageType;
}

View File

@@ -133,4 +133,6 @@ public class TenantBalanceController {
PageResult<TenantBalanceRespVO> tenantBalancePage = tenantBalanceService.getSelfSubordinateTenantBalancePage(pageReqVO);
return success(BeanUtils.toBean(tenantBalancePage, TenantBalanceRespVO.class));
}
}

View File

@@ -0,0 +1,17 @@
package cn.iocoder.yudao.module.system.controller.admin.tenantbalance.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/*
* @author: ziin
* @date: 2025/11/24 15:32
*/
@Schema(description = "管理后台 - 租户余额消费")
@Data
public class TenantBalanceConsumptionReqVO {
@Schema( description = "套餐编号")
private Long id;
}

View File

@@ -0,0 +1,72 @@
package cn.iocoder.yudao.module.system.dal.dataobject.tenantagencypackage;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* 代理租户套餐 DO
*
* @author 总后台
*/
@TableName("system_tenant_agency_package")
@KeySequence("system_tenant_agency_package_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TenantAgencyPackageDO extends BaseDO {
/**
* 套餐编号
*/
@TableId
private Long id;
/**
* 套餐名
*/
private String name;
/**
* 租户状态0正常 1停用
*/
private Integer status;
/**
* 备注
*/
private String remark;
/**
* 关联的菜单编号
*/
private String menuIds;
/**
* 套餐天数
*/
private Integer days;
/**
* 套餐价格
*/
private Integer price;
/**
* 爬主播客户端 0 关闭 1 开启
*/
private Integer hostslClient;
/**
* 爬大哥客户端 0 关闭 1 开启
*/
private Integer brotherClient;
/**
* AI 客户端 0 关闭 1 开启
*/
private Integer aiClient;
/**
* 套餐类型
*/
private Integer packageType;
}

View File

@@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.system.dal.mysql.tenantagencypackage;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.system.dal.dataobject.tenantagencypackage.TenantAgencyPackageDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.system.controller.admin.tenantagencypackage.vo.*;
/**
* 代理租户套餐 Mapper
*
* @author 总后台
*/
@Mapper
public interface TenantAgencyPackageMapper extends BaseMapperX<TenantAgencyPackageDO> {
default PageResult<TenantAgencyPackageDO> selectPage(TenantAgencyPackagePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<TenantAgencyPackageDO>()
.likeIfPresent(TenantAgencyPackageDO::getName, reqVO.getName())
.eqIfPresent(TenantAgencyPackageDO::getStatus, reqVO.getStatus())
.eqIfPresent(TenantAgencyPackageDO::getRemark, reqVO.getRemark())
.eqIfPresent(TenantAgencyPackageDO::getMenuIds, reqVO.getMenuIds())
.betweenIfPresent(TenantAgencyPackageDO::getCreateTime, reqVO.getCreateTime())
.eqIfPresent(TenantAgencyPackageDO::getDays, reqVO.getDays())
.eqIfPresent(TenantAgencyPackageDO::getPrice, reqVO.getPrice())
.eqIfPresent(TenantAgencyPackageDO::getHostslClient, reqVO.getHostslClient())
.eqIfPresent(TenantAgencyPackageDO::getBrotherClient, reqVO.getBrotherClient())
.eqIfPresent(TenantAgencyPackageDO::getAiClient, reqVO.getAiClient())
.eqIfPresent(TenantAgencyPackageDO::getPackageType, reqVO.getPackageType())
.orderByDesc(TenantAgencyPackageDO::getId));
}
}

View File

@@ -136,19 +136,12 @@ public interface ErrorCodeConstants {
ErrorCode TENANT_BALANCE_TRANSFER_ERROR_TARGET_NOT_SUBORDINATE = new ErrorCode(1_003_017_012, "转账目标租户不是当前租户的下级");
// ================= 租户套餐 1-003-018-000 ==================
ErrorCode TENANT_AGENCY_PACKAGE_NOT_EXISTS = new ErrorCode(1_003_018_000, "代理租户套餐不存在");
// ========== 社交用户 1-002-018-000 ==========
ErrorCode SOCIAL_USER_AUTH_FAILURE = new ErrorCode(1_002_018_000, "社交授权失败,原因是:{}");
ErrorCode SOCIAL_USER_NOT_FOUND = new ErrorCode(1_002_018_001, "社交授权失败,找不到对应的用户");
ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_PHONE_CODE_ERROR = new ErrorCode(1_002_018_200, "获得手机号失败");
ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_QRCODE_ERROR = new ErrorCode(1_002_018_201, "获得小程序码失败");
ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_TEMPLATE_ERROR = new ErrorCode(1_002_018_202, "获得小程序订阅消息模版失败");
ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_MESSAGE_ERROR = new ErrorCode(1_002_018_203, "发送小程序订阅消息失败");
ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_ORDER_UPLOAD_SHIPPING_INFO_ERROR = new ErrorCode(1_002_018_204, "上传微信小程序发货信息失败");
ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_ORDER_NOTIFY_CONFIRM_RECEIVE_ERROR = new ErrorCode(1_002_018_205, "上传微信小程序订单收货信息失败");
ErrorCode SOCIAL_CLIENT_NOT_EXISTS = new ErrorCode(1_002_018_210, "社交客户端不存在");
ErrorCode SOCIAL_CLIENT_UNIQUE = new ErrorCode(1_002_018_211, "社交客户端已存在配置");
// ========== OAuth2 客户端 1-002-020-000 =========
ErrorCode OAUTH2_CLIENT_NOT_EXISTS = new ErrorCode(1_002_020_000, "OAuth2 客户端不存在");

View File

@@ -0,0 +1,61 @@
package cn.iocoder.yudao.module.system.service.tenantagencypackage;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.system.controller.admin.tenantagencypackage.vo.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.dal.dataobject.tenantagencypackage.TenantAgencyPackageDO;
/**
* 代理租户套餐 Service 接口
*
* @author 总后台
*/
public interface TenantAgencyPackageService {
/**
* 创建代理租户套餐
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createTenantAgencyPackage(@Valid TenantAgencyPackageSaveReqVO createReqVO);
/**
* 更新代理租户套餐
*
* @param updateReqVO 更新信息
*/
void updateTenantAgencyPackage(@Valid TenantAgencyPackageSaveReqVO updateReqVO);
/**
* 删除代理租户套餐
*
* @param id 编号
*/
void deleteTenantAgencyPackage(Long id);
/**
* 批量删除代理租户套餐
*
* @param ids 编号
*/
void deleteTenantAgencyPackageListByIds(List<Long> ids);
/**
* 获得代理租户套餐
*
* @param id 编号
* @return 代理租户套餐
*/
TenantAgencyPackageDO getTenantAgencyPackage(Long id);
/**
* 获得代理租户套餐分页
*
* @param pageReqVO 分页查询
* @return 代理租户套餐分页
*/
PageResult<TenantAgencyPackageDO> getTenantAgencyPackagePage(TenantAgencyPackagePageReqVO pageReqVO);
}

View File

@@ -0,0 +1,88 @@
package cn.iocoder.yudao.module.system.service.tenantagencypackage;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.module.system.dal.dataobject.tenantagencypackage.TenantAgencyPackageDO;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import java.util.*;
import cn.iocoder.yudao.module.system.controller.admin.tenantagencypackage.vo.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.dal.mysql.tenantagencypackage.TenantAgencyPackageMapper;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
/**
* 代理租户套餐 Service 实现类
*
* @author 总后台
*/
@Service
@Validated
public class TenantAgencyPackageServiceImpl implements TenantAgencyPackageService {
@Resource
private TenantAgencyPackageMapper tenantAgencyPackageMapper;
@Override
public Long createTenantAgencyPackage(TenantAgencyPackageSaveReqVO createReqVO) {
// 插入
TenantAgencyPackageDO tenantAgencyPackage = BeanUtils.toBean(createReqVO, TenantAgencyPackageDO.class);
tenantAgencyPackageMapper.insert(tenantAgencyPackage);
// 返回
return tenantAgencyPackage.getId();
}
@Override
public void updateTenantAgencyPackage(TenantAgencyPackageSaveReqVO updateReqVO) {
// 校验存在
validateTenantAgencyPackageExists(updateReqVO.getId());
// 更新
TenantAgencyPackageDO updateObj = BeanUtils.toBean(updateReqVO, TenantAgencyPackageDO.class);
tenantAgencyPackageMapper.updateById(updateObj);
}
@Override
public void deleteTenantAgencyPackage(Long id) {
// 校验存在
validateTenantAgencyPackageExists(id);
// 删除
tenantAgencyPackageMapper.deleteById(id);
}
@Override
public void deleteTenantAgencyPackageListByIds(List<Long> ids) {
// 校验存在
validateTenantAgencyPackageExists(ids);
// 删除
tenantAgencyPackageMapper.deleteByIds(ids);
}
private void validateTenantAgencyPackageExists(List<Long> ids) {
List<TenantAgencyPackageDO> list = tenantAgencyPackageMapper.selectByIds(ids);
if (CollUtil.isEmpty(list) || list.size() != ids.size()) {
throw exception(TENANT_AGENCY_PACKAGE_NOT_EXISTS);
}
}
private void validateTenantAgencyPackageExists(Long id) {
if (tenantAgencyPackageMapper.selectById(id) == null) {
throw exception(TENANT_AGENCY_PACKAGE_NOT_EXISTS);
}
}
@Override
public TenantAgencyPackageDO getTenantAgencyPackage(Long id) {
return tenantAgencyPackageMapper.selectById(id);
}
@Override
public PageResult<TenantAgencyPackageDO> getTenantAgencyPackagePage(TenantAgencyPackagePageReqVO pageReqVO) {
return tenantAgencyPackageMapper.selectPage(pageReqVO);
}
}

View File

@@ -66,4 +66,6 @@ public interface TenantBalanceService {
TenantBalanceDO getSelfBalance();
PageResult<TenantBalanceRespVO> getSelfSubordinateTenantBalancePage(@Valid TenantBalancePageReqVO pageReqVO);
Boolean consumption(@Valid TenantBalanceConsumptionReqVO consumptionReqVO);
}

View File

@@ -294,4 +294,25 @@ public class TenantBalanceServiceImpl implements TenantBalanceService {
return new PageResult<>(tenantBalanceRespVOIPage.getRecords(),tenantBalanceRespVOIPage.getTotal());
}
@Override
public Boolean consumption(TenantBalanceConsumptionReqVO consumptionReqVO) {
Long tenantId = TenantContextHolder.getTenantId();
// TenantBalanceDO tenantBalance = tenantBalanceMapper.selectById(tenantId);
// if (tenantBalance == null) {
// throw exception(TENANT_WALLET_NOT_EXISTS);
// }
// if (tenantBalance.getBalance() < consumptionReqVO.getAmount()) {
// throw exception(TENANT_WALLET_NOT_ENOUGH);
// }
// Integer updateCount = tenantBalanceMapper.updateBalanceWithVersion(tenantId, -consumptionReqVO.getAmount(), tenantBalance.getVersion());
// if (updateCount == 0) {
// throw exception(TENANT_BALANCE_CONSUMPTION_OPERATION_ERROR);
// }
return true;
}
}

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.tenantagencypackage.TenantAgencyPackageMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

View File

@@ -195,6 +195,7 @@ yudao:
- ai_language
- system_tenant_balance
- system_tenant_points
- system_tenant_agency_package
ignore-caches:
- user_role_ids
- permission_menu_ids