首页 > 其他分享 >券后价复杂根源和解法

券后价复杂根源和解法

时间:2024-10-23 09:09:59浏览次数:1  
标签:关系 券后 优惠 用户 门店 商品 根源 解法

券后价领域划分不清楚

券后价在电商系统中是个很奇怪的存在

无论是按商品领域还是营销领域划分,它都不合适归类到这两者中间。结果就是券后价是个很不理想的拆分逻辑。

券后价可以理解是商品的价格属性,这个属性是由营销来计算控制。领域划分可以理解为商品领域,营销做计算!核心承接方为营销,只有营销才知道哪些优惠适用哪些商品,哪些人拥有优惠。

所以券后价是营销承接商品领域的算价能力。

在营销领域,券后价到底是工具活动领域还是券领域也是模糊不清

第一感觉是,券领域。要知道,有些券是没发到手上,也要显示券后价,所以,券后价称之为优惠活动价更为准确。

而目前的逻辑是,券也是活动的生成的。本质上是记录用户与能参与活动的凭证,所以,将券后价服务划分到营销工具领域更合适。

券后价是不确定的价格

确定的价格

券后价是指一个商品通过优惠工具,显示购买时预计的一个价格。

所以,券后价准确与否一直是个很难界定的需求。

大多数场景下,券后价一定是用户购买时的价格一致,否则就是价格欺诈!

不确定的价格

而有些场景下,券后价只是一个参考价,如首件优惠、折扣价。用户可以买到这个价格的商品,但这个价格是有一定条件的。在显示价格的时候,需要特殊处理。

影响价格的并不只是优惠,还有商品本身的售卖价格也会调整。就导致一个价格由多个团队决定。

券后价规则复杂

各种大类的叠加互斥,平行规则的叠加互斥,优先级计算和各种显示规则等。规则多的需要用文档维护,早期没有产品主导的系统混乱不堪。


计算券后价所需要的条件

计算券后价,首先是三个主要主体-用户、商品、优惠。

计算的主要参数,用户id,商品id列表

  1. 找出用户拥有的优惠
  2. 跟据商品列表查询商品的价格等信息
  3. 建立商品与优惠的关系
  4. 计算价格

找出用户所拥有的优惠

用户找优惠券

一个用户能够拥有的只有券、余额、积分、会员、省钱卡等这类拥有用户属性的权益。

而在计算券后价时,是不会在价格中体现出余额、积分、会员等这些用户资产。

计算券后价时,只会拥有平台发给用户的券,外加平台给商品的降价工具影响价格。

那么就可以从用户获得券来切入。

在公司平台里,用户获得券一定是在建立的活动之上,活动投放会有区域。而每个用户在不同门店,可能参与的活动不一样,那么在投放侧,是可以精准备投放活动到门店。而用户只需要关心当前门店拥有哪些活动。或者在这个门店,门店是否拥有能力发券等。

如果公司平台的建营销权益工具只有指定门店,那么用户一定只需要关注在当前门店是否领取过券或者可以参与哪些权益活动。

这里权益活动包含领券活动和促销价活动。

商品也不应该有区域之分,这个商品能够在哪个门店卖,哪些门店有活动等,这里一定是有某种联系才能使整个系统较为合理的运转

按上图逻辑来说,这个用户与门店、商品、营销工具的联系就非常简单了。

用户查询营销工具的范围就可以通过所在门店找到对应的权益工具。而建工具最简单的办法就是跟据圈的门店建门店与活动的关系,这层关系就是用来查询用户的权益工具的索引。实现方式可以从简单的数据建表,到redis建key,甚至redis用map等都可以作为性能优化的手段,这一块就是体现真正技术实力的时候了。

那些圈选区域,排除区域,甚至黑名单门店,歇业门店不参与等活动规则全部让门店线做了。

最为关键的是,如何将这块数据流转起来,设计模型是最为重要的。

到这里,查询用户所拥有的优惠就变成了单表查询。

查询的时候,再过滤掉一些优惠的自身规则,如状态、过期时间等。

领域建模

  1. 商品
  2. 优惠工具
  3. 用户
  4. 门店

营销领域,能影响商品展示价格的只有优惠(优惠价、优惠券)。余额和换购不会影响价格展示,只在购物车和结算页时,进一步对全部商品作价格减免。

能影响有没有优惠的只有用户与门店。用户是指有没有优惠券,门店是指优惠价有没有投放到这个门店。

