xo_user_client/pages/plugins/realstore/detail/detail.vue

1111 lines
58 KiB
Vue
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.

<template>
<view :class="theme_view">
<view class="pr">
<block v-if="(info || null) != null">
<!-- 头部背景 -->
<image :src="info.banner" mode="widthFix" class="header-bg wh-auto pa top-0 left-0 right-0" />
<!-- 头部 -->
<view class="header pr z-i">
<component-nav-back :propIsShowBack="is_realstore_top_nav_back == 1" :propFixed="false" propColor="#333">
<template slot="right" :class="is_top_search_width ? 'top-search-width' : 'flex-1 flex-width'">
<view v-if="is_base_mode != 1" :class="'va-m wh-auto top-nav-search '+(is_realstore_top_nav_back == 1 ? 'padding-left-main' : '')">
<block v-if="client_type == 'h5'">
<component-search @onsearch="search_button_event" :propIsRequired="false" propIconColor="#333" propPlaceholderClass="cr-grey-c" :propPlaceholder="$t('detail.detail.q42ger')" propBgColor="#fff"></component-search>
</block>
<block v-else>
<component-search
@onsearch="search_button_event"
@onicon="search_icon_event"
:propIsIconOnEvent="is_realstore_top_search_scan == 1"
:propIsOnEvent="true"
:propIsRequired="false"
:propIcon="is_realstore_top_search_scan == 1 ? 'icon-scan' : 'icon-qiandao-yixuan'"
propPlaceholderClass="cr-grey-c"
propBgColor="#fff"
propIconColor="#333"
:propPlaceholder="$t('detail.detail.q42ger')"
></component-search>
</block>
</view>
</template>
<template slot="content">
<!-- 桌码 -->
<view v-if="(tablecode || null) != null" class="tablecode dis-inline-block margin-left-main round cr-red"> {{ tablecode.name }}({{ tablecode.code }}) </view>
</template>
</component-nav-back>
</view>
<view class="pr">
<view class="header-top pr">
<!-- 头部基础内容 -->
<view class="header-content padding-horizontal-main">
<view class="padding-main border-radius-main bg-white pr z-i-deep">
<view class="base flex-row">
<!-- 基础内容 -->
<image :src="info.logo" mode="widthFix" class="logo border-radius-sm fl br" :data-value="info.logo" @tap="image_show_event"></image>
<view class="base-right padding-left-sm flex-1 flex-width">
<view v-if="is_base_mode != 1 && (info.buy_use_type_list || null) != null && info.buy_use_type_list.length > 0" class="use-type-icon pa text-size-xs cr-white bg-main tl" @tap="buy_use_type_event">
<text class="va-m margin-right-xs">{{ info.buy_use_type_list[buy_use_type_active_index]['name'] }}</text>
<view class="dis-inline-block va-m pr">
<iconfont name="icon-arrow-bottom" size="24rpx" color="#fff"></iconfont>
</view>
</view>
<view :class="'title ' + (is_base_mode != 1 && (info.buy_use_type_list || null) != null && info.buy_use_type_list.length > 0 ? 'title-length-limit' : '')" @tap="realstore_switch_event">
<view class="dis-inline-block va-m single-text title-content" :class="is_realstore_switch == 1 ? 'switch' : ''">
<text v-if="(info.alias || null) != null" class="va-m title-icon border-radius-sm br-main cr-main text-size-xs padding-left-sm padding-right-sm margin-right-xs">{{ info.alias }}</text>
<text class="va-m fw-b text-size">{{ info.name }}</text>
</view>
<view v-if="is_realstore_switch == 1" class="dis-inline-block va-m margin-left-xs">
<iconfont name="icon-transfer" size="36rpx" color="#666"></iconfont>
</view>
</view>
<view class="margin-top-xs text-size-xss cr-grey tl">
<view v-if="(info.status_info.time || null) != null">{{$t('detail.detail.dor2v9')}}{{ info.status_info.time }}</view>
<view v-if="(info.distance || null) != null">{{$t('extraction-address.extraction-address.42v8tv')}}{{ info.distance }}</view>
</view>
</view>
</view>
<view class="margin-top-sm cp br-t-dashed padding-top-sm">
<view class="flex-row jc-sb align-c">
<!-- 地址 -->
<view class="flex-row align-c flex-1 flex-width">
<iconfont name="icon-map-address" size="28rpx" propClass="pr top-xs"></iconfont>
<view class="address-content single-text cr-base margin-left-xs text-size-sm" :data-value="info.province_name + info.city_name + info.county_name + info.address" @tap="text_copy_event">
{{ info.province_name }}{{ info.city_name }}{{ info.county_name }}{{ info.address }}
</view>
<!-- #ifndef MP-KUAISHOU -->
<view v-if="info.lat != 0 && info.lng != 0" class="dis-inline-block tc cp border-radius-sm text-size-xss cr-green br-green padding-horizontal-xs margin-left-xs" @tap="address_map_event">{{$t('detail.detail.688i26')}}</view>
<!-- #endif -->
</view>
<!-- 右侧操作 -->
<view class="icon-list margin-left-main">
<view v-if="(data_base || null) != null && is_service_info == 1" class="icon-item green cr-green border-radius-sm dis-inline-block tc cp" @tap="popup_service_open_event">
<iconfont name="icon-mendian-kefu" size="26rpx"></iconfont>
</view>
<view :class="'icon-item red border-radius-sm dis-inline-block tc cp pr ' + (favor_info.status == 1 ? 'cr-red' : 'cr-grey-9')" @tap="favor_event">
<iconfont name="icon-mendian-sc" size="26rpx"></iconfont>
<view class="badge-icon pa">
<component-badge :propNumber="favor_info.count"></component-badge>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 门店基础模式 -->
<view v-if="is_base_mode == 1 && is_base_mode_show_type == 2" class="nav-base bg-white fw-b margin-bottom-sm margin-top-sm">
<block v-for="(item, index) in nav_base_list" :key="index">
<view v-if="nav_base_index == index" class="item fl tc padding-horizontal-main cr-main nav-active-line" :data-index="index" @tap="nav_base_event">{{ item.name }}</view>
<view v-else class="item fl tc padding-horizontal-main" :data-index="index" @tap="nav_base_event">{{ item.name }}</view>
</block>
</view>
<!-- 门店基础模式 - 商品 -->
<view v-if="is_base_mode == 1 && (is_base_mode_show_type == 0 || (is_base_mode_show_type == 2 && nav_base_index == 0))" class="padding-horizontal-main border-radius-main bg-white">
<view v-if="is_base_mode_show_type == 0" class="padding-top-sm margin-bottom-sm margin-top-main">
<view class="fw-b title-left-border">{{$t('goods-detail.goods-detail.dfge45')}}</view>
</view>
<scroll-view :scroll-y="true" class="cr-base text-size-sm" :style="content_style">
<view class="right-content-actual base-mode-goods">
<mp-html :content="info.describe" />
</view>
</scroll-view>
</view>
<block v-if="is_base_mode == 0 || (is_base_mode_show_type == 1 || (is_base_mode_show_type == 2 && nav_base_index == 1))">
<!-- 左侧分类和右侧商品 -->
<view class="content oh bg-white pr flex-row jc-sb" :style="content_style">
<!-- 左侧 -->
<scroll-view :scroll-y="true" class="left-content ht-auto bg-base">
<view class="left-content-actual text-size-sm">
<view :class="'item tc cr-base cp ' + (nav_active_index == -1 ? 'bg-white cr-main nav-left-border fw-b' : '')" :data-index="-1" :data-itemindex="-1" @tap="nav_event">{{$t('common.all')}}</view>
<block v-if="(goods_category || null) != null && goods_category.length > 0">
<block v-for="(item, index) in goods_category" :key="index">
<view :class="'item tc cr-base pr cp ' + (nav_active_index == index ? 'bg-white cr-main nav-left-border fw-b' : '')" :data-index="index" :data-itemindex="-1" @tap="nav_event">
<text>{{ item.name }}</text>
<view v-if="(item.buy_number || 0) > 0" class="badge-icon pa">
<component-badge :propNumber="item.buy_number"></component-badge>
</view>
</view>
</block>
</block>
</view>
</scroll-view>
<!-- 右侧 -->
<scroll-view :scroll-y="true" class="right-content ht-auto goods-list flex-1 flex-width" :scroll-top="scroll_top" @scroll="scroll_event" @scrolltolower="scroll_lower" lower-threshold="60">
<view :class="'right-content-actual pr '+(is_base_mode == 1 ? 'base-mode-goods' : '')">
<!-- 操作导航 -->
<view class="goods-list-top-nav bg-white">
<!-- 排序 -->
<view class="nav-sort-content oh">
<block v-for="(item, index) in search_nav_sort_list" :key="index">
<view class="sort-item tc fl cp" :data-index="index" @tap="nav_sort_event">
<text class="cr-base va-m text-size-sm">{{item.name}}</text>
<image v-if="(item.icon || null) != null" class="sort-icon va-m" :src="common_static_url + 'sort-' + item.icon + '-icon.png'" mode="aspectFill"></image>
</view>
</block>
</view>
<!-- 二级分类 -->
<view v-if="(goods_category || null) != null && goods_category.length > 0 && nav_active_index != -1 && (goods_category[nav_active_index]['items'] || null) != null && goods_category[nav_active_index]['items'].length > 0" class="word-list scroll-view-horizontal padding-horizontal-main padding-bottom-main">
<scroll-view :scroll-x="true" :scroll-with-animation="true" :scroll-into-view="'two-nav-item-' + nav_active_item_index">
<view :class="'word-icon dis-inline-block text-size-sm round padding-top-xs padding-bottom-xs padding-left padding-right ' + (nav_active_item_index == -1 ? 'bg-main-light br-main-light cr-main' : 'br-grey cr-grey')" :data-index="nav_active_index" :data-itemindex="-1" @tap="nav_event">{{$t('common.all')}}</view>
<block v-for="(cv, ci) in goods_category[nav_active_index]['items']" :key="ci">
<view :class="'word-icon dis-inline-block text-size-xs round padding-top-xs padding-bottom-xs padding-left padding-right ' + (nav_active_item_index != -1 && nav_active_item_index == ci ? 'bg-main-light br-main-light cr-main' : 'br-grey cr-grey')" :id="'two-nav-item-' + ci" :data-index="nav_active_index" :data-itemindex="ci" @tap="nav_event">{{ cv.name }}</view>
</block>
</scroll-view>
</view>
</view>
<!-- 右侧商品列表 -->
<block v-if="(data_list || null) != null && data_list.length > 0">
<block v-for="(item, index) in data_list" :key="index">
<view :class="'goods-item bg-white padding-main border-radius-main oh spacing-mb '+((item.is_highlight || 0) == 1 ? 'item-highlight' : '')">
<view :data-index="index" @tap="goods_event">
<view class="flex-row jc-sb">
<image :src="item.images" mode="widthFix" class="goods-img radius fl br"></image>
<view class="goods-base flex-1 flex-width padding-left-sm flex-col jc-sb">
<view class="goods-base-content">
<view class="goods-title text-size-md multi-text fw-b">{{ item.title }}</view>
<view v-if="(item.simple_desc || null) != null" class="simple-desc cr-grey-9 text-size-xs margin-top-xs single-text">{{ item.simple_desc }}</view>
</view>
<view class="margin-top-sm oh flex-row jc-sb align-c">
<view class="single-text sales-price va-b va-m">
<text class="text-size-xss">{{ item.show_price_symbol }}</text>
<text class="text-size">{{ item.min_price }}</text>
<text class="text-size-xss cr-grey">{{ item.show_price_unit }}</text>
</view>
<view v-if="is_base_mode != 1" class="tc flex-row align-c">
<block v-if="(item.is_error || 0) == 0">
<view v-if="(item.buy_number || 0) > 0" class="cp pr top-sm" :data-index="index" data-type="0" @tap.stop="buy_number_event">
<iconfont name="icon-cart-dec" size="48rpx" :color="theme_color"></iconfont>
</view>
<view v-if="(item.buy_number || 0) > 0" class="buy-number cr-black text-size-sm padding-left-xs padding-right-xs">
{{ item.buy_number }}
</view>
<view class="cp pr top-sm" :data-index="index" data-type="1" @tap.stop="buy_number_event">
<iconfont name="icon-cart-inc" size="48rpx" :color="theme_color"></iconfont>
</view>
</block>
<block v-else>
<text class="cr-grey-c text-size-xs">{{ item.is_error_msg }}</text>
</block>
</view>
</view>
</view>
</view>
</view>
</view>
</block>
</block>
<block v-else>
<component-no-data :propStatus="data_list_loding_status" :propMsg="data_list_loding_msg" :propBackBtn="false"></component-no-data>
</block>
</view>
</scroll-view>
</view>
<!-- 商品购买 -->
<component-goods-buy ref="goods_buy" :propCurrencySymbol="currency_symbol" v-on:CartSuccessEvent="goods_spec_cart_back_event"></component-goods-buy>
</block>
<!-- 基础模式底部导航 -->
<view v-if="is_base_mode == 1" class="plugins-realstore-detail-base-mode-nav z-i-deep bg-white pf left-0 bottom-0 wh-auto padding-main bs-bb br-top-shadow">
<view class="bottom-line-exclude button-list">
<view :class="'button-left tc '+(is_service_info == 1 ? '' : 'wh-auto')">
<!-- #ifndef MP-KUAISHOU -->
<view v-if="info.lat != 0 && info.lng != 0" propClass="item" @tap="address_map_event">
<view>
<iconfont name="icon-map-navigator" class="lh-sm" size="26rpx"></iconfont>
</view>
<view class="cr-base text-size-md">{{$t('detail.detail.688i26')}}</view>
</view>
<!-- #endif -->
<view class="item" @tap="share_event">
<view>
<iconfont name="icon-share-square" propClass="lh-sm" size="26rpx"></iconfont>
</view>
<view class="cr-base text-size-md">{{$t('common.share')}}</view>
</view>
</view>
<view v-if="is_service_info == 1" class="button-right">
<button type="default" class="item br-main bg-main cr-white round text-size-md dis-block wh-auto" @tap="popup_service_open_event">{{$t('cart.cart.31h34v')}}</button>
</view>
</view>
</view>
</view>
</block>
<block v-else>
<!-- 提示信息 -->
<component-no-data :propStatus="data_list_loding_status" :propMsg="data_list_loding_msg"></component-no-data>
</block>
</view>
<!-- 门店购物车 -->
<component-realstore-cart ref="realstore_cart" :propIsBaseMode="is_base_mode == 1" :propCurrencySymbol="currency_symbol" :propStatus="is_cart_nav" v-on:CartSuccessEvent="goods_opt_cart_back_event" v-on:BuyTypeSwitchEvent="buy_type_switch_event" v-on:CartDataBackEvent="cart_data_back_event"></component-realstore-cart>
<!-- 客服弹窗 -->
<component-popup :propShow="popup_service_status" propPosition="bottom" @onclose="popup_service_close_event">
<view class="padding-top-main bg-white">
<view class="padding-horizontal-main">
<view class="close oh">
<view class="fr" @tap.stop="popup_service_close_event">
<iconfont name="icon-close-o" size="28rpx" color="#999"></iconfont>
</view>
</view>
</view>
<view class="popup-service-container">
<view v-if="(info || null) != null && (data_base || null) != null && is_service_info == 1" class="header-service">
<view v-if="(info.chat_info || null) != null" class="item padding-main single-text">
<text class="va-m">{{$t('detail.detail.r4124d')}}</text>
<view class="dis-inline-block chat-info cp" @tap="chat_event">
<image class="dis-inline-block va-m" :src="info.chat_info.icon" mode="scaleToFill"></image>
<text class="margin-left-sm va-m cr-blue" :data-value="info.chat_info.chat_url">{{ info.chat_info.name }}</text>
</view>
</view>
<block v-if="(info.service_data || null) != null">
<view v-if="(info.service_data.service_qq || null) != null" class="item padding-main br-t-f9 single-text">
<text>Q Q</text>
<text class="cp" @tap="text_copy_event" :data-value="info.service_data.service_qq">{{ info.service_data.service_qq }}</text>
</view>
<view v-if="(info.service_data.service_tel || null) != null" class="item padding-main br-t-f9 single-text">
<text>{{$t('order.order.7dxbm5')}}</text>
<text class="cp" @tap="tel_event" :data-value="info.service_data.service_tel">{{ info.service_data.service_tel }}</text>
</view>
<view v-if="(info.service_data.service_weixin_qrcode || null) != null || (info.service_data.service_line_qrcode || null) != null" class="oh qrcode tc br-t-f9 padding-top-main">
<view v-if="(info.service_data.service_weixin_qrcode || null) != null" class="item padding-bottom-lg dis-inline-block">
<image class="radius cp" :src="info.service_data.service_weixin_qrcode" mode="scaleToFill" @tap="image_show_event" :data-value="info.service_data.service_weixin_qrcode"></image>
<view>{{$t('detail.detail.54k10s')}}</view>
</view>
<view v-if="(info.service_data.service_line_qrcode || null) != null" class="item padding-bottom-lg dis-inline-block">
<image class="radius cp" :src="info.service_data.service_line_qrcode" mode="scaleToFill" @tap="image_show_event" :data-value="info.service_data.service_line_qrcode"></image>
<view>{{$t('detail.detail.vj4nom')}}</view>
</view>
</view>
</block>
</view>
</view>
</view>
</component-popup>
<!-- 分享弹窗 -->
<component-share-popup ref="share"></component-share-popup>
<!-- 公共 -->
<component-common ref="common" @onFooterHeight="footer_height_value_event" :propIsFooterSeat="false"></component-common>
</view>
</template>
<script>
const app = getApp();
import componentCommon from '@/components/common/common';
import componentNavBack from '@/components/nav-back/nav-back';
import componentGoodsBuy from '@/components/goods-buy/goods-buy';
import componentNoData from '@/components/no-data/no-data';
import componentSearch from '@/components/search/search';
import componentBadge from '@/components/badge/badge';
import componentPopup from '@/components/popup/popup';
import componentRealstoreCart from '@/components/realstore-cart/realstore-cart';
import componentSharePopup from '@/components/share-popup/share-popup';
var common_static_url = app.globalData.get_static_url('common');
var status_bar_height = parseInt(app.globalData.get_system_info('statusBarHeight', 0, true));
export default {
data() {
return {
theme_view: app.globalData.get_theme_value_view(),
theme_color: app.globalData.get_theme_color(),
status_bar_height: status_bar_height,
common_static_url: common_static_url,
client_type: app.globalData.application_client_type(),
currency_symbol: app.globalData.currency_symbol(),
is_top_search_width: false,
// #ifdef MP-WEIXIN || MP-QQ || MP-ALIPAY || MP-BAIDU || MP-KUAISHOU || APP
is_top_search_width: true,
// #endif
content_style: '',
data_list_loding_status: 1,
data_list_loding_msg: '',
data_is_loading: 0,
is_base_mode: 0,
is_base_mode_show_type: 0,
is_cart_nav: false,
params: null,
is_first: 1,
scroll_top: 0,
scroll_top_old: 0,
info: null,
goods_category: [],
data_list: [],
data_total: 0,
data_page_total: 0,
data_page: 1,
cart: null,
data_base: null,
favor_user: [],
tablecode: null,
search_keywords_value: '',
nav_active_index: -1,
nav_active_item_index: -1,
popup_service_status: false,
// 基础导航
nav_base_index: 0,
nav_base_list: [
{ name: this.$t('goods-detail.goods-detail.dfge45'), value: 0 },
{ name: this.$t('goods-detail.goods-detail.567uhg'), value: 1 },
],
// 下单类型
buy_use_type_active_index: 0,
// 排序导航
search_nav_sort_index: 0,
search_nav_sort_list: [{
name: this.$t('goods-category.goods-category.x69aow'),
field: 'default',
sort: 'asc',
icon: null
},
{
name: this.$t('goods-category.goods-category.at5p35'),
field: 'sales_count',
sort: 'asc',
icon: 'default'
},
{
name: this.$t('goods-category.goods-category.283ot0'),
field: 'access_count',
sort: 'asc',
icon: 'default'
},
{
name: this.$t('goods-category.goods-category.g2u3lf'),
field: 'min_price',
sort: 'asc',
icon: 'default'
},
{
name: this.$t('goods-category.goods-category.5p4ksj'),
field: 'id',
sort: 'asc',
icon: 'default'
}
],
// 收藏信息
favor_info: {
text: this.$t('goods-detail.goods-detail.dco1sc'),
status: 0,
count: 0,
},
// 门店客服信息展示
is_service_info: 0,
// 是否支持门店切换
is_realstore_switch: 0,
// 自定义分享信息
share_info: {},
// 是否单页预览
is_single_page: app.globalData.is_current_single_page() || 0,
// 顶部导航返回按钮
is_realstore_top_nav_back: app.globalData.data.is_realstore_top_nav_back || 0,
// #ifdef MP-TOUTIAO
is_realstore_top_nav_back : 0,
// #endif
is_realstore_top_search_scan: app.globalData.data.is_realstore_top_search_scan || 0,
// 底部菜单高度
footer_height_value: 0,
};
},
components: {
componentCommon,
componentNavBack,
componentGoodsBuy,
componentNoData,
componentSearch,
componentBadge,
componentPopup,
componentRealstoreCart,
componentSharePopup
},
onLoad(params) {
// 调用公共事件方法
app.globalData.page_event_onload_handle(params);
// 设置参数
params = app.globalData.launch_params_handle(params);
// 是否指定门店id
var realstore_id = app.globalData.data.plugins_realstore_id || null;
if(realstore_id != null) {
params['id'] = realstore_id;
}
this.setData({
params: params,
});
},
onShow() {
// 调用公共事件方法
app.globalData.page_event_onshow_handle();
// 门店选择初始化
this.realstore_choice_init();
// 初始化配置
this.init_config();
// 获取数据
var self = this;
setTimeout(function() {
self.get_detail_init();
}, 100);
// 公共onshow事件
if ((this.$refs.common || null) != null) {
this.$refs.common.on_show();
}
},
// 下拉刷新
onPullDownRefresh() {
this.setData({
data_page: 1,
data_list_loding_status: (this.data_list_loding_status == 2) ? 1 : this.data_list_loding_status
});
this.reset_scroll();
this.get_detail_init();
},
methods: {
// 初始化配置
init_config(status) {
if ((status || false) == true) {
this.setData({
currency_symbol: app.globalData.get_config('currency_symbol'),
});
} else {
app.globalData.is_config(this, 'init_config');
}
},
// 门店选择初始化
realstore_choice_init() {
var key = app.globalData.data.cache_realstore_detail_choice_key;
var res = uni.getStorageSync(key) || null;
if(res != null && (res.data || null) != null && res.status == 1) {
uni.setStorageSync(key, {
data: res.data,
status: 0
});
this.setData({
params: {...this.params, ...{id: res.data.id}},
info: res.data,
is_first: 1,
data_list: [],
data_total: 0,
data_page: 1,
data_page_total: 0,
data_is_loading: 0,
data_list_loding_status: 1,
data_bottom_line_status: false
});
this.source_goods_remove();
this.reset_scroll();
}
},
// 获取数据-初始化
get_detail_init(params = {}) {
// 网络检查
if((params || null) == null || (params.loading || 0) == 0) {
app.globalData.network_type_handle(this, 'get_detail_init');
return false;
}
// 请求数据
uni.request({
url: app.globalData.get_request_url('index', 'detail', 'realstore'),
method: 'POST',
data: this.$refs.realstore_cart.request_params_merge(
{
id: ((this.info || null) == null) ? (this.params.id || 0) : (this.info.id || 0),
}, 'init'),
dataType: 'json',
success: (res) => {
uni.stopPullDownRefresh();
if (res.data.code == 0) {
// 门店数据
var data = res.data.data;
// 基础配置
var data_base = data.base || {};
this.setData({
is_service_info: parseInt(data_base.is_service_info || 0),
is_realstore_switch: parseInt(data_base.is_realstore_switch || 0),
is_base_mode: parseInt(data.is_base_mode || 0),
is_base_mode_show_type: parseInt(data.is_base_mode_show_type || 0),
is_cart_nav: true,
data_base: data_base,
info: data.info || null,
goods_category: data.goods_category || [],
favor_user: data.favor_user || [],
tablecode: data.tablecode || null
});
// 样式处理
this.content_actual_size_handle();
// 收藏处理
if ((this.info || null) != null) {
// 收藏信息
var status = this.favor_user.indexOf(this.info.id) != -1 ? 1 : 0;
this.setData({
favor_info: {
count: this.info.favor_count || 0,
status: status,
text: (status == 1 ? this.$t('goods-detail.goods-detail.by7052') : '') + this.$t('goods-detail.goods-detail.dco1sc'),
},
});
// #ifndef MP-ALIPAY
// 标题名称
uni.setNavigationBarTitle({
title: this.info.name,
});
// #endif
// 基础自定义分享
this.setData({
share_info: {
title: this.info.seo_title || this.info.name,
desc: this.info.seo_desc || this.info.describe,
path: '/pages/plugins/realstore/detail/detail',
query: 'id=' + this.info.id,
img: this.info.share_images || this.info.logo,
},
});
// 是否基础模式
if(this.is_base_mode != 1) {
// 获取购物车数据
this.get_cart_data();
}
// 下单类型索引
var type_data = this.buy_use_type_data();
this.setData({
buy_use_type_active_index: type_data.active_index,
});
// 获取数据、仅首次调用,获取列表接口
if (this.is_first == 1) {
// 是否基础模式
if(this.is_base_mode != 1 || this.is_base_mode_show_type != 0) {
this.get_data_list();
}
// 非首次记录
this.setData({
is_first: 0,
});
}
}
} else {
this.setData({
data_list_loding_status: 2,
data_list_loding_msg: res.data.msg,
});
}
// 分享菜单处理
app.globalData.page_share_handle(this.share_info);
},
fail: () => {
uni.stopPullDownRefresh();
this.setData({
data_list_loding_status: 2,
data_list_loding_msg: this.$t('common.internet_error_tips'),
});
app.globalData.showToast(this.$t('common.internet_error_tips'));
},
});
},
// 获取数据-商品列表
get_data_list(is_mandatory) {
// 分页是否还有数据
if ((is_mandatory || 0) == 0) {
if (this.data_bottom_line_status == true) {
uni.stopPullDownRefresh();
return false;
}
}
// 是否加载中
if (this.data_is_loading == 1) {
return false;
}
this.setData({
data_is_loading: 1,
});
// 请求参数
var post_data = {
id: this.info.id || 0,
page: this.data_page,
keywords: this.search_keywords_value,
};
// 分类id
var temp_category = this.goods_category;
if (this.nav_active_item_index != -1) {
post_data['category_id'] = temp_category[this.nav_active_index]['items'][this.nav_active_item_index]['id'];
} else {
post_data['category_id'] = this.nav_active_index == -1 ? 0 : temp_category[this.nav_active_index]['id'];
}
// 排序
var temp_index = this.search_nav_sort_index;
var temp_search_nav_sort = this.search_nav_sort_list;
post_data['order_by_type'] = temp_search_nav_sort[temp_index]['sort'] == 'desc' ? 'asc' : 'desc';
post_data['order_by_field'] = temp_search_nav_sort[temp_index]['field'];
// 指定商品
if((this.params.source_goods_id || null) != null) {
post_data['source_goods_id'] = this.params.source_goods_id;
}
// 获取数据
uni.request({
url: app.globalData.get_request_url('datalist', 'detail', 'realstore'),
method: 'POST',
data: this.$refs.realstore_cart.request_params_merge(post_data, 'data'),
dataType: 'json',
success: (res) => {
uni.stopPullDownRefresh();
if (res.data.code == 0) {
var data = res.data.data;
// 列表数据处理
if (data.data.length > 0) {
if (this.data_page <= 1) {
var temp_data_list = data.data;
} else {
var temp_data_list = this.data_list || [];
var temp_data = data.data;
for (var i in temp_data) {
temp_data_list.push(temp_data[i]);
}
}
this.setData({
data_list: temp_data_list,
data_total: data.total,
data_page_total: data.page_total,
data_list_loding_status: 3,
data_page: this.data_page + 1,
data_is_loading: 0,
});
// 是否还有数据
this.setData({
data_bottom_line_status: this.data_page > 1 && this.data_page > this.data_page_total,
});
} else {
this.setData({
data_list_loding_status: 0,
data_is_loading: 0,
});
if (this.data_page <= 1) {
this.setData({
data_list: [],
data_bottom_line_status: false,
});
}
}
} else {
this.setData({
data_list_loding_status: 0,
data_list_loding_msg: res.data.msg,
data_is_loading: 0,
});
app.globalData.showToast(res.data.msg);
}
},
fail: () => {
uni.stopPullDownRefresh();
this.setData({
data_list_loding_status: 2,
data_list_loding_msg: this.$t('common.internet_error_tips'),
data_is_loading: 0,
});
app.globalData.showToast(this.$t('common.internet_error_tips'));
},
});
},
// 样式处理
content_actual_size_handle() {
// 基础模式内容高度处理
var value = 0;
if(this.is_base_mode == 1) {
value = (this.is_base_mode_show_type == 1) ? 110 : 220;
}
// 内容高度
value += (this.client_type == 'h5') ? 370 : 352;
// 桌码
if(this.tablecode != null) {
value += 44;
}
// 减去内容高度、底部菜单高度
this.setData({
content_style: 'height: calc(100vh - '+value+'rpx - '+(this.status_bar_height+this.footer_height_value)+'px);',
});
},
// 收藏事件
favor_event(e) {
if (!app.globalData.is_single_page_check()) {
return false;
}
var user = app.globalData.get_user_info(this, 'favor_event');
if (user != false) {
uni.showLoading({
title: this.$t('common.processing_in_text'),
});
uni.request({
url: app.globalData.get_request_url('reversal', 'favor', 'realstore'),
method: 'POST',
data: {
id: this.info.id,
},
dataType: 'json',
success: (res) => {
uni.hideLoading();
if (res.data.code == 0) {
this.setData({
favor_info: res.data.data,
});
app.globalData.showToast(res.data.msg, 'success');
} else {
if (app.globalData.is_login_check(res.data, this, 'favor_event')) {
app.globalData.showToast(res.data.msg);
}
}
},
fail: () => {
uni.hideLoading();
app.globalData.showToast(this.$t('common.internet_error_tips'));
},
});
}
},
// 列表数据操作
buy_number_event(e) {
if (!app.globalData.is_single_page_check()) {
return false;
}
var user = app.globalData.get_user_info(this, 'buy_number_event', e);
if (user != false) {
var index = e.currentTarget.dataset.index;
var type = parseInt(e.currentTarget.dataset.type) || 0;
var temp_goods = this.data_list[index];
// 是否存在多规格
if ((temp_goods.is_exist_many_spec || 0) != 0) {
// 是否购物车中操作
if (type == 0) {
this.$refs.realstore_cart.cart_event(true);
app.globalData.showToast(this.$t('goods-category.goods-category.gy7y0w'));
} else {
if ((this.$refs.goods_buy || null) != null) {
var buy_params = this.params;
var type_data = this.buy_use_type_data();
buy_params['buy_event_type'] = 'cart';
buy_params['buy_use_type_data_index'] = type_data.data_index;
buy_params['realstore_id'] = this.info.id;
this.$refs.goods_buy.init(temp_goods, buy_params);
}
}
return false;
}
// 数据操作处理
this.buy_number_event_handle(e, type, temp_goods);
}
},
// 多规格加入购物车成功回调
goods_spec_cart_back_event(params) {
// 重新获取购物车数据
this.get_cart_data();
// 更新列表数据处理
this.cart_data_list_handle(params, 1);
},
// 购物车操作成功回调
goods_opt_cart_back_event(params) {
// 更新列表数据处理
this.cart_data_list_handle(params);
},
// 购物车数据获取成功回调
cart_data_back_event(params) {
var temp_data_list = this.data_list;
if (temp_data_list.length > 0) {
for (var i in temp_data_list) {
// 非追加则赋值0
temp_data_list[i]['buy_number'] = 0;
// 对应商品叠加数量
if((params || null) != null && (params.data || null) != null && params.data.length > 0) {
for (var x in params.data) {
if (params.data[x]['goods_id'] == temp_data_list[i]['id']) {
temp_data_list[i]['buy_number'] += parseInt(params.data[x]['stock'] || 0);
}
}
}
}
this.setData({
data_list: temp_data_list,
});
}
},
// 更新列表数据处理
// params 操作数据
// is_append 是否追加数据0否、1是
cart_data_list_handle(params, is_append = 0) {
var temp_data_list = this.data_list;
if (temp_data_list.length > 0) {
for (var i in temp_data_list) {
// 非追加则赋值0
if(is_append == 0 && (params.type || null) != 'save') {
temp_data_list[i]['buy_number'] = 0;
}
// 对应商品叠加数量
if (params.goods_id == temp_data_list[i]['id']) {
temp_data_list[i]['buy_number'] += parseInt(params.stock || 0);
}
}
this.setData({
data_list: temp_data_list,
});
}
},
// 获取购物车数据
get_cart_data() {
this.$refs.realstore_cart.init({...{source: 'realstore', base: this.data_base, info: this.info}, ...this.params});
},
// 列表数量事件处理
buy_number_event_handle(e, type, goods, spec = '') {
// 调用门店购物车方法处理
this.$refs.realstore_cart.goods_opt_handle(type, goods, spec, 'buy_number', e);
},
// 搜索事件
search_button_event(e) {
this.setData({
search_keywords_value: e || '',
data_page: 1,
});
this.source_goods_remove();
this.reset_scroll();
this.get_data_list(1);
},
// 搜索icon扫码事件、扫码商品id实现加入购物车
search_icon_event(e) {
this.$refs.realstore_cart.search_icon_handle(e);
},
// 剪切板
text_copy_event(e) {
app.globalData.text_copy_event(e);
},
// 地图查看
address_map_event(e) {
var info = this.info || {};
if (info.lat == 0 || info.lng == 0) {
app.globalData.showToast(this.$t('user-order-detail.user-order-detail.i876o3'));
return false;
}
var address = (info.province_name || '') + (info.city_name || '') + (info.county_name || '') + (info.address || '');
app.globalData.open_location(info.lng, info.lat, info.name, address);
},
// 电话
tel_event(e) {
app.globalData.call_tel(e);
},
// 图片预览
image_show_event(e) {
app.globalData.image_show_event(e);
},
// 进入客服系统
chat_event() {
app.globalData.chat_entry_handle(this.info.chat_info.chat_url);
},
// 导航事件
nav_event(e) {
this.setData({
nav_active_index: e.currentTarget.dataset.index,
nav_active_item_index: e.currentTarget.dataset.itemindex,
data_page: 1,
data_list: [],
data_list_loding_status: 1,
data_bottom_line_status: false
});
this.source_goods_remove();
this.reset_scroll();
this.get_data_list(1);
},
// 重置滑动位置
reset_scroll() {
this.setData({
scroll_top: this.scroll_top_old,
});
this.$nextTick(() => {
this.setData({
scroll_top: 0,
});
});
},
// 滑动事件位置记录
scroll_event(e) {
this.setData({
scroll_top_old: e.detail.scrollTop,
});
},
// 滚动加载
scroll_lower(e) {
this.get_data_list();
},
// 排序事件
nav_sort_event(e) {
var index = e.currentTarget.dataset.index || 0;
var temp_search_nav_sort = this.search_nav_sort_list;
var temp_sort = temp_search_nav_sort[index]['sort'] == 'desc' ? 'asc' : 'desc';
for (var i in temp_search_nav_sort) {
if (i != index) {
if (temp_search_nav_sort[i]['icon'] != null) {
temp_search_nav_sort[i]['icon'] = 'default';
}
temp_search_nav_sort[i]['sort'] = 'desc';
}
}
temp_search_nav_sort[index]['sort'] = temp_sort;
if (temp_search_nav_sort[index]['icon'] != null) {
temp_search_nav_sort[index]['icon'] = temp_sort;
}
this.setData({
search_nav_sort_index: index,
search_nav_sort_list: temp_search_nav_sort,
data_page: 1,
data_list: [],
data_list_loding_status: 1,
data_bottom_line_status: false
});
this.source_goods_remove();
this.reset_scroll();
this.get_data_list(1);
},
// 来源商品清空
source_goods_remove() {
// 存在参数指定来源商品id则清空
if((this.params.source_goods_id || null) != null) {
var temp_params = this.params;
delete temp_params['source_goods_id'];
this.setData({
params: temp_params
});
}
},
// 使用类型事件
buy_use_type_event(e) {
this.$refs.realstore_cart.buy_use_type_event();
},
// 下单类型切换事件回调
buy_type_switch_event(params) {
this.setData({
buy_use_type_active_index: params.buy_use_type_active_index,
data_page: 1,
});
this.reset_scroll();
this.get_data_list(1);
},
// 获取使用类型数据索引、默认在店0
buy_use_type_data() {
return this.$refs.realstore_cart.buy_use_type_data();
},
// 商品事件
goods_event(e) {
// 是否可以打开商品页面
if(app.globalData.data.is_realstore_forbid_to_goods_detail != 1) {
// 商品数据缓存处理
var goods = this.data_list[e.currentTarget.dataset.index];
app.globalData.goods_data_cache_handle(goods.id, goods);
// 调用公共打开url地址
var type_data = this.buy_use_type_data();
var url = '/pages/goods-detail/goods-detail?id=' + goods.id + '&is_opt_back=1&buy_use_type_data_index=' + type_data.data_index + '&realstore_id=' + this.info.id;
app.globalData.url_open(url);
}
},
// 门店切换事件
realstore_switch_event (e) {
if(this.is_realstore_switch == 1) {
app.globalData.url_open('/pages/plugins/realstore/search/search?is_choice_mode=1&show_type_mode=1');
}
},
// 开启客服弹层
popup_service_open_event(e) {
this.setData({
popup_service_status: true,
});
},
// 关闭客服弹层
popup_service_close_event(e) {
this.setData({
popup_service_status: false,
});
},
// 分享开启弹层
share_event(e) {
if ((this.$refs.share || null) != null) {
this.$refs.share.init({
share_info: this.share_info
});
}
},
// 基础导航事件
nav_base_event(e) {
this.setData({
nav_base_index: e.currentTarget.dataset.index,
});
},
// 底部菜单高度
footer_height_value_event(value) {
this.setData({
footer_height_value: value
});
this.content_actual_size_handle();
}
},
};
</script>
<style>
@import './detail.css';
</style>