Skip to content

Commit c26db9a

Browse files
committed
sku
1 parent f74b11d commit c26db9a

File tree

7 files changed

+526
-0
lines changed

7 files changed

+526
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
*.swp
22
*.swo
3+
node_module

sku/.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
node_modules
2+
*.sw*
3+

sku/lib/sku.js

+174
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
var colors=require('colors');
2+
function SkuSelector(attrs,skus){
3+
this.cats={};
4+
this.attrs={};
5+
this.skus={};
6+
this.oriAttrs=attrs;
7+
this.oriSkus=skus;
8+
this.parseAttr();
9+
this.parseSKU();
10+
}
11+
SkuSelector.prototype.parseAttr=function(){
12+
var item;
13+
var attrs=this.oriAttrs;
14+
var cats=this.cats;
15+
var _attrs=this.attrs;
16+
for(var i=0,len=attrs.length;i<len;i++){
17+
item=attrs[i];
18+
cats[item['id']]=item;
19+
var values=item.attrValues;
20+
for(var j=0,jlen=values.length;j<jlen;j++){
21+
values[j].catid=item['id']
22+
_attrs[values[j].id]=values[j];
23+
}
24+
}
25+
}
26+
27+
SkuSelector.prototype.parseSKU=function(){
28+
var skus=this.oriSkus;
29+
var _skus=this.skus;
30+
var _attrs=this.attrs;
31+
var _disabledSkus={};
32+
this.disabledSkus=_disabledSkus;
33+
var item;
34+
for(var k in skus){
35+
item=skus[k];
36+
var arr=k.split('_').filter(function (e,i){return !!e;});
37+
if(item.stockNum<=0){
38+
item.path=arr;
39+
item.pathmap={};
40+
_disabledSkus[item.id]=item;
41+
for(var i=0,len=arr.length;i<len;i++){
42+
item.pathmap[arr[i]]=1;
43+
_attrs[arr[i]].dskus=_attrs[arr[i]].skus||{};
44+
_attrs[arr[i]].dskus[item.id]=item;
45+
}
46+
}
47+
//首先将无pku的选项挑出,不允许设置
48+
item.path=arr;
49+
_skus[item.id]=item;
50+
//console.log(item.id,arr);
51+
for(var i=0,len=arr.length;i<len;i++){
52+
_attrs[arr[i]].skus=_attrs[arr[i]].skus||{};
53+
_attrs[arr[i]].skus[item.id]=item;
54+
}
55+
}
56+
//console.log(this.disabledSkus);
57+
}
58+
59+
function valuesAsMap(arr){
60+
var obj={};
61+
for(var i=0,len=arr.length;i<len;i++){
62+
obj[arr[i]]=1;
63+
}
64+
return obj;
65+
}
66+
function objKeys(obj){
67+
var keys=[];
68+
for(var k in obj){
69+
keys.push(k);
70+
}
71+
return keys;
72+
}
73+
74+
SkuSelector.prototype.updateSKU=function(attrids){
75+
//console.log('------------------------------------'.green);
76+
//console.log('updateSKU',attrids);
77+
var dskus=this.disabledSkus;
78+
var idsmap=valuesAsMap(attrids);
79+
var disabledAttrs={};
80+
var arrs=[];
81+
for(var k in dskus){
82+
var sku=dskus[k];
83+
var ands=setAndSet(sku.pathmap,idsmap);
84+
if(objKeys(ands).length==0){
85+
//不触发禁项
86+
continue;
87+
}
88+
89+
var ds=setSubSet(sku.pathmap,idsmap);
90+
var ids=objKeys(ds);
91+
if(ids.length==1){
92+
//console.log('the last one found'.red,ids);
93+
disabledAttrs= setOrSet(disabledAttrs,ds);
94+
}else if(ids.length>1){
95+
arrs.push(ds);
96+
}
97+
}
98+
//console.log('to judge',arrs);
99+
var rs=andArrays(arrs);
100+
//console.log('rs of judge'.bgBlack.white,rs);
101+
if(objKeys(rs).length==1){
102+
disabledAttrs= setOrSet(disabledAttrs,andArrays(arrs));
103+
}
104+
//console.log('---------'.red,disabledAttrs);
105+
return;
106+
}
107+
function andArrays(arrs){
108+
var obj={};
109+
var item;
110+
for(var i=0,len=arrs.length;i<len;i++){
111+
item=arrs[i];
112+
if(i==0){
113+
obj=item;
114+
}else{
115+
obj=setAndSet(obj,item);
116+
}
117+
}
118+
return obj;
119+
}
120+
SkuSelector.prototype.getDisabledAttrs=function(){
121+
return this.disabledAttrs;
122+
}
123+
SkuSelector.prototype.getEnabledAttrs=function(){
124+
return this.enabledAttrs;
125+
}
126+
127+
SkuSelector.prototype.addToEnabledAttrs=function(cat,enabled_attrs){
128+
var values=cat.attrValues;
129+
for(var i=0,len=values.length;i<len;i++){
130+
enabled_attrs[values[i].id]=1;
131+
}
132+
}
133+
134+
SkuSelector.prototype.collectEnabledAttrs=function(skus,enabled_attrs){
135+
var tmp=enabled_attrs||{};
136+
for(var k in skus){
137+
var sku=this.skus[k];
138+
var path=sku.path;
139+
for(var index in path){
140+
tmp[path[index]]=1;
141+
}
142+
}
143+
return tmp;
144+
}
145+
146+
function setAndSet(a,b){
147+
var obj={};
148+
for(var i in a){
149+
if(b[i]){
150+
obj[i]=1;
151+
}
152+
}
153+
return obj;
154+
}
155+
function setOrSet(a,b){
156+
var obj={};
157+
for(var i in a){
158+
obj[i]=1;
159+
}
160+
for(var i in b){
161+
obj[i]=1;
162+
}
163+
return obj;
164+
}
165+
function setSubSet(a,b){
166+
var obj={};
167+
for(var i in a){
168+
if(!b[i]){
169+
obj[i]=1;
170+
}
171+
}
172+
return obj;
173+
}
174+
module.exports=SkuSelector;