商品找优惠,为什么是商品找优惠,而不是优惠找商品。在真实的券后价计算中,一个用户和所在的门店基本是不变的,而变动的只有商品。所以,优惠不容易变,方便用来缓存。而前端页面每动一下商品就变了,对变动很大的参数常常用来作计算。这样就比较好的利用了各自的特性简化逻辑和提升性能。

领域模型基本信息

商品、用户、门店信息都非常简单,都有对应的业务线提供基本数据。优惠信息相对较多且乱,但如果用领域模型重新归类一下。领域模型不关心底层如何存储,只关心自身领域模型在创建的时候,由谁提供数据源。

优惠领域在创建的过程将要收集营销工具所有的信息,并归类好,将会是个很庞大的工程。

建立商品与优惠的关系

商品信息有了,优惠信息有了,这个商品适用于哪些优惠等,优惠叠加、互斥、优先级等,都需要在建立关系这一步将全部归类清楚,只有在这一步归类好了。后面计算就是简单的加减法了。下面展开讲一下如何建立商品与优惠的关系。

商品选优惠

  1. 优惠价工具&商品关系:优惠价工具是由商品建的索引查询出来的,在查询的时候,就可以将此关系建立。建立关系时,优惠工具的状态、库存、圈品等规则依次枚举判断,这个关系是个实体对象在内存中。
  2. 优惠券工具&商品关系:优惠券适用于这个商品一般分2种关系。一种单品券,一对一关系。一种多品券,一对多关系。

商品选优惠是指先把能建的关系建好,后面在考虑优先、互斥、排除等。这层关系一直都在,如果有排除,只是将商品与优惠的关系改个状态,如失效掉之类的。这样,在券列表中为什么不能使用这个优惠直接拿这个关系状态就好了。

优惠叠加

产品定义:单品券与多品券、余额、购物卡可叠加。在实现过程中有了【商品&单品优惠关系】不影响建立【商品&多品优惠关系】,同理也不影响其他关系的建立。

产品定义:单品促销价与多品促销价、新人价等价格工具互斥,只享受优惠力度最大的。如果有了【商品&单品促销关系】,再有满减促销价更大的优惠来时,跟据优惠大小失效掉原来的单品促销价关系。

优惠优先级

先排序,后失效关系。

  1. 按产品逻辑定义。价格优先级是促销价格>单品券>多品券>余额>购物卡。在关系优先级排序后,要将排在后面的关系失效掉。
  2. 按产品逻辑定义。同类促销价不同类型的降价工具有优先级:单品定价>新人价>特价>单品价>满减价>折扣价。在关系优先级排序后,要将排在后面的关系失效掉。

优惠互斥

同类互斥规则:排序完后,就会有一个商品同时作用于多个同类优惠的情况,对于这种情况,产品定义优惠大的优先。在排序后,失效掉排在后面的关系。

不同类互斥:就失效掉优先级低的。

整个关系的建立就是一个核心,这样逻辑非常明显的体现出整个规则适用过程。这个时候领域模型就能大行其道,简化逻辑判断。

用户自己选择优惠顺序(券后价无需要计算)

用户能选择的优惠只有多品券,在同类商品有多个多品券的排序中,增加一个最高优先级排序,即用户自己选择的优惠排最前。


计算价格

每个商品能够适用的优惠关系建立完后,计算价格就是一个非常简单的事了。越是简单的操作,越不容易出错。以售卖商品这个领域对象作为整个计算的聚合根模型,将这个商品的售卖价格属性、有效的券工具列表作为属性,做简单的减法。

  1. 找到这个商品有效的关系(自身属性)
  2. 将这个商品依次减价(自身方法)

当然还有一些特殊处理的逻辑减价,如折扣、首件优惠等,但本质上只是多了一种减价策略。


如券后价逻辑是这样清晰之后,再想想购物车逻辑,结算页逻辑。无非是在创建关系时,系统按规则建关系转变成可以由用户自己选择优惠,即用户手动改变规则建立商品与优惠的关系。

那些可用券列表,不可用券列表,不可用券原因,都是关系建立的结果。

在锁券时,逻辑将更简单,商品适用的关系已经有了,只需要将价格计算这一小步做成sdk就可以了。而计算价格这一步简直不要太简单。锁券真正关心的也就只有商品与优惠的库存还有没有,有就锁住库存,结束!

