Files
cashier/fuintUniapp/pages/book/detail.vue
砂糖 8015759c65 init
2026-02-07 18:01:13 +08:00

241 lines
8.1 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="content">
<view class="top-v" v-show="storeInfo"><text class="storeName">预约【{{ storeInfo.name }}】</text><text class="moreStore" @click="toMoreStore">切换门店</text></view>
<view class="info-v">
<view class="title">
请选择预约日期
</view>
<view v-if="dateArr && dateArr.length > 0" class="list-v">
<view @click="dateClick(index)" v-for="(item, index) in dateArr" :key="index" :class="[dateIndex==index?'activeItem':'item-v']">
<view>{{item.week}}</view>
<view>{{ item.date }}</view>
</view>
</view>
<none v-if="!dateArr.length" :isLoading="false" :custom-style="{ padding: '30px 10px' }" tips="暂无可预约日期"></none>
</view>
<view class="info-v">
<view class="title">
请选择预约时段
</view>
<view v-if="timeArr && timeArr.length > 0" class="list-v">
<view @click="timeClick(index)" v-for="(item, index) in timeArr" :key="index" :class="[timeIndex==index?'activeItem' : (bookable.indexOf(item.time) >= 0 ? 'item-v' : 'disable') ]">
<view>{{ item.time }}</view>
</view>
</view>
<none v-if="!timeArr.length" :isLoading="false" :custom-style="{ padding: '30rpx 10rpx' }" tips="暂无可预约时段"></none>
</view>
<view class="btn" @click="doSubmit">确定预约</view>
</view>
</template>
<script>
import * as BookApi from '@/api/book'
import * as SettingApi from '@/api/setting'
import None from '@/components/none'
export default {
components: {
None
},
data() {
return {
// 预约项目ID
bookId: null,
// 当前预约详情
bookInfo: null,
dateArr: [ { week: '星期六', date : '8月17号' }, { week: '星期日', date : '8月18号' }],
timeArr: [ '09:00-12:00', '14:00-15:00' ],
dateIndex: 0,
timeIndex: 100000,
storeInfo: null,
bookable: [],
isCheck: false
}
},
onLoad(options) {
// 记录预约ID
this.bookId = options.bookId;
// 获取预约详情
this.getBookDetail();
},
onShow() {
uni.removeStorageSync('bookData');
this.getStoreInfo();
this.dateIndex = 0;
this.timeIndex = 100000;
},
methods: {
// 获取预约项目详情
getBookDetail() {
const app = this;
app.isLoading = true;
BookApi.detail(app.bookId)
.then(result => {
app.bookInfo = result.data.bookInfo;
app.dateArr = app.bookInfo.dateList;
app.timeArr = app.bookInfo.timeList;
app.dateClick(app.dateIndex);
})
.finally(() => app.isLoading = false)
},
// 切换门店
toMoreStore() {
this.$navTo('pages/location/index');
},
// 获取店铺详情
getStoreInfo() {
const app = this;
SettingApi.storeDetail()
.then(result => {
app.storeInfo = result.data.storeInfo;
})
},
// 确定预约
doSubmit() {
let app = this;
if (!app.isCheck) {
app.$toast("请选择预约时间!");
return false;
}
uni.showModal({
title: '提示',
content: '确定预约【'+app.storeInfo.name+'】吗?',
success: function (res) {
if (res.confirm) {
let dates = app.bookInfo.serviceDates.split(",");
let week = app.dateArr[app.dateIndex].week;
let data = { bookId: app.bookId, week: week, date : dates[app.dateIndex], time: app.timeArr[app.timeIndex].time };
uni.setStorageSync('bookData', data);
app.$navTo('pages/book/submit');
}
}
});
},
// 选择时段
timeClick(index) {
const app = this;
if (app.bookable.indexOf(app.timeArr[index].time) < 0) {
return false;
}
app.timeIndex = index;
app.isCheck = true;
},
// 选择日期
dateClick(index) {
const app = this;
app.dateIndex = index;
app.timeIndex = 100000;
let dates = app.bookInfo.serviceDates.split(",");
let times = app.timeArr;
BookApi.bookable({ bookId: app.bookId, date: dates[app.dateIndex], time: '' })
.then(result => {
if (result.data) {
app.bookable = result.data;
} else {
app.bookable = [];
}
})
}
}
}
</script>
<style lang="scss" scoped>
.content {
.top-v {
margin: 20rpx;
.storeName {
font-weight: bold;
font-size: 32rpx;
}
.moreStore {
float: right;
color: $fuint-theme;
border: 1rpx solid $fuint-theme;
padding: 6rpx;
border-radius: 20rpx;
font-size: 24rpx;
}
}
padding-bottom: 50rpx;
}
.getInfo-v {
background-color: #fff;
padding: 50rpx 30rpx;
border-radius: 20rpx;
width: 600rpx;
.getInfo-btn{
background-color: $fuint-theme;
color: #fff;
padding: 20rpx;
border-radius: 10rpx;
margin-top: 30rpx;
text-align: center;
}
}
.btn {
margin: 20rpx auto;
background-color: $fuint-theme;
padding: 20rpx;
border-radius: 40rpx;
text-align: center;
color: #fff;
width: 680rpx;
font-size: 30rpx;
margin-top: 50rpx;
}
.info-v {
padding: 20rpx;
background-color: #fff;
margin-bottom: 20rpx;
.title {
font-weight: bold;
color: $fuint-theme;
}
.list-v {
padding: 20rpx;
display: flex;
flex-wrap: wrap;
.item-v {
border-radius: 12rpx;
font-size: 30rpx;
margin-top: 10rpx;
margin-left: 10rpx;
font-weight: bold;
width: 30%;
border: 1rpx solid #ccc;
text-align: center;
padding: 20rpx;
}
.activeItem {
font-size: 30rpx;
border-radius: 12rpx;
margin-top: 10rpx;
margin-left: 10rpx;
width: 30%;
font-weight: bold;
background-color: $fuint-theme;
border: 1rpx solid #ccc;
color: #fff;
text-align: center;
padding: 20rpx;
}
.disable {
border-radius: 12rpx;
font-size: 30rpx;
margin-top: 10rpx;
margin-left: 10rpx;
font-weight: bold;
width: 30%;
border: 1rpx solid #ccc;
text-align: center;
color: white !important;
background-color: rgb(188, 188, 188) !important;
padding: 20rpx;
}
}
}
</style>