!1070 【代码优化】商城: 满减送活动

Merge pull request !1070 from puhui999/develop
This commit is contained in:
芋道源码 2024-09-02 13:48:34 +00:00 committed by Gitee
commit f3dd628aba
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
13 changed files with 36 additions and 45 deletions

View File

@ -95,8 +95,10 @@ public class RewardActivityMatchRespDTO {
* *
* key: 优惠劵模版编号 * key: 优惠劵模版编号
* value对应的优惠券数量 * value对应的优惠券数量
*
* 目的用于订单支付后赠送优惠券
*/ */
private Map<Long, Integer> giveCoupons; private Map<Long, Integer> giveCouponTemplateCounts;
} }

View File

@ -2,23 +2,22 @@ package cn.iocoder.yudao.module.promotion.controller.admin.reward;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO; import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO;
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO; import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO;
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityRespVO; import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityRespVO;
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO; import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO;
import cn.iocoder.yudao.module.promotion.convert.reward.RewardActivityConvert;
import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO;
import cn.iocoder.yudao.module.promotion.service.reward.RewardActivityService; import cn.iocoder.yudao.module.promotion.service.reward.RewardActivityService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 满减送活动") @Tag(name = "管理后台 - 满减送活动")
@ -69,7 +68,7 @@ public class RewardActivityController {
@PreAuthorize("@ss.hasPermission('promotion:reward-activity:query')") @PreAuthorize("@ss.hasPermission('promotion:reward-activity:query')")
public CommonResult<RewardActivityRespVO> getRewardActivity(@RequestParam("id") Long id) { public CommonResult<RewardActivityRespVO> getRewardActivity(@RequestParam("id") Long id) {
RewardActivityDO rewardActivity = rewardActivityService.getRewardActivity(id); RewardActivityDO rewardActivity = rewardActivityService.getRewardActivity(id);
return success(RewardActivityConvert.INSTANCE.convert(rewardActivity)); return success(BeanUtils.toBean(rewardActivity, RewardActivityRespVO.class));
} }
@GetMapping("/page") @GetMapping("/page")
@ -77,7 +76,7 @@ public class RewardActivityController {
@PreAuthorize("@ss.hasPermission('promotion:reward-activity:query')") @PreAuthorize("@ss.hasPermission('promotion:reward-activity:query')")
public CommonResult<PageResult<RewardActivityRespVO>> getRewardActivityPage(@Valid RewardActivityPageReqVO pageVO) { public CommonResult<PageResult<RewardActivityRespVO>> getRewardActivityPage(@Valid RewardActivityPageReqVO pageVO) {
PageResult<RewardActivityDO> pageResult = rewardActivityService.getRewardActivityPage(pageVO); PageResult<RewardActivityDO> pageResult = rewardActivityService.getRewardActivityPage(pageVO);
return success(RewardActivityConvert.INSTANCE.convertPage(pageResult)); return success(BeanUtils.toBean(pageResult, RewardActivityRespVO.class));
} }
} }

View File

@ -79,13 +79,13 @@ public class RewardActivityBaseVO {
@Schema(description = "赠送的积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") @Schema(description = "赠送的积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer point; private Integer point;
@Schema(description = "赠送的优惠劵编号的数组", example = "1,2,3") @Schema(description = "赠送的优惠劵编号的数组")
private Map<Long, Integer> giveCouponsMap; private Map<Long, Integer> giveCouponTemplateCounts;
@AssertTrue(message = "赠送的积分不能小于 1") @AssertTrue(message = "赠送的积分不能小于 0")
@JsonIgnore @JsonIgnore
public boolean isPointValid() { public boolean isPointValid() {
return point == null || point >= 1; return point == null || point >= 0;
} }
} }

View File

@ -1,10 +1,5 @@
package cn.iocoder.yudao.module.promotion.convert.reward; package cn.iocoder.yudao.module.promotion.convert.reward;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO;
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityRespVO;
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO;
import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;
@ -18,12 +13,4 @@ public interface RewardActivityConvert {
RewardActivityConvert INSTANCE = Mappers.getMapper(RewardActivityConvert.class); RewardActivityConvert INSTANCE = Mappers.getMapper(RewardActivityConvert.class);
RewardActivityDO convert(RewardActivityCreateReqVO bean);
RewardActivityDO convert(RewardActivityUpdateReqVO bean);
RewardActivityRespVO convert(RewardActivityDO bean);
PageResult<RewardActivityRespVO> convertPage(PageResult<RewardActivityDO> page);
} }

