shop-applet/pages/goods_details/discountsGoods.vue

596 lines
18 KiB
Vue
Raw Permalink 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 :style="viewColor">
<view class="container" :class="popup.show==true?'on':''">
<view class="header">
<text class="title">优惠套餐({{discountsTotal}})</text>
<text class="iconfont icon-guanbi5" @tap.stop="closePopup"></text>
</view>
<view class="main_count">
<scroll-view scroll-y="true">
<view v-for="(item, index) in discountsData" :key="index" class="list">
<view class="acea-row list_title">
<view class="combo_list_name">
<image class="title_icon" src="/static/images/combo_title.png"></image>
<view class="name line1">套餐{{index+1}}: {{item.title}}</view>
</view>
<view class="combo_list_money">¥{{item.total_price}}</view>
</view>
<block v-for="(itemn, indexn) in item.discountsProduct" :key="indexn">
<view class="pro_list">
<view v-if="item.type == 1 && indexn!=0" class="checkbox" @tap.stop="checkedChange(item,itemn)">
<text v-if="itemn.checked" class="iconfont icon-xuanzhong1"></text>
<text v-else class="iconfont icon-weixuanzhong"></text>
</view>
<view v-if="item.type == 1 && indexn ==0" class="checkbox">
<text class="iconfont icon-xuanzhong3"></text>
</view>
<view class="picture">
<image :src="itemn.image" class="image"></image>
<text v-if="itemn.product_id == id" class="current_pro">当前商品</text>
</view>
<view class="info">
<view class="name line2">{{itemn.store_name}}</view>
<view class="list_attr" @click="selecAttr(index,indexn)">
<text class="line1">
{{itemn.attr || '默认'}}
</text>
<text class="iconfont icon-xiangxia"></text>
</view>
<view class="price">
<text>
¥{{itemn.product.price}}
</text>
<text class="ot_price">
¥{{itemn.product.ot_price}}
</text>
</view>
</view>
</view>
</block>
<view class="save_money">省: ¥ {{item.checked_save_money}}</view>
<view v-if="item.is_limit == 0 || (item.is_limit == 1 && item.limit_num > 0)" class="btn" @click="subData(index)">
购买此套餐{{item.checked_num}}件商品
</view>
<view v-else-if="item.is_limit == 1 && item.limit_num <= 0" class="btn disabled">
套餐已售罄
</view>
</view>
</scroll-view>
</view>
</view>
<view class='mask' catchtouchmove="true" :hidden='popup.show==false' @tap="closePopup"></view>
<productWindow :attr="attr" :isShow="1" :title="selectTitle" :iSplus="1" @myevent="onMyEvent"
@ChangeAttr="ChangeAttr" @attrVal="attrVal" @iptCartNum="iptCartNum" id="product-window" @goCat="goOrder()">
</productWindow>
</view>
</template>
<script>
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import { goShopDetail } from '@/libs/order.js'
import { discountsCartAdd, getDiscountsLst } from '@/api/store.js';
import productWindow from './productWindow.vue'
import { mapGetters } from "vuex";
export default {
components: {
productWindow
},
props:{
uid: {
type: Number,
},
id: {
type: String|| Number,
}
},
computed: mapGetters(['viewColor']),
data() {
return {
discountsData: [],
discountsTotal: 0,
popup: {
show: false
},
attr: {
cartAttr: false,
productAttr: [],
productSelect: {},
},
productValue: [], //系统属性
isOpen: false, //是否打开属性组件
attrValue: [],
attrTxt: "",
selectAttr: [],
selectValue: [], //选中的ID
proNum: 0,
images: [],
selectCountPrice: [],
selectTitle: "",
seleNum: 0,
isFirst: true,
seleIndexn: -1,
seleIndex: -1,
unique: "0"
};
},
mounted(){
this.$nextTick(function() {
})
},
methods: {
// 点击关闭按钮
closePopup() {
this.$set(this.popup, 'show', false);
},
showPopup(id) {
this.id = id
this.$set(this.popup, 'show', true);
this.getList();
},
initAttr(){
this.discountsData.map((v, i) => {
this.getData(i)
})
},
getData(index){
this.discountsData[index].discountsProduct.forEach((item, i) => {
this.attr.productAttr = item.product.attr;
this.productValue = item.product.sku
this.DefaultSelect(index,i)
this.getPrice(this.discountsData[index])
})
},
/*获取套餐列表数据*/
getList(){
getDiscountsLst({product_id: this.id}).then(res => {
res.data.list.forEach((item, index) => {
item.total_price = 0;
item.checked_num = item.count;
item.checked_save_money = 0;
item.discountsProduct.forEach((v, i) => {
this.$set(v,'checked',true)
this.$set(v,'attr','')
this.$set(v,'unique','')
item.total_price += parseFloat(v.product.price)
item.checked_save_money += (parseFloat(v.product.ot_price) - parseFloat(v.product.price)).toFixed(2)
})
})
this.discountsTotal = res.data.count;
this.discountsData = res.data.list;
this.initAttr()
}).catch(err => {
});
},
/**
* 购物车手动填写
*
*/
iptCartNum: function(e) {
this.$set(this.attr.productSelect, 'cart_num', e);
},
/**
* 打开属性插件
*/
selecAttr: function(index, n) {
this.proNum = index
this.seleNum = n
this.selectTitle = this.discountsData[index].discountsProduct[n].product.store_name
this.attr.productAttr = this.discountsData[index].discountsProduct[n].product.attr
this.productValue = this.discountsData[index].discountsProduct[n].product.sku
if(this.isFirst || (!this.isFirst &&
(this.seleIndex != index && this.seleIndexn != n || this.seleIndex == index && this.seleIndexn != n || this.seleIndex != index && this.seleIndexn == n) || this.unique != this.attr.productSelect.unique)){
this.DefaultSelect(index,n)
}
this.seleIndex = index;this.seleIndexn = n
this.isFirst = false
this.$nextTick((e) => {
this.$set(this.attr, 'cartAttr', true);
this.$set(this, 'isOpen', true);
})
},
attrVal(val) {
this.$set(this.attr.productAttr[val.indexw], 'index', this.attr.productAttr[val.indexw]
.attr_values[val.indexn]);
},
/**
* 属性变动赋值
*
*/
ChangeAttr: function(res) {
let productSelect = this.productValue[res];
if (productSelect && productSelect.stock > 0) {
this.$set(this.attr.productSelect, 'image', productSelect.image);
this.$set(this.attr.productSelect, 'price', productSelect.price);
this.$set(this.attr.productSelect, 'stock', productSelect.stock);
this.$set(this.attr.productSelect, 'product_stock', productSelect.stock);
this.$set(this.attr.productSelect, 'unique', productSelect.unique);
this.$set(this, 'unique', productSelect.unique);
this.$set(this.attr.productSelect, 'cart_num', 1);
this.$set(this.discountsData[this.proNum].discountsProduct[this.seleNum], 'attr', res || "");
this.$set(this.discountsData[this.proNum].discountsProduct[this.seleNum]['product'], 'price', productSelect.price || 0);
this.$set(this.discountsData[this.proNum].discountsProduct[this.seleNum]['product'], 'ot_price', productSelect.ot_price || 0);
this.$set(this.discountsData[this.proNum].discountsProduct[this.seleNum], 'unique', productSelect.unique || "");
} else {
this.$set(this.attr.productSelect,"store_name",this.discountsData[0].discountsProduct[0].product.store_name
);
this.$set(this.attr.productSelect, "image", this.discountsData[0].discountsProduct[0].product.image);
this.$set(this.attr.productSelect, "price", this.discountsData[0].discountsProduct[0].product.price);
this.$set(this.attr.productSelect, "ot_price", this.discountsData[0].discountsProduct[0].product.ot_price);
this.$set(this.attr.productSelect, "product_stock", 0);
this.$set(this.attr.productSelect,"unique", "");
return;
}
this.getPrice(this.discountsData[this.proNum])
},
/**
* 默认选中属性
*
*/
DefaultSelect: function(index,indexn) {
let productAttr = this.attr.productAttr;
let value = [];
for (var key in this.productValue) {
if (this.productValue[key].stock > 0) {
value = this.attr.productAttr.length ? key.split(',') : [];
break;
}
}
for (let i = 0; i < productAttr.length; i++) {
this.$set(productAttr[i], 'index', value[i]);
}
//sort();排序函数:数字-英文-汉字;
let productSelect = this.productValue[value.join(',')];
if (productSelect && productAttr.length) {
this.$set(this.attr.productSelect, 'store_name', productSelect.store_name);
this.$set(this.attr.productSelect, 'image', productSelect.image);
this.$set(this.attr.productSelect, 'price', productSelect.price);
this.$set(this.attr.productSelect, 'ot_price', productSelect.ot_price);
this.$set(this.attr.productSelect, 'stock', productSelect.stock);
this.$set(this.attr.productSelect, 'product_stock', productSelect.stock);
this.$set(this.attr.productSelect, 'unique', productSelect.unique);
this.$set(this, 'unique', productSelect.unique);
this.$set(this.attr.productSelect, 'cart_num', 1);
this.$set(this.attr.productSelect, 'vip_price', productSelect.vip_price);
this.$set(this.discountsData[index].discountsProduct[indexn], 'unique', productSelect.unique || "");
this.$set(this.discountsData[index].discountsProduct[indexn], 'attr', value.join(','));
this.$set(this.discountsData[index].discountsProduct[indexn]['product'], 'price', productSelect.price);
this.$set(this.discountsData[index].discountsProduct[indexn]['product'], 'ot_price', productSelect.ot_price);
this.$set(this.discountsData[index].discountsProduct[indexn]['product'], 'ot_price', productSelect.ot_price);
} else if (productSelect && !productAttr.length) {
this.$set(this.attr.productSelect, 'store_name', productSelect.store_name);
this.$set(this.attr.productSelect, 'image', productSelect.image);
this.$set(this.attr.productSelect, 'price', productSelect.price);
this.$set(this.attr.productSelect, 'ot_price', productSelect.ot_price);
this.$set(this.attr.productSelect, 'stock', productSelect.stock);
this.$set(this.attr.productSelect, 'product_stock', productSelect.stock);
this.$set(this.attr.productSelect, 'unique', productSelect.unique || '');
this.$set(this, 'unique', productSelect.unique);
this.$set(this.attr.productSelect, 'cart_num', 1);
this.$set(this.attr.productSelect, 'vip_price', productSelect.vip_price);
this.$set(this.discountsData[index].discountsProduct[indexn]['product'], 'price', productSelect.price);
this.$set(this.discountsData[index].discountsProduct[indexn]['product'], 'ot_price', productSelect.ot_price);
this.$set(this.discountsData[index].discountsProduct[indexn], 'attr', '')
this.$set(this.discountsData[index].discountsProduct[indexn], 'unique', productSelect.unique || "");
}else if (!productSelect && !productAttr.length || !productSelect && productAttr.length) {
this.$set(this.attr.productSelect,"store_name",this.discountsData[0].discountsProduct[0].product.store_name
);
this.$set(this.attr.productSelect, "image", this.discountsData[0].discountsProduct[0].product.image);
this.$set(this.attr.productSelect, "price", this.discountsData[0].discountsProduct[0].product.price);
this.$set(this.attr.productSelect, "ot_price", this.discountsData[0].discountsProduct[0].product.ot_price);
this.$set(this.attr.productSelect, "product_stock", 0);
this.$set(this.attr.productSelect,"unique", "");
this.$set(this, 'unique', "");
}
},
onMyEvent: function() {
this.$set(this.attr, 'cartAttr', false);
this.$set(this, 'isOpen', false);
},
checkedChange(item,itemn) {
itemn.checked = !itemn.checked
if(itemn.checked){
item.checked_num++
}else{
item.checked_num--;
}
this.getPrice(item)
},
/*计算此套餐总价及节省价*/
getPrice(item){
let checked_save_money = 0;
let total_price = 0;
item.discountsProduct.forEach((v, i) => {
if(v.checked){
checked_save_money += (parseFloat(v.product.ot_price) - parseFloat(v.product.price));
total_price += parseFloat(v.product.price);
}
})
this.$set(item, 'checked_save_money', checked_save_money);
this.$set(item, 'total_price', total_price);
},
subData(index) {
let data = []
let reqData = {
is_new: 1,
discount_id: this.discountsData[index].discount_id,
data: [],
}
if (this.discountsData[index].type == 0) {
this.selectValue = []
this.discountsData[index].discountsProduct.map(v => {
this.selectValue.push(v.discount_product_id + '')
})
} else {
if (this.discountsData[index].checked_num < 2) {
return this.$util.Tips({
title: '请先选择套餐商品'
});
}
this.selectValue = []
this.discountsData[index].discountsProduct.map(v => {
if(v.checked){
this.selectValue.push(v.discount_product_id + '')
}
})
}
for (let i = 0; i < this.discountsData[index].discountsProduct.length; i++) {
for (let j = 0; j < this.selectValue.length; j++) {
if (this.discountsData[index].discountsProduct[i].discount_product_id == this.selectValue[j]) {
reqData.data.push({
cart_num: 1,
product_attr_unique: this.discountsData[index].discountsProduct[i].unique,
product_id: this.discountsData[index].discountsProduct[i].product_id
})
}
}
}
discountsCartAdd(reqData)
.then(function(res) {
uni.navigateTo({
url: '/pages/users/order_confirm/index?cartId=' + res
.data
.cart_id
.join(',')
});
})
.catch(err => {
this.selectValue = []
return this.$util.Tips({
title: err
});
});
},
goOrder() {
this.$set(this, 'isOpen', false);
this.$set(this.attr, 'cartAttr', false);
}
}
}
</script>
<style lang="scss" scoped>
.container{
position: fixed;
bottom: 0;
width: 100%;
left: 0;
background-color: #f5f5f5;
z-index: 300;
border-radius: 16rpx 16rpx 0 0;
transform: translate3d(0, 100%, 0);
transition: all .3s cubic-bezier(.25, .5, .5, .9);
max-height: 1000rpx;
&.on {
transform: translate3d(0, 0, 0);
}
.header{
position: relative;
padding: 36rpx 30rpx;
text-align: center;
.title{
color: #282828;
font-size: 32rpx;
font-weight: bold;
}
.iconfont{
color: #8A8A8A;
font-size: 28rpx;
position: absolute;
top: 0;
right: 0;
}
.icon-guanbi5 {
right: 20rpx;
color: #8a8a8a;
font-size: 30rpx;
line-height: 30rpx;
top: 40rpx;
background-color: transparent;
font-weight: normal;
}
}
scroll-view{
max-height: 1000rpx;
}
.main_count{
padding: 0 20rpx 30rpx;
max-height: 800rpx;
overflow-y: scroll;
.list{
margin-bottom: 20rpx;
background: #ffffff;
padding: 30rpx 20rpx;
.list_title{
color: #282828;
font-weight: bold;
display: flex;
align-items: center;
justify-content: space-between;
.combo_list_name{
font-size: 26rpx;
display: flex;
align-items: center;
.name{
max-width: 500rpx;
margin-left: 8rpx;
}
.title_icon,uni-image,image{
width: 26rpx;
height:26rpx;
}
}
.combo_list_money{
color: var(--view-priceColor);
font-size: 28rpx;
}
}
&:last-child{
margin-bottom: 0;
}
.btn{
width: 670rpx;
height: 60rpx;
line-height: 60rpx;
background-image: linear-gradient(270deg, var(--view-bntColor21) 0%, var(--view-bntColor22) 100%);
border-radius: 43px;
margin: 21rpx auto 0;
color: #ffffff;
text-align: center;
font-size: 24rpx;
&.disabled{
cursor: not-allowed;
background:#bbb
}
}
.save_money{
color: var(--view-priceColor);
font-size: 22rpx;
font-weight: bold;
text-align: center;
margin-top: 30rpx;
}
}
.pro_list{
display: flex;
align-items: center;
padding: 30rpx 0;
border-bottom: 1px solid #EEEEEE;
&:last-child{
border-bottom: none;
}
.checkbox{
margin-right: 30rpx;
}
.icon-xuanzhong1{
color: var(--view-theme);
}
.icon-xuanzhong1,.icon-weixuanzhong{
font-size: 40rpx;
}
.icon-xuanzhong3{
color: var(--view-theme);
font-size: 18rpx;
width: 40rpx;
height: 40rpx;
border-radius: 100%;
background: var(--view-minorColor);
line-height: 40rpx;
}
.picture,.image,uni-image{
width: 180rpx;
height: 180rpx;
border-radius: 12rpx;
position: relative;
}
.current_pro{
background: linear-gradient(270deg, #F67A38 0%, #F11B09 100%);
border-radius: 12rpx 0px 12rpx 12rpx;
color: #fff;
line-height: 34rpx;
height: 34rpx;
font-size: 16rpx;
text-align: center;
position: absolute;
bottom: 0;
left: 0;
width: 100rpx;
}
.info{
margin-left: 30rpx;
position: relative;
.name{
color: #282828;
font-size: 24rpx;
line-height: 36rpx;
}
.price{
color: #282828;
font-weight: bold;
margin-top: 15rpx;
font-size: 20rpx;
font-weight: bold;
text{
font-size: 26rpx;
}
.ot_price{
font-weight: normal;
font-size: 20rpx;
color: #999;
text-decoration: line-through;
margin-left: 10rpx;
}
}
}
}
}
.list_attr{
max-width:390rpx;
height: 34rpx;
line-height: 34rpx;
font-size: 20rpx;
color: #666666;
border-radius: 18rpx;
background-color: #f5f5f5;
padding: 0 60rpx 0 20rpx;
margin-top: 15rpx;
position: relative;
.iconfont{
font-size: 12rpx;
position: absolute;
right: 20rpx;
top: 4rpx;
}
text{
display: inline-block;
max-width: 300rpx;
}
}
}
/deep/uni-checkbox .uni-checkbox-input{
width: 38rpx;
height: 38rpx;
border-radius: 100%;
margin-right: 30rpx;
}
</style>