Prechádzať zdrojové kódy

查询用户优惠券接口开发

qizai 1 rok pred
rodič
commit
c7b8fd9d53
16 zmenil súbory, kde vykonal 867 pridanie a 4 odobranie
  1. 37 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/constant/UserCouponStatus.java
  2. 52 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/UserCouponDTO.java
  3. 86 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/CouponModifyParam.java
  4. 54 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/CouponPagingParam.java
  5. 52 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/UserCouponModifyParam.java
  6. 49 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/UserCouponPagingParam.java
  7. 52 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/UserCouponQueryParam.java
  8. 56 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/CouponService.java
  9. 58 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/UserCouponService.java
  10. 47 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/copier/CouponCopier.java
  11. 67 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/copier/UserCouponCopier.java
  12. 20 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/UserCouponMapper.java
  13. 5 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/UserCoupon.java
  14. 79 1
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/CouponServiceImpl.java
  15. 97 3
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/UserCouponServiceImpl.java
  16. 56 0
      vehicle-server/src/main/resources/mapper/UserCouponMapper.xml

+ 37 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/constant/UserCouponStatus.java

@@ -0,0 +1,37 @@
+package com.chelvc.cloud.vehicle.api.constant;
+
+import com.chelvc.framework.common.model.Enumeration;
+import lombok.Getter;
+
+/**
+ * 用户优惠券状态枚举
+ *
+ * @author qizai
+ * @date 2023/9/8
+ */
+@Getter
+public enum UserCouponStatus implements Enumeration {
+    /**
+     * 未使用
+     */
+    UNUSED("未使用"),
+
+    /**
+     * 已使用
+     */
+    USED("已使用"),
+
+    /**
+     * 已过期
+     */
+    EXPIRED("已过期");
+
+    /**
+     * 状态描述
+     */
+    private final String description;
+
+    UserCouponStatus(String description) {
+        this.description = description;
+    }
+}

+ 52 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/UserCouponDTO.java

@@ -0,0 +1,52 @@
+package com.chelvc.cloud.vehicle.api.dto;
+
+import com.chelvc.cloud.vehicle.api.constant.CouponType;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 优惠卷领取记录
+ *
+ * @author qizai
+ * @date 2023/9/8
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserCouponDTO implements Serializable {
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 用户id
+     */
+	private Long userId;
+
+    /**
+     * 优惠券id
+     */
+	private Long couponId;
+
+    /**
+     * 优惠券类型
+     */
+    private CouponType type;
+
+    /**
+     * 是否已使用
+     */
+    private Boolean used;
+
+    /**
+     * 优惠券
+     */
+	private CouponDTO couponDTO;
+}

+ 86 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/CouponModifyParam.java

@@ -0,0 +1,86 @@
+package com.chelvc.cloud.vehicle.api.param;
+
+import com.chelvc.cloud.vehicle.api.constant.CouponStatus;
+import com.chelvc.cloud.vehicle.api.constant.CouponType;
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.DecimalMin;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Set;
+
+/**
+ * 优惠券信息更新参数
+ *
+ * @author qizai
+ * @date 2023/9/8
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CouponModifyParam implements Serializable {
+    /**
+     * 商家ID
+     */
+    @NotNull(message = "商家ID不能为空")
+	private Long merchantId;
+
+    /**
+     * 优惠券类型
+     */
+    @NotNull(message = "优惠券类型不能为空")
+	private CouponType type;
+
+    /**
+     * 优惠券名称
+     */
+    @NotEmpty(message = "优惠券名称不能为空")
+    @Size(max = 50, message = "优惠券名称长度不能大于50")
+	private String name;
+
+    /**
+     * 优惠金额
+     */
+    @NotNull(message = "优惠金额不能为空")
+    @DecimalMin(value = "0.00", message = "优惠金额不能小于0")
+    private Double amount;
+
+    /**
+     * 满减金额
+     */
+    @NotNull(message = "满减金额不能为空")
+    @DecimalMin(value = "0.00", message = "满减金额不能小于0")
+    private Double reduce;
+
+    /**
+     * 优惠折扣
+     */
+    @NotNull(message = "优惠折扣不能为空")
+    @DecimalMin(value = "0.00", message = "优惠折扣不能小于0")
+    private Double discount;
+
+    /**
+     * 过期时间
+     */
+    private Date expiration;
+
+    /**
+     * 优惠券描述
+     */
+    @NotEmpty(message = "优惠券描述不能为空")
+    @Size(max = 100, message = "优惠券描述长度不能大于100")
+    private String description;
+
+    /**
+     * 优惠券状态
+     */
+    @NotNull(message = "优惠券状态不能为空")
+    private CouponStatus status;
+}

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

