产品角度
https://juejin.cn/post/6844903702742958094
数据库设计
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='优惠券基础配置表';
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='优惠券表';
CREATE TABLE `coupontrans_coupon` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '优惠券ID',`uid` bigint(20) NOT NULL DEFAULT 0 COMMENT '权益所有者',`balance` bigint(20) NOT NULL DEFAULT 0 COMMENT '优惠券金额: 金额类-优惠券金额;折扣类型-最大抵扣金额',`original_balance` bigint(20) NOT NULL DEFAULT 0 COMMENT '优惠原始金额: 金额类-优惠券金额;折扣类型-最大抵扣金额',`busi_source` bigint(20) NOT NULL DEFAULT 0 COMMENT '优惠券业务线类型: 100:少儿; 200:绘本VIP; 300:自拼; 400:精读课 600:数学课; 9900:商城优惠券',`commodity_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '对应优惠券类型',`coupon_group` varchar(255) NOT NULL DEFAULT '' COMMENT '对应优惠券组:',`coupon_flag` int(11) NOT NULL DEFAULT 0 COMMENT '优惠券类型:1-无限制,2-全互斥优惠券,3-同组可叠加',`off` int(11) NOT NULL DEFAULT 0 COMMENT '优惠券折扣',`minstd` bigint(20) NOT NULL DEFAULT 0 COMMENT '最低限额',`lastrepeat` bigint(20) NOT NULL DEFAULT 0 COMMENT '剩余可用次数',`repeatinit` bigint(20) NOT NULL DEFAULT 0 COMMENT '初始化试用次数',`usecn` bigint(20) NOT NULL DEFAULT 0 COMMENT '总共试用次数',`effect` bigint(20) NOT NULL DEFAULT 0 COMMENT '生效时间',`expire` bigint(20) NOT NULL DEFAULT 0 COMMENT '过期时间',`ct` bigint(20) NOT NULL DEFAULT 0 COMMENT '创建时间',`ut` bigint(20) NOT NULL DEFAULT 0 COMMENT '更新时间',`jdata` json DEFAULT NULL COMMENT 'json格式扩展字段',`title` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '标题',`ch` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '渠道',PRIMARY KEY (`id`),KEY `idx_uid_bs` (`uid`,`busi_source`),KEY `idx_ct` (`ct`),KEY `idx_commodity_id` (`commodity_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=418230849963575 COMMENT='优惠券账户表';
参考链接
说明:现在电商白热化的程度,无论是生鲜电商还是其他的电商等等,都会有促销的这个体系,目的就是增加订单量与知名度等等
那么对于Java开源生鲜电商平台而言,我们采用优惠券的这种方式进行促销。(补贴价格战对烧钱而言非常的恐怖的,太烧钱了)
1. 优惠券基础信息表
说明:任何一个优惠券或者说代金券都是有一个基础的说明,比如:优惠券名称,类型,价格,有效期,状态,说明等等基础信息。
- CREATETABLE
coupon( idbigint(20)unsignedNOTNULL AUTO_INCREMENTCOMMENT’自动增加ID’,region_idbigint(20)DEFAULTNULLCOMMENT’所属区域’,typeint(11)DEFAULTNULLCOMMENT’所属类型,1为满减’,namevarchar(32)DEFAULTNULLCOMMENT’优惠券名称’,imgvarchar(64)DEFAULTNULLCOMMENT’图片的URL地址’,start_timedatetimeDEFAULTNULLCOMMENT’优惠券开始时间’,end_timedatetimeDEFAULTNULLCOMMENT’优惠券结束时间’,moneydecimal(11,2)DEFAULTNULLCOMMENT’优惠券金额,用整数,固定值目前。’,statusint(11)DEFAULTNULLCOMMENT’状态,0表示未开始,1表示进行中,-1表示结束’,remarksvarchar(512)DEFAULTNULLCOMMENT’优惠券的说明’,create_timedatetimeDEFAULTNULLCOMMENT’创建时间’,full_moneydecimal(12,2)DEFAULTNULLCOMMENT’金额满’,- PRIMARYKEY (
id) - )ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT=’优惠券基础配置表’;
CREATE TABLE `coupontrans_commodity_bindflag` (`id` bigint(20) NOT NULL DEFAULT 0 COMMENT '优惠券ID',`commodity_id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '优惠券类型',`package_id` bigint(11) NOT NULL DEFAULT 0 COMMENT '优惠券ID',`tag_str` varchar(64) NOT NULL DEFAULT '' COMMENT '对应类型',`coupon_flag` int(11) NOT NULL DEFAULT 0 COMMENT '优惠券类型:1-无限制,2-全互斥优惠券,3-同组可叠加,4-指定套餐类型;5-指定套餐ID;',`ct` bigint(20) NOT NULL DEFAULT 0 COMMENT '创建时间',`ut` bigint(20) NOT NULL DEFAULT 0 COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_commodity_id` (`commodity_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='优惠券使用类型';
CREATE TABLE `coupontrans_coupon_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`uid` bigint(20) NOT NULL DEFAULT 0 COMMENT '权益所有者',`coupon_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '优惠券ID',`logic_id` varchar(64) NOT NULL DEFAULT '' COMMENT '业务唯一ID',`uniqueid` varchar(64) NOT NULL DEFAULT '' COMMENT '操作唯一ID',`bussrc` int(11) NOT NULL DEFAULT 0 COMMENT '操作来源',`bussrc_operation` varchar(64) NOT NULL DEFAULT '' COMMENT '操作来源',`balance` bigint(20) NOT NULL DEFAULT 0 COMMENT '优惠券抵扣金额',`busi_source` bigint(20) NOT NULL DEFAULT 0 COMMENT '优惠券业务线类型: 100:少儿; 200:绘本VIP; 300:自拼; 400:精读课 600:数学课; 9900:商城优惠券',`commodity_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '对应优惠券类型',`before_balance` bigint(20) NOT NULL DEFAULT 0 COMMENT '优惠券操作金额',`ct` bigint(20) NOT NULL DEFAULT 0 COMMENT '创建时间',`ut` bigint(20) NOT NULL DEFAULT 0 COMMENT '更新时间',`note` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '备注',PRIMARY KEY (`id`),KEY `idx_uid` (`uid`),KEY `idx_couponId` (`coupon_id`),KEY `idx_ct` (`ct`),UNIQUE KEY `uniq_uniqueid` (`uniqueid`),KEY `logic_id` (`logic_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=210001 COMMENT='优惠券账户变动流水表';
说明:业务说可以规定某个区域,做优惠券,而且是纳新后才有,这样增加买家用户。价格可以后端进行设置。
状态的意义在于,用户需要注册完成后,然后主动认领才有效,为什么要这样设计呢?目的只有一个:让用户在对APP这个软件玩一会儿,增加熟悉程度.
2. 优惠券领取记录表
说明:我们需要记录那个买家,什么时候进行的领取,领取的的时间,券的额度是多少等等,是否已经使用等信息
- CREATETABLE
coupon_receive( idbigint(20)unsignedNOTNULL AUTO_INCREMENTCOMMENT’自动增加ID’,buyer_idbigint(20)DEFAULTNULLCOMMENT’买家ID’,coupon_idbigint(20)DEFAULTNULLCOMMENT’优惠券编号’,coupon_moneydecimal(12,2)DEFAULTNULLCOMMENT’券额’,create_timedatetimeDEFAULTNULLCOMMENT’领取时间’,full_moneydecimal(12,2)DEFAULTNULLCOMMENT’金额满’,statusint(11)DEFAULTNULLCOMMENT’状态,1为已使用,0为已领取未使用,-1为已过期’,- PRIMARYKEY (
id) - )ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT=’优惠券领取记录表’;
3.优惠券消费记录表
说明:优惠券消费记录表,是需要知道那个买家,那个优惠券,那个订单使用了优惠券,这边有个特别注意的地方是,这个优惠券的执行在支付成功后的回调。
- CREATETABLE
coupon_logs( idbigint(20)unsignedNOTNULL AUTO_INCREMENTCOMMENT’自动增加ID’,buyer_idbigint(20)DEFAULTNULLCOMMENT’买家ID’,coupon_receive_idbigint(20)DEFAULTNULLCOMMENT’优惠券id’,order_numbervarchar(64)DEFAULTNULLCOMMENT’订单号’,order_original_amountdecimal(12,2)DEFAULTNULLCOMMENT’原订单金额’,coupon_amountdecimal(11,2)DEFAULTNULLCOMMENT’优惠券的金额’,order_final_amountdecimal(12,2)DEFAULTNULLCOMMENT’抵扣优惠券之后的订单金额’,create_timedatetimeDEFAULTNULLCOMMENT’领取时间’,statusint(2)DEFAULT’0’COMMENT’日志状态: 默认为0,支付回调成功后为1’,- PRIMARYKEY (
id) - )ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT=’优惠券消费记录表’;
说明:相对而言,优惠券的难度不算大,重点的是业务方面的指导与学习,包括数据库的架构与设计等等,还有就是思路的学习。
相关核心代码如下:
APP需要后台提供以下几个接口:
3.1 查询所有买家的优惠券。
3.2 判断买家是否可以领取优惠券。
3.3 买家主动领取优惠券
- /**
- 优惠券controller
- */
- @RestController
- @RequestMapping(“/buyer/coupon”)
- publicclassCouponControllerextendsBaseController {
- privatestaticfinal 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 JsonResultgetCouponList(HttpServletRequest request, HttpServletResponse response, Long buyerId) {
- try {
- if (buyerId ==null) {
- returnnew JsonResult(JsonResultCode.FAILURE,”买家不存在”,””);
- }
- List
result = couponReceiveService.selectAllByBuyerId(buyerId); - returnnew JsonResult(JsonResultCode.SUCCESS,”查询成功”, result);
- }catch (Exception ex) {
- logger.error(“[CouponController][getCouponList] exception”, ex);
- returnnew JsonResult(JsonResultCode.FAILURE,”系统错误,请稍后重试”,””);
- }
- }
- /**
- 判断买家是否可以领取优惠券
- *
- *@param request
- *@param response
- *@param buyerId
- *@return
- */
- @RequestMapping(value =”/judge”, method = { RequestMethod.GET, RequestMethod.POST })
- public JsonResultjudgeReceive(HttpServletRequest request, HttpServletResponse response, Long buyerId) {
- try {
- // 判断当前用户是否可用
- Users users = usersService.getUsersById(buyerId);
- if (users ==null) {
- logger.info(“OrderController.judgeReceive.buyerId “ + buyerId);
- returnnew JsonResult(JsonResultCode.FAILURE,”你的账号有误,请重新登录”,””);
- }
- int status = users.getStatus();
- if (UserStatus.FORBIDDEN == status) {
- returnnew JsonResult(JsonResultCode.FAILURE,”你的账号已经被禁用了,请联系公司客服”,””);
- }
- List
result = couponReceiveService.selectByBuyerId(buyerId); - if (CollectionUtils.isEmpty(result)) {
- result =new ArrayList
(); - }
- returnnew JsonResult(JsonResultCode.SUCCESS,”查询成功”, result);
- }catch (Exception ex) {
- logger.error(“[CouponController][judgeReceive] exception”, ex);
- returnnew JsonResult(JsonResultCode.FAILURE,”系统错误,请稍后重试”,””);
- }
- }
- /**
- 买家领取优惠券
- *
- *@param request
- *@param response
- *@param buyerId
- *@return
- */
- @RequestMapping(value =”/add”, method = { RequestMethod.GET, RequestMethod.POST })
- public JsonResultsaveCoupon(HttpServletRequest request, HttpServletResponse response, Long buyerId,
- Long couponId) {
- try {
- // 判断当前用户是否可用
- Users users = usersService.getUsersById(buyerId);
- if (users ==null) {
- logger.info(“OrderController.saveCoupon.buyerId “ + buyerId);
- returnnew JsonResult(JsonResultCode.FAILURE,”你的账号有误,请重新登录”,””);
- }
- //判断当前用户的状态是否可用
- int status = users.getStatus();
- if (UserStatus.FORBIDDEN == status) {
- returnnew JsonResult(JsonResultCode.FAILURE,”你的账号已经被禁用了,请联系公司客服”,””);
- }
- if (couponId ==null) {
- returnnew JsonResult(JsonResultCode.SUCCESS,”活动已经结束”,””);
- }
- //新增
- int result = couponReceiveService.insert(buyerId, couponId);
- if (result == -1) {
- returnnew JsonResult(JsonResultCode.SUCCESS,”领取失败,已经领取过优惠券了”,””);
- }elseif (result ==0) {
- returnnew JsonResult(JsonResultCode.FAILURE,”领取失败,活动已经结束”,””);
- }else {
- returnnew JsonResult(JsonResultCode.SUCCESS,”领取成功”,””);
- }
- }catch (Exception ex) {
- logger.error(“[CouponController][saveCoupon] exception”, ex);
- returnnew JsonResult(JsonResultCode.FAILURE,”系统错误,请稍后重试”,””);
- }
- }
- }
最终总结:用户优惠券会发放在买家的APP中的个人中心里面,然后进行点击查看与领取,然后在支付的时候会自动显示出优惠券的数据,非常的灵活与方便。
