監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 甲方項(xiàng)目管理系統(tǒng) | 簽約案例 | 客戶案例 | 在線試用
X 關(guān)閉

SKU選擇控件的實(shí)現(xiàn)

SKU選擇控件的實(shí)現(xiàn)


一.知識(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)備階段,

  1. 需要建立一個(gè)SKU的Map,key為SKU的屬性鍵值對(duì)組合 ,value為SKU對(duì)象
  2. 需要一個(gè)SKU的鍵值對(duì)可能存在的組合的一個(gè)Map,主要是為了檢測(cè)一個(gè)屬性值按鈕選擇之后對(duì)其他屬性的屬性值可選性的影響,key為鍵值對(duì)組合,value就為1,沒有實(shí)際意義
  3. 如果在所有有存貨的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ā)表!

發(fā)布:2007-04-07 09:55    編輯:泛普軟件 · xiaona    [打印此頁(yè)]    [關(guān)閉]
相關(guān)文章:
物流管理OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費(fèi)獲取試用系統(tǒng)

QQ在線咨詢

泛普物流行業(yè)其他應(yīng)用

物流行業(yè) 物流ERP 物流配送軟件 運(yùn)輸管理軟件 車隊(duì)管理軟件 配送管理軟件 免費(fèi)物流管理系統(tǒng) 物流管理軟件下載