xo_user_client/components/realstore-cart/realstore-cart.vue

1117 lines
53 KiB
Vue

<template>
<view :class="theme_view">
<view v-if="!propIsBaseMode && propStatus">
<!-- 购物车弹层背景 -->
<view v-if="cart_status" class="plugins-realstore-cart-mask wh-auto ht-auto pf" @tap="cart_switch_event"></view>
<!-- 购物车列表 -->
<view class="plugins-realstore-cart-content pf wh-auto" :style="realstore_cart_content_style">
<view class="bottom-line-exclude">
<view v-if="cart_status" class="bg-white border-radius-main pr oh margin-horizontal-main margin-bottom-xxxl">
<block v-if="(cart || null) != null && (cart.data || null) != null && cart.data.length > 0">
<view class="oh br-b padding-vertical-main padding-horizontal-main text-size-xs">
<text class="va-m cr-base">{{$t('goods-category.goods-category.ico62g')}}</text>
<view v-if="(info.buy_use_type_list || null) != null && info.buy_use_type_list.length > 0" class="dis-inline-block margin-left-xl">
<text class="cr-red">{{$t('realstore-cart.realstore-cart.v437n6')}}</text>
<view class="va-m dis-inline-block br-green cr-green round padding-horizontal-sm padding-vertical-xs cp" @tap="buy_use_type_event">
<text class="va-m">{{$t('realstore-cart.realstore-cart.6bmc34')}}({{info.buy_use_type_list[buy_use_type_active_index]['name']}})</text>
<view class="va-m dis-inline-block margin-left-xs">
<iconfont name="icon-arrow-bottom" size="24rpx" propClass="cr-green"></iconfont>
</view>
</view>
</view>
<view class="fr cp" @tap="cart_all_delete_event">
<view class="dis-inline-block va-m">
<uni-icons type="trash" size="24rpx" color="#f00"></uni-icons>
</view>
<text class="cr-red va-m margin-left-xs">{{$t('common.clear')}}</text>
</view>
</view>
<scroll-view :scroll-y="true" class="cart-list goods-list">
<view v-for="(goods, index) in cart.data" :key="index" class="item padding-main oh spacing-mb">
<view :data-index="index" @tap="goods_event">
<view class="flex-row jc-sb">
<image :src="goods.images" mode="widthFix" class="goods-img radius br"></image>
<view class="goods-base flex-1 flex-width padding-left-main flex-col jc-sb">
<view class="goods-base-content">
<view class="goods-title text-size-sm single-text">{{ goods.title }}</view>
<view v-if="goods.spec != null" class="text-size-xs cr-grey margin-top-sm">
<block v-for="(sv, si) in goods.spec" :key="si">
<text v-if="si > 0" class="padding-left-xs padding-right-xs">;</text>
<text>{{ sv.value }}</text>
</block>
</view>
</view>
<view class="margin-top-sm">
<view class="sales-price text-size-sm single-text dis-inline-block va-m">{{ propCurrencySymbol }}{{ goods.price }}</view>
<view class="tc fr flex-row align-c">
<view v-if="(goods.stock || 0) > 0" class="cp pr top-sm" :data-index="index" data-type="0" @tap.stop="cart_stock_event">
<iconfont name="icon-cart-dec" size="48rpx" :color="theme_color"></iconfont>
</view>
<view v-if="(goods.stock || 0) > 0" class="buy-number dis-inline-block cr-black text-size-sm padding-left-xs padding-right-xs va-m">{{ goods.stock }} </view>
<view class="cp pr top-sm" :data-index="index" data-type="1" @tap.stop="cart_stock_event">
<iconfont name="icon-cart-inc" size="48rpx" :color="theme_color"></iconfont>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</scroll-view>
</block>
<block v-else>
<component-no-data propStatus="0" :propMsg="$t('realstore-cart.realstore-cart.2dc65q')"></component-no-data>
<view v-if="(info.buy_use_type_list || null) != null && info.buy_use_type_list.length > 0" class="padding-vertical-xxxl margin-vertical-xxxl tc text-size-xs">
<text class="cr-red va-m">{{$t('realstore-cart.realstore-cart.v437n6')}}</text>
<view class="va-m dis-inline-block br-green cr-green round padding-horizontal padding-vertical-xs cp" @tap="buy_use_type_event">
<text class="va-m">{{$t('realstore-cart.realstore-cart.6bmc34')}}{{info.buy_use_type_list[buy_use_type_active_index]['name']}})</text>
<view class="va-m dis-inline-block margin-left-xs">
<iconfont name="icon-arrow-bottom" size="24rpx" propClass="cr-green"></iconfont>
</view>
</view>
</view>
</block>
</view>
<!-- 购物车底部导航 -->
<view class="plugins-realstore-cart-botton-nav pr round oh bg-white">
<view class="wh-auto flex-row jc-sb align-c">
<view class="flex-row align-c flex-1 flex-width padding-bottom-xs">
<view class="cart-icon-total pr cp top-sm padding-left-main" @tap="cart_switch_event">
<iconfont name="icon-menu-cart" size="36rpx" color="#666"></iconfont>
<view v-if="(cart || null) != null && (cart.buy_number || 0) > 0" class="badge-icon pa">
<component-badge :propNumber="cart.buy_number"></component-badge>
</view>
</view>
<view class="cart-total-price single-text fw-b cr-red padding-left-sm" @tap="cart_switch_event">
<text class="text-size-xss">{{ propCurrencySymbol }}</text>
<text class="text-size-lg">{{ (cart || null) == null ? '0.00' : (cart.total_price || '0.00') }}</text>
</view>
</view>
<view class="padding-right-main padding-top-main padding-bottom-sm">
<button v-if="params.source == 'goods'" type="default" size="mini" hover-class="none" @tap="cart_submit_event" :loading="realstore_goods_data_cart_loading" :class="'btn text-size-md round margin-right-main ' + (realstore_goods_data_cart_status ? 'bg-main-pair cr-white' : 'bg-grey-disabled cr-grey')" :disabled="!realstore_goods_data_cart_status">{{ realstore_goods_data_cart_text }}</button>
<button type="default" size="mini" hover-class="none" @tap="buy_submit_event" :loading="settlement_btn_loading" :class="'btn text-size-md round ' + (settlement_btn_status ? 'bg-main cr-white' : 'bg-grey-disabled cr-grey')">{{ settlement_btn_text }}</button>
</view>
</view>
</view>
</view>
</view>
<!-- 下单类型选择弹窗 -->
<block v-if="buy_use_type_choice_status">
<!-- 下单类型选择弹层背景 -->
<view class="plugins-realstore-buy-type-mask wh-auto ht-auto pf"></view>
<!-- 下单类型弹窗选择 -->
<view class="plugins-realstore-buy-type-choice pf bg-white border-radius-main padding-xxl">
<view class="tc margin-top-xs margin-bottom-xl">
<text class="cr-grey text-size">{{$t('realstore-cart.realstore-cart.d1kk7x')}}</text>
<view v-if="(base.is_tips_user_choice_buy_use_type_mandatory || 0) == 0" class="fr" @tap="buy_use_type_choice_close_event">
<iconfont name="icon-close-o" size="28rpx" color="#999"></iconfont>
</view>
</view>
<block v-for="(item, index) in buy_use_type_choice_list" :key="index">
<view class="item pr">
<view :class="'item-content pr padding-horizontal border-radius-main item-content-'+item.index" :data-index="item.key" @tap="buy_use_type_choice_event">
<image class="left-icon dis-inline-block va-m" :src="static_url+'buy_use_type/'+item.index+'.png'" mode="aspectFit"></image>
<text class="cr-black text-size-sm va-m margin-left-sm">{{item.name}}</text>
<view class="right-arrow pa top-0 right-xxxxl">
<iconfont name="icon-arrow-right" size="24rpx" propClass="lh-il" color="#333"></iconfont>
</view>
</view>
<!-- #ifndef H5 -->
<view v-if="item.index == 0" class="scan-item border-radius-main tc pa right-0 top-0" :data-index="index" @tap="search_icon_event">
<iconfont name="icon-scan" size="36rpx" propClass="lh-il va-m" color="#02b3c2"></iconfont>
</view>
<!-- #endif -->
</view>
</block>
</view>
</block>
<!-- 商品购买 -->
<component-goods-buy ref="goods_buy" :propCurrencySymbol="propCurrencySymbol" v-on:CartSuccessEvent="goods_cart_back_event"></component-goods-buy>
<!-- 购物车抛物线 -->
<component-cart-para-curve ref="cart_para_curve"></component-cart-para-curve>
</view>
</view>
</template>
<script>
const app = getApp();
import base64 from '@/common/js/lib/base64.js';
import componentPopup from "@/components/popup/popup";
import componentGoodsBuy from '@/components/goods-buy/goods-buy';
import componentCartParaCurve from '@/components/cart-para-curve/cart-para-curve';
import componentBadge from '@/components/badge/badge';
import componentNoData from '@/components/no-data/no-data';
var static_url = app.globalData.get_static_url('realstore', true);
export default {
data() {
return {
theme_view: app.globalData.get_theme_value_view(),
theme_color: app.globalData.get_theme_color(),
static_url: static_url,
params: {},
is_first: 1,
cart_status: false,
cart: null,
info: null,
base: null,
source: null,
// 结算按钮
settlement_btn_loading: true,
settlement_btn_status: false,
settlement_btn_text: this.$t('realstore-cart.realstore-cart.50lf68'),
// 临时操作数据
temp_opt_data: null,
// 下单类型
cache_buy_use_type_active_index_key: 'cache_plugins_realstore_buy_use_type_active_index_',
buy_use_type_active_index: 0,
// 下单类型选择弹窗
buy_use_type_choice_list: [],
buy_use_type_choice_status: false,
cache_buy_use_type_interval_time_key: 'cache_plugins_realstore_buy_use_type_interval_time_',
// 指定商品信息
realstore_goods_data: null,
// 操作按钮是否加载中
realstore_goods_data_cart_loading: true,
realstore_goods_data_cart_status: false,
realstore_goods_data_cart_type: null,
realstore_goods_data_cart_value: null,
realstore_goods_data_cart_text: this.$t('realstore-cart.realstore-cart.50lf68'),
// 样式
realstore_cart_content_style: ''
};
},
components: {
componentPopup,
componentGoodsBuy,
componentCartParaCurve,
componentBadge,
componentNoData
},
props: {
propCurrencySymbol: {
type: String,
default: app.globalData.currency_symbol(),
},
propIsBaseMode: {
type: Boolean,
default: false,
},
propStatus: {
type: Boolean,
default: true,
},
propIndex: {
type: Number,
default: 100
}
},
created: function() {},
methods: {
// 获取数据
init(params) {
// 非基础模式
if(!this.propIsBaseMode) {
// 获取底部菜单高度、如果当前为底部菜单页面则增加底部间距、如果当前使用了原生菜单则不取底部菜单高度
var tabbar_height = (app.globalData.data.is_tabbar_pages == 0 && app.globalData.is_tabbar_pages()) ? (app.globalData.app_tabbar_height_value()*2) : 0;
// 门店信息
var info = params.info || null;
if(info != null && (params.source || null) != null) {
this.setData({
params: params,
info: info,
base: params.base || null,
source: params.source,
realstore_cart_content_style: 'bottom: '+tabbar_height+'rpx',
});
// 商品来源
var type_data = this.buy_use_type_data();
if(this.source == 'goods' && (params.realstore_id || null) == null) {
// 调用父级需要重新加载数据
this.$emit('RefreshLoadingEvent', {buy_use_type_active_index: type_data.active_index, buy_use_type_data_index: type_data.data_index, realstore_id: this.info.id});
} else {
// 非系统购物车来源
if(this.source != 'system-cart') {
// 店铺状态正常、是否指定商品、如果不存在操作按钮、不可以加入购物车则置空
var cart_status = false;
var cart_type = '';
var cart_text = '';
var realstore_goods_data = params.realstore_goods_data || null;
if(realstore_goods_data != null && (realstore_goods_data.buy_button || null) != null) {
// 是否存在错误
if((realstore_goods_data.buy_button.error || null) != null) {
cart_text = realstore_goods_data.buy_button.error;
// 是否展示型、门店存在客服电话则展示电话号码
if((realstore_goods_data.buy_button.data || null) != null && (realstore_goods_data.buy_button['data'][0] || null) != null && realstore_goods_data.buy_button['data'][0]['type'] == 'show') {
var cart_value = ((info.service_data || null) == null ? info.contacts_tel : (info.service_data.service_tel || info.contacts_tel)) || null;
if(cart_value != null) {
cart_status = true;
cart_type = 'show';
cart_text = this.$t('cart.cart.31h34v');
}
}
} else {
// 匹配是否可以加入购物车操作
if(realstore_goods_data.buy_button.data.length > 0) {
var buy_button = realstore_goods_data.buy_button.data;
var arr = ['cart', 'buy', 'plugins-batchbuy-button-cart', 'plugins-batchbuy-button-buy'];
for(var i in buy_button) {
if(arr.indexOf(buy_button[i]['type']) != -1) {
cart_status = true;
cart_type = buy_button[i]['type'];
cart_text = this.$t('realstore-cart.realstore-cart.b27ln3');
break;
}
}
}
}
}
this.setData({
realstore_goods_data: realstore_goods_data,
realstore_goods_data_cart_status: cart_status,
realstore_goods_data_cart_type: cart_type,
realstore_goods_data_cart_value: cart_value,
realstore_goods_data_cart_loading: false,
realstore_goods_data_cart_text: cart_text,
});
// 是否需要弹出下单类型选择
// 打开开关,并且店铺必须存在下单类型
var cache_index = this.get_cache_buy_use_type_active_index();
if((this.base || null) != null && parseInt(this.base.is_tips_user_choice_buy_use_type || 0) == 1 && (cache_index === null || cache_index === '') && (this.info.buy_use_type_list || null) != null && this.info.buy_use_type_list.length > 1 && (this.info.status_info || null) != null && this.info.status_info.status == 1) {
// 门店、商品是否开启了弹窗提示
var key = 'is_tips_user_choice_buy_use_type_'+this.params.source+'_detail';
if(parseInt(this.base[key] || 0) == 1) {
// 配置的间隔时间(秒)
var interval_time = parseInt(this.base.tips_user_choice_buy_use_type_interval_time || 0);
// 缓存的间隔时间(秒)
var cache_time = parseInt(uni.getStorageSync(this.cache_buy_use_type_interval_time_key+this.info.id) || 0);
// 当前时间(秒)
var current_time = Date.parse(new Date()) / 1000;
// 配置时间为空 或 缓存时间为空 或 当前时间大于缓存+配置时间
if (interval_time == 0 || (cache_time == 0 || current_time > cache_time+interval_time)) {
// 倒序处理展示、系统默认在店在最前面,目的是让在店在最后面展示
var temp = [];
this.info.buy_use_type_list.forEach((v, i) => {
v['key'] = i;
temp.unshift(v);
});
this.setData({
buy_use_type_choice_list: temp,
buy_use_type_choice_status: true
});
}
}
}
// 获取购物车数据
this.get_cart_data();
}
}
// 设置下单类型
this.setData({
buy_use_type_active_index: type_data.active_index,
});
}
}
},
// 获取购物车数据
get_cart_data() {
uni.request({
url: app.globalData.get_request_url('cartdata', 'detail', 'realstore'),
method: 'POST',
data: this.request_params_merge(
{
id: this.info.id || 0,
}, 'cart'),
dataType: 'json',
success: (res) => {
if(res.data.code == 0) {
this.setData({
cart: res.data.data,
});
// 首次判断是否需要开启购物车
if(this.is_first == 1 && (this.params.is_show_cart || 0) == 1) {
this.cart_event(true);
}
// 非首次状态记录
this.setData({
is_first: 0,
});
// 购物车获取成功回调
this.$emit('CartDataBackEvent', this.cart);
} else {
app.globalData.showToast(this.$t('realstore-cart.realstore-cart.47h2a0'));
}
// 结算按钮处理
this.settlement_btn_handle();
},
fail: () => {
// 结算按钮处理
this.settlement_btn_handle();
app.globalData.showToast(this.$t('common.internet_error_tips'));
},
});
},
// 结算按钮处理
settlement_btn_handle() {
// 结算按钮状态处理
var btn_status = true;
var btn_text = this.$t('goods-category.goods-category.44f1ww');
if(this.info.status_info.status != 1) {
btn_status = false;
btn_text = this.info.status_info.msg;
} else {
// 购物车是否存在商品
if((this.cart || null) == null || parseInt(this.cart.buy_number || 0) == 0) {
btn_status = false;
} else {
// 起步价
var msg = this.starting_price_handle();
if(msg !== null) {
btn_status = false;
btn_text = msg;
}
}
}
this.setData({
settlement_btn_status: btn_status,
settlement_btn_loading: false,
settlement_btn_text: btn_text,
});
},
// 起步价处理
starting_price_handle() {
var starting_price = parseFloat(this.info.starting_price) || 0;
if(starting_price > 0 && (this.cart || null) != null) {
if(parseFloat(this.cart.total_price) < starting_price) {
// 是否限制类型
var limit_type = this.info.starting_price_limit_type_list || [];
if(limit_type.length > 0) {
var type_data = this.buy_use_type_data();
if(limit_type.indexOf(type_data.data_index) != -1 || limit_type.indexOf(type_data.data_index.toString()) != -1) {
return temp['name'] + this.$t('realstore-cart.realstore-cart.miv944')+ this.propCurrencySymbol + starting_price;
}
} else {
return this.$t('realstore-cart.realstore-cart.miv944') + this.propCurrencySymbol + starting_price;
}
}
}
return null;
},
// 购物车状态切换
cart_switch_event(e) {
this.setData({
cart_status: !this.cart_status,
});
},
// 购物车状态设置
cart_event(status) {
this.setData({
cart_status: status,
});
},
// 加入购物车
cart_submit_event(e) {
// 是否展示模式、则拨打电话
if(this.realstore_goods_data_cart_type == 'show' && (this.realstore_goods_data_cart_value || null) != null) {
app.globalData.call_tel(this.realstore_goods_data_cart_value);
return false;
}
// 门店商品是否正常
if((this.realstore_goods_data || null) == null) {
app.globalData.showToast(this.$t('realstore-cart.realstore-cart.20epzm'));
return false;
}
this.$refs.goods_buy.init(this.realstore_goods_data, {...this.params, ...{buy_event_type: 'cart'}});
},
// 购物车结算
buy_submit_event(e) {
if(!app.globalData.is_single_page_check()) {
return false;
}
// 门店状态
if(!this.is_status_check()) {
return false;
}
// 获取购物车数据
var ids = [];
if((this.cart || null) != null) {
var temp_data = this.cart.data || [];
for (var i in temp_data) {
ids.push(temp_data[i]['id']);
}
}
if(ids.length <= 0) {
app.globalData.showToast(this.$t('realstore-cart.realstore-cart.2dc65q'));
return false;
}
// 起步价
var msg = this.starting_price_handle();
if(msg !== null) {
app.globalData.showToast(this.$t('realstore-cart.realstore-cart.2dc65q'));
return false;
}
// 进入订单确认页面
var data = this.request_params_merge(
{
buy_type: 'cart',
ids: ids.join(','),
}, 'buy');
app.globalData.url_open('/pages/buy/buy?data=' + encodeURIComponent(base64.encode(JSON.stringify(data))));
},
// 门店状态判断
is_status_check() {
if((this.info || null) == null) {
app.globalData.showToast(this.$t('realstore-cart.realstore-cart.8tzr7l'));
return false;
} else {
if(this.info.status_info.status != 1) {
app.globalData.showToast(this.info.status_info.msg);
return false;
}
}
return true;
},
// 批量删除操作
cart_all_delete_event(e) {
var self = this;
uni.showModal({
title: self.$t('common.warm_tips'),
content: self.$t('goods-category.goods-category.o6i1w2'),
confirmText: self.$t('common.confirm'),
cancelText: self.$t('common.not_yet'),
success: (result) => {
if(result.confirm) {
self.setData({
temp_opt_data: null,
});
var ids = [];
var temp_data = self.cart.data;
for (var i in temp_data) {
ids.push(temp_data[i]['id']);
}
self.cart_delete(ids.join(','));
self.cart_event(false);
}
},
});
},
// 购物车数量操作
cart_stock_event(e) {
if(!app.globalData.is_single_page_check()) {
return false;
}
var user = app.globalData.get_user_info(this, 'cart_stock_event', e);
if(user != false) {
var index = e.currentTarget.dataset.index;
var type = parseInt(e.currentTarget.dataset.type) || 0;
var temp_data = this.cart.data;
var temp_goods = temp_data[index];
// 数据操作处理
var opt_number = this.stock_handle(type, temp_goods, 'stock');
if(opt_number === false) {
return false;
}
// 数据临时记录
this.setData({
temp_opt_data: null,
});
// 操作类型
if(opt_number == 0) {
this.cart_delete(temp_goods['id'], temp_goods.goods_id);
} else {
var number = type == 0 ? parseInt(temp_goods['stock']) - opt_number : opt_number + parseInt(temp_goods['stock']);
this.cart_update(temp_goods['id'], temp_goods['goods_id'], number);
}
}
},
// 数量操作处理
stock_handle(type, goods, stock_field) {
// 加减处理
var stock = parseInt(goods[stock_field]) || 0;
if(type == 0) {
stock -= 1;
} else {
stock += 1;
}
if(stock < 0) {
stock = 0;
}
// 数据校验
var buy_min_number = parseInt(goods['buy_min_number']) || 1;
var buy_max_number = parseInt(goods['buy_max_number']) || 0;
var spec_buy_min_number = parseInt(goods['spec_buy_min_number']) || 0;
var spec_buy_max_number = parseInt(goods['spec_buy_max_number']) || 0;
var inventory = parseInt(goods['inventory']);
var inventory_unit = goods['inventory_unit'];
// 最小起购数量
var min = spec_buy_min_number > 0 ? spec_buy_min_number : buy_min_number;
if(min > 0) {
if(type == 0) {
if(stock < min) {
stock = 0;
}
} else {
if(stock < min) {
stock = min;
}
}
}
// 最大购买数量
var max = spec_buy_max_number > 0 ? spec_buy_max_number : buy_max_number;
if(max > 0 && stock > max) {
stock = max;
app.globalData.showToast(this.$t('goods-category.goods-category.z1eh3v') + max + inventory_unit);
return false;
}
// 数量是否改变
if(goods[stock_field] == stock) {
app.globalData.showToast(this.$t('goods-category.goods-category.1ox23z'));
return false;
}
// 操作数量
var opt_number = 1;
if(type == 0) {
if(stock <= 0) {
opt_number = 0;
}
} else {
if(stock > goods['buy_number']) {
opt_number = stock - goods['buy_number'];
}
}
return opt_number;
},
// 购物车添加
cart_save(goods_id, stock, spec = '') {
uni.request({
url: app.globalData.get_request_url('save', 'cart'),
method: 'POST',
data: {
goods_id: goods_id,
stock: stock,
spec: spec,
},
dataType: 'json',
success: (res) => {
if(res.data.code == 0) {
// 购物车操作成功回调
this.cart_opt_success_handle({
type: 'save',
goods_id: goods_id,
stock: stock,
});
} else {
if(app.globalData.is_login_check(res.data)) {
app.globalData.showToast(res.data.msg);
}
}
},
fail: () => {
app.globalData.showToast(this.$t('common.internet_error_tips'));
},
});
},
// 购物车更新
cart_update(cart_id, goods_id, stock) {
uni.request({
url: app.globalData.get_request_url('stock', 'cart'),
method: 'POST',
data: {
id: cart_id,
goods_id: goods_id,
stock: stock,
},
dataType: 'json',
success: (res) => {
if(res.data.code == 0) {
// 购物车操作成功回调
this.cart_opt_success_handle({
type: 'update',
cart_id: cart_id,
goods_id: goods_id,
stock: stock,
});
} else {
if(app.globalData.is_login_check(res.data)) {
app.globalData.showToast(res.data.msg);
} else {
app.globalData.showToast(this.$t('common.sub_error_retry_tips'));
}
}
},
fail: () => {
app.globalData.showToast(this.$t('common.internet_error_tips'));
},
});
},
// 购物车删除
cart_delete(cart_id, goods_id = null) {
uni.request({
url: app.globalData.get_request_url('delete', 'cart'),
method: 'POST',
data: {
id: cart_id,
},
dataType: 'json',
success: (res) => {
if(res.data.code == 0) {
// 购物车操作成功回调
this.cart_opt_success_handle({
type: (goods_id === null) ? 'all-delete' : 'delete',
cart_id: cart_id,
goods_id: goods_id,
stock: 0,
});
} else {
if(app.globalData.is_login_check(res.data)) {
app.globalData.showToast(res.data.msg);
} else {
app.globalData.showToast(this.$t('common.sub_error_retry_tips'));
}
}
},
fail: () => {
app.globalData.showToast(this.$t('common.internet_error_tips'));
},
});
},
// 扫码事件
search_icon_event(e) {
this.buy_use_type_choice_event(e);
this.search_icon_handle(e);
},
// 搜索icon扫码事件、扫码商品id实现加入购物车
search_icon_handle(e) {
var user = app.globalData.get_user_info(this, 'search_icon_handle', e);
if (user != false) {
// 门店状态
if (!this.is_status_check()) {
return false;
}
// 调用扫码
var self = this;
uni.scanCode({
success: function (res) {
uni.showLoading({
title: self.$t('common.processing_in_text'),
mask: true,
});
uni.request({
url: app.globalData.get_request_url('scan', 'detail', 'realstore'),
method: 'POST',
data: self.request_params_merge(
{
value: res.result,
}, 'buy'),
dataType: 'json',
success: (res) => {
uni.hideLoading();
if (res.data.code == 0) {
if (res.data.data.is_error == 1) {
app.globalData.showToast(res.data.data.is_error_msg);
} else {
// 加入购物车
self.cart_save(res.data.data.goods_id, 1, res.data.data.spec);
}
} else {
if (app.globalData.is_login_check(res.data)) {
app.globalData.showToast(res.data.msg);
} else {
app.globalData.showToast(self.$t('common.sub_error_retry_tips'));
}
}
},
fail: () => {
uni.hideLoading();
app.globalData.showToast(self.$t('common.internet_error_tips'));
},
});
},
});
}
},
// 商品操作处理,添加,减少,增加数量自动处理
goods_opt_handle(type, goods, spec, stock_field, pos = null) {
var opt_number = this.stock_handle(type, goods, stock_field);
if(opt_number === false) {
return false;
}
// 临时存在操作数据
this.setData({
temp_opt_data: {
pos: pos,
goods: goods,
type: type,
},
});
// 为0或减操作则查询
var cart_item = this.goods_opt_cart_data(type, goods, spec);
// 操作类型
if(opt_number == 0) {
if(cart_item == null) {
app.globalData.showToast(this.$t('goods-category.goods-category.x46kbv'));
return false;
}
this.cart_delete(cart_item.id, cart_item.goods_id);
} else if(cart_item == null) {
this.cart_save(goods['id'], opt_number, spec);
} else {
var number = type == 0 ? parseInt(cart_item['stock']) - opt_number : opt_number + parseInt(cart_item['stock']);
this.cart_update(cart_item.id, goods['id'], number);
}
},
// 商品操作获取购物车存在的数据
// type 0减少, 1增加
// goods 商品数据
// spec 操作的商品规格
goods_opt_cart_data(type, goods, spec = '') {
var cart_item = null;
if(type == 0 || (type == 1 && goods['buy_number'] > 0)) {
var cart_data = this.cart.data;
var params_spec = (spec || null) == null || typeof spec != 'object' ? '' : JSON.stringify(spec);
for (var i in cart_data) {
if(goods['id'] == cart_data[i]['goods_id']) {
var cart_spec = (cart_data[i]['spec'] || null) == null || typeof cart_data[i]['spec'] != 'object' ? '' : JSON.stringify(cart_data[i]['spec']);
if(type == 0 || (type == 1 && cart_spec == params_spec)) {
cart_item = cart_data[i];
}
break;
}
}
}
return cart_item;
},
// 购物车操作成功处理
cart_opt_success_handle(params) {
// 获取购物车数据
this.get_cart_data();
// 调用父级
this.$emit('CartSuccessEvent', params);
// 执行购物车抛物线
this.cart_para_curve_handle();
},
// 购物车抛物线动画
cart_para_curve_handle() {
if((this.temp_opt_data || null) != null && (this.temp_opt_data.pos || null) != null && (this.temp_opt_data.type || 0) == 1) {
if((this.$refs.cart_para_curve || null) != null) {
this.$refs.cart_para_curve.init(null, this.temp_opt_data.pos, this.temp_opt_data.goods.images, 0);
}
}
},
// 使用类型事件
buy_use_type_event() {
var self = this;
uni.showActionSheet({
itemList: this.info.buy_use_type_list.map(function (v) {
return v.name;
}),
success: function (res) {
self.buy_use_type_confirm_handle(self, res.tapIndex);
},
});
},
// 下单类型选择事件
buy_use_type_choice_event(e) {
this.buy_use_type_confirm_handle(this, e.currentTarget.dataset.index);
this.setData({
buy_use_type_choice_status: false,
});
app.globalData.showToast(this.$t('recommend-form.recommend-form.145ci4'), 'success');
},
// 下单类型确认处理
buy_use_type_confirm_handle(self, index) {
self.setData({
buy_use_type_active_index: index,
settlement_btn_loading: true,
realstore_goods_data_cart_loading: true,
});
uni.setStorageSync(self.cache_buy_use_type_active_index_key+self.info.id, index);
// 获取购物车数据、系统购物车来源则不执行
if(this.source != 'system-cart') {
self.get_cart_data();
}
// 下单类型切换回调
var type_data = this.buy_use_type_data();
self.$emit('BuyTypeSwitchEvent', {buy_use_type_active_index: type_data.active_index, buy_use_type_data_index: type_data.data_index, realstore_id: this.info.id});
},
// 下单类型弹窗关闭
buy_use_type_choice_close_event(e) {
this.setData({
buy_use_type_choice_status: false,
});
uni.setStorageSync(this.cache_buy_use_type_interval_time_key+this.info.id, Date.parse(new Date()) / 1000);
},
// 获取使用类型数据索引、默认在店0
buy_use_type_data() {
// 不在店铺设置的类型列表则默认0
var data = {
active_index: 0,
data_index: 0,
}
// 门店信息
if((this.info || null) != null) {
// 用户未设置类型则使用默认的
var active_index = this.get_cache_buy_use_type_active_index();
if(active_index !== null && active_index !== '') {
var temp = this.info.buy_use_type_list[active_index] || null;
if(temp != null) {
data['active_index'] = active_index;
data['data_index'] = temp.index;
}
} else {
// 是否默认类型
if(this.info.default_buy_use_type != undefined && this.info.default_buy_use_type != -1) {
// 不在店铺设置的类型列表则默认0
for (var i in this.info.buy_use_type_list) {
if(this.info.buy_use_type_list[i]['index'] == this.info.default_buy_use_type) {
data['active_index'] = i;
data['data_index'] = this.info.buy_use_type_list[i]['index'];
break;
}
}
}
}
}
return data;
},
// 获取下单类型缓存数据
get_cache_buy_use_type_active_index() {
return uni.getStorageSync(this.cache_buy_use_type_active_index_key+this.info.id);
},
// 请求参数处理
// 默认增加使用类型参数
// 下单 buy / 初始化 init / 获取数据 data / 获取购物车 cart
request_params_merge(data, type = 'init') {
// 用户使用类型
if((this.info || null) != null && (this.info.buy_use_type_list || null) != null && this.info.buy_use_type_list.length > 0) {
var type_data = this.buy_use_type_data();
data['buy_use_type_data_index'] = type_data.data_index;
}
// 初始化
if(type == 'init' || type == 'buy') {
// 桌码
if((this.params.tablecode_id || null) != null) {
data['tablecode_id'] = this.params.tablecode_id;
}
}
// 初始化、获取数据
if(type == 'init' || type == 'data' || type == 'cart') {
// 用户选择的位置
var lng = 0;
var lat = 0;
var user_location = app.globalData.choice_user_location_init();
if((user_location || null) != null) {
lng = user_location.lng || 0;
lat = user_location.lat || 0;
}
data['lng'] = lng;
data['lat'] = lat;
}
// 提交订单
if(type == 'buy') {
// 门店id
data['realstore_id'] = this.info.id;
}
return data;
},
// 加入购物车成功回调
goods_cart_back_event(e) {
this.get_cart_data();
},
// 商品事件
goods_event(e) {
// 是否可以打开商品页面
if(app.globalData.data.is_realstore_forbid_to_goods_detail != 1) {
// 商品数据缓存处理
var goods = this.cart.data[e.currentTarget.dataset.index];
goods['id'] = goods.goods_id;
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);
}
}
}
};
</script>
<style>
.plugins-realstore-cart-mask,
.plugins-realstore-buy-type-mask {
left: 0;
top: 0;
background: rgb(0, 0, 0, 0.6);
z-index: 5;
}
.plugins-realstore-cart-content,
.plugins-realstore-buy-type-choice {
left: 0;
bottom: 0;
z-index: 6;
}
/**
* 购物车列表
*/
.plugins-realstore-cart-content .cart-list {
max-height: 60vh;
}
.plugins-realstore-cart-content .cart-list .goods-img {
width: 120rpx;
height: 120rpx !important;
}
.plugins-realstore-cart-content .cart-list .goods-base {
width: calc(100% - 140rpx);
}
.plugins-realstore-cart-content .cart-list .goods-base-content {
min-height: 60rpx;
}
.plugins-realstore-cart-content .cart-list .goods-base .buy-number {
min-width: 32rpx;
}
/**
* 底部导航
*/
.plugins-realstore-cart-botton-nav {
width: calc(100% - 40rpx);
left: auto;
bottom: 20rpx;
z-index: 2;
margin-left: 20rpx;
box-shadow: 0rpx 4rpx 8rpx 0px rgba(0, 0, 0, 0.16);
}
.plugins-realstore-cart-botton-nav .cart-icon-total .badge-icon {
top: -20rpx;
right: -2rpx;
}
.plugins-realstore-cart-botton-nav .btn {
min-width: 160rpx;
line-height: 70rpx;
height: 70rpx;
padding: 0 38rpx;
border: 0;
/* #ifdef MP-QQ */
padding-top: 0;
padding-bottom: 0;
/* #endif */
}
/**
* 弹窗下单类型选择
*/
.plugins-realstore-buy-type-mask {
z-index: 10;
}
.plugins-realstore-buy-type-choice {
z-index: 11;
width: calc(100% - 240rpx);
left: 50%;
top: 50%;
height: -webkit-max-content;
height: max-content;
transform: translate(-50%, -50%);
}
.plugins-realstore-buy-type-choice .item {
height: 112rpx;
line-height: 112rpx;
}
.plugins-realstore-buy-type-choice .item .scan-item,
.plugins-realstore-buy-type-choice .item-content-0 {
background: #E8FFF2;
}
.plugins-realstore-buy-type-choice .item-content-1 {
background: #FFF9DC;
}
.plugins-realstore-buy-type-choice .item-content-2 {
background: #FFE8DC;
}
.plugins-realstore-buy-type-choice .item-content-3 {
background: #EDF9FF;
}
.plugins-realstore-buy-type-choice .item-content .left-icon {
width: 68rpx;
height: 68rpx;
}
.plugins-realstore-buy-type-choice .item:not(:last-child) {
margin-bottom: 32rpx;
}
/* #ifndef H5 */
.plugins-realstore-buy-type-choice .item-content-0 {
width: calc(100% - 190rpx);
}
.plugins-realstore-buy-type-choice .item .scan-item {
width: 120rpx;
}
/* #endif */
</style>