分享一下组内小伙伴雷羽、张聪在优惠券零碎上落地领域建模的总结
一、引入领域建模的起因模型转换:
- 将数据库模型转换为实体模型,最终操作实体模型长久化到数据库保留(一个 id 即可示意有且仅有一张优惠券)
- 行为内聚:应用 DDD 畛域实体模型,使优惠券相干行为内聚到实体(查问、支付、折扣计算、主动选券、应用)
- 面向扩大:优惠券品种繁多,却又大同小异,针对不同类型优惠券实现根底函数(满减券、津贴、折扣券、抵扣券)
- 向上弥合数据源差别,暗藏实现细节,比方依据不同的用户发放个性化的优惠券(不同的人面额门槛适用范围不一样),通过对立的畛域模型暗藏掉该种券在应用等方面的差别;
- 模型灵便转换实现复用,比方在劝 buy 会员等预支场景,咱们通过预支付优惠券(理论用户并没有该优惠券)将 Coupon 模型转化为 UserCoupon 模型,来实现优惠计算的复用;
二、实体设计
- 优惠券:解决用户支付问题
- 根底优惠券畛域实体 Coupon,提供优惠券所有根底能力(蕴含查问优惠券信息出参转换、支付、预支付、对内提供的优惠金额计算能力)
- 聚焦不同类型券重写优惠金额计算(折扣券、抵扣券、津贴、满减券),在诸如商详、劝 buy 会员等用户未取得该券的场景下,通过 Coupon.receiveInAdvance 将模型转换为 UserCoupon,由 UserCoupon 对立承当简单的应用规定验证,仅撑持外围的金额计算局部性能;
- 用户优惠券:对外提供优惠计算、生产、偿还等能力
- 根底用户优惠券 UserCoupon,提供用户优惠券所有根底能力(蕴含查问用户优惠券信息出参转换、计算优惠金额、主动选券、生产、退还);
- 用户满减券、用户折扣券、用户抵扣券、用户津贴针对不同类型券实现优惠金额计算、选取可用 sku;
- 暗藏千人一券、千人千券的不同结构过程,暗藏实在与预支付优惠券的能力差异,实现模型的高度复用;
- 兑换券支付兑换券(援用可兑换的优惠券 Coupon 实体)
- 缓存与序列化,因为 Voucher 引入 Coupon 实体,Coupon 实体自身曾经缓存,所以 Voucher 的缓存交由 SerializableVoucher,仅长久化 couponId;
- 用户兑换券生产能力:兑换商品、兑换优惠券应用(援用 Voucher 实体)兑换后应用同 UserCoupon 三、外围代码支付条件:通过不同维度如(渠道、用户身份、支付工夫、支付形式、支付数量)等校验
- 应用条件:通过不同维度如(门槛、用户身份、应用对象 spu、应用工夫、应用平台 / 形式、订单限度)等校验
- 预领券:VIP 劝 Buy、宠粉券计算优惠等,提前给满足客观条件的用户预领抵扣
- 主动选券:通过优惠券优惠金额、过期工夫、门槛、优惠券类型等条件帮用户主动选出最为适合的券
四、主线流程
- 领券
- 用券
- 退还