package com.doumee.service.business; import com.doumee.core.douyin.dto.DouyinBaseResp; import com.doumee.core.douyin.dto.DouyinBoundProduct; import com.doumee.core.douyin.dto.DouyinCancelParam; import com.doumee.core.douyin.dto.DouyinPrepareParam; import com.doumee.core.douyin.dto.DouyinPrepareResp; import com.doumee.core.douyin.dto.DouyinVerifyParam; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.dao.business.model.DouyinVerifyRecord; import com.doumee.dao.business.vo.DouyinVerifyRecordPageVO; /** * 抖音券核销 Service 定义 * * @author rk * @date 2026/06/22 */ public interface DouyinVerifyService { /** * 验券准备:扫码/输码 → 返回券列表 + verifyToken */ DouyinBaseResp prepare(DouyinPrepareParam param); /** * 验券(核销),并落核销记录 * @param operator 操作人ID(由调用端传入,web 端取登录会员ID) */ DouyinVerifyRecord verify(DouyinVerifyParam param, String operator); /** * 验券(核销),使用调用方已校验好的套餐绑定结果(scanVerify 核销前校验后调用)。 *

核销成功后直接用 boundProduct 开通套餐,不再重复查询商品/套餐。 * @param param 核销入参 * @param operator 操作人ID * @param boundProduct 核销前已校验的抖音商品 + 本地套餐(scanVerify 传入) */ DouyinVerifyRecord verify(DouyinVerifyParam param, String operator, DouyinBoundProduct boundProduct); /** * 核销前校验:按 skuId 校验抖音商品在库且已绑定有效本地套餐。 *

scanVerify 在核销前调用,失败抛业务异常(券尚未核销,避免抖音已核销但本地未开卡的不一致)。 * @param skuId 核销券对应的抖音 SKU ID * @return 抖音商品 + 绑定的本地套餐(供 verify 开卡复用) */ DouyinBoundProduct resolveBoundProduct(String skuId); /** * 撤销核销(核销后 1 小时内),更新记录撤销状态 * @param operator 操作人ID(由调用端传入,web 端取登录会员ID) */ DouyinVerifyRecord cancel(DouyinCancelParam param, String operator); /** * 按 discountMemberId 把套餐卡详情填到 record.packageInfo(scanVerify 展示用)。 *

无套餐卡ID或查不到时,packageInfo 置 null,不影响主流程。 * * @param record 核销记录(含 discountMemberId) */ void fillPackageInfo(DouyinVerifyRecord record); /** * 核销记录分页(web 端小程序自用,简单分页) */ PageData findPage(PageWrap pageWrap); /** * 核销记录分页(管理端对外):LEFT JOIN discount_member/member/douyin_product, * 带出订单编号、会员openid/手机号(脱敏)、团购商品名、抖音券名、类目、兑换人、状态文案。 * 查询条件:抖音券码、验券状态、撤销状态。 */ PageData findManagePage(PageWrap pageWrap); /** * 核销记录详情 */ DouyinVerifyRecord findById(String id); }