☰
折扣卡业务逻辑拆解,会员权益后台设计
2026/10/14 5:05:26 网站建设 项目流程

折扣卡业务逻辑拆解,会员权益后台设计

多商户同城折扣卡平台里,会员权益后台是整个权益流转的配置中枢,承载卡模板、会员等级、核销范围、分账、过期回收、权益补发等能力。很多后台开发时直接把折扣规则硬编码,新增权益类型、调整门店范围就要改代码;会员、折扣卡、普通优惠券混在一套逻辑里,出现权限越界、权益重复发放、核销规则冲突、商户看不到自有会员数据等问题。本文从业务痛点出发,拆解折扣卡完整业务链路,同时给出会员权益后台模块设计方案,附带Java规则校验代码,适配多商户本地生活系统开发。

业务痛点分析

第一,权益规则耦合严重。折扣、次卡、满减、会员专属价写死在业务代码,运营后台无法可视化配置门槛、适用门店、有效期。 第二,会员与折扣卡体系混淆。会员是身份,折扣卡是权益资产,两套逻辑混在一起,分不清权益是会员自带,还是单独购买的卡券。 第三,多商户权限管控缺失。商户可以修改联盟通用卡规则,或者查看其他商户会员信息,存在数据安全风险。 第四,权益生命周期缺少闭环。到期自动失效、过期回收、退款回滚权益、补发权益没有统一流程,大量无效权益堆积。 第五,核销校验逻辑分散。订单、收银台、门店PDA各自写一套校验,规则不一致,出现有的设备可以核销、有的拦截的情况。 第六,缺少版本留痕,规则修改无记录。折扣比例、分账比例改动之后,无法追溯历史配置,对账出现问题难以定位原因。

折扣卡核心业务链路拆解

折扣卡的完整链路分为配置、发放、持有、核销、结算、回收六个阶段,会员权益后台负责第一阶段的规则定义,下游领卡、核销、分账模块读取配置执行。 配置阶段:平台或者商户在后台创建折扣卡模板,选择权益类型,配置核销门店范围、折扣比例、使用次数、有效期、是否和会员等级联动、分账规则; 发放阶段:用户购买、领取、活动赠送生成用户权益资产,权益资产绑定用户、模板、发放渠道; 持有阶段:后台支持查看会员名下全部权益,支持冻结、补发、手动作废,用于客诉处理; 核销阶段:核销中心读取模板规则+会员身份,判断是否可用,扣减次数或者标记已使用; 结算阶段:核销成功后读取模板内预设分账规则,异步生成分账流水; 回收阶段:到期、退款、订单取消触发权益回滚,次数返还或者直接作废。 会员身份是前置条件,可配置:任意用户可用、仅付费会员可用、指定会员等级可用,实现会员专属折扣卡玩法。 技术栈采用SpringBoot、MyBatisPlus、Redis、MQ,规则配置缓存Redis,权益变更、过期回收走MQ异步任务,避免定时任务压库。

会员权益后台模块划分

后台整体划分为六大子模块,模块之间低耦合: 权益模板管理:折扣卡、次卡、满减券模板新增、编辑、上下架、版本记录,支持配置适用门店分组、会员等级门槛; 会员等级管理:配置等级升级条件、等级自带权益、升级奖励折扣卡; 会员档案管理:会员基础信息、名下全部权益资产、消费核销记录,支持打标签; 权益操作工作台:权益补发、冻结、作废、批量延期,用于客服处理客诉; 权限与商户隔离:区分平台管理员、商户管理员、店员,商户只能管理自己创建的模板、自己门店的会员核销数据; 权益数据看板:领卡量、核销量、过期量、会员权益使用率、各门店权益核销排行。

核心数据表设计要点

核心五张表:权益模板表、模板门店关联表、会员等级配置表、用户权益资产表、权益变更流水表。 权益模板表记录权益类型、折扣比例、最大使用次数、有效期类型、是否会员专属、分账规则ID、版本号;模板门店关联表绑定模板和可核销门店;会员等级配置表存储升级条件、自带权益;用户权益资产表是用户持有资产,每一条代表一张折扣卡;权益变更流水记录发放、核销、冻结、补发、过期、退款回滚全部操作,作为唯一对账凭证。 模板修改时新增版本,历史资产继续沿用旧版本规则,新领取权益读取新版本,避免老卡规则错乱。

