【同步】BOOT 和 CLOUD 的功能

This commit is contained in:
YunaiV
2025-12-28 10:22:05 +08:00
parent f922d3fd55
commit 0f27c0aa72
41 changed files with 2851 additions and 1394 deletions

View File

@@ -76,7 +76,7 @@ public interface CouponTemplateMapper extends BaseMapperX<CouponTemplateDO> {
.in(CouponTemplateDO::getTakeType, canTakeTypes) // 2. 领取方式一致
.and(ww -> ww.gt(CouponTemplateDO::getValidEndTime, LocalDateTime.now()) // 3.1 未过期
.or().eq(CouponTemplateDO::getValidityType, CouponTemplateValidityTypeEnum.TERM.getType())) // 3.2 领取之后
.apply(" (take_count < total_count OR total_count = -1)"); // 4. 剩余数量大于 0或者无限领取
.apply(" (take_count < total_count OR total_count = " + CouponTemplateDO.TOTAL_COUNT_MAX + ")"); // 4. 剩余数量大于 0或者无限领取
}
return canTakeConsumer;
}

View File

@@ -285,8 +285,8 @@ public class CouponServiceImpl implements CouponService {
// 校验剩余发放数量是否充足(仅在 CouponTakeTypeEnum.USER 用户领取时)
// 关联案例https://t.zsxq.com/mElGQ、https://t.zsxq.com/6pLzr
if (CouponTakeTypeEnum.isUser(couponTemplate.getTakeType())
&& ObjUtil.notEqual(couponTemplate.getTakeLimitCount(), CouponTemplateDO.TAKE_LIMIT_COUNT_MAX) // 校验不限制领取数
&& couponTemplate.getTakeCount() > couponTemplate.getTotalCount()) { // 已领取数量 >= 总发放数量
&& !couponTemplateService.isTotalCountUnlimited(couponTemplate.getTotalCount()) // 校验不限制总发放数量
&& couponTemplate.getTakeCount() > couponTemplate.getTotalCount()) { // 已领取数量 > 总发放数量
throw exception(COUPON_TEMPLATE_NOT_ENOUGH);
}
// 校验"固定日期"的有效期类型是否过期
@@ -304,7 +304,7 @@ public class CouponServiceImpl implements CouponService {
* @param couponTemplate 优惠劵模版
*/
private void removeTakeLimitUser(Set<Long> userIds, CouponTemplateDO couponTemplate) {
if (couponTemplate.getTakeLimitCount() <= 0) {
if (couponTemplateService.isTakeLimitCountUnlimited(couponTemplate.getTakeLimitCount())) {
return;
}
// 查询已领过券的用户
@@ -360,7 +360,8 @@ public class CouponServiceImpl implements CouponService {
}
// 2.1 过滤领取数量无限制的
Set<Long> templateIds = convertSet(templates, CouponTemplateDO::getId, template -> template.getTakeLimitCount() != -1);
Set<Long> templateIds = convertSet(templates, CouponTemplateDO::getId,
template -> !couponTemplateService.isTakeLimitCountUnlimited(template.getTakeLimitCount()));
// 2.2 检查用户领取的数量是否超过限制
if (CollUtil.isNotEmpty(templateIds)) {
Map<Long, Integer> couponTakeCountMap = this.getTakeCountMapByTemplateIds(templateIds, userId);

View File

@@ -6,8 +6,8 @@ import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template.Cou
import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template.CouponTemplateUpdateReqVO;
import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponTemplateDO;
import cn.iocoder.yudao.module.promotion.enums.coupon.CouponTakeTypeEnum;
import jakarta.validation.Valid;
import jakarta.validation.Valid;
import java.util.Collection;
import java.util.List;
@@ -18,6 +18,23 @@ import java.util.List;
*/
public interface CouponTemplateService {
/**
* 判断是否不限制每人领取数量
*
* @param takeLimitCount 每人限领个数
* @return 是否不限制
*/
boolean isTakeLimitCountUnlimited(Integer takeLimitCount);
/**
* 判断是否不限制总发放数量
*
* @param totalCount 发放数量
* @return 是否不限制
*/
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
boolean isTotalCountUnlimited(Integer totalCount);
/**
* 创建优惠劵模板
*

View File

@@ -1,6 +1,5 @@
package cn.iocoder.yudao.module.promotion.service.coupon;
import cn.hutool.core.util.ObjUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.product.api.category.ProductCategoryApi;
@@ -41,6 +40,16 @@ public class CouponTemplateServiceImpl implements CouponTemplateService {
@Resource
private ProductSpuApi productSpuApi;
@Override
public boolean isTakeLimitCountUnlimited(Integer takeLimitCount) {
return CouponTemplateDO.TAKE_LIMIT_COUNT_MAX.equals(takeLimitCount);
}
@Override
public boolean isTotalCountUnlimited(Integer totalCount) {
return CouponTemplateDO.TOTAL_COUNT_MAX.equals(totalCount);
}
@Override
public Long createCouponTemplate(CouponTemplateCreateReqVO createReqVO) {
// 校验商品范围
@@ -59,7 +68,7 @@ public class CouponTemplateServiceImpl implements CouponTemplateService {
CouponTemplateDO couponTemplate = validateCouponTemplateExists(updateReqVO.getId());
// 校验发放数量不能过小(仅在 CouponTakeTypeEnum.USER 用户领取时)
if (CouponTakeTypeEnum.isUser(couponTemplate.getTakeType())
&& ObjUtil.notEqual(couponTemplate.getTakeLimitCount(), CouponTemplateDO.TAKE_LIMIT_COUNT_MAX) // 非不限制
&& !isTotalCountUnlimited(updateReqVO.getTotalCount()) // 非不限制总发放数量
&& updateReqVO.getTotalCount() < couponTemplate.getTakeCount()) {
throw exception(COUPON_TEMPLATE_TOTAL_COUNT_TOO_SMALL, couponTemplate.getTakeCount());
}