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

312 lines
7.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">
<!-- 提示信息区域 -->
<view class="tips-section">
<view class="tip-item">
<view class="tip-icon">!</view>
<text class="tip-text">取号后请留意微信消息提醒</text>
</view>
<view class="tip-item">
<view class="tip-icon">!</view>
<text class="tip-text">听到叫号请尽快进场,过号10分钟后自动取消排队</text>
</view>
</view>
<!-- 桌型选择区域 -->
<view class="table-selection">
<view class="section-title">请选择卡座类型</view>
<view class="table-cards">
<view
v-for="(item,index) in tableData" :key="index"
class="table-card"
:class="{ 'selected': selectedTable === index }"
@click="selectTable(item,index)">
<view class="table-info">
<view class="table-name">{{item.name}}</view>
<view class="table-desc">可取号时间:{{item.startTime + '~' + item.endTime}}</view>
<view class="table-desc" style="flex-wrap: wrap;width: 400rpx;">{{item.description == null ? '--' : item.description}}</view>
</view>
<view class="wait-info">
<view class="wait-text">等待{{item.totalWaitCount}}桌,约{{item.totalWaitTime}}分钟</view>
</view>
</view>
</view>
</view>
<!-- 取号按钮 -->
<view class="action-section">
<button class="get-number-btn" @click="getNumber">立即取号</button>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
bgc: {
backgroundColor: "#010000",
},
selectedTable: '-1', // 默认选中大桌
tableData: [],
itemobj:{}
}
},
onLoad() {
},
onShow() {
this.getlist()
},
methods: {
// 请求排队队伍列表
getlist(){
this.$u.get(`/app/queueTeam/list?storeId=${this.$store.state.storeId}`).then(res => {
if (res.code == 200) {
this.tableData = res.data
}else if(res.code == 401){
uni.showModal({
title: '提示',
content: '你还未登录,是否去登录?',
success: function (res) {
if (res.confirm) {
console.log('用户点击确定')
uni.reLaunch({
url:'/pages/login/login'
})
} else if (res.cancel) {
console.log('用户点击取消')
uni.switchTab({
url:'/pages/index/index'
})
}
}
})
}
})
},
selectTable(item,index) {
this.selectedTable = index
this.itemobj = item
},
getNumber() {
if (this.selectedTable == '-1') {
uni.showToast({
title: '请选择桌型',
icon: 'none',
duration:3000
})
return
}
// 先请求通知权限,权限获取成功后再取号
this.requestNotifyPermission()
},
// 请求通知权限
requestNotifyPermission() {
try {
wx.requestSubscribeMessage({
tmplIds: ['SIDHHiiYNogQWa8JUj-RYXsIccqHfPY9cJYm9vKGfic'],
success: (res) => {
console.log('subscribe success:', res)
if (res['SIDHHiiYNogQWa8JUj-RYXsIccqHfPY9cJYm9vKGfic'] === 'accept') {
uni.showToast({ title: '通知权限获取成功', icon: 'success' })
// 权限获取成功后直接执行取号流程
setTimeout(() => {
this.proceedWithGetNumber()
}, 1000)
} else {
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' })
}
},
// 执行取号流程
proceedWithGetNumber() {
let that = this
uni.showModal({
title: '确认取号',
content: `您选择了${that.itemobj.name},是否确认取号?`,
success: (res) => {
if (res.confirm) {
let data = {
storeId:that.$store.state.storeId,
queueTeamId:that.itemobj.id
}
this.$u.post(`/app/queueUser/takeNumber`,data).then(res => {
if (res.code == 200) {
uni.showToast({
title: '取号成功',
icon: 'success',
duration:3000
})
setTimeout(()=>{
uni.navigateTo({
url:'/page_shanghu/paidui/hexiao?id=' + res.data
})
},1500)
}else{
uni.showToast({
title: res.msg,
icon: 'none',
duration:3000
})
}
})
}
}
})
}
}
}
</script>
<style lang="scss">
page {
background: #010000;
}
.container {
padding: 20rpx;
// min-height: 100vh;
}
.tips-section {
margin-bottom: 40rpx;
.tip-item {
display: flex;
align-items: center;
margin-bottom: 20rpx;
.tip-icon {
width: 32rpx;
height: 32rpx;
border-radius: 50%;
background: #FF8998;
color: #fff;
display: flex;
align-items: center;
justify-content: center;
font-size: 20rpx;
font-weight: bold;
margin-right: 16rpx;
flex-shrink: 0;
}
.tip-text {
color: #fff;
font-size: 28rpx;
line-height: 1.5;
}
}
}
.table-selection {
margin-bottom: 60rpx;
.section-title {
color: #fff;
font-size: 32rpx;
font-weight: bold;
margin-bottom: 30rpx;
}
.table-cards {
.table-card {
background: #2a2f3f;
border-radius: 16rpx;
padding: 30rpx;
margin-bottom: 20rpx;
display: flex;
justify-content: space-between;
align-items: center;
transition: all 0.3s ease;
&.selected {
background: #FF8998;
}
.table-info {
.table-name {
color: #fff;
font-size: 32rpx;
font-weight: bold;
margin-bottom: 8rpx;
}
.table-desc {
color: rgba(255, 255, 255, 0.8);
font-size: 26rpx;
}
}
.wait-info {
.wait-text {
color: #fff;
font-size: 26rpx;
}
}
}
}
}
.action-section {
position: fixed;
bottom: 40rpx;
left: 20rpx;
right: 20rpx;
.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;
}
.get-number-btn {
width: 100%;
height: 88rpx;
background: #FF8998;
color: #fff;
border: none;
border-radius: 44rpx;
font-size: 32rpx;
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s ease;
&:active {
background: darken(#FF8998, 10%);
}
}
}
</style>