预约列表、审核、分配会务

去掉冗余功能
This commit is contained in:
471615499@qq.com 2024-10-24 22:31:53 +08:00
parent bdd0e8e3eb
commit 3647205419
7 changed files with 508 additions and 115 deletions

View File

@ -95,4 +95,42 @@ export function getOrderInfo(parameter) {
})
}
// 提前占用会议室
export function useRoom(parameter) {
return axios({
url: api.meetingReservation + '/beforehand',
method: 'post',
data: parameter
})
}
// 会议室-取消预约
export function approveOrder(parameter) {
return axios({
// url: '/api/roomContent/cancelOrder',
url: api.meetingReservation + '/handle',
method: 'post',
data: parameter
})
}
// 获取会务人员
export function getStaff() {
return axios({
// url: '/api/roomContent/cancelOrder',
url: api.meetingReservation + '/getWaiter',
method: 'post'
})
}
// 分配会务
export function addStaff(parameter) {
return axios({
// url: '/api/roomContent/cancelOrder',
url: api.meetingReservation + '/addWaiter',
method: 'post',
data: parameter
})
}
export const meetingReservationExport = api.meetingReservation + '/export'

View File

@ -85,40 +85,4 @@ export function millsToTime (mills) {
}
const year = month / 12
return year.toFixed(0) + ' 年'
};
const formatNumber = n => {
n = n.toString()
return n[1] ? n : '0' + n
}
//返回 例 2017-12-12
export function selfFormatTimeYMD(time) {
if (typeof time === "string" && time.includes('-')) {
time = time.replaceAll('-', '/')
}
let date = new Date(time)
let year = date.getFullYear()
let month = date.getMonth() + 1
let day = date.getDate()
let hour = date.getHours()
let minute = date.getMinutes()
let second = date.getSeconds()
return [year, month, day].map(formatNumber).join('-')
}
//返回 12:30
export function selfFormatTimeHM(time) {
if (typeof time === "string" && time.includes('-')) {
time = time.replaceAll('-', '/')
}
let date = new Date(time);
let year = date.getFullYear()
let month = date.getMonth() + 1
let day = date.getDate()
let hour = date.getHours()
let minute = date.getMinutes()
let second = date.getSeconds()
return [hour, minute].map(formatNumber).join(':')
}
};

View File

