BookingService/frontend/src/views/booking/Booking.vue

361 lines
11 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>
<page-layout title="预约">
<a-card>
<a-row>
<a-input-group class="tool">
<a-row :gutter="6">
<a-col
class="item"
v-bind="layout1">
<a-range-picker
style="width: 100%;"
:defaultValue="getDateRangeDefaultValue()"
:value="state.dateRange"
@change="hangdleDateRangeChange">
</a-range-picker>
</a-col>
<a-col
class="item"
v-bind="layout1">
<a-time-picker
style="width: 100%;"
placeholder="选择开始时间"
:minuteStep="30"
:secondStep="60"
:disabledHours="getDisabledHours"
:disabledMinutes="getDisabledMinutes"
:hideDisabledOptions="true"
:inputReadOnly="true"
v-model="state.startTime"
@change="handleStartTimeChange">
</a-time-picker>
</a-col>
<a-col
class="item"
v-bind="layout1">
<a-time-picker
style="width: 100%;"
placeholder="选择结束时间"
:minuteStep="30"
:secondStep="60"
:disabledHours="getDisabledHours"
:disabledMinutes="getDisabledMinutes"
:hideDisabledOptions="true"
:inputReadOnly="true"
v-model="state.endTime"
@change="handleEndTimeChange">
</a-time-picker>
</a-col>
</a-row>
<a-row :gutter="6">
<a-col
class="item"
v-bind="layout1">
<a-select
v-model="params.room"
style="width: 100%;"
@change="getData">
<a-select-option value="">房间筛选</a-select-option>
<a-select-option :value="item.id" v-for="item in roomList">{{item.name}}</a-select-option>
</a-select>
</a-col>
<a-col
class="item"
v-bind="layout1">
<a-select
v-model="params.status"
style="width: 100%;"
@change="getData">
<a-select-option value="">状态筛选</a-select-option>
<a-select-option :value="item.id" v-for="item in statusList">{{item.name}}</a-select-option>
</a-select>
</a-col>
<a-col
class="item"
v-bind="layout1">
<a-select
v-model="params.ordering"
style="width: 100%;"
@change="getData">
<a-select-option value="">排序</a-select-option>
<a-select-option value="id">ID正排序</a-select-option>
<a-select-option value="-id">ID倒排序</a-select-option>
<a-select-option value="date">日期正排序</a-select-option>
<a-select-option value="-date">日期倒排序</a-select-option>
<a-select-option value="start_time">开始时间正排序</a-select-option>
<a-select-option value="-start_time">开始时间倒排序</a-select-option>
<a-select-option value="end_time">结束时间正排序</a-select-option>
<a-select-option value="-end_time">结束时间倒排序</a-select-option>
</a-select>
</a-col>
<a-col
class="item"
v-bind="layout2">
<a-input
v-model="params.search"
style="width: 100%;"
placeholder="ID用户房间日期"
@keypress.enter="getData">
</a-input>
</a-col>
<a-col
class="item"
v-bind="layout2">
<a-button
style="width: 100%;"
icon="search"
@click="getData">
搜索
</a-button>
</a-col>
<a-col
class="item"
v-bind="layout2">
<a-button
style="width: 100%;"
icon="delete"
@click="handleClearParams">
重置
</a-button>
</a-col>
<a-col
class="item"
v-bind="layout2">
<a-button
type="primary"
icon="plus"
style="width: 100%;"
@click="$router.push({name: 'dashboard'})">
新建
</a-button>
</a-col>
</a-row>
</a-input-group>
</a-row>
<a-row>
<a-col class="item">
<a-table
rowKey="id"
:loading="state.loading"
:columns="columns"
:dataSource="bookingList"
:pagination="false">
<template slot="status" slot-scope="text, record, index">
{{statusList.find(item=>item.id === text).name}}
</template>
<template slot="operation" slot-scope="text, record, index">
<a-button @click="$router.push({name: 'bookingEdit', params: {id: record.id}})">编辑</a-button>
</template>
</a-table>
</a-col>
</a-row>
<a-row>
<a-col class="item">
<span style="vertical-align: -5px">共 {{count}} 条</span>
<a-pagination
v-model="params.page"
@change="handelePage"
style="float: right"
:total="count">
</a-pagination>
</a-col>
</a-row>
</a-card>
</page-layout>
</template>
<script>
const columns = [
{
title: '编号',
dataIndex: 'id',
width: '8%'
},
{
title: '房间',
dataIndex: 'room.name',
width: '14%'
},
{
title: '日期',
dataIndex: 'date',
width: '12%'
},
{
title: '开始时间',
dataIndex: 'start_time',
width: '12%'
},
{
title: '结束时间',
dataIndex: 'end_time',
width: '12%'
},
{
title: '用户',
dataIndex: 'user.username',
width: '14%'
},
{
title: '状态',
dataIndex: 'status',
width: '14%',
scopedSlots: { customRender: 'status' }
},
{
title: '操作',
dataIndex: 'operation',
scopedSlots: { customRender: 'operation' }
}
]
import moment from 'moment'
import bookingAPI from '../../api/booking'
import roomAPI from '../../api/room'
import settingAPI from '../../api/setting'
import PageLayout from '../../components/page/PageLayout'
export default {
name: 'Booking',
components: {
PageLayout
},
data () {
return {
columns,
layout1: {
xs: { span: 24 },
sm: { span: 8 },
xl: { span: 8 },
},
layout2: {
xs: { span: 12 },
sm: { span: 8 },
xl: { span: 6 },
},
params: {
search: '',
page: 1,
ordering: 'date',
room: '',
status: '',
min_date: this.getDateRangeDefaultValue()[0].format('YYYY-MM-DD'),
max_date: this.getDateRangeDefaultValue()[1].format('YYYY-MM-DD'),
min_time: '',
max_time: ''
},
state: {
loading: false,
dateRange: this.getDateRangeDefaultValue(),
startTime: new moment(),
endTime: new moment()
},
roomList: [],
count: 0,
bookingList: [],
statusList: [],
setting: {}
}
},
mounted () {
roomAPI.getRoomList(null)
.then(data => {
this.roomList = data
})
settingAPI.getSettingDetail()
.then(data => {
this.params.min_time = data.start_time
this.params.max_time = data.end_time
data.start_time = new moment(data.start_time, 'HH:mm:ss')
this.state.startTime = data.start_time
data.end_time = new moment(data.end_time, 'HH:mm:ss')
this.state.endTime = data.end_time
this.setting = data
})
bookingAPI.getStatusList()
.then(data=>{
this.statusList = data
})
this.getData()
},
methods: {
getData () {
this.state.loading = true
bookingAPI.getBookingList(this.params)
.then(data => {
this.bookingList = data.results
this.count = data.count
this.state.loading = false
})
.catch(() => {
this.state.loading = false
})
},
handleClearParams () {
this.params = {
search: '',
page: 1,
ordering: 'date',
room: '',
status: '',
min_date: this.getDateRangeDefaultValue()[0].format('YYYY-MM-DD'),
max_date: this.getDateRangeDefaultValue()[1].format('YYYY-MM-DD'),
min_time: this.setting.start_time.format('HH:mm:ss'),
max_time: this.setting.end_time.format('HH:mm:ss')
}
this.state = {
loading: false,
dateRange: this.getDateRangeDefaultValue(),
startTime: this.setting.start_time,
endTime: this.setting.end_time
}
this.getData()
},
handelePage (page) {
this.params.page = page
this.getData()
},
hangdleDateRangeChange (dates, dateStrings) {
this.params.min_date = dateStrings[0]
this.params.max_date = dateStrings[1]
this.getData()
},
handleStartTimeChange (time, timeString) {
this.params.min_time = timeString
this.getData()
},
handleEndTimeChange (time, timeString) {
this.params.max_time = timeString
this.getData()
},
getDateRangeDefaultValue () {
let now = new moment()
let aWeekLater = (new moment()).add(7, 'days')
return [now, aWeekLater]
},
getDisabledHours () {
let ret = []
let start_hour = this.setting.start_time.hour()
let end_hour = this.setting.end_time.hour()
for (let i = 0; i < 24; i++) {
if (i < start_hour || i > end_hour) {
ret.push(i)
}
}
return ret
},
getDisabledMinutes (selectedHour) {
let ret = []
if (selectedHour === this.setting.end_time.hour()) {
ret.push(30)
}
return ret
}
}
}
</script>
<style scoped lang="less">
.item {
margin: 8px 0;
}
</style>