@@ -0,0 +1,54 @@
+package com.chelvc.cloud.vehicle.api.param;
+
+import com.chelvc.cloud.vehicle.api.constant.CouponStatus;
+import com.chelvc.cloud.vehicle.api.constant.CouponType;
+import com.chelvc.framework.common.model.Paging;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * 优惠券信息查询参数
+ *
+ * @author qizai
+ * @date 2023/9/8
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CouponPagingParam implements Serializable {
+    /**
+     * 分页信息
+     */
+    @NotNull(message = "分页不能为空")
+    private Paging paging;
+
+    /**
+     * 关键字
+     */
+    @Size(max = 100, message = "关键字长度不能大于100")
+    private String keyword;
+
+    /**
+     * 优惠券类型
+     */
+    @NotNull(message = "优惠券类型不能为空")
+    private CouponType couponType;
+
+    /**
+     * 优惠券状态
+     */
+    @NotNull(message = "优惠券状态不能为空")
+    private CouponStatus couponStatus;
+
+    /**
+     * 商家ID
+     */
+    private Long merchantId;
+}

+ 52 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/UserCouponModifyParam.java

@@ -0,0 +1,52 @@
+package com.chelvc.cloud.vehicle.api.param;
+
+import com.chelvc.cloud.vehicle.api.constant.CouponType;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 优惠卷领取记录更新参数
+ *
+ * @author 七仔
+ * @date 2023/3/29
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserCouponModifyParam implements Serializable {
+    /**
+     * 用户id
+     */
+    @NotNull(message = "用户ID不能为空")
+	private Long userId;
+
+    /**
+     * 优惠券id
+     */
+    @NotNull(message = "优惠券ID不能为空")
+	private Long couponId;
+
+    /**
+     * 优惠券类型
+     */
+    @NotNull(message = "优惠券类型不能为空")
+	private CouponType type;
+
+    /**
+     * 是否已使用
+     */
+    @NotNull(message = "是否已使用不能为空")
+    private Boolean used;
+
+    /**
+     * 使用时间
+     */
+	private Date usedTime;
+}

+ 49 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/UserCouponPagingParam.java

@@ -0,0 +1,49 @@
+package com.chelvc.cloud.vehicle.api.param;
+
+import com.chelvc.cloud.vehicle.api.constant.CouponType;
+import com.chelvc.cloud.vehicle.api.constant.UserCouponStatus;
+import com.chelvc.framework.common.model.Paging;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * 优惠券领取记录查询参数
+ *
+ * @author 七仔
+ * @date 2023/3/29
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserCouponPagingParam implements Serializable {
+    /**
+     * 分页信息
+     */
+    @NotNull(message = "分页不能为空")
+    private Paging paging;
+
+    /**
+     * 关键字
+     */
+    @Size(max = 100, message = "关键字长度不能大于100")
+    private String keyword;
+
+    /**
+     * 优惠券类型
+     */
+    @NotNull(message = "优惠券类型不能为空")
+    private CouponType type;
+
+    /**
+     * 用户优惠券状态
+     */
+    @NotNull(message = "用户优惠券状态不能为空")
+    private UserCouponStatus status;
+}

+ 52 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/UserCouponQueryParam.java

