Ver código fonte

优惠券新增、修改、查询开发

WangChanghua 1 ano atrás
pai
commit
a1570f110c
24 arquivos alterados com 701 adições e 147 exclusões
  1. 55 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/BasePromotionQueryParam.java
  2. 16 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/CouponModifyParam.java
  3. 34 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/FullDiscountQueryParam.java
  4. 47 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/PromotionGoodsQueryParam.java
  5. 24 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/CouponService.java
  6. 10 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/FullDiscountService.java
  7. 0 50
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/util/PromotionUtils.java
  8. 15 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/FullDiscountMapper.java
  9. 13 4
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/BasePromotion.java
  10. 98 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/FullDiscount.java
  11. 2 7
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/PromotionGoods.java
  12. 0 21
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/UserCoupon.java
  13. 12 1
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/AbstractPromotionService.java
  14. 21 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/FullDiscountService.java
  15. 9 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/PromotionGoodsService.java
  16. 9 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/UserCouponService.java
  17. 50 11
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/AbstractPromotionServiceImpl.java
  18. 7 20
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/CouponActivityServiceImpl.java
  19. 102 30
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/CouponServiceImpl.java
  20. 33 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/FullDiscountServiceImpl.java
  21. 16 1
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/PromotionGoodsServiceImpl.java
  22. 11 2
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/UserCouponServiceImpl.java
  23. 112 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/util/PromotionUtils.java
  24. 5 0
      vehicle-server/src/main/resources/mapper/FullDiscountMapper.xml

+ 55 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/BasePromotionQueryParam.java

@@ -0,0 +1,55 @@
+package com.chelvc.cloud.vehicle.api.param;
+
+import com.chelvc.cloud.vehicle.api.constant.PromotionScopeType;
+import com.chelvc.cloud.vehicle.api.constant.PromotionStatus;
+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/11/14
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class BasePromotionQueryParam implements Serializable {
+
+    /**
+     * 活动ID
+     */
+    private Long id;
+
+    /**
+     * 活动开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 活动结束时间
+     */
+    private Date endTime;
+
+    /**
+     * 活动状态 如需同时判断多个活动状态','分割
+     */
+    private String promotionStatus;
+
+    /**
+     * 关联范围类型
+     */
+    private PromotionScopeType scopeType;
+
+    /**
+     * 商家ID 如有多个','分割
+     */
+    private String merchantId;
+}

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

@@ -13,6 +13,7 @@ import javax.validation.constraints.Size;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -90,4 +91,19 @@ public class CouponModifyParam implements Serializable {
     @NotNull(message = "限制领取数量不能为空")
     @Min(value = 0, message = "限制领取数量不能小于0")
     private Integer limitNum;
+
+    /**
+     * 优惠券ID列表
+     */
+    private List<Long> ids;
+
+    /**
+     * 活动开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 活动结束时间
+     */
+    private Date endTime;
 }

+ 34 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/FullDiscountQueryParam.java

@@ -0,0 +1,34 @@
+package com.chelvc.cloud.vehicle.api.param;
+
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * 满优惠查询参数
+ *
+ * @author qizai
+ * @date 2023/11/14
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+public class FullDiscountQueryParam extends BasePromotionQueryParam {
+
+    /**
+     * 活动名称
+     */
+    private String promotionName;
+
+    /**
+     * 是否赠优惠券
+     */
+    private Boolean couponFlag;
+
+    /**
+     * 优惠券ID
+     */
+    private Long couponId;
+}

+ 47 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/PromotionGoodsQueryParam.java

@@ -0,0 +1,47 @@
+package com.chelvc.cloud.vehicle.api.param;
+
+import com.chelvc.cloud.vehicle.api.constant.PromotionType;
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+
+import java.util.List;
+
+/**
+ * 促销商品查询参数
+ *
+ * @author qizai
+ * @date 2023/11/14
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+public class PromotionGoodsQueryParam extends BasePromotionQueryParam {
+
+    /**
+     * 促销活动ID
+     */
+    private Long promotionId;
+
+    /**
+     * 促销类型
+     */
+    private PromotionType promotionType;
+
+    /**
+     * 商品名称
+     */
+    private String goodsName;
+
+    /**
+     * 商品分类路径
+     */
+    private String categoryPath;
+
+    /**
+     * 促销活动ID
+     */
+    private List<Long> promotionIds;
+}

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

@@ -5,6 +5,8 @@ import com.chelvc.cloud.vehicle.api.param.CouponModifyParam;
 import com.chelvc.cloud.vehicle.api.param.CouponPagingParam;
 import com.chelvc.framework.common.model.Pagination;
 
+import java.util.List;
+
 /**
  * 优惠券业务接口
  *
@@ -59,4 +61,26 @@ public interface CouponService {
      * @return 优惠券分页信息
      */
     Pagination<CouponDTO> getMerchantCouponPaging(Long merchantId, CouponPagingParam param);
+
+    /**
+     * 新增优惠券
+     *
+     * @param param 新增参数
+     * @return 优惠券主键
+     */
+    Long saveCoupon(CouponModifyParam param);
+
+    /**
+     * 修改优惠券状态
+     *
+     * @param param 修改参数
+     */
+    void updateCouponStatus(CouponModifyParam param);
+
+    /**
+     * 批量删除优惠券
+     *
+     * @param ids    优惠券主键列表
+     */
+    void batchDeleteCoupon(List<Long> ids);
 }

