Procházet zdrojové kódy

Merge branch 'V1.0.1'

woody před 1 rokem
rodič
revize
5afd8fd58e
55 změnil soubory, kde provedl 1987 přidání a 42 odebrání
  1. 32 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/constant/CouponClaimType.java
  2. 0 1
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/constant/FavoriteType.java
  3. 50 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/constant/OrderStatus.java
  4. 39 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/constant/PromotionStatus.java
  5. 42 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/constant/UserCouponStatus.java
  6. 9 2
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/FavoriteDTO.java
  7. 0 9
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/GoodsDTO.java
  8. 57 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/ReservationDTO.java
  9. 52 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/UserCouponDTO.java
  10. 86 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/CouponModifyParam.java
  11. 58 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/CouponPagingParam.java
  12. 38 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/FavoritePagingParam.java
  13. 48 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/FavoriteQueryParam.java
  14. 94 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/GoodsModifyParam.java
  15. 4 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/GoodsPagingParam.java
  16. 45 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/OrderQueryParam.java
  17. 44 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/ReservationQueryParam.java
  18. 52 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/UserCouponModifyParam.java
  19. 49 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/UserCouponPagingParam.java
  20. 69 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/UserCouponQueryParam.java
  21. 8 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/CategoryService.java
  22. 62 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/CouponService.java
  23. 24 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/FavoriteService.java
  24. 34 3
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/GoodsService.java
  25. 7 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/MerchantService.java
  26. 12 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/ReservationService.java
  27. 74 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/UserCouponService.java
  28. 19 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/util/PromotionUtils.java
  29. 47 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/copier/CouponCopier.java
  30. 3 3
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/copier/FavoriteCopier.java
  31. 34 1
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/copier/GoodsCopier.java
  32. 11 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/copier/ReservationCopier.java
  33. 67 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/copier/UserCouponCopier.java
  34. 10 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/CouponMapper.java
  35. 15 1
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/FavoriteMapper.java
  36. 12 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/ReservationMapper.java
  37. 28 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/UserCouponMapper.java
  38. 34 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/Coupon.java
  39. 12 3
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/Favorite.java
  40. 9 1
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/Reservation.java
  41. 8 1
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/UserCoupon.java
  42. 8 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/CouponService.java
  43. 6 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/CategoryServiceImpl.java
  44. 103 2
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/CouponServiceImpl.java
  45. 43 6
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/FavoriteServiceImpl.java
  46. 44 2
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/GoodsServiceImpl.java
  47. 11 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/MerchantServiceImpl.java
  48. 24 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/ReservationServiceImpl.java
  49. 160 3
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/UserCouponServiceImpl.java
  50. 24 0
      vehicle-server/src/main/resources/application-qizai.yml
  51. 1 1
      vehicle-server/src/main/resources/application.yml
  52. 8 0
      vehicle-server/src/main/resources/mapper/CouponMapper.xml
  53. 36 3
      vehicle-server/src/main/resources/mapper/FavoriteMapper.xml
  54. 42 0
      vehicle-server/src/main/resources/mapper/ReservationMapper.xml
  55. 79 0
      vehicle-server/src/main/resources/mapper/UserCouponMapper.xml

+ 32 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/constant/CouponClaimType.java

@@ -0,0 +1,32 @@
+package com.chelvc.cloud.vehicle.api.constant;
+
+import com.chelvc.framework.common.model.Enumeration;
+import lombok.Getter;
+
+/**
+ * 优惠券获取方式枚举
+ *
+ * @author qizai
+ * @date 2023/9/10
+ */
+@Getter
+public enum CouponClaimType implements Enumeration {
+    /**
+     * 免费领取
+     */
+    FREE("免费领取"),
+
+    /**
+     * 活动领取
+     */
+    ACTIVITY("活动领取");
+
+    /**
+     * 类型描述
+     */
+    private final String description;
+
+    CouponClaimType(String description) {
+        this.description = description;
+    }
+}

+ 0 - 1
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/constant/FavoriteType.java

@@ -15,7 +15,6 @@ public enum FavoriteType implements Enumeration {
      * 商家
      */
     MERCHANT("商家");
-
     /**
      * 类型描述
      */

+ 50 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/constant/OrderStatus.java

@@ -0,0 +1,50 @@
+package com.chelvc.cloud.vehicle.api.constant;
+
+import com.chelvc.framework.common.model.Enumeration;
+
+/**
+ * 订单状态枚举
+ *
+ * @author qizai
+ * @date 2023/10/19
+ */
+public enum OrderStatus implements Enumeration {
+    /**
+     * 所有订单
+     */
+    ALL("全部"),
+
+    /**
+     * 待付款
+     */
+    WAIT_PAY("待付款"),
+
+    /**
+     * 待使用
+     */
+    WAIT_USE("待使用"),
+
+    /**
+     * 待评价
+     */
+    WAIT_EVALUATE("待评价"),
+
+    /**
+     * 已完成
+     */
+    COMPLETE("已完成"),
+
+    /**
+     * 已取消
+     */
+    CANCELLED("已取消");
+
+    /**
+     * 状态描述
+     */
+    private final String description;
+
+    OrderStatus(String description) {
+        this.description = description;
+    }
+}

+ 39 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/constant/PromotionStatus.java

@@ -0,0 +1,39 @@
+package com.chelvc.cloud.vehicle.api.constant;
+
+import com.chelvc.framework.common.model.Enumeration;
+import lombok.Getter;
+
+/**
+ * 促销状态枚举
+ *
+ * @author qizai
+ * @date 2023/9/10
+ */
+@Getter
+public enum PromotionStatus implements Enumeration {
+    /**
+     * 新建
+     */
+    NEW("新建"),
+    /**
+     * 开始
+     */
+    START("开始"),
+    /**
+     * 结束
+     */
+    END("结束"),
+    /**
+     * 关闭
+     */
+    CLOSE("关闭");
+
+    /**
+     * 状态描述
+     */
+    private final String description;
+
+    PromotionStatus(String description) {
+        this.description = description;
+    }
+}

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

@@ -0,0 +1,42 @@
+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("已过期"),
+
+    /**
+     * 作废
+     */
+    CLOSED("作废");
+
+    /**
+     * 状态描述
+     */
+    private final String description;
+
+    UserCouponStatus(String description) {
+        this.description = description;
+    }
+}

+ 9 - 2
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/FavoriteDTO.java

@@ -1,14 +1,16 @@
 package com.chelvc.cloud.vehicle.api.dto;
+
 import com.chelvc.cloud.vehicle.api.constant.FavoriteType;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.SuperBuilder;
 
