|  |  | 
 |  |  |     <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getData(1)" @clear="clear" | 
 |  |  |       @changeForm='changeForm'> | 
 |  |  |       <template #fastdate> | 
 |  |  |         <el-radio-group v-model="filters.fastdate" size="small" @input="changeForm"> | 
 |  |  |         <el-radio-group v-model="filters.fastdate" size="small" @input="changeRadio"> | 
 |  |  |           <el-radio-button label="0">当天</el-radio-button> | 
 |  |  |           <el-radio-button label="6">近7天</el-radio-button> | 
 |  |  |           <el-radio-button label="29">近30天</el-radio-button> | 
 |  |  | 
 |  |  |     <div class="main_content"> | 
 |  |  |       <div class="type_wrap"> | 
 |  |  |         <div class="title">隐患类型统计</div> | 
 |  |  |         <div class="type" ref="typeRef"></div> | 
 |  |  |         <div class="echart1" ref="typeRef"></div> | 
 |  |  |       </div> | 
 |  |  |       <div class="dept_wrap"> | 
 |  |  |         <div class="title">隐患归属部门统计</div> | 
 |  |  |         <div class="dept" ref="deptRef"></div> | 
 |  |  |         <div class="echart2" ref="deptRef"></div> | 
 |  |  |       </div> | 
 |  |  |     </div> | 
 |  |  |   </div> | 
 |  |  | 
 |  |  |  | 
 |  |  | <script> | 
 |  |  | import QueryForm from '@/components/common/QueryForm' | 
 |  |  | import echarts from 'echarts' | 
 |  |  | import * as echarts from 'echarts' | 
 |  |  | import { hiddenDangerDataPost } from '@/api/business/hiddenDanger' | 
 |  |  | import dayjs from 'dayjs' | 
 |  |  | export default { | 
 |  |  |   components: { | 
 |  |  |     QueryForm, | 
 |  |  |   }, | 
 |  |  |   data() { | 
 |  |  |     return { | 
 |  |  |       filters: {}, | 
 |  |  |       filters: { | 
 |  |  |         fastdate: '', | 
 |  |  |         queryStartTime: '', | 
 |  |  |         queryEndTime: '' | 
 |  |  |       }, | 
 |  |  |       queryFormConfig: { | 
 |  |  |         formItems: [ | 
 |  |  |           { | 
 |  |  | 
 |  |  |             type: 'select', | 
 |  |  |             label: '状态', | 
 |  |  |             options: [ | 
 |  |  |               { label: '访客申请', value: '0' }, | 
 |  |  |               { label: '访客报备', value: '1' }, | 
 |  |  |               { label: '用车申请', value: '2' }, | 
 |  |  |               { label: '隐患随手拍', value: '3' }, | 
 |  |  |               { label: '物流车申请', value: '6' } | 
 |  |  |               { label: '待处理', value: '0' }, | 
 |  |  |               { label: '已处理', value: '1' }, | 
 |  |  |               { label: '不处理', value: '2' }, | 
 |  |  |             ] | 
 |  |  |           }, | 
 |  |  |           { | 
 |  |  |             filed1: 'startDate', | 
 |  |  |             filed2: 'endDate', | 
 |  |  |             filed1: 'queryStartTime', | 
 |  |  |             filed2: 'queryEndTime', | 
 |  |  |             type: 'datetime', | 
 |  |  |             label: '提报时间' | 
 |  |  |           }, | 
 |  |  | 
 |  |  |         ], | 
 |  |  |         online: true | 
 |  |  |       }, | 
 |  |  |       typeList: [], | 
 |  |  |       deptList: [], | 
 |  |  |     } | 
 |  |  |   }, | 
 |  |  |   mounted() { | 
 |  |  |     // this.changeRadio('0') | 
 |  |  |     this.getData() | 
 |  |  |   }, | 
 |  |  |   methods: { | 
 |  |  |     getData(page) { | 
 |  |  |       console.log(this.filters) | 
 |  |  |     changeRadio(day) { | 
 |  |  |       const arr = [dayjs().subtract(day, 'day').format('YYYY-MM-DD') + ' 00:00:00', dayjs().format('YYYY-MM-DD') + ' 23:59:59'] | 
 |  |  |       this.filters.queryStartTime = arr[0] | 
 |  |  |       this.filters.queryEndTime = arr[1] | 
 |  |  |       this.getData() | 
 |  |  |     }, | 
 |  |  |     changeForm(form) { | 
 |  |  |       console.log(form) | 
 |  |  |     getData(page) { | 
 |  |  |       hiddenDangerDataPost({ ...this.filters }).then(res => { | 
 |  |  |         if (res) { | 
 |  |  |           this.typeList = res.cateList || [] | 
 |  |  |           this.deptList = res.departmentList || [] | 
 |  |  |           this.initType() | 
 |  |  |           this.initDept() | 
 |  |  |         } | 
 |  |  |       }) | 
 |  |  |  | 
 |  |  |     }, | 
 |  |  |     changeForm(e) { | 
 |  |  |       this.getData() | 
 |  |  |     }, | 
 |  |  |     initType() { | 
 |  |  |       const myChart = echarts.init(document.querySelector('.echart1')) | 
 |  |  |       let total = 0 | 
 |  |  |       this.typeList.forEach(i => { | 
 |  |  |         total += i.total | 
 |  |  |       }) | 
 |  |  |       let colors = ['#d75a44', '#e39f4d', '#7ac7f6', '#7ac7f6', '#4469ee', '#698af0', '#9fb5f4', '#b6c7f7', '#c8d5f8'] | 
 |  |  |       let option = { | 
 |  |  |         title: [ | 
 |  |  |           { | 
 |  |  |             text: '隐患总数', | 
 |  |  |             top: '46%', | 
 |  |  |             left: '46%', | 
 |  |  |             textStyle: { | 
 |  |  |               color: '#666666', | 
 |  |  |               fontSize: 16, | 
 |  |  |             }, | 
 |  |  |           }, { | 
 |  |  |             text: total, | 
 |  |  |             top: '50%', | 
 |  |  |             left: '48%', | 
 |  |  |             textStyle: { | 
 |  |  |               color: '#080404', | 
 |  |  |               fontSize: 24, | 
 |  |  |               fontWeight: 'bold', | 
 |  |  |             }, | 
 |  |  |           }], | 
 |  |  |         legend: { | 
 |  |  |           left: 'center', | 
 |  |  |           bottom: '8%', | 
 |  |  |           itemGap: 30, | 
 |  |  |           itemWidth: 30, | 
 |  |  |           icon: 'circle', | 
 |  |  |           formatter: (name) => { | 
 |  |  |             const item = this.typeList.filter((item) => item.name === name)[0] | 
 |  |  |  | 
 |  |  |             if (item) { | 
 |  |  |               return ` ${name} ${item.total} | ${item.rata}%` | 
 |  |  |             } else { | 
 |  |  |               return ` ${name} 0 | 0%` | 
 |  |  |             } | 
 |  |  |           } | 
 |  |  |         }, | 
 |  |  |         series: [ | 
 |  |  |           { | 
 |  |  |             name: 'Access From', | 
 |  |  |             type: 'pie', | 
 |  |  |             radius: ['28%', '46%'], | 
 |  |  |             label: { | 
 |  |  |               formatter: "{a|{b}}\n\n{c} | {d}%", | 
 |  |  |               rich: { | 
 |  |  |                 a: { | 
 |  |  |                   color: '#333333', | 
 |  |  |                   fontSize: 14, | 
 |  |  |                   fontWeight: 500 | 
 |  |  |                 } | 
 |  |  |               } | 
 |  |  |             }, | 
 |  |  |             labelLine: { | 
 |  |  |               showAbove: true, | 
 |  |  |               show: true, | 
 |  |  |               length: 24, | 
 |  |  |               length2: 64, | 
 |  |  |               lineStyle: { | 
 |  |  |                 width: 2      // 线条宽度 | 
 |  |  |               } | 
 |  |  |             }, | 
 |  |  |             data: this.typeList.map((i, index) => { | 
 |  |  |               return { | 
 |  |  |                 value: i.total, | 
 |  |  |                 name: i.name, | 
 |  |  |                 itemStyle: { | 
 |  |  |                   color: colors[index] | 
 |  |  |                 } | 
 |  |  |               } | 
 |  |  |             }) | 
 |  |  |           } | 
 |  |  |         ] | 
 |  |  |       } | 
 |  |  |       myChart.setOption(option) | 
 |  |  |       window.addEventListener('resize', function () { // 执行 | 
 |  |  |         myChart.resize() | 
 |  |  |       }) | 
 |  |  |     }, | 
 |  |  |     initDept() { | 
 |  |  |       const myChart = echarts.init(document.querySelector('.echart2')) | 
 |  |  |  | 
 |  |  |       let option = { | 
 |  |  |         xAxis: { | 
 |  |  |           type: 'category', | 
 |  |  |           data: this.deptList.map(i => i.name), | 
 |  |  |           axisLabel: { | 
 |  |  |             color: '#333333', | 
 |  |  |             fontSize: 14, | 
 |  |  |             fontWeight: 'bold' | 
 |  |  |           } | 
 |  |  |         }, | 
 |  |  |         yAxis: { | 
 |  |  |           type: 'value', | 
 |  |  |           name: '隐患数', | 
 |  |  |           axisLine: { | 
 |  |  |             show: true, | 
 |  |  |           }, | 
 |  |  |         }, | 
 |  |  |         series: [ | 
 |  |  |           { | 
 |  |  |             data: this.deptList.map(i => i.total), | 
 |  |  |             type: 'bar', | 
 |  |  |             barWidth: 40, | 
 |  |  |             itemStyle: { | 
 |  |  |               color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ | 
 |  |  |                 { offset: 0, color: '#d75e45' }, // 渐变起始色 | 
 |  |  |                 { offset: 1, color: '#db924c' }  // 渐变终止色 | 
 |  |  |               ]) | 
 |  |  |             }, | 
 |  |  |  | 
 |  |  |             label: { | 
 |  |  |               show: true,      // 显示标签 | 
 |  |  |               position: 'top', // 让标签显示在柱子顶部 | 
 |  |  |               color: '#666666',   // 文字颜色 | 
 |  |  |               fontSize: 14,    // 文字大小 | 
 |  |  |             } | 
 |  |  |           } | 
 |  |  |         ] | 
 |  |  |       } | 
 |  |  |       myChart.setOption(option) | 
 |  |  |       window.addEventListener('resize', function () { // 执行 | 
 |  |  |         myChart.resize() | 
 |  |  |       }) | 
 |  |  |     }, | 
 |  |  |     clear() { | 
 |  |  |       this.filters = {} | 
 |  |  |       this.getData() | 
 |  |  |     } | 
 |  |  |   } | 
 |  |  | } | 
 |  |  | 
 |  |  |  | 
 |  |  | .main_content { | 
 |  |  |   display: flex; | 
 |  |  |   height: calc(100% - 110px); | 
 |  |  |   height: calc(100% - 100px); | 
 |  |  |  | 
 |  |  |   .title { | 
 |  |  |     font-weight: 600; | 
 |  |  |     font-size: 16px; | 
 |  |  | 
 |  |  |   .type_wrap { | 
 |  |  |     flex: 5; | 
 |  |  |     flex-shrink: 0; | 
 |  |  |     border: 1px solid #E5E5E5; | 
 |  |  |     height: 100%; | 
 |  |  |     height: calc(100% - 20px); | 
 |  |  |     border-right: 12px solid #f7f7f7; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     .echart1 { | 
 |  |  |       width: 100%; | 
 |  |  |       height: calc(100% - 60px); | 
 |  |  |     } | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   .dept_wrap { | 
 |  |  |     flex: 4; | 
 |  |  |     flex-shrink: 0; | 
 |  |  |     border: 1px solid #E5E5E5; | 
 |  |  |     height: 100%; | 
 |  |  |     height: calc(100% - 20px); | 
 |  |  |     padding-left: 20px; | 
 |  |  |  | 
 |  |  |     .echart2 { | 
 |  |  |       width: 100%; | 
 |  |  |       height: calc(100% - 60px); | 
 |  |  |     } | 
 |  |  |   } | 
 |  |  | } | 
 |  |  | </style> |