Files
zhxg_app_v1.0/pages/OneStopCommunity/appointment/reservation.vue
2025-07-16 15:34:34 +08:00

453 lines
10 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="reservation">
<view style="padding: 40rpx;">
<form>
<view class="form-item">
<label>功能房</label>
<input type="text" v-model="list.roomName" disabled placeholder="请输入"
placeholder-class="input-placeholder" />
</view>
<view class="form-item">
<label>主题</label>
<input type="text" v-model="formData.rtTheme" placeholder="请输入"
placeholder-class="input-placeholder" />
</view>
<view class="form-item">
<label>申请人</label>
<input type="text" v-model="formData.rtCreatRole" placeholder="请输入"
placeholder-class="input-placeholder" />
</view>
<view class="form-item">
<label>使用部门/学院</label>
<input type="text" v-model="formData.rtDepar" placeholder="请输入"
placeholder-class="input-placeholder" />
</view>
<view class="form-item">
<label>参与人数</label>
<input type="number" v-model="formData.rtPeople"
:placeholder="'当前功能房最大人数为'+list.staffOneStopRoom[0].roomCapacity+'人'"
placeholder-class="input-placeholder" />
</view>
<view class="form-item">
<label>预约用途</label>
<picker range-key="dictLabel" :value="rangeIndex" :range="Reserveduse" @change="classChange">
<view class="uni-input">
<text v-if="Reserveduse.length" class="val">{{Reserveduse[rangeIndex].dictLabel}}</text>
<uni-icons type="down" size="16" color="#202020"></uni-icons>
</view>
</picker>
</view>
<view class="form-item">
<label>人员类型</label>
<picker mode="multiSelector" :value="typeValues" :range="rolelist" @change="typeChange">
<view class="uni-input">
<!-- 显示所有选中的值 -->
<text v-if="typeValues.length" class="val">
{{ typeValues.map(value => rolelist.find(item => item.dictLabel === value).dictLabel).join(', ') }}
</text>
<uni-icons type="down" size="16" color="#202020"></uni-icons>
</view>
</picker>
</view>
</form>
</view>
<view class="time-zone">
<view>
<view>
<text>开放时间</text>
</view>
<view>
<text style="color: red;">*</text>
<text>请点击下方时间段进行预约确认</text>
</view>
</view>
<view>
<view v-for="(item,index) in slotslist" :key="index">
<button @click="make(item,index)" :disabled="item.isOccupy==1"
:class="timeindex==index?'active':'dark'">{{item.openingHours}}</button>
</view>
</view>
<view>
<text>使用事项</text>
<view>
<text>{{list.roomMatter}}</text>
</view>
</view>
<view>
<button v-if="slotslist.length!=0" type="primary" :disabled="isSubmitting" class="submit-btn"
@tap="onSubmit">提交</button>
<button v-else type="primary" :disabled="true" class="submit-btn">当前功能房时间未开放</button>
</view>
</view>
</view>
</template>
<script>
import {
selectRtFuReservationTime,
updateRoomReservation,
addRoomReservation
} from '@/api/OneStopCommunity/room.js'
import {
getDetailList,
Update
} from '@/api/OneStopCommunity/appointment.js'
import {
getDicts
} from '@/api/system/dict/data.js'
import {
toBackPage
} from "@/utils/toBack.js"
export default {
data() {
return {
isSubmitting: false, //表单提交标志位
timeindex: null,
formData: {
rtTheme: "",
rtRole: "",
rtPurpose: "",
rtPeople: "",
rtTimePeriod: "",
rtCreatRole: "",
rtDepar: "",
roomName: "",
},
rangeIndex: 0,
typeIndex: 0,
roomNo: "",
rtTime: "",
list: {},
slotslist: [],
Reserveduse: [],
rolelist: []
}
},
methods: {
classChange(e) {
this.rangeIndex = e.detail.value;
},
typeChange(e) {
this.typeIndex = e.detail.value;
},
onSubmit() {
this.isSubmitting = true; // 设置为正在提交
if (this.timeindex == null) {
uni.showToast({
title: "请填写完整内容!",
icon: 'none' // 根据需要设置图标
});
this.isSubmitting = false;
return;
}
this.formData.rtPurpose = this.Reserveduse[this.rangeIndex].dictLabel;
this.formData.rtRole = this.rolelist[this.typeIndex].dictLabel;
this.formData.roomNo = this.list.roomNo
var arr = this.list.rtTimePeriod.split(" ")
this.formData.rtTime = this.list.rtTime
this.formData.rtTimePeriod = this.slotslist[this.timeindex].openingHours
this.formData.roomName = this.list.roomName
this.formData.rtNo = this.slotslist[this.timeindex].rtNo
this.formData.staffOneStopRoomOpeningHoursList = this.list.staffOneStopRoomOpeningHoursList
console.log(this.formData)
if (parseInt(this.formData.rtPeople) <= 0) {
uni.showToast({
title: "功能房参与人数不能小于0",
icon: 'none' // 根据需要设置图标
});
this.isSubmitting = false;
return;
}
if (parseInt(this.formData.rtPeople) > parseInt(this.list.staffOneStopRoom[0].roomCapacity)) {
uni.showToast({
title: "功能房最大人数为" + this.list.staffOneStopRoom[0].roomCapacity + "",
icon: 'none' // 根据需要设置图标
});
this.isSubmitting = false;
return;
}
for (let var2 in this.formData) {
if (this.formData[var2] == null || this.formData[var2] == '') {
uni.showToast({
title: "请填写完整内容!",
icon: 'none' // 根据需要设置图标
});
this.isSubmitting = false;
return; // 停止执行后续操作
}
}
this.add()
},
make(item, index) {
// this.formData.rtYuyue = item
this.timeindex = index
},
async getlist() {
let obj = {
roomNo: this.list.roomNo,
rtTime: this.list.rtTime
}
// console.log(obj)
let res = await selectRtFuReservationTime(obj)
console.log(res)
this.slotslist = res.data
},
async getReserved() {
let res = await getDicts('routine_rtfureservations_rt_purpose')
this.Reserveduse = res.data
},
async getrole() {
let res = await getDicts('routine_rtfureservation_rt_role')
this.rolelist = res.data
},
async add() {
this.formData.rtId = this.list.rtId
this.formData.auditStatus = 0
this.formData.rtState = 0
let res = await Update(this.formData)
console.log(res)
if (res.code == 200) {
uni.showToast({
title: "提交成功"
})
setTimeout(() => {
uni.redirectTo({
url: "../appointment/index"
})
}, 1000)
this.isSubmitting = false;
} else {
uni.showToast({
title: "已被预约",
icon: 'error'
})
this.isSubmitting = false;
}
},
async getDetail() {
let res = await getDetailList(this.list.rtId);
if (res.code == 200) {
this.detail = res.data;
}
},
},
onLoad(option) {
this.list = JSON.parse(option.item)
console.log(this.list)
this.formData.rtPurpose = this.list.rtDepar;
this.formData.rtRole = this.list.rtRole;
this.formData.roomName = this.list.roomName
this.formData.rtTheme = this.list.rtTheme
this.formData.rtCreatRole = this.list.rtCreatRole
this.formData.rtDepar = this.list.rtDepar
this.formData.rtPeople = this.list.rtPeople
this.getlist()
this.getReserved()
this.getrole()
this.getDetail()
},
}
</script>
<style lang="scss" scoped>
.reservation {
background-color: rgba(244, 244, 244, .6);
.form-item {
padding: 22rpx 40rpx;
background-color: white;
margin-bottom: 20rpx;
border-radius: 16rpx;
.uni-icons {
opacity: .5;
font-weight: bold
}
label {
margin-bottom: 20rpx;
display: inline-block;
}
input {
border: 1px solid #E1E1E1;
border-radius: 10rpx;
height: 70rpx;
padding-left: 30rpx;
.input-placeholder {
color: #b6b6b6;
}
}
picker {
border: 1px solid #E1E1E1;
height: 70rpx;
line-height: 70rpx;
padding: 0 30rpx;
border-radius: 10rpx;
.uni-input {
display: flex;
color: #797979;
.val {
flex: 1;
}
}
}
.upload-img {
border: 1px solid #E1E1E1;
padding: 20rpx;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
.tip {
margin-top: 15rpx;
color: #7a7a7a;
font-size: 24rpx;
}
}
.img-list {
border: 1px solid #D8D8D8;
border-radius: 20rpx;
.imgs {
padding: 22rpx;
display: flex;
flex-wrap: wrap;
.img {
position: relative;
width: 160rpx;
height: 170rpx;
margin-bottom: 15rpx;
margin-right: 15rpx;
image {
width: 100%;
height: 100%;
}
.remove {
position: absolute;
right: 0;
top: 0;
color: white;
background-color: rgba(0, 0, 0, 0.4);
width: 52rpx;
height: 52rpx;
display: flex;
justify-content: center;
align-items: center;
border-radius: 50%;
}
}
}
.btn {
border-top: 1px solid #D8D8D8;
height: 100rpx;
display: flex;
justify-content: center;
align-items: center;
font-size: 32rpx;
}
}
}
.time-zone {
width: 100%;
border-radius: 40rpx 40rpx 0rpx 0rpx;
background-color: #ffffff;
padding: 40rpx;
// margin-top: 10rpx;
&>view:nth-child(1) {
display: flex;
justify-content: space-between;
height: 65rpx;
text-align: center;
align-items: center;
&>view:nth-child(1) {
text {
font-size: 40rpx;
font-weight: 550;
}
}
&>view:nth-child(2) {
&>text:nth-child(2) {
font-size: 24rpx;
color: #202020;
opacity: .5;
}
}
}
&>view:nth-child(2) {
display: flex;
flex-wrap: wrap;
align-content: flex-start;
view {
width: 30%;
margin: 10rpx;
button {
font-size: 24rpx;
}
button[disabled] {
height: 80rpx;
line-height: 80rpx;
color: #C1CCDF;
background-color: rgba(234, 241, 255, .8);
border-radius: 20rpx;
border: none;
}
.active {
height: 80rpx;
line-height: 80rpx;
border: 1px #1890FF solid;
background-color: #f9fbfc;
color: #ffffff;
background-color: #1890FF;
border-radius: 20rpx;
}
.dark {
height: 80rpx;
line-height: 80rpx;
border: 1px #1890FF solid;
background-color: #f9fbfc;
color: #1890FF;
border-radius: 20rpx;
}
}
}
&>view:nth-child(3) {
margin-top: 40rpx;
font-size: 24rpx;
color: rgba(32, 32, 32, .5);
line-height: 40rpx;
}
}
.submit-btn {
margin-top: 60rpx;
}
}
</style>