Przeglądaj źródła

优惠券领取记录接口开发

WangChanghua 1 rok temu
rodzic
commit
df70266d5e
15 zmienionych plików z 334 dodań i 98 usunięć
  1. 0 4
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/constant/CouponType.java
  2. 17 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/CouponPagingParam.java
  3. 48 2
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/UserCouponPagingParam.java
  4. 8 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/UserCouponService.java
  5. 3 3
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/CouponMapper.java
  6. 20 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/UserCouponMapper.java
  7. 2 3
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/BasePromotion.java
  8. 21 74
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/UserCoupon.java
  9. 48 9
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/CouponServiceImpl.java
  10. 14 1
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/UserCouponServiceImpl.java
  11. 16 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/timetask/handler/EveryDayExecute.java
  12. 15 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/timetask/handler/EveryHourExecute.java
  13. 15 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/timetask/handler/EveryMinuteExecute.java
  14. 55 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/timetask/handler/impl/coupon/CouponExecute.java
  15. 52 2
      vehicle-server/src/main/resources/mapper/UserCouponMapper.xml

+ 0 - 4
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/constant/CouponType.java

@@ -11,10 +11,6 @@ import lombok.Getter;
  */
 @Getter
 public enum CouponType implements Enumeration {
-    /**
-     * 赠送
-     */
-    GIVE("赠送"),
 
     /**
      * 满减

+ 17 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/CouponPagingParam.java

@@ -3,6 +3,7 @@ package com.chelvc.cloud.vehicle.api.param;
 import com.chelvc.cloud.vehicle.api.constant.CouponClaimType;
 import com.chelvc.cloud.vehicle.api.constant.CouponStatus;
 import com.chelvc.cloud.vehicle.api.constant.CouponType;
+import com.chelvc.cloud.vehicle.api.constant.PromotionStatus;
 import com.chelvc.framework.common.model.Paging;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -12,6 +13,7 @@ import lombok.experimental.SuperBuilder;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
 import java.io.Serializable;
+import java.util.Date;
 
 /**
  * 优惠券信息查询参数
@@ -51,8 +53,23 @@ public class CouponPagingParam implements Serializable {
      */
     private CouponClaimType couponClaimType;
 
+    /**
+     * 活动状态
+     */
+    private PromotionStatus promotionStatus;
+
     /**
      * 商家ID
      */
     private Long merchantId;
+
+    /**
+     * 活动开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 活动结束时间
+     */
+    private Date endTime;
 }

+ 48 - 2
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/UserCouponPagingParam.java

@@ -1,6 +1,8 @@
 package com.chelvc.cloud.vehicle.api.param;
 
+import com.chelvc.cloud.vehicle.api.constant.CouponClaimType;
 import com.chelvc.cloud.vehicle.api.constant.CouponType;
+import com.chelvc.cloud.vehicle.api.constant.PromotionScopeType;
 import com.chelvc.cloud.vehicle.api.constant.UserCouponStatus;
 import com.chelvc.framework.common.model.Paging;
 import lombok.AllArgsConstructor;
@@ -11,6 +13,7 @@ import lombok.experimental.SuperBuilder;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
 import java.io.Serializable;
+import java.util.Date;
 
 /**
  * 优惠券领取记录查询参数
@@ -38,12 +41,55 @@ public class UserCouponPagingParam implements Serializable {
     /**
      * 优惠券类型
      */
-    @NotNull(message = "优惠券类型不能为空")
     private CouponType type;
 
     /**
      * 用户优惠券状态
      */
-    @NotNull(message = "用户优惠券状态不能为空")
     private UserCouponStatus status;
+
+    /**
+     * 优惠券ID
+     */
+    private Long couponId;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 商家ID
+     */
+    private Long merchantId;
+
+    /**
+     * 优惠券名称
+     */
+    private String couponName;
+
+    /**
+     * 用户名称
+     */
+    private String userName;
+
+    /**
+     * 优惠券领取方式
+     */
+    private CouponClaimType claimType;
+
+    /**
+     * 关联范围类型
+     */
+    private PromotionScopeType scopeType;
+
+    /**
+     * 活动开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 活动结束时间
+     */
+    private Date endTime;
 }

+ 8 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/UserCouponService.java