+ 10 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/FullDiscountService.java

@@ -0,0 +1,10 @@
+package com.chelvc.cloud.vehicle.api.service;
+
+/**
+ * 促销商品业务接口
+ *
+ * @author qizai
+ * @date 2023/11/14
+ */
+public interface FullDiscountService {
+}

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

@@ -1,50 +0,0 @@
-package com.chelvc.cloud.vehicle.api.util;
-
-import com.chelvc.framework.common.util.DateUtils;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.Date;
-
-/**
- * 优惠活动通用验证类
- *
- * @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 Long PLATFORM_ID = 0L;
-    public static final String PLATFORM_NAME = "platform";
-
-    /**
-     * 参数验证
-     * 1、活动起始时间必须大于当前时间
-     * 2、验证活动开始时间是否大于活动结束时间
-     *
-     * @param startTime 活动开始时间
-     * @param endTime   活动结束时间
-     */
-    public static void checkPromotionTime(Date startTime, Date endTime) {
-        if (startTime == null) {
-            throw new RuntimeException("活动起始时间不能为空");
-        }
-
-        Date now = DateUtils.today();
-
-        //如果活动起始时间小于现在时间
-        if (now.after(startTime)) {
-            throw new RuntimeException("活动起始时间不能小于当前时间");
-        }
-        //如果活动结束时间小于现在时间
-        if (endTime != null && now.after(endTime)) {
-            throw new RuntimeException("活动结束时间不能小于当前时间");
-        }
-        //开始时间不能大于结束时间
-        if (endTime != null && startTime.after(endTime)) {
-            throw new RuntimeException("活动起始时间必须大于结束时间");
-        }
-    }
-}

+ 15 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/FullDiscountMapper.java

@@ -0,0 +1,15 @@
+package com.chelvc.cloud.vehicle.server.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.chelvc.cloud.vehicle.server.entity.FullDiscount;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 满减优惠数据操作接口
+ *
+ * @author qizai
+ * @date 2023/11/14
+ */
+@Mapper
+public interface FullDiscountMapper extends BaseMapper<FullDiscount> {
+}

+ 13 - 4
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/BasePromotion.java

@@ -1,17 +1,20 @@
 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.PromotionScopeType;
 import com.chelvc.cloud.vehicle.api.constant.PromotionStatus;
+import com.chelvc.framework.database.entity.Deletable;
 import com.chelvc.framework.database.entity.ModifyEntity;
+import com.chelvc.framework.database.interceptor.DeletedTypeHandler;
 import lombok.*;
 import lombok.experimental.SuperBuilder;
 
 import java.util.Date;
 
 /**
- * 优惠券数据模型
+ * 促销活动基础数据模型
  *
  * @author qizai
  * @date 2023/11/10
@@ -22,7 +25,7 @@ import java.util.Date;
 @AllArgsConstructor
 @ToString(callSuper = true)
 @EqualsAndHashCode(callSuper = true)
-public class BasePromotion extends ModifyEntity<Long> {
+public class BasePromotion extends ModifyEntity<Long> implements Deletable<Long> {
 
     /**
      * 主键
@@ -51,7 +54,7 @@ public class BasePromotion extends ModifyEntity<Long> {
     private Date startTime;
 
     /**
-     * 活动名称
+     * 活动结束时间
      */
     private Date endTime;
 
