3 files added
1 files modified
New file |
| | |
| | | <template> |
| | | <el-dialog |
| | | :title="title" |
| | | top="10vh" |
| | | center |
| | | :visible.sync="visible" |
| | | :width="width" |
| | | :destroy-on-close="true" |
| | | @close="close()" |
| | | > |
| | | <div> |
| | | <slot |
| | | class="body" |
| | | name="body" |
| | | > |
| | | 我是默认body |
| | | </slot> |
| | | </div> |
| | | <div |
| | | slot="footer" |
| | | class="dialog-footer" |
| | | > |
| | | <el-button |
| | | v-if="isShowCloseBut" |
| | | @click="close()" |
| | | > |
| | | 关闭 |
| | | </el-button> |
| | | <el-button |
| | | v-if="isShowSumbitBut" |
| | | type="primary" |
| | | @click="close()" |
| | | > |
| | | 确 定 |
| | | </el-button> |
| | | </div> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | components: {}, |
| | | props: { |
| | | width: { |
| | | type: String, |
| | | default: '30%' |
| | | }, |
| | | title: { |
| | | type: String, |
| | | default: 'title' |
| | | }, |
| | | isShowCloseBut: { |
| | | type: Boolean, |
| | | default: true |
| | | }, |
| | | isShowSumbitBut: { |
| | | type: Boolean, |
| | | default: true |
| | | }, |
| | | dialogVisible: { |
| | | type: Boolean, |
| | | default: false |
| | | } |
| | | }, |
| | | data () { |
| | | return { |
| | | visible: false |
| | | } |
| | | }, |
| | | computed: {}, |
| | | watch: {}, |
| | | created () { |
| | | console.log('this.dialogVisible', this.dialogVisible) |
| | | this.visible = this.dialogVisible |
| | | }, |
| | | mounted () { |
| | | |
| | | }, |
| | | methods: { |
| | | close () { |
| | | this.visible = false |
| | | this.$emit('update:dialogVisible', false) |
| | | }, |
| | | handleClose () { |
| | | |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | <style scoped lang="scss"> |
| | | </style> |
New file |
| | |
| | | <template> |
| | | <el-radio-group |
| | | v-model="radio" |
| | | :size="size" |
| | | @input="changeRadio" |
| | | > |
| | | <el-radio-button |
| | | v-for="(item,index) in radioData" |
| | | :key="index" |
| | | :label="item.label" |
| | | /> |
| | | </el-radio-group> |
| | | </template> |
| | | |
| | | <script> |
| | | import dayjs from 'dayjs' |
| | | import _ from 'lodash' |
| | | export default { |
| | | components: {}, |
| | | props: { |
| | | type: { |
| | | type: String, |
| | | default: 'timeDate' |
| | | }, |
| | | radioSelect: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | radioData: { |
| | | type: Array, |
| | | default: null |
| | | // { label: '今天', value: 'today', type: 'day', num: '0' }, |
| | | // { label: '昨天', value: 'yesterday', type: 'day', num: '1', }, |
| | | // { label: '近3天', value: 'week', type: 'day', num: '3', }, |
| | | // { label: '近1个月', value: 'month', type: 'month', num: '1', }, |
| | | // { label: '近3个月', value: 'threeMonth', type: 'month', num: '3', }, |
| | | }, |
| | | size: { |
| | | type: String, |
| | | default: 'medium' |
| | | } |
| | | }, |
| | | data () { |
| | | return { |
| | | radio: '' |
| | | } |
| | | }, |
| | | computed: {}, |
| | | watch: { |
| | | radioSelect (newVal) { |
| | | console.log('newval', newVal) |
| | | this.radio = newVal |
| | | } |
| | | }, |
| | | created () { |
| | | this.radio = this.radioSelect |
| | | this.changeRadio(this.radio) |
| | | }, |
| | | mounted () { |
| | | |
| | | }, |
| | | methods: { |
| | | changeRadio (e) { |
| | | let data = _.find(this.radioData, ['label', e]) |
| | | if (this.type === 'timeDate') { |
| | | const endTime = dayjs().format('YYYY-MM-DD HH:mm') |
| | | const startTime = data.num === '0' ? dayjs().startOf('day').format('YYYY-MM-DD HH:mm') : dayjs().subtract(data.num, data.type).format('YYYY-MM-DD HH:mm') |
| | | data.startTime = startTime |
| | | data.endTime = endTime |
| | | } |
| | | console.log('data', data) |
| | | this.$emit('changeRadio', data) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | <style scoped> |
| | | |
| | | </style> |
| | |
| | | component: () => import('@/views/govReport/index'), |
| | | meta: { title: '国控站小时报表显示', icon: 'example' } |
| | | } |
| | | const hand = { |
| | | path: 'report/hand', |
| | | name: 'hand', |
| | | component: () => import('@/views/hand/index'), |
| | | meta: { title: '手持设备', icon: 'example' } |
| | | } |
| | | // 空气质量小时播报 |
| | | const airQualityReportDisplay = { |
| | | path: 'report/airQualityReportDisplay', |
| | |
| | | showMpData: showMpData, |
| | | staffManagement: staffManagement, |
| | | showGovHourData: showGovHourData, |
| | | hand: hand, |
| | | cityAirRank: cityAirRank, |
| | | levelStatistic: levelStatistic, |
| | | onlineRate: onlineRate, |
| | |
| | | |
| | | // 导出路由菜单 |
| | | export function routerMenus() { |
| | | console.log('user.menus', JSON.parse(store.state.user.menus)) |
| | | const routersMenu = JSON.parse(store.state.user.menus) |
| | | // 路由分两块,左侧列表, 最右侧员工下拉菜单 |
| | | console.log('routersMenu', routersMenu) |
New file |
| | |
| | | <template> |
| | | <div class="contenet"> |
| | | <div class="searchBox"> |
| | | <el-form |
| | | :inline="true" |
| | | :model="formInline" |
| | | class="demo-form-inline" |
| | | > |
| | | <div> |
| | | <el-form-item label="选择设备:"> |
| | | <el-select |
| | | v-model="formInline.mac" |
| | | size="medium" |
| | | placeholder="选择设备" |
| | | > |
| | | <el-option |
| | | v-for="item in handList" |
| | | :key="item.id" |
| | | :label="item.mac" |
| | | :value="item.mac" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="设备名称:"> |
| | | <el-input |
| | | v-model="formInline.name" |
| | | size="medium" |
| | | placeholder="设备名称" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <radioGroupComponent |
| | | :radio-data="radioGrouplist" |
| | | :radio-select="radio" |
| | | @changeRadio="changeRadio" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="其他时间:"> |
| | | <el-date-picker |
| | | v-model="value" |
| | | size="medium" |
| | | type="datetimerange" |
| | | start-placeholder="开始日期" |
| | | end-placeholder="结束日期" |
| | | :default-time="['00:00:00']" |
| | | @change="sendPicker" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button |
| | | type="primary" |
| | | size="medium" |
| | | @click="onSubmit" |
| | | > |
| | | 查询 |
| | | </el-button> |
| | | </el-form-item> |
| | | </div> |
| | | </el-form> |
| | | </div> |
| | | <div> |
| | | <el-table |
| | | :data="tableData" |
| | | border |
| | | size="mini" |
| | | max-height="680" |
| | | style="width: 100%" |
| | | :header-cell-style="{ |
| | | color: '#101111', fontSize: '16px' |
| | | }" |
| | | :cell-style="{ color: '#101111', fontSize: '16px'}" |
| | | > |
| | | <el-table-column |
| | | type="index" |
| | | label="序号" |
| | | width="60px" |
| | | align="center" |
| | | /> |
| | | <el-table-column |
| | | prop="mac" |
| | | align="center" |
| | | label="设备号" |
| | | width="180" |
| | | /> |
| | | <el-table-column |
| | | prop="name" |
| | | align="center" |
| | | width="200px" |
| | | label="设备名称" |
| | | /> |
| | | <el-table-column |
| | | prop="address" |
| | | align="center" |
| | | label="设备位置" |
| | | /> |
| | | <el-table-column |
| | | prop="startTime" |
| | | align="center" |
| | | width="200px" |
| | | label="开始时间" |
| | | /> |
| | | <el-table-column |
| | | prop="endTime" |
| | | align="center" |
| | | label="结束时间" |
| | | width="200px" |
| | | /> |
| | | <el-table-column |
| | | width="60px" |
| | | align="center" |
| | | label="操作" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | type="text" |
| | | size="medium" |
| | | @click="showDetail(scope.row)" |
| | | > |
| | | 详情 |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <div class="pagina"> |
| | | <el-pagination |
| | | background |
| | | :current-page="pagination.currentPage" |
| | | :page-sizes="pagination.pageSizes" |
| | | :page-size="pagination.pageSize" |
| | | :total="pagination.totalCount" |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | @size-change="handleSizeChange" |
| | | @current-change="handleCurrentChange" |
| | | /> |
| | | </div> |
| | | </div> |
| | | <div> |
| | | <diaLog |
| | | v-if="isVisible" |
| | | :dialog-visible.sync="isVisible" |
| | | :title="`设备详情`" |
| | | :width="`90%`" |
| | | :is-show-sumbit-but="false" |
| | | > |
| | | <template #body> |
| | | <div> |
| | | <div class="devaiceDetailTitle"> |
| | | <p>设备名称:{{ selectRow.name }}</p> |
| | | <p>设备位置:{{ selectRow.address }}</p> |
| | | <p>设备经纬度:{{ selectRow.longitude }},{{ selectRow.latitude }}</p> |
| | | </div> |
| | | <div class="typeBox"> |
| | | <div class="tapChart"> |
| | | <p |
| | | :class="{pClick: tapName === 'hour'}" |
| | | @click="changeTap('hour')" |
| | | > |
| | | 小时 |
| | | </p> |
| | | <p |
| | | :class="{pClick: tapName === 'minutely'}" |
| | | @click="changeTap('minutely')" |
| | | > |
| | | 5分钟 |
| | | </p> |
| | | </div> |
| | | <div> |
| | | <el-button |
| | | size="mini" |
| | | type="primary" |
| | | @click="handleExport" |
| | | > |
| | | 导出 |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | <div> |
| | | <el-table |
| | | :data="rowDetailDate" |
| | | border |
| | | size="mini" |
| | | max-height="480" |
| | | style="width: 100%" |
| | | :header-cell-style="{ |
| | | color: '#101111', fontSize: '16px' |
| | | }" |
| | | :cell-style="{ color: '#101111', fontSize: '16px',padding: '10px 0'}" |
| | | > |
| | | <el-table-column |
| | | type="index" |
| | | label="序号" |
| | | width="60px" |
| | | align="center" |
| | | /> |
| | | <el-table-column |
| | | prop="time" |
| | | align="center" |
| | | label="时间" |
| | | width="180" |
| | | > |
| | | <template slot-scope="scope"> |
| | | {{ scope.row.time | timeFormat }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-for="(item,index) in tableColumnData" |
| | | :key="index" |
| | | :prop="item.prop" |
| | | align="center" |
| | | :label="item.label + item.unit" |
| | | /> |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | </diaLog> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import dayjs from 'dayjs' |
| | | import radioGroupComponent from '@/components/formTypeComponets/radioGroupCompones/index.vue' |
| | | import diaLog from '@/components/formTypeComponets/dialog/index.vue' |
| | | export default { |
| | | components: { |
| | | radioGroupComponent, |
| | | diaLog |
| | | }, |
| | | filters: { |
| | | timeFormat (time) { |
| | | return dayjs(time).format('YYYY-MM-DD HH:mm:ss') |
| | | } |
| | | }, |
| | | data () { |
| | | return { |
| | | formInline: { |
| | | mac: '', |
| | | name: '', |
| | | startTime: '', |
| | | endTime: '' |
| | | }, |
| | | tableColumnData: [ |
| | | { prop: 'a34004', label: 'PM2.5', unit: 'ug/m³' }, |
| | | { prop: 'a34002', label: 'PM10', unit: 'ug/m³' }, |
| | | { prop: 'a21004', label: '氮氧化合物', unit: 'ug/m³' }, |
| | | { prop: 'a21026', label: '二氧化硫', unit: 'ug/m³' }, |
| | | { prop: 'a21005', label: '一氧化碳', unit: 'mg/m³' }, |
| | | { prop: 'a01006', label: '气压', unit: 'hpa' }, |
| | | { prop: 'a01001', label: '温度', unit: '℃' }, |
| | | { prop: 'a01002', label: '湿度', unit: '%' }, |
| | | { prop: 'a99054', label: 'TVOC', unit: 'ug/m³' }, |
| | | { prop: 'a31001', label: '甲醛', unit: 'mg/m³' }, |
| | | { prop: 'a21028', label: '硫化氢', unit: 'ppm' }, |
| | | { prop: 'a21001', label: '氨气', unit: 'ug/m³' }, |
| | | ], |
| | | handList: [], |
| | | radio: '今天', |
| | | tapName: 'hour', |
| | | value: '', |
| | | radioGrouplist: [ |
| | | { label: '今天', value: 'today', type: 'day', num: '0' }, |
| | | { label: '昨天', value: 'yesterday', type: 'day', num: '1', }, |
| | | { label: '近3天', value: 'week', type: 'day', num: '3', }, |
| | | { label: '近1个月', value: 'month', type: 'month', num: '1', }, |
| | | { label: '近3个月', value: 'threeMonth', type: 'month', num: '3', }, |
| | | ], |
| | | tableData: [], |
| | | rowDetailDate: [], |
| | | pagination: { |
| | | currentPage: 1, |
| | | // 总条数,根据接口获取数据长度(注意:这里不能为空) |
| | | totalCount: 0, |
| | | // 个数选择器(可修改) |
| | | pageSizes: [10, 30, 60, 100], |
| | | // 默认每页显示的条数(可修改) |
| | | pageSize: 10 |
| | | }, |
| | | isVisible: false, |
| | | selectRow: {} |
| | | } |
| | | }, |
| | | created () { |
| | | this.$request({ |
| | | url: '/hand/check', |
| | | method: 'get' |
| | | }).then(res => { |
| | | if (res.code === 0) { |
| | | this.handList = res.data |
| | | } else { |
| | | this.$message.error(res.message) |
| | | } |
| | | }) |
| | | }, |
| | | methods: { |
| | | handleExport () { |
| | | this.$request({ |
| | | url: 'hand/unitExel', |
| | | method: 'get', |
| | | responseType: 'blob', |
| | | params: { |
| | | mac: this.selectRow.mac, |
| | | startTime: this.selectRow.startTime, |
| | | endTime: this.selectRow.endTime, |
| | | type: this.tapName |
| | | } |
| | | }).then(res => { |
| | | this.getOutExcel('列表数据导出.xlsx', res) |
| | | }) |
| | | }, |
| | | getOutExcel (fileName, res) { |
| | | const blob = new Blob([res], { type: 'application/x-xls' }) |
| | | if (window.navigator.msSaveOrOpenBlob) { |
| | | // 兼容 IE & EDGE |
| | | navigator.msSaveBlob(blob, fileName) |
| | | } else { |
| | | var link = document.createElement('a') |
| | | // 兼容不同浏览器的URL对象 |
| | | const url = window.URL || window.webkitURL || window.moxURL |
| | | // 创建下载链接 |
| | | link.href = url.createObjectURL(blob) |
| | | // 命名下载名称 |
| | | link.download = fileName |
| | | // 点击触发下载 |
| | | link.click() |
| | | // 下载完成进行释放 |
| | | url.revokeObjectURL(link.href) |
| | | } |
| | | }, |
| | | changeRadio (e) { |
| | | this.formInline.startTime = e.startTime |
| | | this.formInline.endTime = e.endTime |
| | | this.radio = e.label |
| | | this.value = '' |
| | | }, |
| | | sendPicker (e) { |
| | | this.radio = '' |
| | | console.log(' this.radio', this.radio) |
| | | this.formInline.startTime = dayjs(e[0]).format('YYYY-MM-DD HH:mm:ss') |
| | | this.formInline.endTime = dayjs(e[1]).format('YYYY-MM-DD HH:mm:ss') |
| | | }, |
| | | showDetail (row) { |
| | | this.selectRow = row |
| | | this.tapName = 'hour' |
| | | console.log('row', row) |
| | | this.changeTimeType() |
| | | }, |
| | | changeTimeType () { |
| | | this.$request({ |
| | | url: '/hand/details', |
| | | method: 'get', |
| | | params: { |
| | | mac: this.selectRow.mac, |
| | | startTime: this.selectRow.startTime, |
| | | endTime: this.selectRow.endTime, |
| | | type: this.tapName |
| | | } |
| | | }).then(res => { |
| | | if (res.code === 0) { |
| | | console.log('res', res) |
| | | this.isVisible = true |
| | | this.rowDetailDate = res.data |
| | | } else { |
| | | this.$message.error(res.message) |
| | | } |
| | | }) |
| | | }, |
| | | onSubmit () { |
| | | this.$request({ |
| | | url: '/hand/page', |
| | | method: 'post', |
| | | data: { |
| | | ...this.formInline, |
| | | page: this.pagination |
| | | } |
| | | }).then(res => { |
| | | if (res.code === 0) { |
| | | this.tableData = res.data.list |
| | | this.pagination.totalCount = res.data.page.totalNum |
| | | } else { |
| | | this.$message.error(res.message) |
| | | } |
| | | }) |
| | | }, |
| | | changeTap (val) { |
| | | this.tapName = val |
| | | this.changeTimeType() |
| | | }, |
| | | // 分页 |
| | | handleSizeChange (val) { |
| | | this.pagination.pageSize = val |
| | | this.pagination.currentPage = 1 |
| | | this.onSubmit() |
| | | }, |
| | | handleCurrentChange (val) { |
| | | this.pagination.currentPage = val |
| | | this.onSubmit() |
| | | }, |
| | | }, |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .contenet{ |
| | | padding: 10px; |
| | | } |
| | | .searchBox{ |
| | | /deep/.el-form-item{ |
| | | margin-bottom: 10px; |
| | | } |
| | | } |
| | | .pagina{ |
| | | margin-top: 10px; |
| | | } |
| | | .devaiceDetailTitle{ |
| | | p{ |
| | | display: inline-block; |
| | | margin-right: 10px; |
| | | font-size: 18px; |
| | | } |
| | | } |
| | | .tapChart{ |
| | | p{ |
| | | display: inline-block; |
| | | margin-right: 10px; |
| | | cursor: pointer; |
| | | padding-bottom: 5px; |
| | | } |
| | | .pClick{ |
| | | color: #409EFF; |
| | | border-bottom: #409EFF 3px solid; |
| | | } |
| | | } |
| | | .typeBox{ |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | } |
| | | </style> |