+import java.io.Serializable;
 import java.util.Date;
 
 /**
- * 用户收藏数据模型
+ * 用户收藏信息
  *
  * @author liude
  * @date 2023/7/19
@@ -17,7 +19,7 @@ import java.util.Date;
 @SuperBuilder
 @NoArgsConstructor
 @AllArgsConstructor
-public class FavoriteDTO{
+public class FavoriteDTO implements Serializable {
     /**
      * 主键
      */
@@ -42,4 +44,9 @@ public class FavoriteDTO{
      * 创建时间
      */
     private Date createTime;
+
+    /**
+     * 商家信息
+     */
+    private MerchantDTO merchant;
 }

+ 0 - 9
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/GoodsDTO.java

@@ -93,13 +93,4 @@ public class GoodsDTO implements Serializable {
      */
     private GoodsStatus status;
 
-    /**
-     * 创建用户
-     */
-    private Long creator;
-
-    /**
-     * 创建时间
-     */
-    private Date createTime;
 }

+ 57 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/ReservationDTO.java

@@ -0,0 +1,57 @@
+package com.chelvc.cloud.vehicle.api.dto;
+
+import com.chelvc.cloud.vehicle.api.constant.ReserveStatus;
+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/9
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ReservationDTO implements Serializable {
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 商家ID
+     */
+    private Long merchantId;
+
+    /**
+     * 联系电话
+     */
+    private String mobile;
+
+    /**
+     * 约定时间
+     */
+    private Date appointTime;
+
+    /**
+     * 预约状态
+     */
+    private ReserveStatus status;
+
+    /**
+     * 商家信息
+     */
+    private MerchantDTO merchant;
+}

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

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

@@ -0,0 +1,58 @@
+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.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;
+
+    /**
+     * 优惠券类型
+     */
+    private CouponType couponType;
+
+    /**
+     * 优惠券状态
+     */
+    private CouponStatus couponStatus;
+
+    /**
+     * 优惠券领取方式
+     */
+    private CouponClaimType couponClaimType;
+
+    /**
+     * 商家ID
+     */
+    private Long merchantId;
+}

+ 38 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/FavoritePagingParam.java

@@ -0,0 +1,38 @@
+package com.chelvc.cloud.vehicle.api.param;
+
+import com.chelvc.cloud.vehicle.api.constant.FavoriteType;
+import com.chelvc.framework.common.model.Paging;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 收藏分页参数
+ *
+ * @author 七仔
+ * @date 2023/9/4
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+public class FavoritePagingParam extends LocationQueryParam {
+    /**
+     * 分页信息
+     */
+    @NotNull(message = "分页不能为空")
+    private Paging paging;
+
+    /**
+     * 收藏类型
+     */
+    @NotNull(message = "收藏类型不能为空")
+    private FavoriteType type;
+}

+ 48 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/FavoriteQueryParam.java

@@ -0,0 +1,48 @@
+package com.chelvc.cloud.vehicle.api.param;
+
+import com.chelvc.cloud.vehicle.api.constant.FavoriteType;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 收藏记录查询参数
+ *
+ * @author qizai
+ * @date 2023/9/9
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+public class FavoriteQueryParam extends LocationQueryParam {
+
+    /**
+     * 偏移收藏记录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 FavoriteType type;
+}

+ 94 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/GoodsModifyParam.java

@@ -0,0 +1,94 @@
+package com.chelvc.cloud.vehicle.api.param;
+import com.chelvc.cloud.vehicle.api.constant.CategoryType;
+import com.chelvc.cloud.vehicle.api.constant.GoodsStatus;
+import com.chelvc.framework.common.model.File;
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.Size;
+import java.util.List;
+
+/**
+ * 商品数据模型
+ *
+ * @author liude
+ * @date 2023/8/30
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString(callSuper = true)
+public class GoodsModifyParam {
+
+    /**
+     * 分类类型
+     */
+    @NotEmpty(message = "分类类型不能为空")
+    @Size(max = 100, message = "分类类型长度不能大于50")
+    private CategoryType type;
+
+    /**
+     * 分类ID
+     */
+    @NotEmpty(message = "分类ID不能为空")
+    @Size(max = 100, message = "分类ID长度不能大于20")
+    private Long categoryId;
+
+    /**
+     * 商家ID
+     */
+    @NotEmpty(message = "商家ID不能为空")
+    private Long merchantId;
+
+    /**
+     * 商品名称
+     */
+    @NotEmpty(message = "商品名称不能为空")
+    @Size(max = 100, message = "商品名称长度不能大于100")
+    private String name;
+
+    /**
+     * 商品Logo
+     */
+    @Size(max = 200, message = "商品Logo长度不能大于200")
+    private String logo;
+
+    /**
+     * 轮播图列表
+     */
+    private List<File> banners;
+
+    /**
+     * 商品描述
+     */
+    @NotEmpty(message = "商品描述不能为空")
+    @Size(max = 100, message = "商品描述长度不能大于500")
+    private String description;
+
+    /**
+     * 商品原价
+     */
+    @NotEmpty(message = "商品原价不能为空")
+    @Size(max = 100, message = "商品原价长度不能大于10")
+    private Double originalPrice;
+
+    /**
+     * 优惠价格
+     */
+    @NotEmpty(message = "优惠价格不能为空")
+    @Size(max = 100, message = "优惠价格长度不能大于10")
+    private Double specialPrice;
+
+    /**
+     * 优惠券ID列表
+     */
+    private List<Long> couponIds;
+
+    /**
+     * 商品状态
+     */
+    @NotEmpty(message = "商品状态不能为空")
+    private GoodsStatus status;
+}

+ 4 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/GoodsPagingParam.java

@@ -34,6 +34,10 @@ public class GoodsPagingParam implements Serializable {
     @Size(max = 100, message = "商品名称长度不能大于100")
     private String name;
 
+    /**
+     * 分类ID
+     */
+    private Long categoryId;
     /**
      * 商品状态
      */

+ 45 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/OrderQueryParam.java

@@ -0,0 +1,45 @@
+package com.chelvc.cloud.vehicle.api.param;
+
+import com.chelvc.cloud.vehicle.api.constant.OrderStatus;
+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/10/19
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class OrderQueryParam 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 OrderStatus orderStatus;
+}

+ 44 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/ReservationQueryParam.java

@@ -0,0 +1,44 @@
+package com.chelvc.cloud.vehicle.api.param;
+
+import com.chelvc.cloud.vehicle.api.constant.ReserveStatus;
+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/9
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ReservationQueryParam 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;
+
+    /**
+     * 预约状态
+     */
+    private ReserveStatus status;
+}

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

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

