656 lines
20 KiB
Vue
Raw Normal View History

<template>
<a-modal
:title="mdl.id>0?'编辑':'预约 ' + date + ' ' + timeRangeText"
style='top: 20px'
width='1200px'
v-model='visible'
:ok-button-props='{ props: { disabled: disabledConfirm } }'
@ok='handleSubmit'
>
<a-card title='会议室情况'>
<a-tabs default-active-key='1' @change='callback'>
<a-tab-pane key='1' tab='会议室详情'>
<a-carousel autoplay>
<div v-for='item in banner'>
<img :src='item' />
</div>
</a-carousel>
<a-descriptions title='' bordered>
<a-descriptions-item label='会议室名称'>
{{ roomDetail.name }}
</a-descriptions-item>
<a-descriptions-item label='会议室概况'>
{{ roomDetail.floor }} | {{ roomDetail.roomNum }} | {{ roomDetail.capacityNum }} |
{{ roomDetail.typeName }}
</a-descriptions-item>
<a-descriptions-item label='会议室设备'>
{{ roomDetail.device }}
</a-descriptions-item>
<a-descriptions-item label='会议室描述'>
{{ roomDetail.content }}
</a-descriptions-item>
</a-descriptions>
</a-tab-pane>
<a-tab-pane key='2' tab='预约情况' force-render>
<a-table :columns='recordCol' :data-source='recordList'>
</a-table>
</a-tab-pane>
</a-tabs>
</a-card>
<a-card :title='"我要预约 " + date + " " + timeRangeText' style='margin-top: 10px'>
<a-empty v-show='disabledConfirm'>
<span slot='description'>当前时段无法预约</span>
</a-empty>
<a-form :form='form' v-show='!disabledConfirm'>
<a-form-item style='display: none'>
<a-input v-decorator="['id']" />
</a-form-item>
<a-row>
<a-col :span='20'>
<a-form-item label='预约时间' :labelCol='{xs: { span: 24 }, sm: { span: 4 }}' :wrapperCol='wrapperCol'>
<a-time-picker :disabled='disabledTime'
v-decorator="['start',{rules: [{ required: true, message: '选择会议时间' }]}]"
format='HH:mm' :disabledHours='disabledHours' :disabledMinutes='disabledMinutes'
hideDisabledOptions='true' />
<a-time-picker :disabled='disabledTime'
v-decorator="['end',{rules: [{ required: true, message: '选择会议时间' }]}]"
style='margin-left: 10px' format='HH:mm' :disabledHours='disabledHours'
:disabledMinutes='disabledMinutes' hideDisabledOptions='true' />
<a-button type='danger' v-if='isAdmin' style='margin-left: 20px' @click='handleUse'>
提前占用
</a-button>
</a-form-item>
</a-col>
</a-row>
<a-row>
<a-col :span='10'>
<a-form-item label='会议名称' :labelCol='labelCol' :wrapperCol='wrapperCol'>
<a-input placeholder='会议名称'
v-decorator="['title',{rules: [{ required: true, message: '输入会议名称' }]}]" />
</a-form-item>
</a-col>
<a-col :span='10'>
<a-form-item label='参会人数' :labelCol='labelCol' :wrapperCol='wrapperCol'>
<a-input placeholder='参会人数'
v-decorator="['personNum',{rules: [{ required: true, message: '参会人数' }]}]" />
</a-form-item>
</a-col>
</a-row>
<a-row>
<a-col :span='10'>
<a-form-item label='参会领导' :labelCol='labelCol' :wrapperCol='wrapperCol'>
<a-input placeholder='参会领导'
v-decorator="['leader',{rules: [{ required: true, message: '输入参会领导' }]}]" />
</a-form-item>
</a-col>
<a-col :span='10'>
<a-form-item label='预约部门' :labelCol='labelCol' :wrapperCol='wrapperCol'>
<a-select show-search v-decorator="['userOrgId',{rules: [{ required: true, message: '选择预约部门' }]}]"
placeholder='请选择预约部门'>
<a-select-option v-for='item in depList' :value='item.id'>
{{ item.name }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
</a-row>
<a-row>
<a-col :span='10'>
<a-form-item label='预约人' :labelCol='labelCol' :wrapperCol='wrapperCol'>
<a-input placeholder='预约人'
v-decorator="['bookingUserName',{rules: [{ required: true, message: '输入预约人' }]}]" />
</a-form-item>
</a-col>
<a-col :span='10'>
<a-form-item label='联系方式' :labelCol='labelCol' :wrapperCol='wrapperCol'>
<a-input placeholder='联系方式'
v-decorator="['bookingUserPhone',{rules: [{ required: true, message: '输入联系方式' }]}]" />
</a-form-item>
</a-col>
</a-row>
<a-row>
<a-col :span='10'>
<a-form-item label='会议室服务' :labelCol='labelCol' :wrapperCol='wrapperCol'>
<a-checkbox-group
v-decorator="['service']">
<a-checkbox v-for='item in serviceList' :value='item.value'>
{{ item.text }}
</a-checkbox>
</a-checkbox-group>
</a-form-item>
</a-col>
</a-row>
<a-row>
<a-col :span='10'>
<a-form-item :labelCol='labelCol' :wrapperCol='wrapperCol' label='备注 '>
<a-textarea placeholder='备注 ' v-decorator="['remark']" style='height: 100px' />
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-card>
</a-modal>
</template>
<script>
import {
meetingRoomDetail, getDep, saveMeetingReservation, getOrderInfo, useRoom
} from '@/api/admin/meeting/meetingReservation'
import pick from 'lodash.pick'
import storage from 'store'
import moment from 'moment'
import { ACCESS_TOKEN } from '@/store/mutation-types'
import { getMeetingDict } from '@/api/admin/meeting/roomContent'
import { checkPermission } from '@/utils/permissions'
2024-10-25 22:02:43 +08:00
import deptList from '@/views/system/DeptList.vue'
export default {
name: 'RoomOrderModal',
props: {},
components: {},
data() {
return {
visible: false,
labelCol: {
xs: { span: 24 },
sm: { span: 8 }
},
wrapperCol: {
xs: { span: 35 },
sm: { span: 16 }
},
mdl: {},
form: this.$form.createForm(this),
rId: '', // 预约id
timeRange: '',
timeRangeText: '',
date: '',
id: '', // 会议室id
depId: '',
dep: '',
banner: '',
roomDetail: {},
recordList: [],
recordCol: [{
title: '预约时间',
dataIndex: 'time'
}, {
title: '预约单位',
dataIndex: 'userOrg'
}, {
title: '预约人',
dataIndex: 'bookingUserName'
}, {
title: '联系方式',
dataIndex: 'bookingUserPhone'
}],
serviceList: [],
serviceMap: {},
disabledConfirm: false,
depList: [],
disabledTime: false,
isAdmin: checkPermission('meeting:admin')
}
},
beforeCreate() {
},
created() {
},
mounted() {
// this.getDict()
},
methods: {
getDict(roomServId) {
let serveIdArr = roomServId.split(',')
getMeetingDict().then((res) => {
// 服务
let dataObj = res.data
let _serviceList = []
for (let key in dataObj.services) {
let eachObj = dataObj.services[key]
const keys = Object.keys(eachObj)
if (serveIdArr.indexOf(eachObj[keys[0]]) !== -1) {
_serviceList.push({
text: keys[0],
value: eachObj[keys[0]]
})
this.serviceMap[eachObj[keys[0]]] = keys[0]
}
}
this.serviceList = _serviceList
})
},
getAllDep() {
2024-10-25 22:02:43 +08:00
if (this.isAdmin) {
getDep().then(res => {
let dep = res.data
let depList = []
for (let key in dep) {
let eachObj = dep[key]
depList.push({
id: eachObj['orgId'].toString(),
name: eachObj['orgName']
})
}
this.depList = depList
})
} else {
this.depList = [{
id: this.depId.toString(),
name: this.dep
}]
}
},
add(data) {
console.log(data)
this.id = data.id
this.timeRange = data.timeRange
if (this.timeRange == 1) {
this.timeRangeText = '上午'
}
if (this.timeRange == 2) {
this.timeRangeText = '下午'
}
if (this.timeRange == 3) {
this.timeRangeText = '晚上'
}
if (this.timeRange == 4) {
this.timeRangeText = '全天'
}
this.date = data.date
this.depId = data.depId
this.dep = data.dep
this.form.resetFields()
this.mdl = {}
this.serviceList = []
this.serviceMap = []
this.visible = true
this.getRoomInfo()
this.getAllDep()
if (data.status == 1) {
this.disabledConfirm = true
} else {
this.disabledConfirm = false
}
// 给默认值赋值
this.$nextTick(() => {
this.form.setFieldsValue({
id: '',
userOrgId: this.depId.toString()
})
})
},
edit(data) {
let act = data.act
this.rId = data.rId
if (act == 1) {
// 选择的房间
this.id = data.id
// 重新选择时间、会议室
this.timeRange = data.timeRange
if (this.timeRange == 1) {
this.timeRangeText = '上午'
}
if (this.timeRange == 2) {
this.timeRangeText = '下午'
}
if (this.timeRange == 3) {
this.timeRangeText = '晚上'
}
if (this.timeRange == 4) {
this.timeRangeText = '全天'
}
this.date = data.date
this.depId = data.depId
this.dep = data.dep
// 直接获取会议室信息
this.getRoomInfo()
} else if (act == 2) {
// 重新编辑信息
this.disabledTime = true
console.log('编辑信息')
} else {
this.$message.error('非法操作!')
return
}
this.form.resetFields()
this.mdl = {}
this.serviceList = []
this.serviceMap = []
this.visible = true
this.getAllDep()
if (data.status == 1) {
this.disabledConfirm = true
} else {
this.disabledConfirm = false
}
getOrderInfo({ id: this.rId }).then((res) => {
if (act == 1) {
// 重新选择时间和会议室
res.mr.start = ''
res.mr.end = ''
res.mr.service = [] // 清空服务
} else {
// 重新编辑信息,此时会议室信息要单独获取
this.id = res.mr.roomId
this.timeRange = res.mr.timeFormat
if (this.timeRange == 1) {
this.timeRangeText = '上午'
}
if (this.timeRange == 2) {
this.timeRangeText = '下午'
}
if (this.timeRange == 3) {
this.timeRangeText = '晚上'
}
if (this.timeRange == 4) {
this.timeRangeText = '全天'
}
2024-10-25 22:02:43 +08:00
this.depId = res.mr.userOrgId
this.dep = res.mr.userOrg
this.depList = [{
id: this.depId.toString(),
name: this.dep
}]
this.date = moment(res.mr.start).format('YYYY-MM-DD')
this.getRoomInfo()
res.mr.start = moment(res.mr.start)
res.mr.end = moment(res.mr.end)
let service = []
for (let key in res.serve) {
service.push(res.serve[key].value)
}
res.mr.service = service
}
res.mr.userOrgId = res.mr.userOrgId.toString()
this.mdl = Object.assign(this.mdl, res.mr)
this.visible = true
this.$nextTick(() => {
this.form.setFieldsValue(
pick(
this.mdl,
'id',
'start',
'end',
'title',
'personNum',
'leader',
'userOrgId',
'bookingUserName',
'bookingUserPhone',
'remark',
'service'
)
)
})
})
},
handleSubmit(e) {
e.preventDefault()
this.form.validateFields((err, values) => {
if (!err) {
this.confirmLoading = false
// 处理一下serviceList
let service = []
let serviceList = values.service
for (let key in serviceList) {
let eachObj = serviceList[key]
service.push({
name: this.serviceMap[eachObj],
value: eachObj,
remark: ''
})
}
// 处理开始结束时间
values.start = values.start.format(this.date + ' HH:mm:00')
values.end = values.end.format(this.date + ' HH:mm:00')
// 计算一下时间差
var a = moment(values.start)
var b = moment(values.end)
var c = moment() // 当前时间
var timeDiff = b.diff(a)
var timeDiffNow = c.diff(a)
if (timeDiff < 0) {
// 异常
this.$message.error('结束时间不能小于开始时间!')
return
}
if (timeDiffNow > 0) {
// 异常
this.$message.error('开始时间请大于当前时间!!')
return
}
values.mrdate = this.date
values.timeFormat = this.timeRange
if (values.timeFormat == 4) {
// 全天设置为0
values.timeFormat = 0
}
// 处理获取orgName
for (let key in this.depList) {
if (this.depList[key]['id'] == values.userOrgId) {
values.userOrg = this.depList[key]['name']
}
}
values.roomId = this.id
let data = {
'mr': values,
'serve': service
}
saveMeetingReservation(data).then((res) => {
if (res.code === 0) {
if (this.rId == '') {
this.$message.success('预约成功,请等待审核!')
} else {
this.$message.success('信息已修改,请等待审核!')
}
this.$emit('ok')
this.visible = false
} else {
this.$message.error(res.msg)
}
}).catch(() => {
this.$message.error('系统错误,请稍后再试')
}).finally(() => {
// this.confirmLoading = false
})
}
})
},
// 提前占用方法
handleUse() {
// 提前占用,获取时间范围
let sTime = this.form.getFieldValue('start')
let eTime = this.form.getFieldValue('end')
if (sTime && eTime) {
// 处理开始结束时间
let data = {
'mr': {
'roomId': this.id,
'start': sTime.format(this.date + ' HH:mm:00'),
'end': eTime.format(this.date + ' HH:mm:00'),
'mrdate': this.date,
'timeFormat': '0'
}
}
// 计算一下时间差
var a = moment(data.mr.start)
var b = moment(data.mr.end)
var c = moment() // 当前时间
var timeDiff = b.diff(a)
var timeDiffNow = c.diff(a)
if (timeDiff < 0) {
// 异常
this.$message.error('结束时间不能小于开始时间!')
return
}
if (timeDiffNow > 0) {
// 异常
this.$message.error('开始时间请大于当前时间!!')
return
}
useRoom(data).then(res => {
if (res.code === 0) {
this.$message.success('占用成功!')
this.$emit('ok')
this.visible = false
} else {
this.$message.error(res.msg)
}
})
} else {
this.$message.error('请选择占用时间!')
}
},
getRoomInfo() {
meetingRoomDetail({
roomId: this.id
}).then(res => {
console.log('meetingRoomDetailRq', res)
let detail = res.room // 详细信息
let recordList = res.mr // 预约信息
let bannerList = [] // 轮播图
if (detail.imgs) {
try {
bannerList = detail.imgs.map(item => process.env.VUE_APP_MODEL_BASE_URL + item.url)
} catch (error) {
console.log(`JSON error : ${error}`)
}
}
let newRecordList = []
for (let key in recordList) {
let eachObj = recordList[key]
let sTime = eachObj['start']
let eTime = eachObj['end']
eachObj['date'] = moment(sTime).format('YYYY-MM-DD')
eachObj['time'] = moment(sTime).format('YYYY-MM-DD HH:mm') + '~' + moment(eTime).format('HH:mm')
newRecordList.push(eachObj)
}
this.recordList = newRecordList
this.roomDetail = detail
this.banner = bannerList
this.getDict(detail.ext1)
})
},
disabledHours() {
if (this.timeRange == 1) {
// 上午900-1200
return [0, 1, 2, 3, 4, 5, 6, 7, 8, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
}
if (this.timeRange == 2) {
// 下午1330-1730
return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 18, 19, 20, 21, 22, 23, 24]
}
if (this.timeRange == 3) {
// 晚上1730-24
return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
}
},
disabledMinutes(nowH) {
if (this.timeRange == 1) {
// 上午,都可以
if (nowH == 12) {
let res = []
for (let i = 1; i < 60; i++) {
res.push(i)
}
return res
}
}
if (this.timeRange == 2) {
// 下午1300-1329不能选
if (nowH == 13) {
let res = []
for (let i = 0; i < 30; i++) {
res.push(i)
}
return res
}
// 下午1731-1759不能选
if (nowH == 17) {
let res = []
for (let i = 31; i < 60; i++) {
res.push(i)
}
return res
}
}
if (this.timeRange == 3) {
// 晚上1700-1730不能选
if (nowH == 17) {
let res = []
for (let i = 0; i < 31; i++) {
res.push(i)
}
return res
}
}
}
}
}
</script>
<style scoped>
/* For demo */
.ant-carousel >>> .slick-dots {
height: auto;
}
.ant-carousel >>> .slick-slide img {
border: 5px solid #fff;
display: block;
margin: auto;
max-width: 300px;
}
.ant-carousel >>> .slick-thumb {
bottom: -45px;
}
.ant-carousel >>> .slick-thumb li {
width: 60px;
height: 45px;
}
.ant-carousel >>> .slick-thumb li img {
width: 100%;
height: 100%;
filter: grayscale(100%);
}
.ant-carousel >>> .slick-thumb li.slick-active img {
filter: grayscale(0%);
}
.self-item-cell {
display: flex;
justify-content: space-between;
align-items: center;
}
.self-item-cell .self-item {
display: flex;
justify-content: flex-start;
align-items: center;
width: 50%;
}
.self-item-cell .self-item:first-of-type {
margin-right: 10px;
}
.self-item-cell .self-item .title {
margin-right: 10px;
}
.self-item-cell .self-item .input {
flex: 1;
}
</style>