实验室运维前端-web
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

1624 lines
48 KiB

<template>
<div class="container">
<!-- 用户 -->
<div style="width:100%;height:100%;"
v-show="role_id == '1123598816738675200' || role_id == '1123598816738675201' || role_id == '1846419477876510721'">
<div class="mask" v-show="isShowMask">
账号审核中...
</div>
<div class="top_box">
<div class="top_left">
<img style="width:100%;height:100%;border-radius: 10px;" :src="backGroundPic" alt="">
</div>
<div class="top_right">
<div class="work_box">
<div class="work_tit">工作台</div>
<div class="work_con">
<div class="work_item" v-for="(item, index) in workList" :key="item.name" @click="ckickItem(item)">
<div class="item_top">
<div class="item_img">
<!-- <img :src="item.img" alt=""> -->
<img
:src="index == 0 ? require('@/assets/images/lab_xj.png') : index == 1 ? require('@/assets/images/bs_jl.png') :
index == 2 ? require('@/assets/images/alarm.png') : index == 3 ? require('@/assets/images/full.png') : ''"
alt="">
</div>
<div class="right_item">
<div class="item_name">{{ item.name }}</div>
<div class="item_num" >{{ item.num }}</div>
</div>
</div>
</div>
<div class="work_item" v-show="isShowOther">
<div class="item_top">
<div class="item_img">
<img :src="require('@/assets/images/other.png')" alt="">
</div>
<div class="right_item">
<div class="item_name">其他</div>
</div>
</div>
</div>
</div>
</div>
<div class="xj_box">
<div class="xj_tit">实验室巡检</div>
<div class="xj_con">
<!-- <el-carousel direction="vertical" interval="10000" :autoplay="true" class="xj_con_box">
<el-carousel-item v-for="item in inspectionList" :key="item.title">
<div class="xj_item">
<div class="xj_top">
<div class="tit_box">
<div class="xj_title">{{ item.inspectionName }}</div>
<div class="xj_time">巡检计划时间:{{ item.inspectionTime }}</div>
</div>
<div class="xj_task">{{ taskType == 1 ? '周期任务' : '单次任务' }}</div>
</div>
<div class="xj_center">巡检人:{{ item.inspectionPerson }}</div>
<div class="xj_bottom">
<div class="xj_status">{{ item.isStart == 0 ? '未开始' : '已开始' }}</div>
<div class="xj_yytime">预约时间:{{ item.appointTime }}</div>
</div>
</div>
</el-carousel-item>
</el-carousel> -->
<vueSeamless v-if="inspectionList.length >= 1" :data="inspectionList" :class-option="alarmOption" class="xj_con_box">
<div class="xj_item" v-for="item in inspectionList" :key="item.name">
<div class="xj_top">
<div class="tit_box">
<div class="xj_title">{{ item.inspectionName }}</div>
<div class="xj_time">巡检计划时间:{{ item.inspectionTime }}</div>
</div>
<div class="xj_task">{{ taskType == 1 ? '周期任务' : '单次任务' }}</div>
</div>
<div class="xj_center">
巡检人:{{ item.inspectionPerson }}
<div class="xj_status">{{ item.isStart == 0 ? '未开始' : '已开始' }}</div>
<div class="xj_yytime">预约时间:{{ item.appointTime }}</div>
</div>
<!-- <div class="xj_bottom">
</div> -->
</div>
</vueSeamless>
<el-empty class="xj_con_box" v-show="inspectionList.length == 0" description="暂无数据"></el-empty>
</div>
</div>
<div class="xj_box">
<div class="xj_tit">实验室维修</div>
<div class="xj_con">
<vueSeamless v-if="requirementList.length >= 1" :data="requirementList" :class-option="alarmOption" class="xj_con_box">
<div class="xj_item" v-for="item in requirementList" :key="item.name" @click="clickReqiure(item)">
<div class="xj_top">
<div class="tit_box">
<div class="xj_title">{{ item.requirementCode }}</div>
</div>
<div class="xj_task">{{ getStatus('maintain', role_id, item.status).name}}</div>
</div>
<div class="xj_center">
<div class="xj_status">{{ item.faultDescribe }}</div>
</div>
<!-- <div class="xj_bottom">
</div> -->
</div>
</vueSeamless>
<el-empty class="xj_con_box" v-show="requirementList.length == 0" description="暂无数据"></el-empty>
</div>
</div>
</div>
</div>
<div class="bottom_box">
<div class="bottom_left">
<div class="left_tit">设备报警</div>
<div class="left_con">
<vueSeamless v-if="alarmList.length >= 1" :data="alarmList" :class-option="alarmOption"
class="tablebox_item_warp">
<div class="left_item" v-for="item in alarmList" :key="item.name">
<div class="item_left">
<div class="item_circle"
:class="item.alarmLevel == '1' ? 'one' : item.alarmLevel == '2' ? 'two' : ''">
<div class="status">{{ item.alarmLevel == '1' ? '一级' : item.alarmLevel == '2' ? '二级' : '' }}</div>
<div class="status_txt">{{ item.alarmLevel == '1' ? '特别严重' : item.alarmLevel == '2' ? '严重' : '' }}
</div>
</div>
</div>
<div class="item_right">
<div class="item_con">
<div class="item_top">
<div>{{ item.deviceName }}</div>
<div class="item_btn">一键报送</div>
</div>
<div class="item_bot">
<div>品牌:{{ item.brand }}</div>
<div>型号:{{ item.model }}</div>
<div>报警时间:{{ item.alarmTime }}</div>
</div>
</div>
</div>
</div>
</vueSeamless>
<el-empty class="nodata" v-show="alarmList.length == 0" description="暂无报警"></el-empty>
</div>
</div>
<div class="bottom_right">
<div class="right_tit">维修统计</div>
<div class="right_con">
<div class="bar_box">
<div class="bar_top">
选择时间:<el-date-picker v-model="staticBarTime" type="daterange" range-separator="至"
start-placeholder="开始日期" end-placeholder="结束日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
@change="changeStaticBarTime">
</el-date-picker>
</div>
<div class="bar_charts" id="bar_echart"></div>
</div>
<div class="pie_box">
<div class="pie_top">
选择时间:<el-date-picker v-model="staticPieTime" type="daterange" range-separator="至"
start-placeholder="开始日期" end-placeholder="结束日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
@change="changestaticPieTime">
</el-date-picker>
</div>
<div class="pie_charts">
<div class="pie_chart">
<div class="charts_box" id="error_echarts"></div>
<div class="charts_tit">故障现象分类</div>
</div>
<div class="pie_chart">
<div class="charts_box" id="device_echarts"></div>
<div class="charts_tit">设备分类</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 客服/维修负责人 -->
<div style="width:100%;height:100%;" v-if="role_id == '1839536982874193922' || role_id == '1839537055389515777'||role_id == '1867020647911350274'">
<div class="left_box">
<div class="map_box">
<Map style="width:100%;height:100%;"></Map>
</div>
<div class="bench_box">
<div class="bench_tit"><span style="font-weight: 550;">工作台</span>
</div>
<div class="bench_con">
<div class="bench_item" v-for="(item, index) in benchList" :key="item.title">
<img v-show="role_id == '1839536982874193922'" style="width: 32px;height: 32px;"
:src="index == 0 ? require('@/assets/svg/task.svg') : index == 1 ? require('@/assets/svg/over.svg') : index == 2 ? require('@/assets/svg/plan.svg') : ''"
alt="">
<img v-show="role_id == '1839537055389515777'" style="width: 32px;height: 32px;"
:src="index == 0 ? require('@/assets/svg/task.svg') : index == 1 ? require('@/assets/svg/over.svg') : index == 2 ? require('@/assets/svg/person.svg') : ''"
alt="">
<div style="margin:5px 0;color:#101010;">{{ item.title }}</div>
<div style="margin:12px 0;color:#6c6c6c;font-size:14px;">{{ item.mainName }}<span
style="margin:0px 10px;font-size:22px;color:#000;">{{ item.num }}</span>{{ item.mainName == '巡检签约' ?
'家'
: item.title == '维修人员' ? '人' : '件'}}</div>
<div style="color:#6c6c6c;font-size:14px;">{{ item.subName }}<span
style="margin:0px 10px;font-size:22px;color:#000;">{{ item.num1 }}</span>{{ item.title == '维修人员' ? '人'
:
'件'}}</div>
</div>
</div>
</div>
</div>
<div class="right_box">
<div class="right_top">
<div class="top_tit">实验室巡检</div>
<div class="top_con">
<div class="top_container">
<vueSeamless v-if="labXjList.length >= 1" :data="labXjList" :class-option="calssOption"
class="tablebox_item_warp">
<div class="top_item" v-for="item in labXjList" :key="item.name">
<div class="item_left">{{ item.name }}</div>
<div class="item_right">巡检计划时间:{{ item.planTime }}</div>
</div>
</vueSeamless>
</div>
</div>
</div>
<div class="right_bottom">
<div class="bottom_tit">提报统计</div>
<div class="bottom_con">
<div class="static_box">
<div class="static_top">
<div>{{ (role_id == '1839536982874193922'||role_id == '1867020647911350274') ? '各单位提报统计' : '各维修人员数据统计' }}</div>
<div style="margin-left: 20px;">选择时间:
<el-date-picker v-model="staticTime" type="daterange" range-separator="至" start-placeholder="开始日期"
end-placeholder="结束日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd" @change="changestaticTime" size="mini">
</el-date-picker>
</div>
</div>
<div class="static_chart" id="unitCharts" v-show="role_id == '1839536982874193922'"></div>
<div class="static_chart" id="peopleCharts" v-show="role_id == '1839537055389515777'"></div>
</div>
<div class="static_box">
<div class="static_top">
<div>故障类占比统计</div>
<div>
选择时间:
<el-date-picker v-model="faultTime" type="daterange" range-separator="至" start-placeholder="开始日期"
end-placeholder="结束日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd" @change="changeFaultTime" size="mini">
</el-date-picker>
<!-- <el-select v-model="typeValue" placeholder="请选择">
<el-option v-for="item in typeList" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
<el-select v-model="deviceValue" placeholder="请选择设备">
<el-option v-for="item in deviceList" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
<el-select v-model="brandValue" placeholder="请选择品牌">
<el-option v-for="item in brandList" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select> -->
</div>
</div>
<div class="static_bot_chart">
<div class="problem_box" id="problem_charts"></div>
<div class="probability_box" id="probability_charts"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { nextTick } from 'vue';
import { mapGetters } from "vuex";
import Map from './map.vue'
import vueSeamless from 'vue-seamless-scroll'
import { getUserInfo } from "@/api/system/user";
import { getList } from '@/api/operation/hand'
import { overview, workList, deviceList, upkeepStat, pieStat,maintenancePersonnel, mapAddress, limsInspecList, overviewList, limsInspecChart, faultRatio } from '@/api/workbench/workbench'
import { color } from 'echarts';
import statusData from "@/assets/json/status.json"; // 引入状态数据
export default {
components: {
Map,
vueSeamless
},
data() {
return {
requirementList:[],
role_id: '',
isShowOther: false,
isShowMask:false,
workList: [
{
name:'实验室巡检',
img:require('@/assets/images/lab_xj.png'),
num:0
},
{
name:'报送记录',
img:require('@/assets/images/bs_jl.png'),
num:0
},
{
name:'设备报警',
img:require('@/assets/images/alarm.png'),
num:0
},
{
name:'监控大屏',
img:require('@/assets/images/full.png'),
num:0
},
],
inspectionList: [
{
appointTime: "2024-11-15",
inspectionName: "水系统检查",
inspectionPerson: "张三",
inspectionTime: "2024-11-11",
isStart: "0",
taskType: "1"
}
],
staticBarTime: '',
staticPieTime: '',
staticTime: [],
faultTime: [],
alarmList: [
{
alarmLevel: "1",
alarmTime: "2024-11-15",
brand: "品牌A",
deviceName: "2024-11-11",
model: "GDXH-12582",
}
],
benchList: [
{
img:require('@/assets/svg/task.svg'),
title:'我的任务',
mainName:'今日待办',
num:'5',
subName:'今日已办',
num1:10
},
{
img:require('@/assets/svg/over.svg'),
title:'维修已办结',
mainName:'本月',
num:16,
subName:'本年',
num1:129
},
{
img:require('@/assets/svg/plan.svg'),
title:'巡检计划1',
mainName:'巡检签约',
num:22,
subName:'巡检',
num1:159
}
],
typeList: [
{ label: '装修类', value: '001' }
],
typeValue: '',
deviceList: [{ label: '给排水', value: '01' }, { label: '空调', value: '02' }],
deviceValue: '',
brandList: [{ label: '美的', value: '0001' }, { label: '海尔', value: '0002' }],
brandValue: '',
labXjList: [
// {name:'安池实验室-实验室设备巡检',time:'2024/8/28'},
// {name:'安池实验室-实验室设备巡检1',time:'2024/8/29'},
// {name:'安池实验室-实验室设备巡检2',time:'2024/8/30'},
// {name:'安池实验室-实验室设备巡检3',time:'2024/8/30'},
// {name:'安池实验室-实验室设备巡检4',time:'2024/8/30'},
// {name:'安池实验室-实验室设备巡检5',time:'2024/8/30'},
],
calssOption: {},
alarmOption: {},
xData: [],
numData: [],
backGroundPic: require('@/assets/images/lab.png'),
barXdata: ["报送维修", "巡检维修"],
totalBardata: [10, 20],
completedBardata: [3, 12],
unCompletedBardata: [7, 8],
errorData: [
{name: "电气", value: 300},
{name: "空调", value: 248},
{name: "装修类", value: 135},
{name: "智能设备", value: 180},
{name: "暖通、自控", value: 654}
],
deviceData: [
{name: "设备1", value: 580},
{name: "空调", value: 1048},
{name: "通风柜", value: 735}
],
problemData: [],
rateData: [],
peopleXdata:[],
peopleNum:[],
peoplePercent:[]
}
},
computed: {
...mapGetters(["userInfo", "permission"]),
getStatus() {
return (type, id, status) => {
for (let i in statusData[type]) {
let val
statusData[type][id].map(item => {
if (item.status == status) {
val = item
}
})
return val
}
}
},
},
mounted() {
console.log('userInfo=============>',this.userInfo)
this.isShowMask = this.userInfo.detail.status == 1 ? false : true
this.role_id = this.userInfo.role_id
if (this.role_id == '1123598816738675200' || this.role_id == '1123598816738675201' || this.role_id == '1846419477876510721') {
// 实验室角色
nextTick(() => {
if(!this.isShowMask){
this.getOverview()
this.getWorkList()
this.getDeviceAlarmList()
this.getbackGroundPic()
this.getUpkeepStat()
this.getPieStat()
this.getRequirement()
this.alarmOption = {
"step": 0.2, // 数值越大速度滚动越快
"limitMoveNum": 3, // 开始无缝滚动的数据量 this.dataList.length
"hoverStop": true, // 是否开启鼠标悬停stop
"direction": 1, // 0向下 1向上 2向左 3向右
"openWatch": true, // 开启数据实时监控刷新dom
"singleHeight": 0, // 单步运动停止的高度(默认值0是无缝不停止的滚动) direction => 0/1
"singleWidth": 0, // 单步运动停止的宽度(默认值0是无缝不停止的滚动) direction => 2/3
"waitTime": 1000, // 单步运动停止的时间(默认值1000ms)
}
}else{
this.createBarEcharts()
this.createErrorEcharts()
this.createDeviceEcharts()
}
})
} else if (this.role_id == '1839536982874193922' || this.role_id == '1839537055389515777') {
nextTick(() => {
if(!this.isShowMask){
this.getlimsInspecList()
this.getOverviewList()
this.getlimsInspecChart()
this.getPeopleNum()
this.getFaultRatio()
// this.createProblemEcharts()
// this.createProbabilityEcharts()
this.calssOption = {
"step": 0.2, // 数值越大速度滚动越快
"limitMoveNum": 4, // 开始无缝滚动的数据量 this.dataList.length
"hoverStop": true, // 是否开启鼠标悬停stop
"direction": 1, // 0向下 1向上 2向左 3向右
"openWatch": true, // 开启数据实时监控刷新dom
"singleHeight": 0, // 单步运动停止的高度(默认值0是无缝不停止的滚动) direction => 0/1
"singleWidth": 0, // 单步运动停止的宽度(默认值0是无缝不停止的滚动) direction => 2/3
"waitTime": 1000, // 单步运动停止的时间(默认值1000ms)
}
}
})
}
},
methods: {
getPeopleNum(){
maintenancePersonnel({id:this.userInfo.user_id}).then(res =>{
console.log('res ==============>',res)
this.peopleXdata = res.data.data.xData
this.peopleNum = res.data.data.repairNum
this.peoplePercent = res.data.data.percent
this.$nextTick(() =>{
this.creatpeopleEcharts()
})
})
},
clickReqiure(item){
console.log('item----------->',item)
this.$router.push({
path:'/operation/hand',
query:item
})
},
getRequirement(){
getList({
current:1,
size:10,
dataType: 1,//数据权限
statusSearch: '201,401,402,301,403,202,104',//状态5报错
}).then(res =>{
this.requirementList = res.data.data.records
})
},
// 获取实验室角色下的背景图
getbackGroundPic() {
getUserInfo().then(res => {
this.backGroundPic = res.data.data.backGroundPic ? res.data.data.backGroundPic : require('@/assets/images/lab.png')
})
},
// 获取实验室下工作台相关信息
getOverview() {
overview().then(res => {
this.workList = res.data.data
this.isShowOther = this.workList.length == 3 ? true : false
})
},
// 获取实验室巡检列表
getWorkList() {
workList().then(res => {
this.inspectionList = res.data.data
})
},
// 获取实验室设备报警列表
getDeviceAlarmList() {
deviceList().then(res => {
this.alarmList = res.data.data
})
},
// 实验室下维修统计切换时间
changeStaticBarTime(val) {
this.getUpkeepStat()
},
// 获取实验室下维修统计接口
getUpkeepStat() {
let query = {
startTime: this.staticBarTime.length != 0 ? this.staticBarTime[0] + ' 00:00:00' : '',
endTime: this.staticBarTime.length != 0 ? this.staticBarTime[1] + ' 23:59:59' : ''
}
upkeepStat(query).then(res => {
this.barXdata = res.data.data.xData
this.totalBardata = res.data.data.total
this.completedBardata = res.data.data.completed
this.unCompletedBardata = res.data.data.unCompleted
nextTick(() => {
this.createBarEcharts()
})
})
},
// 实验室下饼图切换时间
changestaticPieTime(val) {
this.getPieStat()
},
// 获取实验室下饼图数据
getPieStat() {
let query = {
startTime: this.staticPieTime.length != 0 ? this.staticPieTime[0] + ' 00:00:00' : '',
endTime: this.staticPieTime.length != 0 ? this.staticPieTime[1] + ' 23:59:59' : ''
}
pieStat(query).then(res => {
this.errorData = res.data.data.fault
this.deviceData = res.data.data.device
nextTick(() => {
this.createErrorEcharts()
this.createDeviceEcharts()
})
})
},
// 获取客服/运维主管下的巡检列表
getlimsInspecList() {
limsInspecList({ perType: this.role_id == '1839536982874193922' ? 0 : 1 }).then(res => {
this.labXjList = res.data.data
})
},
// 获取客服/运维主管下的工作台
getOverviewList() {
overviewList({ perType: this.role_id == '1839536982874193922' ? 0 : 1 }).then(res => {
this.benchList = res.data.data
})
},
// 切换提报统计图表时间
changestaticTime(val) {
this.getlimsInspecChart()
},
// 获取客服、运维主管下的提报统计图表数据
getlimsInspecChart() {
let query = {
startTime: this.staticTime.length != 0 ? this.staticTime[0] + ' 00:00:00' : '',
endTime: this.staticTime.length != 0 ? this.staticTime[1] + ' 23:59:59' : '',
perType: this.role_id == '1839536982874193922' ? 0 : 1
}
limsInspecChart(query).then(res => {
this.xData = res.data.data.xData
this.numData = res.data.data.yData
nextTick(() => {
this.creatUnitEcharts()
})
})
},
// 切换故障统计时间
changeFaultTime(val) {
this.getFaultRatio()
},
// 获取客服/维修主管下的故障类占比
getFaultRatio() {
let query = {
startTime: this.faultTime.length != 0 ? this.faultTime[0] + ' 00:00:00' : '',
endTime: this.faultTime.length != 0 ? this.faultTime[1] + ' 23:59:59' : '', //时间范围
deviceType: '', //设备类型
deviceId: '', //设备id
brand: '', //品牌
perType: this.role_id == '1839536982874193922' ? 0 : 1 //人员类型 0-客服 1-维修负责人
}
faultRatio(query).then(res => {
console.log('res ===================>', res)
this.problemData = res.data.data.fault
this.rateData = res.data.data.rate
nextTick(() => {
this.createProblemEcharts()
this.createProbabilityEcharts()
})
})
},
// 点击工作台项目
ckickItem(item) {
if(this.isShowMask){
return
}else{
if (item.name == '报送记录') {
this.$router.push('/operation/hand')
}else if(item.name == '实验室巡检'){
this.$router.push("/labManagement/inspectionManagement")
}else if(item.name == '设备报警'){
this.$router.push({
path:'/device/deviceSystem',
query:{
type:'2'
}
})
}
}
},
createBarEcharts() {
var myChart = this.$echarts.init(document.getElementById('bar_echart'));
var option = {
tooltip: {
trigger: 'axis',
transitionDuration: 0,//防止页面抖动
},
legend: { //图例组件
data: ['总计', '已完成', '未完成']
},
xAxis: {
data: this.barXdata,
},
grid: {
top: '15%',
left: '5%',
right: '5%',
bottom: '10%'
},
yAxis: {},
series: [
{
name: '总计',
type: 'bar',
data: this.totalBardata,
itemStyle: {
// color: '#2478f2'
color:'#2148D1'
}
},
{
name: '已完成',
type: 'bar',
data: this.completedBardata,
itemStyle: {
// color: '#84b7f9'
color:'#5E8CFF'
}
},
{
name: '未完成',
type: 'bar',
data: this.unCompletedBardata,
itemStyle: {
// color: '#5f9cf8'
color:'#B0CCFF'
}
},
]
};
//4.使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
},
createErrorEcharts() {
var myChart = this.$echarts.init(document.getElementById('error_echarts'));
var option = {
tooltip: {
trigger: 'item',
transitionDuration: 0,//防止页面抖动
},
series: [
{
type: 'pie',
radius: '60%',
label: {
formatter: '{b}\n {c}',
color: '#000'
},
data: this.errorData,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
myChart.setOption(option);
},
createDeviceEcharts() {
var myChart = this.$echarts.init(document.getElementById('device_echarts'));
var option = {
tooltip: {
trigger: 'item',
transitionDuration: 0,//防止页面抖动
},
series: [
{
type: 'pie',
radius: '70%',
label: {
formatter: '{b}\n {c}',
color: '#000'
},
data: this.deviceData,
}
]
};
myChart.setOption(option);
},
creatUnitEcharts() {
var myChart = this.$echarts.init(document.getElementById('unitCharts'));
var option = {
tooltip: {
trigger: 'axis',
transitionDuration: 0,//防止页面抖动
},
legend: { //图例组件
data: ['数量'],
},
xAxis: {
data: this.xData,
},
grid: {
top: '22%',
left: '5%',
right: '5%',
bottom: '10%'
},
yAxis: {},
series: [
{
name: '数量',
type: 'bar',
barWidth:this.numData == 1 ? 50 : null,
data: this.numData,
itemStyle: {
color: '#2478f2'
},
label: {
show: true,
position: 'top',
color: '#2478f2',
},
},
]
};
//4.使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
},
creatpeopleEcharts() {
var myChart = this.$echarts.init(document.getElementById('peopleCharts'));
var option = {
tooltip: {
trigger: 'axis',
transitionDuration: 0,//防止页面抖动
formatter: params => {
console.log('params',params)
let rander = params.map(item => `<div>${item.marker}${item.seriesName}: ${item.seriesType !== "line" ? item.value : item.value != '' ? item.value + "%" : '-'}</div>` ).join('')
return `
<div>${params[0].axisValue}</div>
${rander}
`
}
},
legend: { //图例组件
data: ['维修数量','好评率'],
},
xAxis: {
type: 'category',
data: this.peopleXdata,
axisPointer: {
type: 'shadow'
}
},
grid: {
top: '22%',
left: '5%',
right: '5%',
bottom: '10%'
},
yAxis: [
{
type: 'value',
name: '维修数量',
},
{
type: 'value',
name: '好评率(%)',
min: 0,
max: 100
}
],
series: [
{
name: '维修数量',
type: 'bar',
barWidth:this.numData == 1 ? 50 : null,
data: this.peopleNum,
itemStyle: {
color: '#2478f2'
},
},
{
name: '好评率',
type: 'line',
yAxisIndex: 1,
data: this.peoplePercent,
itemStyle: {
color: '#2478f2'
},
},
]
};
//4.使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
},
createProblemEcharts() {
var myChart = this.$echarts.init(document.getElementById('problem_charts'));
var option = {
tooltip: {
trigger: 'item',
transitionDuration: 0,//防止页面抖动
},
legend: {
type: 'scroll',
orient: 'vertical',
left: 5,
top: 20,
bottom: 20,
},
grid: {
top: '30%',
left: '80%',
right: '2%'
},
series: [
{
type: 'pie',
radius: ['50%', '65%'],
label: {
show: true,
formatter: '{b}\n {c}',
color: '#000'
},
labelLine: {
show: true,
},
data: this.problemData,
}
]
};
//4.使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
},
createProbabilityEcharts() {
var myChart = this.$echarts.init(document.getElementById('probability_charts'));
var option = {
title: {
text: "故障率",
subtext: "50%",
left: "center",
top: "35%",
textStyle: {
fontSize: 16,
color: '#4f4f4f'
},
subtextStyle: {
fontSize: 20,
color: '#de4234'
}
},
tooltip: {
trigger: 'item',
transitionDuration: 0,//防止页面抖动
},
legend: {
type: 'scroll',
top: 0,
right:5,
orient: 'vertical',
},
series: [
{
type: 'pie',
radius: ['50%', '65%'],
label: {
show: true,
formatter: '{b}\n {c}',
color: '#000'
},
labelLine: {
show: true
},
data: this.rateData,
}
]
};
//4.使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
},
createMapBox() { },
}
}
</script>
<style lang="scss" scoped>
.container {
width: 99%;
height: 95%;
//background: #fff;
margin: 0 auto;
.mask{
width: 100%;
height: 100%;
position: absolute;
background: rgba(0, 0, 0, 0.7);
z-index: 2000;
display: flex;
justify-content: center;
font-size: 80px;
// color: #2478f2;
color: rgba(36,120, 242, 0.8);
line-height: 800px;
letter-spacing: 50px;
}
.top_box {
width: 100%;
height: 51%;
margin: 0 auto;
margin-top: 5px;
// padding: 20px;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
align-items: center;
justify-content: space-between;
.top_left {
width: 49.5%;
height: 100%;
}
.top_right {
width: 49%;
height: 100%;
.work_box {
width: 98%;
height: 30%;
// margin-left: 5%;
.work_tit {
font-weight: 550;
}
.work_con {
width: 100%;
height: 80%;
margin-top: 10px;
display: flex;
align-items: center;
justify-content: space-between;
.work_item {
width: 23%;
height:78px;
border-radius: 10px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
// flex-direction: column;
.item_top {
width: 100%;
height: 100%;
background: #3a62d791;
border-radius: 10px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
// flex-direction: column;
color: white;
font-size: 22px;
background: linear-gradient( 90deg, #375DF9 0%, #6DB5FF 100%);
box-shadow: 0px 5px 5px 0px #B6D8FF;
.right_item{
display: flex;
flex-direction: column;
margin-left: 20px;
}
// .item_num {
// // position: absolute;
// // top: 0;
// // right: 0;
// // padding: 3px;
// // background: red;
// font-size: 22px;
// height: 25px;
// }
.item_img {
width: 32px;
height: 32px;
margin-bottom: 10px;
img {
width: 100%;
height: 100%;
}
}
.item_name {
// width: 148px;
// margin-top: 10px;
// display: flex;
// align-items: center;
// -ms-flex-pack: center;
// justify-content: center;
font-size: 14px;
margin-bottom: 5px;
}
}
&:nth-child(2) .item_top{
background: linear-gradient( 270deg, #41D9A5 0%, #0BC478 100%);
box-shadow: 0px 10px 10px 0px #BDE7E2;
}
&:nth-child(3) .item_top{
background: linear-gradient( 90deg, #F36656 0%, #FF8043 100%);
box-shadow: 0px 10px 10px 0px #FED1D0;
}
&:nth-child(4) .item_top{
background: linear-gradient( 90deg, #F3AC56 0%, #FFCA68 100%);
box-shadow: 0px 10px 10px 0px #FEEED0;
}
}
}
}
.xj_box {
width: 98%;
height:30%;
margin-top: 20px;
.xj_tit {
font-weight: 550;
margin-bottom: 13px;
}
.xj_con {
width: 100%;
height: calc(89% - 20px);
display: flex;
align-items: flex-end;
justify-content: center;
.xj_con_box {
width: 100%;
height: 100%;
background: #fff;
border-radius: 10px;
overflow: hidden;
::v-deep .el-empty__image{
width: 45px !important;
}
::v-deep .el-empty__description{
margin-top: none !important;
}
::v-deep.el-carousel__container {
height: 100% !important;
}
::v-deep .el-carousel__indicators--vertical {
display: none !important;
}
.xj_item {
width: 96%;
margin: 10px auto;
background: #fff;
border-radius: 10px;
padding: 5px;
.xj_top {
display: flex;
width: 100%;
align-items: center;
justify-content: space-between;
.tit_box {
display: flex;
.xj_title {
font-weight: 550;
margin-right: 20px;
}
.xj_time {
font-size: 14px;
color: #6c6c6c;
}
}
.xj_task {
color: #3a62d7;
}
}
.xj_center {
margin: 5px 0;
color: #6c6c6c;
display: flex;
align-items: center;
justify-content: space-between;
}
.xj_bottom {
display: flex;
.xj_status {
color: #3a62d7;
margin-right: 20px;
}
}
}
}
}
}
}
}
.bottom_box {
width: 100%;
height: 46%;
margin-top: 1%;
display: flex;
align-items: center;
justify-content: space-between;
.bottom_left {
width: 25%;
height: 100%;
background: #FFFFFF;
border-radius: 10px;
border: 1px solid #EBEEF5;
.left_tit {
font-weight: 550;
margin-top: 15px;
margin-left: 15px;
}
.left_con {
width: 100%;
height: 88%;
// background: #efefef;
margin-top: 20px;
border-radius: 10px;
display: flex;
flex-direction: column;
// background: #FFFFFF;
// border-radius: 4px;
// border: 1px solid #EBEEF5;
.nodata{
// width: 100%;
// height: 100%;
// display: flex;
// align-items: center;
// justify-content: center;
// font-size: 25px;
// color: #a39797;
// letter-spacing: 10px;
::v-deep .el-empty__image{
width:120px;
}
}
.tablebox_item_warp {
height: 90%;
overflow: hidden;
.left_item {
width: 94%;
height: 128px;
background: #fff;
border: 1px solid #EBEEF5;
border-radius: 10px;
margin: 0 auto;
margin-bottom: 20px;
display: flex;
justify-content: space-between;
.item_left {
width: 30%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
.item_circle {
width: 80px;
height: 80px;
border-radius: 50%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
&.one {
border: 5px solid #bd3124;
}
&.two {
border: 5px solid #e99d42;
}
.status {
color: #101010;
margin-bottom: 5px;
}
.status_txt {
font-size: 12px;
color: #bebebe;
}
}
}
.item_right {
width: 69%;
height: 100%;
.item_con {
margin: 14px 10px 0;
display: flex;
flex-direction: column;
.item_top {
display: flex;
align-items: center;
justify-content: space-between;
.item_btn {
background: #3a62d729;
padding: 5px 10px;
color: #3a62d7;
font-size: 14px;
border-radius: 5px;
}
}
.item_bot {
line-height: 25px;
margin-top: 5px;
font-size: 14px;
color: #9a9a9a;
}
}
}
}
}
}
}
.bottom_right {
width: 74%;
height: 100%;
background: #FFFFFF;
border-radius: 10px;
border: 1px solid #EBEEF5;
.right_tit {
font-weight: 550;
margin-top: 15px;
margin-left: 15px;
}
.right_con {
width: 100%;
height: 88%;
// background: #efefef;
margin-top: 10px;
border-radius: 10px;
display: flex;
align-items: center;
// background: #FFFFFF;
// border-radius: 4px;
// border: 1px solid #EBEEF5;
.bar_box {
width: 49%;
height: 100%;
// background: #fff;
border-radius: 10px;
margin-left: 15px;
display: flex;
flex-direction: column;
// background: #FFFFFF;
// border-radius: 4px;
// border: 1px solid #EBEEF5;
.bar_top {
margin: 10px;
}
.bar_charts {
width: 96%;
height: 80%;
margin-left: 10px;
}
}
.pie_box {
width: 49%;
height: 100%;
margin-left: 2%;
border-radius: 10px;
// background: #FFFFFF;
// border-radius: 4px;
// border: 1px solid #EBEEF5;
.pie_top {
margin: 10px;
}
.pie_charts {
width: 96%;
height: 80%;
margin-left: 10px;
display: flex;
justify-content: space-between;
.pie_chart {
width: 49%;
height: 100%;
.charts_box {
width: 100%;
height: 80%;
}
.charts_tit {
width: 100%;
height: 15%;
display: flex;
align-items: center;
justify-content: center;
}
}
}
}
}
}
}
.left_box {
width: 35%;
height: 100%;
float: left;
.map_box {
width: 100%;
height: 69%;
}
.bench_box {
width: 100%;
height: 30%;
margin-top: 1%;
display: flex;
flex-direction: column;
align-items: center;
.bench_tit {
width: 100%;
display: flex;
margin: 20px 0 20px;
.bench_num {
padding: 5px;
width: 15px;
height: 15px;
border-radius: 5px;
text-align: center;
line-height: 15px;
margin-left: 10px;
background: rgb(253, 209, 67);
box-shadow: rgba(0, 0, 0, 0.2) 0px 2px 4px 0px;
}
}
.bench_con {
width: 100%;
height: 73%;
display: flex;
align-items: center;
justify-content: space-between;
.bench_item {
width: 25%;
height: 100%;
border-radius: 10px;
background: #fff;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
}
}
}
.right_box {
width: 64%;
height: 100%;
float: left;
margin-left: 1%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
.right_top {
width: 100%;
height: 25%;
display: flex;
flex-direction: column;
.top_tit {
font-size: 20px;
font-weight: 550;
width: 95%;
margin-bottom: 10px;
}
.top_con {
width: 100%;
height: 80%;
margin: 0 auto;
display: flex;
align-items: center;
justify-content: center;
border-radius: 10px;
.top_container {
width: 100%;
height: 100%;
background: #fff;
border-radius: 10px;
.tablebox_item_warp {
height: 90%;
margin-top: 15px;
overflow: hidden;
.top_item {
display: flex;
justify-content: space-between;
margin: 10px 20px;
&:first-child {
margin-top: 0;
}
.item_left {
color: #101010;
}
.item_right {
color: #6c6c6c;
}
}
}
}
}
}
.right_bottom {
width: 100%;
height: 75%;
display: flex;
flex-direction: column;
.bottom_tit {
font-size: 20px;
font-weight: 550;
margin: 20px auto;
width: 100%;
}
.bottom_con {
width: 100%;
height: 88%;
border-radius: 10px;
margin: 0 auto;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
.static_box {
width: 100%;
height: 48%;
border-radius: 10px;
background: #fff;
display: flex;
flex-direction: column;
.static_top {
width: 96%;
display: flex;
align-items: center;
//justify-content: space-between;
margin: 0 auto;
margin-top: 10px;
::v-deep .el-select {
width: 120px !important;
margin: 0 5px;
}
::v-deep.el-date-editor--daterange {
width: 240px !important;
}
}
.static_chart {
width: 96%;
height: 74%;
margin: 0 auto;
}
.static_bot_chart {
width: 96%;
height: 74%;
margin: 0 auto;
display: flex;
justify-content: space-between;
.problem_box {
width: 60%;
height: 100%;
}
.probability_box {
width: 39%;
height: 100%;
}
}
}
}
}
}
}
</style>