feat(market):新增查询优惠卷信息的相关功能
This commit is contained in:
parent
f6238fbca7
commit
3a5882268d
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user