feat(market):新增查询优惠卷信息的相关功能

This commit is contained in:
JIAN 2024-09-23 22:06:35 +08:00
parent f6238fbca7
commit 3a5882268d
10 changed files with 270 additions and 174 deletions

View File

@ -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<CouponSimpleInfoResDTO> 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);
}
}

View File

@ -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<CouponPageInfoResDTO> pageCoupon(CouponPageQueryDTO couponPageQueryDTO) {
return couponService.page(couponPageQueryDTO);
}
}

View File

@ -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;
}
}

View File

@ -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;
/**
* <p>
*
* </p>
*
* </p>
* @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;
}
}

View File

@ -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;
}
}

View File

@ -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;
/**
* <p>
*
* </p>
*
* @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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<Coupon> {
/**
* 分页查询优惠卷信息(通过活动id)
*/
PageResult<CouponPageInfoResDTO> page(CouponPageQueryDTO couponPageQueryDTO);
}
/**
* 用户端滚动查询(抢卷时间降序)
*/
List<CouponSimpleInfoResDTO> getCurrentUserCoupon(CouponStatusEnum status, Integer lastId);
}

View File

@ -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.*;
/**
* <p>
* 服务实现类
* </p>
*
* @author itcast
* @since 2023-09-16
*/
@Service
@Slf4j
public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> implements ICouponService {
@Override
public PageResult<CouponPageInfoResDTO> page(CouponPageQueryDTO couponPageQueryDTO) {
if (ObjectUtils.isEmpty(couponPageQueryDTO.getActivityId())) {
return new PageResult<>(0L, 0L, new ArrayList<>());
}
@Resource(name = "seizeCouponScript")
private DefaultRedisScript<String> seizeCouponScript;
Page<Coupon> couponPage = PageUtils.parsePageQuery(couponPageQueryDTO, Coupon.class);
LambdaQueryWrapper<Coupon> queryWrapper = Wrappers.<Coupon>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<CouponSimpleInfoResDTO> getCurrentUserCoupon(CouponStatusEnum status, Integer lastId) {
Long userId = UserContext.currentUserId();
if (ObjectUtils.isEmpty(userId)) {
throw new BadRequestException("用户未授权");
}
@Resource
private ICouponUseBackService couponUseBackService;
List<Coupon> 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());
}
}