mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2024-11-22 23:31:52 +08:00
【代码优化】商城: 满减送活动优惠券相关
This commit is contained in:
parent
d60374d646
commit
806c828bb5
@ -5,7 +5,7 @@ import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponUseReqDTO;
|
|||||||
import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponValidReqDTO;
|
import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponValidReqDTO;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 优惠劵 API 接口
|
* 优惠劵 API 接口
|
||||||
@ -36,14 +36,20 @@ public interface CouponApi {
|
|||||||
*/
|
*/
|
||||||
CouponRespDTO validateCoupon(@Valid CouponValidReqDTO validReqDTO);
|
CouponRespDTO validateCoupon(@Valid CouponValidReqDTO validReqDTO);
|
||||||
|
|
||||||
// TODO @puhui999:Map<Long, Integer> 优惠劵 会不会好点。
|
|
||||||
/**
|
/**
|
||||||
* 【管理员】给指定用户批量发送优惠券
|
* 【管理员】给指定用户批量发送优惠券
|
||||||
*
|
*
|
||||||
* @param templateIds 优惠劵编号的数组
|
* @param giveCouponsMap key: 优惠劵编号,value:对应的优惠券数量
|
||||||
* @param counts 优惠券数量的数组
|
|
||||||
* @param userId 用户编号
|
* @param userId 用户编号
|
||||||
*/
|
*/
|
||||||
void takeCouponsByAdmin(List<Long> templateIds, List<Integer> counts, Long userId);
|
void takeCouponsByAdmin(Map<Long, Integer> giveCouponsMap, Long userId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 【管理员】收回给指定用户批量发送优惠券
|
||||||
|
*
|
||||||
|
* @param giveCouponsMap key: 优惠劵编号,value:对应的优惠券数量
|
||||||
|
* @param userId 用户编号
|
||||||
|
*/
|
||||||
|
void takeBackCouponsByAdmin(Map<Long, Integer> giveCouponsMap, Long userId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ import lombok.Data;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 满减送活动的匹配 Response DTO
|
* 满减送活动的匹配 Response DTO
|
||||||
@ -98,13 +99,11 @@ public class RewardActivityMatchRespDTO {
|
|||||||
*/
|
*/
|
||||||
private Boolean giveCoupon;
|
private Boolean giveCoupon;
|
||||||
/**
|
/**
|
||||||
* 赠送的优惠劵编号的数组
|
* 赠送的优惠劵
|
||||||
|
*
|
||||||
|
* key: 优惠劵编号,value:对应的优惠券数量
|
||||||
*/
|
*/
|
||||||
private List<Long> couponIds;
|
private Map<Long, Integer> giveCouponsMap;
|
||||||
/**
|
|
||||||
* 赠送的优惠券数量的数组
|
|
||||||
*/
|
|
||||||
private List<Integer> couponCounts;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ public enum CouponStatusEnum implements IntArrayValuable {
|
|||||||
UNUSED(1, "未使用"),
|
UNUSED(1, "未使用"),
|
||||||
USED(2, "已使用"),
|
USED(2, "已使用"),
|
||||||
EXPIRE(3, "已过期"),
|
EXPIRE(3, "已过期"),
|
||||||
;
|
INVALID(4, "已作废");
|
||||||
|
|
||||||
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CouponStatusEnum::getStatus).toArray();
|
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CouponStatusEnum::getStatus).toArray();
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ import jakarta.annotation.Resource;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 优惠劵 API 实现类
|
* 优惠劵 API 实现类
|
||||||
@ -43,8 +43,13 @@ public class CouponApiImpl implements CouponApi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void takeCouponsByAdmin(List<Long> templateIds, List<Integer> counts, Long userId) {
|
public void takeCouponsByAdmin(Map<Long, Integer> giveCouponsMap, Long userId) {
|
||||||
couponService.takeCouponsByAdmin(templateIds, counts, userId);
|
couponService.takeCouponsByAdmin(giveCouponsMap, userId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void takeBackCouponsByAdmin(Map<Long, Integer> giveCouponsMap, Long userId) {
|
||||||
|
couponService.takeBackCouponsByAdmin(giveCouponsMap, userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@ import lombok.Data;
|
|||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -88,16 +89,7 @@ public class RewardActivityBaseVO {
|
|||||||
private Boolean giveCoupon;
|
private Boolean giveCoupon;
|
||||||
|
|
||||||
@Schema(description = "赠送的优惠劵编号的数组", example = "1,2,3")
|
@Schema(description = "赠送的优惠劵编号的数组", example = "1,2,3")
|
||||||
private List<Long> couponIds;
|
private Map<Long, Integer> giveCouponsMap;
|
||||||
|
|
||||||
@Schema(description = "赠送的优惠券数量的数组", example = "1,2,3")
|
|
||||||
private List<Integer> couponCounts;
|
|
||||||
|
|
||||||
@AssertTrue(message = "优惠劵和数量必须一一对应")
|
|
||||||
@JsonIgnore
|
|
||||||
public boolean isCouponCountsValid() {
|
|
||||||
return BooleanUtil.isFalse(giveCoupon) || CollUtil.size(couponIds) == CollUtil.size(couponCounts);
|
|
||||||
}
|
|
||||||
|
|
||||||
@AssertTrue(message = "赠送的积分不能小于 1")
|
@AssertTrue(message = "赠送的积分不能小于 1")
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
|
@ -50,7 +50,6 @@ public class CouponDO extends BaseDO {
|
|||||||
*
|
*
|
||||||
* 枚举 {@link CouponStatusEnum}
|
* 枚举 {@link CouponStatusEnum}
|
||||||
*/
|
*/
|
||||||
// TODO 芋艿:已作废?
|
|
||||||
private Integer status;
|
private Integer status;
|
||||||
|
|
||||||
// TODO 芋艿:发放 adminid?
|
// TODO 芋艿:发放 adminid?
|
||||||
|
@ -16,6 +16,7 @@ import lombok.EqualsAndHashCode;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 满减送活动 DO
|
* 满减送活动 DO
|
||||||
@ -114,13 +115,11 @@ public class RewardActivityDO extends BaseDO {
|
|||||||
*/
|
*/
|
||||||
private Boolean giveCoupon;
|
private Boolean giveCoupon;
|
||||||
/**
|
/**
|
||||||
* 赠送的优惠劵编号的数组
|
* 赠送的优惠劵
|
||||||
|
*
|
||||||
|
* key: 优惠劵编号,value:对应的优惠券数量
|
||||||
*/
|
*/
|
||||||
private List<Long> couponIds;
|
private Map<Long, Integer> giveCouponsMap;
|
||||||
/**
|
|
||||||
* 赠送的优惠券数量的数组
|
|
||||||
*/
|
|
||||||
private List<Integer> couponCounts;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,6 +72,15 @@ public interface CouponMapper extends BaseMapperX<CouponDO> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default List<CouponDO> selectListByTemplateIdAndUserIdAndTakeType(Long templateId, Collection<Long> userIds,
|
||||||
|
Integer takeType) {
|
||||||
|
return selectList(new LambdaQueryWrapperX<CouponDO>()
|
||||||
|
.eq(CouponDO::getTemplateId, templateId)
|
||||||
|
.eq(CouponDO::getTakeType, takeType)
|
||||||
|
.in(CouponDO::getUserId, userIds)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
default Map<Long, Integer> selectCountByUserIdAndTemplateIdIn(Long userId, Collection<Long> templateIds) {
|
default Map<Long, Integer> selectCountByUserIdAndTemplateIdIn(Long userId, Collection<Long> templateIds) {
|
||||||
String templateIdAlias = "templateId";
|
String templateIdAlias = "templateId";
|
||||||
String countAlias = "count";
|
String countAlias = "count";
|
||||||
|
@ -108,11 +108,18 @@ public interface CouponService {
|
|||||||
/**
|
/**
|
||||||
* 【管理员】给指定用户批量发送优惠券
|
* 【管理员】给指定用户批量发送优惠券
|
||||||
*
|
*
|
||||||
* @param templateIds 优惠劵编号的数组
|
* @param giveCouponsMap key: 优惠劵编号,value:对应的优惠券数量
|
||||||
* @param counts 优惠券数量的数组
|
|
||||||
* @param userId 用户编号
|
* @param userId 用户编号
|
||||||
*/
|
*/
|
||||||
void takeCouponsByAdmin(List<Long> templateIds, List<Integer> counts, Long userId);
|
void takeCouponsByAdmin(Map<Long, Integer> giveCouponsMap, Long userId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 【管理员】收回给指定用户批量发送优惠券
|
||||||
|
*
|
||||||
|
* @param giveCouponsMap key: 优惠劵编号,value:对应的优惠券数量
|
||||||
|
* @param userId 用户编号
|
||||||
|
*/
|
||||||
|
void takeBackCouponsByAdmin(Map<Long, Integer> giveCouponsMap, Long userId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 【会员】领取优惠券
|
* 【会员】领取优惠券
|
||||||
|
@ -31,7 +31,6 @@ import java.util.stream.Collectors;
|
|||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
|
|
||||||
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
|
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
|
||||||
import static java.util.Arrays.asList;
|
import static java.util.Arrays.asList;
|
||||||
|
|
||||||
@ -165,6 +164,7 @@ public class CouponServiceImpl implements CouponService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void takeCoupon(Long templateId, Set<Long> userIds, CouponTakeTypeEnum takeType) {
|
public void takeCoupon(Long templateId, Set<Long> userIds, CouponTakeTypeEnum takeType) {
|
||||||
CouponTemplateDO template = couponTemplateService.getCouponTemplate(templateId);
|
CouponTemplateDO template = couponTemplateService.getCouponTemplate(templateId);
|
||||||
// 1. 过滤掉达到领取限制的用户
|
// 1. 过滤掉达到领取限制的用户
|
||||||
@ -180,28 +180,66 @@ public class CouponServiceImpl implements CouponService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void takeCouponsByAdmin(List<Long> templateIds, List<Integer> counts, Long userId) {
|
public void takeCouponsByAdmin(Map<Long, Integer> giveCouponsMap, Long userId) {
|
||||||
// TODO @puhui999:要不要循环调用上面的 takeCoupon 方法?按道理说,赠送也不会很多张。如果某次发卷失败,可以打个 error log;
|
if (CollUtil.isEmpty(giveCouponsMap)) {
|
||||||
// 1. 获得优惠券模版
|
|
||||||
List<CouponTemplateDO> templateList = couponTemplateService.getCouponTemplateList(templateIds);
|
|
||||||
if (CollUtil.isEmpty(templateList)) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<Long, CouponTemplateDO> templateMap = convertMap(templateList, CouponTemplateDO::getId);
|
// 循环发放
|
||||||
// 2.1 批量构建优惠券
|
for (Map.Entry<Long, Integer> entry : giveCouponsMap.entrySet()) {
|
||||||
List<CouponDO> couponList = new ArrayList<>();
|
try {
|
||||||
for (int i = 0; i < templateIds.size(); i++) {
|
for (int i = 0; i < entry.getValue(); i++) {
|
||||||
int finalI = i;
|
getSelf().takeCoupon(entry.getKey(), CollUtil.newHashSet(userId), CouponTakeTypeEnum.ADMIN);
|
||||||
findAndThen(templateMap, templateIds.get(i), template -> {
|
|
||||||
for (int j = 0; j < counts.get(finalI); j++) {
|
|
||||||
couponList.add(CouponConvert.INSTANCE.convert(template, userId)
|
|
||||||
.setTakeType(CouponTakeTypeEnum.ADMIN.getValue()));
|
|
||||||
}
|
}
|
||||||
});
|
} catch (Exception e) {
|
||||||
|
log.error("[takeCouponsByAdmin][coupon({}) 优惠券发放失败]", entry, e);
|
||||||
}
|
}
|
||||||
// 2.2 批量保存优惠券
|
}
|
||||||
couponMapper.insertBatch(couponList);
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void takeBackCouponsByAdmin(Map<Long, Integer> giveCouponsMap, Long userId) {
|
||||||
|
// 循环收回
|
||||||
|
for (Map.Entry<Long, Integer> entry : giveCouponsMap.entrySet()) {
|
||||||
|
try {
|
||||||
|
for (int i = 0; i < entry.getValue(); i++) {
|
||||||
|
getSelf().takeBackCoupon(entry.getKey(), CollUtil.newHashSet(userId), CouponTakeTypeEnum.ADMIN);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("[takeBackCouponsByAdmin][coupon({}) 收回优惠券失败]", entry, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 【管理员】收回优惠券
|
||||||
|
*
|
||||||
|
* @param templateId 模版编号
|
||||||
|
* @param userIds 用户编号列表
|
||||||
|
* @param takeType 领取方式
|
||||||
|
*/
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void takeBackCoupon(Long templateId, Set<Long> userIds, CouponTakeTypeEnum takeType) {
|
||||||
|
CouponTemplateDO couponTemplate = couponTemplateService.getCouponTemplate(templateId);
|
||||||
|
// 1.1 校验模板
|
||||||
|
if (couponTemplate == null) {
|
||||||
|
throw exception(COUPON_TEMPLATE_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
// 1.2 校验领取方式
|
||||||
|
if (ObjectUtil.notEqual(couponTemplate.getTakeType(), takeType.getValue())) {
|
||||||
|
throw exception(COUPON_TEMPLATE_CANNOT_TAKE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2.1 过滤出还未使用的赠送的优惠券
|
||||||
|
List<CouponDO> couponList = couponMapper.selectListByTemplateIdAndUserIdAndTakeType(templateId, userIds,
|
||||||
|
takeType.getValue());
|
||||||
|
List<CouponDO> unUsedCouponList = filterList(couponList, item -> !CouponStatusEnum.USED.getStatus().equals(item.getStatus()));
|
||||||
|
// 2.2 减少优惠劵模板的领取数量
|
||||||
|
couponTemplateService.updateCouponTemplateTakeCount(templateId, unUsedCouponList.size() * -1);
|
||||||
|
// 2.3 批量更新优惠劵状态
|
||||||
|
couponMapper.updateById(convertList(unUsedCouponList, item -> new CouponDO().setId(item.getId())
|
||||||
|
.setStatus(CouponStatusEnum.INVALID.getStatus())));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -12,11 +12,13 @@ import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum;
|
|||||||
import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
|
import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
|
||||||
import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
|
import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
|
||||||
import com.baomidou.mybatisplus.annotation.KeySequence;
|
import com.baomidou.mybatisplus.annotation.KeySequence;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
|
||||||
import lombok.*;
|
import lombok.*;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 交易订单 DO
|
* 交易订单 DO
|
||||||
@ -292,19 +294,14 @@ public class TradeOrderDO extends BaseDO {
|
|||||||
*/
|
*/
|
||||||
private Integer vipPrice;
|
private Integer vipPrice;
|
||||||
|
|
||||||
// TODO @puhui999::1)建议命名要 giveXXX;不然不好理解哈;2)是不是搞成 Map 好点哈。
|
|
||||||
/**
|
/**
|
||||||
* 赠送的优惠劵编号的数组
|
* 赠送的优惠劵
|
||||||
*
|
*
|
||||||
|
* key: 优惠劵编号,value:对应的优惠券数量
|
||||||
* 目的:用于后续取消或者售后订单时,需要扣减赠送
|
* 目的:用于后续取消或者售后订单时,需要扣减赠送
|
||||||
*/
|
*/
|
||||||
private List<Long> couponIds;
|
@TableField(typeHandler = JacksonTypeHandler.class)
|
||||||
/**
|
private Map<Long, Integer> giveCouponsMap;
|
||||||
* 赠送的优惠券数量的数组
|
|
||||||
*
|
|
||||||
* 目的:用于后续取消或者售后订单时,需要扣减赠送
|
|
||||||
*/
|
|
||||||
private List<Integer> couponCounts;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 秒杀活动编号
|
* 秒杀活动编号
|
||||||
|
@ -202,7 +202,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
|||||||
order.setProductCount(getSumValue(calculateRespBO.getItems(), TradePriceCalculateRespBO.OrderItem::getCount, Integer::sum));
|
order.setProductCount(getSumValue(calculateRespBO.getItems(), TradePriceCalculateRespBO.OrderItem::getCount, Integer::sum));
|
||||||
order.setUserIp(getClientIP()).setTerminal(getTerminal());
|
order.setUserIp(getClientIP()).setTerminal(getTerminal());
|
||||||
// 使用 + 赠送优惠券
|
// 使用 + 赠送优惠券
|
||||||
order.setCouponIds(calculateRespBO.getCouponIds()).setCouponCounts(calculateRespBO.getCouponCounts());
|
order.setGiveCouponsMap(calculateRespBO.getGiveCouponsMap());
|
||||||
// 支付 + 退款信息
|
// 支付 + 退款信息
|
||||||
order.setAdjustPrice(0).setPayStatus(false);
|
order.setAdjustPrice(0).setPayStatus(false);
|
||||||
order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()).setRefundPrice(0);
|
order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()).setRefundPrice(0);
|
||||||
|
@ -33,11 +33,11 @@ public class TradeCouponOrderHandler implements TradeOrderHandler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
|
public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
|
||||||
if (CollUtil.isEmpty(order.getCouponIds())) {
|
if (CollUtil.isEmpty(order.getGiveCouponsMap())) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 赠送优惠券
|
// 赠送优惠券
|
||||||
couponApi.takeCouponsByAdmin(order.getCouponIds(), order.getCouponCounts(), order.getUserId());
|
couponApi.takeCouponsByAdmin(order.getGiveCouponsMap(), order.getUserId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -48,10 +48,10 @@ public class TradeCouponOrderHandler implements TradeOrderHandler {
|
|||||||
couponApi.returnUsedCoupon(order.getCouponId());
|
couponApi.returnUsedCoupon(order.getCouponId());
|
||||||
}
|
}
|
||||||
// 情况二:收回赠送的优惠券
|
// 情况二:收回赠送的优惠券
|
||||||
if (CollUtil.isEmpty(order.getCouponIds())) {
|
if (CollUtil.isEmpty(order.getGiveCouponsMap())) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// TODO @puhui999: 收回优惠券再考虑一下,是直接删除券还是改个状态;建议是【已作废】
|
couponApi.takeBackCouponsByAdmin(order.getGiveCouponsMap(), order.getUserId());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 价格计算 Response BO
|
* 价格计算 Response BO
|
||||||
@ -72,15 +73,13 @@ public class TradePriceCalculateRespBO {
|
|||||||
*/
|
*/
|
||||||
private Boolean freeDelivery;
|
private Boolean freeDelivery;
|
||||||
|
|
||||||
// TODO @puhui999:感觉要不要试着改成 Map<Long, Integer> giveCoupons?貌似整体会更好理解一点。
|
|
||||||
/**
|
/**
|
||||||
* 赠送的优惠劵编号的数组
|
* 赠送的优惠劵
|
||||||
|
*
|
||||||
|
* key: 优惠劵编号,value:对应的优惠券数量
|
||||||
|
* 目的:用于后续取消或者售后订单时,需要扣减赠送
|
||||||
*/
|
*/
|
||||||
private List<Long> couponIds;
|
private Map<Long, Integer> giveCouponsMap;
|
||||||
/**
|
|
||||||
* 赠送的优惠券数量的数组
|
|
||||||
*/
|
|
||||||
private List<Integer> couponCounts;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 订单价格
|
* 订单价格
|
||||||
|
@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
|
|||||||
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
|
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@ -31,8 +32,7 @@ public class TradePriceCalculatorHelper {
|
|||||||
List<ProductSpuRespDTO> spuList, List<ProductSkuRespDTO> skuList) {
|
List<ProductSpuRespDTO> spuList, List<ProductSkuRespDTO> skuList) {
|
||||||
// 创建 PriceCalculateRespDTO 对象
|
// 创建 PriceCalculateRespDTO 对象
|
||||||
TradePriceCalculateRespBO result = new TradePriceCalculateRespBO();
|
TradePriceCalculateRespBO result = new TradePriceCalculateRespBO();
|
||||||
result.setType(getOrderType(param)).setPromotions(new ArrayList<>())
|
result.setType(getOrderType(param)).setPromotions(new ArrayList<>()).setGiveCouponsMap(new LinkedHashMap<>());
|
||||||
.setCouponIds(new ArrayList<>()).setCouponCounts(new ArrayList<>());
|
|
||||||
|
|
||||||
// 创建它的 OrderItem 属性
|
// 创建它的 OrderItem 属性
|
||||||
result.setItems(new ArrayList<>(param.getItems().size()));
|
result.setItems(new ArrayList<>(param.getItems().size()));
|
||||||
|
@ -19,13 +19,14 @@ import org.springframework.stereotype.Component;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Map;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
|
||||||
import static cn.iocoder.yudao.module.trade.service.price.calculator.TradePriceCalculatorHelper.formatPrice;
|
import static cn.iocoder.yudao.module.trade.service.price.calculator.TradePriceCalculatorHelper.formatPrice;
|
||||||
|
|
||||||
// TODO @puhui999:相关的单测,建议改一改
|
// TODO @puhui999:相关的单测,建议改一改
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 满减送活动的 {@link TradePriceCalculator} 实现类
|
* 满减送活动的 {@link TradePriceCalculator} 实现类
|
||||||
*
|
*
|
||||||
@ -107,16 +108,12 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator
|
|||||||
}
|
}
|
||||||
// 4.3 记录赠送的优惠券
|
// 4.3 记录赠送的优惠券
|
||||||
if (rule.getGiveCoupon()) {
|
if (rule.getGiveCoupon()) {
|
||||||
for (int i = 0; i < rule.getCouponIds().size(); i++) {
|
for (Map.Entry<Long, Integer> entry : rule.getGiveCouponsMap().entrySet()) {
|
||||||
Long couponId = result.getCouponIds().get(i);
|
Map<Long, Integer> giveCouponsMap = result.getGiveCouponsMap();
|
||||||
Integer couponCount = result.getCouponCounts().get(i);
|
if (giveCouponsMap.get(entry.getKey()) == null) { // 情况一:还没有赠送的优惠券
|
||||||
int index = CollUtil.indexOf(result.getCouponIds(), id -> Objects.equals(couponId, id));
|
result.setGiveCouponsMap(rule.getGiveCouponsMap());
|
||||||
if (index != -1) { // 情况一:别的满减活动送过同类优惠券,则直接增加数量
|
} else { // 情况二:别的满减活动送过同类优惠券,则直接增加数量
|
||||||
List<Integer> couponCounts = result.getCouponCounts();
|
giveCouponsMap.put(entry.getKey(), giveCouponsMap.get(entry.getKey()) + entry.getValue());
|
||||||
couponCounts.set(index, couponCounts.get(index) + couponCount);
|
|
||||||
result.setCouponCounts(couponCounts);
|
|
||||||
} else { // 情况二:还没有赠送的优惠券
|
|
||||||
result.setCouponIds(rule.getCouponIds()).setCouponCounts(rule.getCouponCounts());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -193,7 +190,7 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator
|
|||||||
// 2. 构建不满足时的提示信息:按最低档规则算
|
// 2. 构建不满足时的提示信息:按最低档规则算
|
||||||
String meetTip = "满减送:购满 {} {},可以减 {} 元";
|
String meetTip = "满减送:购满 {} {},可以减 {} 元";
|
||||||
List<RewardActivityMatchRespDTO.Rule> rules = new ArrayList<>(rewardActivity.getRules());
|
List<RewardActivityMatchRespDTO.Rule> rules = new ArrayList<>(rewardActivity.getRules());
|
||||||
rules.sort(Comparator.comparing(RewardActivityMatchRespDTO.Rule::getLimit)); // 按优惠门槛降序
|
rules.sort(Comparator.comparing(RewardActivityMatchRespDTO.Rule::getLimit)); // 按优惠门槛升序
|
||||||
RewardActivityMatchRespDTO.Rule rule = rules.get(0);
|
RewardActivityMatchRespDTO.Rule rule = rules.get(0);
|
||||||
if (PromotionConditionTypeEnum.PRICE.getType().equals(rewardActivity.getConditionType())) {
|
if (PromotionConditionTypeEnum.PRICE.getType().equals(rewardActivity.getConditionType())) {
|
||||||
return StrUtil.format(meetTip, rule.getLimit(), "元", MoneyUtils.fenToYuanStr(rule.getDiscountPrice()));
|
return StrUtil.format(meetTip, rule.getLimit(), "元", MoneyUtils.fenToYuanStr(rule.getDiscountPrice()));
|
||||||
|
Loading…
Reference in New Issue
Block a user