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

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

那么对于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中的个人中心里面,然后进行点击查看与领取,然后在支付的时候会自动显示出优惠券的数据,非常的灵活与方便。

转载自-- https://www.cnblogs.com/jurendage/p/9091587.html

原文地址:https://www.cnblogs.com/lu-manman/p/10052344.html

时间: 2024-08-30 07:09:17

20、生鲜电商平台-优惠券设计与架构的相关文章

Java开源生鲜电商平台-销售管理设计与架构(源码可下载)

Java开源生鲜电商平台-销售管理设计与架构(源码可下载) 说明:在Java开源生鲜电商平台中,销售人员我们称为跟餐饮店老板沟通与下载APP的一类地推人员.(所谓地推指的就是一个一个上门拜访.) 由于销售人员有以下几类特性: 1. 时间随意性,他们并不类似技术或者性质人员,需要天天呆在办公室,他们是需要去外面,时间上具有随意性. 2. 行动随意性 ,他们的行动过于随意,每天也不用来打卡,每天就是按照计划去拜访客户,然后推销生鲜电商APP,让客户来进行下单,那么行为很随意,站在公司的角度 我们是没

Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析

Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们应该如何进行网络请求的优化与处理呢? 到底有没有一些好的建议与方案呢? 下面这个文章将揭晓上面的问题,让你对SpringCloud微服务网络请求性能有一个全新的认识. 目录简介 01.网络请求异常分类 02.开发中注意问题 03.原始的处理方式 04.如何减少代码耦合性 05.异常统一处理步骤 06

Java开源生鲜电商平台-Java后端生成Token架构与设计详解(源码可下载)

Java开源生鲜电商平台-Java后端生成Token架构与设计详解(源码可下载) 目的:Java开源生鲜电商平台-Java后端生成Token目的是为了用于校验客户端,防止重复提交. 技术选型:用开源的JWT架构. 1.概述:在web项目中,服务端和前端经常需要交互数据,有的时候由于网络相应慢,客户端在提交某些敏感数据(比如按照正常的业务逻辑,此份数据只能保存一份)时,如果前端多次点击提交按钮会导致提交多份数据,这种情况我们是要防止发生的. 2.解决方法: ①前端处理:在提交之后通过js立即将按钮

Java开源生鲜电商平台-OMS订单系统中并发问题和锁机制的探讨与解决方案(源码可下载)

Java开源生鲜电商平台-OMS订单系统中并发问题和锁机制的探讨与解决方案(源码可下载) 说明:Java开源生鲜电商中OMS订单系统中并发问题和锁机制的探讨与解决方案: 问题由来     假设在一个订单系统中(以火车票订单系统为例),用户A,用户B都要预定从成都到北京的火车票,A.B在不同的售票窗口均同时查询到了某车厢卧铺中.下铺位有空位.用户A正在犹豫订中铺还是下铺,这时用户B果断订购了下铺.当用户A决定订下铺时,系统提示下铺已经被预订,请重新选择铺位.在这个系统场景中,我们来探讨一下,火车票

Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战

Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战 说明:Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战,优惠券是一种常见的促销方式,在规定的周期内购买对应商品类型和额度的商品时,结算时满足一定条件会减免一定金额.通过发放优惠券,引导用户购买相应的商品,在下单的时候抵扣一定的费用,达到促销.提高客单价的目标. 优惠券不论在线上还是线下,适用范围都比较广泛.例如滴滴发的专车券.外卖平台发的外卖券.京东淘宝的优惠券等. 1.优惠券的类型和应用场景 优惠券有多种分类方式,按照使

30、生鲜电商平台-电商促销业务分析设计与系统架构

说明:Java开源生鲜电商平台-电商促销业务分析设计与系统架构,列举的是常见的促销场景与源代码下载 左侧为享受促销的资格,常见为这三种: 首单 大于或等于某个会员级别 特定会员组:比如女性,月消费满1000等等,都是通过查询条件查询出来的特定分组. 优惠类型,对于电商网站主要是下面4类: 金额 赠品:商品.优惠券.现金券.积分等 包邮(实际上也是钱) 其它:如送精美包装等. 对于其它业务类型的平台,则估计会有其它形式的优惠,比如赠送三个VIP会员等等. 范围,无非就是: 整单 指定品类或特定品类

Java开源生鲜电商平台-通知模块设计与架构(源码可下载)

Java开源生鲜电商平台-通知模块设计与架构(源码可下载) 说明:对于一个生鲜的B2B平台而言,通知对于我们实际的运营而言来讲分为三种方式:           1. 消息推送:(采用极光推送)           2. 主页弹窗通知.(比如:现在有什么新的活动,有什么新的优惠等等)           3. 短信通知.(对于短信通知,这个大家很熟悉,我们就说下我们如何从代码层面对短信进行分层的分析与架构) 1. 消息推送 说明:目前市场上的推送很多,什么极光推送,环信,网易云等等,都可以实现秒

Java开源生鲜电商平台-RBAC系统权限的设计与架构(源码可下载)

Java开源生鲜电商平台-RBAC系统权限的设计与架构(源码可下载) 说明:根据上面的需求描述以及对需求的分析,我们得知通常的一个中小型系统对于权限系统所需实现的功能以及非功能性的需求,在下面我们将根据需求从技术角度上分析实现的策略以及基于目前两种比较流行的权限设计思想来讨论关于权限系统的实现. 1.1.       技术策略 l         身份认证 在B/S的系统中,为识别用户身份,通常使用的技术策略为将用户的身份记录在Session中,也就是当用户登录时即获取用户的身份信息,并将其记录

24、生鲜电商平台-系统报表设计与架构

说明:任何一个运行的平台都需要一个很清楚的报表来显示,那么作为Java开源生鲜电商平台而言,我们应该如何设计报表呢?或者说我们希望报表来看到什么数据呢?           通过报表我们可以分析出目前整个公司的运营情况,以及下一步的调整方向,这样更加有理有据的掌握整个市场与决策. 设计基础维度:    1. 今日订单,今日营业额,总订单数,总营业额          2. 今日的注册买家,总的注册买家.          3. 实时的营收,实时的下单买家.          4. 今日下单买家,