View File

@ -107,9 +107,12 @@ public class RewardActivityDO extends BaseDO {
/** /**
* 赠送的优惠劵 * 赠送的优惠劵
* *
* key: 优惠劵编号value对应的优惠券数量 * key: 优惠劵模版编号
* value对应的优惠券数量
*
* 目的用于订单支付后赠送优惠券
*/ */
private Map<Long, Integer> giveCouponsMap; private Map<Long, Integer> giveCouponTemplateCounts;
} }

View File

@ -10,7 +10,6 @@ import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivi
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO; import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO;
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO; import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO;
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO; import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO;
import cn.iocoder.yudao.module.promotion.convert.reward.RewardActivityConvert;
import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO;
import cn.iocoder.yudao.module.promotion.dal.mysql.reward.RewardActivityMapper; import cn.iocoder.yudao.module.promotion.dal.mysql.reward.RewardActivityMapper;
import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum;
@ -54,7 +53,7 @@ public class RewardActivityServiceImpl implements RewardActivityService {
validateRewardActivitySpuConflicts(null, createReqVO); validateRewardActivitySpuConflicts(null, createReqVO);
// 2. 插入 // 2. 插入
RewardActivityDO rewardActivity = RewardActivityConvert.INSTANCE.convert(createReqVO) RewardActivityDO rewardActivity = BeanUtils.toBean(createReqVO, RewardActivityDO.class)
.setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getEndTime())); .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getEndTime()));
rewardActivityMapper.insert(rewardActivity); rewardActivityMapper.insert(rewardActivity);
// 返回 // 返回
@ -74,7 +73,7 @@ public class RewardActivityServiceImpl implements RewardActivityService {
validateRewardActivitySpuConflicts(updateReqVO.getId(), updateReqVO); validateRewardActivitySpuConflicts(updateReqVO.getId(), updateReqVO);
// 2. 更新 // 2. 更新
RewardActivityDO updateObj = RewardActivityConvert.INSTANCE.convert(updateReqVO) RewardActivityDO updateObj = BeanUtils.toBean(updateReqVO, RewardActivityDO.class)
.setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getEndTime())); .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getEndTime()));
rewardActivityMapper.updateById(updateObj); rewardActivityMapper.updateById(updateObj);
} }

View File

