电商平台-优惠券设计与架构

电商平台-优惠券设计 1. 优惠券基础信息表 说明:任何一个优惠券或者说代金券都是有一个基础的说明,比如:优惠券名称,类型,价格,有效期,状态,说明等等基础信息。     CREATE TABLE `coupon` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自动增加ID', `region_id` bigi... 阅读详情

说明:现在电商白热化的程度,无论是生鲜电商还是其他的电商等等,都会有促销的这个体系,目的就是增加订单量与知名度等等

           那么对于Java开源生鲜电商平台而言,我们采用优惠券的这种方式进行促销。(补贴价格战对烧钱而言非常的恐怖的,太烧钱了)


1. 优惠券基础信息表

说明:任何一个优惠券或者说代金券都是有一个基础的说明,比如:优惠券名称,类型,价格,有效期,状态,说明等等基础信息。


CREATE TABLE `coupon` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自动增加ID',
  `region_id` bigint(20) DEFAULT NULL COMMENT '所属区域',
  `type` int(11) DEFAULT NULL COMMENT '所属类型,1为满减',
  `name` varchar(32) DEFAULT NULL COMMENT '优惠券名称',
  `img` varchar(64) DEFAULT NULL COMMENT '图片的URL地址',
  `start_time` datetime DEFAULT NULL COMMENT '优惠券开始时间',
  `end_time` datetime DEFAULT NULL COMMENT '优惠券结束时间',
  `money` decimal(11,2) DEFAULT NULL COMMENT '优惠券金额,用整数,固定值目前。',
  `status` int(11) DEFAULT NULL COMMENT '状态,0表示未开始,1表示进行中,-1表示结束',
  `remarks` varchar(512) DEFAULT NULL COMMENT '优惠券的说明',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `full_money` decimal(12,2) DEFAULT NULL COMMENT '金额满',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='优惠券基础配置表';

说明:业务说可以规定某个区域,做优惠券,而且是纳新后才有,这样增加买家用户。价格可以后端进行设置。

           状态的意义在于,用户需要注册完成后,然后主动认领才有效,为什么要这样设计呢?目的只有一个:让用户在对APP这个软件玩一会儿,增加熟悉程度.

2. 优惠券领取记录表

说明:我们需要记录那个买家,什么时候进行的领取,领取的的时间,券的额度是多少等等,是否已经使用等信息


CREATE TABLE `coupon_receive` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自动增加ID',
  `buyer_id` bigint(20) DEFAULT NULL COMMENT '买家ID',
  `coupon_id` bigint(20) DEFAULT NULL COMMENT '优惠券编号',
  `coupon_money` decimal(12,2) DEFAULT NULL COMMENT '券额',
  `create_time` datetime DEFAULT NULL COMMENT '领取时间',
  `full_money` decimal(12,2) DEFAULT NULL COMMENT '金额满',
  `status` int(11) DEFAULT NULL COMMENT '状态,1为已使用,0为已领取未使用,-1为已过期',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='优惠券领取记录表';

3.优惠券消费记录表

说明:优惠券消费记录表,是需要知道那个买家,那个优惠券,那个订单使用了优惠券,这边有个特别注意的地方是,这个优惠券的执行在支付成功后的回调。


CREATE TABLE `coupon_logs` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自动增加ID',
  `buyer_id` bigint(20) DEFAULT NULL COMMENT '买家ID',
  `coupon_receive_id` bigint(20) DEFAULT NULL COMMENT '优惠券id',
  `order_number` varchar(64) DEFAULT NULL COMMENT '订单号',
  `order_original_amount` decimal(12,2) DEFAULT NULL COMMENT '原订单金额',
  `coupon_amount` decimal(11,2) DEFAULT NULL COMMENT '优惠券的金额',
  `order_final_amount` decimal(12,2) DEFAULT NULL COMMENT '抵扣优惠券之后的订单金额',
  `create_time` datetime DEFAULT NULL COMMENT '领取时间',
  `status` int(2) DEFAULT '0' COMMENT '日志状态: 默认为0,支付回调成功后为1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='优惠券消费记录表';

说明:相对而言,优惠券的难度不算大,重点的是业务方面的指导与学习,包括数据库的架构与设计等等,还有就是思路的学习。

 

相关核心代码如下:

APP需要后台提供以下几个接口:

3.1 查询所有买家的优惠券。

3.2 判断买家是否可以领取优惠券。

3.3 买家主动领取优惠券


/**
 * 优惠券controller
 */
@RestController
@RequestMapping("/buyer/coupon")
public class CouponController extends BaseController {

    private static final Logger logger = LoggerFactory.getLogger(CouponController.class);

    @Autowired
    private CouponReceiveService couponReceiveService;

