| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420 |
- import Toast from 'tdesign-miniprogram/toast/index';
- import { fetchGood } from '../../../services/good/fetchGood';
- 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,
- buyType: 0,
- outOperateStatus: false, // 是否外层加入购物车
- operateType: 0,
- selectSkuSellsPrice: 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) {
- this.setData({
- selectItem: skuItem,
- selectSkuSellsPrice: skuItem.price || 0,
- });
- } else {
- this.setData({
- selectItem: null,
- selectSkuSellsPrice: 0,
- });
- }
- this.setData({
- specImg: skuItem && skuItem.skuImage ? skuItem.skuImage : primaryImage,
- });
- },
- // 获取已选择的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;
- }, []);
- },
- 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;
- Toast({
- context: this,
- selector: '#t-toast',
- message: isAllSelectedSku ? '点击加入购物车' : '请选择规格',
- icon: '',
- duration: 1000,
- });
- },
- gotoBuy(type) {
- const { isAllSelectedSku, buyNum } = this.data;
- 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 ? this.data.skuList[0].skuId : this.data.selectItem.skuId,
- 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,
- };
- let urlQueryStr = obj2Params({
- goodsRequestList: JSON.stringify([query]),
- });
- urlQueryStr = urlQueryStr ? `?${urlQueryStr}` : '';
- const path = `/pages/order/order-confirm/index${urlQueryStr}`;
- wx.navigateTo({
- url: path,
- });
- },
- specsConfirm() {
- const { buyType } = this.data;
- if (buyType === 1) {
- 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/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;
- skuList.forEach((item) => {
- skuArray.push({
- skuId: item.skuId,
- quantity: item.stockInfo ? item.stockInfo.stockQuantity : 0,
- specInfo: item.specInfo,
- });
- });
- 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 ? parseInt(minSalePrice) : 0,
- list: promotionArray,
- skuArray: skuArray,
- primaryImage,
- soldout: isPutOnSale === 0,
- soldNum,
- });
- });
- },
- async getCommentsList() {
- try {
- const code = 'Success';
- const data = await getGoodsDetailsCommentList();
- const { homePageComments } = data;
- if (code.toUpperCase() === 'SUCCESS') {
- const nextState = {
- commentsList: homePageComments.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();
- 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;
- this.setData({
- spuId: spuId,
- });
- this.getDetail(spuId);
- this.getCommentsList(spuId);
- this.getCommentsStatistics(spuId);
- },
- });
|