碰碰好评卡功能落地实战指南 从需求梳理到上线全流程开发经验分享
碰碰好评卡功能落地实战指南 从需求梳理到上线全流程开发经验分享
在电商、本地生活等服务场景中,用户真实评价是商户运营的核心核心参考指标,也是新用户消费决策的重要依据。碰碰好评卡作为连接「用户评价行为」和「权益激励」的工具,既能降低用户评价门槛,也能帮助商户提升真实好评率,但其落地过程中涉及多角色协同、规则校验、权益一致性等多个技术难点。本文将从需求梳理到上线全流程,分享实战过程中的技术选型、开发经验与风险规避方案。
一、需求梳理与功能边界定义
在功能启动前,首先要明确核心业务目标与边界,避免后续开发过程中出现需求蔓延或合规风险。
核心需求拆解
我们按角色拆分需求,复用现有本地生活服务系统的订单、权益、用户模块能力,减少重复开发:
- 用户端:订单完成后按规则收到好评卡入口,提交符合平台规范的评价后自动获取对应权益,可在个人中心查看权益到账状态,支持小程序、公众号、H5、APP多端访问。
- 商户端:可自定义所属店铺的好评卡触发条件、权益类型,查看本店铺好评卡的发放量、使用率、好评转化率等数据,支持修改规则上下线。
- 平台管理端:可配置全局好评卡规则,审核商户提交的好评卡内容是否合规,查看全平台的好评数据统计,支持异常订单的手动干预。
功能边界明确
为了符合监管要求,避免违规诱导评价,我们明确以下不可突破的边界:
- 好评卡仅可关联真实评价行为,不得强制要求用户好评、晒图、追评或提供评价截图;
- 触发范围仅限已完成、无有效售后纠纷的订单,订单完成超过指定时间后不再触发;
- 同一用户在同一商户30天内仅可领取一次好评卡,避免羊毛党批量刷权益。
二、技术架构选型与核心数据模型设计
为了和现有业务技术栈对齐,降低团队学习成本,我们沿用成熟的Java生态技术栈,同时兼顾多端适配需求。
架构选型
- 后端服务:采用Spring Boot + JPA + MySQL的组合,轻量易维护,和现有业务的服务治理体系完全兼容,支持快速迭代;
- 用户端:基于UniApp开发,一次开发可适配小程序、H5、APP、公众号等多个端,代码复用率可达90%以上;
- 管理端:使用Vue + ElementUI搭建,可视化配置页面开发效率高,符合运营人员的使用习惯。
核心数据模型设计
我们设计了两张核心表支撑全流程流转,通过索引和约束避免数据异常,以下为建表语句示例:
-- 好评卡规则配置表CREATETABLE`praise_card_rule`(`id`bigintNOTNULLAUTO_INCREMENTCOMMENT'主键ID',`merchant_id`bigintNOTNULLDEFAULT'0'COMMENT'商户ID,0为全局规则',`trigger_order_status`tinyintNOTNULLDEFAULT'4'COMMENT'触发的订单状态:4=已完成',`trigger_delay_hour`intNOTNULLDEFAULT'24'COMMENT'订单完成后多久触发,单位小时',`award_type`tinyintNOTNULLDEFAULT'1'COMMENT'权益类型:1=优惠券 2=积分 3=免单资格',`award_config`jsonDEFAULTNULLCOMMENT'权益配置,存储优惠券ID、积分数量等',`valid_days`intNOTNULLDEFAULT'7'COMMENT'好评卡有效期,单位天',`status`tinyintNOTNULLDEFAULT'1'COMMENT'状态:0=禁用 1=启用',`create_time`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMP,`update_time`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,PRIMARYKEY(`id`),KEY`idx_merchant_id`(`merchant_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='好评卡规则配置表';-- 好评卡发放记录表CREATETABLE`praise_card_record`(`id`bigintNOTNULLAUTO_INCREMENTCOMMENT'主键ID',`user_id`bigintNOTNULLCOMMENT'用户ID',`order_id`bigintNOTNULLCOMMENT'关联订单ID',`rule_id`bigintNOTNULLCOMMENT'关联规则ID',`trigger_time`datetimeDEFAULTNULLCOMMENT'触发时间',`receive_time`datetimeDEFAULTNULLCOMMENT'领取时间',`award_grant_status`tinyintNOTNULLDEFAULT'0'COMMENT'权益发放状态:0=未发放 1=发放成功 2=发放失败',`create_time`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMP,`update_time`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,PRIMARYKEY(`id`),UNIQUEKEY`uk_order_id`(`order_id`),KEY`idx_user_id`(`user_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='好评卡发放记录表';模型设计上通过uk_order_id索引保证一个订单只会发放一张好评卡,避免重复触发;award_config用JSON类型存储不同权益的配置,支持灵活扩展,后续新增权益类型不需要修改表结构。
三、核心功能模块开发实战
3.1 触发规则引擎实现
我们基于Spring Boot的SpEL表达式实现轻量级规则引擎,不需要引入额外中间件,规则支持在管理端可视化编辑,核心校验逻辑示例如下:
/** * 校验订单是否符合好评卡触发条件 * @param orderId 订单ID * @param userId 用户ID * @param merchantId 商户ID * @return 是否符合触发条件 */publicbooleancheckTriggerCondition(LongorderId,LonguserId,LongmerchantId){Orderorder=orderService.getById(orderId);// 校验订单状态是否为已完成if(order.getStatus()!=OrderStatusEnum.FINISHED.getCode()){returnfalse;}// 校验是否存在有效售后申请if(afterSaleService.existValidAfterSale(orderId)){returnfalse;}// 校验用户30天内是否在该商户领取过好评卡LongreceiveCount=praiseCardRecordService.lambdaQuery().eq(PraiseCardRecord::getUserId,userId).eq(PraiseCardRecord::getMerchantId,merchantId).ge(PraiseCardRecord::getCreateTime,LocalDateTime.now().minusDays(30)).count();if(receiveCount>0){returnfalse;}// 其他自定义规则校验returntrue;}3.2 权益发放一致性保证
好评提交和权益发放是两个独立的操作,为了避免出现「用户评价成功但权益未到账」的一致性问题,我们采用本地消息表+定时补偿的方案:用户提交好评后,先在同一事务内写入好评成功记录和待发放权益的本地消息,事务提交后发送MQ通知权益中心发放权益;同时后台有定时任务每5分钟扫描超时未发放的权益,自动重试3次,失败后进入人工处理队列,终保证权益发放成功率达到99.9%以上。
3.3 多端适配实现
基于UniApp的跨端能力,我们只开发了一套好评卡的前端页面,不同端的逻辑通过条件编译实现,比如小程序端到小程序原生优惠券列表页面,APP端到原生我的权益页面,UI层代码完全复用,大大降低了多端开发的人力成本。
四、上线验证与迭代优化
上线前测试覆盖
我们做了多维度的测试保证功能稳定性:
- 功能测试覆盖正常流程、边界场景(订单完成刚好超过有效期、用户评价不符合规范、权益库存不足等),共覆盖32个测试用例,通过率100%;
- 性能测试用JMeter模拟1000QPS的触发请求,数据库无慢查询,接口平均响应时间低于200ms,满足大促场景的性能要求。
灰度发布策略
我们采用分阶段灰度的方式上线,降低全量发布的风险:
- 阶段:仅开放给内部测试商户,收集日志排查隐藏问题,运行3天无异常后进入下一阶段;
- 第二阶段:开放给10%的活跃商户,监控错误率、触发成功率、权益发放成功率三个核心指标,运行7天指标均符合预期后进入下一阶段;
- 第三阶段:全量开放,同时开启监控告警,核心指标低于99.9%时立即触发告警通知开发人员排查。
上线后的数据显示,商户的平均好评率提升了27%,权益发放成功率稳定在99.95%,无资损风险,达到了预期的业务目标。后续我们还可以基于现有的数据模型,扩展好评内容审核、好评置顶等功能,进一步完善整个评价体系。