package cn.lili.modules.promotion.entity.dto.search; import cn.hutool.core.text.CharSequenceUtil; import cn.lili.modules.promotion.entity.enums.*; import cn.lili.modules.promotion.tools.PromotionTools; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; import java.util.Date; /** * 优惠券查询通用类 * * @author paulG * @since 2020/8/14 **/ @EqualsAndHashCode(callSuper = true) @Data public class CouponSearchParams extends BasePromotionsSearchParams implements Serializable { private static final long serialVersionUID = 4566880169478260409L; private static final String PRICE_COLUMN = "price"; private static final String RANGE_DAY_TYPE_COLUMN = "range_day_type"; @ApiModelProperty(value = "会员id") private String memberId; @ApiModelProperty(value = "优惠券名称") private String couponName; /** * POINT("打折"), PRICE("减免现金"); * * @see cn.lili.modules.promotion.entity.enums.CouponTypeEnum */ @ApiModelProperty(value = "活动类型") private String couponType; /** * @see PromotionsScopeTypeEnum */ @ApiModelProperty(value = "关联范围类型") private String scopeType; @ApiModelProperty(value = "范围关联的id") private String scopeId; @ApiModelProperty(value = "面额,可以为范围,如10_1000") private String price; @ApiModelProperty(value = "发行数量,可以为范围,如10_1000") private String publishNum; @ApiModelProperty(value = "已被领取的数量,可以为范围,如10_1000") private String receivedNum; /** * @see cn.lili.modules.promotion.entity.enums.CouponGetEnum */ @ApiModelProperty(value = "优惠券类型,分为免费领取和活动赠送") private String getType; @Override public QueryWrapper queryWrapper() { QueryWrapper queryWrapper = super.baseQueryWrapper(); if (CharSequenceUtil.isNotEmpty(couponName)) { queryWrapper.like("coupon_name", couponName); } if (memberId != null) { queryWrapper.eq("member_id", memberId); } if (CharSequenceUtil.isNotEmpty(couponType)) { queryWrapper.eq("coupon_type", CouponTypeEnum.valueOf(couponType).name()); } if (CharSequenceUtil.isNotEmpty(scopeType)) { queryWrapper.eq("scope_type", PromotionsScopeTypeEnum.valueOf(scopeType).name()); } if (CharSequenceUtil.isNotEmpty(scopeId)) { queryWrapper.eq("scope_id", scopeId); } if (CharSequenceUtil.isNotEmpty(getType)) { queryWrapper.eq("get_type", CouponGetEnum.valueOf(getType).name()); } if (CharSequenceUtil.isNotEmpty(this.getPromotionStatus())) { queryWrapper.and(p -> { switch (PromotionsStatusEnum.valueOf(this.getPromotionStatus())) { case NEW: p.nested(i -> i.gt(PromotionTools.START_TIME_COLUMN, new Date()).gt(PromotionTools.END_TIME_COLUMN, new Date())); break; case START: p.nested(i -> i.le(PromotionTools.START_TIME_COLUMN, new Date()).ge(PromotionTools.END_TIME_COLUMN, new Date())) .or(i -> i.gt("effective_days", 0).eq(RANGE_DAY_TYPE_COLUMN, CouponRangeDayEnum.DYNAMICTIME.name())); break; case END: p.nested(i -> i.lt(PromotionTools.START_TIME_COLUMN, new Date()).lt(PromotionTools.END_TIME_COLUMN, new Date())); break; case CLOSE: p.nested(n -> n.nested(i -> i.isNull(PromotionTools.START_TIME_COLUMN).isNull(PromotionTools.END_TIME_COLUMN) .eq(RANGE_DAY_TYPE_COLUMN, CouponRangeDayEnum.FIXEDTIME.name())). or(i -> i.le("effective_days", 0).eq(RANGE_DAY_TYPE_COLUMN, CouponRangeDayEnum.DYNAMICTIME.name()))); break; default: } }); } if (this.getStartTime() != null) { queryWrapper.ge("start_time", new Date(this.getStartTime())); } if (this.getEndTime() != null) { queryWrapper.le("end_time", new Date(this.getEndTime())); } this.betweenWrapper(queryWrapper); queryWrapper.orderByDesc("create_time"); return queryWrapper; } private void betweenWrapper(QueryWrapper queryWrapper) { if (CharSequenceUtil.isNotEmpty(publishNum)) { String[] s = publishNum.split("_"); if (s.length > 1) { queryWrapper.between("publish_num", s[0], s[1]); } else { queryWrapper.ge("publish_num", s[0]); } } if (CharSequenceUtil.isNotEmpty(price)) { String[] s = price.split("_"); if (s.length > 1) { queryWrapper.between(PRICE_COLUMN, s[0], s[1]); } else { queryWrapper.ge(PRICE_COLUMN, s[0]); } } if (CharSequenceUtil.isNotEmpty(receivedNum)) { String[] s = receivedNum.split("_"); if (s.length > 1) { queryWrapper.between("received_num", s[0], s[1]); } else { queryWrapper.ge("received_num", s[0]); } } } }