@@ -0,0 +1,52 @@
+package com.chelvc.cloud.vehicle.api.param;
+
+import com.chelvc.cloud.vehicle.api.constant.CouponType;
+import com.chelvc.cloud.vehicle.api.constant.UserCouponStatus;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * 用户优惠券查询参数
+ *
+ * @author qizai
+ * @date 2023/9/8
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserCouponQueryParam implements Serializable {
+
+    /**
+     * 偏移用户优惠券ID
+     */
+    @Min(value = 1, message = "偏移用户优惠券ID不能小于1")
+    private Long offset;
+
+    /**
+     * 查询数量
+     */
+    @NotNull(message = "查询数量不能为空")
+    @Min(value = 1, message = "查询数量不能小于1")
+    @Max(value = 20, message = "查询数量不能大于20")
+    private Integer size;
+
+    /**
+     * 优惠券类型
+     */
+    @NotNull(message = "优惠券类型不能为空")
+    private CouponType type;
+
+    /**
+     * 用户优惠券状态
+     */
+    @NotNull(message = "用户优惠券状态不能为空")
+    private UserCouponStatus status;
+}

+ 56 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/CouponService.java

@@ -0,0 +1,56 @@
+package com.chelvc.cloud.vehicle.api.service;
+
+
+import com.chelvc.cloud.vehicle.api.dto.CouponDTO;
+import com.chelvc.cloud.vehicle.api.param.CouponModifyParam;
+import com.chelvc.cloud.vehicle.api.param.CouponPagingParam;
+import com.chelvc.framework.common.model.Pagination;
+
+/**
+ * 优惠券业务接口
+ *
+ * @author qizai
+ * @date 2023/9/8
+ */
+public interface CouponService {
+    /**
+     * 新增优惠券
+     *
+     * @param param 新增参数
+     * @return 优惠券主键
+     */
+    Long addCoupon(CouponModifyParam param);
+
+    /**
+     * 修改优惠券
+     *
+     * @param id    优惠券主键
+     * @param param 修改参数
+     */
+    void updateCoupon(Long id, CouponModifyParam param);
+
+    /**
+     * 获取优惠券信息
+     *
+     * @param id 优惠券主键
+     * @return 优惠券信息
+     */
+    CouponDTO getCoupon(Long id);
+
+    /**
+     * 查询优惠券信息
+     *
+     * @param param 查询参数
+     * @return 优惠券分页信息
+     */
+    Pagination<CouponDTO> getCouponPaging(CouponPagingParam param);
+
+    /**
+     * 查询优惠券信息
+     *
+     * @param merchantId 商家ID
+     * @param param 分页参数
+     * @return 优惠券分页信息
+     */
+    Pagination<CouponDTO> getMerchantCouponPaging(Long merchantId, CouponPagingParam param);
+}

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

@@ -0,0 +1,58 @@
+package com.chelvc.cloud.vehicle.api.service;
+
+
+import com.chelvc.cloud.vehicle.api.dto.UserCouponDTO;
+import com.chelvc.cloud.vehicle.api.param.UserCouponModifyParam;
+import com.chelvc.cloud.vehicle.api.param.UserCouponPagingParam;
+import com.chelvc.cloud.vehicle.api.param.UserCouponQueryParam;
+import com.chelvc.framework.common.model.Pagination;
+
+import java.util.List;
+
+/**
+ * 优惠券领取记录业务接口
+ *
+ * @author 七仔
+ * @date 2023/3/29 21:59
+ */
+public interface UserCouponService {
+    /**
+     * 查询用户优惠券
+     *
+     * @param param 查询参数
+     * @return 用户优惠券信息列表
+     */
+    List<UserCouponDTO> listUserCoupons(UserCouponQueryParam param);
+
+    /**
+     * 新增优惠券领取记录
+     *
+     * @param param 新增参数
+     * @return 优惠券领取记录主键
+     */
+    Long addUserCoupon(UserCouponModifyParam param);
+
+    /**
+     * 修改优惠券领取记录
+     *
+     * @param id    优惠券领取记录主键
+     * @param param 修改参数
+     */
+    void updateUserCoupon(Long id, UserCouponModifyParam param);
+
+    /**
+     * 获取优惠券领取记录
+     *
+     * @param id 优惠券领取记录主键
+     * @return 优惠券领取记录
+     */
+    UserCouponDTO getUserCoupon(Long id);
+
+    /**
+     * 查询优惠券领取记录
+     *
+     * @param param 查询参数
+     * @return 优惠券领取记录分页信息
+     */
+    Pagination<UserCouponDTO> getUserCouponPaging(UserCouponPagingParam param);
+}