会员权益规则校验核心代码实现

统一的规则校验服务,订单、小程序、PDA核销端都调用这个服务,保证规则统一。

@Service public class BenefitRuleCheckService { @Autowired private BenefitTemplateMapper benefitTemplateMapper; @Autowired private TemplateStoreRelMapper templateStoreRelMapper; @Autowired private MemberLevelService memberLevelService; public ResultDTO checkBenefitRule(Long userId, Long userBenefitId, Long storeId, BigDecimal orderAmount){ UserBenefit userBenefit = userBenefitMapper.selectById(userBenefitId); if(userBenefit == null || !userBenefit.getStatus().equals(0)){ return ResultDTO.fail("权益不存在或者已失效"); } BenefitTemplate template = benefitTemplateMapper.selectById(userBenefit.getTemplateId()); // 校验会员等级门槛 if(template.getMemberLevelLimit() != null){ Integer userLevel = memberLevelService.getUserMemberLevel(userId); if(userLevel < template.getMemberLevelLimit()){ return ResultDTO.fail("该权益仅限指定等级会员使用"); } } // 校验门店范围 Long relCount = templateStoreRelMapper.selectCount(Wrappers.lambdaQuery() .eq(TemplateStoreRel::getTemplateId, template.getId()) .eq(TemplateStoreRel::getStoreId, storeId)); if(relCount <= 0){ return ResultDTO.fail("该折扣卡不可在当前门店使用"); } // 校验最低消费门槛 if(template.getMinConsume() != null && orderAmount.compareTo(template.getMinConsume()) < 0){ return ResultDTO.fail("未达到最低消费门槛"); } // 校验次数和有效期 if(userBenefit.getUsedCount() >= template.getMaxUseCount()){ return ResultDTO.fail("该折扣卡使用次数已用尽"); } if(LocalDateTime.now().isAfter(userBenefit.getExpireTime())){ return ResultDTO.fail("权益已过期"); } return ResultDTO.success("校验通过", template); } }

权限隔离与模板版本管控

权限采用行级数据隔离,商户管理员查询模板时,自动追加商户ID过滤条件,商户只能编辑自己创建的模板;联盟通用模板仅平台管理员可以修改,商户仅可查看,不能改动折扣和分账规则。 每次保存模板自动生成版本快照,后台可以查看历史版本、回滚配置;每一次修改记录操作人、修改时间、变更内容,满足运营审计需求。模板下架不会影响已经发放出去的用户资产,只是停止新用户领取。

权益生命周期自动化处理

过期任务通过MQ延迟队列实现,到达过期时间自动标记权益过期,生成过期流水; 订单退款触发权益回滚:如果是一次性折扣卡,恢复为可用;如果是次卡,返还对应次数;回滚同样写入变更流水; 批量操作能力:后台支持选中一批权益批量延期、批量冻结,适合门店活动延期、风控批量冻结羊毛用户权益,批量操作记录批量任务ID,方便追溯。

风控、落地优化要点

风控层面,后台配置单用户每日领卡上限、单模板总库存上限,高频领取、短时间多设备领取的会员自动标记风险标签,权益发放拦截; 模板配置、门店范围、会员等级规则缓存Redis,每次校验优先读缓存,模板编辑后主动清除对应缓存; 权益变更流水按月分表,减少历史数据查询压力;后台看板统计指标:权益领取转化率、核销率、过期率、会员专属权益使用率; 后台对外输出统一权益接口,小程序领卡、收银核销、PDA核销、营销活动赠卡全部复用这套规则,后续新增积分权益、储值权益,只需要扩展模板类型,不用改动全部校验链路。

这套会员权益后台设计,把规则统一收口,区分会员身份和折扣卡资产,适配多商户联盟场景,和跨门店核销、分销结算、用户增长模块无缝对接,方便运营可视化配置各类折扣权益,降低迭代开发成本。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询