接著在講一個也是很常用到的功能,優惠!!!
看似人人喜愛的兩個字,實際上範圍跟方法多到爆炸....,
優惠券、折扣碼、任選xxx系列,各種奇奇怪怪的折扣方式,
因此這邊我們只談比較單純的整筆訂單類型的優惠,
全館免運、全館折扣等等。
一樣說明一下情境,有兩個全館類型的折扣活動,
分別為全館滿2000免運以及全館滿1500打9折兩種,
如果有金額有超過就算符合,接著我們看一下資料結構
//優惠項目
Schema::create('discount', function (Blueprint $table) {
$table->string('id', 30)->comment('優惠id');
$table->string('name', 100)->comment('優惠名稱');
$table->string('type', 30)->comment('折扣類型');
$table->integer('target_price'); //達成目標金額
$table->integer('discount_percent')->default(100)->comment('全館折扣百分比');
$table->dateTime('start_at')->comment('開始時間');
$table->dateTime('end')->comment('結束時間');
$table->primary(['id']);
});
非常陽春的結構,但不影響我們跑流程,
在取得使用者購物車的時候,抓出符合時間的全館優惠,
並且逐一比對購物車金額判斷是否達成條件,
$discount_data = [];
foreach($discount as $item){ //$discount為符合條件的優惠資料
//判斷金額是否達標
if($cart->amount >= $item->target_price){
$discount_arr[] = [
'item' => $item,
'discount_price' => ceil($cart->amount * $item->discount_percent / 100) //預算要折扣的金額
];
}
}
$cart->discount_data = $discount_data;
最後把達成條件的優惠塞入購物車裡面,這樣就可以顯示出目前符合哪些條件,
並且透過頁面顯示預算好的折扣費用。
其中有幾點跟大家特別說明一下,
為什麼要透過後端直接計算要顯示的折扣金額,
主要是跨裝置就不用寫多套算法,也避免前後端算法不同步的錯誤,
當然這部份還是要看網站架構決定,包含數據讀取的優化,以及網站使用速度體感,
還有更多優惠類型一樣不屬於我們要講的部份了(水太深...)。
終於寫完了...
寫到後面感覺優惠要寫真的不是一兩篇可以寫完的,牽扯到太多架構,
最後決定用比較簡單的案例來講,希望大家能喜歡,
以上就是今天的主要內容。