From c8d8b2d3cf0807f46d1d365da0560b25a1a73ae7 Mon Sep 17 00:00:00 2001 From: fengxiang <110431245@qq.com> Date: Fri, 23 Mar 2018 14:58:40 +0800 Subject: [PATCH] 数据查询优化,设备坐标 保持bug修复 --- src/app/routes/analysis/query/query.component.ts | 428 ++++++++++++++++++++++++++++++----------------------- 1 files changed, 241 insertions(+), 187 deletions(-) diff --git a/src/app/routes/analysis/query/query.component.ts b/src/app/routes/analysis/query/query.component.ts index 0ca1a58..3f41f21 100644 --- a/src/app/routes/analysis/query/query.component.ts +++ b/src/app/routes/analysis/query/query.component.ts @@ -15,6 +15,7 @@ import { NzMessageService } from 'ng-zorro-antd'; import * as $ from 'jquery'; import { DateService } from '@business/services/util/date.service'; +import { zip } from 'rxjs/observable/zip'; @Component({ selector: 'app-query', @@ -22,6 +23,22 @@ styleUrls: ['./query.component.less'] }) export class QueryComponent implements OnInit { + // aqi������������ + private aqiSort = { + e1: 1, + e2: 2, + e10: 3, + e11: 4, + e15: 5, + e16: 6 + }; + public tableWidth = 2800; + private tableWidthOption = { + 'MONTH': 1400, + 'DAY': 2800, + 'HOUR': 2100, + 'MINUTE': 5000 + }; public expandForm: boolean; // ��������� ������������ // public sensors: any[] = []; public sensorOptions: any[] = []; @@ -37,17 +54,19 @@ {label: '������', value: TimeUnits.MINUTE}, ]; public timeUnit: {label: string, value: TimeUnits} = this.timeUnitOptions[2]; - public actualTime: Date = new Date(); + // ��������������������������������������� + public actualTime: Date = moment().subtract(1, 'days').toDate(); public actualYearOptions: number []; public isCollapse = false; + public isChartCollapse = false; // ������������ - public _areas: { label: any, value: any[] }; - public grid: Grid<any> = new Grid(); - public gridSensorNames: string[] = []; + public _areas: { label: string, value: string }[] = new Array(); + public grid: Grid<{sensor: Sensor, data: string [], weight?: number}> = new Grid(); + // public grid.data: {sensor: Sensor, data: string [], weight?: number} [] = []; // ������������������������������������������ public sensorNameScrollLeft = '0px'; @ViewChild(NzTreeComponent) private tree: NzTreeComponent; - private _timeType: {showTime: boolean|{[key: string]: Function|boolean}, mode: 'month' | 'day', dateFormat: string } = {showTime: false, mode: 'day', dateFormat: 'YYYY-MM-DD'}; + private _timeType: {showTime: boolean|{[key: string]: Function|boolean}, mode: 'month' | 'day', dateFormat: string } = {showTime: false, mode: 'day', dateFormat: 'YYYY���MM���DD���'}; // ���key-value������,������������������ private _sensors: {[key: string]: string} = {}; private _sensorNames: string; @@ -56,6 +75,14 @@ } public toggleCollapse() { this.isCollapse = !this.isCollapse; + } + public toggleChartCollapse() { + // ��������������� + if (this.isChartCollapse && !!this.echartsIntance) { + this.switchSensor(this.chartSelectedIndex); + // this.chartLoading = false; + } + this.isChartCollapse = !this.isChartCollapse; } public deviceOptions: Device[] = []; public dataCondition: DataCondition = {areaRangeId: 320583, areaRange: AreaRange.AREA }; @@ -72,20 +99,20 @@ const pageBean: PageBean = { pageIndex: 0, pageSize: 20 }; const example = new ExampleService(); let areaName = ''; - switch (this.dataCondition.areaRange) { - case AreaRange.PROVINCE: + switch (this._areas.length) { + case 1: areaName = 'provinceCode'; break; - case AreaRange.CITY: + case 2: areaName = 'cityCode'; break; - case AreaRange.AREA: + case 3: areaName = 'areaCode'; break; } if (!!text) { example.or().andLike({ name: 'name', value: '%' + text + '%' }) - .andEqualTo({ name: areaName, value: this.dataCondition.areaRangeId }); + .andEqualTo({ name: areaName, value: Number(this._areas.slice(-1).pop().value) }); } else { example.or() - .andEqualTo({ name: areaName, value: this.dataCondition.areaRangeId }); + .andEqualTo({ name: areaName, value: Number(this._areas.slice(-1).pop().value) }); } this.monitorPointService.getPageByExample(pageBean, example).subscribe( (res: PageBean) => { @@ -149,104 +176,105 @@ (res: ResultBean<Organization>) => { if (res.code === ResultCode.SUCCESS) { const org = res.data; - if (!!org.areaNames) { + const areas = new Array(3); + if (!!org.areaNames) { const areaNames = org.areaNames; - this._areas = { label: null, value: null }; - this._areas.label = Object.values(areaNames).filter( - val => !!val - ).join('/'); - if (areaNames.areaName != null) { - this._areas.value = org.areaCode; - this.dataCondition.areaRange = AreaRange.AREA; - this.dataCondition.areaRangeId = org.areaCode; - } else if (areaNames.cityName != null) { - this._areas.value = org.cityCode; - this.dataCondition.areaRange = AreaRange.CITY; - this.dataCondition.areaRangeId = org.cityCode; - } else { - this._areas.value = org.provinceCode; - this.dataCondition.areaRange = AreaRange.PROVINCE; - this.dataCondition.areaRangeId = org.provinceCode; - } + Object.keys(areaNames).forEach( + key => { + const value = areaNames[key]; + if ( value != null) { + switch (key) { + case 'provinceName' : + areas[0] = {label : value, value: org.provinceCode }; break; + case 'cityName' : + areas[1] = {label : value, value: org.cityCode }; break; + case 'areaName' : + areas[2] = {label : value, value: org.areaCode }; break; + } + } + } + ); } else { - this._areas = { label: '���������/���������/���������', value: [ 320000, 320500, 320583]}; - this.dataCondition.areaRange = AreaRange.AREA; - this.dataCondition.areaRangeId = 320583; + for (let i = 0; i < areas.length; i++) { + switch (i) { + case 0: + areas[0] = {label : '���������', value: 320000 }; break; + case 1: + areas[1] = {label : '���������', value: 320500 }; break; + case 2: + areas[2] = {label : '���������', value: 320583 }; break; + } + } } - // ������������������ - this.monitorPointsChange(); + this.setAreasData(areas); } } ); } - // ��������������������� ������ - public setAreaCodes(codes: string[]) { - this._areas.value = codes; - if (!!codes && !!codes.length) { - const n = codes.length; - if (this.dataCondition.areaRangeId !== Number(codes[n - 1])) { - this.dataCondition.areaRangeId = Number(codes[n - 1]); - let changeMonitorPoint = false; - switch (n) { - case 1: - this.dataCondition.areaRange = AreaRange.PROVINCE; - if (!this.monitorPoint || this.monitorPoint.provinceCode !== this.dataCondition.areaRangeId) { - changeMonitorPoint = true; - } - break; - case 2: - this.dataCondition.areaRange = AreaRange.CITY; - if (!this.monitorPoint || this.monitorPoint.cityCode !== this.dataCondition.areaRangeId) { - changeMonitorPoint = true; - } - break; - case 3: - this.dataCondition.areaRange = AreaRange.AREA; - if (!this.monitorPoint || this.monitorPoint.areaCode !== this.dataCondition.areaRangeId) { - changeMonitorPoint = true; - } - break; - } - if ( this.actualYearOptions.length === 0 || changeMonitorPoint) { - this.monitorPointsChange(); - this.monitorPoint = null; - } - } + public areaLazyLoad(event: { option: CascaderOption, index: number, resolve: (children: CascaderOption[]) => void, reject: () => void }) { + const index = event['index']; + const option = event.option; + switch (index) { + case -1: + this.areacodeService.getProvinces().subscribe( + (res: { label: string, value: string }[]) => { + event.resolve(res); + } + ); break; + case 0: + this.areacodeService.getCities(option.value).subscribe( + (res: { label: string, value: string }[]) => { + event.resolve(res); + } + ); break; + case 1: + this.areacodeService.getAreas(option.value).subscribe( + (res: { label: string, value: string }[]) => { + event.resolve(res); + } + ); break; } } - // ��������� ������ ��������� + // ��������������������� ��������� ��� ��������������������� + public setAreasData(areas: {label: string, value: string}[] ) { + let isChanged = false; + isChanged = areas.some( (item , index: number) => { + // this._areas[index] ���null ������ ��������������� + return this._areas.length < areas.length + || !this._areas[index] + || this._areas[index].value !== item.value; + }); + if ( isChanged ) { + this._areas = areas; + this.monitorPoint = null; + this.monitorPointsChange(); + } + } + + // ��������� ������ ���������, ������ ���������������������������null ������������������������������ public _monitorPoint: MonitorPoint; get monitorPoint(): MonitorPoint { return this._monitorPoint; } - set monitorPoint(value) { - if (!value || value !== this._monitorPoint ) { - this._monitorPoint = value; - if (!!value) { - this.dataCondition.areaRangeId = value.id; - this.dataCondition.areaRange = AreaRange.MONITORPOINT; - // ������������������������ - this._device = null; + set monitorPoint(value) { + if (!!value) { + // ������ ������������������ + if (this._monitorPoint !== value) { + this._monitorPoint = value; // ��������������������������������������������������������� this.devicesChange(); - } else { - // ���null ������ ��������������� - this.setAreaCodes(this._areas.value); - this._device = null; - this.deviceOptions = []; - } - } + } + // ������null ������������������������������ + } else { + this._monitorPoint = null; + this.device = null; + this.deviceOptions = null; + } + } // ��������� ������ ��������� public _device: Device; set device(val: Device) { this._device = val; - if (!!val) { - this.dataCondition.areaRange = AreaRange.DEVICE; - this.dataCondition.areaRangeId = val.id; - } else { - // ���������null ������������������������������ - this.monitorPoint = this._monitorPoint; - } } get device(): Device { @@ -293,26 +321,27 @@ ); } public setTimeUnit(val: {label: string, value: TimeUnits} ) { + this.tableWidth = this.tableWidthOption[val.value]; switch (val.value) { // YYYY-MM-DD HH:mm:ss case TimeUnits.MONTH: - this._timeType.dateFormat = 'YYYY'; + this._timeType.dateFormat = 'YYYY���'; // this._timeType.dateFormat = 'YYYY-MM'; // this._timeType.mode = 'month'; // this._timeType.endShowTime = null; break; case TimeUnits.DAY: - this._timeType.dateFormat = 'YYYY-MM'; + this._timeType.dateFormat = 'YYYY���MM���'; this._timeType.mode = 'month'; this._timeType.showTime = false; break; case TimeUnits.HOUR: - this._timeType.dateFormat = 'YYYY-MM-DD'; + this._timeType.dateFormat = 'YYYY���MM���DD���'; this._timeType.mode = 'day'; this._timeType.showTime = false; break; case TimeUnits.MINUTE: - this._timeType.dateFormat = 'YYYY-MM-DD HH'; + this._timeType.dateFormat = 'YYYY���MM���DD��� HH���'; this._timeType.mode = 'day'; this._timeType.showTime = { nzHideDisabledOptions: true, @@ -331,30 +360,6 @@ } }; break; - } - } - public areaLazyLoad(event: { option: CascaderOption, index: number, resolve: (children: CascaderOption[]) => void, reject: () => void }) { - const index = event['index']; - const option = event.option; - switch (index) { - case -1: - this.areacodeService.getProvinces().subscribe( - (res: { label: string, value: string }[]) => { - event.resolve(res); - } - ); break; - case 0: - this.areacodeService.getCities(option.value).subscribe( - (res: { label: string, value: string }[]) => { - event.resolve(res); - } - ); break; - case 1: - this.areacodeService.getAreas(option.value).subscribe( - (res: { label: string, value: string }[]) => { - event.resolve(res); - } - ); break; } } private newArray = (startOrLen: number, len?: number, prefix?: string, suffix?: string) => { @@ -378,11 +383,32 @@ this.grid.loading = true; this.sensorNameScrollLeft = '0px'; this.grid.data = []; - this.gridSensorNames = []; const start: Date = this.getPeriodDate(this.actualTime , 'start'); const end: Date = this.getPeriodDate(this.actualTime , 'end'); this.dataCondition['actualTime'] = null; this.dataCondition['timeUnits'] = this.timeUnit.value; + // ��������������� + const mptValue: number = !!this._monitorPoint ? this._monitorPoint.id : null; + const devValue: number = !!this._device ? this._device.id : null; + const areasData = [ devValue, mptValue, Number(this._areas.slice(-1).pop().value)]; + for (let index = 0 ; index < areasData.length ; index++) { + const item = areasData[index]; + if ( item !== null ) { + this.dataCondition.areaRangeId = item; + switch (index) { + case 0: this.dataCondition.areaRange = AreaRange.DEVICE; break; + case 1: this.dataCondition.areaRange = AreaRange.MONITORPOINT; break; + case 2: + switch (this._areas.length ) { + case 1: this.dataCondition.areaRange = AreaRange.PROVINCE; break; + case 2: this.dataCondition.areaRange = AreaRange.CITY; break; + case 3: this.dataCondition.areaRange = AreaRange.AREA; break; + } + break; + } + break; + } + } const dataConditions = [this.dataCondition]; const lineChartCriteria: LineChartCriteria = { sensorKeys: sensors, @@ -422,37 +448,35 @@ this.http.post(environment.SERVER_BASH_URL + '/report/line-chart', lineChartCriteria).subscribe( (res: ResultBean<{[key: string]: Array<Array<PairData>>}>) => { if (res.code === 1) { - let series = []; const data = res.data; if (!!data) { const sensorKeys = Object.keys(data); + // aqi������������������������������������ ��������� sensorKeys.forEach( key => { const sensor = (<Array<Sensor>>this.sensorOptions[0].children). find(item => { return item.sensorKey === key; }); - this.gridSensorNames.push(sensor.name); + let weight = this.aqiSort[key]; + weight = !!weight ? weight : 101; + // this.gridSensors.push(sensor); const sensorData = data[key][0].map( pair => { - return !!pair.value ? pair.value : '-'; + if (weight > 100) { + // pair.value ���null,������������ + weight = !!pair.value ? weight : weight + 1; + } + return !!pair.value ? String(Math.round(pair.value)) : '-'; } ); - this.grid.data.push(sensorData); + this.grid.data.push({sensor: sensor, data: sensorData, weight: weight}); } ); } + this.grid.data.sort( (a, b) => a.weight - b.weight ); this.grid.loading = false; - this.chartSelectedIndex = 0; - this.reloadChart(); - setTimeout(() => { - // ������������������ - series = [{type: 'line', data: this.grid.data[0]}]; - this.echartsIntance.setOption({ - series: series - }); - this.chartLoading = false; - }, 10); + this.switchSensor(0); } } ); @@ -463,73 +487,103 @@ ); } private reloadChart(): void { - const timeList = this.grid.columns.map(item => item.text); - const title = this.gridSensorNames[this.chartSelectedIndex]; - // if (!!this.echartsIntance) { - // this.chartOption = null; - // this.echartsIntance.clear(); + const timeList = this.grid.columns.map(item => item.text); + if (!!this.echartsIntance) { + this.chartOption = null; + this.echartsIntance.clear(); + } + // let series = null; + // if ( this.chartSelectedIndex < this.grid.data.length ) { + // series = [{type: 'line', data: this.grid.data[this.chartSelectedIndex]}]; // } - this.initOpton({title: title, xData: timeList}); + + this.initOpton({ xAxis : [{data : timeList}]}); this.chartLoading = true; } - private initOpton(opt: {title: string, xData: string[]}) { - this.chartOption = { - title: { - text: opt.title - }, - tooltip : { - trigger: 'axis', - axisPointer: { - type: 'cross', - label: { - backgroundColor: '#6a7985' - } - } - }, - legend: { - data: [] - }, - toolbox: { - feature: { - saveAsImage: {} - } - }, - grid: { - left: '3%', - right: '4%', - bottom: '3%', - containLabel: true - }, - xAxis : [ - { - type : 'category', - boundaryGap : false, - data : opt.xData - } - ], - yAxis : [ - { - type : 'value' - } - ], - series : [ - ] - }; + private initOpton(opt: {[key: string]: object}) { + const defaultOption = { + title: { + left: 'center' + }, + tooltip : { + trigger: 'axis', + axisPointer: { + type: 'cross', + label: { + backgroundColor: '#6a7985' + } + } + }, + legend: { + data: [] + }, + toolbox: { + feature: { + saveAsImage: {} + } + }, + grid: { + left: '3%', + right: '4%', + bottom: '3%', + containLabel: true + }, + xAxis : [ + { + type : 'category', + boundaryGap : false + } + ], + yAxis : [ + { + type : 'value' + } + ], + series : [ + ] + }; + $.extend(true, defaultOption, opt); + this.chartOption = defaultOption; + } + public get sensorUnit() { + return this.grid.data[this.chartSelectedIndex].sensor.unit; + } + public get chartTitle(): string { + const names = ['������', '������', '������', '������']; + switch ( this.dataCondition.areaRange ) { + case AreaRange.MONITORPOINT : + names[0] = '���������'; + names[1] = this._monitorPoint.name; break; + case AreaRange.DEVICE : + names[0] = '������'; + names[1] = this._device.name; break; + default : + names[0] = ''; + names[1] = this._areas.map( item => item.label).join('/'); + break; + } + names[2] = moment(this.actualTime).format(this._timeType.dateFormat); + names[3] = this.grid.data[this.chartSelectedIndex].sensor.name; + return names.join(' ') + ' ������'; } public switchSensor(index: number): void { this.chartSelectedIndex = index; this.chartLoading = true; - const title = this.gridSensorNames[this.chartSelectedIndex]; setTimeout(() => { - const series = [{type: 'line', data: this.grid.data[index]}]; + const series = [{type: 'line', data: this.grid.data[index].data}]; this.echartsIntance.setOption({ title: { - text: title + text: this.chartTitle }, - series: series + yAxis : [ + { + name : '���������' + this.sensorUnit + } + ], + series: series }); this.chartLoading = false; - }, 600); + }, 600); } private getPeriodDate(value: Date , type?: 'start'|'end' ): Date { let month = 0; -- Gitblit v1.8.0