Magento 2 客製訂單編號
一般而言,訂單編號的產生會以流水號的方式遞增。而在實務上,有時編號會需要照特定格式去遞增。Magento的訂單編號有一固定公式,足以在一般慣用的格式範圍內,達到客製訂單編號的需求。
首先,我們先了解Magento訂單編號的組成要素:
項目 | 存放位置 |
前綴
prefix |
資料表 sales_sequence_profile.prefix |
後綴
suffix |
資料表 sales_sequence_profile.suffix |
目前流水序
sequence_value |
資料表 sequence_order_{parameter}.sequence_value的最大值 |
起始值
start_value |
資料表 sales_sequence_profile.start_value |
跳號間距
step |
資料表 sales_sequence_profile.step |
位數
padded to Xdigits |
程式檔案 module-sales-sequence/Model/Sequence.php 裏的常數DEFAULT_PATTERN |
一個完整的訂單編號會由以下公式產生:
increment_id = prefix + ((sequence_value – start_value) * step + start_value) {padded to Xdigits} + suffix
此公式亦適用於invoice編號, shipment編號, credit memo編號,唯一差異僅在於sequence_value存放資料表分別為 sequence_invoice_{parameter}, sequence_shipment_{parameter}, sequence_creditmemo_{parameter}.
這裡我們模擬某商店(store_id=1)在資料庫的相關資料:
TABLE sales_sequence_meta | |||
meta_id | entity_type | store_id | sequence_table |
5 | order | 1 | sequence_order_1 |
6 | invoice | 1 | sequence_invoice_1 |
7 | creditmemo | 1 | sequence_creditmemo_1 |
8 | shipment | 1 | sequence_shipment_1 |
在sales_sequence_meta資料表中,store_id 1 對應到的資料範圍為meta_id = 5 ~ 8. 針對訂單編號,這裡要抓取meta_id=5的值.
TABLE sales_sequence_profile | ||||||||
profile_id | meta_id | prefix | suffix | start_value | step | max_value | warning_value | is_active |
5 | 5 | P | S | 1 | 1 | 4294967295 | 4294966295 | 1 |
6 | 6 | NULL | NULL | 1 | 1 | 4294967295 | 4294966295 | 1 |
7 | 7 | NULL | NULL | 1 | 1 | 4294967295 | 4294966295 | 1 |
8 | 8 | NULL | NULL | 1 | 1 | 4294967295 | 4294966295 | 1 |
根據sales_sequence_meta的關聯查詢,在sales_sequence_profile資料表中,訂單編號的資料要抓取meta_id=5的值.
TABLE sequence_order_1 |
sequence_value |
1 |
2 |
3 |
根據sales_sequence_meta的關聯查詢,訂單編號的流水號資料表為 sequence_order_1,從sequence_order_1得到最新的流水號為3.
在取得公式所需的參數值後,即可帶入公式得出下一個訂單編號
‘P’ + ((3 – 1) * 1+ 1) {padded to 9 digits} + ‘S’ = P000000004S
瞭解了編號的產生方式,接著來看幾個依據需求客製編號的釋例。
Case A.
針對 store_id 為 1 的商店,其訂單編號加上前綴 OD,且起始編號由200000000開始.
- 取得訂單編號規則的meta_id
SELECT `meta_id` FROM `sales_sequence_meta` WHERE `store_id` = ‘1’ AND `entity_type` = ‘order’;
- 訂單編號規則異動SQL
UPDATE `sales_sequence_profile` SET `prefix` = ‘OD` AND `start_value` = ‘200000000’ WHERE `meta_id` = ‘{query_order_meta_result.meta_id}’;
Case B.
針對 store_id 為 3 的商店,其發票編號間隔為10,訂單編號加上後綴9.
- 取得發票編號規則的meta_id
SELECT `meta_id` FROM `sales_sequence_meta` WHERE `store_id` = ‘3’ AND `entity_type` = ‘invoice’;
- 發票編號規則異動SQL
UPDATE `sales_sequence_profile` SET `step` = ‘10’ WHERE `meta_id`=’{query_invoice_meta_result.meta_id}’;
- 取得訂單編號規則的meta_id
SELECT `meta_id` FROM `sales_sequence_meta` WHERE `store_id` = ‘3’ AND `entity_type` = ‘order’;
- 訂單編號規則異動SQL
UPDATE `sales_sequence_profile` SET `suffix`=’9’ WHERE `meta_id`=’{query_order_meta_result.meta_id}’;
以上例子皆是透過簡單的資料庫設定即可達到客制需求.如果今天想要的客製跳脫了公式範圍,又該如何實踐呢?
我們已知編號產生的程式位置在Magento\SalesSequence\Model\Sequence::getCurrentValue,因此,可以在繼承該類別的前提下新自己的Sequence類別,並在自己的類別下客制方法getCurrentValue,接著透過di.xml[https://devdocs.magento.com/guides/v2.0/extension-dev-guide/build/di-xml-file.html]的設定去注入. 雖然這樣幾乎可以達到完全自由的客製,在此卻要特別提醒,一旦使用依賴注入,在安裝其他extension時,需要注意是否存在覆蓋衝突而造成功能損壞. 因此我們仍建議盡量在既有公式的規則下去客製訂單編號喔!
以上就是這次關於如何在Magento 2 客製化訂單編號的分享,更多電商營運與架站的知識,歡迎訂閱歐斯瑞電子報,以及追蹤我們的Facebook粉絲專頁!
延伸閱讀:
參考來源:https://www.classyllama.com/blog/m2-incrementid
我要留言