+ 47 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/copier/CouponCopier.java

@@ -0,0 +1,47 @@
+package com.chelvc.cloud.vehicle.server.copier;
+
+import com.chelvc.cloud.vehicle.api.dto.CouponDTO;
+import com.chelvc.cloud.vehicle.api.param.CouponModifyParam;
+import com.chelvc.cloud.vehicle.server.entity.Coupon;
+import org.mapstruct.Builder;
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingTarget;
+import org.mapstruct.factory.Mappers;
+
+/**
+ * 优惠券对象拷贝接口
+ *
+ * @author qizai
+ * @date 2023/9/8
+ */
+@Mapper(builder = @Builder(disableBuilder = true))
+public interface CouponCopier {
+    /**
+     * 对象拷贝接口实例
+     */
+    CouponCopier INSTANCE = Mappers.getMapper(CouponCopier.class);
+
+    /**
+     * 优惠券信息拷贝
+     *
+     * @param coupon 优惠券信息
+     * @return 优惠券信息
+     */
+    CouponDTO copying(Coupon coupon);
+
+    /**
+     * 优惠券信息拷贝
+     *
+     * @param param 优惠券更新参数
+     * @return 优惠券信息
+     */
+    Coupon copying(CouponModifyParam param);
+
+    /**
+     * 优惠券信息拷贝
+     *
+     * @param param  优惠券更新参数
+     * @param coupon 优惠券信息
+     */
+    void copying(CouponModifyParam param, @MappingTarget Coupon coupon);
+}

+ 67 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/copier/UserCouponCopier.java

@@ -0,0 +1,67 @@
+package com.chelvc.cloud.vehicle.server.copier;
+
+import com.chelvc.cloud.vehicle.api.dto.CouponDTO;
+import com.chelvc.cloud.vehicle.api.dto.UserCouponDTO;
+import com.chelvc.cloud.vehicle.api.param.UserCouponModifyParam;
+import com.chelvc.cloud.vehicle.server.entity.Coupon;
+import com.chelvc.cloud.vehicle.server.entity.UserCoupon;
+import org.mapstruct.Builder;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.MappingTarget;
+import org.mapstruct.factory.Mappers;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 优惠券领取对象拷贝接口
+ *
+ * @author qizai
+ * @date 2023/9/8
+ */
+@Mapper(builder = @Builder(disableBuilder = true))
+public interface UserCouponCopier {
+    /**
+     * 对象拷贝接口实例
+     */
+    UserCouponCopier INSTANCE = Mappers.getMapper(UserCouponCopier.class);
+
+    /**
+     * 优惠券领取信息拷贝
+     *
+     * @param userCoupon 优惠券领取信息
+     * @return 优惠券领取信息
+     */
+    UserCouponDTO copying(UserCoupon userCoupon);
+
+    /**
+     * 优惠券领取信息拷贝
+     *
+     * @param param 优惠券领取信息更新参数
+     * @return 优惠券领取信息
+     */
+    UserCoupon copying(UserCouponModifyParam param);
+
+    /**
+     * 优惠券领取信息拷贝
+     *
+     * @param param  优惠券领取信息更新参数
+     * @param userCoupon 优惠券领取信息
+     */
+    void copying(UserCouponModifyParam param, @MappingTarget UserCoupon userCoupon);
+
+    /**
+     * 优惠券领取信息拷贝
+     *
+     * @param coupons 优惠券领取信息集合
+     * @return 优惠券领取信息列表
+     */
+    List<UserCouponDTO> copying(Collection<UserCoupon> coupons);
+
+    @Mapping(source = "userCoupon.id", target = "id")
+    @Mapping(source = "userCoupon.type", target = "type")
+    @Mapping(source = "coupon", target = "couponDTO")
+    UserCouponDTO copying(UserCoupon userCoupon, Coupon coupon);
+}

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

@@ -1,8 +1,12 @@
 package com.chelvc.cloud.vehicle.server.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.chelvc.cloud.vehicle.api.param.UserCouponQueryParam;
 import com.chelvc.cloud.vehicle.server.entity.UserCoupon;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 优惠券领取数据操作接口
