yuminge-app/yun-min-program-plugin-master/mycomponent/yz_specsV2/yz_specs.js

382 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// packageI/groupWork/components/yz_specsV2/yz_specs.js
var specsManage = []; //选择池 用于排序
var optionsId = 0; //选择后的 规格ID
const app = getApp();
Component({
/**
* 组件的属性列表
*/
options: {
multipleSlots: true // 在组件定义时的选项中启用多slot支持
},
properties: {
show: {
type: Boolean,
value: false
},
isRent: {
type: Boolean,
value: false
},
//主题色
themeColor: {
type: String,
value: "#f14e4e"
},
goods: {
type: Object,
value: () => ({})
},
goodSpecs: {
type: Array,
value: () => []
},
options: {
type: Array,
value: () => []
},
disableStepperInput: {
type: Boolean, //是否禁用步进器输入
value: false
},
quota: {
type: Number,
value: -1 //限购数,-1按库存设置限购数0不限购
},
startSaleNum: {
type: Number,
value: 1 //起售数量
},
hiddenBuyBtn: {
type: Boolean, //是否隐藏默认购买按钮
value: false
},
},
/**
* 组件的初始数据
*/
data: {
popThumb: "", //顶部商品图片
popPrice: "", //顶部商品价格
popStock: "", //顶部商品库存
popDescription: "", //顶部商品描述
popUnit: "", //单位
optionsMaxCount: 0, //库存
selectedNum: 1, // 选择的商品数量
skuImages: [],
specs: []
},
observers: {
show(newV,oldV) {
if (newV) {
this.initPopView();
}
},
},
/**
* 组件的方法列表
*/
methods: {
initPopView() {
//初始化顶部商品信息
console.log("初始化顶部商品信息", this.data.goods);
this.setData({
popThumb: this.data.goods.hasOwnProperty("thumb") ? this.data.goods.thumb : "",
popPrice: this.data.goods.hasOwnProperty("price") ? this.data.goods.price : "",
popStock: this.data.goods.hasOwnProperty("stock") ? this.data.goods.stock : null,
popUnit: this.data.goods.hasOwnProperty("unit") ? this.data.goods.unit : "",
specs: this.data.goodSpecs,
popDescription: null
});
specsManage = [];
optionsId = 0;
this.initSkuIMG();
this.initSku();
},
initSku() {
//默认选择第一个
if (this.data.goods.has_option == 1) {
console.log("00000000000",this.data.specs,this.data.options);
if (this.data.specs.length==0 || this.data.options.length==0) return;
console.log("sssssssssss");
this.data.options.forEach((val, index) => {
let _thumb = !app._isTextEmpty(val.thumb) ? val.thumb : this.data.goods.thumb;
this.data.skuImages.push(_thumb);
});
// 默认选择第一个
for (let i = 0; i < this.data.specs.length; i++) {
this.data.specs[i].description = this.data.specs[i].specitem[0];
console.log("1111111111111111111");
// this.selectSpecs(this.data.specs[i].specitem[0]);
this.selectSpecs(this.data.specs[i].specitem[0], 'first', i);
}
} else {
this.data.goods.thumb&&this.data.skuImages.push(this.data.goods.thumb);
}
this.setData({
skuImages: this.data.skuImages,
specs: this.data.specs,
optionsMaxCount: this.data.popStock
});
},
getSkuData() {
let skuData = {
price: this.data.popPrice,
stock: this.data.popStock,
selectedNum: this.data.selectedNum,
has_option: this.data.goods.has_option,
optionsId: optionsId
};
return skuData;
},
buyClicked() {
//点击购买触发
this.triggerEvent("buy-clicked", this.getSkuData());
},
stepperPlus() {
this.triggerEvent("stepper-plus", this.getSkuData());
},
stepperMinus() {
this.triggerEvent("stepper-minus", this.getSkuData());
},
stepperChange() {
this.triggerEvent("stepper-change", this.getSkuData());
},
setPrice(e) {
//设置价格
if (e) {
this.setData({
popPrice: e
});
}
},
setStock(e) {
//设置库存
if (e) {
this.setData({
popStock: e
});
}
},
//界面选择规格触发事件
selectSpecs(e, str, i) {
let data = {};
let specsIdex = 0;
if (str == 'first') {
specsIdex = i;
data = e;
} else if(str =="sku_swiper"){
data = e;
} else {
specsIdex = e.currentTarget.dataset.specsidex;
data = e.currentTarget.dataset.specitem;
}
if (data.c) {
return false;
}
this.setData({
["specs[" + specsIdex + "].description"]: data.id
});
this.manageSpecs(data); //处理选择池
this.setGoodsSpecs(data); //处理规格组合选择状态
this.setGoodsSpecsChangeInfo(); //设置选择规格后的 价格、照片、库存
this.getMaxCount(); //判断当前购买总量与库存的关系
},
//处理选择池
manageSpecs(data) {
var specsObject = {};
specsObject.id = data.id;
specsObject.specid = data.specid;
specsObject.title = data.title;
if (specsManage.length > 0) {
for (let i = 0; i < specsManage.length; i++) {
if (specsManage[i].specid == specsObject.specid) {
specsManage.splice(i, 1);
}
}
specsManage.push(specsObject);
} else {
specsManage.push(specsObject);
}
//排序
if (specsManage.length == this.data.specs.length) {
var newSpecsManage = [];
for (let i = 0; i < this.data.specs.length; i++) {
for (let j = 0; j < specsManage.length; j++) {
if (this.data.specs[i].id == specsManage[j].specid) {
newSpecsManage.push(specsManage[j]);
break;
}
}
}
specsManage = newSpecsManage;
}
this.setGoodsDescription();
},
//处理goodsDescription 数据
setGoodsDescription() {
var description = "";
//相等代表全选了 体现语句
if (specsManage.length == this.data.specs.length) {
description = "已选择 ";
for (let i = 0; i < specsManage.length; i++) {
description += specsManage[i].title + " ";
}
} else {
description = "请选择 ";
for (let i = 0; i < this.data.specs.length; i++) {
for (let j = 0; j < specsManage.length; j++) {
if (this.data.specs[i].id != specsManage[j].specid) {
description += this.data.specs[i].title + " ";
break;
}
}
}
}
this.setData({
popDescription: description
});
},
//处理规格组合选择状态 过滤数据
setGoodsSpecs(specs) {
for (let i = 0; i < this.data.specs.length; i++) {
if (specs.specid != this.data.specs[i].id) {
this.setGoodsSpecsStatus(this.data.specs[i].specitem, specs.id);
}
}
},
//处理规格组合选择状态 处理状态 specitem 组合数组(未选中的) id当前选中的ID 根据ID 组合算是否有当前组合
setGoodsSpecsStatus(specitem, id) {
// console.log(specitem);
// console.log(id);
let options = []; //数据池
for (let i = 0; i < this.data.options.length; i++) {
// console.log(this.options[i].specs);
let _specs = this.data.options[i].specs.split("_");
//console.log(_specs);
//判断是否包含
for (let j = 0; j < _specs.length; j++) {
if (_specs[j] == id) {
options.push(this.data.options[i]);
return;
}
}
}
//关键处理方式 后期要优化 效率低
for (let m = 0; m < options.length; m++) {
let _specs = options[m].specs.split("_");
for (let y = 0; y < _specs.length; y++) {
if (_specs[y] != id && options[m].stock == 0) {
for (let n = 0; n < specitem.length; n++) {
if (_specs[y] == specitem[n].id) {
specitem[n].c = true;
return;
}
}
} else if (_specs[y] != id && options[m].stock > 0) {
for (let n = 0; n < specitem.length; n++) {
if (_specs[y] == specitem[n].id) {
specitem[n].c = false;
return;
}
}
}
}
}
console.log(options);
},
//设置选择规格后的 价格、照片、库存
setGoodsSpecsChangeInfo() {
//根据ID 排序 specsManage.sort();
specsManage.sort(function(a, b) {
return a.id - b.id;
});
if (specsManage.length == this.data.specs.length) {
let goodsSpecs = "";
for (let j = 0; j < specsManage.length; j++) {
goodsSpecs += specsManage[j].id + "_";
}
goodsSpecs = goodsSpecs.substring(0, goodsSpecs.length - 1); //处理"_"
// console.log('goodsSpecs', goodsSpecs)
for (let i = 0; i < this.data.options.length; i++) {
if (goodsSpecs == this.setGoodsSpecsBySort(this.data.options[i].specs)) {
this.setData({
activeSkuIndex: i,
popPrice: this.data.options[i].product_price, //设置价格
popThumb: app._isTextEmpty(this.data.options[i].thumb) ? this.data.goods.thumb : this.data.options[i].thumb, //设置图片
popStock: this.data.options[i].stock, //设置库存
optionsMaxCount: this.data.options[i].stock//库存最大数 用于切换更改买家购买数量
});
optionsId = this.data.options[i].id; //设置规格ID用于生成订单
if (this.data.optionsMaxCount > 0) {
this.setData({
popNum: 1,
goodsCount: 1
});
}
console.log("=================",optionsId);
this.triggerEvent("sku-selected", optionsId);
break;
}
}
}
},
//处理商品goodsSpecs 并排序 新方法
setGoodsSpecsBySort(specs) {
let _specs = specs.split("_"); //先变成数组
//_specs.sort();//排序
_specs.sort(function(a, b) {
return a - b;
});
// 在组装回去
let goodsSpecs = "";
for (let j = 0; j < _specs.length; j++) {
goodsSpecs += _specs[j] + "_";
}
goodsSpecs = goodsSpecs.substring(0, goodsSpecs.length - 1); //处理"_"
return goodsSpecs;
},
//判断当前购买总量与库存的关系
getMaxCount() {
if (specsManage.length == this.data.specs.length) {
// console.log(optionsMaxCount);
// console.log(this.goodsCount);
if (this.data.optionsMaxCount == 0) {
//库存不足
this.data.goodsCount = 0;
}
if (this.data.goodsCount > this.data.optionsMaxCount) {
this.data.goodsCount = this.data.optionsMaxCount;
}
this.setData({
goodsCount: this.data.goodsCount
});
}
},
close() {
this.setData({
show: false
});
},
initSkuIMG(){}
}
});