From 64b642cfbe4f34706ed40af77e51079ddf919d54 Mon Sep 17 00:00:00 2001 From: quanyawei <401863037@qq.com> Date: Fri, 13 Oct 2023 16:52:43 +0800 Subject: [PATCH] fix:查询修改和表格添加 --- src/components/Echarts/LineChart2.vue | 121 ++++++++-------- src/views/main/index.vue | 1 src/views/charts/index.vue | 277 +++++++++++++++++++++++++++++++++------ 3 files changed, 296 insertions(+), 103 deletions(-) diff --git a/src/components/Echarts/LineChart2.vue b/src/components/Echarts/LineChart2.vue index d32faf0..42a51c9 100644 --- a/src/components/Echarts/LineChart2.vue +++ b/src/components/Echarts/LineChart2.vue @@ -6,39 +6,39 @@ // import echarts from 'echarts' import * as echarts from 'echarts' require('echarts/theme/macarons') // echarts theme -import resize from './mixins/resize' +// import resize from './mixins/resize' export default { - mixins: [resize], + // mixins: [resize], props: { className: { type: String, - default: 'chart', + default: 'chart' }, width: { type: String, - default: '100%', + default: '100%' }, height: { type: String, - default: '350px', + default: '350px' }, autoResize: { type: Boolean, - default: true, + default: true }, isMouse: { type: Boolean, - default: false, + default: false }, chartData: { type: Object, - required: true, + required: true }, interval: { type: Number, - default: 1, - }, + default: 1 + } // xdata: { // type: Array, // required: true @@ -46,7 +46,7 @@ }, data() { return { - chart: null, + chart: null } }, watch: { @@ -54,8 +54,8 @@ deep: true, handler(val) { this.setOptions(val) - }, - }, + } + } // xdata: { // deep: true, // handler(val) { @@ -84,17 +84,17 @@ }, setOptions(val) { function fontSize(res) { - let clientWidth = + const clientWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth if (!clientWidth) return - let fontSize = 100 * (clientWidth / 1920) + const fontSize = 100 * (clientWidth / 1920) return res * fontSize } - let that = this + const that = this if (this.isMouse) { - this.chart.on('mouseover', function (params) { + this.chart.on('mouseover', function(params) { that.chart.setOption({ series: [ { @@ -110,7 +110,7 @@ }) }) // ���������������mouseout������������������������ - this.chart.on('mouseout', function (params) { + this.chart.on('mouseout', function(params) { that.chart.setOption({ series: [ { @@ -134,38 +134,38 @@ title: { text: val.text, textStyle: { - color: '#000000', - }, + color: '#000000' + } }, xAxis: { data: val.xAxis, boundaryGap: false, axisTick: { - show: true, - }, + show: true + } }, grid: { left: '5%', right: '5%', top: '5%', containLabel: true, - height: fontSize(4.3), + height: fontSize(4.3) }, toolbox: { feature: { dataZoom: { - yAxisIndex: 'none', + yAxisIndex: 'none' }, restore: {}, - saveAsImage: {}, - }, + saveAsImage: {} + } }, tooltip: { backgroundColor: 'rgba(50,50,50,0.5)', borderWidth: '0', trigger: 'axis', - formatter: function (a) { - let list = [] + formatter: function(a) { + const list = [] let listItem = '' for (var i = 0; i < a.length; i++) { list.push( @@ -184,34 +184,33 @@ return ' <div div style = "width:15px; display:inline-block;" > ' + a[0].name + '</div>' + '<div style="padding:0px;">' + listItem + '</div>' }, - position: function (point, params, dom, rect, size) { - //������point���������������������������size���������������������viewSize���contentSize������������������div���tooltip������������������ - let x = point[0];// - let y = point[1]; - let viewWidth = size.viewSize[0]; - let viewHeight = size.viewSize[1]; - let boxWidth = size.contentSize[0]; - let boxHeight = size.contentSize[1]; - let posX = 0;//x������������ - let posY = 0;//y������������ + position: function(point, params, dom, rect, size) { + // ������point���������������������������size���������������������viewSize���contentSize������������������div���tooltip������������������ + const x = point[0]// + const y = point[1] + const viewWidth = size.viewSize[0] + const viewHeight = size.viewSize[1] + const boxWidth = size.contentSize[0] + const boxHeight = size.contentSize[1] + let posX = 0// x������������ + let posY = 0// y������������ - if (x < boxWidth) {//��������������� - posX = 5; - } else {//��������������� - posX = x - boxWidth; + if (x < boxWidth) { // ��������������� + posX = 5 + } else { // ��������������� + posX = x - boxWidth } - if (y < boxHeight) {//��������������� - posY = 5; - } else {//��������������� - posY = y - boxHeight; + if (y < boxHeight) { // ��������������� + posY = 5 + } else { // ��������������� + posY = y - boxHeight } if (params && params.length > 20) { posX = point[1], - posY = '-10%'; + posY = '-10%' } - return [posX, posY]; - + return [posX, posY] }, axisPointer: { type: 'cross', @@ -228,13 +227,13 @@ yAxis: { axisTick: { - show: true, // ������������ + show: true // ������������ }, axisLine: { - show: true, //��������������������� + show: true // ��������������������� }, axisLabel: { - show: true, //������������������������������ + show: true // ������������������������������ } // axisLine: { // lineStyle: { @@ -245,35 +244,35 @@ legend: { data: val.title, tooltip: { - show: true, + show: true }, textStyle: { - fontSize: fontSize(0.15), + fontSize: fontSize(0.15) }, widht: 'auto', height: 'auto', - top: fontSize(5.5), + top: fontSize(5.5) }, dataZoom: [ { type: 'inside', start: 0, - end: 100, + end: 100 }, { start: 0, end: 20, top: fontSize(4.8), - height: fontSize(0.5), - }, + height: fontSize(0.5) + } ], - series: val.series, + series: val.series }, true ) window.onresize = this.chart.resize - }, - }, + } + } } </script> diff --git a/src/views/charts/index.vue b/src/views/charts/index.vue index c89cb1c..50a1083 100644 --- a/src/views/charts/index.vue +++ b/src/views/charts/index.vue @@ -1,9 +1,16 @@ <template> - <div style="width: 100%; height: 100%"> + <div id="chartTableContent" style="width: 100%; height: 100%"> <div class="topSelect"> <!-- <el-cascader v-model="newMac" :options="options" clearable change-on-select :props="{ checkStrictly: true }" placeholder="������������" /> --> - <el-cascader v-model="newMac" :options="options" :props="props" collapse-tags clearable placeholder="������������" - style="width: 354px" /> + <el-cascader + v-model="newMac" + :options="options" + :props="props" + collapse-tags + clearable + placeholder="������������" + style="width: 354px" + /> <!-- <div> --> <el-select v-model="value" placeholder="������������" style="margin-left: 20px"> <el-option v-for="(item, index) in newSensor" :key="index" :label="item.label" :value="item.value" /> @@ -16,19 +23,38 @@ <el-radio-button label="���������" /> </el-radio-group> --> <el-select v-model="select1" placeholder="���������" style="margin-left: 20px; width: 200px"> - <el-option v-for="item in options1" :key="item.value" :label="item.label" :value="item.value"> - </el-option> + <el-option v-for="item in options1" :key="item.value" :label="item.label" :value="item.value" /> </el-select> - <component :is="dataType" style="padding-left: 0; margin-left: 20px; width: 160px" - @sendPickerChild="showPickerChild" class="select11" /> + <component + :is="dataType" + style="padding-left: 0; margin-left: 20px; width: 160px" + class="select11" + @sendPickerChild="showPickerChild" + /> <!--������������--> - <el-button @click="selectData" class="btn1">������</el-button> + <el-button class="btn1" @click="selectData">������</el-button> </div> <div class="topTitle"> <div style="position: absolute">{{ selectyz }}</div> <!-- <div style="text-align: center;width: 100%;">{{ newData }}��{{ newMac?newMac[0]:'' }}��{{ newMac?newMac[newMac.length - 1][0]:'' }}��{{ value |sensorFilter }}�����������</div> --> </div> - <LineChart :chart-data="lineChartData" style="height: 45rem" /> + <LineChart :chart-data="lineChartData" style="height: 40rem" /> + <div style="padding: 0px 10px;margin-bottom: 50px;"> + <el-table v-if="searchData.length>0" :data="tableData" border size="mini" style="width: 100%" max-height="250" tooltip-effect> + <el-table-column prop="rankingTitle" label="������" width="150" align="center"> + <el-table-column + prop="rankingTitle" + label="������" + align="center" + width="150" + /> + </el-table-column> + <template v-for="(th, thIndex) in thArr"> + <el-table-column :key="thIndex" align="center" :label="th.label" :prop="th.prop" /> + </template> + </el-table> + </div> + </div> </template> @@ -45,24 +71,25 @@ import CustomPicker1 from '@/components/Form/CustomPicker1' import TimePicker1 from '@/components/Form/TimePicker1' import json from '@/assets/json/sensor.json' +import _ from 'lodash' const lineChartData = { newVisitis: { expectedData: [100, 120, 161, 134, 105, 160, 165], - actualData: [120, 82, 91, 154, 162, 140, 145], + actualData: [120, 82, 91, 154, 162, 140, 145] }, messages: { expectedData: [200, 192, 120, 144, 160, 130, 140], - actualData: [180, 160, 151, 106, 145, 150, 130], + actualData: [180, 160, 151, 106, 145, 150, 130] }, purchases: { expectedData: [80, 100, 121, 104, 105, 90, 100], - actualData: [120, 90, 100, 138, 142, 130, 130], + actualData: [120, 90, 100, 138, 142, 130, 130] }, shoppings: { expectedData: [130, 140, 141, 142, 145, 150, 160], - actualData: [120, 82, 91, 154, 162, 140, 130], - }, + actualData: [120, 82, 91, 154, 162, 140, 130] + } } export default { // import ��������������������������������������������������� @@ -74,13 +101,13 @@ CustomPicker, CustomPicker1, TimePicker1, - HourPicker1, + HourPicker1 }, filters: { - sensorFilter: function (value) { + sensorFilter: function(value) { if (!value) return '' return json[value] - }, + } }, props: { // defaultData: Array @@ -104,7 +131,7 @@ newLineChartData: { series: [], xAxis: [], - title: '', + title: '' }, newData: '', defaultData: [], @@ -113,25 +140,60 @@ options1: [ { label: '������������', - value: '������������', + value: '������������' }, { label: '���������', - value: '���������', + value: '���������' }, { label: '������', - value: '������', + value: '������' }, { label: '������', - value: '������', - }, + value: '������' + } ], + searchData: [] } }, // ������������ ���������data������ - computed: {}, + computed: { + thArr() { + const data = [] + if (this.searchData.length > 0) { + this.searchData.forEach((item, index) => { + data.push({ + label: item.time, + name: item.time, + prop: 'souceData' + index + }) + }) + console.log(data) + } + return data + }, + tableData() { + const data = [] + const souceData = [] + const firstData = [] + const fobj = {} + const sobj = {} + if (this.searchData.length > 0) { + this.searchData.forEach((item, index) => { + fobj['souceData' + index] = this.sortFind(item.deviceData)[0].name + sobj['souceData' + index] = this.sortFind(item.deviceData)[1].name + }) + } + const a = [...firstData] + data.push({ ...fobj, rankingTitle: '������������' }, { ...sobj, rankingTitle: '������������' }) + console.log('firstData', fobj) + console.log('souceData', sobj) + console.log('datadatadata', data) + return data + } + }, // ������data������������������ watch: { // ��������������������������� @@ -209,7 +271,7 @@ ) { this.selectyz = '(������:ppm)' } - }, + } }, // ������������ - ��������������������������������� this ��������� created() { @@ -228,13 +290,85 @@ activated() { }, // ������������ methods: { + sortFind(data) { + let arr = [] + let a = '' + let b = '' + // const duplicateValue = _.orderBy(this.refrain(data), ['sensorValue'], ['desc']) // ��������������� + // console.log('duplicateValue', duplicateValue) + const originalValue = _.orderBy(data, ['sensorValue'], ['desc']) + const firstIndex = [] + const fiestDateList = [] + const secondeIndex = [] + const secondeDateList = [] + console.log('originalValue', originalValue) + if ((Number(originalValue[0].sensorValue) === Number(0))) { + return [{ name: '/' }, { name: '/' }] + } + originalValue.forEach((value, inx) => { + if ((Number(originalValue[0].sensorValue) === Number(value.sensorValue))) { + firstIndex.push(inx) + } + }) + + if (firstIndex.length > 1) { + firstIndex.forEach(item => { + a += (originalValue[item].name).replace(/\s+/g, '') + '(' + originalValue[item].sensorValue + ')' + ',' + }) + fiestDateList.push({ + name: a + }) + // ������������ + const secondInd = firstIndex[firstIndex.length - 1] + originalValue.forEach((value, inx) => { + if ((Number(originalValue[secondInd].sensorValue) === Number(value.sensorValue))) { + secondeIndex.push(inx) + } + }) + secondeIndex.forEach(item => { + b += (originalValue[item].name).replace(/\s+/g, '') + '(' + originalValue[item].sensorValue + ')' + ',' + }) + secondeDateList.push({ + name: b + }) + } else if (firstIndex.length <= 1) { + fiestDateList.push({ + name: (originalValue[0].name).replace(/\s+/g, '') + '(' + originalValue[0].sensorValue + ')' + }) + if (originalValue.length > 1) { + originalValue.forEach((value, inx) => { + if ((Number(originalValue[1].sensorValue) === Number(value.sensorValue))) { + secondeIndex.push(inx) + } + }) + secondeIndex.forEach(item => { + b += (originalValue[item].name).replace(/\s+/g, '') + '(' + originalValue[item].sensorValue + ')' + ',' + }) + secondeDateList.push({ + name: b + }) + } + } + console.log('fiestDateList', fiestDateList) + console.log('secondeDateList', secondeDateList) + arr = fiestDateList.concat(secondeDateList) + console.log('arr', arr) + return arr + // console.log('refrainrefrainrefrain', this.refrain(data)) + // const arr = [] + // const duplicates = data.filter(item => data.indexOf(item) !== data.lastIndexOf(item)) + // unUnit.forEach(item => { + // _.find(data, function(o) { return Number(item.sensorValue) === Number(o.sensorValue) }) + // arr.push() + // }) + }, // ������������ selectData() { console.log(this.newData) var newLineChartData = { series: [], xAxis: [], - title: [], + title: [] } this.newXData = [] this.$request({ @@ -245,13 +379,15 @@ sensorCode: this.value, type: this.unit, // times: data instanceof Array ? data : [data] - times: this.newData instanceof Array ? this.newData : [this.newData], - }, + times: this.newData instanceof Array ? this.newData : [this.newData] + } }) .then((res) => { // console.log('������������������������������') - const data = res.data - let lockLength = 0 + this.searchData = _.cloneDeep(res.data) + const data = _.cloneDeep(res.data) + console.log('this.se', this.searchData) + const lockLength = 0 for (let i = 0; i < data.length; i++) { for (let j = 0; j < data[i].deviceData.length; j++) { if (res.data[0].deviceData.length === 1) { @@ -266,8 +402,8 @@ type: 'line', label: { show: true, - position: 'top', - }, + position: 'top' + } }) } } else { @@ -276,7 +412,7 @@ name: '', triggerLineEvent: true, emphasis: { focus: 'series' }, - type: 'line', + type: 'line' }) } newLineChartData.series[j].name = data[i].deviceData[j].name @@ -301,8 +437,8 @@ url: '/monitorPoint/queryMonitorPoints', method: 'get', params: { - organizationId: this.$store.state.orgId, - }, + organizationId: this.$store.state.orgId + } }) .then((res) => { // console.log('������index������������������������') @@ -311,16 +447,16 @@ for (let i = 0; i < this.defaultData.length; i++) { this.options.push({ value: this.defaultData[i].name, - label: this.defaultData[i].name, + label: this.defaultData[i].name }) this.options[i].children = [] for (let j = 0; j < this.defaultData[i].devices.length; j++) { this.options[i].children.push({ value: [ this.defaultData[i].devices[j].name, - this.defaultData[i].devices[j].mac, + this.defaultData[i].devices[j].mac ], - label: this.defaultData[i].devices[j].name, + label: this.defaultData[i].devices[j].name }) } } @@ -339,8 +475,8 @@ url: '/deviceInfo/getMacSensors', method: 'post', data: { - macs: this.newMac1, - }, + macs: this.newMac1 + } }) .then((result) => { // console.log(result) @@ -359,11 +495,15 @@ // ��������������������������������������������� showPickerChild(data) { this.newData = data - }, - }, // ���������������keep-alive������������������������������������ + } + } // ���������������keep-alive������������������������������������ } </script> <style scoped lang="scss"> +#chartTableContent{ + overflow-y: scroll; + overflow-x: hidden; +} .topSelect { display: flex; margin-bottom: 20px; @@ -399,4 +539,57 @@ /deep/.el-date-editor .el-range-separator { width: 11%; } +/*::v-deep ���������������������������������������������element���������������*/ +::v-deep .el-table thead.is-group th { + background: none; + padding: 0px; +} + +::v-deep .el-table thead.is-group tr:first-of-type th:first-of-type { + border-bottom: none; /*���������������������*/ +} + +::v-deep .el-table thead.is-group tr:first-of-type th:first-of-type div.cell { + text-align: right; /*������������������*/ +} + +::v-deep .el-table thead.is-group tr:last-of-type th:first-of-type div.cell { + text-align: left; /*������������������*/ +} +/*������������*/ +::v-deep .el-table thead.is-group tr:first-of-type th:first-of-type:before { + content: ""; + position: absolute; + width: 1px; + height: 100px; /*���������������*/ + top: 0; + left: 0; + background-color: grey; + opacity: 0.2; + display: block; + transform: rotate(-43deg); /*���������������������*/ + transform: rotate(-70deg); /*���������������������*/ + -webkit-transform-origin: top; + transform-origin: top; +} + +::v-deep .el-table thead.is-group tr:last-of-type th:first-of-type:before { + content: ""; + position: absolute; + width: 1px; + height: 100px; /*���������������*/ + bottom: 0; + right: 0; + background-color: grey; + opacity: 0.2; + display: block; + transform: rotate(-45deg); /*���������������������*/ + transform: rotate(-70deg); /*���������������������*/ + -webkit-transform-origin: bottom; + transform-origin: bottom; +} +::v-deep .el-table thead.is-group th { + height: 27.4px; +} + </style> diff --git a/src/views/main/index.vue b/src/views/main/index.vue index 52d2d48..d20cfed 100644 --- a/src/views/main/index.vue +++ b/src/views/main/index.vue @@ -211,6 +211,7 @@ // console.log(newVal) // defaultData��������������������������� const copyData = _.cloneDeep(this.defaultDataMiddle) + this.defaultData = copyData this.openeds = [] const arr = [] let ke = 1 -- Gitblit v1.8.0