Files
zhwl-miniapp/pages/hotel/confirmOrder.vue

1076 lines
39 KiB
Vue
Raw Permalink Normal View History

2025-06-26 12:38:35 +08:00
<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>