@ -120,6 +120,7 @@ import { getMeetingDict, saveRoomContent } from '@/api/admin/meeting/roomContent
import moment from 'moment'
import RoomOrderModal from '@/views/admin/meeting/modules/RoomOrderModal.vue'
import { checkPermission } from '@/utils/permissions'
export default {
name: 'MeetingMangerList',
@ -153,7 +154,8 @@ export default {
showDepForm: true,
depId: '',
dep: '',
rId: '' // id
rId: '', // id
isAdmin: checkPermission('meeting:admin')
}
},
created() {
@ -180,6 +182,10 @@ export default {
this.showDepForm = false
}
}
//
if (this.isAdmin) {
this.showDepForm = false
}
this.getDict()
this.getAllRoomList()
},
@ -188,7 +194,13 @@ export default {
this.nowDate = dateString
},
disabledDate(current) {
return current < moment().startOf('day') || current > moment().add(14, 'days')
if (this.isAdmin) {
//
return current < moment().startOf('day') || current > moment().add(1, 'year')
} else {
// 14
return current < moment().startOf('day') || current > moment().add(14, 'days')
}
},
//
getDict() {
@ -277,7 +289,9 @@ export default {
const valueObj = res.data
// eslint-disable-next-line no-unused-vars
for (const key in valueObj) {
const eachObj = valueObj[key]
if (eachObj['floorId'] in roomArr) {
} else {
roomArr[eachObj['floorId']] = {
@ -285,6 +299,12 @@ export default {
list: []
}
}
if (this.isAdmin) {
//
eachObj.am = 0
eachObj.pm = 0
eachObj.night = 0
}
roomArr[eachObj['floorId']]['list'].push(eachObj)
}
this.roomList = roomArr
@ -316,6 +336,10 @@ export default {
})
},
goOrder(id, timeRange, status) {
if (this.isAdmin) {
//
timeRange = 4
}
let data = {
date: this.nowDate,
timeRange: timeRange,

View File

@ -61,7 +61,7 @@
<a-col :md='8' :sm='24'>
<span class='table-page-search-submitButtons'>
<a-button type='primary' @click='$refs.table.refresh(true)'>查询</a-button>
<a-button style='margin-left: 8px' @click='() => queryParam = {}'>重置</a-button>
<a-button style='margin-left: 8px' @click='reset'>重置</a-button>
<a-dropdown v-if='removeEnable&&selectedRowKeys.length > 0'>
<a-button style='margin-left: 8px' type='danger' icon='delete'
@click='delByIds(selectedRowKeys)'>删除</a-button>
@ -76,7 +76,6 @@
showPagination='true'
ref='table'
rowKey='id'
:rowSelection='{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}'
:columns='columns'
:data='loadData'
>
@ -106,9 +105,7 @@
</span>
<span slot='action' slot-scope='text, record'>
<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 v-if='record.canCancel' @click='cancelConfirm(record.id)' style='margin-left: 5px'>取消预约</a>
<a-dropdown :trigger="['click']" v-if='record.canEdit'>
<a class='ant-dropdown-link' @click='e => e.preventDefault()'>
修改信息
@ -122,10 +119,14 @@
</a-menu-item>
</a-menu>
</a-dropdown>
<a v-if='record.canApprove' @click='approve(record.id, 1)' style='margin-left: 5px'>通过</a>
<a v-if='record.canApprove' @click='approve(record.id, 2)' style='margin-left: 5px'>驳回</a>
<a v-if='record.canStaff' @click='staff(record.id)' style='margin-left: 5px'>分配会务</a>
</span>
</s-table>
<RoomOrder-modal ref='modal' @ok='handleOk' />
<RoomOrderDetail-modal ref='detailModal' />
<RoomOrderStaff-modal ref='staffModal' />
<a-modal
title='取消预约'
:visible='showCancelReason'
@ -133,8 +134,20 @@
@cancel='onCloseCancel'
>
<a-textarea
v-model='cancelReason'
placeholder='请输入取消预约原因'
v-model='rejectReason'
placeholder='请输入驳回原因'
:auto-size='{ minRows: 3, maxRows: 5 }'
/>
</a-modal>
<a-modal
title='驳回预约'
:visible='showRejectReason'
@ok='handleReject'
@cancel='onCloseReject'
>
<a-textarea
v-model='rejectReason'
placeholder='请输入驳回原因'
:auto-size='{ minRows: 3, maxRows: 5 }'
/>
</a-modal>
@ -144,20 +157,22 @@
<script>
import { STable } from '@/components'
import { getMeetingReservationList, cancelOrder } from '@/api/admin/meeting/meetingReservation'
import { getMeetingReservationList, cancelOrder, approveOrder } 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 moment from 'moment'
import RoomOrderModal from '@/views/admin/meeting/modules/RoomOrderModal.vue'
import RoomOrderDetailModal from '@/views/admin/meeting/modules/RoomOrderDetailModal.vue'
import RoomOrderStaffModal from '@/views/admin/meeting/modules/RoomOrderStaffModal.vue'
export default {
name: 'TableList',
components: {
STable,
RoomOrderModal,
RoomOrderDetailModal
RoomOrderDetailModal,
RoomOrderStaffModal
},
data() {
return {
@ -174,7 +189,9 @@ export default {
// /
advanced: false,
//
queryParam: {},
queryParam: {
status: ''
},
//
columns: [
{
@ -225,63 +242,103 @@ export default {
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)
res.rows[key].timeSlot = moment(startTime).format('YYYY-MM-DD HH:MM') + '~' + moment(endTime).format('HH:MM')
//
// 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) {
//
let showStaff = false //
let showApprove = false //
if (this.isAdmin) {
// 1 3 4 5 7 9 11
if (statusValue == 1) {
//
}
if (statusValue == 3) {
//
}
if (statusValue == 4) {
//
showEdit = true
// showCancel = true
// showStaff = true
}
if (statusValue == 5) {
//
showEdit = true
// showCancel = true
showApprove = true
// showStaff = true
}
if (statusValue == 7) {
//
showCancel = true
showStaff = true
showEdit = true
}
if (statusValue == 11) {
//
}
} else {
//
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
res.rows[key].canApprove = showApprove
res.rows[key].canStaff = showStaff
}
console.log(res)
return res
})
},
selectedRowKeys: [],
selectedRows: [],
//
showCancelReason: false,
cancelReason: '',
cancelId: ''
cancelId: '',
//
showRejectReason: false,
rejectReason: '',
rejectId: '',
isAdmin: checkPermission('meeting:admin')
}
},
filters: {},
created() {
},
mounted() {
},
methods: {
reset() {
this.queryParam = {}
this.queryParam = { status: '' }
this.$refs.table.refresh(true)
},
onSelectChange(selectedRowKeys, selectedRows) {
this.selectedRowKeys = selectedRowKeys
this.selectedRows = selectedRows
},
//
handleEdit(id, type) {
if (type == 1) {
@ -315,6 +372,11 @@ export default {
this.showCancelReason = false
this.cancelReason = ''
},
onCloseReject() {
this.rejectId = ''
this.showRejectReason = false
this.rejectReason = ''
},
cancelOrderSub() {
if (this.cancelReason == '') {
this.$message.error('请输入取消预约原因!')
@ -337,6 +399,63 @@ export default {
}).finally(() => {
// this.confirmLoading = false
})
},
approve(id, status) {
if (status == 1) {
this.handlePass(id)
} else {
this.rejectId = id
this.showRejectReason = true
this.rejectReason = ''
}
},
handlePass(id) {
let _this = this
this.$confirm({
title: '确认',
content: '是否通过该预约?',
okText: '是',
okType: 'success',
cancelText: '否',
onOk() {
approveOrder({
id: id,
content: '审核通过',
operate: 'PASS'
}).then(res => {
if (res.code === 0) {
_this.$message.success('已审核!')
_this.handleOk()
} else {
_this.$message.error(res.msg)
}
})
},
onCancel() {
}
})
},
handleReject() {
if (this.rejectReason == '' || this.rejectId == '') {
this.$message.error('请输入驳回原因!')
return
}
approveOrder({
id: this.rejectId,
content: this.rejectReason,
operate: 'REJECTED'
}).then(res => {
if (res.code === 0) {
this.$message.success('已审核!')
this.handleOk()
this.showRejectReason = false
} else {
this.$message.error(res.msg)
}
})
},
staff(id) {
this.$refs.staffModal.add(id)
}
},
watch: {

View File

@ -7,6 +7,13 @@
:ok-button-props='{style:{display:"none"}}'
@ok='handleSubmit'
>
<a-alert v-if='order.status == 7' message="预约成功,待开始" type="success" show-icon style='margin-bottom: 10px' />
<a-alert v-if='order.status == 1' message="已取消" :description='order.operate[order.operate.length - 1].content' type="info" show-icon style='margin-bottom: 10px' />
<a-alert v-if='order.status == 3' message="已驳回" :description='order.operate[order.operate.length - 1].content' type="error" show-icon style='margin-bottom: 10px' />
<a-alert v-if='order.status == 4' message="占用" type="info" show-icon style='margin-bottom: 10px' />
<a-alert v-if='order.status == 5' message="待审核" type="info" show-icon style='margin-bottom: 10px' />
<a-alert v-if='order.status == 9' message="进行中" type="success" show-icon style='margin-bottom: 10px' />
<a-alert v-if='order.status == 11' message="已结束" type="warning" show-icon style='margin-bottom: 10px' />
<a-card title='会议室情况'>
<a-tabs default-active-key='1' @change='callback'>
<a-tab-pane key='1' tab='会议室详情'>
@ -67,6 +74,9 @@
{{ order.service }}
</a-descriptions-item>
<a-descriptions-item label='会务人员' :span='3'>
音控组{{ order.staff.music }}
<br />
会务服务组{{ order.staff.serve }}
</a-descriptions-item>
</a-descriptions>
</a-card>
@ -130,19 +140,42 @@ export default {
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
//
let staff = {
music: '',
serve: ''
}
for (let key in res.waiters) {
if (res.waiters[key].type == '1') {
//
staff.music += '#' + res.waiters[key].username + ' '
}
if (res.waiters[key].type == '3') {
//
staff.serve += '#' + res.waiters[key].username + ' '
}
}
if (staff.music == '') {
staff.music = '无'
}
if (staff.serve == '') {
staff.serve = '无'
}
res.mr.staff = staff
this.order = res.mr
})
this.visible = true
},

View File

@ -46,15 +46,21 @@
<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: '选择会议时间' }]}]"
<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: '选择会议时间' }]}]"
<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>
@ -81,7 +87,7 @@
<a-col :span='10'>
<a-form-item label='预约部门' :labelCol='labelCol' :wrapperCol='wrapperCol'>
<a-select show-search v-decorator="['userOrgId',{rules: [{ required: true, message: '选择预约部门' }]}]"
placeholder='预约部门'>
placeholder='请选择预约部门'>
<a-select-option v-for='item in depList' :value='item.id'>
{{ item.name }}
</a-select-option>
@ -129,13 +135,14 @@
</template>
<script>
import {
meetingRoomDetail, getDep, saveMeetingReservation, getOrderInfo
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'
export default {
name: 'RoomOrderModal',
@ -181,7 +188,8 @@ export default {
serviceMap: {},
disabledConfirm: false,
depList: [],
disabledTime: false
disabledTime: false,
isAdmin: checkPermission('meeting:admin')
}
},
beforeCreate() {
@ -227,6 +235,7 @@ export default {
})
},
add(data) {
console.log(data)
this.id = data.id
this.timeRange = data.timeRange
if (this.timeRange == 1) {
@ -289,7 +298,7 @@ export default {
this.dep = data.dep
//
this.getRoomInfo()
} else if(act == 2) {
} else if (act == 2) {
//
this.disabledTime = true
console.log('编辑信息')
@ -402,7 +411,10 @@ export default {
}
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) {
@ -432,29 +444,54 @@ export default {
}).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
// })
}
})
},
//
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

