优惠券系统

1.微服务架构

1.1 SpringCloud,SpringCloudAlibaba,Nacos,Sentinel,Feign等技术实现

我们的项目的话是一个微服务商城,我主要负责的模块是优惠卷模块,其中包含商品类别模板,优惠卷模板模块,生成优惠卷码,优惠卷的分发,优惠卷结算优惠的模块

2.负责的模块

2.1 商品模块
2.1.1 商品分类查询,商品搜索,ES搜索查询,效率更高

商品类别模块的话主要是在生成优惠卷模板的时候需要确定优惠卷所对应商品的类型和种类,来区别是单品优惠,还是某一种商品的优惠,或者是全品的优惠,商品模块主要就是简单的根据商品的id查询一下对应的商品,在查询的时候并且往redis中存一份,以方便管理人员后续查询的时候能够很快的访问的对应的商品。

2.2 优惠券模版模块
2.2.1 优惠券模版创建
涉及难点:优惠券模版的设计
优惠券的种类:满减,折扣,立减
优惠券的范围:单品,一系列产品,全品
优惠券时间限制:优惠券模版的过期时间:具体期限
生成优惠券码的过期时间:具体期限和自领取之日期限

优惠卷模板模块主要是生成对应的优惠卷相对于的模板,根据前端提供优惠卷的名称,优惠卷的类型,比如满减还是折扣还是立减,还有优惠卷的数量以及每人领取的数量,还有截至日期优惠卷模板的有效期,优惠卷发放的方式到底是用户领取还是系统方法的方式,以及相对应的商品类型进行设计,生成对应的优惠卷规则优惠卷模板id,保存到数据库,并异步生成优惠卷码。

2.2.2 生成优惠券码
涉及难点:异步生成优惠券码(这里需要掌握线程池等相关知识)
Mybatis做二级缓存,提高效率
Redis防止击穿
生成唯一ID(这里需要掌握雪花算法等相关知识)

这里的话因为需要异步生成优惠卷码,在优惠卷模板生成的同时也生成对应的优惠卷码,可以减少程序响应的时间,为了防止重复优惠券码的生成,我们是获取到开始的时间,优惠卷码的数量,优惠卷码相对于种类的前缀以及优惠卷模板的id还有雪花算法来生成的,根据优惠卷的个数开始遍历生成不同的优惠卷码,当生产完毕后判断一下生成优惠卷的个数,由于优惠卷码是存放在set集合中的,存在生成相同的优惠卷码无法存入集合中,再次判断一下集合元素的个数如果小于要生成优惠卷码的总个数的话,再次遍历生成相对应个数优惠卷码添加到集合,再次进行判断,把生成所有的优惠券码存入到数据库中,并在redis中存一份,然后开启二级缓存,提高对sql的查询效率,优惠卷码生成完成后返回对应的提示信息给运营人员

2.3 优惠券分发模块
涉及难点:查看可用优惠券业务流程(自己要能够说出来,有流程图)
异步处理已过期优惠券(需要掌握RabbitMQ相关知识)
系统自动分发优惠券流程(自己要能够说出来,有流程图)
用户手动领取优惠券逻辑(自己要能够说出来,有流程图)

优惠卷分发的话,分为用户领取和系统分发,系统自动分发的话先获取到所有的系统分发的优惠卷模板,根据状态码筛选掉所有的已经过期的优惠卷模板,返回未过期的优惠卷模板id,然后获取用户领取指定优惠卷领取的数量,然后查询一下用户已经领取的优惠卷,根据用户已经领取到的优惠卷的id,判断是否有相对应的优惠卷,有的话先获取对应优惠卷模板限制领取的数量来进行判断是否达到领取的限制,如果达到领取的限制的话,做一些相对应的处理,返回给用户已经领取过该优惠卷的提示,如果用户没有领取过该优惠卷的话,先查询一下优惠卷剩余的数量,如果优惠卷数量也就是集合里面的元素为0的话,也需要为用户提供相对应的优惠券发完了提示信息,否则容易获取空数据,如果能领取到,那就添加对应优惠卷模板的优惠卷码存入到用户信息中,在redis缓存中添加对应的优惠卷码,将用户领取对应的优惠券数量+1,手动领取的话获取到所有用户可以手动领取的优惠卷模板,过滤掉所有的已经过期的优惠卷模板,返回对应未过期的优惠卷id,获取指定的优惠卷领取数量,创建一个集合把可用的用户手动领取的优惠券储存到里面,进一步过滤掉达到用户领取限制的优惠卷模板,然后获取当前用户对应的优惠卷模板领取优惠卷的数量,进行相关的判断,是否达到限制数量,优惠卷剩余数量,达到数量或者优惠卷剩余数量为0就进行相应的提示不给予用户领取,没达到限制数量就把用户领取到的优惠卷码通过消息队列发送异步消息保存数据添加到数据库中,并往redist中存一份。

2.4 优惠券结算模块
涉及难点:获取结算信息,对优惠券的作用范围(单品,一系列商品,全品)进行分类

结算模块的话,我主要负责的是用户在生成订单后对订单的金额进行优惠,具体的话先获取到订单信息中商品的信息,再通过商品的信息获取到订单中所有商品的id,在根据商品的id获取商品的具体价格,然后在从redis中获取到用户对应的所有优惠卷,并过滤掉已经过期的优惠卷,根据优惠卷的使用规则来判断该商品是否可以优惠,如果可以优惠的话计算一下商品的价格,对所有可优惠的优惠卷进行优惠判断,筛选出最优的优惠方案提供给客户。