产品角度
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
( id
bigint(20)unsignedNOTNULL AUTO_INCREMENTCOMMENT’自动增加ID’,region_id
bigint(20)DEFAULTNULLCOMMENT’所属区域’,type
int(11)DEFAULTNULLCOMMENT’所属类型,1为满减’,name
varchar(32)DEFAULTNULLCOMMENT’优惠券名称’,img
varchar(64)DEFAULTNULLCOMMENT’图片的URL地址’,start_time
datetimeDEFAULTNULLCOMMENT’优惠券开始时间’,end_time
datetimeDEFAULTNULLCOMMENT’优惠券结束时间’,money
decimal(11,2)DEFAULTNULLCOMMENT’优惠券金额,用整数,固定值目前。’,status
int(11)DEFAULTNULLCOMMENT’状态,0表示未开始,1表示进行中,-1表示结束’,remarks
varchar(512)DEFAULTNULLCOMMENT’优惠券的说明’,create_time
datetimeDEFAULTNULLCOMMENT’创建时间’,full_money
decimal(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
( id
bigint(20)unsignedNOTNULL AUTO_INCREMENTCOMMENT’自动增加ID’,buyer_id
bigint(20)DEFAULTNULLCOMMENT’买家ID’,coupon_id
bigint(20)DEFAULTNULLCOMMENT’优惠券编号’,coupon_money
decimal(12,2)DEFAULTNULLCOMMENT’券额’,create_time
datetimeDEFAULTNULLCOMMENT’领取时间’,full_money
decimal(12,2)DEFAULTNULLCOMMENT’金额满’,status
int(11)DEFAULTNULLCOMMENT’状态,1为已使用,0为已领取未使用,-1为已过期’,- PRIMARYKEY (
id
) - )ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT=’优惠券领取记录表’;
3.优惠券消费记录表
说明:优惠券消费记录表,是需要知道那个买家,那个优惠券,那个订单使用了优惠券,这边有个特别注意的地方是,这个优惠券的执行在支付成功后的回调。
- CREATETABLE
coupon_logs
( id
bigint(20)unsignedNOTNULL AUTO_INCREMENTCOMMENT’自动增加ID’,buyer_id
bigint(20)DEFAULTNULLCOMMENT’买家ID’,coupon_receive_id
bigint(20)DEFAULTNULLCOMMENT’优惠券id’,order_number
varchar(64)DEFAULTNULLCOMMENT’订单号’,order_original_amount
decimal(12,2)DEFAULTNULLCOMMENT’原订单金额’,coupon_amount
decimal(11,2)DEFAULTNULLCOMMENT’优惠券的金额’,order_final_amount
decimal(12,2)DEFAULTNULLCOMMENT’抵扣优惠券之后的订单金额’,create_time
datetimeDEFAULTNULLCOMMENT’领取时间’,status
int(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中的个人中心里面,然后进行点击查看与领取,然后在支付的时候会自动显示出优惠券的数据,非常的灵活与方便。