    @Autowired
    private UsersService usersService;

    /**
     * 查询买家所有优惠券
     * 
     * @param request
     * @param response
     * @param buyerId
     * @return
     */
    @RequestMapping(value = "/list", method = { RequestMethod.GET, RequestMethod.POST })
    public JsonResult getCouponList(HttpServletRequest request, HttpServletResponse response, Long buyerId) {
        try {
            if (buyerId == null) {
                return new JsonResult(JsonResultCode.FAILURE, "买家不存在", "");
            }
            List<CouponReceive> result = couponReceiveService.selectAllByBuyerId(buyerId);
            return new JsonResult(JsonResultCode.SUCCESS, "查询成功", result);
        } catch (Exception ex) {
            logger.error("[CouponController][getCouponList] exception", ex);
            return new JsonResult(JsonResultCode.FAILURE, "系统错误,请稍后重试", "");
        }
    }

    /**
     * 判断买家是否可以领取优惠券
     * 
     * @param request
     * @param response
     * @param buyerId
     * @return
     */
    @RequestMapping(value = "/judge", method = { RequestMethod.GET, RequestMethod.POST })
    public JsonResult judgeReceive(HttpServletRequest request, HttpServletResponse response, Long buyerId) {
        try {
            // 判断当前用户是否可用
            Users users = usersService.getUsersById(buyerId);
            if (users == null) {
                logger.info("OrderController.judgeReceive.buyerId " + buyerId);
                return new JsonResult(JsonResultCode.FAILURE, "你的账号有误,请重新登录", "");
            }
            int status = users.getStatus();
            if (UserStatus.FORBIDDEN == status) {
                return new JsonResult(JsonResultCode.FAILURE, "你的账号已经被禁用了,请联系公司客服", "");
            }
            List<Coupon> result = couponReceiveService.selectByBuyerId(buyerId);
            if (CollectionUtils.isEmpty(result)) {
                result = new ArrayList<Coupon>();
            }
            return new JsonResult(JsonResultCode.SUCCESS, "查询成功", result);
        } catch (Exception ex) {
            logger.error("[CouponController][judgeReceive] exception", ex);
            return new JsonResult(JsonResultCode.FAILURE, "系统错误,请稍后重试", "");
        }
    }

    /**
     * 买家领取优惠券
     * 
     * @param request
     * @param response
     * @param buyerId
     * @return
     */
    @RequestMapping(value = "/add", method = { RequestMethod.GET, RequestMethod.POST })
    public JsonResult saveCoupon(HttpServletRequest request, HttpServletResponse response, Long buyerId,
            Long couponId) {
        try {
            // 判断当前用户是否可用
            Users users = usersService.getUsersById(buyerId);
            if (users == null) {
                logger.info("OrderController.saveCoupon.buyerId " + buyerId);
                return new JsonResult(JsonResultCode.FAILURE, "你的账号有误,请重新登录", "");
            }
            //判断当前用户的状态是否可用
            int status = users.getStatus();
            if (UserStatus.FORBIDDEN == status) {
                return new JsonResult(JsonResultCode.FAILURE, "你的账号已经被禁用了,请联系公司客服", "");
            }
            if (couponId == null) {
                return new JsonResult(JsonResultCode.SUCCESS, "活动已经结束", "");
            }
            //新增
            int result = couponReceiveService.insert(buyerId, couponId);
            if (result == -1) {
                return new JsonResult(JsonResultCode.SUCCESS, "领取失败,已经领取过优惠券了", "");
            } else if (result == 0) {
                return new JsonResult(JsonResultCode.FAILURE, "领取失败,活动已经结束", "");
            } else {
                return new JsonResult(JsonResultCode.SUCCESS, "领取成功", "");
            }
        } catch (Exception ex) {
            logger.error("[CouponController][saveCoupon] exception", ex);
            return new JsonResult(JsonResultCode.FAILURE, "系统错误,请稍后重试", "");
        }
    }
}
最终总结:用户优惠券会发放在买家的APP中的个人中心里面,然后进行点击查看与领取,然后在支付的时候会自动显示出优惠券的数据,非常的灵活与方便。
【产品经理修炼之道】- 优惠券系统从入门到精通(六十七) 根据业务不同,优惠券系统的功能流程也有很大的不同。本文仅从自营电商平台的业务角度出发,分享优惠券整个系统的架构设计,后续将从系统架构的五个维度(优惠券系统、活动系统、发放系统、核销系统和数据系统),分析具体的系统设计和思考,当然,这里的“系统”不代表是个很庞大的内容,只是用“系统”这个词,来代替相关直接的区隔,并从系统可扩展的角度出发,实现系统之间的关系解藕,达到高效配合,灵活扩展。这里需要注意的是,发放系统发放的活动是基于活动系统生成之后,发放的子活动,也就是当节点发生时,产生的活动是一个子活动。 阅读详情