@@ -0,0 +1,69 @@
+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;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 用户优惠券查询参数
+ *
+ * @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;
+
+    /**
+     * 总金额(元)
+     */
+    private BigDecimal totalAmount;
+
+    /**
+     * 商家ID列表
+     */
+    private List<String> merchantIds;
+
+    /**
+     * 商家ID,如有多个','分割
+     */
+    private String merchantId;
+}

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

@@ -52,4 +52,12 @@ public interface CategoryService {
      * @return 分类信息列表
      */
     List<CategoryDTO> listRecommendCategories(int size);
+
+
+    /**
+     * 删除分类
+     *
+     * @param id    分类主键
+     */
+    void deleteCategory(Long id);
 }

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

@@ -0,0 +1,62 @@
+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    商品优惠券主键
+     */
+    void deleteCoupon(Long id);
+
+    /**
+     * 获取优惠券信息
+     *
+     * @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);
+}

+ 24 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/FavoriteService.java

@@ -1,5 +1,13 @@
 package com.chelvc.cloud.vehicle.api.service;
 
+import com.chelvc.cloud.vehicle.api.dto.FavoriteDTO;
+import com.chelvc.cloud.vehicle.api.dto.MerchantDTO;
+import com.chelvc.cloud.vehicle.api.param.FavoritePagingParam;
+import com.chelvc.cloud.vehicle.api.param.FavoriteQueryParam;
+import com.chelvc.framework.common.model.Pagination;
+
+import java.util.List;
+
 /**
  * 商品收藏接口
  *
@@ -21,4 +29,20 @@ public interface FavoriteService {
      * @param id 收藏ID
      */
     void deleteMineFavorite(Long id);
+
+    /**
+     * 查询收藏列表
+     *
+     * @param param 查询参数
+     * @return 收藏店铺分页信息
+     */
+    Pagination<MerchantDTO> getFavoriteMerchantPaging(FavoritePagingParam param);
+
+    /**
+     * 查询用户收藏店铺列表
+     *
+     * @param param 查询参数
+     * @return 用户收藏店铺列表
+     */
+    List<FavoriteDTO> listFavoriteMerchants(FavoriteQueryParam param);
 }

+ 34 - 3
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/GoodsService.java

@@ -1,10 +1,9 @@
 package com.chelvc.cloud.vehicle.api.service;
-
 import java.util.List;
-
 import com.chelvc.cloud.vehicle.api.dto.GoodsDTO;
 import com.chelvc.cloud.vehicle.api.dto.GoodsDetailDTO;
-import com.chelvc.cloud.vehicle.api.param.GoodsQueryParam;
+import com.chelvc.cloud.vehicle.api.param.*;
+import com.chelvc.framework.common.model.Pagination;
 
 /**
  * 商品业务接口
@@ -29,4 +28,36 @@ public interface GoodsService {
      * @return 商品列表
      */
     List<GoodsDTO> listMerchantSimpleGoods(Long merchantId, GoodsQueryParam param);
+
+
+    /**
+     * 新增商品
+     *
+     * @param param 新增参数
+     * @return 商品主键
+     */
+    Long addGoods(GoodsModifyParam param);
+
+    /**
+     * 修改商品
+     *
+     * @param id    商品主键
+     * @param param 修改参数
+     */
+    void updateGoods(Long id, GoodsModifyParam param);
+
+    /**
+     * 删除商品
+     *
+     * @param id    商品主键
+     */
+    void deleteGoods(Long id);
+
+    /**
+     * 查询商品
+     *
+     * @param param 查询参数
+     * @return 商品分页信息
+     */
+    Pagination<GoodsDTO> getGoodsPaging(GoodsPagingParam param);
 }

+ 7 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/MerchantService.java

@@ -76,6 +76,13 @@ public interface MerchantService {
      */
     void updateMerchant(Long id, MerchantModifyParam param);
 
+    /**
+     * 删除商家
+     *
+     * @param id    分类主键
+     */
+    void deleteMerchant(Long id);
+
     /**
      * 查询商家
      *

+ 12 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/ReservationService.java

@@ -1,6 +1,10 @@
 package com.chelvc.cloud.vehicle.api.service;
 
+import com.chelvc.cloud.vehicle.api.dto.ReservationDTO;
 import com.chelvc.cloud.vehicle.api.param.ReservationModifyParam;
+import com.chelvc.cloud.vehicle.api.param.ReservationQueryParam;
+
+import java.util.List;
 
 /**
  * 预约业务接口
@@ -16,4 +20,12 @@ public interface ReservationService {
      * @param param      预约参数
      */
     void addReservation(Long merchantId, ReservationModifyParam param);
+
+    /**
+     * 查询用户预约列表
+     *
+     * @param param 查询参数
+     * @return 用户预约列表
+     */
+    List<ReservationDTO> listUserReservations(ReservationQueryParam param);
 }

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

@@ -0,0 +1,74 @@
+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 用户可用优惠券信息列表
+     */
+    List<UserCouponDTO> listUserCanUseCoupons(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);
+
+    /**
+     * 领取优惠券
+     *
+     * @param couponId 优惠券ID
+     * @return 优惠券领取记录主键
+     */
+    Long claimCoupon(Long couponId);
+}

+ 19 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/util/PromotionUtils.java

@@ -0,0 +1,19 @@
+package com.chelvc.cloud.vehicle.api.util;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 优惠活动通用验证类
+ *
+ * @author qizai
+ * @date 2023/10/16
+ */
+@Slf4j
+public class PromotionUtils {
+
+    public static final String START_TIME_COLUMN = "start_time";
+    public static final String END_TIME_COLUMN = "end_time";
+    public static final String PLATFORM_ID = "0";
+    public static final String PLATFORM_NAME = "platform";
+
+}

+ 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);
+}

+ 3 - 3
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/copier/FavoriteCopier.java

@@ -1,8 +1,5 @@
 package com.chelvc.cloud.vehicle.server.copier;
 
-import java.util.Collection;
-import java.util.List;
-
 import com.chelvc.cloud.vehicle.api.dto.FavoriteDTO;
 import com.chelvc.cloud.vehicle.server.entity.Favorite;
 import org.mapstruct.Builder;
@@ -11,6 +8,9 @@ import org.mapstruct.Mapper;
 import org.mapstruct.Named;
 import org.mapstruct.factory.Mappers;
 
