From 1e1e70da5288f47d8770ba2e7f22f3362e5b577c Mon Sep 17 00:00:00 2001 From: zhuzhuanzhuan Date: 星期五, 08 十二月 2023 17:16:35 +0800 Subject: [PATCH] 1、全局修改密码弹窗中的新密码校验长度与数据字典password_length设置保持一致 2、报警分析页面优化过快点击多次表格行时图表内容出现数据残留以及加载图表应设置加载中动画,若不设置用户在查询时短时间内不清楚有无数据 3、车间看板以及设备监控页面设备详情弹窗右上角增加关闭按钮、设备详情弹窗透明度加深、设备详情弹窗图表表盘指针对比色加强、调整设备详情弹窗中描述列表子项标题对齐方式由左对齐改为右对齐,锁定运行数据描述列表子项数值宽度,超出部分隐藏出现省略号,悬浮出现气泡卡片 4、设备利用率、设备开动率、班次利用率页面表格前三列增加表头,依次为公司、车间、工段以及表格有关时间值调整为若小时或分钟为0则不显示 5、设备综合效率分析页面表格数据默认每页最多显示10条改为20条 6、设备加工工件报表页面完成布局及功能实现 --- src/views/mdc/base/modules/alarmAnalysis/alarmAnalysisMain.vue | 506 +++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 371 insertions(+), 135 deletions(-) diff --git a/src/views/mdc/base/modules/alarmAnalysis/alarmAnalysisMain.vue b/src/views/mdc/base/modules/alarmAnalysis/alarmAnalysisMain.vue index b602fd4..dfbbc21 100644 --- a/src/views/mdc/base/modules/alarmAnalysis/alarmAnalysisMain.vue +++ b/src/views/mdc/base/modules/alarmAnalysis/alarmAnalysisMain.vue @@ -7,7 +7,8 @@ <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 :lg="2" :md="3" :sm="3" :xs="3"> @@ -18,39 +19,67 @@ </div> <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: left;"> - <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: 150px; max-width: 150px;width: 150px;">鍚堣鎸佺画鏃堕棿锛堢锛�</th> - <th class="thgu dong4 name" rowspan="2" style="min-width: 100px; max-width: 100px;width: 100px;">鎶ヨ淇℃伅</th> - <!--<template v-for="(tableHead, index) in tableHeads">--> - <!--<th class="timeth" :colspan="checkedList.length">{{tableHead}}</th>--> - <!--</template>--> - </tr> - </thead> - <tbody> - <tr class="mathData" v-for="(item, index) in dataList" @click="TableDraw(index,item)"> - <td class="tdgu kaitou">{{item.alarmCode}}</td> - <td class="tdgu1 kaitou">{{item.count}}</td> - <td class="tdgu2 kaitou">{{item.timeCount}}</td> - <td class="tdgu3 kaitou">{{item.alarmContent}}</td> - <!--<template v-for="(tableHead, index) in item.dataList">--> - <!--<td :style="{background:tableHead.color }">{{tableHead.utilizationRate | numFilter}}</td>--> - <!--</template>--> - </tr> - </tbody> - </table> - </div> + <!--<div id="Efficiency" class="container">--> + <!--<div class="table2">--> + <!--<table class="dataContent table" border="1" cellspacing="0" cellpadding="0"--> + <!--style="white-space: nowrap;text-align: left;">--> + <!--<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: 150px; max-width: 150px;width: 150px;">--> + <!--鍚堣鎸佺画鏃堕棿--> + <!--</th>--> + <!--<th class="thgu dong4 name" rowspan="2" style="min-width: 100px; max-width: 100px;width: 100px;">--> + <!--鎶ヨ淇℃伅--> + <!--</th>--> + <!--<!–<template v-for="(tableHead, index) in tableHeads">–>--> + <!--<!–<th class="timeth" :colspan="checkedList.length">{{tableHead}}</th>–>--> + <!--<!–</template>–>--> + <!--</tr>--> + <!--</thead>--> + <!--<tbody>--> + <!--<tr class="mathData" v-for="(item, index) in dataList" @click="TableDraw(index,item)">--> + <!--<td class="tdgu kaitou">{{item.alarmCode}}</td>--> + <!--<td class="tdgu1 kaitou">{{item.count}}</td>--> + <!--<td class="tdgu2 kaitou">{{getFormattedTime(item.timeCount)}}--> + <!--<!–<td class="tdgu2 kaitou">{{item.timeCount}}</td>–>--> + <!--<td class="tdgu3 kaitou">{{item.alarmContent}}</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-table :columns="columns" :data-source="dataList" bordered :pagination="false" :scroll="{y:168}" + :customRow="customRow" + rowKey="alarmCode" + > + <span slot="timeCount" slot-scope="text">{{getFormattedTime(text)}}</span> + <!--<a-table--> + <!--slot="expandedRowRender"--> + <!--slot-scope="row"--> + <!--:columns="innerColumns"--> + <!--:data-source="row.innerDataList"--> + <!--:pagination="false"--> + <!--rowKey="equipmentId"--> + <!-->--> + <!--<span slot="duration" slot-scope="text">{{getFormattedTime(text)}}</span>--> + <!--</a-table>--> + </a-table> + </div> + + <a-spin :spinning="spinning"> + <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> - </div> - <div style="width: 100%;height: 60%;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> @@ -65,6 +94,34 @@ import { JeecgListMixin } from '@/mixins/JeecgListMixin' + + const columns = [ + { title: '鎶ヨ鍙�', dataIndex: 'alarmCode', key: 'alarmCode', align: 'center' }, + { title: '鍑虹幇娆℃暟', dataIndex: 'count', key: 'count', align: 'center' }, + { + title: '鍚堣鎸佺画鏃堕棿', + dataIndex: 'timeCount', + key: 'timeCount', + scopedSlots: { customRender: 'timeCount' }, + align: 'center' + }, + { title: '鎶ヨ淇℃伅', dataIndex: 'alarmContent', key: 'alarmContent', align: 'center' } + ] + + const innerColumns = [ + { title: '璁惧缂栧彿', dataIndex: 'equipmentId', key: 'equipmentId', align: 'center' }, + { title: '璁惧鍚嶇О', dataIndex: 'equipmentName', key: 'equipmentName', align: 'center' }, + { title: '鎶ヨ鏃堕棿', dataIndex: 'alarmTime', key: 'alarmTime', align: 'center' }, + { title: '缁撴潫鏃堕棿', dataIndex: 'endTime', key: 'endTime', align: 'center' }, + { + title: '鎸佺画鏃堕棿', + dataIndex: 'duration', + key: 'duration', + scopedSlots: { customRender: 'duration' }, + align: 'center' + } + ] + export default { // mixins: [JeecgListMixin], name: 'alarmAnalysisMain', @@ -74,7 +131,8 @@ dataSource: [], /* table鍔犺浇鐘舵�� */ loading: false, - typeTree: "", + spinning:false, + typeTree: '', typeParent: 1, typeEquipment: 1, TreeIDOne: 1, @@ -102,9 +160,11 @@ alarmTrend: '/mdc/alarmAnalyze/alarmTrend' }, tableHeads: [], - pieDate:[0], - XData:[0], - YData:[0], + pieDate: [0], + XData: [0], + YData: [0], + columns, + innerColumns } }, props: { nodeTree: '', Type: '', nodePeople: '' }, @@ -115,16 +175,16 @@ 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.queryParam.typeTree = '1' this.loadData1() }, - mounted(){ + mounted() { this.drawWrin() }, watch: { Type(valmath) { - this.dataList = []; + this.dataList = [] this.queryParam.typeTree = valmath }, nodeTree(val) { //鐩戝惉currSelected 鍙樺寲锛屽皢鍙樺寲鍚庣殑鏁板�间紶閫掔粰 getCurrSelected 浜嬩欢 @@ -163,29 +223,30 @@ } }, methods: { - numBerTwo(value){ + numBerTwo(value) { if (value) { return parseFloat((value * 100).toFixed(2)) } else { return '0' } }, - TableDraw(key,val) { + TableDraw(key, val) { let that = this + that.spinning=true that.queryParam.alarmCode = val.alarmCode console.log(this.queryParam) - that.pieDate = [] - that.XData = [] - that.YData = [] - getAction(that.url.alarmTrend, that.queryParam).then(res => { + getAction(that.url.alarmTrend, that.queryParam) + .then(res => { if (res.success) { - for (var i = 0;i<res.result.equipmentCountList.length;i++){ - that.pieDate.push({name:res.result.equipmentCountList[i].key,value:res.result.equipmentCountList[i].count}) - } - for (var j = 0;j<res.result.dateCountList.length;j++){ - that.XData.push(res.result.dateCountList[j].key) - that.YData.push(res.result.dateCountList[j].count) - } + 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) + // this.tableHeads = res.result.dates // this.dataList = res.result // this.draw() @@ -197,12 +258,15 @@ that.drawWrin() } }) + .finally(()=>{ + that.spinning=false + }) console.log(this.YData) }, disabledDate(current) { //Can not slect days before today and today - return current && current > moment().subtract('days', 1); + return current && current > moment().subtract('days', 1) }, initDeviceType(deviceList) { let dictCode = 'mdc_equipmentType' @@ -236,19 +300,19 @@ this.queryParam.endDate = v2[1] }, searchQuery() { - if (this.dates&&this.dates.length>0){ - if (this.queryParam.typeTree == "1") { + if (this.dates && this.dates.length > 0) { + 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.queryParam.equipmentId = '' } this.loadData1() - } else{ + } else { this.$notification.warning({ - message:'鎻愮ず', - description:'璇烽�夋嫨鏃堕棿' + message: '鎻愮ず', + description: '璇烽�夋嫨鏃堕棿' }) } @@ -330,6 +394,31 @@ if (res.success) { // this.tableHeads = res.result.dates this.dataList = res.result + this.dataList[0].innerDataList=[ + { + equipmentId: '11234', + equipmentName: '绔嬩綋鏈哄簥', + alarmTime: 20, + endTime: 20, + duration: 123 + }, + { + equipmentId: '4213', + equipmentName: '鍗у鏈哄簥', + alarmTime: 312, + endTime: 31, + duration: 421 + } + ] + this.dataList[1].innerDataList=[ + { + equipmentId: '4213', + equipmentName: '鍗у鏈哄簥', + alarmTime: 312, + endTime: 31, + duration: 421 + } + ] // this.draw() // this.checkSameData(this.dataList) // this.checkSameData1(this.dataList) @@ -340,66 +429,91 @@ } }) }, - drawWrin(){ - let equipmentWarningPie = this.$echarts.init(document.getElementById('MdcEquipmentWarningPie'), 'macarons'); + drawWrin() { + let equipmentWarningPie = this.$echarts.init(document.getElementById('MdcEquipmentWarningPie'), 'macarons') let equipmentWarningPieOption = { title: { text: '鍚勮澶囧嚭鐜版鎶ヨ鐨勬瘮渚�', x: 'center', - y: 'bottom' + y: 'bottom', + textStyle: { + color: '#4FAEDC' + } }, tooltip: { trigger: 'item', - formatter: "<br/>{b} : {c} ({d}%)" + formatter: '<br/>{b} : {c} ({d}%)' }, calculable: true, series: [{ type: 'pie', radius: '60%', - center: ['55%', '55%'], itemStyle: { normal: { - /*color: function (params) { - var colorList = ['#4169E1', '#A8A8A8']; - return colorList[params.dataIndex] - },*/ + color: function(params) { + var colorList = ['#5AB1EF', '#2EC7C9', '#B6A2DE', '#FFB980', '#D87A80', '#8D98B3'] + return colorList[params.dataIndex] + }, label: { show: true, - position: 'top', - formatter: '{b}\n{c}' + // 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: this.pieDate // data:[{name:'jjjjjjj',value:'2'}] }] - }; - equipmentWarningPie.setOption(equipmentWarningPieOption,true); - let equipmentWarningLine = this.$echarts.init(document.getElementById('MdcEquipmentWarningLine'), 'macarons'); + } + equipmentWarningPie.setOption(equipmentWarningPieOption, true) + let equipmentWarningLine = this.$echarts.init(document.getElementById('MdcEquipmentWarningLine'), 'macarons') let equipmentWarningLineOption = { - title : { + title: { text: '姣忓ぉ鍑虹幇姝ゆ姤璀︾殑鏁伴噺璧板娍', x: 'center', - y: 'bottom' + y: 'bottom', + textStyle: { + color: '#4FAEDC' + } }, - tooltip:{ - trigger: 'item' + tooltip: { + trigger: 'axis' }, calculable: true, xAxis: [ { type: 'category', show: true, - data:this.XData + data: this.XData /*axisLabel :{ interval:0 - }*/ + }*/, + axisLine: { + //x杞寸嚎鐨勯鑹蹭互鍙婂搴� + show: true, + lineStyle: { + width: 2, + color: '#4FAEDC' + } + } } ], yAxis: [ { type: 'value', - name: '娆℃暟' + name: '娆℃暟', + axisLine: { + //x杞寸嚎鐨勯鑹蹭互鍙婂搴� + show: true, + lineStyle: { + width: 2, + color: '#4FAEDC' + } + } } ], series: [ @@ -407,16 +521,96 @@ name: '鎶ヨ鏁伴噺', type: 'line', data: this.YData, - markPoint : { - data : [ - {type : 'max', name: '鏈�澶у��'}, - {type : 'min', name: '鏈�灏忓��'} - ] + markPoint: { + data: [ + { type: 'max', name: '鏈�澶у��' }, + { type: 'min', name: '鏈�灏忓��' } + ], + label: { + color: '#fff' + } + }, + itemStyle: { + normal: { + color: '#2EC7C9' + } } } ] - }; - equipmentWarningLine.setOption(equipmentWarningLineOption,true); + } + equipmentWarningLine.setOption(equipmentWarningLineOption, true) + }, + + /** + * 鏍煎紡鍖栨椂闂� + * @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}绉抈 + }, + + /** + * 鑷畾涔夎〃鏍艰瑙﹀彂 + * @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 props 鍥炬爣灞炴�� + * @returns {null} 鑻ヤ富琛ㄦ暟鎹笅鏃犳暟鎹垯涓嶆樉绀哄浘鏍� + */ + expandIcon(props){ + console.log('props',props) + if (props.record.innerDataList&&props.record.innerDataList.length>0){ + if (props.expanded) { + return <a style="margin-right:0px;color:#999" onClick={e=> { + props.onExpand(props.record, e); + }}><a-icon type="minus" /></a> + } else{ + return <a style="margin-right:0px;color:#999" onClick={e => { + props.onExpand(props.record, e); + }}><a-icon type="plus"/></a> + } + }else{ + return null + } } } } @@ -456,28 +650,31 @@ .dataContent tr td { height: 35px; } - .dataContent .mathData:hover td{ + + .dataContent .mathData:hover td { background-color: #e6f7ff; } + .dataContent .mathData td { padding: 10px; /*display: none;*/ } - .dataContent .mathData .td { + .dataContent .mathData td { /*background-color: #ff9bd2;*/ - display: inline-block; - padding: 10px; + cursor: pointer; } .dataContent .mathData .tdd { /*display: none;*/ } - .table2{ + + .table2 { width: 100%; height: 100%; overflow: auto; } + /*tr th {*/ /*height: 50px!important;*/ /*}*/ @@ -485,126 +682,165 @@ /*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; + @media screen and (min-width: 1920px) { + #Efficiency { + height: 258px !important; overflow: scroll; } } - @media screen and (min-width: 1680px) and (max-width: 1920px){ - #Efficiency{ - height: 337px!important; + + @media screen and (min-width: 1680px) and (max-width: 1920px) { + #Efficiency { + height: 258px !important; overflow: scroll; } } - @media screen and (min-width: 1400px) and (max-width: 1680px){ - #Efficiency{ - height: 190px!important; + + @media screen and (min-width: 1400px) and (max-width: 1680px) { + #Efficiency { + height: 160px !important; overflow: scroll; } } - @media screen and (min-width: 1280px) and (max-width: 1400px){ - #Efficiency{ - height: 90px!important; + + @media screen and (min-width: 1280px) and (max-width: 1400px) { + #Efficiency { + height: 60px !important; overflow: scroll; } } - @media screen and (max-width: 1280px){ - #Efficiency{ - height: 90px!important; + + @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; } + + /deep/ .ant-table-body .ant-table-row td { + padding-top: 10px; + padding-bottom: 10px; + cursor: pointer; + } + + /deep/ .ant-spin-nested-loading{ + height: 55%; + } + + /deep/ .ant-spin-container{ + height: 100%; + } + </style> \ No newline at end of file -- Gitblit v1.9.3