【Lilishop商城】No3-11.模块详细设计,促销模块(优惠券、满减、秒杀、积分)的详细设计
淘宝搜:【天降红包222】领超级红包,京东搜:【天降红包222】
淘宝互助,淘宝双11微信互助群关注公众号 【淘姐妹】
仅涉及后端,全部目录看顶部专栏,代码、文档、接口路径在:?
【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客
全篇会结合业务介绍重点设计逻辑,其中重点包括接口类、业务类,具体的结合源代码分析,读起来也不复杂~
谨慎:源代码中有一些注释是错误的,有的注释意思完全相反,有的注释对不上号,我在阅读过程中就顺手更新了,并且在我不会的地方添加了新的注释,所以在读源代码过程中一定要谨慎啊!?
目录
A1.优惠券
B1.M端(属于显式操作)
B2.S端(属于显式操作)
B3.B端(属于显式操作)
B4.【【淘密令】】端(属于业务操作)
A2.券活动
B1.M端(属于显式操作)
A3.满减
B1.S端(属于显式操作)
B2.M端(属于显式操作)
?A4.秒杀
B1.M端(属于显式操作)
B2.S端(属于显式操作)
B3.B端(属于显式操作)
B4.【【淘密令】】端(属于业务操作)
A5.A6.拼团和砍价(待记录)
A7.积分商品
B1.积分分类
C1.M端(属于显式操作)
?C2.B端(属于显式操作)
B2.积分商品
C1.M端(属于显式操作)
C1.B端(属于显式操作)
开始前先说一下,促销的各类管理上不是特别的难理解,只要理解各个表结构和页面需要的接口就行,重点在于促销活动的业务service类底层都是实现自一个接口,因为所有的促销都是有相似的通用逻辑(例如,增加促销、修改促销、初始化等等)。
A1.优惠券 B1.M端(属于显式操作)这儿的接口没啥好说的
- 获取优惠券列表、通过id获取优惠券详情、添加优惠券、修改优惠券、修改优惠券状态、批量删除
- 查询全部分类列表(见商品分类,M端)
- 分页获取商品sku列表(见商品,M端)
这里的和M端的逻辑类似,只是有些属性需要修改
- 获取优惠券列表、通过id获取优惠券详情、添加优惠券、修改优惠券、修改优惠券状态、批量删除
- 获取店铺经营的分类(见商品分类,S端)
- 分页获取商品Sku列表(见商品,S端)
?
B3.B端(属于显式操作)这里的就是B端前台显示的,和用户已领取的;
但是?获取可领取优惠券列表 接口有点不方便,只返回了平台所有优惠券,并没有标注当前登录账号是否有该优惠券~
- 获取可领取优惠券列表、获取当前会员的优惠券列表、会员领取优惠券
?
B4.【【淘密令】】端(属于业务操作)用户领取的优惠券有截止日期的,所以需要添加定时任务来操作会员优惠券的状态变为过期。
详见:cn.lili.timetask.handler.impl.coupon.CouponExecute
但是不明白,这里为什么用E【【微信】】,按理说应该用每秒检测的,在线上看这也是按秒的,可能这里写错了~
@Component public class CouponExecute implements E【【微信】】 { static final int EXPIRATION_DAY=3; @Autowired pri【【微信】】ice memberCouponService; @Override public void execute() { //业务 1 //将过期优惠券从领取状态变更为过期状态 【【淘密令】】eWrapper 【【微信】】Wrapper=new 【【淘密令】】eWrapper() .eq(【【微信】】::get【【微信】】Status, 【【微信】】StatusEnum.NEW.name()) .le(【【微信】】::getEndTime, new Date()) .set(【【微信】】::get【【微信】】Status, 【【微信】】StatusEnum.EXPIRE.name()); this.memberCouponService.【【微信】】(【【微信】】Wrapper); //业务 2 Calendar calendar=Calendar.getInstance(); calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) - EXPIRATION_DAY); Date remo【【微信】】=calendar.getTime(); //删除过期/已使用的优惠券(过期一定时间后物理删除) 【【淘密令】】eWrapper 【【微信】】=new 【【淘密令】】eWrapper() //如果结束时间小于 当前时间增加指定删除日期,则删除 .le(【【微信】】::getEndTime, remo【【微信】】); this.memberCouponService.remove(【【微信】】); } }A2.券活动
根据优惠券添加券活动,关联的会员直接存到主表里面的scope里面,关联的券存到子表li_coupon_acti【【微信】】 里面。
这个业务就是给指定用户发放优惠券的,他的活动开始时间和结束时间其实没有用,在创建活动的时候就直接给指定用户发放了,并且即便活动未开始、活动已结束也可以使用,所以真正的业务效果是啥呢?TvT
B1.M端(属于显式操作)- 获取优惠券活动分页、通过id获取优惠券活动、添加优惠券活动、关闭优惠券活动
- 获取优惠券列表(见优惠券,M端)
- 会员分页列表(见会员,S端)
?
A3.满减满减是由店铺发起的,运营M端可以关闭,其中满减里面回赠送包邮、优惠券、赠品~
包邮会在下单时满足条件的时候去掉邮费,赠送优惠券会在下单付款后赠送会员指定券(该券是店铺创建的活动券),赠品会在下单后生成赠品类型的子订单,价格为零。
同一个商品sku只能存在一个满减活动,所以不能存在多个全品类的满减活动~
B1.S端(属于显式操作)满减活动失效是没有定时任务的,对于S端M端来说只是每次获取时进行判断,然后记录状态,表中并不存在状态这个字段,如果想要关闭满减活动,会直接将开始-截止日期清空的,这样会根据时间判断为已关闭。在B端只会在获取sku的详情时会获取该sku绑定的、有效的促销满减活动。
(私以为这样的设计不太合理,这样关闭是不会记录下来这个被关闭的满减活动的开始日期的。所以可以添加一个状态字段来记录,也方便。)
之后的促销活动:秒杀,也是这个逻辑的!
- 根据条件分页查询满优惠活动、通过id获取、新增满优惠活动、修改满优惠活动、删除满优惠活动、修改满额活动状态
- 获取店铺经营的分类(见商品分类,S端)
- 分页获取商品Sku列表(见商品,S端)
?
B2.M端(属于显式操作)- 获取满优惠列表、获取满优惠详情、修改满额活动状态
每一天的秒杀是由系统自动添加的,然后想参加的店铺可以往某个秒杀的某个时间里面添加商品sku,运营端可以删除商品sku或者关闭秒杀。
系统一开始就需要先往系统里面添加后几天秒杀,然后之后的每一天都添加秒杀。例如:12-01日系统一开始添加七天的秒杀到 12-08,第二天 12-02 会执行定时任务,继续添加秒杀直到 12-09,由于 12-03 到 12-08 已经添加了定时任务,就会跳过,只添加 12-09 的秒杀。(这只是简单逻辑哈,实际上是判断后7天哪天没有开启的秒杀就添加秒杀,因为已生成的秒杀可以关闭~)
买方B端可以查看秒杀列表,进行秒杀商品购买,秒杀商品即使不再秒杀列表里面也会限时秒杀信息的。秒杀列表只是一个快捷入口。?
B1.M端(属于显式操作)- 初始化秒杀活动、分页查询秒杀活动列表、通过id获取、修改秒杀活动、删除一个秒杀活动、操作秒杀活动状态
- 获取秒杀活动申请列表、删除秒杀活动申请
- 获取店铺经营的分类(见商品分类,S端)
- 分页获取商品Sku列表(见商品,S端)
?
?
B2.S端(属于显式操作)- 获取秒杀活动列表、通过id获取秒杀活动信息、获取秒杀活动申请列表、通过id获取秒杀活动申请、添加秒杀活动申请、删除秒杀活动商品
- 获取店铺经营的分类(见商品分类,S端)
- 分页获取商品Sku列表(见商品,S端)
?
?
B3.B端(属于显式操作)- 获取当天秒杀活动信息、获取某个时刻的秒杀活动商品信息
?
B4.【【淘密令】】端(属于业务操作)每日定时任务,创建秒杀活动
详见:cn.lili.timetask.handler.impl.promotion.PromotionE【【微信】】
@Slf4j @Component public class PromotionE【【微信】】 implements E【【微信】】 { @Autowired pri【【微信】】ice esGoodsIndexService; @Autowired pri【【微信】】ttingService; @Autowired pri【【微信】】ckillService; @Override public void execute() { try { //清除所有商品索引的无效促销活动 this.esGoodsIndexServi【【微信】】n(); } catch (Exception e) { log.error("清楚商品索引中无效促销异常", e); } try { //定时创建活动 addSeckill(); } catch (Exception e) { log.error("秒杀活动添加异常", e); } } 【【微信】】() { Setting setting=settingService.get(【【微信】】.SECKILL_SETTING.name()); 【【微信】】 seckillSetting=new Gson().fromJson(setting.getSettingValue(), 【【微信】】.class); log.info("生成秒杀活动设置:{}", seckillSetting); for (int i=1; i <=SeckillService.PRE_CREATION; i++) { Seckill seckill=new Seckill(i, seckillSetting.getHours(), seckillSetting.getSeckillRule()); //如果已经存在促销,则不再次保存 if (seckillService.list(PromotionTools.checkActi【【微信】】(seckill.getStartTime(), seckill.getEndTime(), PromotionTypeEnum.SECKILL, null, seckill.getId())).isEmpty()) { boolean result=seckillService.savePromotions(seckill); log.info("生成秒杀活动参数:{},结果:{}", seckill, result); } } } }A5.A6.拼团和砍价(待记录)
拼团和砍价也是只有买方小程序/APP端才有的业务,买方PC端是没有的。
拼团和砍价的详细业务来不及了解,后面记录。
A7.积分商品积分商品也是只有买方小程序/APP端才有的业务,买方PC端是没有的。
积分商品的每个活动都包含一个商品sku,并且只由运营M端可以管理积分,店铺S端是不会管理的。添加为积分商品的商品sku下单后的金额为 0 ,也就是这单收益为 0 ,但是在店对账中会通过设置的积分结算金额再补给店铺,所以最终可以说是运营端出费的~~~(补充一下平台优惠券也是会在结算时补给店铺,具体补多少看优惠券里面店铺占比的~)
积分分类是为了买方B端进行的分类,和商品没关联的。
B1.积分分类 C1.M端(属于显式操作)-
获取积分商品分类分页、通过id获取积分商品分类、添加积分商品分类、修改积分商品分类、删除积分商品分类
?
?C2.B端(属于显式操作)这个接口直接放到了买方端的积分商品里面,见积分商品,买方B端。
B2.积分商品 C1.M端(属于显式操作)- 分页获取积分商品、通过id获取积分商品详情、添加积分商品、修改积分商品、删除积分商品、修改积分商品状态
?
C1.B端(属于显式操作)-
分页获取积分商品、获取积分活动商品
-
获取积分商品分类分页
?
【兔跃新程 再启新篇】@爱读书的你 线上线下畅读礼遇 开学钜惠限时开启
原标题:【兔跃新程 再启新篇】@爱读书的你 线上线下畅读礼遇 开学钜惠限时开启
阅读有光,沐光前行,奔赴未来
3月1日―31日
衡水市新华书店线上线下同步开展
“兔跃新程 再启新章”主题活动
开学焕新优惠多多
线上多重福利享不停
线上领券下单优惠多
开学焕新优惠多多
新华优选网上商城满减用券巨划算
2元(满20元使用)
5元(满50元使用)
12元 ( 满100元使用 )
20元 ( 满150元使用 )
25元 ( 满200元使用 )
添加你的专属导购
领取 优惠券(限线上使用)
↓↓↓↓
(↑↑↑ 和平路店文学组企业微信)
(↑↑↑ 和平路店教育组企业微信)
(↑↑↑ 和平路店少儿组企业微信)
开学优选 好书钜惠
新华书店线上线下同步折扣
优选好书35―70折
↓ ↓ ↓
更多好书就在新华优选网上商城
↓↓↓↓↓
长按识别进入新华优选网上商城
新学期 一起向上吧
↑ 戳上图 选购教辅 ↑
开学季
同学们又站在新的起跑线
工具书、教辅资料快来接收吧
做好习题册,成绩稳步提升
新华优选
助你新学期轻松拿捏
↑ 戳上图 选购教辅 ↑
童年有书,未来有梦
阅读越闪亮,美好伴成长
打折还能使用优惠券
家长们开春囤书的好时机
兔跃新程 再启新章
新学期 新起点 新期待 新收获
让我们一起“兔”飞猛进
点击文末 “阅 读 原 文”进入微店
【新华・小桔灯绘本馆】会员招新季 超多入会福利等您来领取~
【阅享时光】《东京梦华录》千年前繁华都市的旅行指南返回搜狐,查看更多
责任编辑:
【公众号应用】微聚云科会员卡V1.0.1原版模块打包,会员卡+积分商城+分销系统+优惠券+收银台功能于一体会员卡模块
微聚科技,微聚官网,微聚集团,微聚云科是什么公司微聚云科会员卡系统,会员卡+积分商城+分销系统+优惠券+收银台功能于一体会员卡模块!主要包括多等级会员系统,会员充值,充值赠送,会员余额,收银系统,积分管理,积分签到,积分商城,分销推广等功能,本会员卡模块是我司拥有多年微信会员卡开发经验的团队,结合多年的开发经验,充分了解会员卡用户市场绝大多数客户的想法,将会员卡上需要开发的功能都全部集成,也是目前来说功能全面的会员卡模块,由于模块功能强大,可广泛使用于酒店、餐饮、美容美发、健身、KTV、培训、零售等任何需要会员卡的行业。
微聚云科会员卡、微信会员卡
微擎+PHP+mysql+公众号