+import java.util.Collection;
+import java.util.List;
+
 /**
  * 收藏信息拷贝接口
  *

+ 34 - 1
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/copier/GoodsCopier.java

@@ -1,11 +1,19 @@
 package com.chelvc.cloud.vehicle.server.copier;
 
+import com.chelvc.cloud.vehicle.api.dto.CouponDTO;
 import com.chelvc.cloud.vehicle.api.dto.GoodsDTO;
+import com.chelvc.cloud.vehicle.api.param.CouponModifyParam;
+import com.chelvc.cloud.vehicle.api.param.GoodsModifyParam;
+import com.chelvc.cloud.vehicle.server.entity.Coupon;
 import com.chelvc.cloud.vehicle.server.entity.Goods;
 import org.mapstruct.Builder;
 import org.mapstruct.Mapper;
+import org.mapstruct.MappingTarget;
 import org.mapstruct.factory.Mappers;
 
+import java.util.Collection;
+import java.util.List;
+
 /**
  * 商品信息拷贝接口
  *
@@ -22,8 +30,33 @@ public interface GoodsCopier {
     /**
      * 商品信息拷贝
      *
-     * @param detail 商品详情
+     * @param goods 商品详情
      * @return 商品信息
      */
     GoodsDTO copying(Goods goods);
+
+
+    /**
+     * 商品信息拷贝
+     *
+     * @param goods 商品信息集合
+     * @return 商品信息列表
+     */
+    List<GoodsDTO> copying(Collection<Goods> goods);
+
+    /**
+     * 商品信息拷贝
+     *
+     * @param param 商品更新参数
+     * @return 商品信息
+     */
+    Goods copying(GoodsModifyParam param);
+
+    /**
+     * 商品信息拷贝
+     *
+     * @param param    商品更新参数
+     * @param  goods 商品信息
+     */
+    void copying( GoodsModifyParam param, @MappingTarget Goods goods);
 }

+ 11 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/copier/ReservationCopier.java

@@ -1,9 +1,11 @@
 package com.chelvc.cloud.vehicle.server.copier;
 
+import com.chelvc.cloud.vehicle.api.dto.ReservationDTO;
 import com.chelvc.cloud.vehicle.api.param.ReservationModifyParam;
 import com.chelvc.cloud.vehicle.server.entity.Reservation;
 import org.mapstruct.Builder;
 import org.mapstruct.Mapper;
+import org.mapstruct.Named;
 import org.mapstruct.factory.Mappers;
 
 /**
@@ -26,4 +28,13 @@ public interface ReservationCopier {
      * @return 预约信息
      */
     Reservation copying(ReservationModifyParam param);
+
+    /**
+     * 预约信息拷贝
+     *
+     * @param reservation 预约信息
+     * @return 预约信息
+     */
+    @Named("entity2dto")
+    ReservationDTO copying(Reservation reservation);
 }

+ 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);
+}

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

@@ -26,4 +26,14 @@ public interface CouponMapper extends BaseMapper<Coupon> {
      */
     List<CouponDTO> listUserGoodsActiveCoupons(@Param("userId") Long userId,
                                                @Param("goodsCouponIds") Collection<Long> goodsCouponIds);
+
+    /**
+     * 修改优惠券已领取数量
+     *
+     * @param id   优惠券ID
+     * @param receiveNum 领取数量
+     * @param publishNum 发行数量
+     */
+    int updateCouponReceivedNum(@Param("id") Long id, @Param("receiveNum") Integer receiveNum,
+                                 @Param("publishNum") Integer publishNum);
 }

+ 15 - 1
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/FavoriteMapper.java

@@ -1,8 +1,14 @@
 package com.chelvc.cloud.vehicle.server.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.chelvc.cloud.vehicle.api.param.FavoriteQueryParam;
+import com.chelvc.cloud.vehicle.api.param.UserCouponQueryParam;
 import com.chelvc.cloud.vehicle.server.entity.Favorite;
+import com.chelvc.cloud.vehicle.server.entity.UserCoupon;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 用户收藏数据操作接口
@@ -18,5 +24,13 @@ public interface FavoriteMapper extends BaseMapper<Favorite> {
      * @param favorite 收藏信息
      * @return true/false
      */
-    boolean createOrIgnore(Favorite favorite);
+    boolean saveFavorite(Favorite favorite);
+
+    /**
+     * 查询用户收藏店铺列表
+     *
+     * @param param 查询参数
+     * @return 用户收藏店铺列表
+     */
+    List<Favorite> listFavoriteMerchants(@Param("userId") Long userId, @Param("param") FavoriteQueryParam param);
 }

+ 12 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/ReservationMapper.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.ReservationQueryParam;
 import com.chelvc.cloud.vehicle.server.entity.Reservation;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 预约记录数据操作接口
@@ -12,4 +16,12 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface ReservationMapper extends BaseMapper<Reservation> {
+
+    /**
+     * 查询用户预约列表
+     *
+     * @param param 查询参数
+     * @return 用户预约列表
+     */
+    List<Reservation> listUserReservations(@Param("userId") Long userId, @Param("param") ReservationQueryParam param);
 }

+ 28 - 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,28 @@ 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);
+
+    /**
+     * 获取当前用户对于当前商品可使用的优惠券列表
+     *
+     * @param param 查询参数
+     * @return 用户可用优惠券信息列表
+     */
+    List<UserCoupon> listUserCanUseCoupons(@Param("userId") Long userId, @Param("param") UserCouponQueryParam param);
 }

+ 34 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/Coupon.java

@@ -3,9 +3,12 @@ package com.chelvc.cloud.vehicle.server.entity;
 import java.util.Date;
 
 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.CouponStatus;
 import com.chelvc.cloud.vehicle.api.constant.CouponType;
+import com.chelvc.cloud.vehicle.api.constant.PromotionStatus;
 import com.chelvc.framework.database.entity.ModifyEntity;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -77,4 +80,35 @@ public class Coupon extends ModifyEntity<Long> {
      * 优惠券状态
      */
     private CouponStatus status;
+
+    /**
+     * 限制领取数量
+     */
+    private Integer limitNum;
+
+    /**
+     * 发行数量
+     */
+    private Integer publishNum;
+
+    /**
+     * 已被领取的数量
+     */
+    private Integer receivedNum;
+
+    /**
+     * 已被使用的数量
+     */
+    private Integer usedNum;
+
+    /**
+     * 优惠券获取方式类型
+     */
+    private CouponClaimType claimType;
+
+    /**
+     * 促销状态
+     */
+    @TableField(exist = false)
+    private PromotionStatus promotionStatus;
 }

+ 12 - 3
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/Favorite.java

@@ -1,16 +1,19 @@
 package com.chelvc.cloud.vehicle.server.entity;
 
-import java.util.Date;
-
 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.FavoriteType;
