优惠券系统-规则枚举定义

138 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 15 天,点击查看活动详情

1.有效期类型

image.png

@Getter
@AllArgsConstructor
public enum PeriodType {

    REGULAR("固定的(固定日期)", 1),
    SHIFT("变动的(以领取之日开始计算)", 2);

    /** 有效期描述 */
    private String description;

    /** 有效期编码 */
    private Integer code;

    public static PeriodType of(Integer code) {

        Objects.requireNonNull(code);

        return Stream.of(values())
                .filter(bean -> bean.code.equals(code))
                .findAny()
                .orElseThrow(() -> new IllegalArgumentException(code + " not exists!"));
    }
}

代码说明:

标题
REGULAR表示固定日期的有效期,比如优惠券的有效期是固定从1号到20号,超过20号就无法使用
SHIFT变动的有效期,比如优惠券是1号领取的,有效期是2天,那么该优惠券两天之后就过期了

2.新增TempalteRule 优惠券规则对象定义

image.png

2.1 定义折扣规则

@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Discount {

    /** 额度: 满减(20), 折扣(85), 立减(10) */
    private Integer quota;

    /** 基准, 需要满多少才可用 */
    private Integer base;

    boolean validate() {

        return quota > 0 && base > 0;
    }
}

代码说明:

标题
quota优惠券折扣的额度,优惠20元,还是立减10元,或者总价打85折
base满多少才能使用优惠券
validate额度和折扣基准的简单判断

2.2 使用范围

image.png 代码部分:

/**
 * <h2>使用范围</h2>
 * */
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Usage {

    /** 省份 */
    private String province;

    /** 城市 */
    private String city;

    /** 商品类型, list[文娱, 生鲜, 家居, 全品类] */
    private String goodsType;

    boolean validate() {

        return StringUtils.isNotEmpty(province)
                && StringUtils.isNotEmpty(city)
                && StringUtils.isNotEmpty(goodsType);
    }
}

代码说明:

标题
province使用范围为省份
city使用范围为城市
goodsType具体优惠的是哪些品类

2.3 有效期限规则

image.png

代码部分:

/**
 * <h2></h2>
 * */
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Expiration {

    /** 有效期规则, 对应 PeriodType 的 code 字段 */
    private Integer period;

    /** 有效间隔: 只对变动性有效期有效 */
    private Integer gap;

    /** 优惠券模板的失效日期, 两类规则都有效 */
    private Long deadline;

    boolean validate() {
        // 最简化校验
        return null != PeriodType.of(period) && gap > 0 && deadline > 0;
    }
}

代码说明:

标题
private Integer period有效期的类型值
private Integer gap有效期变动值
private Long deadline失效时间