zhwl-miniapp/pages/hotel/confirmOrder.vue
2025-06-26 12:38:35 +08:00

1076 lines
39 KiB
Vue
Raw Permalink 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="waper">
<u-navbar :autoBack="true" :placeholder="true" bgColor="#FFFFFF">
<view slot='center' style="font-size: 36rpx; font-weight: bold;">
确认订单
</view>
</u-navbar>
<view class="content">
<view class="top_box">
<view class="hour_date" v-if="hourDate">
<view>{{$moment(hourDate).format("MM月DD日")}}</view>
<view>今天{{hotelDetail.hourRoomCheckInTimeHm}}-{{hotelDetail.hourRoomLeaveTimeHm}}中选择{{detail.duration}}小时</view>
</view>
<view class="name">{{hotelDetail.name}}</view>
<view class="row">
<view class="label">{{detail.level2Name}}</view>
<view class="type" @click="typeDetail">
<text>房型详情</text>
<u-icon name="arrow-right" color="#03AE80" size="28rpx"></u-icon>
</view>
</view>
<view class="tags_box">
<view class="tag" v-if="detail.bedType">{{detail.bedType}}</view>
<view class="tag" v-if="detail.limitedLivePerson">{{detail.limitedLivePerson}}人入住</view>
<view class="tag" v-if="detail.area">{{detail.area}}m²</view>
<view class="tag" v-if="detail.window">{{detail.window}}</view>
</view>
<view class="row" v-if="hourDate">
<view class="label1">
<u-icon name="checkmark-circle" color="#03AE80" size="28rpx" />
<view v-if="detail.cancelRuleType == 4" class="text">订单确认后,{{$moment(hourDate).format("MM月DD日")}}{{isHourTime ? isHourTime.label.split('-')[0] : ''}}前可免费取消,逾期不可取消或退款。</view>
<view v-else class="text">{{detail.cancelRuleTypeDesc}}</view>
</view>
</view>
<view class="row" v-else>
<view class="label1 alc">
<u-icon name="checkmark-circle" color="#03AE80" size="28rpx" />
<view class="text">{{detail.cancelRuleTypeDesc}}</view>
</view>
<view class="type" @click="readDetail">
<text>订房必读</text>
<u-icon name="arrow-right" color="#03AE80" size="28rpx"></u-icon>
</view>
</view>
</view>
<view class="center_box">
<view class="label">入住信息</view>
<view>
<view class="col" v-if="!hourDate">
<view class="left">入住时间</view>
<view class="center">
<view>{{startDatePage}}-{{stopDatePage}}</view>
<view>共{{nightsPage}}晚</view>
</view>
</view>
<view class="col col1" @click="timeSlotDetail" v-if="hourDate">
<view class="left">入住时段</view>
<view class="center1" v-if="isHourTime">
<view class="cet_top">
<view>{{isHourTime.label}}</view>
<u-icon name="arrow-right" color="rgba(0,0,0,0.45)" size="28rpx"></u-icon>
</view>
<view class="cet_bot">
您可入住<text>{{isHourTime.duration}}</text>,最晚在<text>{{isHourTime.value.split('-')[1]}}</text>离店。请您在选择的时间段内入住,超时将可能无法入住。
</view>
</view>
</view>
<view class="col" @click="showHotel">
<view class="left">房间数量</view>
<view class="center">
<view>{{isNum}}间<text>每间最多住{{detail.limitedLivePerson}}人</text></view>
<view class="residue">剩余{{detail.quantity}}间</view>
</view>
<view class="right">
<u-icon v-if="!expand" name="arrow-down" color="rgba(0,0,0,0.45)" size="28rpx" />
<u-icon v-if="expand" name="arrow-up" color="rgba(0,0,0,0.45)" size="28rpx" />
</view>
</view>
</view>
</view>
<view class="rooms_box" v-if="expand && detail.quantity">
<view :class="['num', isNum == index+1 ? 'activeNum' : '']" v-for="(item, index) in detail.quantity" :key="index" @click="changeNum(index)">{{index+1}}间</view>
</view>
<view class="bottom_box">
<view class="col" @click="tenantsDetail">
<view class="center1">
<view class="col1" v-for="(item, index) in visitorList" :key="index">
<view class="key">房间{{index + 1}}</view>
<view class="name">{{item.name}}</view>
</view>
</view>
<view class="right">
<view class="yq"><u-icon name="account" color="#03AE80" size="32rpx" /></view>
</view>
</view>
<view class="col">
<view class="left">手机号码</view>
<view class="center">
<view class="code">86</view>
<u-icon name="arrow-down" color="rgba(0,0,0,0.45)" size="28rpx" />
<view class="line"></view>
<view>{{contactMobile}}</view>
</view>
</view>
<view class="col" @click="timeDetail" v-if="!hourDate">
<view class="left">预计到店</view>
<view class="center">
<view>{{arrivalTime}}<text v-if="arrivalTime">前</text></view>
</view>
<view class="right">
<u-icon name="arrow-right" color="rgba(0,0,0,0.45)" size="28rpx"></u-icon>
</view>
</view>
</view>
</view>
<view class="footer" :style="'padding-bottom: ' + windowBottom + 'px;'">
<view class="left">
<!-- <view class="label">在线付</view> -->
<view class="price"><text class="unit">¥</text>{{totalPrice}}</view>
</view>
<view class="right">
<view @click="showPopupDetailed = true" class="detailed">
<view class="label">明细</view>
<u-icon name="arrow-up" color="rgba(0,0,0,0.85)" size="28rpx" />
</view>
<view class="btn" v-if="detail.quantity" @click="predetermine">提交订单</view>
<view class="btn btn1" v-else>已订完</view>
</view>
</view>
<u-popup :show="showPopupType" :round="10" mode="bottom">
<view class="type_con">
<view class="close" @click="showPopupType = false">
<u-icon name="close" color="#fff" size="36rpx" />
</view>
<scroll-view scroll-y class="scroll">
<view class="swiper">
<swiper :autoplay="true" :current="current" circular @change="changeSwiper">
<swiper-item v-for="(i, index) in detail.image" :key="index">
<image :src="$utils.setImgUrl(i)" mode=""></image>
</swiper-item>
</swiper>
<view class="current">{{current + 1}}/{{detail.imageLength}}</view>
</view>
<view class="specs">
<view class="title">{{detail.level2Name}}</view>
<view class="list_box">
<view class="item" v-if="detail.area">
<image src="../../static/image/hotel/area.png" mode=""></image>
<view>{{detail.area}}㎡</view>
</view>
<view class="item" v-if="detail.bedType">
<image src="../../static/image/hotel/bedType.png" mode=""></image>
<view>{{detail.bedType}}</view>
</view>
<view class="item" v-if="detail.window">
<image src="../../static/image/hotel/window.png" mode=""></image>
<view>{{detail.window}}</view>
</view>
<view class="item" v-if="detail.wifi">
<image src="../../static/image/hotel/wifi.png" mode=""></image>
<view>{{detail.wifi}}</view>
</view>
<view class="item" v-if="detail.floor">
<image src="../../static/image/hotel/floor.png" mode=""></image>
<view>{{detail.floor}}层</view>
</view>
<view class="item" v-if="detail.breakfast">
<image src="../../static/image/hotel/breakfast.png" mode=""></image>
<view>{{detail.breakfast}}</view>
</view>
<view class="item" v-if="detail.limitedLivePerson">
<image src="../../static/image/hotel/limitedLivePerson.png" mode=""></image>
<view>{{detail.limitedLivePerson}}人</view>
</view>
</view>
</view>
<view class="occupying"></view>
<view class="policy">
<view class="title">商家政策</view>
<view class="list">
<view class="item">
<view class="label">重要通知</view>
<u-parse :content="hotelDetail.importantNotice"></u-parse>
</view>
<view class="item">
<view class="label">入住方式</view>
<view class="text">{{hotelDetail.checkInWay}}</view>
</view>
<view class="item">
<view class="label">取消规则</view>
<view class="text" v-if="detail.cancelRuleType == 3">
{{cancelRule}}
</view>
<view class="text" v-else>{{detail.cancelRuleTypeDesc}}</view>
</view>
</view>
</view>
</scroll-view>
</view>
</u-popup>
<u-popup :show="showPopupRead" :round="10" mode="bottom">
<view class="read_con">
<view class="head">
<view class="title">订房必读</view>
<view class="close" @click="showPopupRead = false">
<u-icon name="close" color="#000000" size="36rpx" />
</view>
</view>
<scroll-view scroll-y class="scroll">
<view class="row">
<view class="title">入住须知</view>
<view class="con">
<text>发票:</text>
<text>{{hotelDetail.invoice == 'N' ? '不' : ''}}</text>
可开具增值税普通/专用发票
</view>
<view class="con">
<text>年龄限制:</text>
入住办理人需满{{hotelDetail.minLimitedAge}}岁
</view>
</view>
<view class="row">
<view class="title">商家政策</view>
<view class="con">
<text>重要通知:</text>
<u-parse :content="hotelDetail.importantNotice"></u-parse>
</view>
<view class="con">
<text>取消规则:</text>
{{detail.cancelRuleType == 3 ? cancelRule : detail.cancelRuleTypeDesc}}
</view>
</view>
</scroll-view>
</view>
</u-popup>
<u-popup :show="showPopupTime" :round="10" mode="bottom" closeOnClickOverlay @close="showPopupTime = false">
<view class="time_con">
<view class="head">
<view class="title">预计到店时间</view>
<view class="text">房间整晚保留10:00前可能需要等房详情咨询商家</view>
</view>
<scroll-view scroll-y class="scroll">
<view class="time_box">
<view :class="['time', isTime == item.dictValue ? 'activeTime' : '']" v-for="(item, index) in timeList" :key="index" @click="changeTime(item)">{{item.dictLabel}}</view>
</view>
</scroll-view>
</view>
</u-popup>
<u-popup :show="showPopupHourTime" :round="10" mode="bottom">
<view class="time_con">
<view class="head1">
<view class="title">选择入住时段</view>
<view class="close" @click="showPopupHourTime = false">
<u-icon name="close" color="#000000" size="36rpx" />
</view>
</view>
<scroll-view scroll-y class="scroll">
<view class="time_box1">
<view :class="['time', isHourTime.value == item.value ? 'activeTime' : '']" v-for="(item, index) in hourTimeList" :key="index" @click="changeHourTime(item)">{{item.label}}</view>
</view>
</scroll-view>
</view>
</u-popup>
<u-popup :show="showPopupTenants" :round="10" mode="bottom">
<view class="tenants_con">
<view class="head">
<view class="cancel" @click="goCancel">取消</view>
<view class="title">选择入住人</view>
<view class="confirm" @click="goConfirm">确定</view>
</view>
<scroll-view scroll-y class="scroll">
<view class="item" v-for="(item, index) in tenantsList" :key="index">
<view class="left" @click="changeTenants(item)">
<view class="noChange" v-if="selectValue.indexOf(item.id) == -1"></view>
<view class="isChange" v-if="selectValue.indexOf(item.id) != -1">
<u-icon name="checkmark" color="#fff" size="28rpx" />
</view>
<view :class="['name', selectValue.indexOf(item.id) != -1 ? 'name1' : '']">{{item.name}}</view>
</view>
<u-icon @click="editVisitor(item)" name="edit-pen" color="rgba(0,0,0,0.45)" size="40rpx" />
</view>
</scroll-view>
<view class="btn" @click="addVisitor">
<u-icon name="plus" color="#03AE80" size="32rpx" />
<view>手动新增</view>
</view>
</view>
</u-popup>
<u-popup :show="showPopupTourist" :round="10" mode="bottom">
<view class="tourist_box" :style="'padding-bottom: ' + keyboardHeight + 'px;'">
<view class="popup-tourist">
<view class="title">
{{touristTitle}}
<view class="close" @click="closeTourist">
<u-icon name="close" color="#000" size="32rpx"></u-icon>
</view>
</view>
<view class="form">
<view class="num-box">
<view class="list">
<view class="label">姓名</view>
<input type="text" :adjust-position="false" @keyboardheightchange="handleKeyboardChange" v-model="touristForm.name" placeholder="请输入联系人姓名" />
</view>
<view class="list">
<view class="label">联系电话</view>
<input type="number" :adjust-position="false" @keyboardheightchange="handleKeyboardChange" v-model="touristForm.mobile" placeholder="请输入联系号码" @blur="keyboardHeight = 0;" />
</view>
<view class="list">
<view class="label">身份证号码</view>
<input type="idcard" :adjust-position="false" @keyboardheightchange="handleKeyboardChange" v-model="touristForm.idCard" placeholder="请输入证件号码" @blur="keyboardHeight = 0;" />
</view>
</view>
</view>
<view class="btn" @click="saveTourist">保存</view>
</view>
</view>
</u-popup>
<u-popup :show="showPopupDetailed" :round="10" mode="bottom">
<view class="detailed_con">
<view class="head">
<view class="title">明细</view>
<view class="close" @click="showPopupDetailed = false">
<u-icon name="close" color="#000000" size="36rpx" />
</view>
</view>
<view class="add">
<view class="label">订单合计</view>
<view class="all">共<text>¥{{totalPrice}}</text></view>
</view>
<view class="row">
<view class="col">
<view class="key">房费 </view>
<view class="value">¥{{totalPrice}}</view>
</view>
<view class="col" v-for="(item, index) in detail.datePrices" :key="index">
<view class="key">{{item.recordDate}}</view>
<view class="value">{{isNum}}x ¥{{item.price}}</view>
</view>
<view class="col" v-if="endTime">
<view class="key">{{endTime}}</view>
<view class="value"></view>
</view>
</view>
<view class="footer" :style="'padding-bottom: ' + windowBottom + 'px;'">
<view class="left">
<!-- <view class="label">在线付</view> -->
<view class="price"><text class="unit"></text>{{totalPrice}}</view>
</view>
<view class="right">
<view @click="showPopupDetailed = false" class="detailed">
<view class="label">明细</view>
<u-icon name="arrow-down" color="rgba(0,0,0,0.85)" size="28rpx" />
</view>
<view class="btn" v-if="detail.quantity" @click="predetermine">提交订单</view>
<view class="btn btn1" v-else>已订完</view>
</view>
</view>
</view>
</u-popup>
</view>
</template>
<script>
export default {
data () {
return {
windowBottom: 0,
keyboardHeight: 0,
id: '',
hotelId: '',
detail: {},
hotelDetail: {},
totalPrice: 0,
expand: false,
isNum: null,
showPopupType: false,
showPopupRead: false,
showPopupTime: false,
showPopupTenants: false,
showPopupTourist: false,
showPopupDetailed: false,
showPopupHourTime: false,
touristTitle: '',
touristForm: { name: '', mobile: '', idCard: '' },
current: 0,
timeList: [],
hourTimeList: [],
arrivalTime: '',
isTime: null,
isHourTime: null,
selectValue: [],
selectItem: [],
tenantsList: [],
visitorList: [],
// 全日房
startTime: '',
endTime: '',
startDatePage: '',
stopDatePage: '',
nightsPage: null,
// 钟点房
hourDate: '',
// 可选择开始时间
startHourSlot: '',
// 可选择结束时间
endHourSlot: '',
contactMobile: '',
contactNames: '',
cancelRule: ''
}
},
onLoad (options) {
this.id = options.id;
this.hotelId = options.hotelId;
this.hourDate = options.hourDate;
this.windowBottom = this.$safeAreaBottom || uni.upx2px(24);
if (this.hourDate) {
this.isNum = 1;
this.visitorList = [{
name: '',
id: ''
}]
} else {
if (uni.getStorageSync('hotel_date')) {
let hotelDate = uni.getStorageSync('hotel_date');
this.startTime = hotelDate[0];
this.endTime = hotelDate[1];
this.startDatePage = this.$moment(hotelDate[0]).format("MM月DD日");
this.stopDatePage = this.$moment(hotelDate[1]).format("MM月DD日");
this.nightsPage = this.$moment(hotelDate[1]).diff(this.$moment(hotelDate[0]), 'days');
}
if (uni.getStorageSync('hotel_room')) {
let numData = uni.getStorageSync('hotel_room');
this.isNum = numData.room;
for (var i = 0; i < this.isNum; i ++) {
this.visitorList.push({
name: '',
id: ''
})
}
}
this.common();
}
this.getDetail();
this.getVisitor();
this.getUserInfo();
},
methods: {
async getDetail() {
let params = {
roomClassifyId: this.id,
startTime: this.hourDate || this.startTime,
endTime: this.hourDate || this.endTime
}
let res=null;
if (this.hourDate) {
// 钟点房
res = await this.$http.hourClassifyDetail(params);
} else {
// 全日房
res = await this.$http.classifyDetail(params);
}
res.data.image = res.data.image.split(',');
this.detail=res.data;
this.detail.imageLength = this.detail.image.length;
this.totalPrice = 0;
let num = 0;
this.detail.datePrices.forEach(e => {
num += e.price * this.isNum;
})
this.totalPrice = num.toFixed(2);
this.getHotelDetail();
if (this.detail.cancelRuleType == 3) {
let cancelRuleContent = JSON.parse(this.detail.cancelRuleContent);
if (Number(cancelRuleContent[0].handlingFee)) {
this.cancelRule = `入住当天${cancelRuleContent[0].start}后取消,将收取额外费用`;
} else {
this.cancelRule = `入住当天${cancelRuleContent[0].end}前可免费取消,超期将收取额外费用`;
}
}
if (!this.detail.quantity) {
uni.$u.toast('该房型已订完');
}
},
async getHotelDetail() {
let res=await this.$http.homestayId(this.hotelId);
this.hotelDetail=res.data;
if (this.hourDate) {
this.hotelDetail.hourRoomCheckInTimeHm = this.hotelDetail.hourRoomCheckInTime.slice(0, 5);
this.hotelDetail.hourRoomLeaveTimeHm = this.hotelDetail.hourRoomLeaveTime.slice(0, 5);
this.getHourTimeList();
}
},
async getVisitor() {
let info = await this.$http.touristList();
this.tenantsList = info.rows;
let f = this.tenantsList.find(m => m.status == 1)
if (!this.visitorList[0].id && f) {
this.selectValue = [f.id];
this.selectItem = [{name: f.name, id: f.id}];
this.visitorList[0] = {
name: f.name,
id: f.id
}
}
},
async getUserInfo() {
let info = await this.$http.getUserInfo()
if (info.code === 200) {
this.contactMobile = info.data.mobile;
this.contactNames = info.data.name;
} else {
uni.$u.toast(info.msg);
}
},
async common() {
const params = {
dictType: 'hotel_homestay_estimated_arrival_time'
}
let info = await this.$http.common(params)
if (info.code === 200) {
// 当前日期是否早于入住日期
if (this.$moment().isBefore(this.startTime)) {
this.timeList = info.data;
} else {
let today = [];
let morrow = [];
info.data.forEach(e => {
if (e.dictValue.split('|')[0] == 1) {
morrow.push(e);
} else {
let t = this.startTime + ' ' + e.dictValue.split('|')[1];
if (this.$moment(t).diff(this.$moment(), 'minutes') > 0) {
today.push(e);
}
}
})
this.timeList = this.timeList.concat(today).concat(morrow);
}
this.isTime = this.timeList[0].dictValue;
this.arrivalTime = this.timeList[0].dictLabel;
} else {
uni.$u.toast(info.msg);
}
},
handleKeyboardChange (e) {
this.$nextTick(() => {
this.keyboardHeight = e.detail.height
})
},
showHotel() {
this.expand = !this.expand;
},
changeNum(i) {
this.isNum = i + 1;
this.totalPrice = 0;
let num = 0;
this.detail.datePrices.forEach(e => {
num += e.price * this.isNum;
})
this.totalPrice = num.toFixed(2);
if (this.visitorList.length > this.isNum) {
this.visitorList = this.visitorList.slice(0, this.isNum);
this.goCancel();
}
if (this.visitorList.length < this.isNum) {
let num = this.isNum - this.visitorList.length;
for (var i = 0; i < num; i ++) {
this.visitorList.push({
name: '',
id: ''
})
};
}
},
typeDetail() {
this.showPopupType = true;
},
readDetail () {
this.showPopupRead = true;
},
timeDetail() {
this.showPopupTime = true;
},
changeTime(i) {
this.isTime = i.dictValue;
this.arrivalTime = i.dictLabel;
this.showPopupTime = false;
},
getHourTimeList() {
// 可选择结束时间
this.endHourSlot = this.$moment(this.hourDate + ' ' + this.hotelDetail.hourRoomLeaveTime).subtract(1, 'hours').format("YYYY-MM-DD HH:mm:ss");
// 当前日期
let timeNow = this.$moment().format("YYYY-MM-DD HH:mm:ss");
// 当前时
let timeNowH = this.$moment(timeNow).format("HH");
// 当前分
let timeNowM = this.$moment(timeNow).format("mm");
// 判断当前日期是否早于钟点房预定日期
if (this.$moment(timeNow.split(' ')[0]).isBefore(this.hourDate)) {
this.startHourSlot = this.hourDate + ' ' + this.hotelDetail.hourRoomCheckInTime;
} else {
if (Number(timeNowM) < 30) {
this.startHourSlot = timeNow.split(' ')[0] + ' ' + timeNowH + ':30:00';
} else {
this.startHourSlot = timeNow.split(' ')[0] + ' ' + this.$moment(timeNow).add(1, 'hours').format("HH") + ':00:00';
}
}
this.getHourSlot(this.startHourSlot);
},
getHourSlot(e) {
let time = this.$moment(e).add(this.detail.duration, 'hours').format("YYYY-MM-DD HH:mm:ss")
let duration = this.$moment(this.hourDate + ' ' + this.hotelDetail.hourRoomLeaveTime).diff(this.$moment(time), 'minutes');
if (duration >= 0) {
this.hourTimeList.push({
value: e.split(' ')[1].slice(0, 5) + '-' + time.split(' ')[1].slice(0, 5),
label: e.split(' ')[1].slice(0, 5) + '-' + time.split(' ')[1].slice(0, 5),
duration: this.detail.duration + '小时'
})
} else {
let totleTime = this.$moment(this.hourDate + ' ' + this.hotelDetail.hourRoomLeaveTime).diff(this.$moment(e), 'minutes');
if (totleTime >= 60) {
let H = Math.floor(totleTime / 60);
let M = totleTime % 60;
this.hourTimeList.push({
value: e.split(' ')[1].slice(0, 5) + '-' + this.hotelDetail.hourRoomLeaveTimeHm,
label: e.split(' ')[1].slice(0, 5) + '-' + this.hotelDetail.hourRoomLeaveTimeHm + '(可入住' + ( H ? H + '小时' : '') + ( M ? M + '分钟' : '') + ')',
duration: ( H ? H + '小时' : '') + ( M ? M + '分钟' : '')
})
}
}
if (!this.isHourTime) this.isHourTime = this.hourTimeList[0];
let f = this.$moment(e).add(30, 'minutes').format("YYYY-MM-DD HH:mm:ss");
let d = this.$moment(this.hourDate + ' ' + this.hotelDetail.hourRoomLeaveTime).diff(this.$moment(f), 'minutes');
if (d >= 60) {
this.getHourSlot(f);
}
},
timeSlotDetail() {
this.hourTimeList = [];
this.getHourTimeList();
this.showPopupHourTime = true;
},
changeHourTime(i) {
this.isHourTime = i;
this.showPopupHourTime = false;
},
tenantsDetail() {
this.showPopupTenants = true;
},
changeSwiper(e) {
this.current = e.detail.current;
},
changeTenants(i) {
const index = this.selectValue.indexOf(i.id);
if (index == -1) {
if (this.selectValue.length < this.visitorList.length) {
this.selectValue.push(i.id);
this.selectItem.push({name: i.name, id: i.id});
} else {
uni.showToast({ mask: true, title: `最多可选择${this.visitorList.length}位入住人`, icon: 'none' })
}
} else {
this.selectValue.splice(index, 1);
this.selectItem.splice(index, 1);
}
},
goCancel() {
this.showPopupTenants = false;
this.selectValue = [];
this.selectItem = [];
this.visitorList.forEach(e => {
if (e.id) {
this.selectValue.push(e.id);
this.selectItem.push({name: e.name, id: e.id});
}
})
},
goConfirm() {
this.visitorList.forEach((e, i) => {
e.name = this.selectItem[i]?.name || '';
e.id = this.selectItem[i]?.id || '';
})
this.showPopupTenants = false;
},
editVisitor(info) {
this.touristForm = { name: info.name, mobile: info.mobile, idCard: info.idCard, id: info.id };
this.touristTitle = '编辑常旅客';
this.showPopupTenants = false;
this.showPopupTourist = true;
},
addVisitor() {
this.touristForm = { name: '', mobile: '', idCard: '' };
this.touristTitle = '新增常旅客';
this.showPopupTenants = false;
this.showPopupTourist = true;
},
closeTourist() {
this.showPopupTourist = false;
this.showPopupTenants = true;
},
async saveTourist () {
if (!this.touristForm.name) {
uni.showToast({ mask: true, title: '请输入姓名', icon: 'none' })
return false;
}
if (!this.$utils.checkStr(this.touristForm.idCard, 'card')) {
uni.showToast({ mask: true, title: '请输入正确的证件号', icon: 'none' })
return false;
}
if (!this.$utils.checkStr(this.touristForm.mobile, 'mobile')) {
uni.showToast({ mask: true, title: '请输入正确的手机号', icon: 'none' })
return false;
}
let info = null;
if (this.touristForm.id) {
info = await this.$http.updateTourist(this.touristForm);
} else {
info = await this.$http.addTourist(this.touristForm);
}
if (info.code == 200) {
uni.showToast({ mask: true, title: '操作成功', icon: 'success' });
this.closeTourist();
this.getVisitor();
}
},
async predetermine() {
for (var i = 0; i < this.isNum; i ++) {
if (!this.selectValue[i]) {
uni.showToast({ mask: true, title: '请选择入住人', icon: 'none' });
return false;
}
};
if (this.hourDate) {
if (!this.isHourTime) {
uni.showToast({ mask: true, title: '请选择入住时段', icon: 'none' })
return false;
}
} else {
if (!this.isTime) {
uni.showToast({ mask: true, title: '请选择预计到店时间', icon: 'none' })
return false;
}
}
let params = {
hotelHomestayId: this.hotelId,
contactMobile: this.contactMobile,
contactNames: this.contactNames,
roomQuantity: this.isNum,
roomClassifyId: this.id,
zdyUserTouristIds: this.selectValue
}
if (this.hourDate) {
params.stayType = 'HOURLY';
params.inDate = this.hourDate;
params.outDate = this.hourDate;
params.inTime = this.isHourTime.value.split('-')[0];
params.outTime = this.isHourTime.value.split('-')[1];
} else {
params.inDate = this.startTime;
params.outDate = this.endTime;
params.estimatedArrivalTime = this.isTime;
}
let res=await this.$http.hotelOrder(params);
uni.navigateTo({ url: `/pages/hotel/submitOrder?id=${res.data.id}&hotelId=${this.hotelId}` })
}
}
}
</script>
<style lang="scss">
.waper { min-height: 100vh; }
.content{
width: 100%; box-sizing: border-box; padding: 24rpx; background-color: #F6F6F6;
.top_box {
background: #FFFFFF; border-radius: 10rpx; padding: 32rpx 24rpx; box-sizing: border-box;
.hour_date {
display: flex; align-items: center; margin-bottom: 20rpx;
view {
&:first-child {font-weight: 500; font-size: 28rpx; color: rgba(0,0,0,0.85); margin-right: 8rpx;}
&:last-child {font-size: 24rpx; color: rgba(0,0,0,0.45);}
}
}
.name { font-weight: 500; font-size: 36rpx; color: rgba(0,0,0,0.85); margin-bottom: 2rpx; }
.row {
margin-top: 19rpx; display: flex; align-items: center; justify-content: space-between;
.label { font-weight: 500; font-size: 28rpx; color: rgba(0,0,0,0.85); }
.label1 {
display: flex; align-items: baseline;
.text { font-size: 24rpx; color: #03AE80; margin-left: 10rpx; }
}
.alc {align-items: center;}
.type {
display: flex; align-items: center;
text { font-size: 24rpx; color: #03AE80; margin-right: 4rpx; }
}
}
.tags_box {
display: flex; align-items: center; margin-top: 11rpx;
.tag {
padding: 0 16rpx; position: relative; font-size: 24rpx; color: rgba(0,0,0,0.45);
&::after{ content: ""; width: 1rpx; height: 23rpx; background: #ECEAEA; position: absolute; right: 0; top: 50%; transform: translateY(-50%); }
&:first-child { padding-left: 0; }
&:last-child {
padding-right: 0;
&::after {display: none;}
}
}
}
}
.center_box {
margin-top: 22rpx; background: #FFFFFF; border-radius: 10rpx 10rpx 0 0; padding: 32rpx 24rpx 0; box-sizing: border-box;
.label { font-weight: 500; font-size: 32rpx; color: rgba(0,0,0,0.85); }
.col {
padding: 24rpx 0; border-bottom: 1rpx solid #ECEAEA; display: flex; align-items: center;
.left { width: 154rpx; font-size: 28rpx; color: rgba(0,0,0,0.65); }
.center {
flex: 1; display: flex; align-items: center; justify-content: space-between; padding-left: 30rpx;
view {
&:first-child {
font-weight: 500; font-size: 28rpx; color: rgba(0,0,0,0.85); display: flex; align-items: center;
text { font-size: 24rpx; color: rgba(0,0,0,0.45); margin-left: 8rpx; }
}
&:last-child { font-size: 28rpx; color: rgba(0,0,0,0.85); }
}
.residue { color: #E54042 !important; margin-right: 12rpx; }
}
.right { width: 43rpx; text-align: right; }
}
.col1 {
align-items: baseline;
.center1 {
flex: 1; padding-left: 30rpx;
.cet_top {
display: flex; align-items: center; justify-content: space-between;
view {font-weight: 500; font-size: 28rpx; color: rgba(0,0,0,0.85);}
}
.cet_bot {
margin-top: 12rpx; font-size: 24rpx; color: rgba(0,0,0,0.45);
text {color: #03AE80;}
}
}
}
}
.rooms_box {
margin-top: 24rpx; display: flex; align-items: center; flex-wrap: wrap; padding: 0 24rpx; box-sizing: border-box;
.num {
width: 118rpx; height: 64rpx; background: #FFFFFF; border-radius: 4rpx; line-height: 64rpx; text-align: center; font-size: 26rpx; color: rgba(0,0,0,0.65); margin-right: 15rpx; margin-bottom: 24rpx;
&:nth-child(5n) { margin-right: 0; }
}
.activeNum { background: rgba(71,175,195,0.1); border: 1rpx solid #03AE80; color: #03AE80; }
}
.bottom_box {
background: #FFFFFF; border-radius: 0 0 10rpx 10rpx; padding: 0 24rpx; box-sizing: border-box;
.col {
display: flex; align-items: center; border-bottom: 1rpx solid #ECEAEA;
&:last-child { border-bottom: none; }
.left { width: 154rpx; font-size: 28rpx; color: rgba(0,0,0,0.65); }
.center {
flex: 1; display: flex; align-items: center; height: 90rpx; padding-left: 30rpx;
view {
font-weight: 500; font-size: 28rpx; color: rgba(0,0,0,0.85);
}
.code { margin-right: 18rpx; }
.line { width: 1rpx; height: 28rpx; background-color: #ECEAEA; margin: 0 18rpx; }
}
.center1 {
flex: 1;
.col1 {
display: flex; align-items: center; border-bottom: 1rpx solid #ECEAEA;
&:last-child { border-bottom: none; }
.key { width: 154rpx; font-size: 28rpx; color: rgba(0,0,0,0.65); }
.name { flex: 1; height: 90rpx; line-height: 90rpx; padding-left: 30rpx; font-weight: 500; font-size: 28rpx; color: rgba(0,0,0,0.85); }
}
}
.right {
width: 43rpx; text-align: right;
.yq {
width: 34rpx; height: 34rpx; border-radius: 50%; border: 1rpx solid #03AE80; position: relative;
/deep/.u-icon__icon {position: absolute !important; top: 50% !important; left: 50% !important; transform: translate(-50%, -50%) !important;}
}
}
}
}
}
.footer {
width: 100%; background: #FFFFFF; padding: 24rpx 24rpx 0; box-sizing: border-box; position: fixed; left: 0; bottom: 0; display: flex; align-items: center; justify-content: space-between;
.left {
display: flex; align-items: baseline;
.label { font-size: 28rpx; color: #000000; margin-right: 12rpx; }
.price {
font-weight: bold; font-size: 56rpx; color: #E54042; margin-right: 20rpx;
.unit { font-size: 28rpx; color: #E54042; }
}
}
.right {
display: flex; align-items: center;
.detailed {
display: flex; align-items: center;
.label { font-size: 28rpx; color: rgba(0,0,0,0.85); margin-right: 8rpx; }
}
.btn { width: 270rpx; height: 68rpx; background: #03AE80; border-radius: 60rpx; line-height: 68rpx; text-align: center; font-weight: 500; font-size: 32rpx; color: #FFFFFF; margin-left: 24rpx; }
.btn1 {background-color: #BFBFBF;}
}
}
/deep/.u-popup__content {overflow: hidden;}
.type_con {
position: relative;
.close {
position: absolute; top: 32rpx; right: 24rpx; z-index: 1; width: 56rpx; height: 56rpx; background: rgba(0,0,0,0.4); border-radius: 50%;
::v-deep .u-icon { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); }
}
.scroll { max-height: 80vh; }
.swiper{
width: 100%; height: 500rpx; position: relative;
swiper{ width: 100%; height: 100%; }
.current{ padding: 0 20rpx; height: 40rpx; line-height: 40rpx; color: #fff; background: rgba(0, 0, 0, 0.5); font-size: 24rpx; border-radius: 50rpx; position: absolute; right: 24rpx; bottom: 24rpx; }
}
.specs {
background: #FFFFFF; padding: 24rpx 24rpx 32rpx; box-sizing: border-box;
.title { font-weight: 500; font-size: 36rpx; color: rgba(0,0,0,0.85); margin-bottom: 6rpx; }
.list_box {
display: flex; align-items: center; flex-wrap: wrap;
.item {
margin-top: 18rpx; width: 33.33%; display: flex; align-items: center;
image { width: 28rpx; height: 28rpx; }
view {
margin-left: 12rpx; font-size: 24rpx; color: rgba(0,0,0,0.85);
.text { color: #03AE80; }
}
}
}
}
.occupying { width: 100%; height: 22rpx; background-color: #F6F6F6; }
.policy {
background: #FFFFFF; padding: 22rpx 24rpx 24rpx; box-sizing: border-box;
.title { font-weight: 500; font-size: 36rpx; color: rgba(0,0,0,0.85); padding-bottom: 7rpx; }
.list {
.item {
border-bottom: 2rpx solid #ECEAEA; padding: 24rpx 0;
&:last-child { border-bottom: none; }
.label { font-weight: 500; font-size: 28rpx; color: rgba(0,0,0,0.85); margin-bottom: 16rpx; }
.text { font-size: 24rpx; color: rgba(0,0,0,0.45); line-height: 28rpx; }
}
}
}
}
.read_con {
padding: 32rpx;
.head {
position: relative; text-align: center; margin-bottom: 30rpx;
.title { font-weight: 500; font-size: 34rpx; color: rgba(0,0,0,0.85); }
.close { position: absolute; right: 0; top: 50%; transform: translateY(-50%); }
}
.scroll { max-height: 60vh; }
.row {
.title {margin-top: 24rpx; font-weight: 500; font-size: 30rpx; color: rgba(0,0,0,0.85);}
.con {
margin-top: 16rpx; font-size: 28rpx; color: rgba(0,0,0,0.65); line-height: 33rpx;
text:first-child {color: rgba(0,0,0,0.45);}
}
}
}
.time_con {
padding: 32rpx 32rpx 0;
.head {
margin-bottom: 44rpx;
.title { font-weight: 500; font-size: 34rpx; color: rgba(0,0,0,0.85); }
.text { margin-top: 8rpx; font-size: 28rpx; color: rgba(0,0,0,0.25); }
}
.head1 {
position: relative; text-align: center; margin-bottom: 30rpx;
.title { font-weight: 500; font-size: 34rpx; color: rgba(0,0,0,0.85); }
.close { position: absolute; right: 0; top: 50%; transform: translateY(-50%); }
}
.scroll { max-height: 60vh; }
.time_box {
display: flex; align-items: center; flex-wrap: wrap;
.time {
width: 214rpx; height: 64rpx; background: #F6F7F9; border-radius: 4rpx; line-height: 64rpx; text-align: center; margin: 0 21rpx 16rpx 0; font-size: 26rpx; color: rgba(0,0,0,0.65);
&:nth-child(3n) { margin-right: 0; }
}
.activeTime { background: rgba(71,175,195,0.1); border: 1rpx solid #03AE80; color: #03AE80; }
}
.time_box1 {
.time {
width: 100%; height: 64rpx; background: #F6F7F9; border-radius: 4rpx; line-height: 64rpx; text-align: center; margin-bottom: 16rpx; font-size: 26rpx; color: rgba(0,0,0,0.65); box-sizing: border-box;
}
.activeTime { background: rgba(71,175,195,0.1); border: 1rpx solid #03AE80; color: #03AE80; }
}
}
.tenants_con {
padding: 32rpx 24rpx 24rpx;
.head {
margin-bottom: 30rpx; display: flex; align-items: center; justify-content: space-between;
.cancel, .confirm { font-size: 34rpx; color: rgba(0,0,0,0.85); }
.title { font-weight: 500; font-size: 34rpx; color: rgba(0,0,0,0.85); }
}
.scroll { max-height: 60vh; }
.item {
padding: 24rpx 0; border-bottom: 1rpx solid #ECEAEA; display: flex; align-items: center; justify-content: space-between;
&:last-child { border-bottom: none; }
.left {
display: flex; align-items: center;
.noChange { width: 32rpx; height: 32rpx; border: 1rpx solid rgba(0,0,0,0.25); }
.isChange {
width: 32rpx; height: 32rpx; border: 1rpx solid #03AE80; background-color: #03AE80; position: relative;
::v-deep .u-icon{ position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); }
}
.name { margin-left: 24rpx; font-size: 28rpx; color: rgba(0,0,0,0.65); }
.name1 { color: rgba(0,0,0,0.85); }
}
}
.btn {
width: 654rpx; height: 90rpx; background: #FFFFFF; border-radius: 4rpx; border: 2rpx solid #03AE80; margin: 198rpx auto 0; display: flex; align-items: center; justify-content: center;
view { margin-left: 12rpx; font-weight: 500; font-size: 32rpx; color: #03AE80; }
}
}
.tourist_box{
width: 100%;
.popup-tourist{ width: 100%; }
}
.detailed_con {
padding: 32rpx 0 150rpx; position: relative;
.head {
position: relative; text-align: center; margin: 0 32rpx 30rpx;
.title { font-weight: 500; font-size: 34rpx; color: rgba(0,0,0,0.85); }
.close { position: absolute; right: 0; top: 50%; transform: translateY(-50%); }
}
.add {
padding: 54rpx 0 24rpx; margin: 0 32rpx; display: flex; align-items: center; justify-content: space-between; border-bottom: 1rpx solid #ECEAEA;
.label { font-size: 32rpx; color: rgba(0,0,0,0.85); }
.all {
font-size: 28rpx; color: rgba(0,0,0,0.85);
text { font-weight: bold; font-size: 28rpx; color: #E54042; }
}
}
.row {
padding: 0 32rpx;
.col {
display: flex; align-items: center; justify-content: space-between; margin-bottom: 8rpx;
&:first-child {
margin: 24rpx 0 13rpx;
.key, .value { font-weight: 500; font-size: 28rpx; color: rgba(0,0,0,0.85); }
}
.key, .value { font-size: 28rpx; color: rgba(0,0,0,0.65); }
}
}
.footer {
width: 100%; background: #FFFFFF; padding: 24rpx 24rpx 0; box-sizing: border-box; position: fixed; left: 0; bottom: 0; display: flex; align-items: center; justify-content: space-between;
.left {
display: flex; align-items: baseline;
.label { font-size: 28rpx; color: #000000; margin-right: 12rpx; }
.price {
font-weight: bold; font-size: 56rpx; color: #E54042; margin-right: 20rpx;
.unit { font-size: 28rpx; color: #E54042; }
}
}
.right {
display: flex; align-items: center;
.detailed {
display: flex; align-items: center;
.label { font-size: 28rpx; color: rgba(0,0,0,0.85); margin-right: 8rpx; }
}
.btn { width: 270rpx; height: 68rpx; background: #03AE80; border-radius: 60rpx; line-height: 68rpx; text-align: center; font-weight: 500; font-size: 32rpx; color: #FFFFFF; margin-left: 24rpx; }
.btn1 {background-color: #BFBFBF;}
}
}
}
</style>