優惠券數據庫設計


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM