改首页;

加入统计下钻;
加入数据导出
This commit is contained in:
471615499@qq.com 2024-10-25 21:39:53 +08:00
parent 3647205419
commit e18408b7f4
9 changed files with 187 additions and 43 deletions

View File

@ -133,4 +133,25 @@ export function addStaff(parameter) {
}) })
} }
// 按天导出会议室预约记录列表
export function expMRByDate(parameter){
return axios({
// url: '/api/roomContent/cancelOrder',
url: api.meetingReservation + '/io/exportDayMR',
method: 'post',
params: parameter,
responseType: 'blob'
})
}
// 按月导出会议室预约记录
export function expMRByMonth(parameter){
return axios({
// url: '/api/roomContent/cancelOrder',
url: api.meetingReservation + '/io/exportMonthMR',
method: 'post',
params: parameter,
responseType: 'blob'
})
}
export const meetingReservationExport = api.meetingReservation + '/export' export const meetingReservationExport = api.meetingReservation + '/export'

View File

@ -21,6 +21,15 @@ export function exportRepair (parameter) {
}) })
} }
export function exportRepairType (parameter) {
return axios({
url: api.repairFailureType + '/exportCategory',
method: 'get',
params: parameter,
responseType: 'blob'
})
}
export function importData (data) { export function importData (data) {
return axios({ return axios({
url: api.repairFailureType + '/importRepair', url: api.repairFailureType + '/importRepair',

View File

@ -14,7 +14,7 @@ export const defaultRouterMap = [
export const constantRouterMap = [ export const constantRouterMap = [
{ {
path: '/', path: '/',
redirect: '/admin/repair/RepairDeviceList/repairStatistics' // 默认首页 redirect: '/dashboard/Analysis' // 默认首页
}, },
{ {
path: '/user', path: '/user',

View File

@ -12,7 +12,7 @@ NProgress.configure({ showSpinner: false }) // NProgress Configuration
const allowList = ['login', 'register', 'registerResult', 'chart'] // no redirect allowList const allowList = ['login', 'register', 'registerResult', 'chart'] // no redirect allowList
const loginRoutePath = '/user/login' const loginRoutePath = '/user/login'
const defaultRoutePath = '/admin/repair/RepairDeviceList/repairStatistics' // 登录跳转 const defaultRoutePath = '/dashboard/Analysis' // 登录跳转
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {

View File

@ -24,7 +24,7 @@ const rootRouter = {
'key': '', 'key': '',
'name': 'index', 'name': 'index',
'component': 'BasicLayout', 'component': 'BasicLayout',
'redirect': '/admin/repair/RepairDeviceList/repairStatistics', // 登录跳转 'redirect': '/dashboard/Analysis', // 登录跳转
'children': [] 'children': []
} }

View File

@ -10,31 +10,31 @@
type="inner" type="inner"
@openChange="onOpenChange" @openChange="onOpenChange"
> >
<a-menu-item key="/account/settings/base"> <!-- <a-menu-item key="/account/settings/base">-->
<router-link :to="{ name: 'base' }"> <!-- <router-link :to="{ name: 'base' }">-->
{{ i18nRender('menu.account.settings.base') }} <!-- {{ i18nRender('menu.account.settings.base') }}-->
</router-link> <!-- </router-link>-->
</a-menu-item> <!-- </a-menu-item>-->
<a-menu-item key="/account/settings/security"> <a-menu-item key="/account/settings/security">
<router-link :to="{ name: 'security' }"> <router-link :to="{ name: 'security' }">
{{ i18nRender('menu.account.settings.security') }} {{ i18nRender('menu.account.settings.security') }}
</router-link> </router-link>
</a-menu-item> </a-menu-item>
<a-menu-item key="/account/settings/custom"> <!-- <a-menu-item key="/account/settings/custom">-->
<router-link :to="{ name: 'custom' }"> <!-- <router-link :to="{ name: 'custom' }">-->
{{ i18nRender('menu.account.settings.custom') }} <!-- {{ i18nRender('menu.account.settings.custom') }}-->
</router-link> <!-- </router-link>-->
</a-menu-item> <!-- </a-menu-item>-->
<a-menu-item key="/account/settings/binding"> <!-- <a-menu-item key="/account/settings/binding">-->
<router-link :to="{ name: 'binding' }"> <!-- <router-link :to="{ name: 'binding' }">-->
{{ i18nRender('menu.account.settings.binding') }} <!-- {{ i18nRender('menu.account.settings.binding') }}-->
</router-link> <!-- </router-link>-->
</a-menu-item> <!-- </a-menu-item>-->
<a-menu-item key="/account/settings/notification"> <!-- <a-menu-item key="/account/settings/notification">-->
<router-link :to="{ name: 'notification' }"> <!-- <router-link :to="{ name: 'notification' }">-->
{{ i18nRender('menu.account.settings.notification') }} <!-- {{ i18nRender('menu.account.settings.notification') }}-->
</router-link> <!-- </router-link>-->
</a-menu-item> <!-- </a-menu-item>-->
</a-menu> </a-menu>
</div> </div>
<div class="account-settings-info-right"> <div class="account-settings-info-right">

View File

@ -87,7 +87,7 @@
<a-button style='margin-left: 8px' type='primary' @click='exportRepair()'>导出工单模版</a-button> <a-button style='margin-left: 8px' type='primary' @click='exportRepair()'>导出工单模版</a-button>
<a-button style='margin-left: 8px' type='primary' @click='importDataVisible()'>导入</a-button> <a-button style='margin-left: 8px' type='primary' @click='importDataVisible()'>导入</a-button>
<a-button style='margin-left: 8px' type='primary' @click='exportRepairList()'>导出工单数据</a-button> <a-button style='margin-left: 8px' type='primary' @click='exportRepairList()'>导出工单数据</a-button>
<a-button style='margin-left: 8px' type='primary' @click='exportRepairTypeList()'>导出类型汇总数据</a-button>
</span> </span>
</a-col> </a-col>
</a-row> </a-row>
@ -154,7 +154,7 @@ import RepairModal from './modules/RepairModal.vue'
import { checkPermission } from '@/utils/permissions' import { checkPermission } from '@/utils/permissions'
import { getRepairDeviceList } from '@/api/admin/repair/repairDevice' import { getRepairDeviceList } from '@/api/admin/repair/repairDevice'
import { getRepairTypeList } from '@/api/admin/repair/repairDeviceType' import { getRepairTypeList } from '@/api/admin/repair/repairDeviceType'
import { exportRepair, exportTemplate, importData } from '@/api/admin/repair/repairIo' import { exportRepair, exportRepairType, exportTemplate, importData } from '@/api/admin/repair/repairIo'
import storage from 'store' import storage from 'store'
import { ACCESS_TOKEN } from '@/store/mutation-types' import { ACCESS_TOKEN } from '@/store/mutation-types'
import { message } from 'ant-design-vue' import { message } from 'ant-design-vue'
@ -474,6 +474,21 @@ export default {
this.exportExcel('工单数据', res) this.exportExcel('工单数据', res)
}) })
}, },
exportRepairTypeList() {
if (this.dateRange.length < 2) {
message.error('请先设置时间范围,系统将根据时间范围导出工单数据')
return
}
const startDate = this.dateRange[0].format('YYYY-MM-DD')
const endDate = this.dateRange[1].format('YYYY-MM-DD')
exportRepairType({
'beginTime': startDate,
'endTime': endDate
}).then(res => {
this.exportExcel('工单按维修类型汇总', res)
})
},
exportExcel(filename, res) { exportExcel(filename, res) {
const link = document.createElement('a') const link = document.createElement('a')
let blob = new Blob([res], { type: 'application/vnd.ms-excel;charset=UTF-8' }) let blob = new Blob([res], { type: 'application/vnd.ms-excel;charset=UTF-8' })

View File

@ -70,9 +70,9 @@
<a-row> <a-row>
<a-col :span='18'> <a-col :span='18'>
<a-card title='会议日历' bodyStyle='height: 780px'> <a-card title='会议日历' bodyStyle='height: 780px'>
<a-calendar :header-render='headerRender'> <a-calendar :header-render='headerRender' @select="onSelect">
<ul slot='dateCellRender' slot-scope='value' class='c_meeting' style='padding: 0'> <ul slot='dateCellRender' slot-scope='value' class='c_meeting' style='padding: 0'>
<a-popover :title='item.title' v-for='item in getListData(value)'> <a-popover @click.stop='return false' :title='item.title' v-for='item in getListData(value)'>
<template slot='content'> <template slot='content'>
<div>预约部门{{ item.org }}</div> <div>预约部门{{ item.org }}</div>
<div>会议时间{{ item.time }}</div> <div>会议时间{{ item.time }}</div>
@ -87,15 +87,15 @@
</a-col> </a-col>
<a-col :span='6'> <a-col :span='6'>
<a-card title='会议状态'> <a-card title='会议状态'>
<a-row> <a-row >
<a-col :span='18'> <a-col :span='18'>
<a-icon type='message' theme='filled' style='font-size: 24px;color: #E6A23C' /> <a-icon type='message' theme='filled' style='font-size: 24px;color: #E6A23C' />
<label style='position: relative;top: -1px;left: 10px;font-size: 20px'> <label @click='goRes({status: "9"})' style='position: relative;top: -1px;left: 10px;font-size: 20px;cursor:pointer;'>
进行中 进行中
</label> </label>
</a-col> </a-col>
<a-col :span='6'> <a-col :span='6'>
<div style='text-align: right; font-weight: 700;font-size: 20px; position: relative;top: -1px;'> <div @click='goRes({status: "9"})' style='text-align: right; font-weight: 700;font-size: 20px; position: relative;top: -1px;cursor:pointer;'>
{{ statusNum.going }} {{ statusNum.going }}
</div> </div>
</a-col> </a-col>
@ -103,12 +103,12 @@
<a-row style='margin-top: 15px'> <a-row style='margin-top: 15px'>
<a-col :span='18'> <a-col :span='18'>
<a-icon type='flag' theme='filled' style='font-size: 24px;color: #409EFF' /> <a-icon type='flag' theme='filled' style='font-size: 24px;color: #409EFF' />
<label style='position: relative;top: -1px;left: 10px;font-size: 20px'> <label @click='goRes({status: "7"})' style='position: relative;top: -1px;left: 10px;font-size: 20px;cursor:pointer;'>
开始 开始
</label> </label>
</a-col> </a-col>
<a-col :span='6'> <a-col :span='6'>
<div style='text-align: right; font-weight: 700;font-size: 20px; position: relative;top: -1px;'> <div @click='goRes({status: "7"})' style='text-align: right; font-weight: 700;font-size: 20px; position: relative;top: -1px;cursor:pointer;'>
{{ statusNum.wait }} {{ statusNum.wait }}
</div> </div>
</a-col> </a-col>
@ -116,20 +116,20 @@
<a-row style='margin-top: 15px'> <a-row style='margin-top: 15px'>
<a-col :span='18'> <a-col :span='18'>
<a-icon type='carry-out' theme='filled' style='font-size: 24px;color: #919399' /> <a-icon type='carry-out' theme='filled' style='font-size: 24px;color: #919399' />
<label style='position: relative;top: -1px;left: 10px;font-size: 20px'> <label @click='goRes({status: "11"})' style='position: relative;top: -1px;left: 10px;font-size: 20px;cursor:pointer;'>
已结束 已结束
</label> </label>
</a-col> </a-col>
<a-col :span='6'> <a-col :span='6'>
<div style='text-align: right; font-weight: 700;font-size: 20px; position: relative;top: -1px;'> <div @click='goRes({status: "11"})' style='text-align: right; font-weight: 700;font-size: 20px; position: relative;top: -1px;cursor:pointer;'>
{{ statusNum.closed }} {{ statusNum.closed }}
</div> </div>
</a-col> </a-col>
</a-row> </a-row>
</a-card> </a-card>
<a-card title='任务代办(小程序审核)' bodyStyle='height: 554px'> <a-card title='任务代办' bodyStyle='height: 554px'>
<a-list item-layout='horizontal' :data-source='waitList'> <a-list item-layout='horizontal' :data-source='waitList'>
<a-list-item slot='renderItem' slot-scope='item, index'> <a-list-item @click='goRes({status: "5"})' slot='renderItem' slot-scope='item, index'>
<!-- <a slot='actions'>审核</a>--> <!-- <a slot='actions'>审核</a>-->
<a-list-item-meta <a-list-item-meta
:description="item.time + '' +item.org + ''" :description="item.time + '' +item.org + ''"
@ -275,6 +275,14 @@ export default {
// this.drawChart() // this.drawChart()
}, },
methods: { methods: {
onSelect(nowDate) {
let date = nowDate.format('YYYY-MM-DD')
this.goRes({date: date})
},
//
goRes(query) {
this.$router.push({ name: 'reservation', query: query })
},
/** /**
* 改变会议室管理统计日期 * 改变会议室管理统计日期
* @param date * @param date

View File

@ -58,14 +58,20 @@
<a-input placeholder='预约单位' v-model='queryParam.userOrg' /> <a-input placeholder='预约单位' v-model='queryParam.userOrg' />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :md='5' :sm='15'>
<a-form-item label='预约时间'>
<a-date-picker v-model='queryParam.chooseDate' @change='res => this.$forceUpdate()' />
</a-form-item>
</a-col>
<a-col :md='8' :sm='24'> <a-col :md='8' :sm='24'>
<span class='table-page-search-submitButtons'> <span class='table-page-search-submitButtons'>
<a-button type='primary' @click='$refs.table.refresh(true)'>查询</a-button> <a-button type='primary' @click='$refs.table.refresh(true)'>查询</a-button>
<a-button style='margin-left: 8px' @click='reset'>重置</a-button> <a-button style='margin-left: 8px' @click='reset'>重置</a-button>
<a-dropdown v-if='removeEnable&&selectedRowKeys.length > 0'> <a-button v-if='isAdmin' type='danger' style='margin-left: 8px'
<a-button style='margin-left: 8px' type='danger' icon='delete' @click='exportOrderList'>导出会议日程</a-button>
@click='delByIds(selectedRowKeys)'>删除</a-button> <a-button v-if='isAdmin' type='danger' style='margin-left: 8px'
</a-dropdown> @click='exportMonthOrder'>导出月度汇总</a-button>
</span> </span>
</a-col> </a-col>
</a-row> </a-row>
@ -157,7 +163,13 @@
<script> <script>
import { STable } from '@/components' import { STable } from '@/components'
import { getMeetingReservationList, cancelOrder, approveOrder } from '@/api/admin/meeting/meetingReservation' import {
getMeetingReservationList,
cancelOrder,
approveOrder,
expMRByDate,
expMRByMonth
} from '@/api/admin/meeting/meetingReservation'
import { checkPermission } from '@/utils/permissions' import { checkPermission } from '@/utils/permissions'
import moment from 'moment' import moment from 'moment'
@ -237,7 +249,12 @@ export default {
// Promise // Promise
loadData: parameter => { loadData: parameter => {
// this.queryParam.name = this.$route.params.roomId // this.queryParam.name = this.$route.params.roomId
// let chooseDate = this.queryParam.chooseDate
if (chooseDate) {
this.queryParam.filterDate = chooseDate.format('YYYY-MM-DD')
} else {
this.queryParam.filterDate = ''
}
return getMeetingReservationList(Object.assign(parameter, this.queryParam)).then(res => { return getMeetingReservationList(Object.assign(parameter, this.queryParam)).then(res => {
for (let key in res.rows) { for (let key in res.rows) {
let startTime = res.rows[key].start let startTime = res.rows[key].start
@ -331,8 +348,28 @@ export default {
}, },
filters: {}, filters: {},
created() { created() {
let date = this.$route.query.date
if (date) {
this.queryParam.chooseDate = moment(date)
}
let status = this.$route.query.status
if (status) {
this.queryParam.status = status
}
//
const query = { ...this.$route.query }
//
if (query.date) {
delete query.date
}
if (query.status) {
delete query.status
}
// 使 $router.replace()
this.$router.replace({ query })
}, },
mounted() { mounted() {
}, },
methods: { methods: {
reset() { reset() {
@ -456,6 +493,60 @@ export default {
}, },
staff(id) { staff(id) {
this.$refs.staffModal.add(id) this.$refs.staffModal.add(id)
},
//
exportOrderList() {
let chooseDate = this.queryParam.chooseDate
let filterDate = ''
if (chooseDate) {
filterDate = chooseDate.format('YYYY-MM-DD')
} else {
filterDate = ''
}
if (filterDate == '') {
this.$message.error('请选择会议预约时间')
return
}
expMRByDate({
'filterDate': filterDate,
'userOrg': this.queryParam.userOrg,
'title': this.queryParam.title,
'status': this.queryParam.status
}).then(res => {
this.exportExcel(chooseDate.format('YYYYMMDD') + '会议室预约记录', res)
})
},
exportMonthOrder() {
let chooseDate = this.queryParam.chooseDate
let filterDate = ''
if (chooseDate) {
filterDate = chooseDate.format('YYYY-MM')
} else {
filterDate = ''
}
if (filterDate == '') {
this.$message.error('请选择会议预约时间')
return
}
expMRByMonth({
'month': filterDate
}).then(res => {
this.exportExcel(chooseDate.format('YYYYMM') + '月度会议汇总', res)
})
},
exportExcel(filename, res) {
const link = document.createElement('a')
let blob = new Blob([res], { type: 'application/vnd.ms-excel;charset=UTF-8' })
link.style.display = 'none'
link.href = URL.createObjectURL(blob)
let num = ''
for (let i = 0; i < 10; i++) {
num += Math.ceil(Math.random() * 10)
}
link.setAttribute('download', filename + '.xls')
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
} }
}, },
watch: { watch: {