科技改變生活 · 科技引領未來
對于商城系統來說,運費系統是必不可少的,最簡單的就是在每個商品添加的時候設置此商品購買時候的運費,但是這個邏輯并不能滿足用戶的需求,無法按照客戶的地址設置不同的運費,設置地區包郵,不配送等一系列的操作。那怎么能更快更簡單的實現這個功能呢,這
對于商城系統來說,運費系統是必不可少的,最簡單的就是在每個商品添加的時候設置此商品購買時候的運費,但是這個邏輯并不能滿足用戶的需求,無法按照客戶的地址設置不同的運費,設置地區包郵,不配送等一系列的操作。那怎么能更快更簡單的實現這個功能呢,這篇文章,我會將我開發CRMEB單商戶系統時的設計思路拿出來和大家分享,希望大家看完能有所啟發并找到更好的解決辦法。
希望大家看完在動手,看一半就覺得自己行了,容易寫BUG~
初版~
對于運費的計算來說,最開始就是要知道用戶選擇的送貨地址,運費計算也不用過于精確地址信息,所以我在全國省市區的數據庫里增加了城市ID字段,用戶在添加地址的時候,將對應的城市ID也同時存儲在用戶的地址信息中,這樣,用戶在每次切換地址的時候,可以根據城市ID字段判斷用戶所處的城市。
接下來,先創建一個最簡單運費模版A表,里面只有城市ID和運費,只要用戶的城市ID就能找出你要付多少運費啦,但是當我設置運費的時候,發現了一個大問題,全國這么多城市,難道要一個一個的進行設置么?當然不,國家運輸系統這么完善,只有很少的地區運費是不同的,我只要把不同運費的地區設置了就好。其他的,就讓他用默認的數據就可以啦。于是,我創建了一條默認數據,城市ID設置為0,當用戶的地址在數據里面找不到對應的運費的時候,我就給他默認的運費。
好,最簡單的運費模版已經出來了,管理者可以簡單的設置每個地區的運費是多少,在用戶下單的時候按照地址計算運費就能得出對應地址的運費啦。
進階版~
思考一下,商城里面包含多種多樣的商品,總不能一件衣服和一臺冰箱的運費是一樣的吧,那豈不是很虧。所以商城里面需要多個運費模版進行不同的價格計算,我創建了新的數據B表來存儲多個運費模版,包括模版名稱,添加時間,A表內就可以增加B表內對應的模版ID,和城市ID和運費來計算不同運費模版下同一個城市的不同運費啦。
接下來,我考慮物流中會出現首件和續件的問題,那么我們地區運費就要增加續件的字段,來存儲續件的金額,比如我購買了2件商品,商品的首件是10元,續件是5元,那么這個訂單的運費就是首件加上續件的費用一共15元。
現在運費模版已經成型了,每個商品都可以使用不同的運費模版來計算整體訂單的運費,購買多件商品,就可以按照不同用戶地址,不同的運費模版,不同的首件和續件的費用,來確定當前訂單的世紀運費了,接下來就是繼續細化運費模版的其他功能了。
終極版~
江浙滬包郵?這個問題又出現在了我的腦海中,那我怎么能在模版中設置包郵信息呢?思前想后,我發現一個最簡單的辦法,就是把對應包郵的地址的首件和續件費用都寫成0,計算的時候就不會增加運費了。
不過,如果是滿多少錢進行包郵呢?如果說,我有一個上海地區的運費模版,我想用戶在購買超過100元的時候給他包郵怎么辦。我又開始了我的發呆時間。。。
想到了,我又給A表里增加了滿額包郵的字段,用來記錄此區域需要滿額的金額,計算的時候將同一個運費模版下的金額加起來,只要大于了這個金額,我就直接跳過此模版的計算。
訂單在購買多個商品,牽扯到多個運費模版的時候,可以在計算的時候按照運費模版進行數據的分類整理,計算出每個運費模版里面商品的件數,總金額,然后每個運費模版單獨計算,先通過計算此運費模版是否滿足了包郵,如果滿足跳過后面的運費計算,如果沒有滿足包郵情況的時候,繼續進行件數的首件和續件的計算,將每次計算出來的運費相加,就得出了最后的訂單運費。
接下來,就是完善我們的運費模版了,模版名稱,模版是按照件數、重量還是體積進行運費的計算,包郵是否還要按照別的情況進行計算。
CRMEB運費模版的實現
CRMEB單商戶系統中的運費模版很強大了,不僅可以設置不同地區的運費,還可以判斷運費模版是按照件數、體積還是重量進行計算。可以設置單獨的包郵數據以及指定地區不送貨的邏輯。首件和續件的金額計算可以設定首件件數。包郵同時判斷了件數和金額。可以滿足大多數商城系統管理者的需求。
運費模版的添加
后臺添加運費模版的頁面,填寫運費模版的名稱,選擇該運費模版是按照那種計費方式進行計費(件數,重量,體積),選擇對應的城市數據,添加運費和包郵信息等。
運費模版的計算邏輯
1.先獲取到用戶訂單的商品和地址信息,將所有的商品按照運費模版進行分組整理,得到每個運費模版的商品總數,總價和此運費模版的運費金額,指定包郵信息等。$cartInfo變量里面存儲的就是該訂單下所有的商品信息,包括金額,件數或體積或重量,對應的運費模版ID等信息。$addr里面包含用戶現在選擇的的地址信息,用于最后查詢包郵或者運費。
2.按照用戶當前選擇的地址,根據當前地址數據內的city_id查詢當前地址是否在指定包郵的地區內,然后在判斷商品件數和金額是否大于設定的件數和金額,滿足條件在運費模版的數組中刪除此運費模版的數據。
3.經過步驟2,$temp_num數組中,只會剩下需要計算運費的數據,系統接下來會在先計算出首件運費最大值,設置初始運費為0開始計算訂單所需運費。
4.循環計算運費,將首件最大的運費模版設置為首件計算,剩余的模版都按照續件進行金額的計算,如果有多個首件金額等于最大值,會將多個運費模版當作首件進行計算,最后取得運費最大值返回。
金悅