拼团修复

This commit is contained in:
2025-12-18 17:05:43 +08:00
parent 2285c796aa
commit 1539850f96
10 changed files with 986 additions and 171 deletions

View File

@@ -0,0 +1,41 @@
<template>
<modal v-model="show" title="查看券码" :showBottom="false">
<view class="u-p-28">
<view class="u-flex u-row-center">
<up-qrcode cid="ex1" :size="104" :val="qrcode"></up-qrcode>
</view>
<view class="u-m-t-22 u-flex u-row-center">
<text>{{ qrcode }}</text>
<view @click="copyCode">
<image src="/scoreShop/static/image/copy.png" class="u-m-l-24 copy"></image>
</view>
</view>
</view>
</modal>
</template>
<script setup>
import modal from '@/components/modal.vue'
const props = defineProps({
qrcode: {
type: String,
default: ''
}
})
const show = defineModel({
default: false
})
function copyCode() {
uni.setClipboardData({
data: props.qrcode
})
}
</script>
<style lang="scss">
.copy {
width: 28rpx;
height: 28rpx;
}
</style>

97
components/modal.vue Normal file
View File

@@ -0,0 +1,97 @@
<template>
<view>
<up-popup
:show="show"
mode="center"
:safeAreaInsetBottom="mode === 'bottom' ? true : false"
>
<view class="popup-content">
<view class="top u-flex u-row-between">
<text class="font-bold u-font-32 color-333">{{ title }}</text>
<up-icon size="18" name="close" @click="show = false"></up-icon>
</view>
<up-line></up-line>
<scroll-view style="max-height: 50vh" :scroll-y="true">
<slot></slot>
</scroll-view>
<template v-if="showBottom">
<up-line></up-line>
<view class="bottom">
<view class="btn cancel" @click="close">{{ cancelText }}</view>
<view class="btn success" @click="confirm">{{ confirmText }}</view>
</view>
</template>
</view>
</up-popup>
</view>
</template>
<script setup>
const props = defineProps({
mode: {
type: String,
default: "center",
},
title: {
type: String,
default: "标题",
},
confirmText: {
type: String,
default: "确认",
},
cancelText: {
type: String,
default: "取消",
},
showBottom: {
type: Boolean,
default: true,
},
});
const show = defineModel({
type: Boolean,
default: false,
});
const emits = defineEmits(["close", "confirm"]);
function close() {
show.value = false;
emits("close");
}
function confirm() {
emits("confirm");
}
</script>
<style lang="scss">
.popup-content {
background: #fff;
width: 640rpx;
border-radius: 18rpx;
}
.top {
padding: 40rpx 48rpx;
}
.bottom {
padding: 48rpx 52rpx;
display: flex;
justify-content: space-between;
gap: 50rpx;
.btn {
flex: 1;
text-align: center;
padding: 18rpx 60rpx;
border-radius: 100rpx;
font-size: 32rpx;
border: 2rpx solid transparent;
&.success {
background-color: $my-main-color;
color: #fff;
}
&.cancel {
border-color: $my-main-color;
color: $my-main-color;
}
}
}
</style>

View File

