package com.ycwl.basic.pricing.service; import com.ycwl.basic.pricing.dto.DiscountDetectionContext; import com.ycwl.basic.pricing.dto.VoucherInfo; import com.ycwl.basic.pricing.dto.resp.VoucherBatchOverviewResp; import com.ycwl.basic.pricing.dto.resp.VoucherDetailResp; import com.ycwl.basic.pricing.dto.resp.VoucherUsageSummaryResp; import java.math.BigDecimal; import java.util.List; /** * 券码服务接口 */ public interface IVoucherService { /** * 验证并获取券码信息 * @param voucherCode 券码 * @param faceId 用户faceId * @param scenicId 景区ID * @return 券码信息(如果有效) */ VoucherInfo validateAndGetVoucherInfo(String voucherCode, Long faceId, Long scenicId); /** * 获取用户在指定景区的可用券码列表 * @param faceId 用户faceId * @param scenicId 景区ID * @return 可用券码列表 */ List getAvailableVouchers(Long faceId, Long scenicId); /** * 标记券码为已使用 * @param voucherCode 券码 * @param remark 使用备注 * @param faceId 人脸ID */ void markVoucherAsUsed(String voucherCode, String remark, Long faceId); void markVoucherAsUsed(String voucherCode, String remark, String orderId, BigDecimal discountAmount, Long faceId); /** * 检查用户是否可以在指定景区领取券码 * @param faceId 用户faceId * @param scenicId 景区ID * @return 是否可以领取 */ boolean canClaimVoucher(Long faceId, Long scenicId); /** * 获取该faceId在scenicId下的券码详情列表 * @param faceId 用户面部ID * @param scenicId 景区ID * @return 券码详情列表,包含所有状态的券码(已领取未使用、已使用等),如果没有券码则返回空列表 */ List getVoucherDetails(Long faceId, Long scenicId); /** * 计算券码优惠金额 * @param voucherInfo 券码信息 * @param context 检测上下文 * @return 优惠金额 */ BigDecimal calculateVoucherDiscount(VoucherInfo voucherInfo, DiscountDetectionContext context); /** * 获取券码详细信息 * @param voucherCode 券码 * @param faceId 用户人脸ID(可选) * @return 券码详细信息 */ VoucherDetailResp getVoucherDetail(String voucherCode, Long faceId); /** * 获取券码使用统计摘要 * @param voucherCode 券码 * @return 券码使用统计摘要 */ VoucherUsageSummaryResp getVoucherUsageSummary(String voucherCode); /** * 获取批次券码概览 * @param batchId 批次ID * @return 批次概览信息 */ VoucherBatchOverviewResp getBatchOverview(Long batchId); /** * 获取最优的券码(如果用户有多个可用券码) * @param faceId 用户faceId * @param scenicId 景区ID * @param context 检测上下文 * @return 最优券码信息 */ VoucherInfo getBestVoucher(Long faceId, Long scenicId, DiscountDetectionContext context); }