@@ -12,4 +16,20 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface UserCouponMapper extends BaseMapper<UserCoupon> {
+
+    /**
+     * 查询已过期的用户优惠券
+     *
+     * @param param 查询参数
+     * @return 用户优惠券信息列表
+     */
+    List<UserCoupon> listExpiredUserCoupons(@Param("userId") Long userId, @Param("param") UserCouponQueryParam param);
+
+    /**
+     * 查询用户优惠券
+     *
+     * @param param 查询参数
+     * @return 用户优惠券信息列表
+     */
+    List<UserCoupon> listUserCoupons(@Param("userId") Long userId, @Param("param") UserCouponQueryParam param);
 }

+ 5 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/UserCoupon.java

@@ -49,4 +49,9 @@ public class UserCoupon extends ModifyEntity<Long> {
      * 是否已使用
      */
     private Boolean used;
+
+    /**
+     * 优惠券
+     */
+    private Coupon coupon;
 }

+ 79 - 1
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/CouponServiceImpl.java

@@ -2,14 +2,26 @@ package com.chelvc.cloud.vehicle.server.service.impl;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.chelvc.cloud.vehicle.api.dto.CouponDTO;
+import com.chelvc.cloud.vehicle.api.param.CouponModifyParam;
+import com.chelvc.cloud.vehicle.api.param.CouponPagingParam;
+import com.chelvc.cloud.vehicle.server.copier.CouponCopier;
 import com.chelvc.cloud.vehicle.server.dao.CouponMapper;
 import com.chelvc.cloud.vehicle.server.entity.Coupon;
 import com.chelvc.cloud.vehicle.server.service.CouponService;
+import com.chelvc.framework.base.util.ResourceUtils;
+import com.chelvc.framework.common.model.Pagination;
+import com.chelvc.framework.database.context.DatabaseContextHolder;
+import com.chelvc.framework.database.util.PagingUtils;
 import lombok.NonNull;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 /**
  * 优惠券业务操作实现
@@ -18,9 +30,75 @@ import org.springframework.stereotype.Service;
  * @date 2023/7/17
  */
 @Service
-public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> implements CouponService {
+public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> implements CouponService,
+        com.chelvc.cloud.vehicle.api.service.CouponService {
     @Override
     public List<CouponDTO> listUserGoodsActiveCoupons(@NonNull Long userId, Collection<Long> goodsCouponIds) {
         return this.baseMapper.listUserGoodsActiveCoupons(userId, goodsCouponIds);
     }
+
+    @Override
+    public Long addCoupon(@NonNull CouponModifyParam param) {
+        Coupon coupon = CouponCopier.INSTANCE.copying(param);
+        this.save(coupon);
+        return coupon.getId();
+    }
+
+    @Override
+    public void updateCoupon(@NonNull Long id, @NonNull CouponModifyParam param) {
+        Coupon coupon = ResourceUtils.required(this.getById(id), "优惠券不存在");
+        CouponCopier.INSTANCE.copying(param, coupon);
+        this.updateById(coupon);
+    }
+
+    @Override
+    public CouponDTO getCoupon(@NonNull Long id) {
+        Coupon coupon = ResourceUtils.required(this.getById(id), "优惠券不存在");
+        return this.convert(coupon);
+    }
+
+    @Override
+    public Pagination<CouponDTO> getCouponPaging(@NonNull CouponPagingParam param) {
+        // 查询优惠券列表
+        Page<Coupon> page = this.lambdaQuery()
+                .eq(Objects.nonNull(param.getMerchantId()), Coupon::getMerchantId, param.getMerchantId())
+                .eq(Objects.nonNull(param.getCouponType()), Coupon::getType, param.getCouponType().name())
+                .eq(Objects.nonNull(param.getCouponStatus()), Coupon::getStatus, param.getCouponStatus().name())
+                .or().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)) {
+            return Pagination.empty();
+        }
+
+        // 构建优惠券信息
+        List<CouponDTO> clients = records.stream().map(this::convert).collect(Collectors.toList());
+        return PagingUtils.convert(page, clients);
+    }
+
+    @Override
+    public Pagination<CouponDTO> getMerchantCouponPaging(@NonNull Long merchantId, @NonNull CouponPagingParam param) {
+        // 查询优惠券列表
+        Page<Coupon> page = this.lambdaQuery()
+                .eq(Coupon::getMerchantId, merchantId)
+                .orderByDesc(Coupon::getCreateTime).page(PagingUtils.convert(param.getPaging()));
+        List<Coupon> records = page.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            return Pagination.empty();
+        }
+
+        // 构建优惠券信息
+        List<CouponDTO> clients = records.stream().map(this::convert).collect(Collectors.toList());
+        return PagingUtils.convert(page, clients);
+    }
+
+    /**
+     * 转换优惠券信息
+     *
+     * @param coupon 优惠券实例
+     * @return 优惠券信息
+     */
+    private CouponDTO convert(Coupon coupon) {
+        return CouponCopier.INSTANCE.copying(coupon);
+    }
 }

