import Toast from 'tdesign-miniprogram/toast/index';
import {
fetchGood
} from '~/services/good/fetchGood';
import {
addOrUpdateCart
} from '~/services/cart/addOrUpdateCart';
import {
fetchActivityList
} from '~/services/activity/fetchActivityList';
import {
getGoodsDetailsCommentList,
getGoodsDetailsCommentsCount,
} from '~/services/good/fetchGoodsDetailsComments';
import {
cdnBase
} from '~/config/index';
const imgPrefix = `${cdnBase}/`;
const recLeftImg = `${imgPrefix}common/rec-left.png`;
const recRightImg = `${imgPrefix}common/rec-right.png`;
const obj2Params = (obj = {}, encode = false) => {
const result = [];
Object.keys(obj).forEach((key) =>
result.push(`${key}=${encode ? encodeURIComponent(obj[key]) : obj[key]}`),
);
return result.join('&');
};
Page({
data: {
commentsList: [],
commentsStatistics: {
badCount: 0,
commentCount: 0,
goodCount: 0,
goodRate: 0,
hasImageCount: 0,
middleCount: 0,
},
isShowPromotionPop: false,
activityList: [],
recLeftImg,
recRightImg,
details: {},
goodsTabArray: [{
name: '商品',
value: '', // 空字符串代表置顶
},
{
name: '详情',
value: 'goods-page',
},
],
storeLogo: `${imgPrefix}common/store-logo.png`,
storeName: '云mall标准版旗舰店',
jumpArray: [{
title: '首页',
url: '/pages/home/home',
iconName: 'home',
},
{
title: '购物车',
url: '/pages/cart/index',
iconName: 'cart',
showCartNum: true,
},
],
isStock: true,
cartNum: 0,
soldout: false,
buttonType: 1,
buyNum: 1,
selectedAttrStr: '',
skuArray: [],
primaryImage: '',
specImg: '',
isSpuSelectPopupShow: false,
isAllSelectedSku: false,
selectedSkuId: 0,
buyType: 0,
outOperateStatus: false, // 是否外层加入购物车
operateType: 0,
selectSkuQuantity: 0,
selectSkuSellsPrice: 0,
selectSkuLinePrice: 0,
maxLinePrice: 0,
minSalePrice: 0,
maxSalePrice: 0,
list: [],
spuId: '',
navigation: {
type: 'fraction'
},
current: 0,
autoplay: true,
duration: 500,
interval: 5000,
soldNum: 0, // 已售数量
},
handlePopupHide() {
this.setData({
isSpuSelectPopupShow: false,
});
},
showSkuSelectPopup(type) {
this.setData({
buyType: type || 0,
outOperateStatus: type >= 1,
isSpuSelectPopupShow: true,
});
},
buyItNow() {
this.showSkuSelectPopup(1);
},
toAddCart() {
this.showSkuSelectPopup(2);
},
toNav(e) {
const {
url
} = e.detail;
wx.switchTab({
url: url,
});
},
showCurImg(e) {
const {
index
} = e.detail;
const {
images
} = this.data.details;
wx.previewImage({
current: images[index],
urls: images, // 需要预览的图片http链接列表
});
},
onPageScroll({
scrollTop
}) {
const goodsTab = this.selectComponent('#goodsTab');
goodsTab && goodsTab.onScroll(scrollTop);
},
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);
},
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) {
console.log(skuItem[0],'选中的item');
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,
});
},
// 获取已选择的sku名称
getSelectedSkuValues(skuTree, selectedSku) {
const normalizedTree = this.normalizeSkuTree(skuTree);
return Object.keys(selectedSku).reduce((selectedValues, skuKeyStr) => {
console.log(selectedSku,'sku啊');
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;
}, []);
},
normalizeSkuTree(skuTree) {
const normalizedTree = {};
skuTree.forEach((treeItem) => {
normalizedTree[treeItem.specId] = treeItem.specValueList;
});
return normalizedTree;
},
selectSpecsName(selectSpecsName) {
if (selectSpecsName) {
this.setData({
selectedAttrStr: selectSpecsName,
});
} else {
this.setData({
selectedAttrStr: '',
});
}
},
/** 加入购物车 */
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()
}
},
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: '加入购物车成功',
icon: '',
duration: 1000,
});
this.setData({
isSpuSelectPopupShow: false,
});
}
})
},
gotoBuy(type) {
console.log(type);
const {
isAllSelectedSku,
buyNum,
selectedSkuId
} = this.data;
const {
specList
} = this.data.details;
if (specList.length != 0) {
if (!isAllSelectedSku) {
Toast({
context: this,
selector: '#t-toast',
message: '请选择规格',
icon: '',
duration: 1000,
});
return;
}
}
this.handlePopupHide();
const query = {
quantity: buyNum,
storeId: '1',
spuId: this.data.spuId,
goodsName: this.data.details.title,
skuId: type === 1 ? 0 : selectedSkuId,
available: this.data.details.available,
price: this.data.details.minSalePrice,
specInfo: this.data.details.specList?.map((item) => ({
specTitle: item.title,
specValue: item.specValueList[0].specValue,
})),
primaryImage: this.data.details.primaryImage,
spuId: this.data.details.spuId,
thumb: this.data.details.primaryImage,
title: this.data.details.title,
};
console.log(query,'从立刻购买来的');
let urlQueryStr = obj2Params({
goodsRequestList: JSON.stringify([query]),
});
urlQueryStr = urlQueryStr ? `?${urlQueryStr}` : '';
const path = `/pages/order/order-confirm/index${urlQueryStr}`;
wx.navigateTo({
url: path,
});
},
gotoShop() {
const {
shopGuid
} = this.data.details;
wx.navigateTo({
url: "/pages/shop/all-goods/index?shopGuid=" + shopGuid,
});
},
specsConfirm() {
const {
buyType
} = this.data;
const {
specList
} = this.data.details;
if (buyType === 1) {
if (specList.length == 0) {
this.gotoBuy(1);
return;
}
this.gotoBuy();
} else {
this.addCart();
}
// this.handlePopupHide();
},
changeNum(e) {
this.setData({
buyNum: e.detail.buyNum,
});
},
closePromotionPopup() {
this.setData({
isShowPromotionPop: false,
});
},
promotionChange(e) {
const {
index
} = e.detail;
wx.navigateTo({
url: `/pages/promotion-detail/index?promotion_id=${index}`,
});
},
showPromotionPopup() {
this.setData({
isShowPromotionPop: true,
});
},
getDetail(spuId) {
Promise.all([fetchGood(spuId), fetchActivityList()]).then((res) => {
const [details, activityList] = res;
const skuArray = [];
const {
skuList,
primaryImage,
isPutOnSale,
minSalePrice,
maxSalePrice,
maxLinePrice,
soldNum,
} = 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,
});
});
const promotionArray = [];
activityList.forEach((item) => {
promotionArray.push({
tag: item.promotionSubCode === 'MYJ' ? '满减' : '满折',
label: '满100元减99.9元',
});
});
this.setData({
details,
activityList,
isStock: details.spuStockQuantity > 0,
maxSalePrice: maxSalePrice ? parseInt(maxSalePrice) : 0,
maxLinePrice: maxLinePrice ? parseInt(maxLinePrice) : 0,
minSalePrice: minSalePrice,
list: promotionArray,
skuArray: skuArray,
primaryImage,
soldout: isPutOnSale === 0,
soldNum,
});
});
},
async getCommentsList() {
try {
const code = 'Success';
const data = await getGoodsDetailsCommentList(this.data.spuId);
// const {
// homePageComments
// } = data;
if (code.toUpperCase() === 'SUCCESS') {
const nextState = {
commentsList: data.map((item) => {
return {
goodsSpu: item.spuId,
userName: item.userName || '',
commentScore: item.commentScore,
commentContent: item.commentContent || '用户未填写评价',
userHeadUrl: item.isAnonymity ?
this.anonymityAvatar : item.userHeadUrl || this.anonymityAvatar,
};
}),
};
this.setData(nextState);
}
} catch (error) {
console.error('comments error:', error);
}
},
onShareAppMessage() {
// 自定义的返回信息
const {
selectedAttrStr
} = this.data;
let shareSubTitle = '';
if (selectedAttrStr.indexOf('件') > -1) {
const count = selectedAttrStr.indexOf('件');
shareSubTitle = selectedAttrStr.slice(count + 1, selectedAttrStr.length);
}
const customInfo = {
imageUrl: this.data.details.primaryImage,
title: this.data.details.title + shareSubTitle,
path: `/pages/goods/details/index?spuId=${this.data.spuId}`,
};
return customInfo;
},
/** 获取评价统计 */
async getCommentsStatistics() {
try {
const code = 'Success';
const data = await getGoodsDetailsCommentsCount(this.data.spuId);
if (code.toUpperCase() === 'SUCCESS') {
const {
badCount,
commentCount,
goodCount,
goodRate,
hasImageCount,
middleCount,
} = data;
const nextState = {
commentsStatistics: {
badCount: parseInt(`${badCount}`),
commentCount: parseInt(`${commentCount}`),
goodCount: parseInt(`${goodCount}`),
/** 后端返回百分比后数据但没有限制位数 */
goodRate: Math.floor(goodRate * 10) / 10,
hasImageCount: parseInt(`${hasImageCount}`),
middleCount: parseInt(`${middleCount}`),
},
};
this.setData(nextState);
}
} catch (error) {
console.error('comments statiistics error:', error);
}
},
/** 跳转到评价列表 */
navToCommentsListPage() {
wx.navigateTo({
url: `/pages/goods/comments/index?spuId=${this.data.spuId}`,
});
},
onLoad(query) {
const {
spuId
} = query;
// const spuId = "1672964367177617408";
this.setData({
spuId: spuId,
});
this.getDetail(spuId);
this.getCommentsList(spuId);
this.getCommentsStatistics(spuId);
},
});