From 3a5882268d70d48a623eba052ed4dfdfcfeee79f Mon Sep 17 00:00:00 2001 From: JIAN Date: Mon, 23 Sep 2024 22:06:35 +0800 Subject: [PATCH] =?UTF-8?q?feat(market):=E6=96=B0=E5=A2=9E=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E4=BC=98=E6=83=A0=E5=8D=B7=E4=BF=A1=E6=81=AF=E7=9A=84?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/consumer/CouponController.java | 38 +++++++ .../operation/CouponController.java | 29 ++++++ .../jzo2o/market/enums/CouponStatusEnum.java | 33 ++++++- .../com/jzo2o/market/model/domain/Coupon.java | 24 +++-- ...eryReqDTO.java => CouponPageQueryDTO.java} | 8 +- .../model/dto/response/CouponInfoResDTO.java | 99 ------------------- .../dto/response/CouponPageInfoResDTO.java | 57 +++++++++++ .../dto/response/CouponSimpleInfoResDTO.java | 47 +++++++++ .../jzo2o/market/service/ICouponService.java | 27 ++--- .../service/impl/CouponServiceImpl.java | 82 +++++++-------- 10 files changed, 270 insertions(+), 174 deletions(-) create mode 100644 jzo2o-market/src/main/java/com/jzo2o/market/controller/consumer/CouponController.java create mode 100644 jzo2o-market/src/main/java/com/jzo2o/market/controller/operation/CouponController.java rename jzo2o-market/src/main/java/com/jzo2o/market/model/dto/request/{CouponOperationPageQueryReqDTO.java => CouponPageQueryDTO.java} (68%) delete mode 100644 jzo2o-market/src/main/java/com/jzo2o/market/model/dto/response/CouponInfoResDTO.java create mode 100644 jzo2o-market/src/main/java/com/jzo2o/market/model/dto/response/CouponPageInfoResDTO.java create mode 100644 jzo2o-market/src/main/java/com/jzo2o/market/model/dto/response/CouponSimpleInfoResDTO.java diff --git a/jzo2o-market/src/main/java/com/jzo2o/market/controller/consumer/CouponController.java b/jzo2o-market/src/main/java/com/jzo2o/market/controller/consumer/CouponController.java new file mode 100644 index 0000000..8e18b7d --- /dev/null +++ b/jzo2o-market/src/main/java/com/jzo2o/market/controller/consumer/CouponController.java @@ -0,0 +1,38 @@ +package com.jzo2o.market.controller.consumer; + +import com.jzo2o.common.expcetions.BadRequestException; +import com.jzo2o.common.utils.ObjectUtils; +import com.jzo2o.market.enums.CouponStatusEnum; +import com.jzo2o.market.model.dto.response.CouponSimpleInfoResDTO; +import com.jzo2o.market.service.ICouponService; +import lombok.extern.slf4j.Slf4j; +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.util.List; + +/** + * 运营端 - 优惠卷管理控制器 + * @author JIAN + */ +@Slf4j +@RestController("consumerCouponController") +@RequestMapping("/consumer/coupon") +public class CouponController { + @Resource + private ICouponService couponService; + + @GetMapping("/my") + public List currentUserCoupon(@RequestParam Integer status, + @RequestParam(required = false) Integer lastId) { + CouponStatusEnum couponStatusEnum = CouponStatusEnum.statusOf(status); + if (ObjectUtils.isEmpty(couponStatusEnum)) { + throw new BadRequestException("优惠卷状态出错"); + } + + return couponService.getCurrentUserCoupon(couponStatusEnum, lastId); + } +} \ No newline at end of file diff --git a/jzo2o-market/src/main/java/com/jzo2o/market/controller/operation/CouponController.java b/jzo2o-market/src/main/java/com/jzo2o/market/controller/operation/CouponController.java new file mode 100644 index 0000000..d9664da --- /dev/null +++ b/jzo2o-market/src/main/java/com/jzo2o/market/controller/operation/CouponController.java @@ -0,0 +1,29 @@ +package com.jzo2o.market.controller.operation; + +import com.jzo2o.common.model.PageResult; +import com.jzo2o.market.model.dto.request.CouponPageQueryDTO; +import com.jzo2o.market.model.dto.response.CouponPageInfoResDTO; +import com.jzo2o.market.service.ICouponService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * 运营端 - 优惠卷管理控制器 + * @author JIAN + */ +@Slf4j +@RestController("operationCouponController") +@RequestMapping("/operation/coupon") +public class CouponController { + @Resource + private ICouponService couponService; + + @GetMapping("/page") + public PageResult pageCoupon(CouponPageQueryDTO couponPageQueryDTO) { + return couponService.page(couponPageQueryDTO); + } +} \ No newline at end of file diff --git a/jzo2o-market/src/main/java/com/jzo2o/market/enums/CouponStatusEnum.java b/jzo2o-market/src/main/java/com/jzo2o/market/enums/CouponStatusEnum.java index 0f280f9..5a65809 100644 --- a/jzo2o-market/src/main/java/com/jzo2o/market/enums/CouponStatusEnum.java +++ b/jzo2o-market/src/main/java/com/jzo2o/market/enums/CouponStatusEnum.java @@ -1,12 +1,39 @@ package com.jzo2o.market.enums; +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.fasterxml.jackson.annotation.JsonValue; import lombok.AllArgsConstructor; import lombok.Getter; -@AllArgsConstructor +/** + * 优惠卷状态枚举类 + * @author JIAN + */ @Getter +@AllArgsConstructor public enum CouponStatusEnum { - NO_USE(1, "未使用"), USED(2, "已使用"), INVALID(3, "已失效"),VOIDED(4,"已作废"); + NO_USE(1, "未使用"), + USED(2, "已使用"), + INVALID(3, "已失效"), + VOIDED(4, "已作废"); + + @EnumValue + @JsonValue private int status; private String name; -} + + public static CouponStatusEnum statusOf(Integer status) { + if (status == null) { + return null; + } + + for (CouponStatusEnum couponStatusEnum : CouponStatusEnum.values()) { + if (couponStatusEnum.getStatus() == status) { + return couponStatusEnum; + } + } + + // not found + return null; + } +} \ No newline at end of file diff --git a/jzo2o-market/src/main/java/com/jzo2o/market/model/domain/Coupon.java b/jzo2o-market/src/main/java/com/jzo2o/market/model/domain/Coupon.java index dfb8c12..42b2d1b 100644 --- a/jzo2o-market/src/main/java/com/jzo2o/market/model/domain/Coupon.java +++ b/jzo2o-market/src/main/java/com/jzo2o/market/model/domain/Coupon.java @@ -1,22 +1,21 @@ package com.jzo2o.market.model.domain; -import java.math.BigDecimal; - import com.baomidou.mybatisplus.annotation.IdType; -import java.time.LocalDateTime; - -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; -import java.io.Serializable; +import com.jzo2o.market.enums.CouponTypeEnum; +import com.jzo2o.market.enums.CouponStatusEnum; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + /** *

- * - *

* + *

* @author itcast * @since 2023-09-16 */ @@ -61,7 +60,7 @@ public class Coupon implements Serializable { /** * 使用类型,1:满减,2:折扣 */ - private Integer type; + private CouponTypeEnum type; /** * 折扣 @@ -87,10 +86,11 @@ public class Coupon implements Serializable { * 使用时间 */ private LocalDateTime useTime; + /** * 优惠券状态,1:未使用,2:已使用,3:已过期 */ - private Integer status; + private CouponStatusEnum status; /** * 订单id @@ -111,6 +111,4 @@ public class Coupon implements Serializable { * 逻辑删除 */ private Integer isDeleted; - - -} +} \ No newline at end of file diff --git a/jzo2o-market/src/main/java/com/jzo2o/market/model/dto/request/CouponOperationPageQueryReqDTO.java b/jzo2o-market/src/main/java/com/jzo2o/market/model/dto/request/CouponPageQueryDTO.java similarity index 68% rename from jzo2o-market/src/main/java/com/jzo2o/market/model/dto/request/CouponOperationPageQueryReqDTO.java rename to jzo2o-market/src/main/java/com/jzo2o/market/model/dto/request/CouponPageQueryDTO.java index 4135d4c..9639b56 100644 --- a/jzo2o-market/src/main/java/com/jzo2o/market/model/dto/request/CouponOperationPageQueryReqDTO.java +++ b/jzo2o-market/src/main/java/com/jzo2o/market/model/dto/request/CouponPageQueryDTO.java @@ -4,13 +4,17 @@ import com.jzo2o.common.model.dto.PageQueryDTO; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.validation.annotation.Validated; import javax.validation.constraints.Null; @Data +@EqualsAndHashCode(callSuper = true) +@Validated @ApiModel("运营端优惠券查询模型") -public class CouponOperationPageQueryReqDTO extends PageQueryDTO { +public class CouponPageQueryDTO extends PageQueryDTO { @ApiModelProperty(value = "活动id",required = true) @Null(message = "请先选择活动") private Long activityId; -} +} \ No newline at end of file diff --git a/jzo2o-market/src/main/java/com/jzo2o/market/model/dto/response/CouponInfoResDTO.java b/jzo2o-market/src/main/java/com/jzo2o/market/model/dto/response/CouponInfoResDTO.java deleted file mode 100644 index ee23cb7..0000000 --- a/jzo2o-market/src/main/java/com/jzo2o/market/model/dto/response/CouponInfoResDTO.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.jzo2o.market.model.dto.response; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - *

