最近公司让写一个优惠卷的demo,最近总结学习了一下,做下总结;大佬们别喷我哈,新人求照顾~
做促销活动的目的就是增加订单量与知名度等等, 那么对于电商(家具)平台而言,我们采用优惠券的这种方式进行促销。
首先设计数据库表
1. 优惠券基础信息表
说明:任何一个优惠券或者其他促销都是有一个基础的说明,比如:优惠券名称,类型,价格,有效期,状态,说明等等基础信息。
DROP TABLE IF EXISTS `coupon`; CREATE TABLE `coupon` ( `coupon_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自动增加ID', `coupon_no` varchar(32) DEFAULT NULL COMMENT '优惠券编号', `coupon_name` varchar(64) DEFAULT NULL COMMENT '优惠券名称', `coupon_send_type` tinyint(2) DEFAULT NULL COMMENT '优惠券发放类型,1为注册时发送', `coupon_setting_type` tinyint(2) DEFAULT NULL COMMENT '优惠券结算类型,1,折抵价,2,满减券,3,折扣券', `coupon_money` decimal(12,2) unsigned zerofill DEFAULT NULL COMMENT '优惠金额', `coupon_number` int(11) unsigned zerofill DEFAULT NULL COMMENT '优惠券发放数量', `coupon_start_time` datetime DEFAULT NULL COMMENT '优惠券开始时间', `coupon_end_time` datetime DEFAULT NULL COMMENT '优惠券结束时间', `coupon_start_period` datetime DEFAULT NULL COMMENT '优惠券有效开始时间。', `coupon_end_period` datetime DEFAULT NULL COMMENT '优惠券有效结束时间。', `coupon_status` tinyint(2) DEFAULT '0' COMMENT '状态,0表示可用,-1表示不可用', `categoryids` varchar(64) DEFAULT NULL COMMENT '所属分类ID的集合,用逗号分隔存储', `coupon_remarks` varchar(128) DEFAULT NULL COMMENT '优惠券的备注信息', `create_time` datetime DEFAULT NULL COMMENT '优惠券创建时间', PRIMARY KEY (`coupon_id`), UNIQUE KEY `unique_coupon` (`coupon_name`) USING BTREE, UNIQUE KEY `unique_coupon_no` (`coupon_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='优惠券信息表';
说明:业务说可以规定某个分类(例如:家具一类,水果一类等。。),做优惠券,主要是增加买家用户。价格可以后端进行设置。
状态的意义在于,用户需要注册完成后,然后主动认领才有效,为什么要这样设计呢?目的只有一个:让用户在对APP这个软件玩一会儿,增加熟悉程度.
2. 优惠券领取记录表
说明:我们需要记录那个买家,什么时候进行的领取,领取的的时间,券的额度是多少等等,是否已经使用等信息
DROP TABLE IF EXISTS `coupon_receive`; CREATE TABLE `coupon_receive` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自动增加ID', `user_id` bigint(20) DEFAULT NULL COMMENT '用户ID', `coupon_id` bigint(20) DEFAULT NULL COMMENT '优惠券ID', `status` tinyint(2) DEFAULT NULL COMMENT '状态,0表示可用,-1表示不可用', `create_time` datetime DEFAULT NULL COMMENT '领取时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='优惠券领取记录表';
3.优惠券消费记录表
说明:优惠券消费记录表,是需要知道那个买家,那个优惠券,那个订单使用了优惠券,这边有个特别注意的地方是,这个优惠券的执行在支付成功后的回调。
DROP TABLE IF EXISTS `coupon_logs`; CREATE TABLE `coupon_logs` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自动增加ID', `user_id` bigint(20) DEFAULT NULL COMMENT '买家ID', `coupon_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='优惠券消费记录表';
第一次做是有点麻烦,因为不懂业务,只需理解业务后,相对而言,优惠券的难度不算大,重点的是业务方面的指导与学习,包括数据库的架构与设计等等,还有就是思路的学习。
相关核心代码如下:
由于是前后分离写法,所以我只需提供好接口就可以:
3.1 查询所有买家的优惠券。
3.2 判断买家是否可以领取优惠券。
3.3 买家主动领取优惠券
/** * 优惠券基础配置表 * @author administrator */ @RestController public class CouponController extends BaseController { private static final Logger logger=LoggerFactory.getLogger(CouponController.class); @Autowired private CouponService couponService; /** * 分页查询优惠卷,可以根据优惠卷名称和有效期进行筛选 * @param couponName * @param couponStartPeriod * @param couponEndPeriod * @param currentPage * @param pageSize * @return RestResponse */ @RequestMapping("/promotionserver/list") public RestResponse deliveryList(@RequestParam(required = false) String couponName, @RequestParam(required = false) String couponStartPeriod, @RequestParam(required = false) String couponEndPeriod, @RequestParam(value = "currentPage", defaultValue = "1") Integer currentPage, @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize) { try { PageBean<Coupon> pageBean = couponService.findByCouponId(couponName,couponStartPeriod,couponEndPeriod, currentPage, pageSize); return RestResponse.success(pageBean); } catch (Exception e) { e.printStackTrace(); } return RestResponse.failure(GenericCode.ERROR); } /** * 新增优惠券 * @param record * @return RestResponse */ @RequestMapping(value = "/promotionserver/toAdd") public RestResponse add(@RequestBody Coupon record) { try { couponService.add(record); return RestResponse.failure(GenericCode.SUCCESS); } catch (Exception e) { logger.error("[CouponController][add] coupon:", e); return RestResponse.failure(GenericCode.SYSTEM_ERROR); } } // /** // * 修改活动状态 // */ // @ResponseBody // @RequestMapping(value = "/updateStatus", method = { RequestMethod.GET, RequestMethod.POST }) // public RestResponse updateStatus(HttpServletRequest request, HttpServletResponse response, Integer status, Integer id) { // try { // if(status == null || id == null){ // return RestResponse.failure(GenericCode.ERROR_PARAM); // } // int result = couponService.updateStatus(status,id); // if (result > 0) { // return RestResponse.failure(GenericCode.SUCCESS); // } else { // return RestResponse.failure(GenericCode.ERROR); // } // } catch (Exception e) { // logger.error("[CouponController][updateStatus] status:", e); // return RestResponse.failure(GenericCode.SYSTEM_ERROR); // } // } }
总结:用户优惠券会发放在买家的个人中心里面,然后进行点击查看与领取,然后在支付的时候会自动显示出优惠券的数据。