+import com.chelvc.cloud.vehicle.api.dto.MerchantDTO;
 import com.chelvc.framework.database.entity.Entity;
+import jdk.nashorn.internal.ir.annotations.Ignore;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.SuperBuilder;
 
+import java.util.Date;
+
 /**
  * 用户收藏数据模型
  *
@@ -25,7 +28,7 @@ public class Favorite implements Entity<Long> {
     /**
      * 主键
      */
-    @TableId(type = IdType.ASSIGN_ID)
+    @TableId(type = IdType.AUTO)
     private Long id;
 
     /**
@@ -47,4 +50,10 @@ public class Favorite implements Entity<Long> {
      * 创建时间
      */
     private Date createTime;
+
+    /**
+     * 商家信息
+     */
+    @TableField(exist = false)
+    private MerchantDTO merchant;
 }

+ 9 - 1
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/Reservation.java

@@ -3,8 +3,10 @@ package com.chelvc.cloud.vehicle.server.entity;
 import java.util.Date;
 
 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.ReserveStatus;
+import com.chelvc.cloud.vehicle.api.dto.MerchantDTO;
 import com.chelvc.framework.database.entity.ModifyEntity;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -29,7 +31,7 @@ public class Reservation extends ModifyEntity<Long> {
     /**
      * 主键
      */
-    @TableId(type = IdType.ASSIGN_ID)
+    @TableId(type = IdType.AUTO)
     private Long id;
 
     /**
@@ -56,4 +58,10 @@ public class Reservation extends ModifyEntity<Long> {
      * 预约状态
      */
     private ReserveStatus status;
+
+    /**
+     * 商家信息
+     */
+    @TableField(exist = false)
+    private MerchantDTO merchant;
 }

+ 8 - 1
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/UserCoupon.java

@@ -1,6 +1,7 @@
 package com.chelvc.cloud.vehicle.server.entity;
 
 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.CouponType;
 import com.chelvc.framework.database.entity.ModifyEntity;
@@ -27,7 +28,7 @@ public class UserCoupon extends ModifyEntity<Long> {
     /**
      * 主键
      */
-    @TableId(type = IdType.ASSIGN_ID)
+    @TableId(type = IdType.AUTO)
     private Long id;
 
     /**
@@ -49,4 +50,10 @@ public class UserCoupon extends ModifyEntity<Long> {
      * 是否已使用
      */
     private Boolean used;
+
+    /**
+     * 优惠券
+     */
+    @TableField(exist = false)
+    private Coupon coupon;
 }

+ 8 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/CouponService.java

@@ -22,4 +22,12 @@ public interface CouponService extends IService<Coupon> {
      * @return 优惠券列表
      */
     List<CouponDTO> listUserGoodsActiveCoupons(Long userId, Collection<Long> goodsCouponIds);
+
+    /**
+     * 修改优惠券已领取数量
+     *
+     * @param couponId   优惠券ID
+     * @param receiveNum 领取数量
+     */
+    void updateCouponReceivedNum(Long couponId, Integer receiveNum);
 }

+ 6 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/CategoryServiceImpl.java

@@ -31,6 +31,8 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> i
         com.chelvc.cloud.vehicle.api.service.CategoryService {
     @Override
     public Long addCategory(@NonNull CategoryModifyParam param) {
+        Integer count = this.lambdaQuery().eq(Category::getName, param.getName()).count();
+        ResourceUtils.available(count <= 0, "分类名称已存在");
         Category category = CategoryCopier.INSTANCE.copying(param);
         this.save(category);
         return category.getId();
@@ -65,4 +67,8 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> i
         List<Category> categories = this.baseMapper.listRecommendCategories(size);
         return CategoryCopier.INSTANCE.copying(categories);
     }
+    @Override
+    public void deleteCategory(Long id){
+        this.baseMapper.deleteById(id);
+    }
 }

+ 103 - 2
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/CouponServiceImpl.java

@@ -2,14 +2,30 @@ 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.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.chelvc.cloud.vehicle.api.constant.PromotionStatus;
 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.exception.ResourceUnavailableException;
+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.apache.dubbo.config.annotation.DubboService;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 /**
  * 优惠券业务操作实现
@@ -17,10 +33,95 @@ import org.springframework.stereotype.Service;
  * @author Woody
  * @date 2023/7/17
  */
-@Service
-public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> implements CouponService {
+@DubboService(interfaceClass = com.chelvc.cloud.vehicle.api.service.CouponService.class)
+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 void deleteCoupon(@NonNull Long id) {
+        ResourceUtils.required(this.getById(id), "商品优惠卷不存在");
+        this.baseMapper.deleteById(id);
+    }
+
+    @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())
+                .eq(Objects.nonNull(param.getCouponStatus()), Coupon::getStatus, param.getCouponStatus())
+                .eq(Objects.nonNull(param.getCouponClaimType()), Coupon::getClaimType, param.getCouponClaimType())
+                .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);
+    }
+
+    @Override
+    public void updateCouponReceivedNum(Long couponId, Integer receiveNum) {
+        Coupon coupon = this.getById(couponId);
+        if (Objects.isNull(coupon)) {
+            throw new ResourceUnavailableException("当前优惠券不存在");
+        }
+        int row = this.baseMapper.updateCouponReceivedNum(couponId, receiveNum, coupon.getPublishNum());
+        if (row < 1) {
+            throw new ResourceUnavailableException("修改优惠券已被领取数量失败!");
+        }
+    }
+
+    /**
+     * 转换优惠券信息
+     *
+     * @param coupon 优惠券实例
+     * @return 优惠券信息
+     */
+    private CouponDTO convert(Coupon coupon) {
+        return CouponCopier.INSTANCE.copying(coupon);
+    }
 }

+ 43 - 6
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/FavoriteServiceImpl.java

@@ -1,17 +1,27 @@
 package com.chelvc.cloud.vehicle.server.service.impl;
 
-import java.util.Date;
-import java.util.Objects;
-
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.chelvc.cloud.vehicle.api.constant.FavoriteType;
+import com.chelvc.cloud.vehicle.api.dto.FavoriteDTO;
+import com.chelvc.cloud.vehicle.api.dto.MerchantDTO;
+import com.chelvc.cloud.vehicle.api.param.FavoritePagingParam;
+import com.chelvc.cloud.vehicle.api.param.FavoriteQueryParam;
+import com.chelvc.cloud.vehicle.server.copier.FavoriteCopier;
 import com.chelvc.cloud.vehicle.server.dao.FavoriteMapper;
 import com.chelvc.cloud.vehicle.server.entity.Favorite;
 import com.chelvc.cloud.vehicle.server.service.FavoriteService;
 import com.chelvc.framework.base.context.SessionContextHolder;
 import com.chelvc.framework.base.util.ResourceUtils;
