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