241 lines
8.1 KiB
Vue
241 lines
8.1 KiB
Vue
<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>
|