<template> <!-- 监控日志 --> <div class="jktjDetail from-clues"> <!-- 头部搜索 --> <div class="from-clues-header"> <el-form ref="form" :model="form" label-width="80px"> <el-form-item v-if="BASE_API.THEME == 'jg'"> <Breadcrumb /> </el-form-item> <el-row class="mb-5"> <el-col :span="4"> <el-form-item label="行政区" class="d-flex"> <el-select v-model="form.qxdm" class="width100" clearable placeholder="行政区"> <el-option v-for="item in dicData['A20']" :key="item.DCODE" :label="item.DNAME" :value="item.DCODE"> </el-option> </el-select> </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="开始日期" prop="startTime" class="d-flex"> <el-date-picker type="date" :clearable="false" class="width100" placeholder="开始日期" :picker-options="pickerOptionsStart" v-model="form.startTime" value-format="yyyy-MM-dd HH:mm:ss"></el-date-picker> </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="结束日期" prop="endTime" class="d-flex"> <el-date-picker type="date" :clearable="false" class="width100" placeholder="结束日期" :picker-options="pickerOptionsEnd" v-model="form.endTime" value-format="yyyy-MM-dd HH:mm:ss" @change="endTimeChange"></el-date-picker> </el-form-item> </el-col> <!-- 操作按钮 --> <el-col :span="12" class="btnColRight"> <btn nativeType="cz" @click="resetForm">重置</btn> <btn nativeType="cx" @click="getSuucessRate">查询</btn> </el-col> </el-row> </el-form> </div> <!-- 图表 --> <div class="from-clues-content echarts-box" v-if="chartData.length"> <div id="myChart" class="chart" style="height:100%;width:100%;"></div> </div> <div class="from-clues-content echarts-box center" v-else>暂无数据</div> </div> </template> <script> import { mapGetters } from "vuex"; import { getFirstDayOfSeason, timeFormat } from "@/utils/operation"; import business from "@/api/business"; export default { name: "jktj", data () { return { // 开始日期限制 pickerOptionsStart: { disabledDate: (time) => { if (this.form.endTime) { return time.getTime() > new Date(this.form.endTime).getTime(); } }, }, // 结束日期限制 pickerOptionsEnd: { disabledDate: (time) => { if (this.form.startTime) { return time.getTime() < new Date(this.form.startTime).getTime(); } }, }, recTypeArr: [], chartData: [], // 搜索表单 form: { startTime: getFirstDayOfSeason(), endTime: timeFormat(new Date(), true), qxdm: "", }, interval: 50 }; }, mounted () { // 查询成功率 this.getSuucessRate(); }, computed: { ...mapGetters(["dicData"]), }, methods: { endTimeChange (val) { this.form.endTime = timeFormat(new Date(val), true) }, async getSuucessRate () { this.recTypeArr = []; this.chartData = []; let { result: res } = await business.getSuucessRate( this.form.startTime, this.form.endTime, this.form.qxdm ); this.chartData = res; let maxData = Math.max.apply(Math, this.chartData.map(item => { return item.failure })) this.interval = Math.ceil(maxData / 10) //行政区代码过滤 res.length > 0 && res.forEach((item) => { this.recTypeArr.push(item.recTypeName); }); this.$nextTick(() => { // 初始化图表 this.chartData.length && this.echartInit(); }); }, // 重置 resetForm () { this.form = { startTime: getFirstDayOfSeason(), endTime: timeFormat(new Date(), true), qxdm: "", }; this.getSuucessRate(); }, echartInit () { let _this = this; // 基于准备好的dom,初始化echarts实例 let myChart = this.$echarts.init(document.getElementById("myChart")); // 绘制图表 myChart.setOption({ color: ["#13E5FF", "#C99E68", "#E873B2", "#ffaf48"], tooltip: { trigger: "axis", formatter: '{b}<br/>{a0}:{c0}个<br/>{a1}:{c1}个<br/>{a2}:{c2}%', axisPointer: { type: "cross", crossStyle: { color: this.BASE_API.echartTextColor, }, }, }, legend: { data: ["成功", "失败", "成功率"], top: '16', textStyle: { show: true, color: this.BASE_API.echartTextColor, fontSize: "16", }, }, label: { color: 'inherit', }, xAxis: [ { type: "category", data: _this.recTypeArr, axisPointer: { type: "shadow", }, axisLabel: { textStyle: { show: true, color: this.BASE_API.echartTextColor, fontSize: "16", }, formatter: function (val) { let c = document.createElement("canvas"); const ctx = c.getContext("2d"); const arr = val.split(""); arr .map((item) => ctx.measureText(item).width) .reduce((pre, next, index) => { const nLen = pre + next; if (nLen > 40) { arr[index - 1] += "..."; return next; } else { return nLen; } }); c = null; let ind = arr.findIndex((i) => { return i.indexOf("...") > -1; }); let newArr = ind > 0 ? arr.splice(0, ind + 1) : arr; return newArr.join(""); }, }, }, ], yAxis: [ { type: "value", name: "数量/个", nameTextStyle: { color: this.BASE_API.echartTextColor, fontSize: "16", }, // interval: this.interval, axisLabel: { formatter: "{value}", textStyle: { show: true, color: this.BASE_API.echartTextColor, fontSize: "16", }, }, }, { type: "value", name: "成功率", nameTextStyle: { color: this.BASE_API.echartTextColor, fontSize: "16", }, splitNumber: 2, axisLabel: { formatter: "{value} %", textStyle: { show: true, color: this.BASE_API.echartTextColor, fontSize: "16", }, }, }, ], series: [ { name: "成功", type: "bar", //显示数值 itemStyle: { normal: { label: { show: true, //开启显示 position: "top", //在上方显示 }, }, }, barMaxWidth: '60', data: this.chartData.map((item) => { return item.success; }), }, { name: "失败", type: "bar", //显示数值 itemStyle: { normal: { label: { show: true, //开启显示 position: "top", //在上方显示 }, }, }, barMaxWidth: '60', data: this.chartData.map((item) => { return item.failure; }), }, { name: "成功率", //显示数值 itemStyle: { normal: { label: { show: true, //开启显示 position: "top", //在上方显示 }, }, }, type: "line", barMaxWidth: '60', yAxisIndex: 1, data: this.chartData.map((item) => { return item.rate; }), }, ], }); }, }, }; </script> <style scoped lang="scss"> .jktjDetail { flex-direction: column; .rows { margin-left: 100px; } .center { line-height: 50vh; text-align: center; color: #b6b5b5; } } </style>