<template>
|
<div class="efficiency_list" style="width: 100%;height: 100%;">
|
<div :bordered="false" style="height: 100%">
|
<!-- 查询区域 -->
|
<div class="table-page-search-wrapper">
|
<a-form layout="inline" @keyup.enter.native="searchQuery">
|
<a-row :gutter="24">
|
<a-col :md="6" :sm="6">
|
<a-form-item label="设备类型">
|
<a-select
|
:value="queryParams.equipmentType"
|
mode="multiple"
|
placeholder="请选择设备类型"
|
allow-clear
|
:maxTagCount="1"
|
@change="selectChange($event,'equipmentType')"
|
>
|
<a-select-option v-for="(item,index) in equipmentTypeList" :value="item.value" :key="index">
|
{{ item.label }}
|
</a-select-option>
|
</a-select>
|
</a-form-item>
|
</a-col>
|
|
<a-col :md="6" :sm="6">
|
<a-form-item label="驱动类型">
|
<a-select
|
:value="queryParams.driveType"
|
mode="multiple"
|
placeholder="请选择驱动类型"
|
allow-clear
|
:maxTagCount="1"
|
@change="selectChange($event,'driveType')"
|
>
|
<a-select-option v-for="(item,index) in driveTypeList" :value="item.value" :key="index">
|
{{ item.label }}
|
</a-select-option>
|
</a-select>
|
</a-form-item>
|
</a-col>
|
|
<a-col :md="6" :sm="6">
|
<a-form-item label="时间">
|
<a-range-picker @change="dateParamChange" :disabledDate="disabledDate" format="YYYYMMDD"
|
v-model="dates" :allowClear="false"/>
|
</a-form-item>
|
</a-col>
|
|
<a-col :md="3" :sm="3" :xs="3">
|
<a-space>
|
<a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
|
<a-button type="primary" @click="searchReset" icon="reload">重置</a-button>
|
</a-space>
|
</a-col>
|
|
<a-col :md="2" :sm="2">
|
<a
|
@click="toggleSearchStatus=!toggleSearchStatus"
|
@selectstart="$event.preventDefault()"
|
style="display: inline-block;height: 32px;line-height: 32px"
|
>
|
{{ toggleSearchStatus ? '收起' : '展开' }}
|
<a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
|
</a>
|
</a-col>
|
</a-row>
|
|
<a-row :gutter="24" v-if="toggleSearchStatus">
|
<a-col :md="6" :sm="6" :xs="6">
|
<a-form-item label="设备级别">
|
<a-select
|
:value="queryParams.deviceLevel"
|
mode="multiple"
|
placeholder="请选择设备级别"
|
allow-clear
|
:maxTagCount="1"
|
@change="selectChange($event,'deviceLevel')"
|
>
|
<a-select-option v-for="(item,index) in device_level_list" :value="item.value" :key="index">
|
{{ item.label }}
|
</a-select-option>
|
</a-select>
|
</a-form-item>
|
</a-col>
|
|
<a-col :md="5" :sm="5" :xs="5">
|
<a-form-item label="重要程度">
|
<a-select
|
v-model="queryParam.deviceImportanceLevel"
|
placeholder="请选择设备重要程度"
|
allow-clear
|
>
|
<a-select-option v-for="(item,index) in device_importance_level_list" :value="item.value"
|
:key="index">
|
{{ item.label }}
|
</a-select-option>
|
</a-select>
|
</a-form-item>
|
</a-col>
|
</a-row>
|
</a-form>
|
</div>
|
|
<div id="DeviceList">
|
<div class="openRateTrendDg">
|
<a-table :columns="columns" :data-source="dataList" bordered :pagination="false" :scroll="{y:210}"
|
:customRow="customRow"
|
rowKey="alarmCode" @expand="handleExpandChange" :loading="outerDataLoading"
|
>
|
<span slot="timeCount" slot-scope="text">{{text | getFormattedTime}}</span>
|
<a-table
|
slot="expandedRowRender"
|
slot-scope="row"
|
:columns="innerColumns"
|
:data-source="row.innerDataList"
|
:pagination="false"
|
rowKey="rowIndex"
|
:loading="innerDataLoading"
|
>
|
<span slot="duration" slot-scope="text">{{text | getFormattedTime}}</span>
|
</a-table>
|
</a-table>
|
</div>
|
|
<a-spin :spinning="echartLoading">
|
<div style="width: 100%;height: 100%;display: flex;">
|
<div id="MdcEquipmentWarningPie" style="height: 100%;width: 35%;"></div>
|
<div id="MdcEquipmentWarningLine" style="height: 100%;width: 65%;"></div>
|
</div>
|
</a-spin>
|
</div>
|
</div>
|
</div>
|
</template>
|
|
<script>
|
import moment from 'moment'
|
import { getAction } from '@/api/manage'
|
import $ from 'jquery'
|
import '@/components/table2excel/table2excel'
|
import { ajaxGetDictItems, getDictItemsFromCache } from '@/api/api'
|
import api from '@api/mdc'
|
|
const columns = [
|
{ title: '报警号', dataIndex: 'alarmCode', key: 'alarmCode', align: 'center' },
|
{ title: '出现次数', dataIndex: 'count', key: 'count', align: 'center', sorter: (a, b) => b.count - a.count },
|
{
|
title: '合计持续时间',
|
dataIndex: 'timeCount',
|
key: 'timeCount',
|
scopedSlots: { customRender: 'timeCount' },
|
align: 'center',
|
sorter: (a, b) => b.timeCount - a.timeCount
|
},
|
{ title: '报警信息', dataIndex: 'alarmContent', key: 'alarmContent', align: 'center', ellipsis: true }
|
]
|
|
const innerColumns = [
|
{
|
title: '',
|
dataIndex: 'rowIndex',
|
key: 'rowIndex',
|
width: 60,
|
align: 'center',
|
customRender: function(t, r, index) {
|
return parseInt(index) + 1
|
}
|
},
|
{ title: '设备编号', dataIndex: 'equipmentId', key: 'equipmentId', align: 'center' },
|
{ title: '设备名称', dataIndex: 'equipmentName', key: 'equipmentName', align: 'center' },
|
{ title: '报警时间', dataIndex: 'startTime', key: 'startTime', align: 'center' },
|
{ title: '结束时间', dataIndex: 'endTime', key: 'endTime', align: 'center' },
|
{
|
title: '持续时间',
|
dataIndex: 'duration',
|
key: 'duration',
|
scopedSlots: { customRender: 'duration' },
|
align: 'center'
|
}
|
]
|
|
export default {
|
name: 'alarmAnalysisMain',
|
components: {},
|
data() {
|
return {
|
dataSource: [],
|
/* table加载状态 */
|
outerDataLoading: false,
|
innerDataLoading: false,
|
echartLoading: false,
|
typeTree: '',
|
typeParent: 1,
|
typeEquipment: 1,
|
TreeIDOne: 1,
|
TreeIDTwo: 2,
|
deviceTypeDict: '',
|
dates: [],
|
equipmentTypeList: [],
|
driveTypeList: [],
|
device_level_list: [],
|
device_importance_level_list: [],
|
identifying: [],
|
queryParam: {},
|
queryParams: {
|
equipmentType: [],
|
driveType: [],
|
deviceLevel: []
|
},
|
queryParamEquip: {},
|
queryParamPeople: {},
|
efficiencyOptions: [
|
{ label: '利用率', value: 'lyl' },
|
{ label: '开机率', value: 'kjl' },
|
{ label: '开机时间', value: 'kjsj' },
|
{ label: '加工时间', value: 'jgsj' },
|
{ label: '待机时间', value: 'djsj' },
|
{ label: '关机时间', value: 'gjsj' }
|
],
|
checkedList: ['lyl'],
|
dataList: [],
|
url: {
|
efficiencyList: '/mdc/alarmAnalyze/alarmList',
|
listByType: '/mdc/MdcUtilizationRate/getByType',
|
alarmTrend: '/mdc/alarmAnalyze/alarmTrend',
|
equipmentAlarmList: '/mdc/alarmAnalyze/equipmentAlarmList',
|
queryEquipmentType: '/mdc/mdcEquipmentType/queryEquipmentType'
|
},
|
tableHeads: [],
|
pieDate: [0],
|
XData: [0],
|
YData: [0],
|
columns,
|
innerColumns,
|
hasRequestAlarmCodeList: [],
|
toggleSearchStatus: false
|
}
|
},
|
props: { nodeTree: '', Type: '', nodePeople: '' },
|
/**
|
* 生命周期 挂载前
|
* */
|
created() {
|
this.searchReset()
|
this.queryGroup()
|
this.getDriveTypeByApi()
|
this.initDictData('device_level')
|
this.initDictData('device_importance_level')
|
},
|
mounted() {
|
this.drawWrin()
|
window.addEventListener('resize', this.handleWindowResize)
|
},
|
beforeDestroy() {
|
window.removeEventListener('resize', this.handleWindowResize)
|
},
|
watch: {
|
Type(valmath) {
|
this.dataList = []
|
this.queryParam.typeTree = valmath
|
},
|
nodeTree(val) { //监听currSelected 变化,将变化后的数值传递给 getCurrSelected 事件
|
if (JSON.stringify(val) != '{}') {
|
if (val.equipmentId != null) {
|
this.queryParamEquip.parentId = ''
|
this.queryParamEquip.equipmentId = val.equipmentId
|
} else {
|
this.queryParamEquip.parentId = val.key
|
this.queryParamEquip.equipmentId = ''
|
}
|
/*这里你是监听到树得变化 是不是请求一次*/
|
this.searchQuery()
|
}
|
},
|
nodePeople(val) {
|
if (JSON.stringify(val) != '{}') {
|
if (val.equipmentId != null) {
|
this.queryParamPeople.parentId = val.equipmentId
|
this.queryParamPeople.equipmentId = ''
|
} else {
|
this.queryParamPeople.parentId = val.key
|
this.queryParamPeople.equipmentId = ''
|
}
|
this.searchQuery()
|
}
|
}
|
},
|
filters: {
|
numFilter(value) {
|
if (value) {
|
return parseFloat((value * 100).toFixed(2))
|
} else {
|
return '0'
|
}
|
},
|
|
/**
|
* 格式化时间
|
* @param seconds 秒数
|
* @returns '' 格式化后时间字符串
|
*/
|
getFormattedTime(seconds) {
|
var hours = Math.floor(seconds / 3600)
|
var minutes = Math.floor((seconds % 3600) / 60)
|
var secs = seconds % 60
|
|
if (hours === 0) {
|
if (minutes === 0) {
|
return secs === 0 ? 0 : `${secs}秒`
|
} else {
|
if (secs === 0) {
|
return `${minutes}分`
|
}
|
return `${minutes}分 ${secs}秒`
|
}
|
} else {
|
if (minutes === 0 && secs === 0) {
|
return `${hours}小时`
|
} else if (minutes !== 0 && secs === 0) {
|
return `${hours}小时 ${minutes}分`
|
}
|
}
|
return `${hours}小时 ${minutes}分 ${secs}秒`
|
}
|
},
|
methods: {
|
queryGroup() {
|
getAction(this.url.queryEquipmentType).then(res => {
|
if (res.success) {
|
this.equipmentTypeList = res.result.map(item => {
|
return {
|
label: item.equipmentTypeName,
|
value: item.equipmentTypeName
|
}
|
})
|
} else {
|
this.$notification.warning({
|
message: '消息',
|
description: res.message
|
})
|
}
|
})
|
},
|
|
// 调用接口获取控制系统类型
|
getDriveTypeByApi() {
|
api.getDriveTypeApi().then((res) => {
|
if (res.success) this.driveTypeList = res.result
|
})
|
},
|
|
initDictData(dictCode) {
|
// //优先从缓存中读取字典配置
|
if (getDictItemsFromCache(dictCode)) {
|
this[dictCode + '_list'] = getDictItemsFromCache(dictCode)
|
return
|
}
|
//根据字典Code, 初始化字典数组
|
ajaxGetDictItems(dictCode, null).then((res) => {
|
if (res.success) {
|
this[dictCode + '_list'] = res.result
|
return
|
}
|
})
|
},
|
|
numBerTwo(value) {
|
if (value) {
|
return parseFloat((value * 100).toFixed(2))
|
} else {
|
return '0'
|
}
|
},
|
|
TableDraw(key, val) {
|
let that = this
|
that.echartLoading = true
|
that.queryParam.alarmCode = val.alarmCode
|
console.log(this.queryParam)
|
getAction(that.url.alarmTrend, that.queryParam)
|
.then(res => {
|
if (res.success) {
|
that.pieDate = res.result.equipmentCountList.map(item => {
|
return {
|
name: item.key,
|
value: item.count
|
}
|
})
|
that.XData = res.result.dateCountList.map(item => item.key)
|
that.YData = res.result.dateCountList.map(item => item.count)
|
that.drawWrin()
|
}
|
})
|
.finally(() => {
|
that.echartLoading = false
|
})
|
console.log(this.YData)
|
|
},
|
disabledDate(current) {
|
//Can not slect days before today and today
|
return current && current > moment().subtract('days', 1)
|
},
|
|
dateParamChange(v1, v2) {
|
this.queryParam.startDate = v2[0]
|
this.queryParam.endDate = v2[1]
|
},
|
|
searchQuery() {
|
if (this.queryParam.typeTree == '1') {
|
this.queryParam.parentId = this.queryParamEquip.parentId
|
this.queryParam.equipmentId = this.queryParamEquip.equipmentId
|
} else {
|
this.queryParam.parentId = this.queryParamPeople.parentId
|
this.queryParam.equipmentId = ''
|
}
|
|
Object.keys(this.queryParams).forEach(item => {
|
if (Array.isArray(this.queryParams[item])) {
|
if (this.queryParams[item].length !== 0) this.queryParam[item] = this.queryParams[item].join()
|
else delete this.queryParam[item]
|
}
|
})
|
this.loadData()
|
},
|
|
searchReset() {
|
this.queryParams = {
|
equipmentType: [],
|
driveType: [],
|
deviceLevel: []
|
}
|
this.queryParam = {}
|
this.dates = [moment().subtract('days', 8), moment().subtract('days', 1)]
|
this.queryParam.startDate = moment(this.dates[0]).format('YYYYMMDD')
|
this.queryParam.endDate = moment(this.dates[1]).format('YYYYMMDD')
|
this.queryParam.typeTree = '1'
|
this.loadData()
|
},
|
|
loadData() {
|
this.outerDataLoading = true
|
this.tableHeads = []
|
this.dataList = []
|
getAction(this.url.efficiencyList, this.queryParam).then(res => {
|
if (res.success) {
|
this.dataList = res.result
|
this.hasRequestAlarmCodeList = []
|
}
|
}).finally(() => {
|
this.outerDataLoading = false
|
})
|
},
|
|
drawWrin() {
|
this.equipmentWarningPie = this.$echarts.init(document.getElementById('MdcEquipmentWarningPie'), 'macarons')
|
let equipmentWarningPieOption = {
|
title: {
|
text: '各设备出现此报警的比例',
|
x: 'center',
|
y: 'bottom',
|
textStyle: {
|
color: '#4FAEDC'
|
}
|
},
|
tooltip: {
|
trigger: 'item',
|
formatter: '<br/>{b} : {c} ({d}%)'
|
},
|
calculable: true,
|
series: [{
|
type: 'pie',
|
radius: '60%',
|
itemStyle: {
|
normal: {
|
color: function(params) {
|
var colorList = ['#5AB1EF', '#2EC7C9', '#B6A2DE', '#FFB980', '#D87A80', '#8D98B3']
|
return colorList[params.dataIndex]
|
},
|
label: {
|
show: true,
|
// position: 'top',
|
formatter: '{b}\n{c}',
|
color: function(params) {
|
var colorList = ['#5AB1EF', '#2EC7C9', '#B6A2DE', '#FFB980', '#D87A80', '#8D98B3']
|
return colorList[params.dataIndex]
|
}
|
}
|
}
|
},
|
data: this.pieDate
|
// data:[{name:'jjjjjjj',value:'2'}]
|
}]
|
}
|
this.equipmentWarningPie.setOption(equipmentWarningPieOption, true)
|
this.equipmentWarningLine = this.$echarts.init(document.getElementById('MdcEquipmentWarningLine'), 'macarons')
|
let equipmentWarningLineOption = {
|
title: {
|
text: '每天出现此报警的数量走势',
|
x: 'center',
|
y: 'bottom',
|
textStyle: {
|
color: '#4FAEDC'
|
}
|
},
|
tooltip: {
|
trigger: 'axis'
|
},
|
calculable: true,
|
xAxis: [
|
{
|
type: 'category',
|
show: true,
|
data: this.XData
|
/*axisLabel :{
|
interval:0
|
}*/,
|
axisLine: {
|
//x轴线的颜色以及宽度
|
show: true,
|
lineStyle: {
|
width: 2,
|
color: '#4FAEDC'
|
}
|
}
|
}
|
],
|
yAxis: [
|
{
|
type: 'value',
|
name: '次数',
|
axisLine: {
|
//x轴线的颜色以及宽度
|
show: true,
|
lineStyle: {
|
width: 2,
|
color: '#4FAEDC'
|
}
|
}
|
}
|
],
|
series: [
|
{
|
name: '报警数量',
|
type: 'line',
|
data: this.YData,
|
markPoint: {
|
data: [
|
{ type: 'max', name: '最大值' },
|
{ type: 'min', name: '最小值' }
|
],
|
label: {
|
color: '#fff'
|
}
|
},
|
itemStyle: {
|
normal: {
|
color: '#2EC7C9'
|
}
|
}
|
}
|
]
|
}
|
this.equipmentWarningLine.setOption(equipmentWarningLineOption, true)
|
},
|
|
/**
|
* 自定义表格行触发
|
* @param record 当前行信息
|
* @param index 当前行下标
|
* @returns {{on: {click: on.click}}} 返回对象
|
*/
|
customRow(record, index) {
|
return {
|
on: {
|
click: (event) => {
|
// 如果点击的不是展开图标区域则渲染图表,相反则相当于点击展开图标
|
if (event.target.className !== 'ant-table-row-expand-icon-cell') {
|
this.TableDraw(index, record)
|
} else {
|
if (event.target.children && event.target.children.length > 0) event.target.children[0].click()
|
}
|
}
|
}
|
}
|
},
|
|
/**
|
* 自定义表格行触发
|
* @param expanded 当前行是否为展开状态
|
* @param record 当前行信息
|
*/
|
handleExpandChange(expanded, record) {
|
let _this = this
|
// 当展开时若该行未被展开过才会请求后台数据,展开过的数据会被缓存无需重复请求
|
this.queryParam.alarmCode = record.alarmCode
|
if (expanded && !this.hasRequestAlarmCodeList.includes(record.alarmCode)) {
|
this.innerDataLoading = true
|
getAction(this.url.equipmentAlarmList, this.queryParam).then(res => {
|
if (res.success) {
|
_this.dataList.forEach(item => {
|
if (item.alarmCode === record.alarmCode) {
|
item.innerDataList = res.result
|
}
|
})
|
_this.hasRequestAlarmCodeList.push(record.alarmCode)
|
}
|
})
|
.finally(() => {
|
_this.innerDataLoading = false
|
})
|
}
|
},
|
|
selectChange(value, key) {
|
this.queryParams[key] = value
|
},
|
|
/**
|
* 当浏览器可视窗口尺寸发生改变时触发
|
*/
|
handleWindowResize() {
|
if (this.equipmentWarningPie) this.equipmentWarningPie.resize()
|
if (this.equipmentWarningLine) this.equipmentWarningLine.resize()
|
}
|
}
|
}
|
</script>
|
<style scoped>
|
.efficiency_list #DeviceList {
|
height: 90% !important;
|
}
|
|
/deep/ .ant-table-body .ant-table-row td {
|
padding-top: 10px;
|
padding-bottom: 10px;
|
}
|
|
/deep/ .ant-table-scroll > .ant-table-body > table > .ant-table-tbody > .ant-table-row td {
|
cursor: pointer;
|
}
|
|
/deep/ .ant-spin-nested-loading {
|
height: 55%;
|
}
|
|
/deep/ .ant-spin-container {
|
height: 100%;
|
}
|
|
/deep/ .ant-table.ant-table-bordered {
|
height: 265px;
|
}
|
|
/deep/ .ant-table-scroll > .ant-table-placeholder {
|
height: 210px;
|
}
|
</style>
|