From 9ee0aebd3fe4216e5ee0e236512edc4734a625f7 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 29 Sep 2023 20:52:11 +0800 Subject: [PATCH] =?UTF-8?q?promotion=EF=BC=9A=E5=A2=9E=E5=8A=A0=20coupon?= =?UTF-8?q?=20=E7=9A=84=20code=20review?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/coupon/CouponController.java | 9 ---- .../app/coupon/AppCouponController.java | 12 +++-- .../coupon/AppCouponTemplateController.java | 49 +++++++++++++++++++ .../vo/template/AppCouponTemplateRespVO.java | 8 --- .../job/{ => coupon}/CouponExpireJob.java | 3 +- .../module/promotion/job/package-info.java | 4 ++ .../service/coupon/CouponService.java | 1 + .../service/coupon/CouponServiceImpl.java | 10 +++- .../coupon/CouponTemplateServiceImpl.java | 1 + .../trade/service/cart/CartServiceImpl.java | 2 +- 10 files changed, 74 insertions(+), 25 deletions(-) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/job/{ => coupon}/CouponExpireJob.java (88%) create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/job/package-info.java diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/CouponController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/CouponController.java index c5460c348..8e0a9bd2b 100755 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/CouponController.java +++ b/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 { @Resource private MemberUserApi memberUserApi; -// @GetMapping("/get") -// @Operation(summary = "获得优惠劵") -// @Parameter(name = "id", description = "编号", required = true, example = "1024") -// @PreAuthorize("@ss.hasPermission('promotion:coupon:query')") -// public CommonResult getCoupon(@RequestParam("id") Long id) { -// CouponDO coupon = couponService.getCoupon(id); -// return success(CouponConvert.INSTANCE.convert(coupon)); -// } - @DeleteMapping("/delete") @Operation(summary = "回收优惠劵") @Parameter(name = "id", description = "编号", required = true) diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/coupon/AppCouponController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/coupon/AppCouponController.java index c742c336a..a7806682e 100755 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/coupon/AppCouponController.java +++ b/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 { @PostMapping("/take") @Operation(summary = "领取优惠劵") @Parameter(name = "templateId", description = "优惠券模板编号", required = true, example = "1024") + @PreAuthenticated public CommonResult takeCoupon(@Valid @RequestBody AppCouponTakeReqVO reqVO) { - // 领取 + // 1. 领取优惠劵 Long userId = getLoginUserId(); couponService.takeCoupon(reqVO.getTemplateId(), CollUtil.newHashSet(userId), CouponTakeTypeEnum.USER); - // 检查是否可以继续领取 + // 2. 检查是否可以继续领取 CouponTemplateDO couponTemplate = couponTemplateService.getCouponTemplate(reqVO.getTemplateId()); boolean canTakeAgain = true; if (couponTemplate.getTakeLimitCount() != null && couponTemplate.getTakeLimitCount() > 0) { @@ -58,15 +59,16 @@ public class AppCouponController { } @GetMapping("/match-list") - @Operation(summary = "获得匹配指定商品的优惠劵列表") + @Operation(summary = "获得匹配指定商品的优惠劵列表", description = "用于下单页,展示优惠劵列表") public CommonResult> getMatchCouponList(AppCouponMatchReqVO matchReqVO) { // todo: 优化:优惠金额倒序 return success(CouponConvert.INSTANCE.convertList(couponService.getMatchCouponList(getLoginUserId(), matchReqVO))); } @GetMapping("/page") - @Operation(summary = "优惠劵列表", description = "我的优惠劵") - public CommonResult> takeCoupon(AppCouponPageReqVO pageReqVO) { + @Operation(summary = "我的优惠劵列表") + @PreAuthenticated + public CommonResult> getCouponPage(AppCouponPageReqVO pageReqVO) { PageResult pageResult = couponService.getCouponPage( CouponConvert.INSTANCE.convert(pageReqVO, Collections.singleton(getLoginUserId()))); return success(CouponConvert.INSTANCE.convertAppPage(pageResult)); diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/coupon/AppCouponTemplateController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/coupon/AppCouponTemplateController.java index bb8e6c9fb..a8d42da33 100755 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/coupon/AppCouponTemplateController.java +++ b/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; import cn.iocoder.yudao.module.promotion.service.coupon.CouponService; import cn.iocoder.yudao.module.promotion.service.coupon.CouponTemplateService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import java.time.LocalDateTime; import java.util.*; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -42,6 +46,51 @@ public class AppCouponTemplateController { @Resource private ProductSpuApi productSpuApi; + // TODO 疯狂:这里应该还有个 list 接口哈;获得优惠劵模版列表,用于首页、商品页的优惠劵 + @GetMapping("/list") + @Operation(summary = "获得优惠劵模版列表") + @Parameters({ + @Parameter(name = "spuId", description = "商品 SPU 编号"), // 目前主要给商品详情使用 + @Parameter(name = "useType", description = "使用类型"), + @Parameter(name = "count", description = "数量", required = true) + }) + public CommonResult> getCouponTemplateList( + @RequestParam(value = "spuId", required = false) Long spuId, + @RequestParam(value = "useType", required = false) Integer useType, + @RequestParam(value = "count", required = false, defaultValue = "10") Integer count) { + List list = new ArrayList<>(); + Random random = new Random(); + for (int i = 0; i < 10; i++) { + AppCouponTemplateRespVO vo = new AppCouponTemplateRespVO(); + vo.setId(i + 1L); + vo.setName("优惠劵" + (i + 1)); + vo.setTakeLimitCount(random.nextInt(10) + 1); + vo.setUsePrice(random.nextInt(100) * 100); + vo.setValidityType(random.nextInt(2) + 1); + if (vo.getValidityType() == 1) { + vo.setValidStartTime(LocalDateTime.now().plusDays(random.nextInt(10))); + vo.setValidEndTime(LocalDateTime.now().plusDays(random.nextInt(20) + 10)); + } else { + vo.setFixedStartTerm(random.nextInt(10)); + vo.setFixedEndTerm(random.nextInt(10) + vo.getFixedStartTerm() + 1); + } + vo.setDiscountType(random.nextInt(2) + 1); + if (vo.getDiscountType() == 1) { + vo.setDiscountPercent(null); + vo.setDiscountPrice(random.nextInt(50) * 100); + vo.setDiscountLimitPrice(null); + } else { + vo.setDiscountPercent(random.nextInt(90) + 10); + vo.setDiscountPrice(null); + vo.setDiscountLimitPrice(random.nextInt(200) * 100); + } + // TODO @疯狂:是否已领取,要不在 TemplateService 搞个 static 方法,让它基于 countMap 这种去计算,这样好点? + vo.setTakeStatus(random.nextBoolean()); + list.add(vo); + } + return success(list); + } + @GetMapping("/page") @Operation(summary = "获得优惠劵模版分页") public CommonResult> getCouponTemplatePage(AppCouponTemplatePageReqVO pageReqVO) { diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/coupon/vo/template/AppCouponTemplateRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/coupon/vo/template/AppCouponTemplateRespVO.java index 7dd0042ed..be4a0c1f0 100755 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/coupon/vo/template/AppCouponTemplateRespVO.java +++ b/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 { // 单位:分;0 - 不限制 private Integer usePrice; - // TODO 芋艿:这两要改的 -// @Schema(description = "商品范围", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") -// @InEnum(PromotionProductScopeEnum.class) -// private Integer productScope; -// -// @Schema(description = "商品范围编号的数组", example = "1,3") -// private List productScopeValues; - @Schema(description = "生效日期类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Integer validityType; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/job/CouponExpireJob.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/job/coupon/CouponExpireJob.java similarity index 88% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/job/CouponExpireJob.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/job/coupon/CouponExpireJob.java index 8eaf9af1c..e680628ae 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/job/CouponExpireJob.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/job/coupon/CouponExpireJob.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.promotion.job; +package cn.iocoder.yudao.module.promotion.job.coupon; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; @@ -8,6 +8,7 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; +// TODO 芋艿:配置一个 Job /** * 优惠券过期 Job * diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/job/package-info.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/job/package-info.java new file mode 100644 index 000000000..320b98aa2 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/job/package-info.java @@ -0,0 +1,4 @@ +/** + * TODO 占位,无具体含义 + */ +package cn.iocoder.yudao.module.promotion.job; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponService.java index 545400c75..163775d46 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponService.java +++ b/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 { * @return 过期数量 */ int expireCoupon(); + } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponServiceImpl.java index 8889afc87..a8258efb4 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponServiceImpl.java +++ b/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. import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; import static java.util.Arrays.asList; +// TODO @疯狂:注册时,赠送用户优惠劵;为了解耦,可以考虑注册时发个 MQ 消息;然后营销这里监听后消费; /** * 优惠劵 Service 实现类 * @@ -192,7 +193,8 @@ public class CouponServiceImpl implements CouponService { @Override public List getMatchCouponList(Long userId, AppCouponMatchReqVO matchReqVO) { - return couponMapper.selectListByUserIdAndStatusAndUsePriceLeAndProductScope(userId, CouponStatusEnum.UNUSED.getStatus(), + return couponMapper.selectListByUserIdAndStatusAndUsePriceLeAndProductScope(userId, + CouponStatusEnum.UNUSED.getStatus(), matchReqVO.getPrice(), matchReqVO.getSpuIds(), matchReqVO.getCategoryIds()); } @@ -220,6 +222,12 @@ public class CouponServiceImpl implements CouponService { return count; } + /** + * 过期单个优惠劵 + * + * @param coupon 优惠劵 + * @return 是否过期成功 + */ private boolean expireCoupon(CouponDO coupon) { // 更新记录状态 int updateRows = couponMapper.updateByIdAndStatus(coupon.getId(), CouponStatusEnum.UNUSED.getStatus(), diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponTemplateServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponTemplateServiceImpl.java index a5be46746..202914780 100755 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponTemplateServiceImpl.java +++ b/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 { @Resource private CouponTemplateMapper couponTemplateMapper; + // TODO @疯狂:新增/修改时,需要校验对应的商品、分类是否存在 @Override public Long createCouponTemplate(CouponTemplateCreateReqVO createReqVO) { // 插入 diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/cart/CartServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/cart/CartServiceImpl.java index b936f6f8e..261f2b245 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/cart/CartServiceImpl.java +++ b/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; /** * 购物车 Service 实现类 * - * // TODO 芋艿:未来优化:购物车的价格计算,支持营销信息;目前不支持的原因,前端界面需要前端 pr 支持下; + * // TODO 芋艿:未来优化:购物车的价格计算,支持营销信息;目前不支持的原因,前端界面需要前端 pr 支持下;例如说:会员价格; * * @author 芋道源码 */