package com.ycwl.basic.pricing.service; import com.ycwl.basic.pricing.dto.BundleDiscountInfo; import com.ycwl.basic.pricing.dto.DiscountDetectionContext; import com.ycwl.basic.pricing.dto.ProductItem; import java.math.BigDecimal; import java.util.List; /** * 打包购买优惠服务接口 */ public interface IBundleDiscountService { /** * 检测可用的打包优惠 * * @param context 优惠检测上下文 * @return 可用的打包优惠列表 */ List detectAvailableBundleDiscounts(DiscountDetectionContext context); /** * 计算打包优惠金额 * * @param bundleDiscount 打包优惠信息 * @param products 商品列表 * @return 优惠金额 */ BigDecimal calculateBundleDiscount(BundleDiscountInfo bundleDiscount, List products); /** * 检查是否符合打包条件 * * @param products 商品列表 * @param minQuantity 最少数量要求 * @param minAmount 最少金额要求 * @return 是否符合条件 */ boolean isEligibleForBundle(List products, Integer minQuantity, BigDecimal minAmount); /** * 根据商品类型和数量获取打包优惠规则 * * @param products 商品列表 * @param scenicId 景区ID(可选) * @return 匹配的打包优惠规则 */ List getBundleDiscountRules(List products, Long scenicId); /** * 验证打包优惠是否仍然有效 * * @param bundleDiscount 打包优惠信息 * @param context 优惠检测上下文 * @return 是否有效 */ boolean isBundleDiscountValid(BundleDiscountInfo bundleDiscount, DiscountDetectionContext context); /** * 获取最优的打包优惠组合 * * @param products 商品列表 * @param scenicId 景区ID(可选) * @return 最优打包优惠 */ BundleDiscountInfo getBestBundleDiscount(List products, Long scenicId); }