1. 前言
前面已经实现了基础的商品模块,本章节继续梳理近年间电商行业大热的众筹和秒杀。
课程传送门-众筹商品
课程传送门-秒杀商品
2. 功能分析
2.1 众筹
2.1.1 需求分析
与普通商品相比,众筹商品有如下特殊的业务逻辑:
- 需要设置目标金额与截止时间;
- 到达截止时间时如果总订单金额低于目标金额则众筹失败,并退款所有订单;
- 到达截止时间时如果总订单金额大等于目标金额则众筹成功;
- 众筹订单不支持用户主动申请退款;
- 在众筹成功之前订单不可发货;
2.1.2 实现逻辑
众筹商品是一种新型的商品类型,它有独特的购买规则和特有属性,但它也拥有普通商品的所有属性,从购买下单到商家发货、用户评分整体的商品购买流程是一样的。因此,我们只需要在原有商品下单、退款等具体实现过程中,针对众筹商品做相应的规则校验即可。
2.1.3 表设计
众筹商品拥有非普通商品的特有属性,采用新增众筹商品表的方式来保存相关属性,众筹商品表与商品表的关联关系为一对一。
具体表结构如下:
# 众筹商品表
CREATE TABLE `crowdfunding_products` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, # 自增ID
`product_id` int(10) unsigned NOT NULL, # 对应商品表的ID
`target_amount` decimal(10,2) NOT NULL, # 众筹目标金额
`total_amount` decimal(10,2) NOT NULL DEFAULT '0.00', # 当前已筹金额
`user_count` int(10) unsigned NOT NULL DEFAULT '0', # 参与众筹用户数
`end_at` datetime NOT NULL, # 众筹结束时间
`status` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'funding', # 当前众筹状态,默认众筹中
PRIMARY KEY (`id`),
KEY `crowdfunding_products_product_id_foreign` (`product_id`),
CONSTRAINT `crowdfunding_products_product_id_foreign` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
# 商品表
ALTER TABLE `products` ADD `type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'normal'; # 商品类型,默认为普通商品
2.1.4 代码借鉴
本章节众筹商品的处理是对原有普通商品的拓展,不管是从逻辑处理还是从表设计上来看,都是的。当有拓展出的新需求出现时,怎么制定合适的解决方案,这一点也是我们需要去思考和学习的。本章节学习到了以下几点:
- 根据需求拓展和封装现有代码;
- 定时任务和异步任务的选用考量;
补充说明一下课程中的众筹失败的业务处理中,在选用定时任务和异步任务上,真的有学习到。
众筹失败,采用定时任务每隔一段时间扫描所有众筹状态满足众筹失败条件的商品,更新众筹状态为失败,并进行退款。精彩的点就在于,对退款操作的考虑。课程中,考虑到退款操作涉及第三方,耗时长,将退款操作改为异步队列执行,超赞的解决方案!
课程中具体的考量原文如下:
众筹商品实现方案的考量
众筹商品退款操作的优化
网友评论