baodeng_xcx/page_shanghu/paidui/hexiao.vue
2025-08-19 17:02:49 +08:00

396 lines
9.0 KiB
Vue

<template>
<view class="page">
<u-navbar title="取号详情" :border-bottom="false" :background="bgc" back-icon-color="#fff" title-color='#fff'
title-size='36' height='36' id="navbar">
</u-navbar>
<view class="container" v-if="ewmflag == false">
<view class="success-card">
<!-- 顶部装饰边框 -->
<view class="top-border"></view>
<!-- 成功标题 -->
<view class="success-header">
<view class="success-title">排队成功</view>
<view class="success-subtitle">您的卡座由门店安排!</view>
<view class="menu-dots" @click="btnsx">
<image src="https://api.ccttiot.com/smartmeter/img/static/uCoMmvJBs6ZxTEV70231" mode=""></image>
</view>
</view>
<!-- 排队信息 -->
<view class="queue-info">
<view class="info-item">
<text class="label">我的号码</text>
<text class="value highlight">{{queueData.number}}</text>
</view>
<view class="info-item">
<text class="label">号码状态</text>
<text class="value highlight" v-if="queueData.status == 1">待叫号</text>
<text class="value highlight" v-if="queueData.status == 2">叫号中</text>
<text class="value highlight" v-if="queueData.status == 3">已核销</text>
<text class="value highlight" v-if="queueData.status == 4">已过号</text>
<text class="value highlight" v-if="queueData.status == 5">已失效</text>
</view>
<view class="info-item">
<text class="label">还需等待</text>
<text class="value">{{queueData.totalWaitCount == undefined ? '--' : queueData.totalWaitCount}}桌</text>
</view>
<view class="info-item">
<text class="label">预估等待</text>
<text class="value">{{queueData.totalWaitTime == undefined ? '--' : queueData.totalWaitTime}}分钟</text>
</view>
<view class="info-item">
<text class="label">取号时间</text>
<text class="value">{{queueData.createTime}}</text>
</view>
</view>
<!-- 底部按钮 -->
<view class="bottom-buttons">
<button class="btn btn-share" @click="cancelQueue">
取消排队
</button>
<button class="btn btn-verify" @click="verifyQueue">
核销排队
</button>
</view>
<!-- <button class="notify-btn" @click="openNotify">开启消息通知</button> -->
</view>
</view>
<view class="imgewm" v-if="ewmflag == true">
<view class="" style="width: 100%;text-align: center;font-size: 30rpx;color: #fff;margin-bottom: 50rpx;">
请出示核销码给商户核销
</view>
<canvas canvas-id="qrcode" style="height: 100%;margin: 0 auto;" />
<!-- <view class="" style="width: 100%;text-align: center;margin-top: 20rpx;color: #fff;">
核销码:{{hxma}}
</view> -->
<view class="btn"
@click="ewmflag = false">
关闭
</view>
</view>
</view>
</template>
<script>
import uQRCode from '@/common/uqrcode.js'
export default {
data() {
return {
bgc: {
backgroundColor: "#000",
},
queueData: {},
id:'',
ewmflag:false,
hxma:''
}
},
onLoad(option) {
this.id = option.id
this.getQueueInfo()
this.gethx()
},
methods: {
// 开启消息通知(订阅消息授权)
openNotify() {
try {
wx.requestSubscribeMessage({
tmplIds: ['SIDHHiiYNogQWa8JUj-RYXsIccqHfPY9cJYm9vKGfic'],
success: (res) => {
console.log('subscribe success:', res)
uni.showToast({ title: '已提交授权', icon: 'none' })
},
fail: (err) => {
console.log('subscribe fail:', err)
uni.showToast({ title: '授权失败,请稍后重试', icon: 'none' })
}
})
} catch (e) {
console.log('subscribe error:', e)
uni.showToast({ title: '当前环境不支持订阅消息', icon: 'none' })
}
},
// 获取核销码
gethx(){
this.$u.post(`/app/queueUser/generateCode/${this.id}`).then(res => {
if (res.code == 200) {
this.hxma = res.data.verificationCode
}
})
},
// 获取排队信息
getQueueInfo(queueId) {
this.$u.get(`/app/queueUser/getDetail?storeId=${this.$store.state.storeId}&id=${this.id}`).then(res => {
if (res.code == 200) {
this.queueData = res.data
}
})
},
// 点击刷新
btnsx(){
uni.showLoading({
title: '加载中...',
mask: true
})
this.$u.get(`/app/queueUser/getDetail?storeId=${this.$store.state.storeId}&id=${this.id}`).then(res => {
if (res.code == 200) {
this.queueData = res.data
uni.hideLoading()
uni.showToast({
title: '刷新成功',
icon: 'success',
duration: 2000
})
}
})
},
// 取消排号
cancelQueue() {
let that = this
uni.showModal({
title: '提示',
content: '确定要取消排号吗?',
success: (res) => {
if (res.confirm) {
that.$u.post(`/app/queueUser/cancelQueue/${this.id}`).then(res => {
if (res.code == 200) {
uni.showToast({
title: '取消成功',
icon: 'success'
});
setTimeout(() => {
uni.navigateBack();
}, 1500);
}
})
}
}
});
},
// 分享给好友
shareToFriends() {
uni.showShareMenu({
withShareTicket: true,
menus: ['shareAppMessage', 'shareTimeline']
});
},
// 核销排队
verifyQueue() {
let that = this
uni.showModal({
title: '核销确认',
content: '确定要核销当前排队吗?',
success: (res) => {
if (res.confirm) {
that.ewmflag = true
that.qrFun()
}
}
});
},
qrFun: function() {
this.ewmflag = true
uQRCode.make({
canvasId: 'qrcode',
text: 'https://wx.ccttiot.com/b/v?h=' + this.hxma + '&id=' + this.id,
size: 300,
margin: 0,
backgroundColor: '#ffffff',
foregroundColor: '#000000',
fileType: 'jpg',
errorCorrectLevel: uQRCode.errorCorrectLevel.H,
})
},
}
}
</script>
<style lang="scss">
page {
background: #0c0c0c;
}
.notify-btn {
width: 100%;
height: 80rpx;
background: transparent;
color: #FF8998;
border: 2rpx solid #FF8998;
border-radius: 40rpx;
font-size: 28rpx;
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20rpx;
margin-top: 50rpx;
}
.btn{
width:300rpx;
height: 94rpx;
background: #FF8998;
border-radius: 47rpx 47rpx 47rpx 47rpx;
font-size: 36rpx;
color: #fff;
text-align: center;
margin: auto;
line-height: 94rpx;
}
.imgewm {
width: 700rpx;
height:800rpx;
margin: auto;
margin-top: 104rpx;
z-index: 2;
background-color: #1C1C1E;
padding-top: 50rpx;
border-radius: 30rpx;
}
.container {
padding: 20rpx;
height: 91vh;
background: #000;
position: relative;
&::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-image:
linear-gradient(rgba(255,255,255,0.05) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,0.05) 1px, transparent 1px);
background-size: 20px 20px;
pointer-events: none;
}
}
.success-card {
background: #1a1a1a;
border-radius: 20rpx;
padding: 40rpx 30rpx;
margin: 20rpx;
position: relative;
min-height: 50vh;
display: flex;
flex-direction: column;
.top-border {
position: absolute;
top: 0;
left: 0;
right: 0;
height: 8rpx;
background: #FF8998;
border-radius: 20rpx 20rpx 0 0;
}
}
.success-header {
position: relative;
margin-bottom: 60rpx;
.success-title {
font-size: 48rpx;
font-weight: bold;
color: #fff;
margin-bottom: 10rpx;
}
.success-subtitle {
font-size: 28rpx;
color: rgba(255,255,255,0.8);
}
.menu-dots {
position: absolute;
top: 0;
right: 0;
display: flex;
flex-direction: column;
gap: 6rpx;
image{
width: 50rpx;
height: 50rpx;
}
.dot {
width: 8rpx;
height: 8rpx;
background: #FF8998;
border-radius: 50%;
}
}
}
.queue-info {
flex: 1;
margin-bottom: 60rpx;
.info-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20rpx 0;
border-bottom: 1rpx solid rgba(255,255,255,0.1);
&:last-child {
border-bottom: none;
}
.label {
font-size: 28rpx;
color: rgba(255,255,255,0.7);
}
.value {
font-size: 32rpx;
color: #fff;
font-weight: 500;
&.highlight {
color: #FF8998;
font-weight: bold;
}
}
}
}
.cancel-link {
text-align: center;
color: rgba(255,255,255,0.8);
font-size: 28rpx;
text-decoration: underline;
margin-bottom: 60rpx;
padding: 20rpx 0;
}
.bottom-buttons {
display: flex;
gap: 30rpx;
margin-top: auto;
.btn {
flex: 1;
height: 80rpx;
line-height: 80rpx;
border-radius: 40rpx;
font-size: 28rpx;
font-weight: 500;
border: none;
margin-top: 30rpx;
&.btn-share {
background: transparent;
color: #fff;
border: 2rpx solid #fff;
}
&.btn-verify {
background: #FF8998;
color: #fff;
}
}
}
</style>