You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							453 lines
						
					
					
						
							15 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							453 lines
						
					
					
						
							15 KiB
						
					
					
				| var App = function () { | |
|     this.statisticGrid = $('#task-grid'); | |
|     this.selectedRow = []; | |
| 
 | |
|     this.Startup = function () { | |
|         $('#manage').addClass('active'); | |
|          | |
|         this.RedirectPage(); | |
|         this.ReLayout(); | |
|         this.InitDate(); | |
| 
 | |
|         $('.statistic-type span').on('click', this.OnStatisticTypeClick.bind(this)); | |
|         $('#query-btn').on('click', this.OnQueryButtonClick.bind(this)); | |
|         $('#query-btn').trigger('click'); | |
| 
 | |
|         window.onresize = this.ReLayout.bind(this); | |
|     }; | |
| 
 | |
|     this.RedirectPage = function () { | |
|         var user = document.getElementById('user-info'); | |
|         if (user.getAttribute('class') === 'user-login') | |
|             window.location.href = '/User/Login'; | |
|         else | |
|             return; | |
|     }; | |
| 
 | |
|     this.ReLayout = function () { | |
|         var width = $(window).width(); | |
|         var height = $(window).height(); | |
| 
 | |
|         $('.manage-table, .manage-table .datagrid').width(width - 267); | |
|         $('.manage-table, .manage-table .datagrid').height(height - 535); | |
|     }; | |
| 
 | |
|     this.OnStatisticTypeClick = function (event) { | |
|         $('.statistic-type span').removeClass("active"); | |
|         $(event.target).addClass("active"); | |
|     }; | |
| 
 | |
|     this.OnQueryButtonClick = function () { | |
|         this.ReloadChartData(); | |
|         this.InitDataGrid(); | |
|         this.ReLoadTableData(); | |
|     }; | |
| 
 | |
|     this.ReLoadTableData = function () { | |
|         this.statisticGrid.datagrid({ | |
|             method: "POST", | |
|             url: '/Task/GetList', | |
|             queryParams: { | |
|                 fromDate: this.GetParams().fromTime, | |
|                 toDate: this.GetParams().toTime | |
|             } | |
|         }); | |
|     }; | |
| 
 | |
|     this.InitDataGrid = function () { | |
|         this.statisticGrid.datagrid({ | |
|             columns: [[ | |
|                 { field: 'UserName', title: '用户名', align: 'center', width: 120 }, | |
|                 { field: 'CreateTime', title: '提交时间', align: 'center', width: 180, formatter: this.formatTime.bind(this) }, | |
|                 { field: 'ReleaseTime', title: '反馈时间', align: 'center', width: 180, formatter: this.formatTime.bind(this) }, | |
|                 { field: 'Params', title: '参数', align: 'center', width: 550, formatter: this.formatParams.bind(this) }, | |
|                 { field: 'OrgName', title: '计算状态', align: 'center', width: 100, formatter: this.formatState.bind(this) }, | |
|                 { field: 'Null', title: '', align: 'left' } | |
|             ]], | |
|             striped: true, | |
|             singleSelect: false, | |
|             fit: true, | |
|             scrollbarSize: 0, | |
|             pagination: true, | |
|             pageNumber: 1, | |
|             pageSize: 50, | |
|             pageList: [10, 20, 50, 100, 150, 200], | |
|             //onSelect: this.OnTaskSelected.bind(this), | |
|             //onUnselect: this.OnTaskUnselected.bind(this), | |
|             //onBeforeLoad: this.OnTableGridBeforeLoad.bind(this), | |
|             onLoadSuccess: function (data) { | |
|                 this.formatLastColumn(); | |
|             }.bind(this) | |
|         }); | |
|     }; | |
| 
 | |
|     this.ReloadChartData = function () { | |
|         $.ajax({ | |
|             type: "POST", | |
|             dataType: 'text', | |
|             url: '/StatisticAnalysis/Query', | |
|             data: this.GetParams(), | |
|             success: function (result) { | |
|                 var rows = JSON.parse(result).rows; | |
|                 var type = this.GetParams().typeCode === 'user' ? 'column' : 'spline';  | |
|                 var name = this.GetParams().typeCode === 'user' ? '根据用户' : '根据机构'; | |
|                 var xAxises = this.GetSeries(rows, name).xAxises; | |
|                 var max = this.GetSeries(rows, name).max; | |
|                 var pieValues = this.GetSeries(rows, name).pieSeries; | |
|                 var defaultValues = this.GetSeries(rows, name).defaultSeries; | |
| 
 | |
|                 var defaultData = this.GetElement(type, name, defaultValues); | |
|                 var pieData = this.GetElement('pie', '占比', pieValues); | |
| 
 | |
|                 this.InitChart(defaultData, xAxises, rows, name, max); | |
|                 this.InitPieChart(pieData, name); | |
|             }.bind(this) | |
|         }); | |
|     }; | |
| 
 | |
|     this.GetElement = function (type, name, values) { | |
|         return { | |
|             type: type, | |
|             name: name, | |
|             data: values | |
|         }; | |
|     }; | |
| 
 | |
|     this.GetSeries = function (result, name) { | |
|         var max = null; | |
|         var xAxises = []; | |
|         var count = []; | |
|         var pieSeries = []; | |
|         var defaultSeries = []; | |
|          | |
|         result.forEach(function (item, index) { | |
|             count.push(item.ComputeCount); | |
|         }.bind(this)); | |
| 
 | |
|         result.forEach(function (item, index) { | |
|             var sum = count.reduce(function (prev, next) { return prev + next; }); | |
| 
 | |
|             max = count.reduce(function (prev, cur) { return Math.max(prev, cur); }); | |
| 
 | |
|             xAxises.push(name === '根据用户' ? item.UserName : item.OrgName); | |
|             defaultSeries.push(item.ComputeCount); | |
|             pieSeries.push({ | |
|                 name: name === '根据用户' ? item.UserName : item.OrgName, | |
|                 y: this.formatDecimal(String(item.ComputeCount / sum) / 100) * 100 | |
|             }); | |
|         }.bind(this)); | |
| 
 | |
|         return { | |
|             max: max, | |
|             xAxises: xAxises, | |
|             pieSeries: pieSeries, | |
|             defaultSeries: defaultSeries | |
|         }; | |
|     }; | |
| 
 | |
|     this.formatDecimal = function (value) { | |
|         value = value.toString(); | |
|         let index = value.indexOf('.'); | |
|         if (index !== -1) { | |
|             value = value.substring(0, 5 + index + 1); | |
|         } else { | |
|             value = value.substring(0); | |
|         } | |
|         return parseFloat(value).toFixed(5); | |
|     }; | |
| 
 | |
|     this.InitChart = function (series, xAxises, values, name, max) { | |
|         Highcharts.chart('chart', { | |
|             chart: { | |
|                 backgroundColor: 'rgba(0, 0, 0, 0)' | |
|             }, | |
|             title: { | |
|                 useHTML: true, | |
|                 text: name.slice(2) + '计算次数统计' + '<br/>' + moment(this.GetParams().fromTime).format('YYYY年MM月DD日') + ' 至 ' + moment(this.GetParams().toTime).format('YYYY年MM月DD日'), | |
|                 style: { | |
|                     color: '#ffffff', | |
|                     fontFamily: '微软雅黑' | |
|                 } | |
|             }, | |
|             subtitle: { | |
|                 text: '计算次数', | |
|                 style: { | |
|                     color: '#ffffff', | |
|                     fontSize: '14px', | |
|                     fontFamily: '微软雅黑' | |
|                 }, | |
|                 verticalAlign: 'top', | |
|                 align: 'left', | |
|                 y: 50 | |
|             }, | |
|             credits: { | |
|                 enabled: false | |
|             }, | |
|             colors: ['#00d5f6'], | |
|             xAxis: { | |
|                 categories: xAxises, | |
|                 labels: { | |
|                     style: { | |
|                         color: '#ffffff', | |
|                         fontSize: '14px', | |
|                         fontFamily: '微软雅黑' | |
|                     } | |
|                 }, | |
|                 lineColor: '#234979', | |
|                 crosshair: true | |
|             }, | |
|             yAxis: { | |
|                 title: { | |
|                     text: null | |
|                 }, | |
|                 //max: max * 3, | |
|                 labels: { | |
|                     style: { | |
|                         color: '#ffffff', | |
|                         fontSize: '14px', | |
|                         fontFamily: '微软雅黑' | |
|                     } | |
|                 }, | |
|                 gridLineColor: '#234979' | |
|             }, | |
|             tooltip: { | |
|                 useHTML: true, | |
|                 shared: true, | |
|                 backgroundColor: '#002145', | |
|                 style: { | |
|                     color: '#ffffff', | |
|                     fontSize: '14px', | |
|                     fontFamily: '微软雅黑' | |
|                 }, | |
|                 formatter: function () { | |
|                     return '<b style="margin-bottom: 5px">' + this.x + '</b>' + '<br/>' + | |
|                         '计算次数:' + '<b>' + this.y + '</b>' + '次' + '<br/>' + | |
|                         '最后计算时间:' + app.GetNames(values, this.x, name); | |
|                 } | |
|             }, | |
|             legend: { | |
|                 itemStyle: { | |
|                     color: '#ffffff', | |
|                     fontSize: '14px', | |
|                     fontFamily: '微软雅黑' | |
|                 }, | |
|                 itemHoverStyle: { | |
|                     color: '#ffffff', | |
|                     fontSize: '14px', | |
|                     fontFamily: '微软雅黑' | |
|                 } | |
|             }, | |
|             plotOptions: { | |
|                 column: { | |
|                     pointWidth: 30, | |
|                     borderRadius: 3, | |
|                     borderColor: '' | |
|                 }, | |
|                 pie: { | |
|                     center: [1000, 100], | |
|                     size: 200, | |
|                     tooltip: { | |
|                         headerFormat: '<b>{point.key}</b></br>', | |
|                         pointFormat: '{series.name}: <b>{point.percentage:.2f}%</b>', | |
|                         useHTML: true, | |
|                         crosshair: true, | |
|                         backgroundColor: '#002145', | |
|                         style: { | |
|                             color: '#ffffff', | |
|                             fontSize: '14px', | |
|                             fontFamily: '微软雅黑' | |
|                         } | |
|                     } | |
|                 }, | |
|                 series: { | |
|                     color: { | |
|                         linearGradient: { | |
|                             x1: 0, | |
|                             y1: 0, | |
|                             x2: 0, | |
|                             y2: 1 | |
|                         }, | |
|                         stops: [ | |
|                             [0, '#266cb9'], | |
|                             [1, '#00d5f6'] | |
|                         ] | |
|                     } | |
|                 } | |
|             }, | |
|             series: [series] | |
|         }); | |
|     }; | |
| 
 | |
|     this.GetNames = function (values, name, type) { | |
|         var time = values.find(function (item) { | |
|             return (type === '根据用户' ? item.UserName : item.OrgName) === name; | |
|         }).LastComputeTime; | |
|         return moment(time).format('YYYY-MM-DD'); | |
|     }; | |
| 
 | |
|     this.InitPieChart = function (series, name) { | |
|         Highcharts.chart('pie-chart', { | |
|             chart: { | |
|                 backgroundColor: 'rgba(0, 0, 0, 0)', | |
|                 type: 'pie' | |
|             }, | |
|             title: { | |
|                 text: name.slice(2) + '占比', | |
|                 style: { | |
|                     color: '#ffffff', | |
|                     fontFamily: '微软雅黑' | |
|                 }, | |
|                 y: 30 | |
|             }, | |
|             credits: { | |
|                 enabled: false | |
|             }, | |
|             tooltip: { | |
|                 headerFormat: '<b>{point.key}</b></br>', | |
|                 pointFormat: '{series.name}: <b>{point.percentage:.2f}%</b>', | |
|                 useHTML: true, | |
|                 crosshair: true, | |
|                 backgroundColor: '#002145', | |
|                 style: { | |
|                     color: '#ffffff', | |
|                     fontSize: '14px', | |
|                     fontFamily: '微软雅黑' | |
|                 } | |
|             }, | |
|             legend: { | |
|                 itemStyle: { | |
|                     color: '#ffffff', | |
|                     fontFamily: '微软雅黑' | |
|                 }, | |
|                 itemHoverStyle: { | |
|                     color: '#ffffff', | |
|                     fontSize: '14px', | |
|                     fontFamily: '微软雅黑' | |
|                 } | |
|             }, | |
|             plotOptions: { | |
|                 pie: { | |
|                     allowPointSelect: true, | |
|                     borderWidth: 0, | |
|                     cursor: 'pointer', | |
|                     dataLabels: { | |
|                         useHTML: true, | |
|                         enabled: true, | |
|                         color: '#ffffff', | |
|                         style: { | |
|                             fontSize: '14px', | |
|                             fontFamily: '微软雅黑', | |
|                             textOutline: 'none' | |
|                         }, | |
|                         formatter: function () { | |
|                             return '<span style="color: ' + (typeof this.color === 'string' ? this.color : this.color.stops[1][1]) + '">' + this.point.name + '</span>'; | |
|                         } | |
|                     }, | |
|                     showInLegend: false | |
|                 } | |
|             }, | |
|             series: [series] | |
|         },function (chart) { | |
|             this.SetGradientColor(chart); | |
|         }.bind(this)); | |
|     }; | |
| 
 | |
|     this.SetGradientColor = function (chart) { | |
|         var pointsList = chart.series[0].points; | |
|         for (var i = 0; i < pointsList.length; i++) { | |
|             chart.series[0].points[i].update({ | |
|                 color: { | |
|                     linearGradient: { x1: 0, y1: 1, x2: 0, y2: 0 }, | |
|                     stops: [ | |
|                         [0, Highcharts.Color(i === 0 ? '#00d5f6' : '#fafafa').setOpacity(1).get('rgba')], | |
|                         [1, i === 0 ? '#266cb9' : app.GetRandomColor()] | |
|                     ] | |
|                 } | |
|             }); | |
|         } | |
|     } | |
| 
 | |
|     this.GetRandomColor = function () { | |
|         var r = Math.floor(Math.random() * 255); | |
|         var g = Math.floor(Math.random() * 255); | |
|         var b = Math.floor(Math.random() * 255); | |
|         return "rgb(" + r + ',' + g + ',' + b + ")"; | |
|     }; | |
| 
 | |
|     this.InitDate = function () { | |
|         $('#from-date').datebox({ | |
|             panelAlign: 'right', | |
|             panelWidth: 200, | |
|             panelHeight: 230, | |
|             showSeconds: false, | |
|             currentText: '现在', | |
|             onSelect: function (date) { | |
|                 var startTime = date.getTime(); | |
|                 var endDate = $('#to-date').val(); | |
| 
 | |
|                 if (endDate) { | |
|                     var endTime = new Date(endDate).getTime(); | |
|                     if (startTime > endTime) | |
|                         alert('开始日期不能大于结束日期,请重新选择。'); | |
|                 } | |
|             } | |
|         }); | |
| 
 | |
|         $('#to-date').datebox({ | |
|             panelWidth: 190, | |
|             panelHeight: 230, | |
|             panelAlign: 'right', | |
|             showSeconds: false, | |
|             currentText: '现在', | |
|             onSelect: function (date) { | |
|                 var endTime = date.getTime(); | |
|                 var startDate = $('#from-date').val(); | |
| 
 | |
|                 if (startDate) { | |
|                     var startTime = new Date(startDate).getTime(); | |
|                     if (startTime > endTime) | |
|                         alert('结束日期不能小于开始日期,请重新选择。'); | |
|                 } | |
|             } | |
|         }); | |
| 
 | |
|         $("#from-date").datebox('setValue', moment().add(-30, 'days').format('YYYY/MM/DD')); | |
|     }; | |
| 
 | |
|     this.GetParams = function () { | |
|         return { | |
|             typeCode: $('.statistic-type span.active').attr('type'), | |
|             fromTime: $("#from-date").datetimebox('getValue'), | |
|             toTime: $("#to-date").datetimebox('getValue'), | |
|             page: 1, | |
|             rows: 1000 | |
|         }; | |
|     }; | |
| 
 | |
|     this.formatTime = function (time) { | |
|         return '<span>{0}</span>'.format(moment(time).format('YYYY/MM/DD HH:mm:ss')); | |
|     }; | |
| 
 | |
|     this.formatParams = function (params, row) { | |
|         return '<span>{0}(经度)、{1}(纬度)、{2}米(高度)、{3}分钟(模拟时长)、{4}分钟(分段时长)</span>'.format(row.Longitude, row.Latitude, row.Height, row.SimulatedDuration, row.SimulatedInterval); | |
|     }; | |
| 
 | |
|     this.formatState = function () { | |
|         return ''; | |
|     }; | |
| 
 | |
|     this.formatLastColumn = function () { | |
|         var width = $('.container').width(); | |
|         var headerTable = $('.datagrid-header'); | |
|         var bodyTable = $('.datagrid-body'); | |
|         var headerTd = headerTable.find('td:last'); | |
|         headerTd.css('width', width - 1130 + 'px'); | |
|         bodyTable.find('tr').find('td:last').css('width', width - 1130 + 'px'); | |
|     }; | |
| }; | |
| 
 | |
| var app = null; | |
| $(document).ready(function () { | |
|     app = new App(); | |
|     app.Startup(); | |
| }); |