促销管理——优惠券设计与架构

最近公司让写一个优惠卷的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);
//		}
//	}

}


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





猜你喜欢

转载自blog.csdn.net/qqtingshuo/article/details/80610956