You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
628 lines
18 KiB
628 lines
18 KiB
<template>
|
|
<view class="group-list" v-if="selectComposeData && selectComposeData.length > 0">
|
|
<view class="group-warp">
|
|
<view class="title">
|
|
<label>
|
|
<image class="title-img" src="http://36.138.125.206:8081/ceres-local-file/static/images/combinationIcon.png" alt="组合销售" mode="widthFix"></image>
|
|
</label>
|
|
<view class="price-text">
|
|
组合价:¥{{composePrice}}
|
|
</view>
|
|
</view>
|
|
<view>
|
|
<scroll-view class="tabs-nav" scroll-x="true">
|
|
<view class="ul">
|
|
<view v-for="(item,index) in selectComposeData" :key="index" class="li" :class="tabIndex===index && 'on'" @click="tabChange(index)">
|
|
{{ item.composeName }}</view>
|
|
</view>
|
|
</scroll-view>
|
|
<view class="tabs-item" v-for="(item,index) in selectComposeData" :key="index" :class="tabIndex===index && 'on'">
|
|
<swiper class="swiper pro-box" :indicator-dots="false" :autoplay="true" :display-multiple-items="item.composeProductInfoList.length < 3?item.composeProductInfoList.length:3" @change="swiperChange" :disable-touch="item.composeProductInfoList.length <= 3">
|
|
<swiper-item class="pro-item-warp" v-for="(itemJ,indexJ) in item.composeProductInfoList" :key="indexJ" >
|
|
<view class="pro-item-inner">
|
|
<view class="pro-item">
|
|
<view class="pro-item-img">
|
|
<image class="img" :src="itemJ.productImage"></image>
|
|
</view>
|
|
<view class="pro-item-info">
|
|
<h3 class="name">
|
|
{{itemJ.productName}}
|
|
</h3>
|
|
<view class="sku" @click.stop="changeSkuItemValue(itemJ, indexJ)">
|
|
<view class="text">{{itemJ.skuItem.skuName}}</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</swiper-item>
|
|
</swiper>
|
|
<view class="swiper-dots" v-if='item.composeProductInfoList.length > 3'>
|
|
<text :class="{'dot-active':swiperCurrent === index,'dot': true}"
|
|
v-for="(dot, index) in item.composeProductInfoList.length - 2"
|
|
:key="index"
|
|
></text>
|
|
</view>
|
|
</view>
|
|
<view class="btn-buy" @click="doBuy">{{$t('common.buynow')}}</view>
|
|
</view>
|
|
</view>
|
|
<!-- 商品详情 -->
|
|
<u-popup v-model="goodsDetailShowFlag" mode="bottom" border-radius="14">
|
|
<view class="goosDetailshow-box">
|
|
<view class="detailImg-box flex-row-plus">
|
|
<image class="detailImg" :src="selectedSku.image"></image>
|
|
<view class="flex-column-plus mar-left-40">
|
|
<view class="font-color-C5AA7B">
|
|
<label class="fs24">¥</label>
|
|
<label class="fs36 mar-left-10"
|
|
v-text="getPrice(selectedSku)"></label>
|
|
</view>
|
|
<label class="fs24 font-color-999 mar-top-20">{{$t('common.stocknum', {number:selectedSku.stockNumber})}}</label>
|
|
<label class="fs24 mar-top-20">已选</label>
|
|
</view>
|
|
</view>
|
|
<view class="color-box flex-column-plus">
|
|
<view v-for="(attritem,index) in skuProData.names" :key="index" class="skuStyle">
|
|
<label class="fs24 font-color-999">{{attritem.skuName}}</label>
|
|
<view class="colorName-box">
|
|
<view class="pad-bot-30" v-for="(attrRes, resIndex) in attritem.values" :key="resIndex">
|
|
<view class="colorName"
|
|
:class="{'colorName-on' : getselectedAttrVal(attritem.nameCode) == attrRes.valueCode}"
|
|
@click="nameCodeValueCodeClick(attritem.nameCode, attrRes.valueCode, true)">
|
|
{{attrRes.skuValue}}
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<!-- <view class="goodsNum-box flex-row-plus flex-sp-between" :class="{'bottom-line' :supportHuabei}">-->
|
|
<!-- <label class="font-color-999 fs24">数量</label>-->
|
|
<!-- <view class="goodsNum">-->
|
|
<!-- <text class="subtract" @click="updateNumSub()">-</text>-->
|
|
<!-- <text class="goodsNumber" v-model="buyNum">{{buyNum}}</text>-->
|
|
<!-- <text class="add" @click.stop="-->
|
|
<!-- ()">+</text>-->
|
|
<!-- </view>-->
|
|
<!-- </view>-->
|
|
<view class="goosDetailbut-box flex-items-plus">
|
|
<!-- <button type="default" @click="goodsDateils(shopId,productId,skuId)" >查看详情</button>-->
|
|
<button type="default" class="submitBtn" @click="submitBtn()">确认</button>
|
|
</view>
|
|
</view>
|
|
</u-popup>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import NET from "../../utils/request";
|
|
import API from "../../config/api";
|
|
|
|
export default {
|
|
name: "combinedSales",
|
|
props: {
|
|
pid: {
|
|
type: String,
|
|
default: ''
|
|
},
|
|
productData: {
|
|
type: Object,
|
|
default: ()=>{}
|
|
}
|
|
},
|
|
data () {
|
|
return {
|
|
skuShowFalg: false,
|
|
tabIndex: 0,
|
|
swiperCurrent: 0,
|
|
selectComposeData: [],
|
|
curProIndex: 0,
|
|
selectedSku: [],
|
|
selectedAttr: [],
|
|
skuProData: {},
|
|
goodsDetailShowFlag: false,
|
|
composePrice: 0
|
|
}
|
|
},
|
|
mounted() {
|
|
this.getSelectCompose()
|
|
},
|
|
methods:{
|
|
// 切换套餐
|
|
tabChange(index){
|
|
this.tabIndex = index
|
|
this.calculatePrice()
|
|
},
|
|
// 滑动回调方法
|
|
swiperChange(e) {
|
|
this.swiperCurrent = e.detail.current;
|
|
},
|
|
// 获取组合销售数据
|
|
getSelectCompose() {
|
|
NET.request(API.selectCompose, {
|
|
productId: this.pid
|
|
},
|
|
"GET").then(res => {
|
|
this.selectComposeData = res.data
|
|
for(let i=0;i< this.selectComposeData.length;i++) {
|
|
let proList = this.selectComposeData[i].composeProductInfoList
|
|
for (let j = 0; j < proList.length; j++) {
|
|
proList[j].skuItem = proList[j].composeSkuInfoList[0]
|
|
}
|
|
}
|
|
this.calculatePrice()
|
|
}).catch(res => {
|
|
|
|
})
|
|
},
|
|
// 更换商品样式
|
|
changeSkuItemValue(item,index) {
|
|
this.curProIndex = index
|
|
uni.showLoading({
|
|
mask: true,
|
|
title: '加载中...'
|
|
})
|
|
NET.request(API.QueryProductDetail, {
|
|
shopId: this.productData.shopId,
|
|
productId: item.productId,
|
|
skuId: item.skuItem.skuId,
|
|
terminal: 1
|
|
},
|
|
"GET").then(res => {
|
|
uni.hideLoading()
|
|
this.skuProData = res.data
|
|
//如果是单款式商品,需要特殊处理productData.names
|
|
const mapKeys = Object.keys(this.skuProData.map)
|
|
if (mapKeys.length === 1 && mapKeys[0] === '单款项') {
|
|
this.skuProData.names[0].values.push({
|
|
skuValue: '单款项',
|
|
valueCode: '单款项'
|
|
})
|
|
}
|
|
|
|
//如果sku的图像为空,设置为商品的图像
|
|
for (var key in this.skuProData.map) {
|
|
let skuImage = this.skuProData.map[key].image
|
|
if (!skuImage) {
|
|
this.skuProData.map[key].image = this.skuProData.images[0]
|
|
}
|
|
}
|
|
this.goodsDetailShowFlag = true
|
|
this.selectBySkuId(item.skuItem.skuId)
|
|
}).catch(res => {
|
|
uni.hideLoading()
|
|
})
|
|
},
|
|
selectBySkuId(skuId) {
|
|
if (skuId) {
|
|
let mapinfo = this.skuProData.map
|
|
let flag = true
|
|
for (var key in mapinfo) {
|
|
if (parseInt(mapinfo[key].skuId) === parseInt(skuId)) {
|
|
flag = false
|
|
this.selectedSku = mapinfo[key]
|
|
// 选中sku对应的规格
|
|
const valueCodeList = key.split(',')
|
|
this.selectedAttr = []
|
|
this.skuProData.names.forEach(attr => {
|
|
for (var index in attr.values) {
|
|
let valueCode = attr.values[index].valueCode
|
|
if (valueCodeList.includes(valueCode)) {
|
|
this.nameCodeValueCodeClick(attr.nameCode, valueCode, false)
|
|
break
|
|
}
|
|
}
|
|
})
|
|
break
|
|
}
|
|
}
|
|
// 匹配不上就赋值第一个
|
|
if(flag){
|
|
for (var key in mapinfo) {
|
|
this.selectedSku = mapinfo[key]
|
|
break
|
|
}
|
|
}
|
|
}
|
|
},
|
|
nameCodeValueCodeClick(nameCode, valueCode, reSelectSku) {
|
|
this.selectedAttr[nameCode] = valueCode
|
|
if (reSelectSku) {
|
|
let attrList = []
|
|
for (var key in this.selectedAttr) {
|
|
attrList.push(this.selectedAttr[key])
|
|
}
|
|
const attrkey = attrList.join(',')
|
|
let mapinfo = this.skuProData.map
|
|
for (var key in mapinfo) {
|
|
if (attrkey === key) {
|
|
this.selectedSku = mapinfo[key]
|
|
}
|
|
}
|
|
}
|
|
this.$forceUpdate(); // 重绘
|
|
},
|
|
// 提交更换商品规格
|
|
submitBtn() {
|
|
const curPro = this.selectComposeData[this.tabIndex].composeProductInfoList[this.curProIndex]
|
|
for(let i=0;i<curPro.composeSkuInfoList.length;i++){
|
|
if(curPro.composeSkuInfoList[i].skuId === this.selectedSku.skuId){
|
|
this.selectedSku.skuName = curPro.composeSkuInfoList[i].skuName
|
|
}
|
|
}
|
|
curPro.skuItem = this.selectedSku
|
|
this.calculatePrice()
|
|
this.goodsDetailShowFlag = false
|
|
},
|
|
// 计算组合价
|
|
calculatePrice(){
|
|
const proList = this.selectComposeData[this.tabIndex].composeProductInfoList,composeType= this.selectComposeData[this.tabIndex].composeType,promote= this.selectComposeData[this.tabIndex].promote
|
|
let total = 0
|
|
for(let i=0;i<proList.length;i++){
|
|
total += this.getPrice(proList[i].skuItem)
|
|
}
|
|
switch (composeType){
|
|
case 1:
|
|
this.composePrice = promote.toFixed(2)
|
|
break
|
|
case 2:
|
|
this.composePrice = (total - promote).toFixed(2)
|
|
break
|
|
case 3:
|
|
this.composePrice = parseFloat(total * promote / 10).toFixed(2)
|
|
break
|
|
}
|
|
},
|
|
// 根据活动显示不同价格
|
|
getPrice(item){
|
|
// 所属活动 0-常规商品 1-拼团活动 2-秒杀活动 3-限时折扣活动 4-平台秒杀 5-平台折扣 6-定价捆绑 7-组合捆绑 8-场景营销 9-会员价
|
|
if(item.activityType){
|
|
if(item.activityType === 0 || item.activityType === 6 || item.activityType === 7){
|
|
return item.price
|
|
} else {
|
|
return item.originalPrice
|
|
}
|
|
} else {
|
|
return item.price
|
|
}
|
|
},
|
|
// 立即购买
|
|
doBuy(){
|
|
let addCart = []
|
|
let shopObj = {}
|
|
shopObj["shopId"] = this.productData.shopId
|
|
shopObj["composeId"] = this.selectComposeData[this.tabIndex].composeId
|
|
shopObj["skus"] = []
|
|
let proList = this.selectComposeData[this.tabIndex].composeProductInfoList
|
|
let len2 = proList.length
|
|
for (let j = 0; j < len2; j++) {
|
|
let skusObj = {}
|
|
skusObj["number"] = 1
|
|
skusObj["skuId"] = proList[j].skuItem.skuId
|
|
shopObj.skus.push(skusObj)
|
|
}
|
|
addCart.push(shopObj)
|
|
uni.setStorageSync('skuItemDTOList', addCart)
|
|
uni.navigateTo({
|
|
url: '../../pages_category_page1/orderModule/orderConfirm?type=1'
|
|
})
|
|
},
|
|
getselectedAttrVal(item){
|
|
return this.selectedAttr[item]
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.group-list{
|
|
padding: 10upx 20upx 60upx;
|
|
border-top: 12upx solid #F8F8F8;
|
|
.group-warp{
|
|
height: 680upx;
|
|
|
|
background: #333333;
|
|
box-shadow: 0 20upx 30upx rgba(0, 0, 0, 0.3);
|
|
opacity: 1;
|
|
border-radius: 20upx;
|
|
}
|
|
.title{
|
|
display: flex;
|
|
align-items:center;
|
|
position: relative;
|
|
justify-content: space-between;
|
|
padding: 32upx 0 20upx 30upx;
|
|
.title-img{
|
|
width: 203upx;
|
|
}
|
|
.price-text{
|
|
padding: 0 34upx;
|
|
margin-right: 10upx;
|
|
height: 50upx;
|
|
background: linear-gradient(90deg, #C83732 0%, #E25C44 100%);
|
|
box-shadow: 0 6upx 12upx rgba(233, 0, 0, 0.3);
|
|
border-radius: 26upx;
|
|
font-size: 24upx;
|
|
color: #fff;
|
|
text-align: center;
|
|
line-height: 50upx;
|
|
margin-left: 20upx;
|
|
.swiper{
|
|
height: 50upx;
|
|
}
|
|
}
|
|
}
|
|
.tabs-nav{
|
|
padding: 0 10upx;
|
|
margin-bottom: 20upx;
|
|
.ul{
|
|
display: flex;
|
|
.li{
|
|
//flex: 1 0 auto;
|
|
text-align: center;
|
|
font-size: 26rpx;
|
|
color: #999;
|
|
position: relative;
|
|
padding: 12px 40px;
|
|
word-break: keep-all;
|
|
&:first-child{
|
|
margin-left: 0;
|
|
}
|
|
&.on{
|
|
color: #FFEBC4;
|
|
&:after{
|
|
content: '';
|
|
width: 100%;
|
|
height: 2rpx;
|
|
background: #FFEBC4;
|
|
position: absolute;
|
|
left: 0;
|
|
bottom: 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.tabs-item{
|
|
display: none;
|
|
&.on{
|
|
display: block;
|
|
}
|
|
}
|
|
.pro-box{
|
|
height: 318upx;
|
|
padding: 0 2upx 20upx;
|
|
.pro-item-inner{
|
|
padding: 0 8upx;
|
|
display: flex;
|
|
justify-content: center;
|
|
}
|
|
.pro-item{
|
|
width: 219upx;
|
|
background: #FFFFFF;
|
|
padding: 10upx;
|
|
height: 318upx;
|
|
.pro-item-img{
|
|
width: 100%;
|
|
height: 160upx;
|
|
.img{
|
|
width: 100%;
|
|
height: 100%;
|
|
object-fit: contain;
|
|
|
|
}
|
|
}
|
|
.pro-item-info{
|
|
.name{
|
|
font-size: 24upx;
|
|
line-height: 34upx;
|
|
color: #333333;
|
|
overflow: hidden;
|
|
text-overflow:ellipsis;
|
|
white-space: nowrap;
|
|
text-align: center;
|
|
font-weight: normal;
|
|
margin: 8upx 0 26upx;
|
|
}
|
|
.sku{
|
|
width: 180upx;
|
|
height: 50upx;
|
|
margin: 0 auto;
|
|
line-height: 50upx;
|
|
border: 2upx solid #E4E5E6;
|
|
background: url("http://36.138.125.206:8081/ceres-local-file/static/images/arrow-suk-select.png") no-repeat right center / 60upx 60upx;
|
|
.text{
|
|
font-size: 24upx;
|
|
color: #999;
|
|
padding-left: 20upx;
|
|
width: 126px;
|
|
text-overflow:ellipsis;
|
|
white-space: nowrap;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.swiper-dots{
|
|
display: flex;
|
|
justify-content: center;
|
|
.dot{
|
|
display: block;
|
|
width: 24upx;
|
|
height: 4upx;
|
|
background: #FFFFFF;
|
|
opacity: 0.5;
|
|
border-radius: 2upx;
|
|
margin: 0 20upx;
|
|
&.dot-active{
|
|
opacity: 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.btn-buy{
|
|
width: 688upx;
|
|
height: 84upx;
|
|
//border: 2upx solid rgba(0, 0, 0, 0);
|
|
background: linear-gradient(88deg, #C5AA7B 0%, #FFEBC4 100%);
|
|
font-size: 28upx;
|
|
color: #333;
|
|
line-height: 84upx;
|
|
margin: 30upx auto 0;
|
|
text-align: center;
|
|
}
|
|
|
|
.goosDetailshow-box {
|
|
.detailImg-box {
|
|
margin-top: 30rpx;
|
|
margin-left: 30rpx;
|
|
border-radius: 10rpx;
|
|
border-bottom: 1rpx solid #EDEDED;
|
|
padding-bottom: 20rpx;
|
|
width: 690rpx;
|
|
|
|
.detailImg {
|
|
width: 180rpx;
|
|
height: 180rpx;
|
|
}
|
|
}
|
|
|
|
.color-box {
|
|
padding: 30rpx 30rpx;
|
|
border-bottom: 1rpx solid #EDEDED;
|
|
width: 690rpx;
|
|
.skuStyle{
|
|
padding: 20rpx 0;
|
|
}
|
|
|
|
.skuStyle:nth-child(2) {
|
|
border-top: 1px solid #F3F4F5;
|
|
}
|
|
|
|
.colorName-box {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
flex-direction: row;
|
|
justify-content: flex-start;
|
|
align-items: center;
|
|
margin-top: 30rpx;
|
|
margin-left: -30rpx;
|
|
|
|
.colorName-on {
|
|
background-color: #FFE5D0;
|
|
color: #C5AA7B;
|
|
margin-left: 30rpx;
|
|
padding: 10rpx 32rpx;
|
|
border-radius: 28rpx;
|
|
border: 1rpx solid #C5AA7B;
|
|
font-size: 26rpx;
|
|
text-align: center;
|
|
z-index: 1;
|
|
}
|
|
|
|
.colorName {
|
|
background-color: #F5F5F5;
|
|
margin-left: 30rpx;
|
|
padding: 10rpx 32rpx;
|
|
border-radius: 28rpx;
|
|
font-size: 26rpx;
|
|
z-index: 2;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
.modelNum-box {
|
|
padding: 30rpx 30rpx;
|
|
border-bottom: 1rpx solid #EDEDED;
|
|
width: 690rpx;
|
|
|
|
.modelNumName-box {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
flex-direction: row;
|
|
justify-content: flex-start;
|
|
align-items: center;
|
|
margin-top: 30rpx;
|
|
margin-left: -30rpx;
|
|
|
|
.modelNumName-on {
|
|
background-color: #FFE4D0;
|
|
color: #C5AA7B;
|
|
margin-left: 30rpx;
|
|
padding: 10rpx 32rpx;
|
|
border-radius: 28rpx;
|
|
border: 1rpx solid #C5AA7B;
|
|
font-size: 26rpx;
|
|
text-align: center;
|
|
}
|
|
|
|
.modelNumName {
|
|
background-color: #F5F5F5;
|
|
margin-left: 30rpx;
|
|
padding: 10rpx 32rpx;
|
|
border-radius: 28rpx;
|
|
font-size: 26rpx;
|
|
}
|
|
}
|
|
}
|
|
|
|
.goodsNum-box {
|
|
padding: 30rpx 30rpx;
|
|
width: 690rpx;
|
|
padding-bottom: 140rpx;
|
|
|
|
.goodsNumber {
|
|
text-align: center;
|
|
border: 1rpx solid #999999;
|
|
padding: 3rpx 20rpx;
|
|
}
|
|
|
|
.subtract {
|
|
border: 1rpx solid #999999;
|
|
padding: 3rpx 20rpx;
|
|
margin-right: -1rpx;
|
|
}
|
|
|
|
.add {
|
|
border: 1rpx solid #999999;
|
|
padding: 3rpx 20rpx;
|
|
margin-left: -1rpx;
|
|
}
|
|
}
|
|
|
|
.goosDetailbut-box {
|
|
.joinShopCartBut {
|
|
width: 343rpx;
|
|
height: 80rpx;
|
|
background-color: #FFC300;
|
|
color: #FFFEFE;
|
|
font-size: 28rpx;
|
|
line-height: 80rpx;
|
|
text-align: center;
|
|
margin-left: 30rpx;
|
|
}
|
|
|
|
.buyNowBut {
|
|
width: 343rpx;
|
|
height: 80rpx;
|
|
border-radius: 0 40rpx 40rpx 0;
|
|
background-color: #FF6F00;
|
|
color: #FFFEFE;
|
|
font-size: 28rpx;
|
|
line-height: 80rpx;
|
|
text-align: center;
|
|
}
|
|
}
|
|
.submitBtn {
|
|
width: 342rpx;
|
|
height: 100rpx;
|
|
line-height: 100rpx;
|
|
font-size: 28rpx;
|
|
border: 1px solid;
|
|
border-radius: 0;
|
|
color: #FFEBC4;
|
|
background: #333333;
|
|
margin: 20rpx 0;
|
|
}
|
|
}
|
|
</style>
|