标签:关系,券后,优惠,用户,门店,商品,根源,解法
From: https://www.cnblogs.com/wxwall/p/18494390

相关文章

  • 【小 w 的代数】(提供一种 n^2 log 的解法)
    前言:卖点记录CTH的发言CTH:你这真是n^3的CTH:我也不知道你线段树优化个啥,\(n^3\logn\)CTH:你优化到哪了啊CTH:······你从赛时打这个题到现在11个小时了,你从\(n^3\)打到\(n^3\logn\)了CTH:······再怎么着,我也不会一道题调三天CTH:我一直都说这么打......
  • 【MySQL】设置二进制日志文件自动过期,从根源上解决占满磁盘的问题:通过修改 binlog_exp
    引言MySQL的二进制日志(binlog)文件记录了数据库中所有更改的详细信息,包括但不限于对数据的插入、删除、更新,对表和数据库的创建、更改、删除等操作。每一次这样的操作都会在二进制日志中生成一个新的日志事件,并被写入到一个新的二进制日志文件中。因此,如果数据库的活动量较......
  • 算法(第4版)练习题 3.3.20 的一种解法
    本文给出了对于《算法(第4版)》(以下简称原书或书)中的练习题3.3.20的一种解法。◆要求原书中的练习题3.3.20要求计算一棵大小为N且完美平衡的二叉查找树的内部路径长度,其中N为2的幂减1。◆解答N为2的幂减1的一颗完美平衡的二叉查找树是一棵满二叉树。在这样的......
  • 过滤器拦截器拦截了request后,controller的@RequestBody 无法获取request内容,报错 Requ
    SpringMVC的拦截器、过滤器、Controller之间的关系 众所周知所有的post请求中的body参数是已流形式存在的,而流数据只能读取一次(为啥看这里),如果在拦截器和过滤器中需要对post参数进行处理的话,就会报Requiredrequestbodyismissing异常。既然知道原因,那只要能将流保存起来......
  • 实验4-2-3-for 验证“哥德巴赫猜想C++解法
    #include<iostream>#include<cmath>boolvia(longlongi);usingnamespacestd;intmain(){  longlongn=0,i=3,p=0,q=0,a=0,b=0;  cin>>n;  if(n>4)  {    for(i=3;i<n/2;i+=2)    {......
  • 螺旋方阵C++解法
    #include<iostream>#include<vector>usingnamespacestd;#include<iomanip>intn;intmain(){   cin>>n;   vector<vector<int>>arr(n,vector<int>(n,0));   intx=0,y=0,s=1;   while(s<=n*......
  • v4501v.dll文件缺失或损坏?从根源入手轻松解决v4501v.dll文件报错
    当您在使用计算机时遇到“找不到v4501v.dll”或“v4501v.dll缺失/损坏”的错误提示,这意味着您的系统中缺少或损坏了一个重要的动态链接库文件。v4501v.dll文件通常是某些应用程序或游戏正常运行所必需的组件之一,缺失或损坏该文件会导致相关程序无法启动或运行异常。为了确保您......
  • 【反转链表】【K个一组翻转链表】两个问题具体思路,文中含多种解法(附完整代码)
    文章目录前言一、如何理解反转链表?二、反转链表1.方法一(递归)方法二(迭代)三、K个一组翻转链表前言本文将围绕【反转链表】问题展开详细论述。采用【递归法】【迭代法】同时,还将进一步升级该问题,讨论【K个一组翻转链表】一、如何理解反转链表?题目链接:[点击......
  • 【Azure Event Hub】诡异现象之Event Hub无法删除的根源
    问题描述遇见一个诡异的现象。在EventHub事件中心中删除了一个EventHub后,会立马被重建,多次删除发现都是同样的问题。 这是什么情况呢?问题解答经过对EventHub调查发现,使用了Kafka客户端持续的发送/消费事件。而Kafka客户端自带属性auto.create.topics.enable=true,它会......
  • PM的正交调解法
    1.PM的模拟调制过程​ PM信号是一种相位调制信号,其携带的信息保存在其信号的相位中,通过改变载波的相位来实现基带数据的传输。其函数表达式如下:\[s(t)=A*cos(w_c*t+K_f*m(t))\]其中:\(A\):表示载波幅度。\(m(t)\):表示基带信号。\(w_c\):表示载波信号角度增量。\(K_f\)......