开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 15 天,点击查看活动详情
1.有效期类型
@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 优惠券规则对象定义
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 使用范围
代码部分:
/**
* <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 有效期限规则
代码部分:
/**
* <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 | 失效时间 |