From 5330eb812cdcc02cace0648b008092b24c6e2236 Mon Sep 17 00:00:00 2001 From: zhuzhuanzhuan Date: 星期三, 06 十二月 2023 17:44:50 +0800 Subject: [PATCH] 1、利用率走势分析和利用率分段分析页面优化表格数据加载方式,实现滚动条触底加载,解决数据量较大时网页请求速度慢问题 2、报警分析页面调整图表样式,更换表格组件为ant-design表格 3、登录页面登录后若用户密码为初始密码或密码已过期则出现修改密码弹窗 --- src/views/mdc/base/modules/openRateFractionAnalysis/openRateFractionAnalysisMain.vue | 333 ++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 221 insertions(+), 112 deletions(-) diff --git a/src/views/mdc/base/modules/openRateFractionAnalysis/openRateFractionAnalysisMain.vue b/src/views/mdc/base/modules/openRateFractionAnalysis/openRateFractionAnalysisMain.vue index 8a5052c..4c809b1 100644 --- a/src/views/mdc/base/modules/openRateFractionAnalysis/openRateFractionAnalysisMain.vue +++ b/src/views/mdc/base/modules/openRateFractionAnalysis/openRateFractionAnalysisMain.vue @@ -1,20 +1,21 @@ <template> <div class="efficiency_list" style="width: 100%;height: 100%;"> - <a-card :bordered="false"> + <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-range-picker @change="dateParamChange" :disabledDate="disabledDate" format="YYYYMMDD" v-model="dates"/> + <a-range-picker @change="dateParamChange" :disabledDate="disabledDate" format="YYYYMMDD" + v-model="dates"/> </a-form-item> </a-col> <a-col :md="7" :sm="7" :xs="7"> <a-form-item label="鏃堕棿娈�"> - <a-time-picker :default-value="moment('00:00', 'HH:mm')" format="HH:mm" @change="onChangeStart" /> + <a-time-picker :default-value="moment('00:00', 'HH:mm')" format="HH:mm" @change="onChangeStart"/> 鑷� - <a-time-picker :default-value="moment('08:00', 'HH:mm')" format="HH:mm" @change="onChangeEnd" /> + <a-time-picker :default-value="moment('08:00', 'HH:mm')" format="HH:mm" @change="onChangeEnd"/> </a-form-item> </a-col> <a-col :lg="2" :md="3" :sm="3" :xs="3"> @@ -26,35 +27,44 @@ <div id="DeviceList"> <div class="openRateTrendDg"> <div id="Efficiency" class="container" style="margin-top: 20px;"> - <div class="table2"> - <table class="dataContent table" border="1" cellspacing="0" cellpadding="0" style="white-space: nowrap;text-align: center;"> - <thead> - <tr class="thead fixed equipname"> - <th class="thgu dong1 name" rowspan="2" style="min-width: 150px; max-width: 150px;width: 150px;">璁惧缂栧彿</th> - <th class="thgu dong2 name" rowspan="2" style="min-width: 150px; max-width: 150px;width: 150px;">璁惧鍚嶇О</th> - <th class="thgu dong3 name" rowspan="2" 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> + <a-spin :spinning="loading"> + <div class="table2"> + <table class="dataContent table" border="1" cellspacing="0" cellpadding="0" + style="white-space: nowrap;text-align: center;"> + <thead> + <tr class="thead fixed equipname"> + <th class="thgu dong1 name" rowspan="2" style="min-width: 150px; max-width: 150px;width: 150px;"> + 璁惧缂栧彿 + </th> + <th class="thgu dong2 name" rowspan="2" style="min-width: 150px; max-width: 150px;width: 150px;"> + 璁惧鍚嶇О + </th> + <th class="thgu dong3 name" rowspan="2" 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> + </a-spin> </div> </div> <div id="openRateTrendChart" style="width: 100%;height: 60%"></div> </div> - </a-card> + </div> </div> </template> @@ -67,6 +77,7 @@ import { JeecgListMixin } from '@/mixins/JeecgListMixin' + export default { // mixins: [JeecgListMixin], name: 'openRateFractionAnalysisMain', @@ -76,7 +87,7 @@ dataSource: [], /* table鍔犺浇鐘舵�� */ loading: false, - typeTree: "", + typeTree: '', typeParent: 1, typeEquipment: 1, TreeIDOne: 1, @@ -103,8 +114,11 @@ listByType: '/mdc/MdcUtilizationRate/getByType' }, tableHeads: [], - XData:[0], - YData:[0], + XData: [0], + YData: [0], + isLazyRequest: '',// 鏄惁寮�鍚噿鍔犺浇 + requestAlldataSize: 8,// 鎬诲叡璇锋眰鐨勫垪琛ㄩ」鏁扮洰 + everyRequestDataSize: 15// 姣忔璇锋眰鐨勫垪琛ㄩ」鏁扮洰 } }, props: { nodeTree: '', Type: '', nodePeople: '' }, @@ -116,13 +130,20 @@ 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 = "08:00" - this.queryParam.typeTree = "1" + this.queryParam.endTime = '08:00' + this.queryParam.typeTree = '1' this.loadData1() + + }, + mounted() { + this.tableScroll = document.querySelector('.table2') + }, + beforeDestroy() { + this.tableScroll.removeEventListener('scroll', this.tableScrollX) }, watch: { Type(valmath) { - this.dataList = []; + this.dataList = [] this.queryParam.typeTree = valmath }, nodeTree(val) { //鐩戝惉currSelected 鍙樺寲锛屽皢鍙樺寲鍚庣殑鏁板�间紶閫掔粰 getCurrSelected 浜嬩欢 @@ -170,15 +191,15 @@ this.queryParam.endTime = timeString // console.log(time, timeString); }, - numBerTwo(value){ + numBerTwo(value) { if (value) { return parseFloat((value * 100).toFixed(2)) } else { return '0' } }, - TableDraw(key,val) { - this.XData=[0] + TableDraw(key, val) { + this.XData = [0] this.YData[0] var Xarr = [] var Yarr = [] @@ -186,8 +207,8 @@ Xarr.push(val.dataList[i].theDate) Yarr.push(this.numBerTwo(val.dataList[i].utilizationRate)) } - this.XData=Xarr - this.YData=Yarr + this.XData = Xarr + this.YData = Yarr // if(this.openRateTrendAnalysisChart !=null && this.openRateTrendAnalysisChart != '' && this.openRateTrendAnalysisChart != undefined){ // this.openRateTrendAnalysisChart.dispose() // } @@ -196,21 +217,33 @@ }, //Can not slect days before today and today disabledDate(current) { - return current && current > moment().subtract('days', 1); + 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() { - if (this.queryParam.typeTree == "1") { - this.queryParam.parentId = this.queryParamEquip.parentId - this.queryParam.equipmentId = this.queryParamEquip.equipmentId + this.queryParam.startDate = moment(this.dates[0]).format('YYYYMMDD') + this.queryParam.endDate = moment(this.dates[1]).format('YYYYMMDD') + if (this.queryParam.startTime && this.queryParam.endTime && this.dates[0] && this.dates[1]) { + 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() } else { - this.queryParam.parentId = this.queryParamPeople.parentId - this.queryParam.equipmentId = "" + this.$notification.warning({ + message: '鎻愮ず', + description: '璇烽�夋嫨鏃堕棿鎴栨椂闂存' + }) } - this.loadData1() + // this.onClearSelected() }, // searchReset() { @@ -283,8 +316,16 @@ // } // } 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 @@ -295,20 +336,22 @@ // this.checkSameData2(this.dataList) // this.combineCell(); // this.initDeviceType(this.dataList) - + this.tableScroll.addEventListener('scroll', this.tableScrollX) } + }).finally(() => { + this.loading = false }) }, - draw(){ - let openRateTrendAnalysisChart = this.$echarts.init(document.getElementById('openRateTrendChart'), 'macarons'); + draw() { + let openRateTrendAnalysisChart = this.$echarts.init(document.getElementById('openRateTrendChart'), 'macarons') let openRateTrendChartOptions = { title: { - text: '鍒╃敤鐜囪蛋鍔垮垎鏋�', + text: '鍒╃敤鐜囧垎娈靛垎鏋�', x: 'center', textStyle: { fontSize: 18, fontWeight: 'bolder', - color: "#151414" + color: '#151414' } }, tooltip: { @@ -339,7 +382,7 @@ series: [ { name: '鍒╃敤鐜�', - type: 'bar', + type: 'line', data: this.YData, markPoint: { data: [ @@ -354,8 +397,43 @@ } } ] - }; - openRateTrendAnalysisChart.setOption(openRateTrendChartOptions,true); + } + 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 + }) + } } } } @@ -399,6 +477,11 @@ .dataContent .mathData td { padding: 10px; /*display: none;*/ + cursor: pointer; + } + + .dataContent .mathData:hover td { + background-color: #e6f7ff; } .dataContent .mathData .td { @@ -410,138 +493,164 @@ .dataContent .mathData .tdd { /*display: none;*/ } - .table2{ - width: 100%; - height: 100%; - overflow: auto; + + .table2 { + width: 100%; + height: 100%; + overflow: auto; } + /*tr th {*/ - /*height: 50px!important;*/ + /*height: 50px!important;*/ /*}*/ /*tr td{*/ - /*height: 50px!important;*/ + /*height: 50px!important;*/ /*}*/ .table2 thead tr th:first-child, - .table tbody tr .tdgu{ + .table tbody tr .tdgu { position: sticky; left: 0; z-index: 1; } - .table tbody tr .kaitou{ + + .table tbody tr .kaitou { z-index: 1; background-color: white; } - .table tbody tr .tdgu1{ + + .table tbody tr .tdgu1 { position: sticky; left: 150px; z-index: 2; } - .table tbody tr .tdgu2{ + + .table tbody tr .tdgu2 { position: sticky; left: 300px; z-index: 2; } - .table tbody tr .tdgu3{ + + .table tbody tr .tdgu3 { position: sticky; left: 450px; z-index: 2; } - .table tbody tr .tdgu4{ + + .table tbody tr .tdgu4 { position: sticky; left: 550px; z-index: 2; } - .table tbody tr .tdgu5{ + + .table tbody tr .tdgu5 { position: sticky; left: 700px; z-index: 2; } + .table2 thead tr .timeth, - .table2 thead tr .thgu { + .table2 thead tr .thgu { position: sticky; - top:0; + top: 0; z-index: 3; } - .table2 thead .gudingth th{ + + .table2 thead .gudingth th { position: sticky; top: 32px; - z-index: 6!important; + z-index: 6 !important; } - .table2 thead .equipname .name{ + + .table2 thead .equipname .name { z-index: 3; } - .table2 thead .equipname .dong1{ + + .table2 thead .equipname .dong1 { z-index: 4; left: 0; /*border: 1px solid #000;*/ } - .table2 thead .equipname .dong2{ + + .table2 thead .equipname .dong2 { z-index: 5; left: 150px; } - .table2 thead .equipname .dong3{ + + .table2 thead .equipname .dong3 { z-index: 5; left: 300px; } - .table2 thead .equipname .dong4{ + + .table2 thead .equipname .dong4 { z-index: 5; left: 450px; } - .table2 thead .equipname .dong5{ + + .table2 thead .equipname .dong5 { z-index: 5; left: 550px; } - .table2 thead .equipname .dong6{ + + .table2 thead .equipname .dong6 { z-index: 5; left: 700px; } - @media screen and (min-width: 1920px){ - #Efficiency{ - height: 337px!important; - overflow: scroll; + @media screen and (min-width: 1920px) { + #Efficiency { + height: 337px !important; + overflow: scroll; + } } + + @media screen and (min-width: 1680px) and (max-width: 1920px) { + #Efficiency { + height: 337px !important; + overflow: scroll; + } } - @media screen and (min-width: 1680px) and (max-width: 1920px){ - #Efficiency{ - height: 337px!important; - overflow: scroll; + + @media screen and (min-width: 1400px) and (max-width: 1680px) { + #Efficiency { + height: 190px !important; + overflow: scroll; + } } + + @media screen and (min-width: 1280px) and (max-width: 1400px) { + #Efficiency { + height: 90px !important; + overflow: scroll; + } } - @media screen and (min-width: 1400px) and (max-width: 1680px){ - #Efficiency{ - height: 190px!important; - overflow: scroll; + + @media screen and (max-width: 1280px) { + #Efficiency { + height: 90px !important; + overflow: scroll; + } } - } - @media screen and (min-width: 1280px) and (max-width: 1400px){ - #Efficiency{ - height: 90px!important; - overflow: scroll; - } - } - @media screen and (max-width: 1280px){ - #Efficiency{ - height: 90px!important; - overflow: scroll; - } - } - #Efficiency .table_guding1{ + + #Efficiency .table_guding1 { position: absolute; overflow: hidden; width: 500px; } - #Efficiency .table_guding2{ + + #Efficiency .table_guding2 { overflow-x: scroll; width: 500px; } - /deep/ .ant-card{ - height: 100%!important; + + /deep/ .ant-card { + height: 100% !important; } - /deep/ .ant-card .ant-card-body{ - height: 100%!important; + + /deep/ .ant-card .ant-card-body { + height: 100% !important; } - .efficiency_list #DeviceList{ - height: 90%!important; + + .efficiency_list #DeviceList { + height: 90% !important; } </style> \ No newline at end of file -- Gitblit v1.9.3