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

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();
});