micro_mall_xcx/components/goods-list/index.js
2023-10-25 18:44:06 +08:00

326 lines
7.6 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.

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
}
// 添加购物车接口
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) {
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(/\<img/gi, '<img style="max-width:100%;height:auto" ');
// details.desc = details.desc.replace(/<img[^>]*style\s*=\s*(['"])[^'"]*\1[^>]*>/gi, '<img style="max-width:100%;height:auto;" ');
// details.desc = details.desc.replace(/<img[^>]*>/gi, '<img style="max-3999999996width:100%;height:auto;" >');
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,
});
},
},
});