• 优惠券数据库设计


    CREATE TABLE `coupon` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
      `title` varchar(64) NOT NULL COMMENT '优惠券标题(有图片则显示图片):无门槛50元优惠券 | 单品最高减2000元',
      `icon` varchar(128) DEFAULT NULL COMMENT '图片',
      `used` int(2) NOT NULL COMMENT '可用于:10店铺优惠券 11新人店铺券  20商品优惠券  30类目优惠券  60平台优惠券 61新人平台券',
      `type` int(2) NOT NULL DEFAULT '1' COMMENT '1满减券 2叠加满减券 3无门槛券(需要限制大小)',
      `with_special` int(2) NOT NULL DEFAULT '2' COMMENT '1可用于特价商品 2不能  默认不能(商品优惠卷除外)',
      `with_sn` varchar(36) DEFAULT NULL COMMENT '店铺或商品流水号',
      `with_amount` bigint(20) NOT NULL DEFAULT '0' COMMENT '满多少金额',
      `used_amount` bigint(20) NOT NULL COMMENT '用券金额',
      `quota` int(10) NOT NULL DEFAULT '1' COMMENT '配额:发券数量',
      `take_count` int(10) NOT NULL DEFAULT '0' COMMENT '已领取的优惠券数量',
      `used_count` int(10) NOT NULL DEFAULT '0' COMMENT '已使用的优惠券数量',
      `start_time` datetime NOT NULL COMMENT '发放开始时间',
      `end_time` datetime NOT NULL COMMENT '发放结束时间',
      `valid_type` int(1) NOT NULL DEFAULT '2' COMMENT '时效:1绝对时效(领取后XXX-XXX时间段有效)  2相对时效(领取后N天有效)',
      `valid_start_time` datetime DEFAULT NULL COMMENT '使用开始时间',
      `valid_end_time` datetime DEFAULT NULL COMMENT '使用结束时间',
      `valid_days` int(3) NOT NULL DEFAULT '1' COMMENT '自领取之日起有效天数',
      `status` int(1) NOT NULL DEFAULT '1' COMMENT '1生效 2失效 3已结束',
      `create_user` bigint(20) NOT NULL,
      `create_time` datetime NOT NULL COMMENT '创建时间',
      `update_user` bigint(20) NOT NULL,
      `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='优惠券表';
    

      https://blog.csdn.net/NotBugger/article/details/80942762?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

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

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

    1. 优惠券基础信息表

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

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

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

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

    2. 优惠券领取记录表

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

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

    3.优惠券消费记录表

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

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

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

    相关核心代码如下:

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

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

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

    3.3 买家主动领取优惠券

    1.  
      /**
    2.  
      * 优惠券controller
    3.  
      */
    4.  
      @RestController
    5.  
      @RequestMapping("/buyer/coupon")
    6.  
      public class CouponController extends BaseController {
    7.  
       
    8.  
      private static final Logger logger = LoggerFactory.getLogger(CouponController.class);
    9.  
       
    10.  
      @Autowired
    11.  
      private CouponReceiveService couponReceiveService;
    12.  
       
    13.  
      @Autowired
    14.  
      private UsersService usersService;
    15.  
       
    16.  
      /**
    17.  
      * 查询买家所有优惠券
    18.  
      *
    19.  
      * @param request
    20.  
      * @param response
    21.  
      * @param buyerId
    22.  
      * @return
    23.  
      */
    24.  
      @RequestMapping(value = "/list", method = { RequestMethod.GET, RequestMethod.POST })
    25.  
      public JsonResult getCouponList(HttpServletRequest request, HttpServletResponse response, Long buyerId) {
    26.  
      try {
    27.  
      if (buyerId == null) {
    28.  
      return new JsonResult(JsonResultCode.FAILURE, "买家不存在", "");
    29.  
      }
    30.  
      List<CouponReceive> result = couponReceiveService.selectAllByBuyerId(buyerId);
    31.  
      return new JsonResult(JsonResultCode.SUCCESS, "查询成功", result);
    32.  
      } catch (Exception ex) {
    33.  
      logger.error("[CouponController][getCouponList] exception", ex);
    34.  
      return new JsonResult(JsonResultCode.FAILURE, "系统错误,请稍后重试", "");
    35.  
      }
    36.  
      }
    37.  
       
    38.  
      /**
    39.  
      * 判断买家是否可以领取优惠券
    40.  
      *
    41.  
      * @param request
    42.  
      * @param response
    43.  
      * @param buyerId
    44.  
      * @return
    45.  
      */
    46.  
      @RequestMapping(value = "/judge", method = { RequestMethod.GET, RequestMethod.POST })
    47.  
      public JsonResult judgeReceive(HttpServletRequest request, HttpServletResponse response, Long buyerId) {
    48.  
      try {
    49.  
      // 判断当前用户是否可用
    50.  
      Users users = usersService.getUsersById(buyerId);
    51.  
      if (users == null) {
    52.  
      logger.info("OrderController.judgeReceive.buyerId " + buyerId);
    53.  
      return new JsonResult(JsonResultCode.FAILURE, "你的账号有误,请重新登录", "");
    54.  
      }
    55.  
      int status = users.getStatus();
    56.  
      if (UserStatus.FORBIDDEN == status) {
    57.  
      return new JsonResult(JsonResultCode.FAILURE, "你的账号已经被禁用了,请联系公司客服", "");
    58.  
      }
    59.  
      List<Coupon> result = couponReceiveService.selectByBuyerId(buyerId);
    60.  
      if (CollectionUtils.isEmpty(result)) {
    61.  
      result = new ArrayList<Coupon>();
    62.  
      }
    63.  
      return new JsonResult(JsonResultCode.SUCCESS, "查询成功", result);
    64.  
      } catch (Exception ex) {
    65.  
      logger.error("[CouponController][judgeReceive] exception", ex);
    66.  
      return new JsonResult(JsonResultCode.FAILURE, "系统错误,请稍后重试", "");
    67.  
      }
    68.  
      }
    69.  
       
    70.  
      /**
    71.  
      * 买家领取优惠券
    72.  
      *
    73.  
      * @param request
    74.  
      * @param response
    75.  
      * @param buyerId
    76.  
      * @return
    77.  
      */
    78.  
      @RequestMapping(value = "/add", method = { RequestMethod.GET, RequestMethod.POST })
    79.  
      public JsonResult saveCoupon(HttpServletRequest request, HttpServletResponse response, Long buyerId,
    80.  
      Long couponId) {
    81.  
      try {
    82.  
      // 判断当前用户是否可用
    83.  
      Users users = usersService.getUsersById(buyerId);
    84.  
      if (users == null) {
    85.  
      logger.info("OrderController.saveCoupon.buyerId " + buyerId);
    86.  
      return new JsonResult(JsonResultCode.FAILURE, "你的账号有误,请重新登录", "");
    87.  
      }
    88.  
      //判断当前用户的状态是否可用
    89.  
      int status = users.getStatus();
    90.  
      if (UserStatus.FORBIDDEN == status) {
    91.  
      return new JsonResult(JsonResultCode.FAILURE, "你的账号已经被禁用了,请联系公司客服", "");
    92.  
      }
    93.  
      if (couponId == null) {
    94.  
      return new JsonResult(JsonResultCode.SUCCESS, "活动已经结束", "");
    95.  
      }
    96.  
      //新增
    97.  
      int result = couponReceiveService.insert(buyerId, couponId);
    98.  
      if (result == -1) {
    99.  
      return new JsonResult(JsonResultCode.SUCCESS, "领取失败,已经领取过优惠券了", "");
    100.  
      } else if (result == 0) {
    101.  
      return new JsonResult(JsonResultCode.FAILURE, "领取失败,活动已经结束", "");
    102.  
      } else {
    103.  
      return new JsonResult(JsonResultCode.SUCCESS, "领取成功", "");
    104.  
      }
    105.  
      } catch (Exception ex) {
    106.  
      logger.error("[CouponController][saveCoupon] exception", ex);
    107.  
      return new JsonResult(JsonResultCode.FAILURE, "系统错误,请稍后重试", "");
    108.  
      }
    109.  
      }
    110.  
      }

    最终总结:用户优惠券会发放在买家的APP中的个人中心里面,然后进行点击查看与领取,然后在支付的时候会自动显示出优惠券的数据,非常的灵活与方便。

    https://juejin.im/post/5bda7277f265da397c03d58a

  • 相关阅读:
    node.js结合wechaty实现微信机器人[基础篇]
    .env文件为NodeJS全局环境变量
    基于jquery实现一个提示插件
    Puppeteer实现一个超简单的自动化机器人
    Vue高仿阿里动态banner,制作组件
    css不常用属性
    Vue表单校验失败滚动到错误位置
    C# Func委托
    深入解析C# 4th 笔记(第一章)
    C# 笔记 XML基础
  • 原文地址:https://www.cnblogs.com/gzhbk/p/13345730.html
Copyright © 2020-2023  润新知