sku/package.json

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"name": "sku",
3+
"version": "1.0.0",
4+
"description": "sku selector",
5+
"main": "lib/sku.js",
6+
"directories": {
7+
"test": "test"
8+
},
9+
"dependencies": {
10+
"chai": "^1.10.0",
11+
"colors": "^1.0.3"
12+
},
13+
"devDependencies": {},
14+
"scripts": {
15+
"test": "mocha"
16+
},
17+
"keywords": [
18+
"sku"
19+
],
20+
"author": "bukuta",
21+
"license": "MIT"
22+
}

sku/sku.js.bak

+153
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
function SkuSelector(attrs,skus){
2+
this.cats={};
3+
this.attrs={};
4+
this.skus={};
5+
this.oriAttrs=attrs;
6+
this.oriSkus=skus;
7+
this.parseAttr();
8+
this.parseSKU();
9+
}
10+
SkuSelector.prototype.parseAttr=function(){
11+
var item;
12+
var attrs=this.oriAttrs;
13+
var cats=this.cats;
14+
var _attrs=this.attrs;
15+
for(var i=0,len=attrs.length;i<len;i++){
16+
item=attrs[i];
17+
cats[item['id']]=item;
18+
var values=item.attrValues;
19+
for(var j=0,jlen=values.length;j<jlen;j++){
20+
values[j].catid=item['id']
21+
_attrs[values[j].id]=values[j];
22+
}
23+
}
24+
}
25+
26+
SkuSelector.prototype.parseSKU=function(){
27+
var skus=this.oriSkus;
28+
var _skus=this.skus;
29+
var _attrs=this.attrs;
30+
var item;
31+
for(var k in skus){
32+
item=skus[k];
33+
var arr=k.split('_').filter(function (e,i){return !!e;});
34+
if(item.stockNum<=0){
35+
continue;
36+
}
37+
item.path=arr;
38+
_skus[item.id]=item;
39+
console.log(item.id,arr);
40+
for(var i=0,len=arr.length;i<len;i++){
41+
_attrs[arr[i]].skus=_attrs[arr[i]].skus||{};
42+
_attrs[arr[i]].skus[item.id]=item;
43+
}
44+
}
45+
}
46+
47+
SkuSelector.prototype.updateSKU=function(attrids){
48+
console.log('------------------------------------');
49+
console.log('updateSKU',attrids);
50+
var _attrs=this.attrs;
51+
var cats=this.cats;
52+
var skus,_skus;
53+
var enabled_attrs={};
54+
var enabled_attrs0={};
55+
var remainskus=this.skus;
56+
var that=this;
57+
var disabledskus={};
58+
var disabledattrs={};
59+
for(var i=0,len=attrids.length;i<len;i++){
60+
//当前属性,不可用的sku,对其他行属性的影响:
61+
attrid=attrids[i];
62+
console.log('---------------------attrid:',attrid)
63+
var attr=_attrs[attrid];
64+
skus=attr['skus'];
65+
var curcat=cats[attr.catid];
66+
var lastskus=JSON.parse(JSON.stringify(remainskus));
67+
var __attrs=this.collectEnabledAttrs(lastskus);
68+
console.log('before\t',JSON.stringify(__attrs));
69+
remainskus=setAndSet(remainskus,skus);
70+
var __attrs2=this.collectEnabledAttrs(remainskus);
71+
console.log('after\t',JSON.stringify(__attrs2));
72+
var __diff=setSubSet(__attrs,__attrs2);
73+
console.log('diff\t',JSON.stringify(__diff));
74+
disabledattrs=setOrSet(disabledattrs,pickupAttrs(__diff,attrid));
75+
//disabledskus=setSub.effectOtherAttrs(disabledskus,attrid);
76+
}
77+
console.log('disabledattrs',disabledattrs);
78+
this.disabledAttrs=disabledattrs;
79+
this.enabledAttrs=setSubSet(this.attrs,disabledattrs);
80+
console.log('------------------------------------');
81+
return;
82+
function pickupAttrs(obj,id){
83+
var catid=getAttrCat(id);
84+
var ids={};
85+
for(var k in obj){
86+
if(getAttrCat(k)!=catid){
87+
ids[k]=1;
88+
}
89+
}
90+
console.log('pickup------',obj,id,ids);
91+
return ids;
92+
}
93+
function getAttrCat(id){
94+
return that.attrs[id].catid;
95+
}
96+
}
97+
SkuSelector.prototype.getDisabledAttrs=function(){
98+
return this.disabledAttrs;
99+
}
100+
SkuSelector.prototype.getEnabledAttrs=function(){
101+
return this.enabledAttrs;
102+
}
103+
104+
SkuSelector.prototype.addToEnabledAttrs=function(cat,enabled_attrs){
105+
var values=cat.attrValues;
106+
for(var i=0,len=values.length;i<len;i++){
107+
enabled_attrs[values[i].id]=1;
108+
}
109+
}
110+
111+
SkuSelector.prototype.collectEnabledAttrs=function(skus,enabled_attrs){
112+
var tmp=enabled_attrs||{};
113+
for(var k in skus){
114+
var sku=this.skus[k];
115+
var path=sku.path;
116+
//console.log('path',path);
117+
for(var index in path){
118+
//console.log(path[index],tmp);
119+
tmp[path[index]]=1;
120+
}
121+
}
122+
return tmp;
123+
}
124+
125+
function setAndSet(a,b){
126+
var obj={};
127+
for(var i in a){
128+
if(b[i]){
129+
obj[i]=1;
130+
}
131+
}
132+
return obj;
133+
}
134+
function setOrSet(a,b){
135+
var obj={};
136+
for(var i in a){
137+
obj[i]=1;
138+
}
139+
for(var i in b){
140+
obj[i]=1;
141+
}
142+
return obj;
143+
}
144+
function setSubSet(a,b){
145+
var obj={};
146+
for(var i in a){
147+
if(!b[i]){
148+
obj[i]=1;
149+
}
150+
}
151+
return obj;
152+
}
153+
module.exports=SkuSelector;

0 commit comments

Comments
 (0)