下單限購邏輯

①初始化限購配置:限購方式配置,比如按用戶id,客戶端ip,收貨人電話號(hào)等,配置限購時(shí)長,限購件數(shù)等;

        self::$_cache_strategy_config = [
            "ip" => ["time" => 86400 * 15, "limit" => 1],
            "user_id" => ["time" => 86400 * 15, "limit" => 1],
            "delivery_mobilephone" => ["time" => 86400 * 15, "limit" => 1],
            "imei" => ["time" => 86400 * 15, "limit" => 1],
        ];

然后是活動(dòng)類型的限購,比如秒殺活動(dòng)的商品限購1件,搶購活動(dòng)的商品限購5件等。

self::$_cache_strategy_config_factor = [
    "MS" => [
        "ip" => 10,
        "user_id" => 1,
        "delivery_mobilephone" => 1,
    ],
    "QG" => [
        "ip" => 10,
        "user_id" => 1,
        "delivery_mobilephone" => 1,
    ],
];

②設(shè)置限購商品數(shù)據(jù)內(nèi)容,根據(jù)查詢出來的商品信息,以及對(duì)應(yīng)的活動(dòng)信息進(jìn)行判斷。
1.處于活動(dòng)中的商品判斷限購,業(yè)務(wù)里根據(jù)商品或者活動(dòng)層面的字段標(biāo)識(shí)區(qū)分,例如秒殺活動(dòng),限時(shí)搶購,付郵試用等這些判斷出是需要限購的商品,然后檢驗(yàn)一下用戶當(dāng)前購買件數(shù)是否超過指定值,作出異常處理。
這里先判斷單sku是否超標(biāo),然后判斷多sku和是否超標(biāo),這里需要在商品層面將spu商品標(biāo)記出來,

        if(isset(self::$checkProduct[$product['product_id']])){
            self::$checkProduct[$product['product_id']] += $product['count'];
        } else {
            self::$checkProduct[$product['product_id']] = $product['count'];                    
        }

符合的則記錄限購商品的相關(guān)信息,供后續(xù)redis使用。

self::$productActivityBuyCountArr[$product['product_id'] . '_' . $product['sku_id']] = $product['count'];//當(dāng)前sku的購買數(shù)量
$autoCacheInfo['tmp_limit_count'] = $activityLimitCount;
self::$productActivityTypeArr[$product['product_id'] . '_' . $product['sku_id']] = $autoCacheInfo; //限購商品信息

③商品檢驗(yàn)完后,開始檢查用戶是否購買過,即判斷是否超過已購買的限購次數(shù),在redis存儲(chǔ)數(shù)據(jù)進(jìn)行判斷和儲(chǔ)存。
1.一種商品可能會(huì)陸續(xù)報(bào)名多個(gè)活動(dòng)類型的限購,因此redis存儲(chǔ)時(shí)標(biāo)識(shí)的key應(yīng)該區(qū)分開來,例如

$key = $value['productId'] . '_' . $value['activityId'];
$cacheKey = $keyword . $keyword_val . '_' . $key; 
// user_id13432_7654_533或ip127.0.0.1_13432_533或phone15901438107_13432_533

2.根據(jù)對(duì)應(yīng)的緩存key,incr指定的商品購買數(shù)量,并設(shè)置過期時(shí)間。然后檢驗(yàn)incr后的結(jié)果與該商品限購數(shù)量進(jìn)行比較,如果超過限購數(shù)量,則需要還原之前購買的次數(shù)的緩存,即將對(duì)應(yīng)商品購買的數(shù)量還原減回去。

if (!empty(self::$_decr_key)) {
    foreach (self::$_decr_key as $decrKey) {
        CacheSDK::RedisDefault()->delBuyActivityProductRecord($decrKey, self::$_count);
        if (isset(self::$_ActivityLimitItems[$productId][$decrKey])) {//回滾的時(shí)候去掉限制策略數(shù)據(jù)
            unset(self::$_ActivityLimitItems[$productId][$decrKey]);
        }
    }
}
CacheSDK::RedisDefault()->delBuyActivityProductRecord($cheatKey, self::$_count);
//回滾的時(shí)候去掉限制策略數(shù)據(jù)
if (isset(self::$_ActivityLimitItems[$productId][$cheatKey])) {//回滾的時(shí)候去掉限制策略數(shù)據(jù)
    unset(self::$_ActivityLimitItems[$productId][$cheatKey]);
}

(這塊也是個(gè)bug,對(duì)于單商品多sku的購買,這里decrKey只會(huì)覆蓋上一個(gè),應(yīng)該用```self::_ActivityLimitItems[productId][cacheKey]```來獲得相應(yīng)的緩存key和對(duì)應(yīng)商品spu的總數(shù)量,不用管self::$_decr_key )
如果可以購買,則記錄當(dāng)前商品的限購信息

private static $_decr_key = array(); //每次購買策略次數(shù)增加的key
array_push(self::$_decr_key, $cacheKey);
self::$_ActivityLimitItems[$productId][$cacheKey] = self::$_count; //添加被限制的策略數(shù)據(jù),self::$_count為當(dāng)前購買的數(shù)量才對(duì)

(這塊應(yīng)該是個(gè)bug,同一商品買多個(gè)sku情況下,商品數(shù)量應(yīng)該累加的)

if(isset(self::$_ActivityLimitItems[$productId][$cacheKey])){
     self::$_ActivityLimitItems[$productId][$cacheKey] += self::$_count;
 }

④其他情況的失敗,例如下單失敗或者某個(gè)服務(wù)掛掉,用戶取消訂單等情況,之前限購的數(shù)據(jù)應(yīng)該回滾,同樣走上面的回滾邏輯,數(shù)據(jù)也是之前限購的數(shù)據(jù)內(nèi)容(self::$productActivityTypeArr,做到按sku維度存儲(chǔ)信息,然后按spu維度去統(tǒng)計(jì)限購,也就是循環(huán)多次想加的邏輯);取消訂單的話,數(shù)據(jù)需要根據(jù)訂單重新查詢,然后拼接去redis中回滾。
⑤下單購買超出限購,拋出異常,提示已購買數(shù)量和限購總數(shù),即還可以購買幾件或者已購買完限購量。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 電商數(shù)據(jù)分析基礎(chǔ)指標(biāo)體系(文章來源) 本文主要介紹了電商數(shù)據(jù)分析的基礎(chǔ)指標(biāo)體系,涵蓋了流量、銷售轉(zhuǎn)化率、客戶價(jià)值、...
    美瞳的美瞳閱讀 10,247評(píng)論 0 46
  • 每天逛淘寶和京東的時(shí)候,映入眼簾的都是品類繁多的商品,但是當(dāng)我們選擇分類或者直接搜索的時(shí)候,按條件篩選時(shí),系統(tǒng)卻往...
    自媒體_鄭在別處閱讀 17,038評(píng)論 2 77
  • 拍攝地點(diǎn):深大 拍攝器材:canonA1 FD501.4 拍攝作者:d_you 圖片版權(quán)歸本人所有,圖片授權(quán)于簡書...
    3e7475c358da閱讀 301評(píng)論 0 0
  • 與日俱增的悸動(dòng) 心底那道身影 無法揮去無法抹去
    紋泱閱讀 319評(píng)論 0 0
  • 原文:若我們不是從自身的體驗(yàn)出發(fā)去生活,而是活在外在價(jià)值體系中,活在別人的眼光中,關(guān)系即是物化的。 我的想法:其實(shí)...
    木棉花開映晚情閱讀 450評(píng)論 4 7

友情鏈接更多精彩內(nèi)容