1. 前言
前面已經(jīng)實現(xiàn)了基礎(chǔ)的商品模塊,本章節(jié)繼續(xù)梳理近年間電商行業(yè)大熱的眾籌和秒殺。
課程傳送門-眾籌商品
課程傳送門-秒殺商品
2. 功能分析
2.1 眾籌
2.1.1 需求分析
與普通商品相比,眾籌商品有如下特殊的業(yè)務(wù)邏輯:
- 需要設(shè)置目標金額與截止時間;
- 到達截止時間時如果總訂單金額低于目標金額則眾籌失敗,并退款所有訂單;
- 到達截止時間時如果總訂單金額大等于目標金額則眾籌成功;
- 眾籌訂單不支持用戶主動申請退款;
- 在眾籌成功之前訂單不可發(fā)貨;

眾籌商品詳情頁-效果圖
2.1.2 實現(xiàn)邏輯
眾籌商品是一種新型的商品類型,它有獨特的購買規(guī)則和特有屬性,但它也擁有普通商品的所有屬性,從購買下單到商家發(fā)貨、用戶評分整體的商品購買流程是一樣的。因此,我們只需要在原有商品下單、退款等具體實現(xiàn)過程中,針對眾籌商品做相應(yīng)的規(guī)則校驗即可。
2.1.3 表設(shè)計
眾籌商品擁有非普通商品的特有屬性,采用新增眾籌商品表的方式來保存相關(guān)屬性,眾籌商品表與商品表的關(guān)聯(lián)關(guān)系為一對一。
具體表結(jié)構(gòu)如下:
# 眾籌商品表
CREATE TABLE `crowdfunding_products` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, # 自增ID
`product_id` int(10) unsigned NOT NULL, # 對應(yīng)商品表的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', # 參與眾籌用戶數(shù)
`end_at` datetime NOT NULL, # 眾籌結(jié)束時間
`status` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'funding', # 當前眾籌狀態(tài),默認眾籌中
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 代碼借鑒
本章節(jié)眾籌商品的處理是對原有普通商品的拓展,不管是從邏輯處理還是從表設(shè)計上來看,都是的。當有拓展出的新需求出現(xiàn)時,怎么制定合適的解決方案,這一點也是我們需要去思考和學(xué)習(xí)的。本章節(jié)學(xué)習(xí)到了以下幾點:
- 根據(jù)需求拓展和封裝現(xiàn)有代碼;
- 定時任務(wù)和異步任務(wù)的選用考量;
補充說明一下課程中的眾籌失敗的業(yè)務(wù)處理中,在選用定時任務(wù)和異步任務(wù)上,真的有學(xué)習(xí)到。
眾籌失敗,采用定時任務(wù)每隔一段時間掃描所有眾籌狀態(tài)滿足眾籌失敗條件的商品,更新眾籌狀態(tài)為失敗,并進行退款。精彩的點就在于,對退款操作的考慮。課程中,考慮到退款操作涉及第三方,耗時長,將退款操作改為異步隊列執(zhí)行,超贊的解決方案!
課程中具體的考量原文如下:

眾籌商品實現(xiàn)方案的考量

眾籌商品退款操作的優(yōu)化