分享一下组内小伙伴雷羽、张聪在优惠券零碎上落地领域建模的总结
一、引入领域建模的起因模型转换:
- 将数据库模型转换为实体模型,最终操作实体模型长久化到数据库保留(一个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、宠粉券计算优惠等,提前给满足客观条件的用户预领抵扣
- 主动选券:通过优惠券优惠金额、过期工夫、门槛、优惠券类型等条件帮用户主动选出最为适合的券
四、主线流程
- 领券
- 用券
- 退还