package com.ycwl.basic.pricing.service; import com.ycwl.basic.pricing.dto.DiscountDetectionContext; import com.ycwl.basic.pricing.dto.DiscountInfo; import com.ycwl.basic.pricing.dto.DiscountResult; import java.util.List; /** * 优惠提供者接口 * 所有优惠类型(coupon、voucher、促销活动等)都需要实现此接口 */ public interface IDiscountProvider { /** * 获取提供者类型 * @return 提供者类型标识,如 "COUPON", "VOUCHER", "FLASH_SALE" 等 */ String getProviderType(); /** * 获取优先级 * @return 优先级,数字越大优先级越高 */ int getPriority(); /** * 检测可用的优惠 * @param context 优惠检测上下文 * @return 可用的优惠列表 */ List detectAvailableDiscounts(DiscountDetectionContext context); /** * 应用优惠 * @param discountInfo 要应用的优惠信息 * @param context 优惠检测上下文 * @return 优惠应用结果 */ DiscountResult applyDiscount(DiscountInfo discountInfo, DiscountDetectionContext context); /** * 验证优惠是否可以应用 * @param discountInfo 优惠信息 * @param context 优惠检测上下文 * @return 是否可以应用 */ default boolean canApply(DiscountInfo discountInfo, DiscountDetectionContext context) { return true; } /** * 获取优惠的最大可能折扣金额(用于排序) * @param discountInfo 优惠信息 * @param context 优惠检测上下文 * @return 最大可能折扣金额 */ default java.math.BigDecimal getMaxPossibleDiscount(DiscountInfo discountInfo, DiscountDetectionContext context) { return discountInfo.getDiscountAmount() != null ? discountInfo.getDiscountAmount() : java.math.BigDecimal.ZERO; } }