相关推荐

商城优惠券数据库表设计.sql

优惠券数据库表设计参考.sql

电商平台优惠券设计

梳理电商平台优惠券是一种常用的促销工具,同时是一个业务逻辑比较复杂的场景,针对优惠券的设计要具有较好的通用性,以下分享笔者参与的电商平台的优惠券的核心业务表设计,核心表包含:优惠券主表、用户优惠券资产表、优惠券使用记录表和优惠券适用商品列表。 分析电商平台优惠券常用有平台优惠券、店铺优惠券、商品优惠券和类目优惠券,本项目暂时只用到了店铺优惠券和商品优惠券,因此表结构设计仅针对这两种,并同时支持另外两种优惠券的扩展性设计。 CREATE TABLE `mer_coupon_info` ( `coup

午后苦咖啡 4513

攻克TypeError: Cannot read properties of undefined (reading ‘NormalModule‘)的四种实战策略

本文详细解析了`TypeError: Cannot read properties of undefined (reading 'NormalModule')`错误的四种实战解决策略。从版本一致性检查、包管理器优化到依赖替换和构建环境配置,帮助开发者快速定位和解决Webpack构建过程中的常见问题,提升开发效率。

weixin_42523670的博客 243

MySQL数据库基础练习系列45、优惠券发放系统

MySQL数据库基础练习系列45、优惠券发放系统

红目香薰 1118

STM32F407步进电机控制及DM542驱动器使用

基于DM542驱动器的步进电机简单控制

qq_43868701的博客 1万+

UE5新手必看:如何在UMG控件中嵌入浏览器实现Web页面展示(附完整步骤)

本文为UE5新手提供了在UMG控件中无缝集成Web浏览器的完整实战指南。详细介绍了从启用WebBrowser插件、创建并配置WebBrowser控件蓝图,到编写动态加载与交互逻辑,以及在游戏关卡中实例化UI的全过程。文章还分享了性能优化技巧与常见问题排查方法,帮助开发者高效实现游戏UI内的Web页面展示与交互。

weixin_29243063的博客 710

电商系统:优惠券实体设计、数据库表设计、满减券、运费券

电商系统:优惠券实体设计、商品数据库表设计、满减券、运费券..

isworking的博客 2013

PyTorch实战:3D U-Net医学图像分割从零搭建(附完整代码)

本文详细介绍了如何使用PyTorch从零搭建3D U-Net模型进行医学图像分割,涵盖三维卷积实现、模块化架构设计、医学图像专属优化策略及完整训练流程。通过实战代码演示,帮助开发者掌握UNet-3D在CT、MRI等三维医学图像分割中的应用,提升肝脏肿瘤分割、肺结节检测等任务的准确性。

weixin_29061997的博客 329

电商优惠券实战设计

优惠券的配置 用户的使用叠加计算 数据库表设计 核心代码实现(写了1.5W字 写了一周)

qq_44627031的博客 2603

【RViz2】导入urdf模型时报错:Could not load resource xxx,Unable to open file xxx,Error retrieving file xxx

初学ROS2,想要在RViz2中显示urdf模型。其中.urdf文件引用了外部的meshes文件夹。

qq_43557907的博客 9488

Python李峋同款跳动的爱心(完整代码)

Python语言实现李峋同款可写字版跳动的爱心的完整代码。

AIGC 4万+

优惠券设计

1.模板设计 例: 现有两种类型优惠券,直减券,满减券,要求设计其发放数量可控,领取数量可控,发放时间可控,生效失效时间可控。 CREATE TABLE `t_coupon_temp` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(200) DEFAULT NULL COMMENT '名称', `coupon_type` varchar(255) DEFAULT NULL COMMENT '优惠券类型:1直减现金券2满

weixin_40690763的博客 1791

【第48例】BLM模型之市场洞察-五看工具篇(一)

BLM市场洞察

产品线负责人 2110

生鲜电商平台-优惠券设计与架构

说明:现在电商白热化的程度,无论是生鲜电商还是其他的电商等等,都会有促销的这个体系,目的就是增加订单量与知名度等等 那么对于Java开源生鲜电商平台而言,我们采用优惠券的这种方式进行促销。(补贴价格战对烧钱而言非常的恐怖的,太烧钱了) 1. 优惠券基础信息表 说明:任何一个优惠券或者说代金券都是有一个基础的说明,比如:优惠券名称,类型,价格,有效期,状态,说明等等基础信息。 CREATE TABLE `coupon` ( `id` bigint(20) un...

竹林幽深 290

开源数字人、虚拟直播部署教程

对,你无看错,是欧美的。在直播带货案例里,我们把模型导入到ue4,我们给模型在ue4里预设了四个动作(站着、站着说话、坐着、坐着说话),三个表情(平静、开发、愤怒),三个镜头(全局、近矩说话、看显示器播放商品展示)。我们只需要把目标主播的直播给录制下来,提取样本数据,然后训练一个从粉丝的不同刺激的组合,到主播的不同响应方式的多元逻辑回归的数学模型参数即可。

南七小僧的学海无涯 4561

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

20、生鲜电商平台-优惠券设计与架构

说明:现在电商白热化的程度,无论是生鲜电商还是其他的电商等等,都会有促销的这个体系,目的就是增加订单量与知名度等等 那么对于Java开源生鲜电商平台而言,我们采用优惠券的这种方式进行促销。(补贴价格战对烧钱而言非常的恐怖的,太烧钱了) 1. 优惠券基础信息表 说明:任何一个优惠券或者说代金券都是有一个基础的说明,比如:优惠券名称,类型,价格,有效期,状态,说...

weixin_34018202的博客 120

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java生鲜电商平台-微服务电商优惠券的架构设计(小程序/APP)

Java生鲜电商平台-微服务电商优惠券的架构设计(小程序/APP) Java生鲜电商平台-微服务电商优惠券的架构设计(小程序/APP) 说明:Java生鲜电商平台的优惠券属于电子优惠券,不过我们要先看看线下纸质优惠券: 商家决定做促销,印制了10000张50元代金券; 其中1000张代金券分别发给1000个用户; 到某一个时刻,这1000个用户有300个适用了代金券; 又到某一个时刻,剩余的700张代金券过了有效期,不可用了。 抽象一下,优惠券无非经历几个环节:创建——发放——领取——使用——核

竹林幽深 838

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java生鲜电商平台-优惠券系统的架构设计与源码解析

Java生鲜电商平台-优惠券系统的架构设计与源码解析 电商后台:实例解读促销系统 电商后台系统包括商品管理系统、采购系统、仓储系统、订单系统、促销系统、维权系统、财务系统、会员系统、权限系统等,各系统之间相互关联、相互依托,为前端的正常业务流转建立结实稳固的基础。 促销系统的主要目的是便于运营设置各种促销方式,以提高商品的销量、用户的客单价等。 在后台各系统中,促销系统...

weixin_30493401的博客 2184

Java生鲜电商平台-优惠券设计与架构

Java生鲜电商平台-优惠券设计与架构 说明:现在电商白热化的程度,无论是生鲜电商还是其他的电商等等,都会有促销的这个体系,目的就是增加订单量与知名度等等 那么对于Java开源生鲜电商平台而言,我们采用优惠券的这种方式进行促销。(补贴价格战对烧钱而言非常的恐怖的,太烧钱了) 1. 优惠券基础信息表 说明:任何一个优惠券或者说代金券都是有一个基础的说明,比如...

weixin_30340775的博客 605

Java生鲜电商平台-积分,优惠券,会员折扣,签到、预售、拼团、砍价、秒杀及抽奖等促销模块架构设计...

Java生鲜电商平台-积分,优惠券,会员折扣,签到、预售、拼团、砍价、秒杀及抽奖等促销模块架构设计 说明:本标题列举了所有目前社会上常见的促销方案,目前贴出实际的业务运营手段以及架构设计,包括业务说明,仅供参考 促销体系 1.1促销体系 在电商和O2O领域,促销是运营人员的一个主要的让利行为,同时促销活动期间的购买量也较之普通商品更高,不同的阶段,对于促销的要求也是不同的。 促销实质上是一种沟通活动,即营销者(信息提供者或发送者)发出作为刺激消费的各种信息,把信息传递到一个或更多的目标..

竹林幽深 1609

电商产品设计:后台营销功能模块设计-优惠券活动(三)

现在电商白热化的程度,无论是生鲜电商还是其他的电商等等,都会有促销的这个体系,目的就是增加订单量与知名度等等。那么对于Java开源生鲜电商平台而言,我们采用优惠券的这种方式进行促销。(补贴价格战对烧钱而言非常的恐怖的,太烧钱了) 1. 优惠券基础信息实体类 说明:任何一个优惠券或者说代金券都是有一个基础的说明,比如:优惠券名称,类型,价格,有效期,状态,说明等等基础信息。 package com.ltf.entity; import cn.hutool.core.bean.BeanUtil; im

飞上云端看彩虹 1854
上一篇: 电商平台-团购模块设计与架构
下一篇: 电商平台-异常模块的设计与架构
代码兄弟
博客等级 码龄11年 53粉丝 18原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值