一.知識準備
在淘寶網(wǎng),產(chǎn)品指的是標準化產(chǎn)品,由(類目,關(guān)鍵屬性)決定,如一個手機產(chǎn)品由 (手機類目,(品牌,型號))決定。 SPU,Standard Product Unit(標準化產(chǎn)品單元),一般是由(關(guān)鍵屬性:屬性值)這樣的鍵值對組成的。 SKU,Stock Keeping Uint(庫存量單位),由(銷售屬性:屬性值)的鍵值對,它直接影響買家的購買和賣家的庫存管理,如 某個服裝的 (顏色:黑色,尺碼:XXL)。
總結(jié)一下就是SPU是標準化產(chǎn)品單元,區(qū)分品種;SKU是庫存量單位,區(qū)分單品;商品特指與商家有關(guān)的商品,可對應(yīng)多個SKU。我們通常所說的"寶貝"其實指的是商品。當在購買存在多個SKU的寶貝的時候,我們第一步需要做的就是選擇一個SKU,然后才能進行購買加入購物車等操作。
二.接口數(shù)據(jù)和算法分析
為了便于計算機實現(xiàn),產(chǎn)品的關(guān)鍵屬性以及銷售屬性以及他們的屬性值在計算機系統(tǒng)都會進行編碼,使用數(shù)字來表示,方便計算機進行計算。如果想詳細了解淘寶某個類目下的某類產(chǎn)品的各種屬性可以通過屬性工具進行查看: 屬性工具 。
這里以淘寶開放平臺的SKU結(jié)構(gòu)為例子講解SKU對象
一個SKU結(jié)構(gòu) 一般包含:
- skuId
- SKU的組成(p1:v1;p2:v2;p3:v3...),用來表示當前SKU由哪些銷售屬性組成以及對應(yīng)的屬性值是什么
- 還有當前SKU鍵值對對應(yīng)的中文名字符串(因為上面的組成都是編號)
- 當前SKU的庫存
- 當前SKU的價格
當然不同的接口返回的SKU的數(shù)據(jù)結(jié)構(gòu)會不太相同,但是包含的信息量是一致的。
以下是網(wǎng)頁中商品(寶貝的數(shù)字id為13890058021)的SKU選擇控件的顯示,從中可以看出一些東西
- 一個屬性 一般對應(yīng)多個屬性值,用戶需要對屬性值進行選擇
- 當有多個屬性存在時,用戶需要進行多維度的選擇,最終的SKU是各種銷售屬性鍵值對組合而成
- 當一個屬性的屬性值被選擇之后可能會對其他的屬性的屬性值的可選性產(chǎn)生影響,因為某些SKU可能沒有庫存了。這樣一個SKU屬性值選擇了之后,別的屬性的屬性值選擇按鈕就會被disabled了.
以上例子的數(shù)據(jù)TOP接口的數(shù)據(jù)返回為:
{
"item_get_response": {
"item": {
...
"property_alias": "1627207:3232483:格子裙(七分袖,模特版);1627207:3232484:格子裙(九分袖,袖口無分叉)",
...
"skus": {
"sku": [
{
"created": "2012-08-31 19:18:51",
"modified": "2012-09-20 10:46:41",
"price": "140.00",
"properties": "1627207:3232484;20509:28314",
"properties_name": "1627207:3232484:顏色分類:天藍色;20509:28314:尺碼:S",
"quantity": 0,
"sku_id": 24659375069
},
{
"created": "2012-08-31 19:18:51",
"modified": "2012-09-08 21:49:39",
"price": "140.00",
"properties": "1627207:3232484;20509:28315",
"properties_name": "1627207:3232484:顏色分類:天藍色;20509:28315:尺碼:M",
"quantity": 0,
"sku_id": 24659375070
},
{
"created": "2012-08-31 19:18:51",
"modified": "2012-09-21 10:40:03",
"price": "140.00",
"properties": "1627207:3232484;20509:28316",
"properties_name": "1627207:3232484:顏色分類:天藍色;20509:28316:尺碼:L",
"quantity": 0,
"sku_id": 24659375071
},
{
"created": "2012-08-31 19:18:51",
"modified": "2012-09-22 20:40:48",
"price": "140.00",
"properties": "1627207:3232484;20509:28317",
"properties_name": "1627207:3232484:顏色分類:天藍色;20509:28317:尺碼:XL",
"quantity": 5,
"sku_id": 24659375072
},
{
"created": "2012-09-08 21:49:39",
"modified": "2012-09-21 18:54:08",
"price": "140.00",
"properties": "1627207:3232483;20509:28314",
"properties_name": "1627207:3232483:顏色分類:軍綠色;20509:28314:尺碼:S",
"quantity": 44,
"sku_id": 24901123154
},
{
"created": "2012-09-08 21:49:39",
"modified": "2012-09-22 21:11:18",
"price": "140.00",
"properties": "1627207:3232483;20509:28315",
"properties_name": ,
"quantity": 45,
"sku_id": 24901123155
},
{
"created": "2012-09-08 21:49:39",
"modified": "2012-09-22 15:52:56",
"price": "140.00",
"properties": "1627207:3232483;20509:28316",
"properties_name": "1627207:3232483:顏色分類:軍綠色;20509:28316:尺碼:L",
"quantity": 39,
"sku_id": 24901123156
},
{
"created": "2012-09-08 21:49:39",
"modified": "2012-09-16 12:03:18",
"price": "140.00",
"properties": "1627207:3232483;20509:28317",
"properties_name": "1627207:3232483:顏色分類:軍綠色;20509:28317:尺碼:XL",
"quantity": 50,
"sku_id": 24901123157
}
]
},
...
}
}
}
上面銷售屬性有兩個: 顏色分類(編號1627207)的屬性值有兩種 軍綠色(別名 格子裙(七分袖,模特版) 編號3232483) 天藍色(別名 格子裙(九分袖,袖口無分叉) 編號3232484)
尺碼(編號20509)的屬性值有四種 S(編號28314) M(編號28315) L(編號28316) XL(編號28317)
返回的所有的sku中只有那些庫存量大于0的sku才是有效sku,一般情況sku屬性個數(shù)不會超過3個。
初始狀態(tài)是所有的屬性值都處于非選中狀態(tài),如果此時你選擇尺碼S,那么程序需要對還沒有選擇的屬性的屬性值進行檢測,也就是對顏色分類的每一個屬性值進行檢測,以判斷在此情況下其是否可以被選擇,如果不能被選擇,則需要被設(shè)置為禁用狀態(tài),首先對 格子裙(七分袖,模特版) 編號3232483進行檢驗 查看 1627207:3232483;20509:28314(sku中各個屬性的先后次序是一定的)是否能夠存在,到所有的sku中查看發(fā)現(xiàn)此組合是可以存在的且為一個完整的sku. 接著來檢查 格子裙(九分袖,袖口無分叉)編號3232484 , 也就是檢查1627207:3232484;20509:28314組合是否能夠存在 發(fā)現(xiàn)其匹配的sku庫存為0,則需要將其設(shè)置為不可選,所以便有了上圖的情形。
上面的分析畢竟為人類大腦思考的模式,當需要用計算機來實現(xiàn)的時候,需要進行再抽象,找出算法。 如果某個屬性值被選中了,可以看作某個屬性鍵值對被選中了。假設(shè)某個寶貝的一個存貨大于0的sku為 abc (其中a,b,c都是鍵值對,將其看作一個集合集合中有三個元素a,b,c),那么通過這個sku可以知道sku屬性的可選組合包括 a,ab,ac,b,bc,c,abc,所以本質(zhì)是求此sku的非空子集。如果存在多個庫存大于0的sku,則需要分別求其非空子集,最后得到的所有的集合(有些集合可能重復(fù)了需要剔除)就是所有sku屬性可選組合了,可以用來檢驗屬性值的可選性.
計算組合的非空子集的算法可以使用二進制位的方式進行計算。 對構(gòu)成一個SKU的屬性鍵值對的組合而言,在其某一個子集中,每一個屬性鍵值對的狀態(tài)無非有兩個,不存在和存在,我們分別用0和1表示,那么有n個鍵值對的SKU所有的子集個數(shù)為2n 去除一個空集后為2n - 1.
c b a
0 0 1 a
0 1 0 b
0 1 1 ab
1 0 0 c
1 0 1 ac
1 1 0 bc
1 1 1 abc
從上面的枚舉可以看到,算abc的非空子集只需index 從1到2n - 1 進行遍歷,每次將index的二進制位中為1的對應(yīng)位置的字母選中組成一個集合.最后得到所有可能存在的屬性鍵值對組合的集合。 檢測的方法就是對非選中屬性的每一個屬性值進行檢測,將其鍵值對和已經(jīng)選擇了的鍵值對組成一個集合然后判斷這個集合是不是存在于上面算出的所有的集合中,如果存在則說明可選,否則不可選。
三.功能實現(xiàn)
控件實現(xiàn)的重點就是,某個屬性值按鈕選擇后其他屬性的屬性值按鈕的可選擇性狀態(tài)的更新,以及選擇了一個屬性值之后,需要檢查當前已經(jīng)選擇的"屬性屬性值對"組合 能否構(gòu)成一個完整的SKU,如果能則將控件的selectedSku設(shè)置為指定的SKU對象以及更新顯示的庫存和價格,否則當前SKU設(shè)置為nil.
數(shù)據(jù)準備
在數(shù)據(jù)準備階段,
- 需要建立一個SKU的Map,key為SKU的屬性鍵值對組合 ,value為SKU對象
- 需要一個SKU的鍵值對可能存在的組合的一個Map,主要是為了檢測一個屬性值按鈕選擇之后對其他屬性的屬性值可選性的影響,key為鍵值對組合,value就為1,沒有實際意義
- 如果在所有有存貨的SKU中都沒有某個屬性值出現(xiàn),那么需要將其剔除,要不然那個屬性值按鈕一直處于disabled狀態(tài)
創(chuàng)建和狀態(tài)更新
當數(shù)據(jù)都準備好了,就開始針對每一個屬性創(chuàng)建出其所有的屬性值的按鈕控件,按鈕顯示的屬性值對應(yīng)的中文。 所有的屬性值按鈕都創(chuàng)建OK了之后,當我們點擊某個屬性值按鈕之后,需要根據(jù)之前創(chuàng)建的"SKU的鍵值對可能存在的組合子集"對所有的還沒有選擇的屬性的屬性值的可選性進行更新。
開發(fā)物流管理軟件,在線物流軟件的物流軟件編輯發(fā)表!