Commit 9ee0aebd3fe4216e5ee0e236512edc4734a625f7

Authored by YunaiV
1 parent 666ba351

promotion:增加 coupon 的 code review

Showing 10 changed files with 74 additions and 25 deletions
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/CouponController.java
@@ -37,15 +37,6 @@ public class CouponController { @@ -37,15 +37,6 @@ public class CouponController {
37 @Resource 37 @Resource
38 private MemberUserApi memberUserApi; 38 private MemberUserApi memberUserApi;
39 39
40 -// @GetMapping("/get")  
41 -// @Operation(summary = "获得优惠劵")  
42 -// @Parameter(name = "id", description = "编号", required = true, example = "1024")  
43 -// @PreAuthorize("@ss.hasPermission('promotion:coupon:query')")  
44 -// public CommonResult<CouponRespVO> getCoupon(@RequestParam("id") Long id) {  
45 -// CouponDO coupon = couponService.getCoupon(id);  
46 -// return success(CouponConvert.INSTANCE.convert(coupon));  
47 -// }  
48 -  
49 @DeleteMapping("/delete") 40 @DeleteMapping("/delete")
50 @Operation(summary = "回收优惠劵") 41 @Operation(summary = "回收优惠劵")
51 @Parameter(name = "id", description = "编号", required = true) 42 @Parameter(name = "id", description = "编号", required = true)
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/coupon/AppCouponController.java
@@ -40,12 +40,13 @@ public class AppCouponController { @@ -40,12 +40,13 @@ public class AppCouponController {
40 @PostMapping("/take") 40 @PostMapping("/take")
41 @Operation(summary = "领取优惠劵") 41 @Operation(summary = "领取优惠劵")
42 @Parameter(name = "templateId", description = "优惠券模板编号", required = true, example = "1024") 42 @Parameter(name = "templateId", description = "优惠券模板编号", required = true, example = "1024")
  43 + @PreAuthenticated
43 public CommonResult<Boolean> takeCoupon(@Valid @RequestBody AppCouponTakeReqVO reqVO) { 44 public CommonResult<Boolean> takeCoupon(@Valid @RequestBody AppCouponTakeReqVO reqVO) {
44 - // 领取 45 + // 1. 领取优惠劵
45 Long userId = getLoginUserId(); 46 Long userId = getLoginUserId();
46 couponService.takeCoupon(reqVO.getTemplateId(), CollUtil.newHashSet(userId), CouponTakeTypeEnum.USER); 47 couponService.takeCoupon(reqVO.getTemplateId(), CollUtil.newHashSet(userId), CouponTakeTypeEnum.USER);
47 48
48 - // 检查是否可以继续领取 49 + // 2. 检查是否可以继续领取
49 CouponTemplateDO couponTemplate = couponTemplateService.getCouponTemplate(reqVO.getTemplateId()); 50 CouponTemplateDO couponTemplate = couponTemplateService.getCouponTemplate(reqVO.getTemplateId());
50 boolean canTakeAgain = true; 51 boolean canTakeAgain = true;
51 if (couponTemplate.getTakeLimitCount() != null && couponTemplate.getTakeLimitCount() > 0) { 52 if (couponTemplate.getTakeLimitCount() != null && couponTemplate.getTakeLimitCount() > 0) {
@@ -58,15 +59,16 @@ public class AppCouponController { @@ -58,15 +59,16 @@ public class AppCouponController {
58 } 59 }
59 60
60 @GetMapping("/match-list") 61 @GetMapping("/match-list")
61 - @Operation(summary = "获得匹配指定商品的优惠劵列表") 62 + @Operation(summary = "获得匹配指定商品的优惠劵列表", description = "用于下单页,展示优惠劵列表")
62 public CommonResult<List<AppCouponMatchRespVO>> getMatchCouponList(AppCouponMatchReqVO matchReqVO) { 63 public CommonResult<List<AppCouponMatchRespVO>> getMatchCouponList(AppCouponMatchReqVO matchReqVO) {
63 // todo: 优化:优惠金额倒序 64 // todo: 优化:优惠金额倒序
64 return success(CouponConvert.INSTANCE.convertList(couponService.getMatchCouponList(getLoginUserId(), matchReqVO))); 65 return success(CouponConvert.INSTANCE.convertList(couponService.getMatchCouponList(getLoginUserId(), matchReqVO)));
65 } 66 }
66 67
67 @GetMapping("/page") 68 @GetMapping("/page")
68 - @Operation(summary = "优惠劵列表", description = "我的优惠劵")  
69 - public CommonResult<PageResult<AppCouponRespVO>> takeCoupon(AppCouponPageReqVO pageReqVO) { 69 + @Operation(summary = "我的优惠劵列表")
  70 + @PreAuthenticated
  71 + public CommonResult<PageResult<AppCouponRespVO>> getCouponPage(AppCouponPageReqVO pageReqVO) {
70 PageResult<CouponDO> pageResult = couponService.getCouponPage( 72 PageResult<CouponDO> pageResult = couponService.getCouponPage(
71 CouponConvert.INSTANCE.convert(pageReqVO, Collections.singleton(getLoginUserId()))); 73 CouponConvert.INSTANCE.convert(pageReqVO, Collections.singleton(getLoginUserId())));
72 return success(CouponConvert.INSTANCE.convertAppPage(pageResult)); 74 return success(CouponConvert.INSTANCE.convertAppPage(pageResult));
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/coupon/AppCouponTemplateController.java
@@ -15,13 +15,17 @@ import cn.iocoder.yudao.module.promotion.enums.coupon.CouponTakeTypeEnum; @@ -15,13 +15,17 @@ import cn.iocoder.yudao.module.promotion.enums.coupon.CouponTakeTypeEnum;
15 import cn.iocoder.yudao.module.promotion.service.coupon.CouponService; 15 import cn.iocoder.yudao.module.promotion.service.coupon.CouponService;
16 import cn.iocoder.yudao.module.promotion.service.coupon.CouponTemplateService; 16 import cn.iocoder.yudao.module.promotion.service.coupon.CouponTemplateService;
17 import io.swagger.v3.oas.annotations.Operation; 17 import io.swagger.v3.oas.annotations.Operation;
  18 +import io.swagger.v3.oas.annotations.Parameter;
  19 +import io.swagger.v3.oas.annotations.Parameters;
18 import io.swagger.v3.oas.annotations.tags.Tag; 20 import io.swagger.v3.oas.annotations.tags.Tag;
19 import org.springframework.validation.annotation.Validated; 21 import org.springframework.validation.annotation.Validated;
20 import org.springframework.web.bind.annotation.GetMapping; 22 import org.springframework.web.bind.annotation.GetMapping;
21 import org.springframework.web.bind.annotation.RequestMapping; 23 import org.springframework.web.bind.annotation.RequestMapping;
  24 +import org.springframework.web.bind.annotation.RequestParam;
22 import org.springframework.web.bind.annotation.RestController; 25 import org.springframework.web.bind.annotation.RestController;
23 26
24 import javax.annotation.Resource; 27 import javax.annotation.Resource;
  28 +import java.time.LocalDateTime;
25 import java.util.*; 29 import java.util.*;
26 30
27 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 31 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -42,6 +46,51 @@ public class AppCouponTemplateController { @@ -42,6 +46,51 @@ public class AppCouponTemplateController {
42 @Resource 46 @Resource
43 private ProductSpuApi productSpuApi; 47 private ProductSpuApi productSpuApi;
44 48
  49 + // TODO 疯狂:这里应该还有个 list 接口哈;获得优惠劵模版列表,用于首页、商品页的优惠劵
  50 + @GetMapping("/list")
  51 + @Operation(summary = "获得优惠劵模版列表")
  52 + @Parameters({
  53 + @Parameter(name = "spuId", description = "商品 SPU 编号"), // 目前主要给商品详情使用
  54 + @Parameter(name = "useType", description = "使用类型"),
  55 + @Parameter(name = "count", description = "数量", required = true)
  56 + })
  57 + public CommonResult<List<AppCouponTemplateRespVO>> getCouponTemplateList(
  58 + @RequestParam(value = "spuId", required = false) Long spuId,
  59 + @RequestParam(value = "useType", required = false) Integer useType,
  60 + @RequestParam(value = "count", required = false, defaultValue = "10") Integer count) {
  61 + List<AppCouponTemplateRespVO> list = new ArrayList<>();
  62 + Random random = new Random();
  63 + for (int i = 0; i < 10; i++) {
  64 + AppCouponTemplateRespVO vo = new AppCouponTemplateRespVO();
  65 + vo.setId(i + 1L);
  66 + vo.setName("优惠劵" + (i + 1));
  67 + vo.setTakeLimitCount(random.nextInt(10) + 1);
  68 + vo.setUsePrice(random.nextInt(100) * 100);
  69 + vo.setValidityType(random.nextInt(2) + 1);
  70 + if (vo.getValidityType() == 1) {
  71 + vo.setValidStartTime(LocalDateTime.now().plusDays(random.nextInt(10)));
  72 + vo.setValidEndTime(LocalDateTime.now().plusDays(random.nextInt(20) + 10));
  73 + } else {
  74 + vo.setFixedStartTerm(random.nextInt(10));
  75 + vo.setFixedEndTerm(random.nextInt(10) + vo.getFixedStartTerm() + 1);
  76 + }
  77 + vo.setDiscountType(random.nextInt(2) + 1);
  78 + if (vo.getDiscountType() == 1) {
  79 + vo.setDiscountPercent(null);
  80 + vo.setDiscountPrice(random.nextInt(50) * 100);
  81 + vo.setDiscountLimitPrice(null);
  82 + } else {
  83 + vo.setDiscountPercent(random.nextInt(90) + 10);
  84 + vo.setDiscountPrice(null);
  85 + vo.setDiscountLimitPrice(random.nextInt(200) * 100);
  86 + }
  87 + // TODO @疯狂:是否已领取,要不在 TemplateService 搞个 static 方法,让它基于 countMap 这种去计算,这样好点?
  88 + vo.setTakeStatus(random.nextBoolean());
  89 + list.add(vo);
  90 + }
  91 + return success(list);
  92 + }
  93 +
45 @GetMapping("/page") 94 @GetMapping("/page")
46 @Operation(summary = "获得优惠劵模版分页") 95 @Operation(summary = "获得优惠劵模版分页")
47 public CommonResult<PageResult<AppCouponTemplateRespVO>> getCouponTemplatePage(AppCouponTemplatePageReqVO pageReqVO) { 96 public CommonResult<PageResult<AppCouponTemplateRespVO>> getCouponTemplatePage(AppCouponTemplatePageReqVO pageReqVO) {
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/coupon/vo/template/AppCouponTemplateRespVO.java
@@ -23,14 +23,6 @@ public class AppCouponTemplateRespVO { @@ -23,14 +23,6 @@ public class AppCouponTemplateRespVO {
23 // 单位:分;0 - 不限制 23 // 单位:分;0 - 不限制
24 private Integer usePrice; 24 private Integer usePrice;
25 25
26 - // TODO 芋艿:这两要改的  
27 -// @Schema(description = "商品范围", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
28 -// @InEnum(PromotionProductScopeEnum.class)  
29 -// private Integer productScope;  
30 -//  
31 -// @Schema(description = "商品范围编号的数组", example = "1,3")  
32 -// private List<Long> productScopeValues;  
33 -  
34 @Schema(description = "生效日期类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 26 @Schema(description = "生效日期类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
35 private Integer validityType; 27 private Integer validityType;
36 28
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/job/CouponExpireJob.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/job/coupon/CouponExpireJob.java
1 -package cn.iocoder.yudao.module.promotion.job; 1 +package cn.iocoder.yudao.module.promotion.job.coupon;
2 2
3 import cn.hutool.core.util.StrUtil; 3 import cn.hutool.core.util.StrUtil;
4 import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; 4 import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
@@ -8,6 +8,7 @@ import org.springframework.stereotype.Component; @@ -8,6 +8,7 @@ import org.springframework.stereotype.Component;
8 8
9 import javax.annotation.Resource; 9 import javax.annotation.Resource;
10 10
  11 +// TODO 芋艿:配置一个 Job
11 /** 12 /**
12 * 优惠券过期 Job 13 * 优惠券过期 Job
13 * 14 *
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/job/package-info.java 0 → 100644
  1 +/**
  2 + * TODO 占位,无具体含义
  3 + */
  4 +package cn.iocoder.yudao.module.promotion.job;
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponService.java
@@ -165,4 +165,5 @@ public interface CouponService { @@ -165,4 +165,5 @@ public interface CouponService {
165 * @return 过期数量 165 * @return 过期数量
166 */ 166 */
167 int expireCoupon(); 167 int expireCoupon();
  168 +
168 } 169 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponServiceImpl.java
@@ -40,6 +40,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. @@ -40,6 +40,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.
40 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; 40 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
41 import static java.util.Arrays.asList; 41 import static java.util.Arrays.asList;
42 42
  43 +// TODO @疯狂:注册时,赠送用户优惠劵;为了解耦,可以考虑注册时发个 MQ 消息;然后营销这里监听后消费;
43 /** 44 /**
44 * 优惠劵 Service 实现类 45 * 优惠劵 Service 实现类
45 * 46 *
@@ -192,7 +193,8 @@ public class CouponServiceImpl implements CouponService { @@ -192,7 +193,8 @@ public class CouponServiceImpl implements CouponService {
192 193
193 @Override 194 @Override
194 public List<CouponDO> getMatchCouponList(Long userId, AppCouponMatchReqVO matchReqVO) { 195 public List<CouponDO> getMatchCouponList(Long userId, AppCouponMatchReqVO matchReqVO) {
195 - return couponMapper.selectListByUserIdAndStatusAndUsePriceLeAndProductScope(userId, CouponStatusEnum.UNUSED.getStatus(), 196 + return couponMapper.selectListByUserIdAndStatusAndUsePriceLeAndProductScope(userId,
  197 + CouponStatusEnum.UNUSED.getStatus(),
196 matchReqVO.getPrice(), matchReqVO.getSpuIds(), matchReqVO.getCategoryIds()); 198 matchReqVO.getPrice(), matchReqVO.getSpuIds(), matchReqVO.getCategoryIds());
197 } 199 }
198 200
@@ -220,6 +222,12 @@ public class CouponServiceImpl implements CouponService { @@ -220,6 +222,12 @@ public class CouponServiceImpl implements CouponService {
220 return count; 222 return count;
221 } 223 }
222 224
  225 + /**
  226 + * 过期单个优惠劵
  227 + *
  228 + * @param coupon 优惠劵
  229 + * @return 是否过期成功
  230 + */
223 private boolean expireCoupon(CouponDO coupon) { 231 private boolean expireCoupon(CouponDO coupon) {
224 // 更新记录状态 232 // 更新记录状态
225 int updateRows = couponMapper.updateByIdAndStatus(coupon.getId(), CouponStatusEnum.UNUSED.getStatus(), 233 int updateRows = couponMapper.updateByIdAndStatus(coupon.getId(), CouponStatusEnum.UNUSED.getStatus(),
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponTemplateServiceImpl.java
@@ -29,6 +29,7 @@ public class CouponTemplateServiceImpl implements CouponTemplateService { @@ -29,6 +29,7 @@ public class CouponTemplateServiceImpl implements CouponTemplateService {
29 @Resource 29 @Resource
30 private CouponTemplateMapper couponTemplateMapper; 30 private CouponTemplateMapper couponTemplateMapper;
31 31
  32 + // TODO @疯狂:新增/修改时,需要校验对应的商品、分类是否存在
32 @Override 33 @Override
33 public Long createCouponTemplate(CouponTemplateCreateReqVO createReqVO) { 34 public Long createCouponTemplate(CouponTemplateCreateReqVO createReqVO) {
34 // 插入 35 // 插入
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/cart/CartServiceImpl.java
@@ -26,7 +26,7 @@ import static java.util.Collections.emptyList; @@ -26,7 +26,7 @@ import static java.util.Collections.emptyList;
26 /** 26 /**
27 * 购物车 Service 实现类 27 * 购物车 Service 实现类
28 * 28 *
29 - * // TODO 芋艿:未来优化:购物车的价格计算,支持营销信息;目前不支持的原因,前端界面需要前端 pr 支持下; 29 + * // TODO 芋艿:未来优化:购物车的价格计算,支持营销信息;目前不支持的原因,前端界面需要前端 pr 支持下;例如说:会员价格;
30 * 30 *
31 * @author 芋道源码 31 * @author 芋道源码
32 */ 32 */