@@ -64,6 +64,14 @@ public interface UserCouponService {
      */
     Pagination<UserCouponDTO> getUserCouponPaging(UserCouponPagingParam param);
 
+    /**
+     * 查询优惠券领取记录
+     *
+     * @param param 查询参数
+     * @return 优惠券领取记录分页信息
+     */
+    Pagination<UserCouponDTO> getCouponClaimPaging(UserCouponPagingParam param);
+
     /**
      * 领取优惠券
      *

+ 3 - 3
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/CouponMapper.java

@@ -1,14 +1,14 @@
 package com.chelvc.cloud.vehicle.server.dao;
 
-import java.util.Collection;
-import java.util.List;
-
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.chelvc.cloud.vehicle.api.dto.CouponDTO;
 import com.chelvc.cloud.vehicle.server.entity.Coupon;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Collection;
+import java.util.List;
+
 /**
  * 优惠券数据操作接口
  *

+ 20 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/UserCouponMapper.java

@@ -1,6 +1,9 @@
 package com.chelvc.cloud.vehicle.server.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.chelvc.cloud.vehicle.api.constant.UserCouponStatus;
+import com.chelvc.cloud.vehicle.api.param.UserCouponPagingParam;
 import com.chelvc.cloud.vehicle.api.param.UserCouponQueryParam;
 import com.chelvc.cloud.vehicle.server.entity.UserCoupon;
 import org.apache.ibatis.annotations.Mapper;
@@ -40,4 +43,21 @@ public interface UserCouponMapper extends BaseMapper<UserCoupon> {
      * @return 用户可用优惠券信息列表
      */
     List<UserCoupon> listUserCanUseCoupons(@Param("userId") Long userId, @Param("param") UserCouponQueryParam param);
+
+    /**
+     * 修改用户优惠券状态
+     *
+     * @param couponIds 优惠券id集合
+     * @param status 用户优惠券状态
+     */
+    int updateUserCouponStatus(@Param("couponIds") List<Long> couponIds, @Param("status") UserCouponStatus status);
+
+    /**
+     * 查询用户优惠券
+     *
+     * @param page  分页信息
+     * @param param 查询参数
+     * @return 用户优惠券分页信息
+     */
+    Page<UserCoupon> getUserCouponPaging(Page<?> page, @Param("param") UserCouponPagingParam param);
 }

+ 2 - 3
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/BasePromotion.java

@@ -5,8 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.chelvc.cloud.vehicle.api.constant.PromotionScopeType;
 import com.chelvc.cloud.vehicle.api.constant.PromotionStatus;
-import com.chelvc.framework.database.entity.Deletable;
-import com.chelvc.framework.database.entity.ModifyEntity;
+import com.chelvc.framework.database.entity.BasicEntity;
 import com.chelvc.framework.database.interceptor.DeletedTypeHandler;
 import lombok.*;
 import lombok.experimental.SuperBuilder;
@@ -25,7 +24,7 @@ import java.util.Date;
 @AllArgsConstructor
 @ToString(callSuper = true)
 @EqualsAndHashCode(callSuper = true)
