多租户商城-商户小程序端
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.
 
 
 

804 lines
22 KiB

<template>
<view class="inviteSpell-con">
<global-loading />
<view class="grouped">
<view class="fs32 font-color-FFF">{{remainPerson !== 0?'等待成团':'已成团'}}</view>
<view class="fs26 number">{{inviteSpell.person}}人团</view>
</view>
<view class="topBox">
<view class="title-box flex-row-plus">
<image class="pro-img" :src="inviteSpell.image"></image>
<view class="flex-column-plus mar-left-30">
<view class="title-lab fs28">{{inviteSpell.productName}}</view>
<view class="flex-row-plus flex-sp-between">
<view class="flex-column-plus">
<!-- <view class="spellNum flex-items-plus font-color-C5AA7B mar-top-30 fs24">{{inviteSpell.person}}人团</view>-->
<view class="flex-row-plus mar-top-30 flex-items">
<label class="font-color-C83732 fs24">¥</label>
<label class="font-color-C83732 fs36 mar-left-5">{{inviteSpell.price}}</label>
<label class="font-color-CCC discountsPriceLine fs26 mar-left-20">¥{{inviteSpell.originalPrice}}</label>
</view>
</view>
<!-- <view class="mar-top-20">-->
<!-- <image class="issueregiment" src="http://36.138.125.206:8081/ceres-local-file/static/images/issueregiment.png"></image>-->
<!-- </view>-->
</view>
</view>
</view>
</view>
<view class="spellpersonnel-box">
<view class="bgBox flex-items-plus flex-column">
<view class="flex-items flex-sp-around flex-row-plus mar-right-20">
<view class="flex-column flex-items-plus mar-left-20" v-for="(item,index) in inviteSpell.personList" :key="index">
<image v-if="index == 0" class="head-icon border-FF7 z-index-0" :src="item.headImage"></image>
<image v-else class="head-icon " :src="item.headImage"></image>
<view v-if="index == 0" class="fs18 colonel-box">团长</view>
</view>
<view v-for="ritem in remainPerson">
<view class="replenish-icon flex-items-plus mar-left-20">?</view>
</view>
</view>
<view v-if="remainPerson !== 0">
<view class="mar-top-50 font-color-333">还差<label class="font-color-C5AA7B">{{remainPerson}}</label>人成团,距结束还剩{{hou}}:{{min}}:{{sec}}</view>
<view v-if="type == 1" @click="shareClick" class="offered-but font-color-FFF flex-items-plus mar-top-60">邀请好友拼单</view>
<view v-if="type == 0" @click="getOffered" class="offered-but font-color-FFF flex-items-plus mar-top-60">立即参团</view>
<view v-if="type == 1" @click="goinvitePoster" class="poster-but flex-items-plus mar-top-40">生成邀请海报</view>
</view>
</view>
</view>
<view class="spellrule flex-items-plus flex-column mar-top-20">
<view class="flex-row-plus">
<view class="flex-row-plus flex-items-plus text-align">
<view class="dot1"></view>
<view class="dot2"></view>
<view class="dot3"></view>
</view>
<label class="fs28 mar-left-20">拼团玩法</label>
<view class="flex-row-plus flex-items-plus text-align mar-left-10">
<view class="dot3"></view>
<view class="dot2"></view>
<view class="dot1"></view>
</view>
</view>
<view class="mar-top-40">
<u-steps :list="numList" mode="number" :current="-1"></u-steps>
</view>
</view>
<!-- 商品详情 -->
<u-popup class="goosDetailshow-box" v-model="goosDetailshowFlag" mode="bottom" border-radius="14">
<view>
<view class="detailImg-box flex-row-plus">
<image class="detailImg" :src="skuImg"></image>
<view class="flex-column-plus mar-left-40">
<view class="font-color-C5AA7B">
<label class="fs24">¥</label>
<label class="fs36 mar-left-10">{{skuPrice}}</label>
</view>
<label class="fs24 font-color-999 mar-top-20">{{$t('common.stocknum', {number:stockNumber})}}</label>
<label class="fs24 mar-top-20">已选</label>
</view>
</view>
<view class="color-box flex-column-plus">
<view v-for="(attritem,index) in skuProdList.names" :key="index">
<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">
<label class="colorName" :class="{'colorName-on' :subIndex[index] == resIndex}" @click="colorActiveClick(attrRes,index,resIndex)">{{attrRes.skuValue}}</label>
</view>
</view>
</view>
</view>
<view class="goodsNum-box flex-row-plus flex-sp-between">
<label class="font-color-999 fs24">数量</label>
<view class="goodsNum">
<label class="subtract" @click="numSub">-</label>
<label class="goodsNumber" v-model="buyNum">{{buyNum}}</label>
<label class="add" @click="numAdd">+</label>
</view>
</view>
<view class="goosDetailbut-box flex-items-plus" :style="{'padding-bottom':(isIphone===true? 50:20)+'rpx'}">
<view class="joinbuyBut" @click="getGroupSettlement(2)">确定</view>
</view>
</view>
</u-popup>
<shareSpell ref="shareSpell" @shareCancel='shareCancel' :url="url" :urlParms="urlParms" :img="inviteSpell.image" title="好友邀请您来拼单啦">
</shareSpell>
</view>
</template>
<script>
const NET = require('../../utils/request')
const API = require('../../config/api')
import shareSpell from '@/component/share.vue'
import ClipboardJS from "clipboard"
export default {
data() {
return {
numList: [{
name: '选择商品 完成下单'
}, {
name: '支付开团 或参团'
}, {
name: '邀请好友 参与拼团'
}, {
name: '人满成团 失败退款'
}, ],
collageId:0,
orderId:0,
type:0,
inviteSpell:{},
personLen:0,
remainPerson:0,
hou: "00",
min: "00",
sec: "00",
timeOut:undefined,
goosDetailshowFlag: false,
productId:0,
skuId:0,
shopGroupWorkId:0,
buyNum:1,
skuProdId:0,
skuImg:'',
skuPrice:0,
stockNumber:0,
skuProdList:{},
isIphone: "",
selectArr: [], // 存放被选中的值
subIndex: [], // 是否选中 因为不确定是多规格还是单规格,所以这里定义数组来判断
attrItemIdArr: [], //存放被选中的id
shopId:0,
attrList: [],
productDetail:{},
userInfo: {},
url: '',
shareTitle: '',
showJoinGroup: false,
showGroupText: '立即参团',
urlParms: ''
};
},
components:{
shareSpell
},
onShareAppMessage: function(res) {
var that = this;
//console.log('res=====',res);
if (res.from === 'button') {
//console.log('来自页面内转发按钮');
} else if (res.from === 'menu'){
//console.log('右上角菜单转发按钮');
}
this.url = '/pages_category_page1/goodsModule/inviteSpell?collageId='
+ this.collageId +'&orderId='+ this.orderId+'&type=0'+'&productId='+this.productId+'&skuId='+this.skuId+'&shopGroupWorkId='+this.shopGroupWorkId
this.shareTitle = `【仅剩${this.remainPerson}个名额】我${this.inviteSpell.price}元拼了${this.inviteSpell.productName}`
// 返回数据
return {
title: that.shareTitle,
path: that.url,
success: function(res) {
// 转发成功,可以把当前页面的链接发送给后端,用于记录当前页面被转发了多少次或其他业务
wx.request({
url: app.buildUrl("/member/share"),
data: {
url: utils.getCurrentPageUrlWithArgs()
},
success: function(res) {
//console.log('成功');
}
});
},
fail: function(res) {
// 转发失败
}
}
},
onUnload() {
if(this.timeOut){
clearTimeout(this.timeOut)
}
},
onShow(){
//判断是否登录
let item = {}
if(uni.getStorageSync('storage_key')){
item = uni.getStorageSync('storage_key');
}
if(JSON.stringify(item) == '{}'){
let data = {
collageId : this.collageId,
orderId : this.orderId,
productId : this.productId,
skuId : this.skuId,
type : this.type,
}
uni.setStorageSync("inviteSpell",data)
// uni.navigateTo({
// url:'../../pages_category_page2/userModule/accountLogin?inviteSpell=1'
// })
}else{
this.userInfo = uni.getStorageSync('storage_userInfo')
}
this.getInviteSpell()
},
onLoad(options) {
this.isIphone = getApp().globalData.isIphone;
let item = getApp().globalData.inviteSpellShareIte
if (item) {
this.collageId = parseInt(item.collageId)
this.orderId = parseInt(item.orderId)
this.productId = parseInt(item.productId)
this.skuId = parseInt(item.skuId)
this.shopGroupWorkId = parseInt(item.shopGroupWorkId)
getApp().globalData.inviteSpellShareItem = undefined
} else {
this.collageId = parseInt(options.collageId)
this.orderId = parseInt(options.orderId)
this.productId = parseInt(options.productId)
this.skuId = parseInt(options.skuId)
this.shopGroupWorkId = parseInt(options.shopGroupWorkId)
}
// #ifdef MP-WEIXIN
this.url = '/pages_category_page1/goodsModule/inviteSpell?collageId=' +
this.collageId + '&orderId=' + this.orderId + '&productId=' + this.productId + '&skuId=' + this.skuId +
'&shopGroupWorkId=' + this.shopGroupWorkId
this.urlParms = this.collageId + '&orderId=' + this.orderId + '&productId=' + this.productId + '&skuId=' + this.skuId +
'&shopGroupWorkId=' + this.shopGroupWorkId
// #endif
// #ifndef MP-WEIXIN
this.url = '/h5/#/pages_category_page1/goodsModule/inviteSpell?collageId=' +
this.collageId + '&orderId=' + this.orderId + '&productId=' + this.productId + '&skuId=' + this.skuId +
'&shopGroupWorkId=' + this.shopGroupWorkId
// #endif
},
methods:{
getOffered(){
this.goosDetailshowFlag = true
},
//拼团下单
getGroupSettlement(type){
uni.removeStorageSync("skuItemDTOList")
let data={}
data= {
collageId:this.collageId,
number:this.buyNum,
productId:this.productId,
shopId:this.shopId,
skuId:this.skuProdId,
shopGroupWorkId:this.shopGroupWorkId,
type:type
}
uni.setStorageSync('skuItemList',data)
this.goosDetailshowFlag = false
this.buyNum = 1
uni.navigateTo({
url: '../orderModule/orderConfirm?type=1',
})
},
//获取商品详情
queryProductDetail() {
NET.request(API.QueryProductDetail,
{
shopId:this.shopId,
productId:this.productId,
skuId:this.skuId,
terminal:1
},
"GET").then(res => {
this.productDetail = res.data
for (let i = 0; i < res.data.attrList.length; i++) {
this.subIndex[i] = 0
}
this.attrItemIdArr[0] = res.data.attrList[0].attrValueList[0].id
}).catch(res => {
})
},
getProductSku(){
NET.request(API.QueryProductSku, {
skuId:this.skuId,
productId:this.productId
}, 'GET').then(res => {
this.skuProdList = res.data
this.attrList = res.data.names
this.attrValueList = res.data.names[0].values
//渲染商详之后,默认先选中第一个规格
this.colorActiveClick(this.attrValueList[0],0,0)
this.skuProdId = this.skuId
this.skuImg = res.data.image
this.skuPrice = res.data.price
this.stockNumber = res.data.stockNumber
this.shopId = res.data.shopId
}).catch(res => {
})
},
// 数量减
numSub() {
if (this.buyNum > 1) {
this.buyNum = this.buyNum - 1
} else {
uni.showToast({
title: '亲!至少一件哦!',
icon: "none"
})
}
},
// 数量加
numAdd() {
if(this.buyNum < this.stockNumber){
this.buyNum = this.buyNum + 1
}else{
uni.showToast({
title: this.$t('common.understock'),
icon: "none"
})
}
},
//颜色选中事件
colorActiveClick(res, index, resIndex) {
let t = this;
t.selectArr[index] = res;
t.subIndex[index] = resIndex;
t.attrItemIdArr[index] = res.valueCode
t.checkItem();
t.checkItemDataClick(t.attrItemIdArr)
},
checkItem() {
var self = this;
var option = self.attrList;
var result = []; // 定义数组存储被选中的值
for (let i in option) {
result[i] = self.selectArr[i] ? self.selectArr[i] : "";
if (!self.subIndex[i]) {
self.subIndex[i] = 0
}
if (!self.attrItemIdArr[i]) {
self.attrItemIdArr[i] = option[i].values[0].valueCode
}
}
for (let i in option) {
var last = result[i]; // 把选中的值存放到字符串last去
for (let k in option[i].item) {
result[i] = option[i].item[k].name; // 赋值,存在直接覆盖,不存在往里面添加name值
}
result[i] = last; // 还原,目的是记录点下去那个值,避免下一次执行循环时避免被覆盖
}
self.$forceUpdate(); // 重绘
},
checkItemDataClick(attrItemIdArr) {
let attrkey = ''
for(let i =0;i<attrItemIdArr.length;i++){
attrkey += attrItemIdArr[i]+','
}
attrkey = attrkey.substring(0,attrkey.length - 1)
let mapinfo = this.skuProdList.map
for (var key in mapinfo){
if(attrkey == key){
this.skuProdId = mapinfo[key].skuId
this.skuImg = mapinfo[key].skuImg
this.skuPrice = mapinfo[key].price
this.stockNumber = mapinfo[key].stockNumber
}
}
},
shareClick(){
this.$refs.shareSpell.shareShow = true
},
shareCancel(){
this.$refs.shareSpell.shareShow = false
},
goinvitePoster(){
let data = {
image:this.inviteSpell.image,
headImage:this.inviteSpell.headImage,
productName:this.inviteSpell.productName,
person:this.inviteSpell.person,
originalPrice:this.inviteSpell.originalPrice,
price:this.inviteSpell.price,
collageId:this.collageId,
productId:this.productId,
skuId:this.skuId,
orderId:this.orderId
}
uni.navigateTo({
url:'invitePoster?data='+ JSON.stringify(data)
})
},
getInviteSpell(){
// uni.showLoading({
// mask: true,
// title: '加载中...',
// })
NET.request(API.getInviteSpell, {
collageId:this.collageId,
orderId: this.orderId
}, 'POST').then(res => {
this.inviteSpell = res.data
this.type = 0
this.inviteSpell.personList.forEach(item=>{
if(item.buyerUserId === this.userInfo.buyerUserId){
this.type = 1
}
})
this.personLen = res.data.personList.length
this.remainPerson = res.data.person - this.personLen
this.dateformat(res.data.time)
this.countDown()
uni.hideLoading()
}).catch(res => {
uni.hideLoading()
})
},
//时分秒换算
dateformat(micro_second) {
// 总秒数
let second = Math.floor(micro_second / 1000);
// 天数
let day = Math.floor(second / 3600 / 24);
// 小时
let hr = Math.floor(second / 3600 % 24);
// 分钟
let min = Math.floor(second / 60 % 60);
// 秒
let sec = Math.floor(second % 60);
this.hou = hr
this.min = min
this.sec = sec
},
countDown(){
let timeOut = setTimeout(() => {
let hou = parseInt(this.hou);
let min = parseInt(this.min);
let sec = parseInt(this.sec);
let netxSec = sec - 1;
let netxMin = min
let netxHou = hou;
if (netxHou == 0 && netxMin == 0 && netxSec == -1) {
clearTimeout(timeOut)
// uni.switchTab({
// url:'../../pages/tabbar/index/index'
// })
} else {
if (netxSec == -1) {
netxSec = 59
netxMin = netxMin - 1;
}
if (netxMin == -1) {
netxMin = 59
netxHou = netxHou - 1
}
if (netxHou == -1) {
netxHou = 23
}
this.hou = this.timeFormat(netxHou),
this.min = this.timeFormat(netxMin),
this.sec = this.timeFormat(netxSec),
this.timeOut = timeOut
this.countDown();
}
}, 1000)
},
timeFormat(param) { //小于10的格式化函数
return param < 10 ? '0' + param : param;
},
}
}
</script>
<style lang="scss">
page{background-color: #F7F7F7;}
.copy-color{
display: flex;
justify-content: center;
align-items:center;
flex-direction: column;
}
.inviteSpell-con{
background: url("http://36.138.125.206:8081/ceres-local-file/static/images/pintuanbg.png") no-repeat left top;
background-size: contain;
.grouped {
text-align: center;
padding-top: 40rpx;
.number {
display: inline-block;
color: #FFEBC4;
height: 48rpx;
line-height: 48rpx;
padding: 0 30rpx;
background: #525252;
margin-top: 10rpx;
}
}
.z-index-0{
z-index: 0;
}
.border-FF7{
border: 2rpx solid #FFF;
}
.colonel-box{
color: #FFEBC4;
background-color: #333333;
width: 86rpx;
height: 32rpx;
line-height: 32rpx;
border-radius: 15rpx;
text-align: center;
margin-top: -20rpx;
z-index: 2;
}
.font-color-C5AA7B{
color: #C5AA7B;
}
.topBox {
padding: 40rpx 20rpx 0 20rpx;
}
.title-box{
padding: 30rpx;
background: #FFFFFF;
.title-lab{
width: 400rpx;
height: 130rpx;
}
.spellNum{
background-color: #FFEDDF;
border-radius: 22rpx;
width: 144rpx;
height: 44rpx;
}
.pro-img{
width: 222rpx;
height: 222rpx;
}
.issueregiment{
width: 120rpx;
height: 122rpx;
}
}
.spellpersonnel-box{
margin-top: 20rpx;
padding: 0 20rpx;
.bgBox {
background-color: #FFFFFF;
padding: 30rpx 0;
}
.head-icon{
width: 102rpx;
height: 102rpx;
border-radius: 50%;
}
.replenish-icon{
width: 102rpx;
height: 102rpx;
border-radius: 50%;
border: 1rpx #E5E5E5 dashed;
font-size: 60rpx;
color: #DBDBDB;
}
.offered-but{
background-color: #333333;
border-radius: 5rpx;
width: 420rpx;
height: 66rpx;
color: #FFEBC4;
}
.poster-but{
border: #C5AA7B 1rpx solid;
border-radius: 5rpx;
width: 420rpx;
height: 66rpx;
color: #C5AA7B;
}
}
.spellrule{
background-color: #FFFFFF;
padding: 50rpx 20rpx;
.dot1{
width: 4rpx;
height: 4rpx;
background-color: #B6B6C1;
border-radius: 50%;
margin-left: 10rpx;
}
.dot2{
width: 6rpx;
height: 6rpx;
background-color: #B6B6C1;
border-radius: 50%;
margin-left: 10rpx;
}
.dot3{
width: 8rpx;
height: 8rpx;
background-color: #B6B6C1;
border-radius: 50%;
margin-left: 10rpx;
}
}
.inactive-box{
padding: 40rpx 40rpx;
.weixin-box{
width: 100rpx;
height: 100rpx;
background-color: #F5F5F5;
border-radius: 50%;
image{
width: 55rpx;
height: 55rpx;
}
}
}
.goosDetailshow-box {
.detailImg-box {
margin-top: 30upx;
margin-left: 30upx;
border-radius: 10upx;
border-bottom: 1upx solid #EDEDED;
padding-bottom: 20upx;
width: 690upx;
.detailImg {
width: 180upx;
height: 180upx;
}
}
.color-box {
padding: 30upx 30upx;
border-bottom: 1upx solid #EDEDED;
width: 690upx;
.colorName-box {
display: flex;
flex-wrap: wrap;
flex-direction: row;
justify-content: flex-start;
align-items: center;
margin-top: 30upx;
margin-left: -30upx;
.colorName-on {
background-color: #FFE5D0;
color: #C5AA7B;
margin-left: 30upx;
padding: 10upx 32upx;
border-radius: 28upx;
border: 1upx solid #C5AA7B;
font-size: 26upx;
text-align: center;
z-index: 1;
}
.colorName {
background-color: #F5F5F5;
margin-left: 30upx;
padding: 10upx 32upx;
border-radius: 28upx;
font-size: 26upx;
z-index: 2;
}
}
}
.modelNum-box {
padding: 30upx 30upx;
border-bottom: 1upx solid #EDEDED;
width: 690upx;
.modelNumName-box {
display: flex;
flex-wrap: wrap;
flex-direction: row;
justify-content: flex-start;
align-items: center;
margin-top: 30upx;
margin-left: -30upx;
.modelNumName-on {
background-color: #FFE4D0;
color: #C5AA7B;
margin-left: 30upx;
padding: 10upx 32upx;
border-radius: 28upx;
border: 1upx solid #C5AA7B;
font-size: 26upx;
text-align: center;
}
.modelNumName {
background-color: #F5F5F5;
margin-left: 30upx;
padding: 10upx 32upx;
border-radius: 28upx;
font-size: 26upx;
}
}
}
.joinbuyBut{
width: 690upx;
height: 80upx;
border-radius: 40upx 40upx;
background-color: #3D3C3D;
color: #FFFEFE;
font-size: 28upx;
line-height: 80upx;
text-align: center;
}
.goodsNum-box {
padding: 30upx 30upx;
width: 690upx;
padding-bottom: 268upx;
.goodsNumber {
border: 1upx solid #999999;
padding: 3upx 20upx;
}
.subtract {
border: 1upx solid #999999;
padding: 3upx 20upx;
margin-right: -1upx;
}
.add {
border: 1upx solid #999999;
padding: 3upx 20upx;
margin-left: -1upx;
}
}
.goosDetailbut-box {
.joinShopCartBut {
width: 343upx;
height: 80upx;
border-radius: 40upx 0 0 40upx;
background-color: #3D3C3D;
color: #FFFEFE;
font-size: 28upx;
line-height: 80upx;
text-align: center;
margin-left: 30upx;
}
.buyNowBut {
width: 343upx;
height: 80upx;
border-radius: 0 40upx 40upx 0;
background-color: #3D3C3D;
color: #FFFEFE;
font-size: 28upx;
line-height: 80upx;
text-align: center;
}
}
}
}
</style>
<style scoped>
.spellrule /deep/ .u-steps__item__num {
background: #F3F4F5 !important;
border: none !important;
width: 60rpx;
height: 60rpx;
}
.spellrule /deep/ .u-steps .u-steps__item--row .u-steps__item__line {
left: 66%;
width: 67%;
}
.spellrule /deep/ .u-steps .u-steps__item--row .u-line {
height: 6rpx;
border-bottom: none;
background: #F3F4F5;
border-bottom: none !important;
}
.spellrule /deep/ .u-steps .u-steps__item--row .u-steps__item__text--row {
width: 180rpx;
padding: 0 25rpx;
}
</style>