@ -296,7 +296,6 @@ public class TradeOrderDO extends BaseDO {
*/ */
private Integer vipPrice; private Integer vipPrice;
// TODO @puhui999我们要不要把相关的字段定义的更明确一点例如说giveCouponTemplateCounts 赠送的优惠劵模版数量或者 giveCouponCounts 赠送的优惠劵数量感受上Coupons Map 有点点重叠哈
/** /**
* 赠送的优惠劵 * 赠送的优惠劵
* *
@ -306,7 +305,7 @@ public class TradeOrderDO extends BaseDO {
* 目的用于订单支付后赠送优惠券 * 目的用于订单支付后赠送优惠券
*/ */
@TableField(typeHandler = JacksonTypeHandler.class) @TableField(typeHandler = JacksonTypeHandler.class)
private Map<Long, Integer> giveCouponsMap; private Map<Long, Integer> giveCouponTemplateCounts;
/** /**
* 赠送的优惠劵编号 * 赠送的优惠劵编号
* *

View File

@ -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.setGiveCouponsMap(calculateRespBO.getGiveCoupons()); order.setGiveCouponTemplateCounts(calculateRespBO.getGiveCouponTemplateCounts());
// 支付 + 退款信息 // 支付 + 退款信息
order.setAdjustPrice(0).setPayStatus(false); order.setAdjustPrice(0).setPayStatus(false);
order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()).setRefundPrice(0); order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()).setRefundPrice(0);

View File

@ -42,11 +42,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.getGiveCouponsMap())) { if (CollUtil.isEmpty(order.getGiveCouponTemplateCounts())) {
return; return;
} }
// 赠送优惠券 // 赠送优惠券
List<Long> couponIds = couponApi.takeCouponsByAdmin(order.getGiveCouponsMap(), order.getUserId()); List<Long> couponIds = couponApi.takeCouponsByAdmin(order.getGiveCouponTemplateCounts(), order.getUserId());
if (CollUtil.isEmpty(couponIds)) { if (CollUtil.isEmpty(couponIds)) {
return; return;
} }

View File

@ -76,10 +76,12 @@ public class TradePriceCalculateRespBO {
/** /**
* 赠送的优惠劵 * 赠送的优惠劵
* *
* key: 优惠劵编号value对应的优惠券数量 * key: 优惠劵模版编号
* 目的用于后续取消或者售后订单时需要扣减赠送 * value对应的优惠券数量
*
* 目的用于订单支付后赠送优惠券
*/ */
private Map<Long, Integer> giveCoupons; private Map<Long, Integer> giveCouponTemplateCounts;
/** /**
* 订单价格 * 订单价格

View File

@ -32,7 +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<>()).setGiveCoupons(new LinkedHashMap<>()); result.setType(getOrderType(param)).setPromotions(new ArrayList<>()).setGiveCouponTemplateCounts(new LinkedHashMap<>());
// 创建它的 OrderItem 属性 // 创建它的 OrderItem 属性
result.setItems(new ArrayList<>(param.getItems().size())); result.setItems(new ArrayList<>(param.getItems().size()));

View File

@ -107,13 +107,13 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator
result.setFreeDelivery(true); result.setFreeDelivery(true);
} }
// 4.3 记录赠送的优惠券 // 4.3 记录赠送的优惠券
if (CollUtil.isNotEmpty(rule.getGiveCoupons())) { if (CollUtil.isNotEmpty(rule.getGiveCouponTemplateCounts())) {
for (Map.Entry<Long, Integer> entry : rule.getGiveCoupons().entrySet()) { for (Map.Entry<Long, Integer> entry : rule.getGiveCouponTemplateCounts().entrySet()) {
Map<Long, Integer> giveCoupons = result.getGiveCoupons(); Map<Long, Integer> giveCouponTemplateCounts = result.getGiveCouponTemplateCounts();
if (giveCoupons.get(entry.getKey()) == null) { // 情况一还没有赠送的优惠券 if (giveCouponTemplateCounts.get(entry.getKey()) == null) { // 情况一还没有赠送的优惠券
result.setGiveCoupons(rule.getGiveCoupons()); result.setGiveCouponTemplateCounts(rule.getGiveCouponTemplateCounts());
} else { // 情况二别的满减活动送过同类优惠券则直接增加数量 } else { // 情况二别的满减活动送过同类优惠券则直接增加数量
giveCoupons.put(entry.getKey(), giveCoupons.get(entry.getKey()) + entry.getValue()); giveCouponTemplateCounts.put(entry.getKey(), giveCouponTemplateCounts.get(entry.getKey()) + entry.getValue());
} }
} }
} }

View File

@ -49,7 +49,7 @@ public class TradeRewardActivityPriceCalculatorTest extends BaseMockitoUnitTest
TradePriceCalculateRespBO result = new TradePriceCalculateRespBO() TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()
.setType(TradeOrderTypeEnum.NORMAL.getType()) .setType(TradeOrderTypeEnum.NORMAL.getType())
.setPrice(new TradePriceCalculateRespBO.Price()) .setPrice(new TradePriceCalculateRespBO.Price())
.setPromotions(new ArrayList<>()).setGiveCoupons(new LinkedHashMap<>()) .setPromotions(new ArrayList<>()).setGiveCouponTemplateCounts(new LinkedHashMap<>())
.setItems(asList( .setItems(asList(
new TradePriceCalculateRespBO.OrderItem().setSkuId(10L).setCount(2).setSelected(true) new TradePriceCalculateRespBO.OrderItem().setSkuId(10L).setCount(2).setSelected(true)
.setPrice(100).setSpuId(1L), .setPrice(100).setSpuId(1L),