当前位置: 首页 > 后端技术 > Java

一次卡券系统的现场建模实践

时间:2023-04-01 18:21:17 Java

下面分享一下小伙伴雷宇和张聪在优惠券系统的野外建模总结。1、引入领域建模的原因模型转换:将数据库模型转换成实体模型,最后操作实体模型持久化到数据库存储(一个id可以表示只有一张优惠券)行为内聚:使用DDD领域实体模型,将优惠券相关行为内聚到实体(查询、收藏、折扣计算、优惠券自动选择、使用)进行扩展:优惠券种类繁多,但大同小异。针对不同类型的优惠券,实现基本功能(全折券、津贴、优惠券、优惠券),弥合数据来源差异,隐藏实现细节,如根据不同用户发放个性化优惠券等。优惠券(不同的面额门槛适用于不同的人),通过统一的领域模型隐藏此类优惠券的使用差异;模型可以灵活转换实现复用,例如在劝买会员等预付费场景,我们使用预付费接收优惠券(实际用户没有这种优惠券),将Coupon模型转为UserCoupon模型实现复用折扣计算;2、实体设计优惠券:解决用户领取基础优惠券的问题。EntityCoupon提供了所有优惠券的基础能力(包括查询优惠券信息、转账、领取、预收、计算内部提供的优惠金额)重点重写不同类型优惠券(折扣券、打折券、allowances,fulldiscountcoupon),在用户未获取优惠券的场景下,如商户详情、劝购会员等,通过Coupon.receiveInAdvance将模型转化为UserCoupon,UserCoupon负责复杂的使用规则校验,并且只支持函数的核心金额计算部分;用户优惠券:对外提供折扣计算、消费、退货等基础用户优惠券UserCoupon,提供用户优惠券的所有基础能力(包括查询用户优惠券信息、折算、优惠金额计算、自动选择优惠券、消费、退款);用户全额Coupon折扣,用户折扣券,用户折扣券,用户津贴用于计算不同类型优惠券的折扣金额,选择可用的SKU;隐藏千人一张券和千人一千券的不同构建过程,隐藏真实和预收券的能力差异,实现模型的高度复用;exchangecoupons接收兑换券(引用redeemableCoupon实体)缓存并序列化,因为Voucher引入了Coupon实体,而Coupon实体本身已经被缓存,所以Voucher的缓存交给SerializableVoucher,只持久化couponId;用户兑换券消费能力:兑换商品,兑换优惠券(指Voucher实体),兑换后使用同一个UserCoupon3.核心码领取条件:通过(渠道,用户身份,收藏)等不同维度时间、领取方式、领取数量)等验证使用条件:通过(门槛、用户身份、使用对象spu、使用时间、使用平台/方式、订单限额)等不同维度进行验证。预领券:VIP劝购、宠粉券计算折扣等,提前为满足客观条件的用户预收抵扣。优惠券自动选择:帮助用户根据优惠券折扣金额、有效期、门槛、优惠券类型等条件,自动选择最合适的优惠券。4.主线流程退票