+ 97 - 3
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/UserCouponServiceImpl.java

@@ -1,10 +1,30 @@
 package com.chelvc.cloud.vehicle.server.service.impl;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.chelvc.cloud.vehicle.api.constant.UserCouponStatus;
+import com.chelvc.cloud.vehicle.api.dto.UserCouponDTO;
+import com.chelvc.cloud.vehicle.api.param.UserCouponModifyParam;
+import com.chelvc.cloud.vehicle.api.param.UserCouponPagingParam;
+import com.chelvc.cloud.vehicle.api.param.UserCouponQueryParam;
+import com.chelvc.cloud.vehicle.server.copier.UserCouponCopier;
 import com.chelvc.cloud.vehicle.server.dao.UserCouponMapper;
 import com.chelvc.cloud.vehicle.server.entity.UserCoupon;
 import com.chelvc.cloud.vehicle.server.service.UserCouponService;
-import org.springframework.stereotype.Service;
+import com.chelvc.framework.base.context.SessionContextHolder;
+import com.chelvc.framework.base.util.ResourceUtils;
+import com.chelvc.framework.common.model.Pagination;
+import com.chelvc.framework.database.util.PagingUtils;
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * 优惠券领取业务操作实现
@@ -12,6 +32,80 @@ import org.springframework.stereotype.Service;
  * @author Woody
  * @date 2023/7/17
  */
