package cn.iocoder.yudao.module.promotion.controller.admin.reward.vo; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.validation.InEnum; import cn.iocoder.yudao.module.promotion.enums.common.PromotionConditionTypeEnum; import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.Valid; import jakarta.validation.constraints.AssertTrue; import jakarta.validation.constraints.Future; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; import lombok.Data; import java.time.LocalDateTime; import java.util.List; import java.util.Map; import java.util.Objects; /** * 满减送活动 Base VO,提供给添加、修改、详细的子 VO 使用 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data public class RewardActivityBaseVO { @Schema(description = "活动标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "满啦满啦") @NotNull(message = "活动标题不能为空") private String name; @Schema(description = "开始时间", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "开始时间不能为空") private LocalDateTime startTime; @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "结束时间不能为空") @Future(message = "结束时间必须大于当前时间") private LocalDateTime endTime; @Schema(description = "备注", example = "biubiubiu") private String remark; @Schema(description = "条件类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "条件类型不能为空") @InEnum(value = PromotionConditionTypeEnum.class, message = "条件类型必须是 {value}") private Integer conditionType; @Schema(description = "商品范围", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "商品范围不能为空") @InEnum(value = PromotionProductScopeEnum.class, message = "商品范围必须是 {value}") private Integer productScope; @Schema(description = "商品范围编号的数组", example = "[1, 3]") private List productScopeValues; /** * 优惠规则的数组 */ @Valid // 校验下子对象 private List rules; @Schema(description = "优惠规则") @Data public static class Rule { @Schema(description = "优惠门槛", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") // 1. 满 N 元,单位:分; 2. 满 N 件 @Min(value = 1L, message = "优惠门槛必须大于等于 1") private Integer limit; @Schema(description = "优惠价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") @Min(value = 1L, message = "优惠价格必须大于等于 1") private Integer discountPrice; @Schema(description = "是否包邮", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") @NotNull(message = "规则是否包邮不能为空") private Boolean freeDelivery; @Schema(description = "赠送的积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") private Integer point; @Schema(description = "赠送的优惠劵编号的数组") private Map giveCouponTemplateCounts; @AssertTrue(message = "赠送的积分不能小于 0") @JsonIgnore public boolean isPointValid() { return point == null || point >= 0; } } @AssertTrue(message = "商品范围编号的数组不能为空") @JsonIgnore public boolean isProductScopeValuesValid() { return Objects.equals(productScope, PromotionProductScopeEnum.ALL.getScope()) // 全部范围时,可以为空 || CollUtil.isNotEmpty(productScopeValues); } }