+import com.chelvc.framework.common.model.Pagination;
 import lombok.NonNull;
 import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * 用户收藏业务操作实现
@@ -24,10 +34,15 @@ public class FavoriteServiceImpl extends ServiceImpl<FavoriteMapper, Favorite> i
         com.chelvc.cloud.vehicle.api.service.FavoriteService {
     @Override
     public Long addMerchantFavorite(@NonNull Long merchantId) {
-        Favorite favorite = Favorite.builder().userId(SessionContextHolder.getId()).type(FavoriteType.MERCHANT)
+        Long userId = SessionContextHolder.getId();
+        Integer count = this.lambdaQuery()
+                .eq(Favorite::getUserId, userId)
+                .eq(Favorite::getType, FavoriteType.MERCHANT)
+                .eq(Favorite::getContentId, merchantId).count();
+        ResourceUtils.available(count <= 0, "收藏信息已存在");
+        Favorite favorite = Favorite.builder().userId(userId).type(FavoriteType.MERCHANT)
                 .contentId(merchantId).createTime(new Date()).build();
-        boolean success = this.baseMapper.createOrIgnore(favorite);
-        ResourceUtils.available(success, "收藏信息已存在");
+        this.baseMapper.saveFavorite(favorite);
         return favorite.getId();
     }
 
@@ -37,4 +52,26 @@ public class FavoriteServiceImpl extends ServiceImpl<FavoriteMapper, Favorite> i
         ResourceUtils.available(Objects.equals(favorite.getUserId(), SessionContextHolder.getId()), "非法操作");
         this.removeById(id);
     }
+
+    @Override
+    public Pagination<MerchantDTO> getFavoriteMerchantPaging(FavoritePagingParam param) {
+        return null;
+    }
+
+    @Override
+    public List<FavoriteDTO> listFavoriteMerchants(@NonNull FavoriteQueryParam param) {
+        Long userId = SessionContextHolder.getId();
+        List<Favorite> favorites = this.baseMapper.listFavoriteMerchants(userId, param);
+        if (CollectionUtils.isEmpty(favorites)) {
+            return Collections.emptyList();
+        }
+        return favorites
+                .stream()
+                .map(o -> {
+                    FavoriteDTO favoriteDTO = FavoriteCopier.INSTANCE.copying(o);
+                    favoriteDTO.setMerchant(o.getMerchant());
+                    return favoriteDTO;
+                }).collect(Collectors.toList());
+
+    }
 }

+ 44 - 2
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/GoodsServiceImpl.java

@@ -2,20 +2,29 @@ package com.chelvc.cloud.vehicle.server.service.impl;
 
 import java.util.List;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.chelvc.cloud.vehicle.api.constant.CategoryType;
+import com.chelvc.cloud.vehicle.api.constant.GoodsStatus;
+import com.chelvc.cloud.vehicle.api.constant.MerchantStatus;
+import com.chelvc.cloud.vehicle.api.dto.CouponDTO;
 import com.chelvc.cloud.vehicle.api.dto.GoodsDTO;
 import com.chelvc.cloud.vehicle.api.dto.GoodsDetailDTO;
-import com.chelvc.cloud.vehicle.api.param.CommentQueryParam;
-import com.chelvc.cloud.vehicle.api.param.GoodsQueryParam;
+import com.chelvc.cloud.vehicle.api.param.*;
+import com.chelvc.cloud.vehicle.server.copier.CouponCopier;
 import com.chelvc.cloud.vehicle.server.copier.GoodsCopier;
 import com.chelvc.cloud.vehicle.server.dao.GoodsMapper;
+import com.chelvc.cloud.vehicle.server.entity.Coupon;
 import com.chelvc.cloud.vehicle.server.entity.Goods;
 import com.chelvc.cloud.vehicle.server.service.CommentService;
 import com.chelvc.cloud.vehicle.server.service.CouponService;
 import com.chelvc.cloud.vehicle.server.service.GoodsService;
 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.common.util.StringUtils;
+import com.chelvc.framework.database.context.DatabaseContextHolder;
+import com.chelvc.framework.database.util.PagingUtils;
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
@@ -68,4 +77,37 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
     public List<GoodsDTO> listMerchantSimpleGoods(@NonNull Long merchantId, @NonNull GoodsQueryParam param) {
         return this.baseMapper.listMerchantSimpleGoods(merchantId, param);
     }
+
+
+
+    @Override
+    public Long addGoods(GoodsModifyParam param){
+        Goods goods = GoodsCopier.INSTANCE.copying(param);
+        goods.setScore(0D);
+        goods.setSale(0);
+        goods.setStatus(GoodsStatus.ONLINE);
+        this.save(goods);
+        return goods.getId();
+    }
+
+    @Override
+    public void updateGoods(@NonNull Long id, @NonNull GoodsModifyParam param) {
+        Goods goods = ResourceUtils.required(this.getById(id), "商品不存在");
+        GoodsCopier.INSTANCE.copying(param, goods);
+        this.updateById(goods);
+    }
+
+    @Override
+    public void deleteGoods(@NonNull Long id) {
+        ResourceUtils.required(this.getById(id), "商品不存在");
+        this.baseMapper.deleteById(id);
+    }
+
+    @Override
+    public Pagination<GoodsDTO> getGoodsPaging(@NonNull GoodsPagingParam param) {
+        Page<Goods> page = this.lambdaQuery()
+                .like(StringUtils.nonEmpty(param.getName()), Goods::getName, param.getName())
+                .orderByAsc(Goods::getStatus).page(PagingUtils.convert(param.getPaging()));
+        return PagingUtils.convert(page, GoodsCopier.INSTANCE::copying);
+    }
 }

+ 11 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/MerchantServiceImpl.java

@@ -92,6 +92,11 @@ public class MerchantServiceImpl extends ServiceImpl<MerchantMapper, Merchant> i
 
     @Override
     public Long addMerchant(@NonNull MerchantModifyParam param) {
+        // 判断商家名称是否存在
+        Integer count = this.lambdaQuery()
+                .eq(Merchant::getName, param.getName())
+                .eq(Merchant::getStatus, MerchantStatus.ONLINE).count();
+        ResourceUtils.available(count < 1 , "商家名称已存在");
         Merchant merchant = MerchantCopier.INSTANCE.copying(param);
         merchant.setUserId(0L);
         merchant.setScore(0D);
@@ -108,6 +113,12 @@ public class MerchantServiceImpl extends ServiceImpl<MerchantMapper, Merchant> i
         this.updateById(merchant);
     }
 
