会议室列表、预约列表、会议预约功能开发

This commit is contained in:
471615499@qq.com 2024-10-23 22:27:58 +08:00
parent e857ba49d9
commit bdd0e8e3eb
6 changed files with 1263 additions and 135 deletions

View File

@ -4,15 +4,15 @@ const api = {
meetingReservation: '/admin/mr'
}
export function getMeetingReservationList (parameter) {
export function getMeetingReservationList(parameter) {
return axios({
url: api.meetingReservation + '/list',
url: api.meetingReservation + '/list?pageNum=' + parameter.pageNum + '&pageSize=' + parameter.pageSize,
method: 'post',
data: parameter
})
}
export function getAllRoom (parameter) {
export function getAllRoom(parameter) {
return axios({
url: api.meetingReservation + '/getAllRoom',
method: 'post',
@ -20,18 +20,16 @@ export function getAllRoom (parameter) {
})
}
export function saveMeetingReservation (parameter) {
export function saveMeetingReservation(parameter) {
let act = parameter.mr.id == '' ? '/booking' : '/update'
return axios({
url: api.meetingReservation + (parameter.id > 0 ? '/update' : '/save'),
url: api.meetingReservation + act,
method: 'post',
data: parameter,
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
data: parameter
})
}
export function delMeetingReservation (parameter) {
export function delMeetingReservation(parameter) {
return axios({
url: api.meetingReservation + '/remove',
method: 'post',
@ -39,4 +37,62 @@ export function delMeetingReservation (parameter) {
})
}
/**
* 单位认证
* @param parameter
* @returns {AxiosPromise}
*/
export function depLogin(parameter) {
return axios({
url: api.meetingReservation + '/login',
method: 'post',
data: parameter
})
}
/**
* 会议室详情
* @param parameter
* @returns {AxiosPromise}
*/
export function meetingRoomDetail(parameter) {
return axios({
url: api.meetingReservation + '/roomMrs',
method: 'post',
data: parameter
})
}
/**
* 获取单位列表
* @returns {AxiosPromise}
*/
export function getDep() {
return axios({
url: api.meetingReservation + '/getOrg',
method: 'post'
})
}
// 会议室-取消预约
export function cancelOrder(parameter) {
parameter.operate = 'CANCEL'
return axios({
// url: '/api/roomContent/cancelOrder',
url: api.meetingReservation + '/handle',
method: 'post',
data: parameter
})
}
// 获取预约信息
export function getOrderInfo(parameter) {
return axios({
url: api.meetingReservation + '/getInfo',
method: 'post',
data: parameter
})
}
export const meetingReservationExport = api.meetingReservation + '/export'

View File

@ -1,11 +1,42 @@
<template>
<a-card :bordered="false">
<div class="table-page-search-wrapper">
<a-form layout="inline">
<a-row :gutter="48">
<a-card :bordered='false'>
<a-card :bordered='false' v-if='showDepForm'>
<a-form :form='form'>
<a-row>
<a-col :span='10'>
<a-form-item label='单位帐号' :labelCol='labelCol' :wrapperCol='wrapperCol'>
<a-input placeholder='请输入单位帐号'
v-decorator="['loginName',{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 type='password' placeholder='请输入单位密码'
v-decorator="['password',{rules: [{ required: true, message: '输入单位密码' }]}]" />
</a-form-item>
</a-col>
</a-row>
<a-row>
<a-col :span='10'>
<a-form-model-item :wrapper-col='{ span: 14, offset: 8 }'>
<a-button type='primary' @click='getDepInfo'>
认证
</a-button>
</a-form-model-item>
</a-col>
</a-row>
</a-form>
</a-card>
<div class='table-page-search-wrapper' v-if='!showDepForm'>
<a-form layout='inline'>
<a-row :gutter='48'>
<a-col :md='5' :sm='15'>
<a-form-item label='预约时间'>
<a-date-picker :default-value='nowDate' @change="chooseDate" :disabled-date="disabledDate" />
<a-date-picker :default-value='nowDate' @change='chooseDate' :disabled-date='disabledDate' />
</a-form-item>
</a-col>
<a-col :md='5' :sm='15'>
@ -47,30 +78,31 @@
</a-select>
</a-form-item>
</a-col>
<a-col :md="8" :sm="24">
<span class="table-page-search-submitButtons">
<a-button type="primary" @click="getAllRoomList">查询会议室</a-button>
<!-- <a-button style="margin-left: 8px" @click="() => queryParam = {}">重置</a-button>-->
<a-col :md='8' :sm='24'>
<span class='table-page-search-submitButtons'>
<a-button type='primary' @click='getAllRoomList'>查询会议室</a-button>
<!-- <a-button style="margin-left: 8px" @click="() => queryParam = {}">重置</a-button>-->
</span>
</a-col>
</a-row>
</a-form>
<div class="room">
<div class="roomItem" v-for="item in roomList">
<div class="title">
<div class='room'>
<div class='roomItem' v-for='item in roomList'>
<div class='title'>
{{ item.name }}
</div>
<div class="nav">
<div class="nav-item" v-for="room in item.list" :key="room.id">
<div class="desc">
<div class='nav'>
<div class='nav-item' v-for='room in item.list' :key='room.id'>
<div class='desc'>
{{ room.name }}
</div>
<div class="am" v-if='room.am == 0'>上午</div>
<div class="am disabled" v-if='room.am == 1'>上午</div>
<div class="am disabled">上午</div>
<div class="pm">下午</div>
<div class="night">晚上</div>
<div class="desc-item">
<div class='am' v-if='room.am == 0' @click='goOrder(room.id, 1, room.am)'>上午</div>
<div class='am disabled' v-if='room.am == 1' @click='goOrder(room.id, 1, room.am)'>上午</div>
<div class='pm' v-if='room.pm == 0' @click='goOrder(room.id, 2, room.pm)'>下午</div>
<div class='pm disabled' v-if='room.pm == 1' @click='goOrder(room.id, 2, room.pm)'>下午</div>
<div class='night' v-if='room.night == 0' @click='goOrder(room.id, 3, room.night)'>晚上</div>
<div class='night disabled' v-if='room.night == 1' @click='goOrder(room.id, 3, room.night)'>晚上</div>
<div class='desc-item'>
{{ room.capacityNum }}&nbsp;{{ room.typeName }}
</div>
</div>
@ -78,25 +110,32 @@
</div>
</div>
</div>
<RoomOrder-modal ref='modal' @ok='handleOk' />
</a-card>
</template>
<script>
import { getAllRoom } from '@/api/admin/meeting/meetingReservation'
import {
getRoomContentList, delRoomContent, selectSearchInfoByType,
selectSearchInfoByShape, selectSearchInfoByCapacity, addRoomServe,
selectRoomServeByRoom, selectRoomItemByRoom, getMeetingDict
} from '@/api/admin/meeting/roomContent'
import { getAllRoom, depLogin, getOrderInfo } from '@/api/admin/meeting/meetingReservation'
import { getMeetingDict, saveRoomContent } from '@/api/admin/meeting/roomContent'
import moment from 'moment'
import RoomOrderModal from '@/views/admin/meeting/modules/RoomOrderModal.vue'
export default {
name: 'MeetingMangerList',
data () {
components: { RoomOrderModal },
data() {
return {
nowDate: moment().format('YYYY-MM-DD'), //
labelCol: {
xs: { span: 24 },
sm: { span: 8 }
},
wrapperCol: {
xs: { span: 35 },
sm: { span: 16 }
},
form: this.$form.createForm(this),
nowDate: moment().format('YYYY-MM-DD'), //
mdl: {},
// /
advanced: false,
@ -110,15 +149,39 @@ export default {
capacityList: [],
shapeList: [],
typeList: [],
roomList: []
//
roomList: [],
showDepForm: true,
depId: '',
dep: '',
rId: '' // id
}
},
created () {
this.getAllRoomList()
created() {
},
mounted() {
let rId = this.$route.query.rId
if (rId) {
this.rId = rId
//
getOrderInfo({ id: rId }).then(res => {
if (res.code == 0) {
this.depId = res.mr.userOrgId
this.dep = res.mr.userOrg
this.showDepForm = false
} else {
//
this.rId = ''
}
})
} else {
//
if (this.depId != '') {
this.showDepForm = false
}
}
this.getDict()
this.getAllRoomList()
},
methods: {
chooseDate(date, dateString) {
@ -173,11 +236,43 @@ export default {
}
this.getAllRoomList()
},
toMeetingList (item) {
this.$router.push({ name: 'reservation', params: { roomId: item.name } })
},
getAllRoomList () {
getAllRoom({ timeFormat: 0, min: 1, max: 1000 }).then(res => {
getAllRoomList() {
let minPerNum = 0
let maxPerNum = 1000
let perNumValue = this.queryParam.capacityNum
if (perNumValue == 1) {
// 1-20
maxPerNum = 20
minPerNum = 1
} else if (perNumValue == 2) {
// 21-50
minPerNum = 21
maxPerNum = 50
} else if (perNumValue == 3) {
// 51-100
minPerNum = 51
maxPerNum = 100
} else if (perNumValue == 4) {
// 51-100
minPerNum = 101
maxPerNum = 1000
} else {
//
minPerNum = 1
maxPerNum = 1000
}
let param = {
floor: this.queryParam.typeName, //
min: minPerNum, //
max: maxPerNum, //
// devices: devicesArr, //
typeName: this.queryParam.shape, //
timeFormat: 1, // 0 123 4 0startTimeendTimemrdate1 am 0 1 pm 0 1 night 0 11
mrdate: this.nowDate
}
getAllRoom(param).then(res => {
const roomArr = {}
const valueObj = res.data
// eslint-disable-next-line no-unused-vars
@ -195,6 +290,58 @@ export default {
this.roomList = roomArr
console.log(this.roomList)
})
},
getDepInfo(e) {
e.preventDefault()
this.form.validateFields((err, values) => {
if (!err) {
console.log('单位认证:', values)
depLogin(values)
.then((res) => {
if (res.code === 0) {
this.depId = res.data.orgId
this.dep = res.data.orgName
this.$message.success(this.dep + ',欢迎您!')
this.showDepForm = false
} else {
this.$message.error(res.msg)
}
})
.catch(() => {
this.$message.error('系统错误,请稍后再试')
})
.finally(() => {
})
}
})
},
goOrder(id, timeRange, status) {
let data = {
date: this.nowDate,
timeRange: timeRange,
status: status,
id: id,
dep: this.dep,
depId: this.depId
}
if (this.rId != '') {
data.rId = this.rId
data.act = 1 //
this.handleEdit(data)
} else {
this.handleAdd(data)
}
},
handleAdd(data) {
this.$refs.modal.add(data)
},
handleEdit(data) {
this.$refs.modal.edit(data)
},
handleOk() {
//
this.$router.push({ name: 'reservation' })
// this.getAllRoomList()
}
}
}
@ -204,10 +351,12 @@ export default {
.room {
border-top: 1px solid rgb(221 215 215 / 65%);
}
.room .title {
font-size: 32px;
font-weight: 700;
}
.roomItem {
margin-top: 20px;
}
@ -215,28 +364,20 @@ export default {
.roomItem .desc {
width: 150px;
height: 30px;
//background-color: #A3CDFF;
//border-radius: 10px 10px 0 0px;
line-height: 30px;
text-align: center;
font-size: 20px;
margin-top: 20px;
font-weight: 700;
//background-color: #A3CDFF; //border-radius: 10px 10px 0 0px; line-height: 30px; text-align: center; font-size: 20px; margin-top: 20px; font-weight: 700;
}
.roomItem .am, .roomItem .pm, .roomItem .night{
.roomItem .am, .roomItem .pm, .roomItem .night {
width: 150px;
height: 30px;
background-color: #A3CDFF;
//border-radius: 10px 10px 0 0px;
line-height: 30px;
text-align: center;
font-size: 16px;
margin-top: 2px;
cursor: pointer;
//border-radius: 10px 10px 0 0px; line-height: 30px; text-align: center; font-size: 16px; margin-top: 2px; cursor: pointer;
}
.roomItem .disabled {
background-color: #F2F2F2 !important;
}
.roomItem .desc-item {
width: 150px;
height: 30px;

View File

@ -6,53 +6,56 @@
<a-col :md='5' :sm='15'>
<a-form-item label='状态'>
<a-select v-model='queryParam.status'>
<a-select-option value='1'>
取消
</a-select-option>
<a-select-option value='3'>
驳回
</a-select-option>
<a-select-option value='4'>
占用
<a-select-option value=''>
全部预约
</a-select-option>
<a-select-option value='5'>
待审核
</a-select-option>
<a-select-option value='7'>
审核通过
</a-select-option>
<a-select-option value='9'>
进行中
待开始
</a-select-option>
<a-select-option value='11'>
已结束
</a-select-option>
<a-select-option value='1'>
已取消
</a-select-option>
<a-select-option value='3'>
已驳回
</a-select-option>
<a-select-option value='4'>
占用
</a-select-option>
<a-select-option value='9'>
进行中
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :md='5' :sm='15'>
<a-form-item label='会议室'>
<a-input placeholder='请输入会议室' v-model='queryParam.name' />
<a-form-item label='会议名称'>
<a-input placeholder='请输入会议名称' v-model='queryParam.title' />
</a-form-item>
</a-col>
<!-- <a-col :md='5' :sm='15'>-->
<!-- <a-form-item label='参与人数'>-->
<!-- <a-input placeholder='请输入参与人数' v-model='queryParam.personNum' />-->
<!-- </a-form-item>-->
<!-- </a-col>-->
<!-- <a-col :md='5' :sm='15'>-->
<!-- <a-form-item label='姓名'>-->
<!-- <a-input placeholder='请输入预约人姓名' v-model='queryParam.bookingUserName' />-->
<!-- </a-form-item>-->
<!-- </a-col>-->
<!-- <a-col :md='5' :sm='15'>-->
<!-- <a-form-item label='联系电话'>-->
<!-- <a-input placeholder='请输入预约人联系电话' v-model='queryParam.bookingUserPhone' />-->
<!-- </a-form-item>-->
<!-- </a-col>-->
<a-col :md='5' :sm='15'>
<a-form-item label='参与人数'>
<a-input placeholder='请输入参与人数' v-model='queryParam.personNum' />
</a-form-item>
</a-col>
<a-col :md='5' :sm='15'>
<a-form-item label='姓名'>
<a-input placeholder='请输入预约人姓名' v-model='queryParam.bookingUserName' />
</a-form-item>
</a-col>
<a-col :md='5' :sm='15'>
<a-form-item label='联系电话'>
<a-input placeholder='请输入预约人联系电话' v-model='queryParam.bookingUserPhone' />
</a-form-item>
</a-col>
<a-col :md='5' :sm='15'>
<a-form-item label='单位名称'>
<a-input placeholder='请输入单位名称' v-model='queryParam.userOrg' />
<a-form-item label='预约单位'>
<a-input placeholder='预约单位' v-model='queryParam.userOrg' />
</a-form-item>
</a-col>
<a-col :md='8' :sm='24'>
@ -70,6 +73,7 @@
</div>
<s-table
size='default'
showPagination='true'
ref='table'
rowKey='id'
:rowSelection='{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}'
@ -82,7 +86,7 @@
取消
</a-tag>
<a-tag v-if='record.status == 3' color='red'>
驳回
驳回
</a-tag>
<a-tag v-if='record.status == 4' color='purple'>
占用
@ -91,7 +95,7 @@
待审核
</a-tag>
<a-tag v-if='record.status == 7' color='green'>
审核通过
待开始
</a-tag>
<a-tag v-if='record.status == 9' color='cyan'>
进行中
@ -101,30 +105,59 @@
</a-tag>
</span>
<span slot='action' slot-scope='text, record'>
<a v-if='editEnabel' @click='handleEdit(record)'>编辑</a>
<a-divider type='vertical' />
<a v-if='removeEnable' @click='delByIds([record.id])'>删除</a>
<a @click='handleShow(record.id)'>查看</a>
<a-divider v-if='record.canCancel || record.canEdit' type='vertical' />
<a v-if='record.canCancel' @click='cancelConfirm(record.id)'>取消预约</a>
<a-divider v-if='record.canCancel && record.canEdit' type='vertical' />
<a-dropdown :trigger="['click']" v-if='record.canEdit'>
<a class='ant-dropdown-link' @click='e => e.preventDefault()'>
修改信息
</a>
<a-menu slot='overlay'>
<a-menu-item key='0' @click='handleEdit(record.id, 1)'>
重新选择时间会议室
</a-menu-item>
<a-menu-item key='1' @click='handleEdit(record.id,2)'>
重新编辑会议信息
</a-menu-item>
</a-menu>
</a-dropdown>
</span>
</s-table>
<meetingReservation-modal ref='modal' @ok='handleOk' />
<RoomOrder-modal ref='modal' @ok='handleOk' />
<RoomOrderDetail-modal ref='detailModal' />
<a-modal
title='取消预约'
:visible='showCancelReason'
@ok='cancelOrderSub'
@cancel='onCloseCancel'
>
<a-textarea
v-model='cancelReason'
placeholder='请输入取消预约原因'
:auto-size='{ minRows: 3, maxRows: 5 }'
/>
</a-modal>
</a-card>
</template>
<script>
import { STable } from '@/components'
import { delMeetingReservation, getMeetingReservationList } from '@/api/admin/meeting/meetingReservation'
import MeetingReservationModal from './modules/MeetingReservationModal.vue'
import { getMeetingReservationList, cancelOrder } from '@/api/admin/meeting/meetingReservation'
import { checkPermission } from '@/utils/permissions'
import { getRoomServeList } from '@/api/admin/meeting/roomServe'
import { delRoomContent } from '@/api/admin/meeting/roomContent'
import { selfFormatTimeYMD, selfFormatTimeHM } from '@/utils/util'
import RoomOrderModal from '@/views/admin/meeting/modules/RoomOrderModal.vue'
import RoomOrderDetailModal from '@/views/admin/meeting/modules/RoomOrderDetailModal.vue'
export default {
name: 'TableList',
components: {
STable,
MeetingReservationModal
RoomOrderModal,
RoomOrderDetailModal
},
data() {
return {
@ -179,26 +212,62 @@ export default {
},
{
title: '操作',
width: '200px',
// width: '200px',
dataIndex: 'action',
scopedSlots: { customRender: 'action' }
}
],
// Promise
loadData: parameter => {
this.queryParam.name = this.$route.params.roomId
// this.queryParam.name = this.$route.params.roomId
//
return getMeetingReservationList(Object.assign(parameter, this.queryParam)).then(res => {
for (let key in res.rows) {
let startTime = res.rows[key].start
let endTime = res.rows[key].end
res.rows[key].timeSlot = selfFormatTimeYMD(startTime) + ' ' + selfFormatTimeHM(startTime) + '~' + selfFormatTimeHM(endTime)
//
// 1 3 4 5 7 9 11
let statusValue = res.rows[key].status
let showCancel = false //
let showEdit = false //
if (statusValue == 1) {
//
showEdit = true
}
if (statusValue == 3) {
// showCancel = true
showEdit = true
}
if (statusValue == 4) {
//
}
if (statusValue == 5) {
//
showCancel = true
}
if (statusValue == 7) {
//
showCancel = true
}
if (statusValue == 9) {
//
}
if (statusValue == 11) {
//
}
res.rows[key].canCancel = showCancel
res.rows[key].canEdit = showEdit
}
console.log(res)
return res
})
},
selectedRowKeys: [],
selectedRows: [],
showCancelReason: false,
cancelReason: '',
cancelId: ''
}
},
filters: {},
@ -213,43 +282,61 @@ export default {
this.selectedRowKeys = selectedRowKeys
this.selectedRows = selectedRows
},
handleAdd() {
this.$refs.modal.add()
//
handleEdit(id, type) {
if (type == 1) {
this.$router.push({ name: 'manger', query: { rId: id } })
} else {
let data = {
act: 2,
rId: id
}
this.$refs.modal.edit(data)
}
},
handleEdit(id) {
this.$refs.modal.edit(id)
//
handleShow(id) {
this.$refs.detailModal.show(id)
},
handleOk(status) {
status = status || false
this.$refs.table.refresh(status)
},
delByIds(ids) {
const _this = this
if (ids === '') {
this.$message.error('请选择后删除!')
/**
* 取消预约
* @param id
*/
cancelConfirm(id) {
this.cancelId = id
this.showCancelReason = true
},
onCloseCancel() {
this.cancelId = ''
this.showCancelReason = false
this.cancelReason = ''
},
cancelOrderSub() {
if (this.cancelReason == '') {
this.$message.error('请输入取消预约原因!')
return
}
this.$confirm({
title: '警告',
content: '删除后不可恢复,是否确认删除?',
okText: '是',
okType: 'warning',
cancelText: '否',
onOk() {
delMeetingReservation({ ids: ids.join(',') }).then((res) => {
if (res.code === 0) {
_this.$message.success('删除成功')
_this.handleOk()
cancelOrder({
id: this.cancelId,
content: this.cancelReason
}).then(res => {
console.log('cancelOrderRq', res)
if (res.code == 0) {
this.$message.success('已取消!')
this.showCancelReason = false
this.handleOk()
} else {
_this.$message.error(res.msg)
this.$message.error(res.msg)
}
_this.selectedRowKeys = []
}).catch(() => {
this.$message.error('系统错误,请稍后再试')
}).finally(() => {
// this.confirmLoading = false
})
},
onCancel() {
}
})
}
},
watch: {

View File

@ -0,0 +1,240 @@
<template>
<a-modal
title='预约详情'
style='top: 20px'
width='1200px'
v-model='visible'
:ok-button-props='{style:{display:"none"}}'
@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='预约信息' style='margin-top: 10px'>
<a-descriptions title='' bordered>
<a-descriptions-item label='会议时间'>
{{ order.timeSlot }}
</a-descriptions-item>
<a-descriptions-item label='会议名称'>
{{ order.title }}
</a-descriptions-item>
<a-descriptions-item label='参会人数'>
{{ order.personNum }}
</a-descriptions-item>
<a-descriptions-item label='参会领导'>
{{ order.leader }}
</a-descriptions-item>
<a-descriptions-item label='预约部门'>
{{ order.userOrg }}
</a-descriptions-item>
<a-descriptions-item label='会议预约人'>
{{ order.bookingUserName }}
</a-descriptions-item>
<a-descriptions-item label='联系方式'>
{{ order.bookingUserPhone }}
</a-descriptions-item>
<a-descriptions-item label='备注' :span='2'>
{{ order.remark }}
</a-descriptions-item>
<a-descriptions-item label='会议服务' :span='3'>
{{ order.service }}
</a-descriptions-item>
<a-descriptions-item label='会务人员' :span='3'>
</a-descriptions-item>
</a-descriptions>
</a-card>
</a-modal>
</template>
<script>
import {
meetingRoomDetail, getDep, saveMeetingReservation, getOrderInfo
} 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'
export default {
name: 'RoomOrderDetailModal',
props: {},
components: {},
data() {
return {
visible: false,
labelCol: {
xs: { span: 24 },
sm: { span: 8 }
},
wrapperCol: {
xs: { span: 35 },
sm: { span: 16 }
},
id: '',
rId: '',
banner: '',
roomDetail: {},
recordList: [],
order: {},
recordCol: [{
title: '预约时间',
dataIndex: 'time'
}, {
title: '预约单位',
dataIndex: 'userOrg'
}, {
title: '预约人',
dataIndex: 'bookingUserName'
}, {
title: '联系方式',
dataIndex: 'bookingUserPhone'
}]
}
},
beforeCreate() {
},
created() {
},
mounted() {
// this.getDict()
},
methods: {
show(id) {
this.rId = id
getOrderInfo({ id: this.rId }).then((res) => {
this.id = res.mr.roomId
this.getRoomInfo()
let sTime = res.mr.start
let eTime = res.mr.end
res.mr.timeSlot = moment(sTime).format('YYYY-MM-DD HH:mm') + '~' + moment(eTime).format('HH:mm')
//
let service = ''
for (let key in res.serve) {
service += '#' + res.serve[key]['name'] + ' '
}
res.mr.service = service
this.order = res.mr
})
this.visible = true
},
getRoomInfo() {
meetingRoomDetail({
roomId: this.id
}).then(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)
})
}
}
}
</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>

View File

@ -0,0 +1,604 @@
<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='10'>
<a-form-item label='预约时间' :labelCol='labelCol' :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-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
} 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'
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
}
},
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() {
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
})
},
add(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 = '全天'
}
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
// 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
})
// ext1
// values.ext1 = serviceStr
// values.floorId = this.typeMap[values.floor]
// values.typeId = this.shapeMap[values.typeName]
// saveRoomContent(values, files)
// .then((res) => {
// if (res.code === 0) {
// // this.$message.success('')
// // this.$emit('ok')
// this.visible = false
// } else {
// this.$message.error(res.msg)
// }
// })
// .catch(() => {
// this.$message.error('')
// })
// .finally(() => {
// // this.confirmLoading = false
// })
}
})
},
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>

View File

@ -209,10 +209,10 @@ export default {
},
loginForm() {
//
// if (!this.capctchaCheck) {
// this.$refs.verify.show()
// return false
// }
if (!this.capctchaCheck) {
this.$refs.verify.show()
return false
}
const {
form: { validateFields },
state,