package cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.validation.InEnum; import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum; import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; import cn.iocoder.yudao.module.promotion.enums.coupon.CouponTemplateValidityTypeEnum; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.AssertTrue; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; import java.util.List; import java.util.Objects; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT; /** * 优惠劵模板 Base VO,提供给添加、修改、详细的子 VO 使用 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data public class CouponTemplateBaseVO { @Schema(description = "优惠劵名", requiredMode = Schema.RequiredMode.REQUIRED, example = "春节送送送") @NotNull(message = "优惠劵名不能为空") private String name; @Schema(description = "优惠券说明", example = "优惠券使用说明") private String description; @Schema(description = "发行总量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") // -1 - 则表示不限制发放数量 @NotNull(message = "发行总量不能为空") private Integer totalCount; @Schema(description = "每人限领个数", requiredMode = Schema.RequiredMode.REQUIRED, example = "66") // -1 - 则表示不限制 @NotNull(message = "每人限领个数不能为空") private Integer takeLimitCount; @Schema(description = "领取方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "领取方式不能为空") private Integer takeType; @Schema(description = "是否设置满多少金额可用", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") // 单位:分;0 - 不限制 @NotNull(message = "是否设置满多少金额可用不能为空") private Integer usePrice; @Schema(description = "商品范围", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "商品范围不能为空") @InEnum(PromotionProductScopeEnum.class) private Integer productScope; @Schema(description = "商品范围编号的数组", example = "[1, 3]") private List productScopeValues; @Schema(description = "生效日期类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "生效日期类型不能为空") @InEnum(CouponTemplateValidityTypeEnum.class) private Integer validityType; @Schema(description = "固定日期 - 生效开始时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) private LocalDateTime validStartTime; @Schema(description = "固定日期 - 生效结束时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) private LocalDateTime validEndTime; @Schema(description = "领取日期 - 开始天数") @Min(value = 0L, message = "开始天数必须大于 0") private Integer fixedStartTerm; @Schema(description = "领取日期 - 结束天数") @Min(value = 1L, message = "开始天数必须大于 1") private Integer fixedEndTerm; @Schema(description = "优惠类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "优惠类型不能为空") @InEnum(PromotionDiscountTypeEnum.class) private Integer discountType; @Schema(description = "折扣百分比", example = "80") // 例如说,80% 为 80 private Integer discountPercent; @Schema(description = "优惠金额", example = "10") @Min(value = 0, message = "优惠金额需要大于等于 0") private Integer discountPrice; @Schema(description = "折扣上限", example = "100") // 单位:分,仅在 discountType 为 PERCENT 使用 private Integer discountLimitPrice; @AssertTrue(message = "商品范围编号的数组不能为空") @JsonIgnore public boolean isProductScopeValuesValid() { return Objects.equals(productScope, PromotionProductScopeEnum.ALL.getScope()) // 全部范围时,可以为空 || CollUtil.isNotEmpty(productScopeValues); } @AssertTrue(message = "生效开始时间不能为空") @JsonIgnore public boolean isValidStartTimeValid() { return ObjectUtil.notEqual(validityType, CouponTemplateValidityTypeEnum.DATE.getType()) || validStartTime != null; } @AssertTrue(message = "生效结束时间不能为空") @JsonIgnore public boolean isValidEndTimeValid() { return ObjectUtil.notEqual(validityType, CouponTemplateValidityTypeEnum.DATE.getType()) || validEndTime != null; } @AssertTrue(message = "开始天数不能为空") @JsonIgnore public boolean isFixedStartTermValid() { return ObjectUtil.notEqual(validityType, CouponTemplateValidityTypeEnum.TERM.getType()) || fixedStartTerm != null; } @AssertTrue(message = "结束天数不能为空") @JsonIgnore public boolean isFixedEndTermValid() { return ObjectUtil.notEqual(validityType, CouponTemplateValidityTypeEnum.TERM.getType()) || fixedEndTerm != null; } @AssertTrue(message = "折扣百分比需要大于等于 1,小于等于 99") @JsonIgnore public boolean isDiscountPercentValid() { return ObjectUtil.notEqual(discountType, PromotionDiscountTypeEnum.PERCENT.getType()) || (discountPercent != null && discountPercent >= 1 && discountPercent<= 99); } @AssertTrue(message = "优惠金额不能为空") @JsonIgnore public boolean isDiscountPriceValid() { return ObjectUtil.notEqual(discountType, PromotionDiscountTypeEnum.PRICE.getType()) || discountPrice != null; } @AssertTrue(message = "折扣上限不能为空") @JsonIgnore public boolean isDiscountLimitPriceValid() { return ObjectUtil.notEqual(discountType, PromotionDiscountTypeEnum.PERCENT.getType()) || discountLimitPrice != null; } }