+    @Override
+    public void deleteMerchant(@NonNull Long id) {
+         ResourceUtils.required(this.getById(id), "商家不存在");
+        this.baseMapper.deleteById(id);
+    }
+
     @Override
     public Pagination<MerchantDTO> getMerchantPaging(@NonNull MerchantPagingParam param) {
         Page<Merchant> page = this.lambdaQuery()

+ 24 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/ReservationServiceImpl.java

@@ -2,7 +2,9 @@ package com.chelvc.cloud.vehicle.server.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.chelvc.cloud.vehicle.api.constant.ReserveStatus;
+import com.chelvc.cloud.vehicle.api.dto.ReservationDTO;
 import com.chelvc.cloud.vehicle.api.param.ReservationModifyParam;
+import com.chelvc.cloud.vehicle.api.param.ReservationQueryParam;
 import com.chelvc.cloud.vehicle.server.copier.ReservationCopier;
 import com.chelvc.cloud.vehicle.server.dao.ReservationMapper;
 import com.chelvc.cloud.vehicle.server.entity.Reservation;
@@ -10,6 +12,11 @@ import com.chelvc.cloud.vehicle.server.service.ReservationService;
 import com.chelvc.framework.base.context.SessionContextHolder;
 import lombok.NonNull;
 import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 预约记录业务操作实现
@@ -28,4 +35,21 @@ public class ReservationServiceImpl extends ServiceImpl<ReservationMapper, Reser
         reservation.setStatus(ReserveStatus.PENDING);
         this.save(reservation);
     }
+
+    @Override
+    public List<ReservationDTO> listUserReservations(@NonNull ReservationQueryParam param) {
+        Long userId = SessionContextHolder.getId();
+        List<Reservation> reservations = this.baseMapper.listUserReservations(userId, param);
+        if (CollectionUtils.isEmpty(reservations)) {
+            return Collections.emptyList();
+        }
+        return reservations
+                .stream()
+                .map(o -> {
+                    ReservationDTO reservationDTO = ReservationCopier.INSTANCE.copying(o);
+                    reservationDTO.setMerchant(o.getMerchant());
+                    return reservationDTO;
+                }).collect(Collectors.toList());
+
+    }
 }

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

@@ -1,10 +1,35 @@
 package com.chelvc.cloud.vehicle.server.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.chelvc.cloud.vehicle.api.constant.CouponClaimType;
+import com.chelvc.cloud.vehicle.api.constant.PromotionStatus;
+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.api.util.PromotionUtils;
+import com.chelvc.cloud.vehicle.server.copier.UserCouponCopier;
 import com.chelvc.cloud.vehicle.server.dao.UserCouponMapper;
+import com.chelvc.cloud.vehicle.server.entity.Coupon;
 import com.chelvc.cloud.vehicle.server.entity.UserCoupon;
+import com.chelvc.cloud.vehicle.server.service.CouponService;
 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.exception.ResourceUnavailableException;
+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.*;
+import java.util.stream.Collectors;
 
 /**
  * 优惠券领取业务操作实现
@@ -12,6 +37,138 @@ 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 {
+
+    private final CouponService couponService;
+
+    @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 List<UserCouponDTO> listUserCanUseCoupons(@NonNull UserCouponQueryParam param) {
+        List<String> merchantIds = new ArrayList<>(Arrays.asList(param.getMerchantId().split(",")));
+        merchantIds.add(PromotionUtils.PLATFORM_ID);
+        param.setMerchantIds(merchantIds);
+        Long userId = SessionContextHolder.getId();
+        // 当前用户对于当前商品可使用的优惠券列表
+        List<UserCoupon> userCoupons = this.baseMapper.listUserCanUseCoupons(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);
+    }
+
+    @Override
+    public Long claimCoupon(@NonNull Long couponId) {
+        Coupon coupon = ResourceUtils.required(couponService.getById(couponId), "优惠券不存在");
+        if (CouponClaimType.FREE.equals(coupon.getClaimType())) {
+            throw new ResourceUnavailableException("当前优惠券不允许免费领取");
+        }
+        Long userId = SessionContextHolder.getId();
+        // 检查该用户可领取的优惠券的数量
+        this.checkCouponLimit(coupon, userId);
+        // 保存优惠券领取记录
+        UserCoupon userCoupon = UserCoupon.builder().userId(userId).couponId(couponId)
+                .type(coupon.getType()).used(false).build();
+        this.save(userCoupon);
+        // 修改优惠券的领取数量
+        couponService.updateCouponReceivedNum(couponId, 1);
+        return userCoupon.getId();
+    }
+
+    /**
+     * 检查该用户可领取的优惠券的数量
+     *
+     * @param coupon 要领取的优惠券
+     * @param userId 用户ID
+     */
+    public void checkCouponLimit(Coupon coupon, Long userId) {
+        Integer haveCoupons = this.lambdaQuery()
+                .eq(UserCoupon::getUserId, userId)
+                .eq(UserCoupon::getCouponId, coupon.getId()).count();
+        if (!PromotionStatus.START.name().equals(coupon.getPromotionStatus())) {
+            throw new ResourceUnavailableException("当前优惠券已经被领取完了,下次要早点来哦");
+        }
+        if (coupon.getPublishNum() != 0 && coupon.getReceivedNum() >= coupon.getPublishNum()) {
+            throw new ResourceUnavailableException("优惠券剩余领取数量不足");
+        }
+        if (!coupon.getLimitNum().equals(0) && haveCoupons >= coupon.getLimitNum()) {
+            throw new ResourceUnavailableException("超出领取限制,此优惠券最多领取" + coupon.getLimitNum() + "张");
+        }
+    }
+
+    /**
+     * 转换优惠券领取记录信息
+     *
+     * @param userCoupon 优惠券领取记录实例
+     * @return 优惠券领取记录信息
+     */
+    private UserCouponDTO convert(UserCoupon userCoupon) {
+        return UserCouponCopier.INSTANCE.copying(userCoupon);
+    }
 }

+ 24 - 0
vehicle-server/src/main/resources/application-qizai.yml

@@ -0,0 +1,24 @@
+spring:
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 47.108.128.78:6848
+  datasource:
+    url: jdbc:mysql://47.108.128.78:6180/vehicle?characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
+    username: vehicle
+    password: Chelvc@vehicle!2023#
+  redis:
+    host: 47.108.128.78
+    port: 7031
+    password: Chelvc@2023
+
+dubbo:
+  registry:
+    address: nacos://47.108.128.78:6848
+
+nacos:
+  config:
+    server-addr: 47.108.128.78:6848
+
+rocketmq:
+  name-server: http://47.108.128.78:9876