@@ -1,5 +1,5 @@
<template> <template>
<text class="status " :class="returnClass">{{status}}</text> <text class="status " :class="returnClass">{{status}}</text>
</template> </template>
<script setup> <script setup>
@@ -21,7 +21,8 @@ import { computed } from 'vue'
}, },
{ {
name: '待核销', name: '待核销',
value: '' value: '',
class:'warning'
}, },
{ {
name: '已核销', name: '已核销',
@@ -44,14 +45,18 @@ import { computed } from 'vue'
.status { .status {
padding: 8rpx 18rpx; padding: 8rpx 18rpx;
border-radius: 8rpx; border-radius: 8rpx;
border: 2rpx solid transparent; border: 2rpx solid #333;
&.success { &.success {
border-color: rgba(123, 209, 54, 1); border-color: rgba(123, 209, 54, 1);
color: rgba(123, 209, 54, 1); color: rgba(123, 209, 54, 1);
background: rgba(123, 209, 54, 0.12); background: rgba(123, 209, 54, 0.12);
} }
&.warning{
border-color: rgba(255, 141, 40, 1);
color: rgba(255, 141, 40, 1);
background: rgba(255, 141, 40, 0.12);
}
&.error { &.error {
border-color: #FF1C1C; border-color: #FF1C1C;
color: #FF1C1C; color: #FF1C1C;

View File

@@ -0,0 +1,251 @@
<template>
<view class="min-page bg-f7 u-font-28 color-333 u-p-30">
<view class="info">
<view class="goods u-flex u-col-center u-p-t-22 u-p-b-22 u-border-bottom">
<up-image width="158rpx" height="158rpx" radius="14rpx" :src="item.goodsImg"></up-image>
<view class=" u-flex-1 u-p-l-16">
<view class="u-flex u-col-center u-row-between">
<view class="u-flex tuan-members">
<image :src="imgs.pin" class="pin" mode=""></image>
<text class="">{{item.groupPeopleNum}}人团</text>
</view>
</view>
<view class="u-m-t-16 u-flex u-col-center u-row-between">
<view style="max-width: 326rpx;">
<view class="font-bold" v-if="item.wareJson">{{item.wareJson
.wareName}}</view>
<view class="u-flex u-m-t-10 u-col-center ">
<view class="price">
<text class="u-font-30">¥</text>
<text class="u-font-48 font-bold">{{item.groupPrice}} </text>
</view>
<view class="old-price u-m-l-32">
<text>¥</text>
<text>{{item.originalPrice}} </text>
</view>
</view>
</view>
<view class="u-p-l-10 color-333 no-wrap">
数量{{item.number}}
</view>
</view>
</view>
</view>
<view class="shop ">
<view class="u-flex">
<text style="min-width: 180rpx;" class="color-666">可核销门店</text>
<text>{{item.shopName}}</text>
</view>
<view class="u-m-t-32 u-flex">
<text style="min-width: 180rpx;" class="color-666">门店地址</text>
<text>{{item.shopAddress}}</text>
</view>
</view>
<view class="u-m-t-20 u-p-t-28 u-p-b-28">
<view class="u-flex u-row-between u-p-t-20 u-p-b-20">
<text>商品总额</text>
<text class="u-font-32">¥{{totalPayPrice}}</text>
</view>
<view class="u-flex u-row-between u-p-t-20 u-p-b-20">
<text>支付方式</text>
<text class="u-font-32">微信支付</text>
</view>
</view>
</view>
<view style="height: 100px;"></view>
<view class="u-flex bottom">
<view>
<text class="color-666">合计</text>
<text class="price">¥{{totalPayPrice}}</text>
</view>
<view class="btn" @click="payExchange">去支付</view>
</view>
</view>
</template>
<script setup>
import * as Api from '@/common/api/order/gbOrder.js'
import {
pay
} from '@/utils/pay.js'
import {
getOpenId
} from '@/utils/uniapp.js'
const imgs = {
bg: 'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/1/d21f2dfd7bec44618f2d5e4b88372b08.png',
pin: 'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/2/3947892924dd481782331513aff00eb3.png'
}
const item = reactive({})
onShow(() => {
const data = uni.getStorageSync('group_buying_order')
const wareImgs = data.wareImgs.split(',').filter(v => v)
data.goodsImg = wareImgs[0]
Object.assign(item, data)
console.log(item)
})
function dingyue() {
return new Promise((revlove, reject) => {
uni.requestSubscribeMessage({
tmplIds: ['JGPAGmqcPEgWB6mvAl0SC5cMqr5H5Qjcim8JCpHAZd0',
'F4OyUhe_ZQ9BR731jlkaN2QXAUaA3HBZuUeVPfraSz0'
],
success(res) {},
complete() {
revlove()
}
})
})
}
async function payExchange() {
await dingyue();
uni.showLoading({
title: '支付中……'
})
const openId = await getOpenId()
uni.hideLoading()
if (openId) {
Api.exchange({
paramId: item.id,
shopId: item.shopId,
number: item.number,
groupOrderNo: item.groupOrderNo || '',
openId
}).then(orderRes => {
pay(orderRes.payInfo).then(res => {
console.log(res)
if (res) {
uni.redirectTo({
url: '/groupBuying/success/index?detailId=' + orderRes.record
.id + '&shopId=' + orderRes.record.shopId
})
} else {
uni.showToast({
title: '开团失败',
icon: 'none'
})
}
})
})
} else {
uni.showToast({
title: '鉴权失败,开团失败',
icon: 'none'
})
}
}
import {
BigNumber
} from "bignumber.js";
const totalPrice = computed(() => {
if (!item.groupPrice) {
return 0;
}
return BigNumber(item.number).times(item.originalPrice).toNumber()
})
const totalPayPrice = computed(() => {
if (!item.groupPrice) {
return 0;
}
return BigNumber(item.number).times(item.groupPrice).toNumber()
})
let shareItem = null
function share(item) {
shareItem = item
}
onShareAppMessage(() => {
console.log('onShareAppMessage')
console.log(shareItem)
const query = `groupOrderNo=${shareItem.groupOrderNo}&shopId=${shareItem.shopId}`
return wxShare({
title: shareItem.wareJson.wareName,
imageUrl: shareItem.goodsImg,
path: '/groupBuying/detail/index' + '?' + query,
query,
})
})
</script>
<style lang="scss" scoped>
.info {
border-radius: 16rpx;
background-color: #fff;
padding: 0 24rpx;
.goods {
background-color: #fff;
padding: 22rpx 0;
.pin {
width: 60rpx;
height: 38rpx;
}
.tuan-members {
padding: 0 16rpx 0 0;
border-radius: 0 6rpx 6rpx 0;
background: #4C2828;
color: #f5d9ad;
font-weight: 700;
}
.price {
color: #ed5a2e;
}
.old-price {
color: #666666;
text-decoration-line: line-through;
}
}
.u-font-48 {
font-size: 48rpx;
}
.shop {
padding: 22rpx 0;
}
}
.bottom {
padding: 42rpx 28rpx 60rpx 28rpx;
background-color: #fff;
display: flex;
justify-content: space-between;
position: fixed;
left: 0;
bottom: 0;
right: 0;
.price {
color: #ed5a2e;
font-size: 32rpx;
font-weight: 700;
}
.btn {
padding: 14rpx 70rpx;
border-radius: 200rpx;
background: #E8AD7B;
font-size: 32rpx;
color: #fff;
}
}
</style>

View File

@@ -1,13 +1,13 @@
<template> <template>
<view class="min-page bg-f7 color-333 u-font-28 relative"> <view class="min-page bg-f7 color-333 u-font-28 relative">
<view class="top" :style="topStyle"> <view class="top" :style="topStyle">
<up-navbar bg-color="transparent" :fixed="false" :placeholder="false" title="订单详情" left-icon-color="#fff" @leftClick="uni.navigateBack()" <up-navbar bg-color="transparent" :fixed="false" :placeholder="false" title="订单详情" left-icon-color="#fff"
title-color="#fff"></up-navbar> @leftClick="uni.navigateBack()" title-color="#fff"></up-navbar>
<view class="u-flex info u-col-center"> <view class="u-flex info u-col-center">
</view> </view>
</view> </view>
<view class="bottom"> <view class="bottom">
<view class="time"> <view class="time" v-if="item.status=='待成团'">
<text class="color-666">剩余成团时间</text> <text class="color-666">剩余成团时间</text>
<view class="u-font-32"> <view class="u-font-32">
<text class="number">{{returnNum(0)}}</text> <text class="number">{{returnNum(0)}}</text>
@@ -25,7 +25,7 @@
<image :src="imgs.pin" class="pin" mode=""></image> <image :src="imgs.pin" class="pin" mode=""></image>
<text class="">{{item.groupPeopleNum}}人团</text> <text class="">{{item.groupPeopleNum}}人团</text>
</view> </view>
<statusVue></statusVue> <statusVue :status="item.status"></statusVue>
</view> </view>
<view class="u-m-t-16 u-flex u-col-center"> <view class="u-m-t-16 u-flex u-col-center">
@@ -51,7 +51,7 @@
</view> </view>
<view class="refund" v-if="item.status=='待退款'">已申请退款需等待商家审核</view> <view class="refund" v-if="item.status=='待退款'">已申请退款需等待商家审核</view>
<view class="shop-box"> <view class="shop-box" v-if="item.status=='待核销'">
<view class="u-flex u-row-center u-flex-col u-col-center"> <view class="u-flex u-row-center u-flex-col u-col-center">
<up-qrcode :val="item.verifyCode" :size="104"></up-qrcode> <up-qrcode :val="item.verifyCode" :size="104"></up-qrcode>
<view class="u-flex u-m-t-22 u-m-b-18 u-col-center"> <view class="u-flex u-m-t-22 u-m-b-18 u-col-center">
@@ -89,7 +89,7 @@
</view> </view>
<view class="item"> <view class="item" v-if="item.status=='待成团'">
<view class="box"> <view class="box">
<view class="u-flex relative"> <view class="u-flex relative">
<view class="add-box u-flex u-row-center"> <view class="add-box u-flex u-row-center">
@@ -101,7 +101,7 @@
</view> </view>
</view> </view>
</view> </view>
<view class="u-flex u-row-center"> <view class="u-flex u-row-center" v-if="item.status=='待成团'&&!item.id">
<view class="pin-btn">立即参与拼团</view> <view class="pin-btn">立即参与拼团</view>
</view> </view>
</view> </view>
@@ -140,9 +140,17 @@
</view> </view>
</view> </view>
<view style="height: 100px;"></view> <view style="height: 100px;"></view>
<view class="btns"> <view class="btns" v-if="item.id">
<view class="btn" @click="refund(item)">申请退款</view> <template v-if="item.status=='待成团'">
<button open-type="share" class="btn main" @click="share(item)">邀请好友</button> <view class="btn" @click="refund(item)" v-if="canRefund(item)">申请退款</view>
<button open-type="share" class="btn main" @click="share(item)">邀请好友</button>
</template>
<template v-if="item.status=='待核销'">
<view class="btn" @click="refund(item)" v-if="canRefund(item)">申请退款</view>
</template>
<template v-if="item.status=='待退款'">
<view class="btn" @click="cancelRefund(item)">取消退款</view>
</template>
</view> </view>
</view> </view>
</template> </template>
@@ -167,6 +175,15 @@
} }
const canRefundStatus = ['待成团', '待核销']
function canRefund(item) {
if (canRefundStatus.includes(item.status)) {
return true
}
return false
}
const topStyle = { const topStyle = {
backgroundImage: 'url(' + imgs.bg + ')' backgroundImage: 'url(' + imgs.bg + ')'
} }
@@ -251,6 +268,31 @@
}) })
} }
function cancelRefund(item) {
uni.showModal({
title: '提示',
content: '是否取消退款?',
showCancel: true,
success(res) {
if (res.confirm) {
Api.cancelRefund({
recordId: item.id,
orderNo: item.orderNo,
}).then(res => {
if (res) {
uni.showToast({
title: '取消成功'
})
setTimeout(() => {
getDetail()
}, 1000)
}
})
}
}
})
}
let shareItem = null let shareItem = null
function share(item) { function share(item) {
@@ -258,11 +300,13 @@
} }
onShareAppMessage(() => { onShareAppMessage(() => {
console.log('onShareAppMessage') console.log('onShareAppMessage')
console.log(shareItem)
const query = `groupOrderNo=${shareItem.groupOrderNo}&shopId=${shareItem.shopId}`
return wxShare({ return wxShare({
title: shareItem.wareJson.wareName, title: shareItem.wareJson.wareName,
imageUrl: shareItem.goodsImg, imageUrl: shareItem.goodsImg,
query: `detailId=${shareItem.id}&shopId=${shareItem.shopId}`, path: '/groupBuying/detail/index' + '?' + query,
type: 2, query,
}) })
}) })
</script> </script>
@@ -285,7 +329,8 @@
.bottom { .bottom {
margin: 0 28rpx; margin: 0 28rpx;
transform: translateY(-160rpx); transform: translateY(-160rpx);
border-radius: 16rpx;
overflow: hidden;
.time { .time {
padding: 18rpx 24rpx; padding: 18rpx 24rpx;
background: #FFF4E2; background: #FFF4E2;
@@ -310,8 +355,7 @@
.goods { .goods {
background-color: #fff; background-color: #fff;
padding: 22rpx 24rpx 0; padding: 22rpx 24rpx ;
border-radius: 0 0 16rpx 16rpx;
.pin { .pin {
width: 60rpx; width: 60rpx;

View File

@@ -182,6 +182,16 @@
return return
} }
if (step === '+') { if (step === '+') {
if(item.limitBuyNum==-10086){
number.value++
return
}
if(number.value>=item.limitBuyNum){
return uni.showToast({
title:'最多可购买'+item.limitBuyNum+'份',
icon:'none'
})
}
number.value++ number.value++
return return
} }
@@ -234,6 +244,15 @@
} }
async function payExchange() { async function payExchange() {
uni.setStorageSync('group_buying_order', {
...item,
number: number.value,
groupOrderNo: popupData.item ? popupData.item.groupOrderNo : '',
})
uni.navigateTo({
url: '/groupBuying/confirm-order/confirm-order'
})
return
await dingyue(); await dingyue();
uni.showLoading({ uni.showLoading({
title: '支付中……' title: '支付中……'
@@ -244,8 +263,7 @@
Api.exchange({ Api.exchange({
paramId: item.id, paramId: item.id,
shopId: item.shopId, shopId: item.shopId,
number: 1, number: number.value,
price: item.extraPrice,
groupOrderNo: popupData.item ? popupData.item.groupOrderNo : '', groupOrderNo: popupData.item ? popupData.item.groupOrderNo : '',
openId openId
}).then(orderRes => { }).then(orderRes => {
@@ -255,7 +273,7 @@
if (res) { if (res) {
uni.redirectTo({ uni.redirectTo({
url: '/groupBuying/success/index?detailId=' + orderRes.goodsRecord url: '/groupBuying/success/index?detailId=' + orderRes.record
.id .id
}) })
} else { } else {
@@ -400,6 +418,19 @@
onLoad(init) onLoad(init)
// #ifdef MP-WEIXIN
uni.showShareMenu()
// #endif
onShareAppMessage(() => {
const query = `wareId=${item.wareId}&shopId=${item.shopId}`
return wxShare({
title: item.wareJson.wareName,
imageUrl: item.goodsImg,
path: '/groupBuying/detail/index' + '?' + query,
query,
})
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@@ -2,7 +2,7 @@
<view class="min-page bg-f7 u-font-28"> <view class="min-page bg-f7 u-font-28">
<up-sticky :offsetTop="0" :customNavHeight="0"> <up-sticky :offsetTop="0" :customNavHeight="0">
<view class="top" :style="topStyle"> <view class="top" :style="topStyle">
<up-navbar bg-color="transparent" :fixed="false" :placeholder="false" title="拼团特惠" <up-navbar bg-color="transparent" :fixed="false" :placeholder="false" title="拼团特惠" @leftClick="uni.navigateBack()"
left-icon-color="#fff" title-color="#fff"></up-navbar> left-icon-color="#fff" title-color="#fff"></up-navbar>
<view class="u-flex info u-col-center"> <view class="u-flex info u-col-center">
<image :src="imgs.map" class="map"></image> <image :src="imgs.map" class="map"></image>
@@ -57,7 +57,7 @@
<text class="numbers">{{item.groupPeopleNum}}人团</text> <text class="numbers">{{item.groupPeopleNum}}人团</text>
<text class="u-line-1 font-bold u-m-l-18 name">{{item.wareName}}</text> <text class="u-line-1 font-bold u-m-l-18 name">{{item.wareName}}</text>
</view> </view>
<view class="members">已团9999</view> <view class="members">已团{{item.groupedNum}}</view>
<view class="info"> <view class="info">
<view class="left"> <view class="left">
<view class=""> <view class="">
@@ -110,17 +110,30 @@
</view> </view>
</view> </view>
<view class="btns" v-if="showBtns(item)"> <view class="btns" v-if="showBtns(item)">
<view class="btn " @click.stop="refund(item)">申请退款</view> <template v-if="item.status=='待核销'">
<view class="btn " @click.stop="cancelRefund(item)" v-if="item.status=='退款中'">取消退款</view> <view class="btn " @click.stop="lookCode(item)">查看券码</view>
<button open-type="share" class="btn black" @click.stop="share(item)">邀请好友</button> <button class="btn black" @click.stop="refund(item)">申请退款</button>
</template>
<template v-else>
<view class="btn " @click.stop="refund(item)" v-if="canRefund(item)">申请退款</view>
<view class="btn " @click.stop="cancelRefund(item)" v-if="item.status=='退款中'">取消退款</view>
<button open-type="share" class="btn black" @click.stop="share(item)"
v-if="showShare(item)">邀请好友</button>
</template>
</view> </view>
</view> </view>
</view> </view>
<LookQrcode v-model="modalData.show" :qrcode="qrcode"></LookQrcode>
</view> </view>
</template> </template>
<script setup> <script setup>
import LookQrcode from "@/components/look-qrcode/look-qrcode.vue";
import { import {
wxShare wxShare
} from '@/utils/share.js' } from '@/utils/share.js'
@@ -139,6 +152,24 @@
watch watch
} from 'vue' } from 'vue'
const canRefundStatus = ['待成团', '待核销']
function canRefund(item) {
if (canRefundStatus.includes(item.status)) {
return true
}
return false
}
const modalData = reactive({
show: false,
});
const qrcode = ref("");
function lookCode(item) {
qrcode.value = item.verifyCode
modalData.show = true;
}
const imgs = { const imgs = {
bg: 'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/1/d21f2dfd7bec44618f2d5e4b88372b08.png', bg: 'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/1/d21f2dfd7bec44618f2d5e4b88372b08.png',
bg1: 'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/1/604c3f917daa41af9239145196c6d3f3.png', bg1: 'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/1/604c3f917daa41af9239145196c6d3f3.png',
@@ -300,7 +331,7 @@
}) })
} }
function camcelRefund(item) { function cancelRefund(item) {
uni.showModal({ uni.showModal({
title: '提示', title: '提示',
content: '是否取消退款?', content: '是否取消退款?',
@@ -336,11 +367,18 @@
return true return true
} }
function showTime(item) { function showShare(item) {
if (item.status == '已退款') { if (item.status == '待成团') {
return false return true
} }
return true return false
}
function showTime(item) {
if (item.status == '待成团') {
return true
}
return false
} }
@@ -353,11 +391,11 @@
onShareAppMessage(() => { onShareAppMessage(() => {
console.log('onShareAppMessage') console.log('onShareAppMessage')
console.log(shareItem) console.log(shareItem)
const query=`groupOrderNo=${shareItem.groupOrderNo}&shopId=${shareItem.shopId}` const query = `groupOrderNo=${shareItem.groupOrderNo}&shopId=${shareItem.shopId}`
return wxShare({ return wxShare({
title: shareItem.wareJson.wareName, title: shareItem.wareJson.wareName,
imageUrl: shareItem.goodsImg, imageUrl: shareItem.goodsImg,
path:'/groupBuying/detail/index' +'?'+query, path: '/groupBuying/detail/index' + '?' + query,
query, query,
}) })
}) })
@@ -526,6 +564,7 @@
.orderStatus { .orderStatus {
padding: 26rpx 28rpx; padding: 26rpx 28rpx;
justify-content: space-between; justify-content: space-between;
height: 100rpx;
.orderState { .orderState {
color: #999; color: #999;
@@ -558,23 +597,7 @@
line-height: 36rpx; line-height: 36rpx;
} }
.status {
padding: 8rpx 18rpx;
border-radius: 8rpx;
border: 2rpx solid transparent;
&.success {
border-color: rgba(123, 209, 54, 1);
color: rgba(123, 209, 54, 1);
background: rgba(123, 209, 54, 0.12);
}
&.error {
border-color: #FF1C1C;
color: #FF1C1C;
background: rgba(255, 28, 28, 0.18);
}
}
.price { .price {
color: #ED5A2E; color: #ED5A2E;
@@ -632,4 +655,10 @@
} }
} }
} }
.copy {
width: 28rpx;
height: 28rpx;
}
</style> </style>

View File

@@ -1,145 +1,278 @@
<template> <template>
<view class="min-page bg-f7 color-333 u-font-28 relative">
<view class="bottom"> <view>
<view class="u-p-32 u-flex u-row-center u-col-center u-flex-col bg-fff"> <template v-if="item.status=='待核销'">
<image :src="imgs.success" mode="" class="success"></image> <view class="min-page bg-f7 color-333 u-font-28 relative">
<view class="u-font-36 font-bold u-m-t-16">拼团成功</view> <up-navbar bg-color="#F8F8F8" :fixed="true" :placeholder="true" title="支付成功"
</view> @leftClick="uni.navigateBack()"></up-navbar>
<view class="shop "> <view class="bottom">
<view class="u-flex"> <view class="u-p-32 u-flex u-row-center u-col-center u-flex-col bg-fff">
<text style="min-width: 180rpx;" class="color-666">可核销门店</text> <image :src="imgs.success" mode="" class="success-icon"></image>
<text>{{item.shopName}}</text> <view class="u-font-36 font-bold u-m-t-16">拼团成功</view>
</view> </view>
<view class="u-m-t-32 u-flex">
<text style="min-width: 180rpx;" class="color-666">门店地址</text>
<text>{{item.shopAddress}}</text>
</view>
</view>
<view class="shop ">
<view class="goods u-flex u-col-center"> <view class="u-flex">
<up-image width="158rpx" height="158rpx" radius="14rpx" :src="item.goodsImg"></up-image> <text style="min-width: 180rpx;" class="color-666">可核销门店</text>
<view class=" u-flex-1 u-p-l-16"> <text>{{item.shopName}}</text>
<view class="u-flex u-col-center u-row-between"> </view>
<view class="u-flex tuan-members"> <view class="u-m-t-32 u-flex">
<image :src="imgs.pin" class="pin" mode=""></image> <text style="min-width: 180rpx;" class="color-666">门店地址</text>
<text class="">{{item.groupPeopleNum}}人团</text> <text>{{item.shopAddress}}</text>
</view> </view>
</view> </view>
<view class="u-m-t-16 u-flex u-col-center">
<view style="width: 356rpx;">
<view class="font-bold" v-if="item.wareJson">{{item.wareJson <view class="goods u-flex u-col-center">
.wareName}}</view> <up-image width="158rpx" height="158rpx" radius="14rpx" :src="item.goodsImg"></up-image>
<view class="u-flex u-m-t-10 u-col-center "> <view class=" u-flex-1 u-p-l-16">
<view class="price"> <view class="u-flex u-col-center u-row-between">
<text class="u-font-30">¥</text> <view class="u-flex tuan-members">
<text class="u-font-48 font-bold">{{item.payAmount}} </text> <image :src="imgs.pin" class="pin" mode=""></image>
<text class="">{{item.groupPeopleNum}}人团</text>
</view> </view>
<view class="old-price u-m-l-32"> </view>
<text>¥</text> <view class="u-m-t-16 u-flex u-col-center">
<text>{{item.payAmount}} </text> <view style="width: 356rpx;">
<view class="font-bold" v-if="item.wareJson">{{item.wareJson
.wareName}}</view>
<view class="u-flex u-m-t-10 u-col-center ">
<view class="price">
<text class="u-font-30">¥</text>
<text class="u-font-48 font-bold">{{item.payAmount}} </text>
</view>
<view class="old-price u-m-l-32">
<text>¥</text>
<text>{{item.payAmount}} </text>
</view>
</view>
</view>
<view class="u-p-l-16 color-333">
数量{{item.num}}
</view> </view>
</view> </view>
</view> </view>
<view class="u-p-l-16 color-333">
数量{{item.num}}
</view>
</view> </view>
</view>
</view>
<view class="shop-box" v-if="false"> <view class="members">
<view class="u-flex u-row-center u-flex-col u-col-center"> <view class="list">
<up-qrcode :val="item.verifyCode" :size="104"></up-qrcode> <view class="item" v-for="(user,index) in item.users" :key="index">
<view class="u-flex u-m-t-22 u-m-b-18 u-col-center"> <view class="box">
<text>{{item.verifyCode}}</text> <view class="u-flex relative">
<image @click="copyText(item.verifyCode)" class="copy" src="/groupBuying/static/image/copy.png"> <up-avatar size="140rpx" :src="user.userAvatar"></up-avatar>
</image> <view class="u-flex u-row-center absolute">
</view> <text class="tuanzhang" v-if="index==0">团长</text>
</view> </view>
</view>
</view> <view class="u-line-1 u-m-t-16 color-000 text-center">{{user.userName}}</view>
<view class="members">
<view class="list">
<view class="item" v-for="(user,index) in item.users" :key="index">
<view class="box">
<view class="u-flex relative">
<up-avatar size="140rpx" :src="user.userAvatar"></up-avatar>
<view class="u-flex u-row-center absolute">
<text class="tuanzhang" v-if="index==0">团长</text>
</view> </view>
</view> </view>
<view class="u-line-1 u-m-t-16 color-000 text-center">{{user.userName}}</view>
</view>
</view> <view class="item" v-if="false">
<view class="box">
<view class="item" v-if="false"> <view class="u-flex relative">
<view class="box"> <view class="add-box u-flex u-row-center">
<view class="u-flex relative"> <up-icon color="#D9D9D9" name="plus"></up-icon>
<view class="add-box u-flex u-row-center"> <button open-type="share" class="share" @click="share(item)">分享</button>
<up-icon color="#D9D9D9" name="plus"></up-icon> </view>
<button open-type="share" class="share" @click="share(item)">分享</button> </view>
<view class="u-line-1 u-m-t-16 color-000 text-center">等待参团</view>
</view> </view>
</view> </view>
<view class="u-line-1 u-m-t-16 color-000 text-center">等待参团</view>
</view>
</view>
</view>
<view class="order">
<view class="u-flex u-row-between">
<view class="font-bold u-font-32">订单信息</view>
<view class="u-flex color-666" @click="showOrder=!showOrder" style="align-items: baseline;">
<text class="u-m-r-18">{{showOrder?'收起':'展开'}}</text>
<view class="guodu" :class="{rotate:!showOrder}">
<up-icon name="arrow-down" bold></up-icon>
</view>
</view> </view>
</view> </view>
<view class="u-m-t-16" v-if="showOrder">
<view class="u-flex u-row-between item">
<view class="color-666">商品总额</view>
<view class="">¥99.99</view>
</view>
<view class="u-flex u-row-between item">
<view class="color-666">实付金额</view>
<view class="">¥{{item.payAmount}}</view>
</view>
<view class="u-flex u-row-between item">
<view class="color-666">订单号</view>
<view class="">{{item.orderNo}}</view>
</view>
<view class="u-flex u-row-between item">
<view class="color-666">支付时间</view>
<view class="">{{item.payTime}}</view>
</view>
</view>
</view> </view>
<view style="height: 100px;"></view>
<view class="btns">
<view class="btn" @click="toPinIndex">继续拼团</view>
<button class="btn main" @click="toOrderDetail(item)">查看订单</button>
</view>
</view> </view>
</template>
<template v-if="item.status=='待成团'">
</view> <view class="min-page bg-f7 color-333 u-font-28 relative">
<view class="top" :style="topStyle">
<view class="order"> <up-navbar bg-color="transparent" :fixed="false" :placeholder="false" title="订单详情"
<view class="u-flex u-row-between"> left-icon-color="#fff" @leftClick="uni.navigateBack()" title-color="#fff"></up-navbar>
<view class="font-bold u-font-32">订单信息</view> <view class="u-flex info u-col-center">
<view class="u-flex color-666" @click="showOrder=!showOrder" style="align-items: baseline;">
<text class="u-m-r-18">{{showOrder?'收起':'展开'}}</text>
<view class="guodu" :class="{rotate:!showOrder}">
<up-icon name="arrow-down" bold></up-icon>
</view> </view>
</view> </view>
<view class="bottom bottom1">
<view class="time" v-if="item.status=='待成团'">
<text class="color-666">剩余成团时间</text>
<view class="u-font-32">
<text class="number">{{returnNum(0)}}</text>
<text class="gap"></text>
<text class="number">{{returnNum(1)}}</text>
<text class="gap"></text>
<text class="number">{{returnNum(2)}}</text>
</view>
</view>
<view class="goods u-flex u-col-center">
<up-image width="158rpx" height="158rpx" radius="14rpx" :src="item.goodsImg"></up-image>
<view class=" u-flex-1 u-p-l-16">
<view class="u-flex u-col-center u-row-between">
<view class="u-flex tuan-members">
<image :src="imgs.pin" class="pin" mode=""></image>
<text class="">{{item.groupPeopleNum}}人团</text>
</view>
<statusVue :status="item.status"></statusVue>
</view>
<view class="u-m-t-16 u-flex u-col-center u-row-between">
<view style="max-width: 356rpx;">
<view class="font-bold" v-if="item.wareJson">{{item.wareJson
.wareName}}</view>
<view class="u-flex u-m-t-10 u-col-center ">
<view class="price">
<text class="u-font-30">¥</text>
<text class="u-font-48 font-bold">{{item.payAmount}} </text>
</view>
<view class="old-price u-m-l-32">
<text>¥</text>
<text>{{item.payAmount}} </text>
</view>
</view>
</view>
<view class="u-p-l-16 color-333 no-wrap">
数量{{item.num}}
</view>
</view>
</view>
</view>
<view class="shop-box">
<view class="shop ">
<view class="u-flex">
<text style="min-width: 180rpx;" class="color-666">可核销门店</text>
<text>{{item.shopName}}</text>
</view>
<view class="u-m-t-32 u-flex">
<text style="min-width: 180rpx;" class="color-666">门店地址</text>
<text>{{item.shopAddress}}</text>
</view>
</view>
</view>
<view class="members">
<view class="list">
<view class="item" v-for="(user,index) in item.users" :key="index">
<view class="box">
<view class="u-flex relative">
<up-avatar size="140rpx" :src="user.userAvatar"></up-avatar>
<view class="u-flex u-row-center absolute">
<text class="tuanzhang" v-if="index==0">团长</text>
</view>
</view>
<view class="u-line-1 u-m-t-16 color-000 text-center">{{user.userName}}</view>
</view>
</view>
<view class="item">
<view class="box">
<view class="u-flex relative">
<view class="add-box u-flex u-row-center">
<up-icon color="#D9D9D9" name="plus"></up-icon>
<button open-type="share" class="share" @click="share(item)">分享</button>
</view>
</view>
<view class="u-line-1 u-m-t-16 color-000 text-center">等待参团</view>
</view>
</view>
</view>
<view class="u-flex u-row-center" v-if="item.status=='待成团'">
<view class="pin-btn" >邀请好友参团
<button open-type="share" class="share">邀请好友参团</button>
</view>
</view>
</view>
<view class="order">
<view class="u-flex u-row-between">
<view class="font-bold u-font-32">订单信息</view>
<view class="u-flex color-666" @click="showOrder=!showOrder" style="align-items: baseline;">
<text class="u-m-r-18">{{showOrder?'收起':'展开'}}</text>
<view class="guodu" :class="{rotate:!showOrder}">
<up-icon name="arrow-down" bold></up-icon>
</view>
</view>
</view>
<view class="u-m-t-16" v-if="showOrder">
<view class="u-flex u-row-between item">
<view class="color-666">商品总额</view>
<view class="">¥99.99</view>
</view>
<view class="u-flex u-row-between item">
<view class="color-666">实付金额</view>
<view class="">¥{{item.payAmount}}</view>
</view>
<view class="u-flex u-row-between item">
<view class="color-666">订单号</view>
<view class="">{{item.orderNo}}</view>
</view>
<view class="u-flex u-row-between item">
<view class="color-666">支付时间</view>
<view class="">{{item.payTime}}</view>
</view>
</view>
</view>
</view>
</view> </view>
</template>
<view class="u-m-t-16" v-if="showOrder">
<view class="u-flex u-row-between item">
<view class="color-666">商品总额</view>
<view class="">¥99.99</view>
</view>
<view class="u-flex u-row-between item">
<view class="color-666">实付金额</view>
<view class="">¥{{item.payAmount}}</view>
</view>
<view class="u-flex u-row-between item">
<view class="color-666">订单号</view>
<view class="">{{item.orderNo}}</view>
</view>
<view class="u-flex u-row-between item">
<view class="color-666">支付时间</view>
<view class="">{{item.payTime}}</view>
</view>
</view>
</view>
<view style="height: 100px;"></view>
<view class="btns">
<view class="btn" @click="uni.navigateBack()">继续拼团</view>
<button open-type="share" class="btn main" @click="toOrderDetail(item)">查看订单</button>
</view>
</view> </view>
</template> </template>
<script setup> <script setup>
@@ -156,6 +289,11 @@
getRemainingHMS getRemainingHMS
} from '@/utils/countdown.js' } from '@/utils/countdown.js'
function toPinIndex() {
uni.redirectTo({
url: '/groupBuying/index/index'
})
}
const imgs = { const imgs = {
bg: 'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/1/d21f2dfd7bec44618f2d5e4b88372b08.png', bg: 'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/1/d21f2dfd7bec44618f2d5e4b88372b08.png',
pin: 'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/2/3947892924dd481782331513aff00eb3.png', pin: 'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/2/3947892924dd481782331513aff00eb3.png',
@@ -241,10 +379,13 @@
onShareAppMessage(() => { onShareAppMessage(() => {
console.log('onShareAppMessage') console.log('onShareAppMessage')
console.log(item)
const query = `groupOrderNo=${item.groupOrderNo}&shopId=${item.shopId}`
return wxShare({ return wxShare({
title: shareItem.wareJson.wareName, title: item.wareJson.wareName,
imageUrl: shareItem.goodsImg, imageUrl: item.goodsImg,
query: `detailId=${shareItem.id}&shopId=${shareItem.shopId}`, path: '/groupBuying/detail/index' + '?' + query,
query,
}) })
}) })
@@ -322,7 +463,7 @@
.old-price { .old-price {
color: #666666; color: #666666;
text-decoration-line: line-through; text-decoration-line: line-through;
} }
} }
@@ -461,6 +602,16 @@
background: #E8AD7B; background: #E8AD7B;
color: #fff; color: #fff;
margin-top: 32rpx; margin-top: 32rpx;
position: relative;
.share {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
opacity: 0;
}
} }
.rotate { .rotate {
@@ -486,7 +637,7 @@
margin-bottom: 32rpx; margin-bottom: 32rpx;
} }
.success { .success-icon {
width: 102rpx; width: 102rpx;
height: 102rpx; height: 102rpx;
} }
@@ -494,4 +645,162 @@
.bg-fff { .bg-fff {
background-color: #fff; background-color: #fff;
} }
.bottom1 {
margin: 0 28rpx;
padding: 0;
transform: translateY(-160rpx);
background-color: transparent;
.time {
padding: 18rpx 24rpx;
background: #FFF4E2;
display: flex;
align-items: center;
border-radius: 16rpx 16rpx 0 0;
.number {
padding: 6rpx;
border-radius: 16rpx;
background: #ED5A2E;
color: #fff;
font-size: 32rpx;
margin-left: 18rpx;
margin-right: 18rpx;
}
.gap {
font-size: 32rpx;
}
}
.goods {
background-color: #fff;
padding: 32rpx 24rpx 0;
border-radius: 0;
margin-top: 0;
.pin {
width: 60rpx;
height: 38rpx;
}
.tuan-members {
padding: 0 16rpx 0 0;
border-radius: 0 6rpx 6rpx 0;
background: #4C2828;
color: #f5d9ad;
font-weight: 700;
}
.price {
color: #ed5a2e;
}
.old-price {
color: #666666;
}
}
.u-font-48 {
font-size: 48rpx;
}
.shop-box {
background: #fff;
padding: 32rpx 30rpx 28rpx 30rpx;
border-radius: 0 0 16rpx 16rpx;
}
.copy {
width: 22rpx;
height: 22rpx;
margin-left: 22rpx;
}
.shop {
border-radius: 8rpx;
background: #F8F8F8;
padding: 16rpx 34rpx;
}
.relative {
position: relative;
}
.members {
padding: 26rpx 24rpx;
border-radius: 16rpx;
margin-top: 32rpx;
background-color: #fff;
.list {
display: flex;
}
.item {
width: calc(100% / 3);
display: flex;
.add-box {
width: 140rpx;
height: 140rpx;
border: 2rpx dashed #D9D9D9;
border-radius: 50%;
overflow: hidden;
position: relative;
.share {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
opacity: 0;
}
}
&:nth-of-type(2n) {
justify-content: center;
}
&:nth-of-type(3n) {
justify-content: flex-end;
}
.box {
display: flex;
flex-direction: column;
}
.absolute {
bottom: 0;
display: flex;
justify-content: center;
left: 0;
right: 0;
}
.tuanzhang {
padding: 8rpx 18rpx;
border-radius: 20rpx;
background: #ED5A2E;
color: #fff;
bottom: 0;
}
}
}
.order {
padding: 32rpx 28rpx;
border-radius: 16rpx;
margin: 0;
margin-top: 32rpx;
background-color: #fff;
.item {
padding: 16rpx 0;
}
}
}
</style> </style>

View File

@@ -386,7 +386,14 @@
{ {
"path": "success/index", "path": "success/index",
"style": { "style": {
"navigationBarTitleText": "支付成功" "navigationBarTitleText": "支付成功",
"navigationStyle": "custom"
}
},
{
"path": "confirm-order/confirm-order",
"style": {
"navigationBarTitleText": "确认订单"
} }
} }

View File

@@ -50,7 +50,7 @@
<image :src="imgs.big_orderFood" class="big_img"></image> <image :src="imgs.big_orderFood" class="big_img"></image>
</view> </view>
<view class="groupBuying" v-if="allConfig.group" @click="toGroupBuying"> <view class="groupBuying" @click="toGroupBuying">
<view class="u-flex u-col-center"> <view class="u-flex u-col-center">
<image class="img" :src="imgs.groupBuying"></image> <image class="img" :src="imgs.groupBuying"></image>
<view class="u-font-32 color-333 font-700 u-m-l-12">快乐拼单</view> <view class="u-font-32 color-333 font-700 u-m-l-12">快乐拼单</view>
@@ -58,9 +58,10 @@
<view class="u-font-28 color-999">一键分享快速拼单</view> <view class="u-font-28 color-999">一键分享快速拼单</view>
</view> </view>
</view> </view>
<view class="points" @click="toIntegralMall" v-if="allConfig.pointsMall"> <view class="points" @click="toIntegralMall" >
<view> <view>
<view class="title">积分乐园</view> <view class="title">积分乐园</view>
<view class="desc">好物兑换 畅花积分</view> <view class="desc">好物兑换 畅花积分</view>
@@ -79,7 +80,7 @@
<view class="title">充值</view> <view class="title">充值</view>
<view class="desc">充值享更多优惠</view> <view class="desc">充值享更多优惠</view>
</view> </view>
<view class="item" @click="toFenxiao" v-if="allConfig.distribution"> <view class="item" @click="toFenxiao">
<image :src="imgs.share" class="img"></image> <image :src="imgs.share" class="img"></image>
<view class="title">股东共享</view> <view class="title">股东共享</view>
<view class="desc">邀请好友获得佣金</view> <view class="desc">邀请好友获得佣金</view>