-@Service
-public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCoupon> implements UserCouponService {
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+@DubboService(interfaceClass = com.chelvc.cloud.vehicle.api.service.UserCouponService.class)
+public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCoupon> implements UserCouponService,
+        com.chelvc.cloud.vehicle.api.service.UserCouponService {
+
+    @Override
+    public List<UserCouponDTO> listUserCoupons(@NonNull UserCouponQueryParam param) {
+        Long userId = SessionContextHolder.getId();
+        // 查询过期的优惠券
+        if (UserCouponStatus.EXPIRED.equals(param.getStatus())) {
+            List<UserCoupon> userCoupons = this.baseMapper.listExpiredUserCoupons(userId, param);
+            if (CollectionUtils.isEmpty(userCoupons)) {
+                return Collections.emptyList();
+            }
+            return userCoupons
+                    .stream()
+                    .map(o -> UserCouponCopier.INSTANCE.copying(o, o.getCoupon()))
+                    .collect(Collectors.toList());
+        }
+        // 查询未使用或已使用的优惠券
+        List<UserCoupon> userCoupons = this.baseMapper.listUserCoupons(userId, param);
+        if (CollectionUtils.isEmpty(userCoupons)) {
+            return Collections.emptyList();
+        }
+        return userCoupons
+                .stream()
+                .map(o -> UserCouponCopier.INSTANCE.copying(o, o.getCoupon()))
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public Long addUserCoupon(@NonNull UserCouponModifyParam param) {
+        UserCoupon userCoupon = UserCouponCopier.INSTANCE.copying(param);
+        this.save(userCoupon);
+        return userCoupon.getId();
+    }
+
+    @Override
+    public void updateUserCoupon(@NonNull Long id, @NonNull UserCouponModifyParam param) {
+        UserCoupon userCoupon = ResourceUtils.required(this.getById(id), "优惠券领取记录不存在");
+        UserCouponCopier.INSTANCE.copying(param, userCoupon);
+        this.updateById(userCoupon);
+    }
+
+    @Override
+    public UserCouponDTO getUserCoupon(@NonNull Long id) {
+        return this.convert(this.getById(id));
+    }
+
+    @Override
+    public Pagination<UserCouponDTO> getUserCouponPaging(@NonNull UserCouponPagingParam param) {
+        // 查询优惠券领取记录列表
+        Page<UserCoupon> page = this.lambdaQuery()
+                .eq(Objects.nonNull(param.getType()), UserCoupon::getType, param.getType().name())
+                .eq(UserCouponStatus.USED.equals(param.getStatus()), UserCoupon::getUsed, 1)
+                .eq(UserCouponStatus.UNUSED.equals(param.getStatus()), UserCoupon::getUsed, 0)
+                .orderByDesc(UserCoupon::getId).page(PagingUtils.convert(param.getPaging()));
+        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);
+    }
+
+    /**
+     * 转换优惠券领取记录信息
+     *
+     * @param userCoupon 优惠券领取记录实例
+     * @return 优惠券领取记录信息
+     */
+    private UserCouponDTO convert(UserCoupon userCoupon) {
+        return UserCouponCopier.INSTANCE.copying(userCoupon);
+    }
 }

+ 56 - 0
vehicle-server/src/main/resources/mapper/UserCouponMapper.xml

@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.chelvc.cloud.vehicle.server.dao.UserCouponMapper">
+
+    <resultMap id="USERCOUPON_RESULT_MAP" type="com.chelvc.cloud.vehicle.server.entity.UserCoupon">
+        <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="type" property="type" jdbcType="VARCHAR"/>
+        <result column="used" property="used" jdbcType="TINYINT"/>
+        <result column="creator" property="creator" jdbcType="BIGINT"/>
+        <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
+        <result column="updater" property="updater" jdbcType="BIGINT"/>
+        <result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/>
+        <association property="coupon" javaType="com.chelvc.cloud.vehicle.server.entity.Coupon">
+            <id column="id" property="id" jdbcType="BIGINT"/>
+            <result column="merchant_id" property="merchantId" jdbcType="BIGINT"/>
+            <result column="name" property="name" jdbcType="VARCHAR"/>
+            <result column="amount" property="amount" jdbcType="DOUBLE"/>
+            <result column="reduce" property="reduce" jdbcType="DOUBLE"/>
+            <result column="discount" property="discount" jdbcType="DOUBLE"/>
+            <result column="expiration" property="expiration" jdbcType="TIMESTAMP"/>
+            <result column="description" property="description" jdbcType="VARCHAR"/>
+        </association>
+    </resultMap>
+
+    <select id="listExpiredUserCoupons" resultMap="USERCOUPON_RESULT_MAP">
+        select u.id,u.coupon_id,c.name,c.amount,c.reduce,c.discount,c.description,c.expiration,
+        c.merchant_id
+        from user_coupon u
+        inner join coupon c on u.coupon_id = c.id
+        where u.user_id = #{userId}
+        <if test="param.offset != null">
+            and u.id > #{param.offset}
+        </if>
+        and u.type = #{param.type}
+        and u.used = 0 and c.expiration is not null and CURRENT_TIME > c.expiration
+        order by u.create_time desc
+        limit #{param.size}
+    </select>
+
+    <select id="listUserCoupons" resultMap="USERCOUPON_RESULT_MAP">
+        select u.id,u.coupon_id,c.name,c.amount,c.reduce,c.discount,c.description,c.expiration,
+        c.merchant_id
+        from user_coupon u
+        inner join coupon c on u.coupon_id = c.id
+        where u.user_id = #{userId}
+        <if test="param.offset != null">
+            and u.id > #{param.offset}
+        </if>
+        and u.type = #{param.type}
+        and u.used = #{param.status}
+        order by u.create_time desc
+        limit #{param.size}
+    </select>
+</mapper>