@@ -65,11 +68,17 @@ public class BasePromotion extends ModifyEntity<Long> {
      */
     private String scopeId;
 
+    /**
+     * 是否已删除
+     */
+    @TableField(typeHandler = DeletedTypeHandler.class)
+    private Boolean deleted;
+
 
     /**
      * @return 促销状态
      */
-    public String getPromotionStatus() {
+    public String getPromotionsStatus() {
         if (endTime == null) {
             return startTime != null ? PromotionStatus.START.name() : PromotionStatus.CLOSE.name();
         }

+ 98 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/FullDiscount.java

@@ -0,0 +1,98 @@
+package com.chelvc.cloud.vehicle.server.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.DecimalMax;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 满优惠活动数据模型
+ *
+ * @author qizai
+ * @date 2023/11/14
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+@TableName(autoResultMap = true)
+public class FullDiscount extends BasePromotion {
+
+    /**
+     * 优惠门槛金额
+     */
+    @NotNull(message = "请填写优惠门槛")
+    @DecimalMax(value = "99999999.00", message = "优惠券门槛金额超出限制")
+    private Double fullMoney;
+
+    /**
+     * 活动是否减现金
+     */
+    private Boolean fullMinusFlag;
+
+    /**
+     * 减现金
+     */
+    private Double fullMinus;
+
+    /**
+     * 是否打折
+     */
+    private Boolean fullRateFlag;
+
+    /**
+     * 打折
+     */
+    private Double fullRate;
+
+    /**
+     * 是否赠送积分
+     */
+    private Boolean pointFlag;
+
+    /**
+     * 赠送多少积分
+     */
+    private Integer point;
+
+    /**
+     * 是否包邮
+     */
+    private Boolean freeFreightFlag;
+
+    /**
+     * 是否有赠品
+     */
+    private Boolean giftFlag;
+
+    /**
+     * 赠品ID
+     */
+    private Long giftId;
+
+    /**
+     * 是否赠优惠券
+     */
+    private Boolean couponFlag;
+
+    /**
+     * 优惠券ID
+     */
+    private Long couponId;
+
+    /**
+     * 活动标题
+     */
+    @NotEmpty(message = "活动标题不能为空")
+    private String title;
+
+    /**
+     * 活动说明
+     */
+    private String description;
+}

+ 2 - 7
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/PromotionGoods.java

@@ -6,12 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.chelvc.cloud.vehicle.api.constant.GoodsType;
 import com.chelvc.cloud.vehicle.api.constant.PromotionScopeType;
 import com.chelvc.cloud.vehicle.api.constant.PromotionType;
-import com.chelvc.framework.database.entity.ModifyEntity;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-import lombok.ToString;
+import lombok.*;
 import lombok.experimental.SuperBuilder;
 
 import java.util.Date;
@@ -29,7 +24,7 @@ import java.util.Date;
 @ToString(callSuper = true)
 @EqualsAndHashCode(callSuper = true)
 @TableName(autoResultMap = true)
-public class PromotionGoods extends ModifyEntity<Long> {
+public class PromotionGoods extends BasePromotion {
 
     /**
      * 主键

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

@@ -145,25 +145,4 @@ public class UserCoupon extends ModifyEntity<Long> {
      * 用户优惠券状态
      */
     private UserCouponStatus userCouponStatus;
-
-    public UserCoupon(Coupon coupon) {
-        setCouponId(coupon.getId());
-        setMemberId(coupon.getMerchantId());
-        setMemberName(coupon.getM());
-        setPrice(coupon.getPrice());
-        setDiscount(coupon.getCouponDiscount());
-        setConsumeThreshold(coupon.getConsumeThreshold());
-        setScopeType(coupon.getScopeType());
-        setScopeId(coupon.getScopeId());
-        setCouponType(coupon.getCouponType());
-        setStartTime(coupon.getStartTime() == null ? new Date() : coupon.getStartTime());
-
-        setGetType(coupon.getGetType());
-        setStoreCommission(coupon.getStoreCommission());
-        if (coupon.getRangeDayType().equals(CouponRangeDayEnum.FIXEDTIME.name())) {
-            setEndTime(coupon.getEndTime());
-        } else {
-            setEndTime(DateUtil.endOfDay(DateUtil.offset(new DateTime(), DateField.DAY_OF_YEAR, (coupon.getEffectiveDays() - 1))));
-        }
-    }
 }

+ 12 - 1
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/AbstractPromotionService.java

@@ -2,8 +2,10 @@ package com.chelvc.cloud.vehicle.server.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.chelvc.cloud.vehicle.api.constant.PromotionType;
+import com.chelvc.cloud.vehicle.api.param.BasePromotionQueryParam;
 import com.chelvc.cloud.vehicle.server.entity.BasePromotion;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -51,7 +53,7 @@ public interface AbstractPromotionService<T extends BasePromotion> extends IServ
      * @param endTime   结束时间
      * @return 是否更新成功
      */
-    boolean updateStatus(List<Long> ids, Long startTime, Long endTime);
+    boolean updateStatus(List<Long> ids, Date startTime, Date endTime);
 
     /**
      * 移除促销活动
@@ -104,4 +106,13 @@ public interface AbstractPromotionService<T extends BasePromotion> extends IServ
      */
     PromotionType getPromotionType();
 
+    /**
+     * 列表查询促销信息
+     *
+     * @param queryParam 查询参数,继承自继承促销查询参数
+     * @param <S> 继承自基础促销查询参数的促销查询参数
+     * @return 列表促销信息
+     */
+    <S extends BasePromotionQueryParam> List<T> listFindAll(S queryParam);
+
 }

+ 21 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/FullDiscountService.java

@@ -0,0 +1,21 @@
+package com.chelvc.cloud.vehicle.server.service;
+
+import com.chelvc.cloud.vehicle.server.entity.FullDiscount;
+
+import java.util.List;
+
+/**
+ * 满优惠业务操作接口
+ *
+ * @author qizai
+ * @date 2023/11/14
+ */
+public interface FullDiscountService extends AbstractPromotionService<FullDiscount> {
+
+    /**
+     * 删除促销促销商品
+     *
+     * @param promotionIds 促销活动id
+     */
+    void deletePromotionGoods(List<Long> promotionIds);
+}

+ 9 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/PromotionGoodsService.java

@@ -1,6 +1,7 @@
 package com.chelvc.cloud.vehicle.server.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.chelvc.cloud.vehicle.api.param.PromotionGoodsQueryParam;
 import com.chelvc.cloud.vehicle.server.entity.Goods;
 import com.chelvc.cloud.vehicle.server.entity.PromotionGoods;
 
@@ -20,4 +21,12 @@ public interface PromotionGoodsService extends IService<PromotionGoods> {
      * @param promotionIds 促销活动id
      */
     void deletePromotionGoods(List<Long> promotionIds);
+
+    /**
+     * 获取促销商品信息
+     *
+     * @param queryParam 查询参数
+     * @return 促销商品列表
+     */
+    List<PromotionGoods> listFindAll(PromotionGoodsQueryParam queryParam);
 }

+ 9 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/UserCouponService.java

@@ -3,6 +3,8 @@ package com.chelvc.cloud.vehicle.server.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.chelvc.cloud.vehicle.server.entity.UserCoupon;
 
+import java.util.List;
+
 /**
  * 优惠券领取业务操作接口
  *
@@ -10,4 +12,11 @@ import com.chelvc.cloud.vehicle.server.entity.UserCoupon;
  * @date 2023/7/17
  */
 public interface UserCouponService extends IService<UserCoupon> {
+
+    /**
+     * 关闭用户优惠券
+     *
+     * @param couponIds 优惠券id集合
+     */
+    void closeUserCoupon(List<Long> couponIds);
 }

+ 50 - 11
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/AbstractPromotionServiceImpl.java

@@ -7,22 +7,20 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.chelvc.cloud.vehicle.api.constant.PromotionScopeType;
-import com.chelvc.cloud.vehicle.api.util.PromotionUtils;
+import com.chelvc.cloud.vehicle.api.constant.PromotionStatus;
+import com.chelvc.cloud.vehicle.api.param.BasePromotionQueryParam;
 import com.chelvc.cloud.vehicle.server.entity.BasePromotion;
 import com.chelvc.cloud.vehicle.server.entity.PromotionGoods;
 import com.chelvc.cloud.vehicle.server.service.AbstractPromotionService;
 import com.chelvc.cloud.vehicle.server.service.PromotionGoodsService;
+import com.chelvc.cloud.vehicle.server.util.PromotionUtils;
 import com.chelvc.framework.base.exception.ResourceUnavailableException;
 import com.chelvc.framework.common.util.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 抽象通用促销服务业务操作实现
@@ -100,12 +98,12 @@ public abstract class AbstractPromotionServiceImpl<M extends BaseMapper<T>, T ex
      */
     @Override
     @Transactional(rollbackFor = {Exception.class})
-    public boolean updateStatus(List<Long> ids, Long startTime, Long endTime) {
+    public boolean updateStatus(List<Long> ids, Date startTime, Date endTime) {
         List<T> promotionsList = this.list(new QueryWrapper<T>().in("id", ids));
         for (T t : promotionsList) {
             if (startTime != null && endTime != null) {
-                t.setStartTime(new Date(startTime));
-                t.setEndTime(new Date(endTime));
+                t.setStartTime(startTime);
+                t.setEndTime(endTime);
             } else {
                 t.setStartTime(null);
                 t.setEndTime(null);
@@ -115,9 +113,11 @@ public abstract class AbstractPromotionServiceImpl<M extends BaseMapper<T>, T ex
             this.updateEsGoodsIndex(t);
         }
         if (startTime != null && endTime != null) {
-            return this.update(new UpdateWrapper<T>().in("id", ids).set("start_time", new Date(startTime)).set("end_time", new Date(endTime)));
+            return this.update(new UpdateWrapper<T>().in("id", ids)
+                    .set("start_time", startTime).set("end_time", endTime));
         } else {
-            return this.update(new UpdateWrapper<T>().in("id", ids).set("start_time", null).set("end_time", null));
+            return this.update(new UpdateWrapper<T>().in("id", ids)
+                    .set("start_time", null).set("end_time", null));
         }
     }
 
@@ -235,4 +235,43 @@ public abstract class AbstractPromotionServiceImpl<M extends BaseMapper<T>, T ex
         }
     }
 
+    @Override
+    public <S extends BasePromotionQueryParam> List<T> listFindAll(S queryParam) {
+        QueryWrapper<T> queryWrapper = this.baseQueryWrapper(queryParam);
+
+        if (CharSequenceUtil.isNotEmpty(queryParam.getPromotionStatus())) {
+            queryWrapper.and(i -> {
+                for (String status : queryParam.getPromotionStatus().split(",")) {
+                    i.or(PromotionUtils.queryPromotionStatus(PromotionStatus.valueOf(status)));
+                }
+            });
+        }
+        return this.list(queryWrapper);
+    }
+
+    public <T> QueryWrapper<T> baseQueryWrapper(BasePromotionQueryParam queryParam) {
+        QueryWrapper<T> queryWrapper = new QueryWrapper<>();
+
+        if (!Objects.isNull(queryParam.getId())) {
+            queryWrapper.eq("id", queryParam.getId());
+        }
+        if (queryParam.getStartTime() != null) {
+            queryWrapper.ge("start_time", queryParam.getStartTime());
+        }
+        if (queryParam.getEndTime() != null) {
+            queryWrapper.le("end_time", queryParam.getEndTime());
+        }
+        if (!Objects.isNull(queryParam.getScopeType())) {
+            queryWrapper.eq("scope_type", queryParam.getScopeType());
+        }
+        if (CharSequenceUtil.isNotEmpty(queryParam.getMerchantId())) {
+            if ("platform".equals(queryParam.getMerchantId())) {
+                queryWrapper.ne("merchant_id", PromotionUtils.PLATFORM_ID);
+            } else {
+                queryWrapper.in("merchant_id", Arrays.asList(queryParam.getMerchantId().split(",")));
+            }
+        }
+        queryWrapper.eq("deleted", false);
+        return queryWrapper;
+    }
 }

+ 7 - 20
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/CouponActivityServiceImpl.java

@@ -4,27 +4,18 @@ import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.chelvc.cloud.uc.api.service.UserService;
-import com.chelvc.cloud.vehicle.api.constant.CouponActivitySendType;
-import com.chelvc.cloud.vehicle.api.constant.CouponActivityType;
-import com.chelvc.cloud.vehicle.api.constant.PromotionScopeType;
-import com.chelvc.cloud.vehicle.api.constant.PromotionStatus;
-import com.chelvc.cloud.vehicle.api.constant.PromotionType;
-import com.chelvc.cloud.vehicle.api.constant.UserCouponStatus;
+import com.chelvc.cloud.vehicle.api.constant.*;
 import com.chelvc.cloud.vehicle.api.dto.CouponActivityDTO;
 import com.chelvc.cloud.vehicle.api.param.CouponActivityModifyParam;
 import com.chelvc.cloud.vehicle.api.param.CouponActivityPagingParam;
-import com.chelvc.cloud.vehicle.api.util.PromotionUtils;
 import com.chelvc.cloud.vehicle.server.copier.CouponActivityCopier;
 import com.chelvc.cloud.vehicle.server.dao.CouponActivityMapper;
-import com.chelvc.cloud.vehicle.server.entity.Coupon;
-import com.chelvc.cloud.vehicle.server.entity.CouponActivity;
-import com.chelvc.cloud.vehicle.server.entity.CouponActivityItem;
-import com.chelvc.cloud.vehicle.server.entity.User;
-import com.chelvc.cloud.vehicle.server.entity.UserCoupon;
+import com.chelvc.cloud.vehicle.server.entity.*;
 import com.chelvc.cloud.vehicle.server.service.CouponActivityItemService;
 import com.chelvc.cloud.vehicle.server.service.CouponActivityService;
 import com.chelvc.cloud.vehicle.server.service.CouponService;
 import com.chelvc.cloud.vehicle.server.service.UserCouponService;
+import com.chelvc.cloud.vehicle.server.util.PromotionUtils;
 import com.chelvc.framework.base.exception.ResourceUnavailableException;
 import com.chelvc.framework.base.util.ResourceUtils;
 import com.chelvc.framework.common.model.Pagination;
@@ -33,17 +24,14 @@ import com.chelvc.framework.redis.cache.Cache;
 import com.chelvc.framework.redis.cache.CachePrefix;
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -61,9 +49,8 @@ public class CouponActivityServiceImpl extends AbstractPromotionServiceImpl<Coup
     private final CouponService couponService;
     private final UserCouponService userCouponService;
     private final CouponActivityItemService couponActivityItemService;
+    private final Cache<List<CouponActivity>> cache;
 
-    @Autowired
-    private Cache<List<CouponActivity>> cache;
 
     @Override
     public Long addCouponActivity(@NonNull CouponActivityModifyParam param) {
@@ -162,7 +149,7 @@ public class CouponActivityServiceImpl extends AbstractPromotionServiceImpl<Coup
     @Transactional(rollbackFor = {Exception.class})
     public boolean updatePromotionsGoods(CouponActivity couponActivity) {
         boolean result = super.updatePromotionsGoods(couponActivity);
-        if (!PromotionStatus.CLOSE.name().equals(couponActivity.getPromotionStatus())
+        if (!PromotionStatus.CLOSE.name().equals(couponActivity.getPromotionsStatus())
                 && PromotionScopeType.PORTION_GOODS.equals(couponActivity.getScopeType())) {
             //创建优惠券活动子列表
             for (CouponActivityItem couponActivityItem : couponActivity.getCouponActivityItems()) {

+ 102 - 30
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/CouponServiceImpl.java

@@ -1,19 +1,23 @@
 package com.chelvc.cloud.vehicle.server.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.text.CharSequenceUtil;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.chelvc.cloud.vehicle.api.constant.CouponType;
-import com.chelvc.cloud.vehicle.api.constant.PromotionScopeType;
-import com.chelvc.cloud.vehicle.api.constant.PromotionType;
+import com.chelvc.cloud.vehicle.api.constant.*;
 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.api.param.FullDiscountQueryParam;
+import com.chelvc.cloud.vehicle.api.param.PromotionGoodsQueryParam;
 import com.chelvc.cloud.vehicle.server.copier.CouponCopier;
 import com.chelvc.cloud.vehicle.server.dao.CouponMapper;
 import com.chelvc.cloud.vehicle.server.entity.Coupon;
+import com.chelvc.cloud.vehicle.server.entity.FullDiscount;
 import com.chelvc.cloud.vehicle.server.entity.Goods;
-import com.chelvc.cloud.vehicle.server.service.CouponService;
-import com.chelvc.cloud.vehicle.server.service.GoodsService;
+import com.chelvc.cloud.vehicle.server.entity.PromotionGoods;
+import com.chelvc.cloud.vehicle.server.service.*;
+import com.chelvc.cloud.vehicle.server.util.PromotionUtils;
 import com.chelvc.framework.base.exception.ResourceUnavailableException;
 import com.chelvc.framework.base.util.ResourceUtils;
 import com.chelvc.framework.common.model.Pagination;
@@ -26,9 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
-import java.util.Collection;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -43,6 +45,10 @@ public class CouponServiceImpl extends AbstractPromotionServiceImpl<CouponMapper
         com.chelvc.cloud.vehicle.api.service.CouponService {
 
     private final GoodsService goodsService;
+    private final UserCouponService userCouponService;
+    private final CouponActivityItemService couponActivityItemService;
+    private final PromotionGoodsService promotionGoodsService;
+    private final FullDiscountService fullDiscountService;
 
     @Override
     public List<CouponDTO> listUserGoodsActiveCoupons(@NonNull Long userId, Collection<Long> goodsCouponIds) {
@@ -52,8 +58,6 @@ public class CouponServiceImpl extends AbstractPromotionServiceImpl<CouponMapper
     @Override
     public Long addCoupon(@NonNull CouponModifyParam param) {
         Coupon coupon = CouponCopier.INSTANCE.copying(param);
-        coupon.setUsedNum(0);
-        coupon.setReceivedNum(0);
         this.save(coupon);
         return coupon.getId();
     }
@@ -62,7 +66,14 @@ public class CouponServiceImpl extends AbstractPromotionServiceImpl<CouponMapper
     public void updateCoupon(@NonNull Long id, @NonNull CouponModifyParam param) {
         Coupon coupon = ResourceUtils.required(this.getById(id), "优惠券不存在");
         CouponCopier.INSTANCE.copying(param, coupon);
+        // 检查促销状态
+        this.checkStatus(coupon);
+        // 检查促销参数
+        this.checkPromotion(coupon);
+        // 修改优惠券信息
         this.updateById(coupon);
+        // 更新促销商品信息
+        this.updatePromotionsGoods(coupon);
     }
 
     @Override
@@ -74,9 +85,31 @@ public class CouponServiceImpl extends AbstractPromotionServiceImpl<CouponMapper
     @Override
     public CouponDTO getCoupon(@NonNull Long id) {
         Coupon coupon = ResourceUtils.required(this.getById(id), "优惠券不存在");
+        List<PromotionGoods> promotionGoods = this.promotionGoodsService
+                .listFindAll(PromotionGoodsQueryParam.builder().promotionId(id).build());
+        if (CollectionUtil.isNotEmpty(promotionGoods)) {
+            coupon.setPromotionGoodsList(promotionGoods);
+        }
         return this.convert(coupon);
     }
 
+    @Override
+    public Long saveCoupon(@NonNull CouponModifyParam param) {
+        Coupon coupon = CouponCopier.INSTANCE.copying(param);
+        if (PromotionUtils.PLATFORM_ID.equals(coupon.getMerchantId())) {
+            coupon.setMerchantName(PromotionUtils.PLATFORM_NAME);
+        }
+        // 初始化促销信息
+        this.initPromotion(coupon);
+        // 检查促销参数
+        this.checkPromotion(coupon);
+        // 保存优惠券信息
+        this.save(coupon);
+        // 更新促销商品信息
+        this.updatePromotionsGoods(coupon);
+        return coupon.getId();
+    }
+
     @Override
     public Pagination<CouponDTO> getCouponPaging(@NonNull CouponPagingParam param) {
         // 查询优惠券列表
@@ -97,6 +130,20 @@ public class CouponServiceImpl extends AbstractPromotionServiceImpl<CouponMapper
         return PagingUtils.convert(page, clients);
     }
 
+    @Override
+    public void updateCouponStatus(@NonNull CouponModifyParam param) {
+        this.updateStatus(param.getIds(), param.getStartTime(), param.getEndTime());
+    }
+
+    @Override
+    public void batchDeleteCoupon(@NonNull List<Long> ids) {
+        // 关闭用户优惠券信息
+        this.userCouponService.closeUserCoupon(ids);
+        // 删除优惠券关联优惠券活动
+        this.couponActivityItemService.removeByCouponId(ids);
+        super.removePromotion(ids);
+    }
+
     @Override
     public Pagination<CouponDTO> getMerchantCouponPaging(@NonNull Long merchantId, @NonNull CouponPagingParam param) {
         // 查询优惠券列表
@@ -126,20 +173,28 @@ public class CouponServiceImpl extends AbstractPromotionServiceImpl<CouponMapper
     }
 
     @Override
-    public boolean updatePromotion(Coupon promotions) {
-        return super.updatePromotion(promotions);
-    }
+    public boolean updateStatus(List<Long> ids, Date startTime, Date endTime) {
+        List<Coupon> coupons = this.lambdaQuery()
+                .in(Coupon::getId, ids)
+                .eq(Coupon::getRangeDayType, CouponRangeDay.DYNAMICTIME).list();
+        if (!coupons.isEmpty()) {
+            LambdaUpdateWrapper<Coupon> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.in(Coupon::getId, coupons.stream().map(Coupon::getId).collect(Collectors.toList()));
+            updateWrapper.set(Coupon::getEffectiveDays, 0);
+            updateWrapper.set(Coupon::getPromotionStatus, PromotionStatus.CLOSE);
+            this.update(updateWrapper);
+        }
 
-    @Override
-    public boolean updateStatus(List<Long> ids, Long startTime, Long endTime) {
+        // 关闭优惠券,删除相关会员优惠券和券活动
+        if (startTime == null && endTime == null) {
+            //关闭用户优惠券信息
+            this.userCouponService.closeUserCoupon(ids);
+            //删除优惠券关联优惠券活动
+            this.couponActivityItemService.removeByCouponId(ids);
+        }
         return super.updateStatus(ids, startTime, endTime);
     }
 
-    @Override
-    public boolean removePromotion(List<Long> ids) {
-        return super.removePromotion(ids);
-    }
-
     @Override
     public void initPromotion(Coupon coupon) {
         coupon.setUsedNum(0);
@@ -186,23 +241,40 @@ public class CouponServiceImpl extends AbstractPromotionServiceImpl<CouponMapper
     }
 
     @Override
-    public void checkStatus(Coupon promotion) {
-        super.checkStatus(promotion);
-    }
-
-    @Override
-    public boolean updatePromotionsGoods(Coupon promotion) {
-        return super.updatePromotionsGoods(promotion);
+    public void checkStatus(Coupon coupon) {
+        super.checkStatus(coupon);
+        FullDiscountQueryParam queryParam = new FullDiscountQueryParam();
+        queryParam.setCouponFlag(true);
+        queryParam.setCouponId(coupon.getId());
+        queryParam.setPromotionStatus(PromotionStatus.START.name());
+        List<FullDiscount> fullDiscounts = fullDiscountService.listFindAll(queryParam);
+        if (fullDiscounts != null && !fullDiscounts.isEmpty()) {
+            throw new ResourceUnavailableException("当前优惠券参与了促销活动【" + fullDiscounts.get(0).getPromotionName()
+                    + "】不能进行编辑删除操作");
+        }
     }
 
     @Override
-    public void updateEsGoodsIndex(Coupon promotion) {
-        super.updateEsGoodsIndex(promotion);
+    public boolean updatePromotionsGoods(Coupon coupon) {
+        boolean result = super.updatePromotionsGoods(coupon);
+        if (!PromotionStatus.CLOSE.equals(coupon.getPromotionStatus()) &&
+                PromotionScopeType.PORTION_GOODS.equals(coupon.getScopeType())) {
+            this.promotionGoodsService.deletePromotionGoods(Collections.singletonList(coupon.getId()));
+            List<PromotionGoods> promotionGoodsList = PromotionUtils.promotionGoodsInit(coupon.getPromotionGoodsList(),
+                    coupon, this.getPromotionType());
+            for (PromotionGoods promotionGoods : promotionGoodsList) {
+                promotionGoods.setMerchantId(coupon.getMerchantId());
+                promotionGoods.setMerchantName(coupon.getMerchantName());
+            }
+            //促销活动商品更新
+            result = this.promotionGoodsService.saveBatch(promotionGoodsList);
+        }
+        return result;
     }
 
     @Override
     public PromotionType getPromotionType() {
-        return null;
+        return PromotionType.COUPON;
     }
 
     /**

+ 33 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/FullDiscountServiceImpl.java

@@ -0,0 +1,33 @@
+package com.chelvc.cloud.vehicle.server.service.impl;
+
+import com.chelvc.cloud.vehicle.api.constant.PromotionType;
+import com.chelvc.cloud.vehicle.server.dao.FullDiscountMapper;
+import com.chelvc.cloud.vehicle.server.entity.FullDiscount;
+import com.chelvc.cloud.vehicle.server.service.FullDiscountService;
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
+
+/**
+ * 满优惠业务操作实现
+ *
+ * @author qizai
+ * @date 2023/11/14
+ */
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+@DubboService(interfaceClass = com.chelvc.cloud.vehicle.api.service.FullDiscountService.class)
+public class FullDiscountServiceImpl extends AbstractPromotionServiceImpl<FullDiscountMapper, FullDiscount> implements FullDiscountService,
+        com.chelvc.cloud.vehicle.api.service.FullDiscountService {
+
+    @Override
+    public void deletePromotionGoods(List<Long> promotionIds) {
+        this.removeByIds(promotionIds);
+    }
+
+    @Override
+    public PromotionType getPromotionType() {
+        return PromotionType.FULL_DISCOUNT;
+    }
+}

+ 16 - 1
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/PromotionGoodsServiceImpl.java

@@ -1,14 +1,19 @@
 package com.chelvc.cloud.vehicle.server.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.chelvc.cloud.vehicle.api.param.PromotionGoodsQueryParam;
 import com.chelvc.cloud.vehicle.server.dao.PromotionGoodsMapper;
 import com.chelvc.cloud.vehicle.server.entity.PromotionGoods;
 import com.chelvc.cloud.vehicle.server.service.PromotionGoodsService;
+import com.chelvc.framework.common.util.StringUtils;
+import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 促销商品业务操作实现
@@ -22,7 +27,17 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
         com.chelvc.cloud.vehicle.api.service.PromotionGoodsService {
 
     @Override
-    public void deletePromotionGoods(List<Long> promotionIds) {
+    public void deletePromotionGoods(@NonNull List<Long> promotionIds) {
         this.removeByIds(promotionIds);
     }
+
+    @Override
+    public List<PromotionGoods> listFindAll(@NonNull PromotionGoodsQueryParam param) {
+        return this.lambdaQuery()
+                .eq(!Objects.isNull(param.getPromotionId()), PromotionGoods::getPromotionId, param.getPromotionId())
+                .eq(!Objects.isNull(param.getPromotionType()), PromotionGoods::getPromotionType, param.getPromotionType())
+                .like(StringUtils.nonEmpty(param.getGoodsName()), PromotionGoods::getGoodsName, param.getGoodsName())
+                .like(StringUtils.nonEmpty(param.getCategoryPath()), PromotionGoods::getCategoryPath, param.getCategoryPath())
+                .in(CollectionUtil.isNotEmpty(param.getPromotionIds()), PromotionGoods::getPromotionId, param.getPromotionIds()).list();
+    }
 }

+ 11 - 2
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/UserCouponServiceImpl.java

@@ -1,6 +1,7 @@
 package com.chelvc.cloud.vehicle.server.service.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.chelvc.cloud.vehicle.api.constant.CouponClaimType;
@@ -10,13 +11,13 @@ 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 com.chelvc.cloud.vehicle.server.util.PromotionUtils;
 import com.chelvc.framework.base.context.SessionContextHolder;
 import com.chelvc.framework.base.exception.ResourceUnavailableException;
 import com.chelvc.framework.base.util.ResourceUtils;
@@ -162,6 +163,14 @@ public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCou
         }
     }
 
+    @Override
+    public void closeUserCoupon(List<Long> couponIds) {
+        LambdaUpdateWrapper<UserCoupon> updateWrapper = new LambdaUpdateWrapper<UserCoupon>()
+                .in(UserCoupon::getCouponId, couponIds)
+                .set(UserCoupon::getUserCouponStatus, UserCouponStatus.CLOSED);
+        this.update(updateWrapper);
+    }
+
     /**
      * 转换优惠券领取记录信息
      *

+ 112 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/util/PromotionUtils.java

@@ -0,0 +1,112 @@
+package com.chelvc.cloud.vehicle.server.util;
+
+import cn.hutool.core.text.CharSequenceUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.chelvc.cloud.vehicle.api.constant.PromotionStatus;
+import com.chelvc.cloud.vehicle.api.constant.PromotionType;
+import com.chelvc.cloud.vehicle.server.entity.BasePromotion;
+import com.chelvc.cloud.vehicle.server.entity.PromotionGoods;
+import com.chelvc.framework.common.util.DateUtils;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Consumer;
+
+/**
+ * 优惠活动通用验证类
+ *
+ * @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 Long PLATFORM_ID = 0L;
+    public static final String PLATFORM_NAME = "platform";
+
+    /**
+     * 参数验证
+     * 1、活动起始时间必须大于当前时间
+     * 2、验证活动开始时间是否大于活动结束时间
+     *
+     * @param startTime 活动开始时间
+     * @param endTime   活动结束时间
+     */
+    public static void checkPromotionTime(Date startTime, Date endTime) {
+        if (startTime == null) {
+            throw new RuntimeException("活动起始时间不能为空");
+        }
+
+        Date now = DateUtils.today();
+
+        //如果活动起始时间小于现在时间
+        if (now.after(startTime)) {
+            throw new RuntimeException("活动起始时间不能小于当前时间");
+        }
+        //如果活动结束时间小于现在时间
+        if (endTime != null && now.after(endTime)) {
+            throw new RuntimeException("活动结束时间不能小于当前时间");
+        }
+        //开始时间不能大于结束时间
+        if (endTime != null && startTime.after(endTime)) {
+            throw new RuntimeException("活动起始时间必须大于结束时间");
+        }
+    }
+
+    /**
+     * 促销商品入库前填充
+     *
+     * @param originList 原促销商品列表
+     * @param promotion  促销信息
+     * @return 促销商品列表
+     */
+    public static List<PromotionGoods> promotionGoodsInit(List<PromotionGoods> originList, BasePromotion promotion,
+                                                          PromotionType promotionType) {
+        if (originList != null) {
+            //本次促销商品入库
+            for (PromotionGoods promotionGoods : originList) {
+                promotionGoods.setPromotionId(promotion.getId());
+                if (Objects.isNull(promotionGoods.getMerchantId())) {
+                    promotionGoods.setMerchantId(promotion.getMerchantId());
+                }
+                if (CharSequenceUtil.isEmpty(promotionGoods.getMerchantName())) {
+                    promotionGoods.setMerchantName(promotion.getMerchantName());
+                }
+                promotionGoods.setTitle(promotion.getPromotionName());
+                // 如果是秒杀活动保留原时间
+                if (promotionGoods.getStartTime() == null || !PromotionType.SECKILL.equals(promotionType)) {
+                    promotionGoods.setStartTime(promotion.getStartTime());
+                }
+                if (promotionGoods.getStartTime() == null || !PromotionType.SECKILL.equals(promotionType)) {
+                    promotionGoods.setEndTime(promotion.getEndTime());
+                }
+                promotionGoods.setPromotionType(promotionType);
+                promotionGoods.setNum(0);
+                promotionGoods.setDeleted(promotion.getDeleted());
+            }
+        }
+        return originList;
+    }
+
+    public static <T> Consumer<QueryWrapper<T>> queryPromotionStatus(PromotionStatus promotionStatus) {
+        switch (promotionStatus) {
+            case NEW:
+                return (QueryWrapper<T> t) -> t.nested(i -> i.gt(START_TIME_COLUMN, new Date())
+                        .gt(END_TIME_COLUMN, new Date()));
+            case START:
+                return (QueryWrapper<T> t) -> t.nested(i -> i.le(START_TIME_COLUMN, new Date())
+                        .ge(END_TIME_COLUMN, new Date()));
+            case END:
+                return (QueryWrapper<T> t) -> t.nested(i -> i.lt(START_TIME_COLUMN, new Date())
+                        .lt(END_TIME_COLUMN, new Date()));
+            case CLOSE:
+                return (QueryWrapper<T> t) -> t.nested(i -> i.isNull(START_TIME_COLUMN).isNull(END_TIME_COLUMN));
+            default:
+                return null;
+        }
+    }
+}

+ 5 - 0
vehicle-server/src/main/resources/mapper/FullDiscountMapper.xml

@@ -0,0 +1,5 @@
+<?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.FullDiscountMapper">
+
+</mapper>