import Toast from 'tdesign-miniprogram/toast/index';
import {
goodsList
} from "~/model/goods";
import {
fetchGood
} from '~/services/good/fetchGood';
import {
addOrUpdateCart
} from '~/services/cart/addOrUpdateCart';
Component({
externalClasses: ['wr-class'],
properties: {
goodsList: {
type: Array,
value: [],
},
id: {
type: String,
value: '',
observer: (id) => {
this.genIndependentID(id);
},
},
thresholds: {
type: Array,
value: [],
},
type: {
type: String,
value: "card"
}
},
data: {
independentID: '',
isSpuSelectPopupShow: false,
details: {},
specImg: "",
primaryImage: "",
skuArray: [],
selectSkuQuantity: 0,
isStock: false,
isAllSelectedSku: false,
selectSkuSellsPrice: 0,
selectSkuLinePrice: 0,
selectedSkuId: 0,
maxLinePrice: 0,
minSalePrice: 0,
maxSalePrice: 0,
details: {},
buyNum: 1,
},
lifetimes: {
ready() {
this.init();
},
},
methods: {
onClickGoods(e) {
const {
index
} = e.currentTarget.dataset;
this.triggerEvent('click', {
...e.detail,
index
});
},
onAddCart(e) {
const {
index
} = e.currentTarget.dataset;
this.setData({
isSpuSelectPopupShow: true
})
// 请求商品详情接口
this.getDetail(e.detail.goods.spuId)
},
changeNum(e) {
this.setData({
buyNum: e.detail.buyNum,
});
},
addCartFun() {
const {
isAllSelectedSku,
buyNum,
selectedSkuId
} = this.data;
const {
specList,
shopGuid,
spuId,
} = this.data.details;
let data = {
shopGuid: shopGuid,
goodsGuid: spuId,
goodsSkuId: selectedSkuId,
cartGoodsNum: buyNum
}
// console.log(data, '加入购物车的数据');
// 添加购物车接口
addOrUpdateCart(data).then((res) => {
if (res.code == 200) {
Toast({
context: this,
selector: '#t-toast',
message: res.data,
icon: '',
duration: 1000,
});
this.setData({
isSpuSelectPopupShow: false,
});
}
})
},
selectSpecsName(selectSpecsName) {
if (selectSpecsName) {
this.setData({
selectedAttrStr: selectSpecsName,
});
} else {
this.setData({
selectedAttrStr: '',
});
}
},
normalizeSkuTree(skuTree) {
const normalizedTree = {};
skuTree.forEach((treeItem) => {
normalizedTree[treeItem.specId] = treeItem.specValueList;
});
return normalizedTree;
},
// 获取已选择的sku名称
getSelectedSkuValues(skuTree, selectedSku) {
const normalizedTree = this.normalizeSkuTree(skuTree);
return Object.keys(selectedSku).reduce((selectedValues, skuKeyStr) => {
const skuValues = normalizedTree[skuKeyStr];
const skuValueId = selectedSku[skuKeyStr];
if (skuValueId !== '') {
const skuValue = skuValues.filter((value) => {
return value.specValueId === skuValueId;
})[0];
skuValue && selectedValues.push(skuValue);
}
return selectedValues;
}, []);
},
getSkuItem(specList, selectedSku) {
const {
skuArray,
primaryImage
} = this.data;
const selectedSkuValues = this.getSelectedSkuValues(specList, selectedSku);
let selectedAttrStr = ` 件 `;
selectedSkuValues.forEach((item) => {
selectedAttrStr += `,${item.specValue} `;
});
// eslint-disable-next-line array-callback-return
const skuItem = skuArray.filter((item) => {
let status = true;
(item.specInfo || []).forEach((subItem) => {
if (
!selectedSku[subItem.specId] ||
selectedSku[subItem.specId] !== subItem.specValueId
) {
status = false;
}
});
if (status) return item;
});
this.selectSpecsName(selectedSkuValues.length > 0 ? selectedAttrStr : '');
if (skuItem) {
this.setData({
selectedSkuId: skuItem[0]?.skuId,
selectItem: skuItem,
selectSkuSellsPrice: skuItem[0]?.priceInfo[0]?.price || 0,
selectSkuLinePrice: skuItem[0]?.priceInfo[1]?.price || 0,
selectSkuQuantity: skuItem[0]?.quantity
});
} else {
this.setData({
selectItem: null,
selectSkuSellsPrice: 0,
selectSkuLinePrice: 0,
});
}
this.setData({
specImg: skuItem && skuItem[0]?.skuImage ? skuItem[0]?.skuImage : primaryImage,
});
},
chooseSpecItem(e) {
console.log(e);
const {
specList
} = this.data.details;
const {
selectedSku,
isAllSelectedSku
} = e.detail;
if (!isAllSelectedSku) {
this.setData({
selectSkuSellsPrice: 0,
});
}
this.setData({
isAllSelectedSku,
});
this.getSkuItem(specList, selectedSku);
},
/** 加入购物车 */
addCart() {
const {
isAllSelectedSku,
} = this.data;
const {
specList,
} = this.data.details;
if (specList.length != 0) {
if (isAllSelectedSku) {
this.addCartFun()
} else {
Toast({
context: this,
selector: '#t-toast',
message: '请选择规格',
icon: '',
duration: 1000,
});
}
} else {
this.addCartFun()
}
},
onClickGoodsThumb(e) {
const {
index
} = e.currentTarget.dataset;
this.triggerEvent('thumb', {
...e.detail,
index
});
},
init() {
this.genIndependentID(this.id || '');
this.setData({
type: this.properties.type
});
},
genIndependentID(id) {
if (id) {
this.setData({
independentID: id
});
} else {
this.setData({
independentID: `goods-list-${~~(Math.random() * 10 ** 8)}`,
});
}
},
// 商品规格js方法(搬运商品详情页的相关方法)
getDetail(spuId) {
Promise.all([fetchGood(spuId)]).then((res) => {
const [details] = res;
const skuArray = [];
const {
skuList,
primaryImage,
minSalePrice,
maxSalePrice,
maxLinePrice,
} = details;
// details.desc = details.desc.replace(/\
]*style\s*=\s*(['"])[^'"]*\1[^>]*>/gi, '
]*>/gi, '
');
skuList.forEach((item) => {
skuArray.push({
skuId: item.skuId,
quantity: item.quantity ? item.quantity : 0,
specInfo: item.specInfo,
priceInfo: item.priceInfo,
skuImage: item.skuImage,
});
});
this.setData({
details,
isStock: details.spuStockQuantity > 0,
maxSalePrice: maxSalePrice ? parseInt(maxSalePrice) : 0,
maxLinePrice: maxLinePrice ? parseInt(maxLinePrice) : 0,
minSalePrice: minSalePrice,
skuArray: skuArray,
primaryImage,
});
});
},
handlePopupHide() {
this.setData({
isSpuSelectPopupShow: false,
});
},
},
});