<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="7" :sm="7">
|
<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="17" :sm="17" :xs="17">
|
<a-form-item label="时间段">
|
<a-space>
|
<a-time-picker :default-value="moment('00:00', 'HH:mm')" format="HH:mm" @change="onChangeStart" :allowClear="false"/>
|
至
|
<a-time-picker :default-value="moment('23:59', 'HH:mm')" format="HH:mm" @change="onChangeEnd" :allowClear="false"/>
|
<a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
|
<a-button type="primary" @click="exportExcel" icon="download">导出</a-button>
|
</a-space>
|
</a-form-item>
|
</a-col>
|
</a-row>
|
</a-form>
|
</div>
|
<div id="DeviceList">
|
<a-spin :spinning="loading">
|
<div id="Efficiency" class="container" style="margin-bottom: 15px;">
|
<div class="table2">
|
<table class="dataContent table" border="1" cellspacing="0" cellpadding="0">
|
<thead>
|
<tr class="thead fixed equipname">
|
<th class="thgu dong1 name" style="min-width: 150px; max-width: 150px;width: 150px;">
|
设备编号
|
</th>
|
<th class="thgu dong2 name" style="min-width: 162px; max-width: 162px;width: 162px;">
|
设备名称
|
</th>
|
<th class="thgu dong3 name" style="min-width: 100px; max-width: 100px;width: 100px;">
|
设备类型
|
</th>
|
<template v-for="(tableHead, index) in tableHeads">
|
<th class="timeth">{{tableHead}}</th>
|
</template>
|
</tr>
|
</thead>
|
<tbody>
|
<tr class="mathData" v-for="(item, index) in dataList" @click="TableDraw(index,item)">
|
<td class="tdgu kaitou">{{item.equipmentId}}</td>
|
<td class="tdgu1 kaitou">{{item.equipmentName}}</td>
|
<td class="tdgu2 kaitou">{{item.equipmentType}}</td>
|
<template v-for="(tableHead, index) in item.dataList">
|
<td :style="{background:tableHead.color }">{{tableHead.utilizationRate | numFilter}}</td>
|
</template>
|
</tr>
|
</tbody>
|
</table>
|
</div>
|
</div>
|
</a-spin>
|
|
<div id="openRateTrendChart"></div>
|
</div>
|
</div>
|
</div>
|
</template>
|
|
<script>
|
import moment from 'moment'
|
import { putAction, getAction } from '@/api/manage'
|
import $ from 'jquery'
|
import '@/components/table2excel/table2excel'
|
import { ajaxGetDictItems, getDictItemsFromCache, duplicateCheck } from '@/api/api'
|
import {
|
JeecgListMixin
|
} from '@/mixins/JeecgListMixin'
|
|
export default {
|
// mixins: [JeecgListMixin],
|
name: 'openRateFractionAnalysisMain',
|
data() {
|
return {
|
dataSource: [],
|
/* table加载状态 */
|
loading: false,
|
typeTree: '',
|
typeParent: 1,
|
typeEquipment: 1,
|
TreeIDOne: 1,
|
TreeIDTwo: 2,
|
deviceTypeDict: '',
|
dates: [],
|
identifying: [],
|
queryParam: {},
|
queryParams: {},
|
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/efficiencyReport/utilizationRateSectionAnalyze',
|
listByType: '/mdc/MdcUtilizationRate/getByType'
|
},
|
tableHeads: [],
|
XData: [0],
|
YData: [0],
|
isLazyRequest: '',// 是否开启懒加载
|
requestAllDataSize: 8,// 总共请求的列表项数目
|
everyRequestDataSize: 15// 每次请求的列表项数目
|
}
|
},
|
props: { nodeTree: '', Type: '', nodePeople: '' },
|
/**
|
* 生命周期 挂载前
|
* */
|
created() {
|
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.startTime = '00:00'
|
this.queryParam.endTime = '23:59'
|
this.queryParam.typeTree = '1'
|
this.loadData1()
|
|
},
|
mounted() {
|
this.tableScroll = document.querySelector('.table2')
|
window.addEventListener('resize',this.handleWindowResize)
|
},
|
beforeDestroy() {
|
this.tableScroll.removeEventListener('scroll', this.tableScrollX)
|
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'
|
}
|
}
|
},
|
methods: {
|
moment,
|
exportExcel() {
|
$('#Efficiency').table2excel({
|
exclude: '.noExl',
|
name: 'Excel Document Name',
|
filename: '利用率分段分析',
|
exclude_img: true,
|
fileext: '.xls',
|
exclude_links: true,
|
exclude_inputs: true
|
})
|
},
|
onChangeStart(time, timeString) {
|
this.queryParam.startTime = timeString
|
// console.log(time, timeString);
|
},
|
onChangeEnd(time, timeString) {
|
this.queryParam.endTime = timeString
|
// console.log(time, timeString);
|
},
|
numBerTwo(value) {
|
if (value) {
|
return parseFloat((value * 100).toFixed(2))
|
} else {
|
return '0'
|
}
|
},
|
TableDraw(key, val) {
|
this.XData = [0]
|
this.YData[0]
|
var Xarr = []
|
var Yarr = []
|
for (var i = 0; i < val.dataList.length; i++) {
|
Xarr.push(val.dataList[i].theDate)
|
Yarr.push(this.numBerTwo(val.dataList[i].utilizationRate))
|
}
|
this.XData = Xarr
|
this.YData = Yarr
|
// if(this.openRateTrendAnalysisChart !=null && this.openRateTrendAnalysisChart != '' && this.openRateTrendAnalysisChart != undefined){
|
// this.openRateTrendAnalysisChart.dispose()
|
// }
|
|
this.draw()
|
},
|
//Can not slect days before today and today
|
disabledDate(current) {
|
return current && current > moment().subtract('days', 1)
|
},
|
dateParamChange(v1, v2) {
|
this.queryParam.startDate = v2[0]
|
this.queryParam.endDate = v2[1]
|
this.dates = [v1[0], v1[1]]
|
},
|
searchQuery() {
|
// 因触底刷新会修改参数时间值,故在此用时间选择器的时间值对参数时间值再次赋值,若不这样做则参数时间值则会与时间选择器上的时间值不一致
|
this.queryParam.startDate = moment(this.dates[0]).format('YYYYMMDD')
|
this.queryParam.endDate = moment(this.dates[1]).format('YYYYMMDD')
|
|
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 = ''
|
}
|
this.requestAllDataSize = moment.duration(moment(this.queryParam.endDate) - moment(this.queryParam.startDate), 'millisecond').asDays() + 1
|
this.loadData1()
|
},
|
loadData1() {
|
this.loading = true
|
this.tableHeads = []
|
this.dataList = []
|
// 若日期选择器设置的查询请求数量超过15条则开启懒加载
|
if (this.requestAllDataSize > 15) {
|
// 开启懒加载后将结束日期设置为开始日期之后的14天,即先查询15天内的数据
|
this.queryParam.endDate = moment(this.queryParam.startDate).add(this.everyRequestDataSize - 1, 'days').format('YYYYMMDD')
|
this.isLazyRequest = true
|
this.tableScroll.removeEventListener('scroll', this.tableScrollX) // 为避免滚动条有滚动距离后后点击查询按钮触发滚动事件,因此在触发事件前移除事件
|
}
|
getAction(this.url.efficiencyList, this.queryParam).then(res => {
|
if (res.success) {
|
this.tableHeads = res.result.dates
|
this.dataList = res.result.mdcEfficiencyList
|
this.draw()
|
// this.checkSameData(this.dataList)
|
// this.checkSameData1(this.dataList)
|
// this.checkSameData2(this.dataList)
|
// this.combineCell();
|
// this.initDeviceType(this.dataList)
|
this.tableScroll.addEventListener('scroll', this.tableScrollX)
|
}
|
}).finally(() => {
|
this.loading = false
|
})
|
},
|
draw() {
|
this.openRateTrendAnalysisChart = this.$echarts.init(document.getElementById('openRateTrendChart'), 'macarons')
|
let openRateTrendChartOptions = {
|
title: {
|
text: '利用率分段分析',
|
x: 'center',
|
textStyle: {
|
fontSize: 18,
|
fontWeight: 'bolder',
|
color: '#151414'
|
}
|
},
|
tooltip: {
|
trigger: 'axis'
|
},
|
toolbox: {
|
show: true,
|
feature: {
|
mark: { show: true },
|
dataView: { show: true, readOnly: false },
|
magicType: { show: true, type: ['line', 'bar'] },
|
restore: { show: true },
|
saveAsImage: { show: true }
|
}
|
},
|
calculable: true,
|
xAxis: [
|
{
|
type: 'category',
|
data: this.XData
|
}
|
],
|
yAxis: [
|
{
|
type: 'value'
|
}
|
],
|
series: [
|
{
|
name: '利用率',
|
type: 'line',
|
data: this.YData,
|
markPoint: {
|
data: [
|
{ type: 'max', name: '最大值', symbolSize: 70 },
|
{ type: 'min', name: '最小值', symbolSize: 70 }
|
]
|
},
|
markLine: {
|
data: [
|
{ type: 'average', name: '平均值' }
|
]
|
}
|
}
|
]
|
}
|
this.openRateTrendAnalysisChart.setOption(openRateTrendChartOptions, true)
|
},
|
|
/**
|
* 滚动条触底刷新表格数据
|
*/
|
tableScrollX() {
|
// 当滚动条触底且懒加载开启时触发滚动条触底刷新
|
if (Math.ceil(this.tableScroll.scrollLeft + this.tableScroll.clientWidth) + 1 >= this.tableScroll.scrollWidth && this.isLazyRequest) {
|
this.loading = true
|
this.queryParam.startDate = moment(this.queryParam.endDate).add(1, 'days').format('YYYYMMDD')
|
// 判断设置懒加载后的结束时间是否超过时间选择器中设置的结束时间
|
if (moment(this.queryParam.endDate).add(this.everyRequestDataSize - 1, 'days').format('YYYYMMDD') - moment(this.dates[1]).format('YYYYMMDD') < 0) {
|
//再次查询后15天内的数据
|
this.queryParam.endDate = moment(this.queryParam.endDate).add(this.everyRequestDataSize, 'days').format('YYYYMMDD')
|
} else {
|
// 如果不小于时间选择器中设置的时间则设置请求结束日期为时间选择器中设置的结束时间并且关闭懒加载(意味着最后一次触底刷新)
|
this.queryParam.endDate = moment(this.dates[1]).format('YYYYMMDD')
|
this.isLazyRequest = false
|
}
|
getAction(this.url.efficiencyList, this.queryParam).then(res => {
|
if (res.success) {
|
this.tableHeads = [...this.tableHeads, ...res.result.dates]
|
this.dataList.forEach(item1 => {
|
res.result.mdcEfficiencyList.forEach(item2 => {
|
if (item1.equipmentId === item2.equipmentId) {
|
item1.dataList = [...item1.dataList, ...item2.dataList]
|
}
|
})
|
})
|
this.draw()
|
}
|
}).finally(() => {
|
this.loading = false
|
})
|
}
|
},
|
|
/**
|
* 当浏览器可视窗口尺寸发生改变时触发
|
*/
|
handleWindowResize(){
|
if(this.openRateTrendAnalysisChart) this.openRateTrendAnalysisChart.resize()
|
}
|
}
|
}
|
</script>
|
<style scoped>
|
.dataContent {
|
white-space: nowrap;
|
/*margin: 0;*/
|
/*border: none;*/
|
border-collapse: separate;
|
border-spacing: 0;
|
/*table-layout: fixed;*/
|
border: 1px solid #ccc;
|
/*border: 1px solid #ccc;*/
|
width: 100%;
|
/*height: 100%;*/
|
/*overflow: hidden;*/
|
/*overflow-y: auto;*/
|
text-align: center;
|
}
|
|
.dataContent .thead th {
|
background-color: #fafafa;
|
text-align: center;
|
height: 30px;
|
padding: 5px;
|
}
|
|
.dataContent tr td {
|
height: 35px;
|
}
|
|
.dataContent .mathData td {
|
padding: 10px;
|
cursor: pointer;
|
}
|
|
.dataContent .mathData:hover td {
|
background-color: #e6f7ff;
|
}
|
|
.table2 {
|
width: 100%;
|
height: 100%;
|
overflow: auto;
|
}
|
|
.table2 thead tr th:first-child,
|
.table tbody tr .tdgu {
|
position: sticky;
|
left: 0;
|
z-index: 1;
|
}
|
|
.table tbody tr .kaitou {
|
z-index: 1;
|
background-color: white;
|
}
|
|
.table tbody tr .tdgu1 {
|
position: sticky;
|
left: 150px;
|
z-index: 2;
|
}
|
|
.table tbody tr .tdgu2 {
|
position: sticky;
|
left: 312px;
|
z-index: 2;
|
}
|
|
.table2 thead tr .timeth,
|
.table2 thead tr .thgu {
|
position: sticky;
|
top: 0;
|
z-index: 3;
|
}
|
|
.table2 thead .gudingth th {
|
position: sticky;
|
top: 32px;
|
z-index: 6 !important;
|
}
|
|
.table2 thead .equipname .name {
|
z-index: 3;
|
}
|
|
.table2 thead .equipname .dong1 {
|
z-index: 4;
|
left: 0;
|
}
|
|
.table2 thead .equipname .dong2 {
|
z-index: 5;
|
left: 150px;
|
}
|
|
.table2 thead .equipname .dong3 {
|
z-index: 5;
|
left: 312px;
|
}
|
|
.efficiency_list #DeviceList {
|
height: 90% !important;
|
}
|
|
#Efficiency{
|
overflow: hidden;
|
}
|
|
#openRateTrendChart{
|
width: 100%;
|
height: 60%
|
}
|
|
@media screen and (min-width: 1920px) {
|
#Efficiency {
|
height: 337px !important;
|
}
|
}
|
|
@media screen and (min-width: 1680px) and (max-width: 1920px) {
|
#Efficiency {
|
height: 337px !important;
|
}
|
}
|
|
@media screen and (min-width: 1400px) and (max-width: 1680px) {
|
#Efficiency {
|
height: 337px !important;
|
}
|
}
|
|
@media screen and (min-width: 1280px) and (max-width: 1400px) {
|
#Efficiency {
|
height: 200px !important;
|
}
|
}
|
|
@media screen and (max-width: 1280px) {
|
#Efficiency {
|
height: 200px !important;
|
}
|
}
|
</style>
|