View File

@ -0,0 +1,178 @@
<template>
<a-modal
title='会务人员'
style='top: 20px'
width='800px'
v-model='visible'
@ok='handleSubmit'
>
<a-card title='音控组'>
<div>
<div :style="{ borderBottom: '1px solid #E9E9E9' }">
<a-checkbox :indeterminate='indeterminateMusic' :checked='checkAllMusic' @change='onCheckAllMusic'>
全选
</a-checkbox>
</div>
<br />
<a-checkbox-group v-model='musicChecked' :options='musicOp' @change='onChangeMusic' />
</div>
</a-card>
<a-card title='会务服务组'>
<div>
<div :style="{ borderBottom: '1px solid #E9E9E9' }">
<a-checkbox :indeterminate='indeterminateServe' :checked='checkAllServe' @change='onCheckAllServe'>
全选
</a-checkbox>
</div>
<br />
<a-checkbox-group v-model='serveChecked' :options='serveOp' @change='onChangeServe' />
</div>
</a-card>
</a-modal>
</template>
<script>
import {
getOrderInfo, getStaff, addStaff
} from '@/api/admin/meeting/meetingReservation'
import pick from 'lodash.pick'
import moment from 'moment'
import { ACCESS_TOKEN } from '@/store/mutation-types'
export default {
name: 'RoomOrderStaffModal',
props: {},
components: {},
data() {
return {
visible: false,
rId: '', // id
musicOp: [],
musicChecked: [],
indeterminateMusic: true,
checkAllMusic: false,
serveOp: [],
serveChecked: [],
indeterminateServe: true,
checkAllServe: false
}
},
beforeCreate() {
},
created() {
},
mounted() {
// this.getDict()
},
methods: {
add(id) {
this.rId = id
//
getOrderInfo({ id: id }).then(res => {
let staffMusicIdArr = []
let staffServeIdArr = []
let staff = res.waiters
for (let key in staff) {
if (staff[key].type == '1') {
staffMusicIdArr.push(staff[key].userId)
}
if (staff[key].type == '3') {
staffServeIdArr.push(staff[key].userId)
}
}
this.musicChecked = staffMusicIdArr
this.serveChecked = staffServeIdArr
getStaff().then(resStaff => {
let musicList = []
let serveList = []
for (let key in resStaff.voiceWaiter) {
let eachObj = resStaff.voiceWaiter[key]
musicList.push({
value: eachObj.id,
label: eachObj.username
})
}
for (let key in resStaff.serveWaiter) {
let eachObj = resStaff.serveWaiter[key]
serveList.push({
value: eachObj.id,
label: eachObj.username
})
}
this.musicOp = musicList
this.serveOp = serveList
this.onChangeServe()
this.onChangeMusic()
})
})
this.visible = true
},
onChangeMusic() {
this.indeterminateMusic = !!this.musicChecked.length && this.musicChecked.length < this.musicOp.length
this.checkAllMusic = this.musicChecked.length === this.musicOp.length
},
onCheckAllMusic(e) {
let allMusicOpValue = []
for (let key in this.musicOp) {
allMusicOpValue.push(this.musicOp[key].value)
}
Object.assign(this, {
musicChecked: e.target.checked ? allMusicOpValue : [],
indeterminateMusic: false,
checkAllMusic: e.target.checked
})
},
onChangeServe() {
this.indeterminateServe = !!this.serveChecked.length && this.serveChecked.length < this.serveOp.length
this.checkAllServe = this.serveChecked.length === this.serveOp.length
},
onCheckAllServe(e) {
let allServeOpValue = []
for (let key in this.serveOp) {
allServeOpValue.push(this.serveOp[key].value)
}
Object.assign(this, {
serveChecked: e.target.checked ? allServeOpValue : [],
indeterminateServe: false,
checkAllServe: e.target.checked
})
},
handleSubmit(e) {
e.preventDefault()
let staffMusicList = this.musicChecked
let staffServeList = this.serveChecked
let musicId = ''
for (let key in staffMusicList) {
musicId += staffMusicList[key] + ','
}
if (musicId != '') {
// ,
musicId = musicId.substring(0, musicId.length - 1)
}
let serveId = ''
for (let key in staffServeList) {
serveId += staffServeList[key] + ','
}
if (serveId != '') {
// ,
serveId = serveId.substring(0, serveId.length - 1)
}
addStaff({
id: this.rId,
voiceWaiter: musicId,
serveWaiter: serveId
}).then(res => {
if (res.code == 0) {
this.$message.success('已分配会务人员!')
this.visible = false
} else {
this.$message.error(res.msg)
}
})
}
}
}
</script>
<style scoped>
</style>