- * - *

- * - * @author itcast - * @since 2023-09-16 - */ -@Data -public class CouponInfoResDTO implements Serializable { - - @ApiModelProperty(value = "优惠券id",required = true) - private Long id; - - /** - * 优惠券名称 - */ - @ApiModelProperty(value = "活动名称",required = true) - private String name; - - @ApiModelProperty("用户姓名") - private String userName; - - @ApiModelProperty("用户手机号") - private String userPhone; - - /** - * 活动id - */ - @ApiModelProperty(value = "活动id",required = true) - private Long activityId; - - @ApiModelProperty(value = "使用类型,1:满减,2:折扣",required = true) - private Integer type; - - /** - * 折扣 - */ - @ApiModelProperty(value = "折扣",required = false) - private Integer discountRate; - - /** - * 优惠金额 - */ - @ApiModelProperty(value = "优惠金额",required = false) - private BigDecimal discountAmount; - - /** - * 满减金额 - */ - @ApiModelProperty(value = "满减条件,0:表示无门槛",required = true) - private BigDecimal amountCondition; - - /** - * 有效期 - */ - @ApiModelProperty("优惠券过期时间") - private LocalDateTime validityTime; - - @ApiModelProperty("使用时间") - private LocalDateTime useTime; - - /** - * 优惠券状态,1:未使用,2:已使用,3:已过期 - */ - @ApiModelProperty("优惠券状态,1:未使用,2:已使用,3:已过期") - private Integer status; - - /** - * 订单id - */ - private String ordersId; - - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间",required = true) - private LocalDateTime createTime; - - /** - * 更新时间 - */ - @ApiModelProperty(value = "更新时间",required = true) - private LocalDateTime updateTime; - -} diff --git a/jzo2o-market/src/main/java/com/jzo2o/market/model/dto/response/CouponPageInfoResDTO.java b/jzo2o-market/src/main/java/com/jzo2o/market/model/dto/response/CouponPageInfoResDTO.java new file mode 100644 index 0000000..da5262c --- /dev/null +++ b/jzo2o-market/src/main/java/com/jzo2o/market/model/dto/response/CouponPageInfoResDTO.java @@ -0,0 +1,57 @@ +package com.jzo2o.market.model.dto.response; + +import com.jzo2o.market.enums.CouponStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 优惠卷分页模型 + * @author itcast + * @since 2023-09-16 + */ +@Data +public class CouponPageInfoResDTO implements Serializable { + @ApiModelProperty(value = "优惠券id", required = true) + private Long id; + + @ApiModelProperty("用户姓名") + private String userName; + + @ApiModelProperty("用户手机号") + private String userPhone; + + /** + * 活动id + */ + @ApiModelProperty(value = "活动id", required = true) + private Long activityId; + + @ApiModelProperty("使用时间") + private LocalDateTime useTime; + + /** + * 优惠券状态,1:未使用,2:已使用,3:已过期 + */ + @ApiModelProperty("优惠券状态,1:未使用,2:已使用,3:已过期") + private CouponStatusEnum status; + + /** + * 订单id + */ + private String ordersId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", required = true) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(value = "更新时间", required = true) + private LocalDateTime updateTime; +} \ No newline at end of file diff --git a/jzo2o-market/src/main/java/com/jzo2o/market/model/dto/response/CouponSimpleInfoResDTO.java b/jzo2o-market/src/main/java/com/jzo2o/market/model/dto/response/CouponSimpleInfoResDTO.java new file mode 100644 index 0000000..c67bb8a --- /dev/null +++ b/jzo2o-market/src/main/java/com/jzo2o/market/model/dto/response/CouponSimpleInfoResDTO.java @@ -0,0 +1,47 @@ +package com.jzo2o.market.model.dto.response; + +import com.jzo2o.market.enums.CouponStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 优惠卷用户查询模型 + * @author itcast + * @since 2023-09-16 + */ +@Data +public class CouponSimpleInfoResDTO implements Serializable { + @ApiModelProperty(value = "优惠券id", required = true) + private Long id; + + @ApiModelProperty(value = "活动名称", required = true) + private String name; + + @ApiModelProperty(value = "活动id", required = true) + private Long activityId; + + @ApiModelProperty(value = "使用类型,1:满减,2:折扣", required = true) + private Integer type; + + @ApiModelProperty(value = "折扣") + private Integer discountRate; + + @ApiModelProperty(value = "优惠金额") + private BigDecimal discountAmount; + + @ApiModelProperty(value = "满减条件,0:表示无门槛", required = true) + private BigDecimal amountCondition; + + @ApiModelProperty("优惠券过期时间") + private LocalDateTime validityTime; + + @ApiModelProperty("使用时间") + private LocalDateTime useTime; + + @ApiModelProperty("优惠券状态,1:未使用,2:已使用,3:已过期") + private CouponStatusEnum status; +} \ No newline at end of file diff --git a/jzo2o-market/src/main/java/com/jzo2o/market/service/ICouponService.java b/jzo2o-market/src/main/java/com/jzo2o/market/service/ICouponService.java index 2090bc4..72c5348 100644 --- a/jzo2o-market/src/main/java/com/jzo2o/market/service/ICouponService.java +++ b/jzo2o-market/src/main/java/com/jzo2o/market/service/ICouponService.java @@ -1,17 +1,13 @@ package com.jzo2o.market.service; -import com.jzo2o.api.market.dto.request.CouponUseBackReqDTO; -import com.jzo2o.api.market.dto.request.CouponUseReqDTO; -import com.jzo2o.api.market.dto.response.AvailableCouponsResDTO; -import com.jzo2o.api.market.dto.response.CouponUseResDTO; -import com.jzo2o.common.model.PageResult; -import com.jzo2o.market.model.domain.Coupon; import com.baomidou.mybatisplus.extension.service.IService; -import com.jzo2o.market.model.dto.request.CouponOperationPageQueryReqDTO; -import com.jzo2o.market.model.dto.request.SeizeCouponReqDTO; -import com.jzo2o.market.model.dto.response.CouponInfoResDTO; +import com.jzo2o.common.model.PageResult; +import com.jzo2o.market.enums.CouponStatusEnum; +import com.jzo2o.market.model.domain.Coupon; +import com.jzo2o.market.model.dto.request.CouponPageQueryDTO; +import com.jzo2o.market.model.dto.response.CouponPageInfoResDTO; +import com.jzo2o.market.model.dto.response.CouponSimpleInfoResDTO; -import java.math.BigDecimal; import java.util.List; /** @@ -23,6 +19,13 @@ import java.util.List; * @since 2023-09-16 */ public interface ICouponService extends IService { + /** + * 分页查询优惠卷信息(通过活动id) + */ + PageResult page(CouponPageQueryDTO couponPageQueryDTO); - -} + /** + * 用户端滚动查询(抢卷时间降序) + */ + List getCurrentUserCoupon(CouponStatusEnum status, Integer lastId); +} \ No newline at end of file diff --git a/jzo2o-market/src/main/java/com/jzo2o/market/service/impl/CouponServiceImpl.java b/jzo2o-market/src/main/java/com/jzo2o/market/service/impl/CouponServiceImpl.java index 4435ed1..c82151e 100644 --- a/jzo2o-market/src/main/java/com/jzo2o/market/service/impl/CouponServiceImpl.java +++ b/jzo2o-market/src/main/java/com/jzo2o/market/service/impl/CouponServiceImpl.java @@ -1,80 +1,72 @@ package com.jzo2o.market.service.impl; -import cn.hutool.db.DbRuntimeException; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.jzo2o.api.market.dto.request.CouponUseBackReqDTO; -import com.jzo2o.api.market.dto.request.CouponUseReqDTO; -import com.jzo2o.api.market.dto.response.AvailableCouponsResDTO; -import com.jzo2o.api.market.dto.response.CouponUseResDTO; import com.jzo2o.common.expcetions.BadRequestException; -import com.jzo2o.common.expcetions.CommonException; -import com.jzo2o.common.expcetions.DBException; import com.jzo2o.common.model.PageResult; -import com.jzo2o.common.utils.*; -import com.jzo2o.market.enums.ActivityStatusEnum; +import com.jzo2o.common.utils.BeanUtils; +import com.jzo2o.common.utils.CollUtils; import com.jzo2o.market.enums.CouponStatusEnum; import com.jzo2o.market.mapper.CouponMapper; -import com.jzo2o.market.model.domain.Activity; import com.jzo2o.market.model.domain.Coupon; -import com.jzo2o.market.model.domain.CouponWriteOff; -import com.jzo2o.market.model.dto.request.CouponOperationPageQueryReqDTO; -import com.jzo2o.market.model.dto.request.SeizeCouponReqDTO; -import com.jzo2o.market.model.dto.response.ActivityInfoResDTO; -import com.jzo2o.market.model.dto.response.CouponInfoResDTO; -import com.jzo2o.market.service.IActivityService; +import com.jzo2o.market.model.dto.request.CouponPageQueryDTO; +import com.jzo2o.market.model.dto.response.CouponPageInfoResDTO; +import com.jzo2o.market.model.dto.response.CouponSimpleInfoResDTO; import com.jzo2o.market.service.ICouponService; -import com.jzo2o.market.service.ICouponUseBackService; -import com.jzo2o.market.service.ICouponWriteOffService; -import com.jzo2o.market.utils.CouponUtils; import com.jzo2o.mvc.utils.UserContext; import com.jzo2o.mysql.utils.PageUtils; -import com.jzo2o.redis.utils.RedisSyncQueueUtils; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; -import java.math.BigDecimal; -import java.time.LocalDateTime; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; -import static com.jzo2o.common.constants.ErrorInfo.Code.SEIZE_COUPON_FAILD; -import static com.jzo2o.market.constants.RedisConstants.RedisKey.*; - /** *

* 服务实现类 *

- * * @author itcast * @since 2023-09-16 */ @Service @Slf4j public class CouponServiceImpl extends ServiceImpl implements ICouponService { + @Override + public PageResult page(CouponPageQueryDTO couponPageQueryDTO) { + if (ObjectUtils.isEmpty(couponPageQueryDTO.getActivityId())) { + return new PageResult<>(0L, 0L, new ArrayList<>()); + } - @Resource(name = "seizeCouponScript") - private DefaultRedisScript seizeCouponScript; + Page couponPage = PageUtils.parsePageQuery(couponPageQueryDTO, Coupon.class); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() + .eq(Coupon::getActivityId, couponPageQueryDTO.getActivityId()); - @Resource - private RedisTemplate redisTemplate; + return PageUtils.toPage(baseMapper.selectPage(couponPage, queryWrapper), CouponPageInfoResDTO.class); + } - @Resource - private IActivityService activityService; + @Override + @SuppressWarnings("unchecked") + public List getCurrentUserCoupon(CouponStatusEnum status, Integer lastId) { + Long userId = UserContext.currentUserId(); + if (ObjectUtils.isEmpty(userId)) { + throw new BadRequestException("用户未授权"); + } - @Resource - private ICouponUseBackService couponUseBackService; + List coupons = lambdaQuery() + .eq(Coupon::getUserId, userId) + .eq(Coupon::getStatus, status) + .lt(ObjectUtils.isNotEmpty(lastId), Coupon::getId, lastId) + .orderByDesc(Coupon::getCreateTime) + .last("LIMIT 10") + .list(); - @Resource - private ICouponWriteOffService couponWriteOffService; - - -} + return CollUtils.isEmpty(coupons) ? new ArrayList<>() : + coupons.stream() + .map(coupon -> BeanUtils.toBean(coupon, CouponSimpleInfoResDTO.class)) + .collect(Collectors.toList()); + } +} \ No newline at end of file