+ 1 - 1
vehicle-server/src/main/resources/application.yml

@@ -5,7 +5,7 @@ spring:
   main:
     allow-bean-definition-overriding: true
   profiles:
-    active: dev
+    active: qizai
   application:
     name: vehicle
   jackson:

+ 8 - 0
vehicle-server/src/main/resources/mapper/CouponMapper.xml

@@ -19,4 +19,12 @@
             and cn.expiration > now() and cn.status = 'ONLINE'
         </where>
     </select>
+
+    <update id="updateCouponReceivedNum">
+        update coupon cn set cn.received_num = cn.received_num + #{receiveNum}
+        where cn.id = #{id}
+        <if test="publishNum != null and publishNum != 0">
+            and cn.publish_num >= cn.received_num + #{receiveNum}
+        </if>
+    </update>
 </mapper>

+ 36 - 3
vehicle-server/src/main/resources/mapper/FavoriteMapper.xml

@@ -1,8 +1,41 @@
 <?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.FavoriteMapper">
-    <insert id="createOrIgnore">
-        insert ignore into `favorite`(id, user_id, type, content_id, create_time)
-        values(#{id}, #{userId}, #{type}, #{contentId}, #{createTime})
+
+    <resultMap id="FAVORITE_RESULT_MAP" type="com.chelvc.cloud.vehicle.server.entity.Favorite">
+        <id column="id" property="id" jdbcType="BIGINT"/>
+        <result column="user_id" property="userId" jdbcType="BIGINT"/>
+        <result column="type" property="type" jdbcType="VARCHAR"/>
+        <result column="content_id" property="contentId" jdbcType="BIGINT"/>
+        <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
+        <association property="merchant" javaType="com.chelvc.cloud.vehicle.api.dto.MerchantDTO">
+            <id column="merchant_id" property="id" jdbcType="BIGINT"/>
+            <result column="name" property="name" jdbcType="VARCHAR"/>
+            <result column="logo" property="logo" jdbcType="VARCHAR"/>
+            <result column="score" property="score" jdbcType="DOUBLE"/>
+            <result column="sale" property="sale" jdbcType="INTEGER"/>
+            <result column="address" property="address" jdbcType="VARCHAR"/>
+            <result column="distance" property="distance" jdbcType="DOUBLE"/>
+        </association>
+    </resultMap>
+
+    <insert id="saveFavorite" useGeneratedKeys="true" keyProperty="id">
+        insert into `favorite`(user_id, type, content_id, create_time)
+        values(#{userId}, #{type}, #{contentId}, #{createTime})
     </insert>
+
+    <select id="listFavoriteMerchants" resultMap="FAVORITE_RESULT_MAP">
+        select fe.id,fe.content_id,mt.id as merchant_id, mt.name, mt.logo, mt.score, mt.sale, mt.address,
+        round(st_distance_sphere(
+        point(mt.longitude, mt.latitude), point(#{param.longitude}, #{param.latitude})
+        )) distance from favorite fe
+        inner join merchant mt on fe.content_id = mt.id and mt.status = 'ONLINE'
+        and mt.region = #{param.region}
+        where fe.user_id = #{userId} and fe.type = 'MERCHANT'
+        <if test="param.offset != null">
+            and fe.id > #{param.offset}
+        </if>
+        order by fe.create_time desc
+        limit #{param.size}
+    </select>
 </mapper>

+ 42 - 0
vehicle-server/src/main/resources/mapper/ReservationMapper.xml

@@ -0,0 +1,42 @@
+<?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.ReservationMapper">
+
+    <resultMap id="RESERVATION_RESULT_MAP" type="com.chelvc.cloud.vehicle.server.entity.Reservation">
+        <id column="id" property="id" jdbcType="BIGINT"/>
+        <result column="user_id" property="userId" jdbcType="BIGINT"/>
+        <result column="merchant_id" property="merchantId" jdbcType="BIGINT"/>
+        <result column="mobile" property="mobile" jdbcType="VARCHAR"/>
+        <result column="appoint_time" property="appointTime" jdbcType="TIMESTAMP"/>
+        <result column="status" property="status" jdbcType="VARCHAR"/>
+        <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="merchant" javaType="com.chelvc.cloud.vehicle.api.dto.MerchantDTO">
+            <id column="merchant_id" property="id" jdbcType="BIGINT"/>
+            <result column="name" property="name" jdbcType="VARCHAR"/>
+            <result column="logo" property="logo" jdbcType="VARCHAR"/>
+            <result column="score" property="score" jdbcType="DOUBLE"/>
+            <result column="sale" property="sale" jdbcType="INTEGER"/>
+            <result column="address" property="address" jdbcType="VARCHAR"/>
+            <result column="distance" property="distance" jdbcType="DOUBLE"/>
+        </association>
+    </resultMap>
+
+    <select id="listUserReservations" resultMap="RESERVATION_RESULT_MAP">
+        select rn.id,rn.user_id,rn.merchant_id,rn.mobile,rn.appoint_time,rn.status, mt.name, mt.logo, mt.score,
+        mt.sale, mt.address
+        from reservation rn
+        inner join merchant mt on merchant_id = mt.id and mt.status = 'ONLINE'
+        where rn.user_id = #{userId}
+        <if test="param.offset != null">
+            and rn.id > #{param.offset}
+        </if>
+        <if test="param.status != null">
+            and rn.status = #{param.status}
+        </if>
+        order by rn.appoint_time asc
+        limit #{param.size}
+    </select>
+</mapper>

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

@@ -0,0 +1,79 @@
+<?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="coupon_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>
+
+    <select id="listUserCanUseCoupons" resultMap="USERCOUPON_RESULT_MAP">
+        select ucn.id, ucn.coupon_id, cn.name, cn.amount, cn.reduce, cn.discount, cn.description,cn.expiration,
+        cn.merchant_id
+        from `user_coupon` ucn
+        inner join `coupon` cn on ucn.coupon_id = cn.id and ucn.user_id = #{userId}
+        <where>
+            ucn.used = 0
+            <if test="merchantIds != null and !merchantIds.isEmpty()">
+                and cn.merchant_id in
+                <foreach collection="merchantIds" item="id" open="(" close=")" separator=",">
+                    #{id}
+                </foreach>
+            </if>
+            and cn.expiration > now() and cn.status = 'ONLINE'
+            <if test="param.offset != null">
+                and ucn.id > #{param.offset}
+            </if>
+        </where>
+        order by ucn.create_time desc
+        limit #{param.size}
+    </select>
+
+</mapper>