|  |  | 
 |  |  | <template> | 
 |  |  |   <div class="main_app"> | 
 |  |  |     <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="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> | 
 |  |  |         </el-radio-group> | 
 |  |  |       </template> | 
 |  |  |     </QueryForm> | 
 |  |  |   <div class="main_app1"> | 
 |  |  |     <div class="main_head"> | 
 |  |  |       <div class="main_head_item blue"> | 
 |  |  |         <span>{{totalList.total}}</span> | 
 |  |  |         <span>总隐患数</span> | 
 |  |  |       </div> | 
 |  |  |       <div class="main_head_item red"> | 
 |  |  |         <span>{{totalList.waitDeal}}</span> | 
 |  |  |         <span>待处理</span> | 
 |  |  |       </div> | 
 |  |  |       <div class="main_head_item yellow"> | 
 |  |  |         <span>{{totalList.dealFinish}}</span> | 
 |  |  |         <span>已整改</span> | 
 |  |  |       </div> | 
 |  |  |       <div class="main_head_item orange"> | 
 |  |  |         <span>{{totalList.back}}</span> | 
 |  |  |         <span>已退回</span> | 
 |  |  |       </div> | 
 |  |  |       <div class="main_head_item darkBlue"> | 
 |  |  |         <span>{{totalList.todayNew}}</span> | 
 |  |  |         <span>今日新增</span> | 
 |  |  |       </div> | 
 |  |  |     </div> | 
 |  |  | <!--    <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="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>--> | 
 |  |  | <!--        </el-radio-group>--> | 
 |  |  | <!--      </template>--> | 
 |  |  | <!--    </QueryForm>--> | 
 |  |  |     <div class="main_content"> | 
 |  |  |       <div class="type_wrap"> | 
 |  |  |         <div class="title">隐患类型统计</div> | 
 |  |  |         <div class="echart1" ref="typeRef"></div> | 
 |  |  |         <div v-show="typeList && typeList.length > 0" class="echart1" ref="typeRef"></div> | 
 |  |  |         <div v-show="typeList.length == 0" style="width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;"> | 
 |  |  |           <img style="width: 240px;" src="@/assets/images/default_homeimg.png" alt=""> | 
 |  |  |         </div> | 
 |  |  |  | 
 |  |  |       </div> | 
 |  |  |       <div class="dept_wrap"> | 
 |  |  |         <div class="title">隐患归属部门统计</div> | 
 |  |  |         <div class="echart2" ref="deptRef"></div> | 
 |  |  |         <div v-show="deptList && deptList.length > 0" class="echart2" ref="deptRef"></div> | 
 |  |  |         <div v-show="deptList.length == 0" style="width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;"> | 
 |  |  |           <img style="width: 240px;" src="@/assets/images/default_homeimg.png" alt=""> | 
 |  |  |         </div> | 
 |  |  |       </div> | 
 |  |  |     </div> | 
 |  |  |     <div class="main_table"> | 
 |  |  |       <div class="main_table_echart"> | 
 |  |  |         <div class="title">本年隐患趋势</div> | 
 |  |  |         <div id="echart3" v-if="yearList.length > 0"></div> | 
 |  |  |         <div v-else style="width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;"> | 
 |  |  |           <img style="width: 240px;" src="@/assets/images/default_homeimg.png" alt=""> | 
 |  |  |         </div> | 
 |  |  |       </div> | 
 |  |  |       <div class="main_table_list"> | 
 |  |  |         <div class="title">本月频繁发生隐患区域Top10</div> | 
 |  |  |         <div class="list_head"> | 
 |  |  |           <div class="list_head_item">责任部门</div> | 
 |  |  |           <div class="list_head_item">隐患区域</div> | 
 |  |  |           <div class="list_head_item">隐患数量</div> | 
 |  |  |         </div> | 
 |  |  |         <div class="table_box"> | 
 |  |  |           <div class="list_content" v-for="(item, index) in departmentList" :key="index"> | 
 |  |  |             <div class="list_head_item">{{item.name}}</div> | 
 |  |  |             <div class="list_head_item">{{item.categoryName}}</div> | 
 |  |  |             <div class="list_head_item">{{item.total}}</div> | 
 |  |  |           </div> | 
 |  |  |         </div> | 
 |  |  |       </div> | 
 |  |  |     </div> | 
 |  |  |   </div> | 
 |  |  | 
 |  |  |   data() { | 
 |  |  |     return { | 
 |  |  |       filters: { | 
 |  |  |         fastdate: '0', | 
 |  |  |         fastdate: '29', | 
 |  |  |         queryStartTime: '', | 
 |  |  |         queryEndTime: '' | 
 |  |  |       }, | 
 |  |  | 
 |  |  |             options: [ | 
 |  |  |               { label: '待处理', value: '0' }, | 
 |  |  |               { label: '已处理', value: '1' }, | 
 |  |  |               { label: '不处理', value: '2' }, | 
 |  |  |               { label: '已退回', value: '2' }, | 
 |  |  |             ] | 
 |  |  |           }, | 
 |  |  |           { | 
 |  |  | 
 |  |  |       }, | 
 |  |  |       typeList: [], | 
 |  |  |       deptList: [], | 
 |  |  |       totalList: { | 
 |  |  |         total: 0, | 
 |  |  |         waitDeal: 0, | 
 |  |  |         dealFinish: 0, | 
 |  |  |         back: 0, | 
 |  |  |         todayNew: 0 | 
 |  |  |       }, | 
 |  |  |       yearList: [], | 
 |  |  |       departmentList: [] | 
 |  |  |     } | 
 |  |  |   }, | 
 |  |  |   mounted() { | 
 |  |  |     this.changeRadio('0') | 
 |  |  |     this.changeRadio('29') | 
 |  |  |     this.initDept3() | 
 |  |  |     // this.getData() | 
 |  |  |   }, | 
 |  |  |   methods: { | 
 |  |  |     changeRadio(day) { | 
 |  |  | 
 |  |  |     getData(page) { | 
 |  |  |       hiddenDangerDataPost({ ...this.filters }).then(res => { | 
 |  |  |         if (res) { | 
 |  |  |           this.totalList.total = res.total || 0 | 
 |  |  |           this.totalList.waitDeal = res.waitDeal || 0 | 
 |  |  |           this.totalList.dealFinish = res.dealFinish || 0 | 
 |  |  |           this.totalList.back = res.back || 0 | 
 |  |  |           this.totalList.todayNew = res.todayNew || 0 | 
 |  |  |  | 
 |  |  |           this.yearList = res.yearList | 
 |  |  |  | 
 |  |  |           this.departmentList = res.departmentList.slice(0, 10) | 
 |  |  |  | 
 |  |  |           this.typeList = res.cateList || [] | 
 |  |  |           this.deptList = res.departmentList || [] | 
 |  |  |           this.initType() | 
 |  |  |           this.initDept() | 
 |  |  |           this.$nextTick(() => { | 
 |  |  |             this.initType() | 
 |  |  |             this.initDept() | 
 |  |  |             this.initDept3() | 
 |  |  |           }) | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |       }) | 
 |  |  |  | 
 |  |  | 
 |  |  |       this.typeList.forEach(i => { | 
 |  |  |         total += i.total | 
 |  |  |       }) | 
 |  |  |       let colors = ['#d75a44', '#e39f4d', '#7ac7f6', '#7ac7f6', '#4469ee', '#698af0', '#9fb5f4', '#b6c7f7', '#c8d5f8'] | 
 |  |  |       let colors = ['#d75a44', '#e39f4d', '#f0d05f', '#7ac7f6', '#4469ee', '#698af0','#86a2f1','#a1b4f6','#a0b5f5', '#9fb5f4', '#b6c7f7', '#c8d5f8'] | 
 |  |  |       let option = { | 
 |  |  |         grid: { | 
 |  |  |           left: '0%', | 
 |  |  |           right: '0%', | 
 |  |  |           bottom: '0%', | 
 |  |  |           top: '0%', | 
 |  |  |           containLabel: true | 
 |  |  |         }, | 
 |  |  |         title: [ | 
 |  |  |           { | 
 |  |  |             text: '隐患总数', | 
 |  |  |             top: '46%', | 
 |  |  |             left: '46%', | 
 |  |  |             left: '45%', | 
 |  |  |             textStyle: { | 
 |  |  |               color: '#666666', | 
 |  |  |               fontSize: 16, | 
 |  |  |               fontSize: 13, | 
 |  |  |             }, | 
 |  |  |           }, { | 
 |  |  |             text: total, | 
 |  |  |             top: '50%', | 
 |  |  |             left: '48%', | 
 |  |  |             left: '47.6%', | 
 |  |  |             textStyle: { | 
 |  |  |               color: '#080404', | 
 |  |  |               fontSize: 24, | 
 |  |  |               fontSize: 16, | 
 |  |  |               fontWeight: 'bold', | 
 |  |  |             }, | 
 |  |  |           }], | 
 |  |  | 
 |  |  |         }, | 
 |  |  |         series: [ | 
 |  |  |           { | 
 |  |  |             name: 'Access From', | 
 |  |  |             type: 'pie', | 
 |  |  |             radius: ['28%', '46%'], | 
 |  |  |             radius: ['34%', '50%'], | 
 |  |  |             label: { | 
 |  |  |               formatter: "{a|{b}}\n\n{c} | {d}%", | 
 |  |  |               rich: { | 
 |  |  | 
 |  |  |       const myChart = echarts.init(document.querySelector('.echart2')) | 
 |  |  |  | 
 |  |  |       let option = { | 
 |  |  |         grid: { | 
 |  |  |           left: '10%', | 
 |  |  |           right: '10%', | 
 |  |  |           bottom: '0%', | 
 |  |  |           top: '20%', | 
 |  |  |           containLabel: true | 
 |  |  |         }, | 
 |  |  |         xAxis: { | 
 |  |  |           type: 'category', | 
 |  |  |           data: this.deptList.map(i => i.name), | 
 |  |  | 
 |  |  |         yAxis: { | 
 |  |  |           type: 'value', | 
 |  |  |           name: '隐患数', | 
 |  |  |           minInterval: 1, | 
 |  |  |           axisLine: { | 
 |  |  |             show: true, | 
 |  |  |           }, | 
 |  |  | 
 |  |  |         myChart.resize() | 
 |  |  |       }) | 
 |  |  |     }, | 
 |  |  |     initDept3() { | 
 |  |  |       if (this.yearList.length === 0) return | 
 |  |  |  | 
 |  |  |       const myChart = echarts.init(document.querySelector('#echart3')) | 
 |  |  |  | 
 |  |  |       let names = this.yearList.map(item => item.name) | 
 |  |  |       let datas = this.yearList.map(item => item.total) | 
 |  |  |  | 
 |  |  |       let option = { | 
 |  |  |         grid: { | 
 |  |  |           left: '5%', | 
 |  |  |           right: '10%', | 
 |  |  |           bottom: '0%', | 
 |  |  |           top: '20%', | 
 |  |  |           containLabel: true | 
 |  |  |         }, | 
 |  |  |         xAxis: { | 
 |  |  |           type: 'category', | 
 |  |  |           data: names | 
 |  |  |         }, | 
 |  |  |         yAxis: { | 
 |  |  |           type: 'value' | 
 |  |  |         }, | 
 |  |  |         series: [ | 
 |  |  |           { | 
 |  |  |             data: datas, | 
 |  |  |             type: 'line' | 
 |  |  |           } | 
 |  |  |         ] | 
 |  |  |       } | 
 |  |  |       myChart.setOption(option) | 
 |  |  |       window.addEventListener('resize', function () { // 执行 | 
 |  |  |         myChart.resize() | 
 |  |  |       }) | 
 |  |  |     }, | 
 |  |  |     clear() { | 
 |  |  |       this.filters = {} | 
 |  |  |       this.getData() | 
 |  |  | 
 |  |  | /*.main_app { | 
 |  |  |   height: 100%; | 
 |  |  | }*/ | 
 |  |  |  | 
 |  |  | .main_content { | 
 |  |  |   display: flex; | 
 |  |  |   height: calc(100% - 100px); | 
 |  |  |  | 
 |  |  |   .title { | 
 |  |  |     font-weight: 600; | 
 |  |  |     font-size: 16px; | 
 |  |  |     color: #222222; | 
 |  |  | .main_app1 { | 
 |  |  |   width: 100%; | 
 |  |  |   height: calc(100% - 44px); | 
 |  |  |   overflow-y: auto; | 
 |  |  |   overflow-x: hidden; | 
 |  |  |   padding: 15px; | 
 |  |  |   box-sizing: border-box; | 
 |  |  |   background-color: #ffffff; | 
 |  |  |   .main_head { | 
 |  |  |     width: 100%; | 
 |  |  |     display: flex; | 
 |  |  |     align-items: center; | 
 |  |  |     justify-content: space-between; | 
 |  |  |     margin-bottom: 20px; | 
 |  |  |     margin-top: 20px; | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   .type_wrap { | 
 |  |  |     flex: 5; | 
 |  |  |     flex-shrink: 0; | 
 |  |  |     height: calc(100% - 20px); | 
 |  |  |     border-right: 12px solid #f7f7f7; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     .echart1 { | 
 |  |  |       width: 100%; | 
 |  |  |       height: calc(100% - 60px); | 
 |  |  |     .blue { | 
 |  |  |       border-left: 5px solid blue; | 
 |  |  |     } | 
 |  |  |     .red { | 
 |  |  |       border-left: 5px solid red; | 
 |  |  |     } | 
 |  |  |     .yellow { | 
 |  |  |       border-left: 5px solid yellow; | 
 |  |  |     } | 
 |  |  |     .orange { | 
 |  |  |       border-left: 5px solid orange; | 
 |  |  |     } | 
 |  |  |     .darkBlue { | 
 |  |  |       border-left: 5px solid #0000a8; | 
 |  |  |     } | 
 |  |  |     .main_head_item { | 
 |  |  |       width: 19%; | 
 |  |  |       height: 70px; | 
 |  |  |       display: flex; | 
 |  |  |       flex-direction: column; | 
 |  |  |       align-items: center; | 
 |  |  |       justify-content: center; | 
 |  |  |       box-sizing: border-box; | 
 |  |  |       border-radius: 5px; | 
 |  |  |       background-color: #ffffff; | 
 |  |  |       span { | 
 |  |  |         &:nth-child(1) { | 
 |  |  |           font-size: 22px; | 
 |  |  |           color: black; | 
 |  |  |           font-weight: bold; | 
 |  |  |         } | 
 |  |  |         &:nth-child(2) { | 
 |  |  |           font-size: 16px; | 
 |  |  |           color: black; | 
 |  |  |         } | 
 |  |  |       } | 
 |  |  |     } | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   .dept_wrap { | 
 |  |  |     flex: 4; | 
 |  |  |     flex-shrink: 0; | 
 |  |  |     height: calc(100% - 20px); | 
 |  |  |     padding-left: 20px; | 
 |  |  |   .main_table { | 
 |  |  |     display: flex; | 
 |  |  |     align-items: start; | 
 |  |  |     justify-content: space-between; | 
 |  |  |     .main_table_echart { | 
 |  |  |       flex: 1; | 
 |  |  |       height: 400px; | 
 |  |  |       .title { | 
 |  |  |         font-weight: 600; | 
 |  |  |         font-size: 16px; | 
 |  |  |         color: #222222; | 
 |  |  |       } | 
 |  |  |       #echart3 { | 
 |  |  |         width: 100%; | 
 |  |  |         height: calc(100% - 33px); | 
 |  |  |       } | 
 |  |  |     } | 
 |  |  |     .main_table_list { | 
 |  |  |       margin-left: 20px; | 
 |  |  |       flex-shrink: 0; | 
 |  |  |       width: 500px; | 
 |  |  |       .title { | 
 |  |  |         font-weight: 600; | 
 |  |  |         font-size: 16px; | 
 |  |  |         color: #222222; | 
 |  |  |       } | 
 |  |  |       .list_head { | 
 |  |  |         width: 100%; | 
 |  |  |         height: 35px; | 
 |  |  |         display: flex; | 
 |  |  |         align-items: center; | 
 |  |  |         background-color: #ececec; | 
 |  |  |         margin-top: 15px; | 
 |  |  |         .list_head_item { | 
 |  |  |           flex: 1; | 
 |  |  |           height: 100%; | 
 |  |  |           display: flex; | 
 |  |  |           align-items: center; | 
 |  |  |           justify-content: center; | 
 |  |  |           font-size: 13px; | 
 |  |  |           color: #222222; | 
 |  |  |         } | 
 |  |  |       } | 
 |  |  |       .table_box { | 
 |  |  |         width: 100%; | 
 |  |  |         .list_content { | 
 |  |  |           width: 100%; | 
 |  |  |           height: 35px; | 
 |  |  |           display: flex; | 
 |  |  |           align-items: center; | 
 |  |  |           .list_head_item { | 
 |  |  |             flex: 1; | 
 |  |  |             height: 100%; | 
 |  |  |             display: flex; | 
 |  |  |             align-items: center; | 
 |  |  |             justify-content: center; | 
 |  |  |             font-size: 13px; | 
 |  |  |             color: #222222; | 
 |  |  |           } | 
 |  |  |         } | 
 |  |  |       } | 
 |  |  |     } | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |     .echart2 { | 
 |  |  |       width: 100%; | 
 |  |  |       height: calc(100% - 60px); | 
 |  |  |   .main_content { | 
 |  |  |     display: flex; | 
 |  |  |     height: 500px; | 
 |  |  |  | 
 |  |  |     .title { | 
 |  |  |       font-weight: 600; | 
 |  |  |       font-size: 16px; | 
 |  |  |       color: #222222; | 
 |  |  |       /*margin-bottom: 20px;*/ | 
 |  |  |       margin-top: 20px; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     .type_wrap { | 
 |  |  |       flex: 11; | 
 |  |  |       flex-shrink: 0; | 
 |  |  |       height: calc(100% - 20px); | 
 |  |  |       /*border-right: 12px solid #f7f7f7;*/ | 
 |  |  |  | 
 |  |  |  | 
 |  |  |       .echart1 { | 
 |  |  |         width: 100%; | 
 |  |  |         height: calc(100% - 60px); | 
 |  |  |       } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     .dept_wrap { | 
 |  |  |       flex: 10; | 
 |  |  |       flex-shrink: 0; | 
 |  |  |       height: calc(100% - 20px); | 
 |  |  |       padding-left: 20px; | 
 |  |  |  | 
 |  |  |       .echart2 { | 
 |  |  |         width: 100%; | 
 |  |  |         height: calc(100% - 60px); | 
 |  |  |       } | 
 |  |  |     } | 
 |  |  |   } | 
 |  |  | } | 
 |  |  |  | 
 |  |  | </style> |