-public class BasePromotion extends ModifyEntity<Long> implements Deletable<Long> {
+public class BasePromotion extends BasicEntity<Long> {
 
     /**
      * 主键

+ 21 - 74
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/UserCoupon.java

@@ -1,22 +1,13 @@
 package com.chelvc.cloud.vehicle.server.entity;
 
-import cn.hutool.core.date.DateField;
-import cn.hutool.core.date.DateTime;
-import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
-import com.chelvc.cloud.vehicle.api.constant.CouponClaimType;
 import com.chelvc.cloud.vehicle.api.constant.CouponType;
-import com.chelvc.cloud.vehicle.api.constant.PromotionScopeType;
 import com.chelvc.cloud.vehicle.api.constant.UserCouponStatus;
-import com.chelvc.framework.database.entity.ModifyEntity;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-import lombok.ToString;
+import com.chelvc.framework.database.entity.BasicEntity;
+import com.chelvc.framework.database.interceptor.DeletedTypeHandler;
+import lombok.*;
 import lombok.experimental.SuperBuilder;
 
 import java.util.Date;
@@ -33,7 +24,7 @@ import java.util.Date;
 @AllArgsConstructor
 @ToString(callSuper = true)
 @EqualsAndHashCode(callSuper = true)
-public class UserCoupon extends ModifyEntity<Long> {
+public class UserCoupon extends BasicEntity<Long> {
     /**
      * 主键
      */
@@ -45,6 +36,11 @@ public class UserCoupon extends ModifyEntity<Long> {
      */
     private Long userId;
 
+    /**
+     * 用户名称
+     */
+    private Long userName;
+
     /**
      * 优惠券ID
      */
@@ -60,57 +56,6 @@ public class UserCoupon extends ModifyEntity<Long> {
      */
     private Boolean used;
 
-    /**
-     * 优惠券
-     */
-    @TableField(exist = false)
-    private Coupon coupon;
-
-    /**
-     * 商家ID
-     */
-    private String merchantId;
-
-    /**
-     * 商家名称
-     */
-    private String merchantName;
-
-    /**
-     * 面额
-     */
-    private Double price;
-
-    /**
-     * 折扣
-     */
-    private Double discount;
-
-    /**
-     * 消费门槛
-     */
-    private Double consumeThreshold;
-
-    /**
-     * 用户名称
-     */
-    private String userName;
-
-    /**
-     * 关联范围类型
-     */
-    private PromotionScopeType scopeType;
-
-    /**
-     * 优惠券类型
-     */
-    private CouponType couponType;
-
-    /**
-     * 范围关联的ID
-     */
-    private String scopeId;
-
     /**
      * 使用起始时间
      */
@@ -122,27 +67,29 @@ public class UserCoupon extends ModifyEntity<Long> {
     private Date endTime;
 
     /**
-     * 优惠券类型,分为免费领取和活动赠送
+     * 是否是平台优惠券
      */
-    private CouponClaimType claimType;
+    private Boolean platformFlag;
 
     /**
-     * 是否是平台优惠券
+     * 核销时间
      */
-    private Boolean platformFlag;
+    private Date consumptionTime;
 
     /**
-     * 店铺承担比例
+     * 用户优惠券状态
      */
-    private Double storeCommission;
+    private UserCouponStatus status;
 
     /**
-     * 核销时间
+     * 是否已删除
      */
-    private Date consumptionTime;
+    @TableField(typeHandler = DeletedTypeHandler.class)
+    private Boolean deleted;
 
     /**
-     * 用户优惠券状态
+     * 优惠券
      */
-    private UserCouponStatus userCouponStatus;
+    @TableField(exist = false)
+    private Coupon coupon;
 }

+ 48 - 9
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/CouponServiceImpl.java

@@ -2,7 +2,11 @@ package com.chelvc.cloud.vehicle.server.service.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.chelvc.cloud.vehicle.api.constant.*;
 import com.chelvc.cloud.vehicle.api.dto.CouponDTO;
@@ -12,6 +16,8 @@ import com.chelvc.cloud.vehicle.api.param.FullDiscountQueryParam;
 import com.chelvc.cloud.vehicle.api.param.PromotionGoodsQueryParam;
 import com.chelvc.cloud.vehicle.server.copier.CouponCopier;
 import com.chelvc.cloud.vehicle.server.dao.CouponMapper;
+import com.chelvc.cloud.vehicle.server.dao.GoodsMapper;
+import com.chelvc.cloud.vehicle.server.dao.UserCouponMapper;
 import com.chelvc.cloud.vehicle.server.entity.Coupon;
 import com.chelvc.cloud.vehicle.server.entity.FullDiscount;
 import com.chelvc.cloud.vehicle.server.entity.Goods;
@@ -26,11 +32,13 @@ import com.chelvc.framework.database.util.PagingUtils;
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import java.util.*;
+import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
 /**
@@ -47,6 +55,8 @@ public class CouponServiceImpl extends AbstractPromotionServiceImpl<CouponMapper
     private final CouponActivityItemService couponActivityItemService;
     private final PromotionGoodsService promotionGoodsService;
     private final FullDiscountService fullDiscountService;
+    private final GoodsMapper goodsMapper;
+    private final UserCouponMapper userCouponMapper;
 
     @Override
     public List<CouponDTO> listUserGoodsActiveCoupons(@NonNull Long userId, Collection<Long> goodsCouponIds) {
@@ -110,13 +120,23 @@ public class CouponServiceImpl extends AbstractPromotionServiceImpl<CouponMapper
 
     @Override
     public Pagination<CouponDTO> getCouponPaging(@NonNull CouponPagingParam param) {
+        Long merchantId = param.getMerchantId();
+        if (Objects.isNull(merchantId)) {
+            merchantId = PromotionUtils.PLATFORM_ID;
+        }
         // 查询优惠券列表
-        Page<Coupon> page = this.lambdaQuery()
-                .eq(Objects.nonNull(param.getMerchantId()), Coupon::getMerchantId, param.getMerchantId())
-                .eq(Objects.nonNull(param.getCouponType()), Coupon::getType, param.getCouponType())
-                .eq(Objects.nonNull(param.getCouponStatus()), Coupon::getStatus, param.getCouponStatus())
+        LambdaQueryChainWrapper<Coupon> lambdaQueryChainWrapper = this.lambdaQuery()
+                .eq(Coupon::getMerchantId, merchantId)
                 .eq(Objects.nonNull(param.getCouponClaimType()), Coupon::getClaimType, param.getCouponClaimType())
-                .or().like(!StringUtils.isEmpty(param.getKeyword()), Coupon::getName, param.getKeyword())
+                .eq(Objects.nonNull(param.getCouponType()), Coupon::getType, param.getCouponType())
+                .ge(Objects.nonNull(param.getStartTime()), Coupon::getStartTime, param.getStartTime())
+                .le(Objects.nonNull(param.getEndTime()), Coupon::getStartTime, param.getEndTime())
+                .eq(Coupon::getDeleted, false);
+        if (Objects.nonNull(param.getPromotionStatus())) {
+            lambdaQueryChainWrapper.nested(this.queryPromotionStatus(param.getPromotionStatus()));
+        }
+        Page<Coupon> page = lambdaQueryChainWrapper
+                .like(!StringUtils.isEmpty(param.getKeyword()), Coupon::getName, param.getKeyword())
                 .orderByDesc(Coupon::getCreateTime).page(PagingUtils.convert(param.getPaging()));
         List<Coupon> records = page.getRecords();
         if (CollectionUtils.isEmpty(records)) {
@@ -136,7 +156,7 @@ public class CouponServiceImpl extends AbstractPromotionServiceImpl<CouponMapper
     @Override
     public void batchDeleteCoupon(@NonNull List<Long> ids) {
         // 关闭用户优惠券信息
-//        this.userCouponService.closeUserCoupon(ids);
+        this.userCouponMapper.updateUserCouponStatus(ids, UserCouponStatus.CLOSED);
         // 删除优惠券关联优惠券活动
         this.couponActivityItemService.removeByCouponId(ids);
         super.removePromotion(ids);
@@ -186,7 +206,7 @@ public class CouponServiceImpl extends AbstractPromotionServiceImpl<CouponMapper
         // 关闭优惠券,删除相关会员优惠券和券活动
         if (startTime == null && endTime == null) {
             //关闭用户优惠券信息
-//            this.userCouponService.closeUserCoupon(ids);
+            this.userCouponMapper.updateUserCouponStatus(ids, UserCouponStatus.CLOSED);
             //删除优惠券关联优惠券活动
             this.couponActivityItemService.removeByCouponId(ids);
         }
@@ -312,7 +332,7 @@ public class CouponServiceImpl extends AbstractPromotionServiceImpl<CouponMapper
             throw new ResourceUnavailableException("指定商品范围关联id不能为空");
         }
         for (String id : split) {
-            Goods goods = null;
+            Goods goods = this.goodsMapper.selectById(id);
             if (goods == null) {
                 throw new ResourceUnavailableException("商品不存在");
             }
@@ -328,4 +348,23 @@ public class CouponServiceImpl extends AbstractPromotionServiceImpl<CouponMapper
     private CouponDTO convert(Coupon coupon) {
         return CouponCopier.INSTANCE.copying(coupon);
     }
-}
+
+    private <T> Consumer<LambdaQueryWrapper<Coupon>> queryPromotionStatus(PromotionStatus promotionStatus) {
+        switch (promotionStatus) {
+            case NEW:
+                return (LambdaQueryWrapper<Coupon> t) -> t.nested(i -> i.gt(Coupon::getStartTime, new Date())
+                        .gt(Coupon::getEndTime, new Date()));
+            case START:
+                return (LambdaQueryWrapper<Coupon> t) -> t.nested(i -> i.le(Coupon::getStartTime, new Date())
+                        .ge(Coupon::getEndTime, new Date()));
+            case END:
+                return (LambdaQueryWrapper<Coupon> t) -> t.nested(i -> i.lt(Coupon::getStartTime, new Date())
+                        .lt(Coupon::getEndTime, new Date()));
+            case CLOSE:
+                return (LambdaQueryWrapper<Coupon> t) -> t.nested(i -> i.isNull(Coupon::getStartTime)
+                        .isNull(Coupon::getEndTime));
+            default:
+                return null;
+        }
+    }
+}

+ 14 - 1
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/UserCouponServiceImpl.java

@@ -124,6 +124,19 @@ public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCou
         return PagingUtils.convert(page, userCoupons);
     }
 
+    @Override
+    public Pagination<UserCouponDTO> getCouponClaimPaging(@NonNull UserCouponPagingParam param) {
+        Page<UserCoupon> page = this.baseMapper.getUserCouponPaging(PagingUtils.convert(param.getPaging()), param);
+        List<UserCoupon> records = page.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            return Pagination.empty();
+        }
+
+        // 构建优惠券领取记录信息
+        List<UserCouponDTO> userCoupons = records.stream().map(this::convert).collect(Collectors.toList());
+        return PagingUtils.convert(page, userCoupons);
+    }
+
     @Override
     public Long claimCoupon(@NonNull Long couponId) {
         Coupon coupon = ResourceUtils.required(couponService.getById(couponId), "优惠券不存在");
@@ -167,7 +180,7 @@ public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCou
     public void closeUserCoupon(List<Long> couponIds) {
         LambdaUpdateWrapper<UserCoupon> updateWrapper = new LambdaUpdateWrapper<UserCoupon>()
                 .in(UserCoupon::getCouponId, couponIds)
-                .set(UserCoupon::getUserCouponStatus, UserCouponStatus.CLOSED);
+                .set(UserCoupon::getStatus, UserCouponStatus.CLOSED);
         this.update(updateWrapper);
     }
 

+ 16 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/timetask/handler/EveryDayExecute.java

@@ -0,0 +1,16 @@
+package com.chelvc.cloud.vehicle.server.timetask.handler;
+
+/**
+ * 每日任务
+ * 每日凌晨1点执行
+ *
+ * @author qizai
+ * @date 2023/11/16
+ */
+public interface EveryDayExecute {
+
+    /**
+     * 执行每日任务
+     */
+    void execute();
+}

+ 15 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/timetask/handler/EveryHourExecute.java

@@ -0,0 +1,15 @@
+package com.chelvc.cloud.vehicle.server.timetask.handler;
+
+/**
+ * 每小时任务
+ *
+ * @author qizai
+ * @date 2023/11/16
+ */
+public interface EveryHourExecute {
+
+    /**
+     * 执行
+     */
+    void execute();
+}

+ 15 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/timetask/handler/EveryMinuteExecute.java

@@ -0,0 +1,15 @@
+package com.chelvc.cloud.vehicle.server.timetask.handler;
+
+/**
+ * 每分钟任务
+ *
+ * @author qizai
+ * @date 2023/11/16
+ */
+public interface EveryMinuteExecute {
+
+    /**
+     * 执行
+     */
+    void execute();
+}

+ 55 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/timetask/handler/impl/coupon/CouponExecute.java

@@ -0,0 +1,55 @@
+package com.chelvc.cloud.vehicle.server.timetask.handler.impl.coupon;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.chelvc.cloud.vehicle.api.constant.UserCouponStatus;
+import com.chelvc.cloud.vehicle.server.entity.UserCoupon;
+import com.chelvc.cloud.vehicle.server.service.UserCouponService;
+import com.chelvc.cloud.vehicle.server.timetask.handler.EveryDayExecute;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * 优惠券状态监测
+ *
+ * @author qizai
+ * @date 2023/11/16
+ */
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+@Component
+public class CouponExecute implements EveryDayExecute {
+
+    /**
+     * 过期常量,过期后或者使用后一定时间内,删除无效的优惠券,物理删除
+     */
+    static final int EXPIRATION_DAY = 3;
+
+    private final UserCouponService userCouponService;
+
+    /**
+     * 检测优惠券的使用时间,超期未使用则失效
+     * 此方法用于领取*天后失效优惠券使用
+     */
+    @Override
+    public void execute() {
+        //将过期优惠券变更为过期状态
+        LambdaUpdateWrapper<UserCoupon> updateWrapper = new LambdaUpdateWrapper<UserCoupon>()
+                .eq(UserCoupon::getStatus, UserCouponStatus.CLAIMED)
+                .le(UserCoupon::getEndTime, new Date())
+                .set(UserCoupon::getStatus, UserCouponStatus.EXPIRED);
+        this.userCouponService.update(updateWrapper);
+
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) - EXPIRATION_DAY);
+        Date removeTime = calendar.getTime();
+        //删除过期/已使用的优惠券
+        LambdaUpdateWrapper<UserCoupon> deleteWrapper = new LambdaUpdateWrapper<UserCoupon>()
+                //如果结束时间小于 当前时间增加指定删除日期,则删除
+                .le(UserCoupon::getEndTime, removeTime);
+        this.userCouponService.remove(deleteWrapper);
+    }
+
+}

+ 52 - 2
vehicle-server/src/main/resources/mapper/UserCouponMapper.xml

@@ -6,8 +6,12 @@
         <id column="id" property="id" jdbcType="BIGINT"/>
         <result column="user_id" property="userId" jdbcType="BIGINT"/>
         <result column="coupon_id" property="couponId" jdbcType="BIGINT"/>
+        <result column="user_name" property="userName" jdbcType="VARCHAR"/>
+        <result column="status" property="status" jdbcType="VARCHAR"/>
         <result column="type" property="type" jdbcType="VARCHAR"/>
         <result column="used" property="used" jdbcType="TINYINT"/>
+        <result column="start_time" property="startTime" jdbcType="TIMESTAMP"/>
+        <result column="end_time" property="endTime" jdbcType="TIMESTAMP"/>
         <result column="creator" property="creator" jdbcType="BIGINT"/>
         <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
         <result column="updater" property="updater" jdbcType="BIGINT"/>
@@ -16,10 +20,12 @@
             <id column="coupon_id" property="id" jdbcType="BIGINT"/>
             <result column="merchant_id" property="merchantId" jdbcType="BIGINT"/>
             <result column="name" property="name" jdbcType="VARCHAR"/>
+            <result column="merchant_name" property="merchantName" jdbcType="VARCHAR"/>
             <result column="amount" property="amount" jdbcType="DOUBLE"/>
-            <result column="reduce" property="reduce" jdbcType="DOUBLE"/>
+            <result column="consume_threshold" property="consumeThreshold" jdbcType="DOUBLE"/>
             <result column="discount" property="discount" jdbcType="DOUBLE"/>
-            <result column="expiration" property="expiration" jdbcType="TIMESTAMP"/>
+            <result column="claim_type" property="claimType" jdbcType="VARCHAR"/>
+            <result column="scope_type" property="scopeType" jdbcType="VARCHAR"/>
             <result column="description" property="description" jdbcType="VARCHAR"/>
         </association>
     </resultMap>
@@ -76,4 +82,48 @@
         limit #{param.size}
     </select>
 
+    <update id="updateUserCouponStatus">
+        update user_coupon ucn set ucn.status = #{status}
+        where ucn.coupon_id in (
+        <foreach collection="couponIds" item="item" index="index" separator=",">
+            #{item}
+        </foreach>
+        )
+    </update>
+
+    <select id="getUserCouponPaging" resultMap="USERCOUPON_RESULT_MAP">
+        select ucn.id, ucn.coupon_id,ucn.user_name,ucn.status,ucn.start_time,ucn.end_time,ucn.type,
+         cn.name,cn.merchant_name,
+         cn.amount, cn.consume_threshold, cn.discount,cn.claim_type,cn.scope_type,
+         cn.description,cn.merchant_id
+        from `user_coupon` ucn
+        left join `coupon` cn on ucn.coupon_id = cn.id
+        <where>
+            <if test="param.userId != null">
+                and ucn.user_id = #{param.userId}
+            </if>
+            <if test="param.merchantId != null">
+                and cn.merchant_id = #{param.merchantId}
+            </if>
+            <if test="param.couponId != null">
+                and ucn.coupon_id = #{param.couponId}
+            </if>
+            <if test="param.couponName != null and param.couponName != ''">
+                and cn.name = #{param.couponName}
+            </if>
+            <if test="param.type != null">
+                and ucn.type = #{param.type}
+            </if>
+            <if test="param.scopeType != null">
+                and ucn.scope_type = #{param.scopeType}
+            </if>
+            <if test="param.claimType != null">
+                and cn.claim_type = #{param.claimType}
+            </if>
+            <if test="param.status != null">
+                and ucn.status = #{param.status}
+            </if>
+        </where>
+        order by ucn.create_time desc
+    </select>
 </mapper>