public async Task <ChartData> LostStatistics([FromBody] PluginRequestInfo request, CancellationToken token) { var startTime = request.GetParameterValue <DateTime>("startDate", DateTime.UtcNow.Date.AddDays(-7)).ToUniversalTime(); var endTime = request.GetParameterValue <DateTime>("endDate", DateTime.UtcNow.Date).ToUniversalTime(); return(await this.GetStayLostStatisticsData2(startTime, endTime, false, token)); }
public async Task <ChartData> ActiveUserStatistics([FromBody] PluginRequestInfo request, CancellationToken token) { var startTime = request.GetParameterValue <DateTime>("startDate", DateTime.UtcNow.Date.AddDays(-7)).ToUniversalTime(); var endTime = request.GetParameterValue <DateTime>("endDate", DateTime.UtcNow.Date).ToUniversalTime(); // for the end time, we should always add 1 day. var queryEndTime = endTime.AddDays(1); var loginRecords = await this.UCenterEventDatabase.AccountEvents.GetListAsync( e => (e.EventName == "Login" || e.EventName == "GuestLogin") && (e.CreatedTime >= startTime && e.CreatedTime < queryEndTime), token); var groups = loginRecords.GroupBy(e => e.CreatedTime.ToLocalTime().Date).ToList(); var result = new ChartData(); var datas = new List <float>(); startTime = startTime.ToLocalTime(); endTime = endTime.ToLocalTime(); for (var date = startTime.Date; date <= endTime.Date; date = date.AddDays(1)) { var group = groups.FirstOrDefault(g => g.Key == date); result.Labels.Add(date.ToString("yyyy/MM/dd")); datas.Add(group == null ? 0 : group.Select(g => g.AccountId).Distinct().Count()); } result.Data.Add(datas); result.Series.Add("活跃用户"); return(result); }
public async Task <ChartData> NewUserStatistics([FromBody] PluginRequestInfo request, CancellationToken token) { var today = DateTime.UtcNow.Date; var yesterDay = today.AddDays(-1); var last7Day = today.AddDays(-7); var latest30Days = today.AddDays(-30); var dates = request.GetParameterValue <DateTime[]>("dates", new DateTime[] { }); dates = dates.Select(d => d.ToUniversalTime()).ToArray(); var labels = ParallelEnumerable.Range(0, 24).Select(i => i > 9 ? $"{i}:00" : $"0{i}:00").ToList(); var series = new List <string>(); var chartData = new ChartData(); chartData.Labels = labels; chartData.Data.Add(await this.GetHourlyUserStatisticsData(today, today.AddDays(1), token)); chartData.Series.Add("today"); chartData.Data.Add(await this.GetHourlyUserStatisticsData(yesterDay, today, token)); chartData.Series.Add("yesterday"); chartData.Data.Add(await this.GetHourlyUserStatisticsData(last7Day, today, token)); chartData.Series.Add("last7 days"); chartData.Data.Add(await this.GetHourlyUserStatisticsData(latest30Days, today, token)); chartData.Series.Add("latest30 days"); foreach (var date in dates) { chartData.Data.Add(await this.GetHourlyUserStatisticsData(date, date.AddDays(1), token)); chartData.Series.Add(date.ToString("YYYY/MM/dd")); } return(chartData); }
public async Task <ChartData> UserStatistics2([FromBody] PluginRequestInfo request, CancellationToken token) { var startTime = request.GetParameterValue <DateTime>("startDate", DateTime.UtcNow.AddYears(-1)).ToUniversalTime(); var endTime = request.GetParameterValue <DateTime>("endDate", DateTime.UtcNow).ToUniversalTime(); string type = request.GetParameterValue <string>("type", "day"); bool isStay = request.GetParameterValue <bool>("isStay"); return(await this.GetStayLostStatisticsData(startTime, endTime, type, isStay, token)); }
public async Task <NewUserStatisticsData> NewUsers([FromBody] PluginRequestInfo request, CancellationToken token) { var startTime = request.GetParameterValue <DateTime>("startDate", DateTime.UtcNow.AddYears(-1)).ToUniversalTime(); var endTime = request.GetParameterValue <DateTime>("endDate", DateTime.UtcNow).ToUniversalTime(); var result = new NewUserStatisticsData(); result.HourlyNewUsers = await this.GetHourlyNewUserChartData(startTime, endTime, token); return(result); }
public async Task <object> Post([FromBody] PluginRequest request, CancellationToken token) { var client = this.manager.GetClient(request.PluginName); var item = this.manager.GetPluginItem(request.PluginName, request.CategoryName, request.ItemName); var parameters = request.Content .Select(kv => new PluginRequestParameter() { Name = kv.Key, Value = kv.Value }) .ToList(); var requestInfo = new PluginRequestInfo(request.Method, parameters); return(await client.SendAsync <PluginRequestInfo, object>(item, requestInfo, token)); }
public IReadOnlyList <object> GetDataForDemoReport([FromBody] PluginRequestInfo request) { var pieData = new { Labels = ParallelEnumerable.Range(0, 24).Select(i => i.ToString()).ToArray(), Series = new string[] { "小时数值" }, Data = this.RandomNumbers(24), }; var lineData = new { Labels = new string[] { "男", "女" }, Data = this.RandomNumbers(2), }; return(new object[] { pieData, lineData }); }
public async Task <ChartData> NewUserAndDeviceStatistics([FromBody] PluginRequestInfo request, CancellationToken token) { var startTime = request.GetParameterValue <DateTime>("startDate", DateTime.UtcNow.Date.AddDays(-7)).ToUniversalTime(); var endTime = request.GetParameterValue <DateTime>("endDate", DateTime.UtcNow.Date).ToUniversalTime(); // should always query to the day next to endTime. var queryEndTime = endTime.AddDays(1); var users = await this.UCenterEventDatabase.AccountEvents.GetListAsync( e => (e.EventName == "Register" || e.EventName == "GuestRegister") && (e.CreatedTime >= startTime && e.CreatedTime < queryEndTime), token); var devices = await this.UCenterDatabase.Devices.GetListAsync(d => d.CreatedTime >= startTime && d.CreatedTime < queryEndTime, token); var userGroups = users.GroupBy(u => u.CreatedTime.ToLocalTime().Date).ToList(); var deviceGroups = devices.GroupBy(d => d.CreatedTime.ToLocalTime().Date).ToList(); startTime = startTime.ToLocalTime(); endTime = endTime.ToLocalTime(); var result = new ChartData(); var userData = new List <float>(); var deviceData = new List <float>(); for (var date = startTime.Date; date <= endTime.Date; date = date.AddDays(1)) { var userGroup = userGroups.FirstOrDefault(g => g.Key == date); var deviceGroup = deviceGroups.FirstOrDefault(d => d.Key == date); result.Labels.Add(date.ToString("yyyy/MM/dd")); userData.Add(userGroup == null ? 0 : userGroup.Count()); deviceData.Add(deviceGroup == null ? 0 : deviceGroup.Count()); } result.Data.Add(userData); result.Data.Add(deviceData); result.Series.Add("新增用户"); result.Series.Add("新增设备"); return(result); }
public async Task <UserStatisticsData> UserStatistics([FromBody] PluginRequestInfo request, CancellationToken token) { var startDate = request.GetParameterValue <DateTime>("startDate", DateTime.UtcNow.AddYears(-1)).ToUniversalTime(); var endDate = request.GetParameterValue <DateTime>("endDate", DateTime.UtcNow).ToUniversalTime(); var startTime = request.GetParameterValue <DateTime>("startTime", DateTime.UtcNow.AddYears(-1)).ToUniversalTime(); var endTime = request.GetParameterValue <DateTime>("endTime", DateTime.UtcNow).ToUniversalTime(); string type = request.GetParameterValue <string>("type", "day"); var startDateTime = startDate.Date + startTime.TimeOfDay; var endDateTime = endDate.Date + endTime.TimeOfDay; var loginRecords = await this.UCenterEventDatabase.AccountEvents.GetListAsync( e => e.EventName == "Login" && e.CreatedTime >= startDateTime && e.CreatedTime <= endDateTime, token); IEnumerable <IGrouping <DateTime, AccountEventEntity> > groups = null; if (type == "day") { groups = loginRecords.GroupBy(e => e.CreatedTime.Date); } else if (type == "week") { groups = loginRecords.GroupBy(e => e.CreatedTime.Date.AddDays(-1 * (int)(e.CreatedTime.Date.DayOfWeek))); } else if (type == "month") { groups = loginRecords.GroupBy(e => e.CreatedTime.Date.AddDays(-1 * e.CreatedTime.Date.Day + 1)); } groups = groups.OrderBy(g => g.Key); List <string> previousUsers = null; float ratio = 1; var remainRate = new ChartData(); var remainDatas = new List <float>(); foreach (var group in groups) { if (previousUsers == null || previousUsers.Count == 0) { ratio = 1; previousUsers = group.Select(g => g.AccountId).Distinct().ToList(); } else { var currentUsers = group.Select(g => g.AccountId).Distinct().ToList(); var remainUserCount = currentUsers.Count - currentUsers.Except(previousUsers).Count(); ratio = 100 * (float)Math.Round((double)remainUserCount / previousUsers.Count, 2); previousUsers = currentUsers; } remainDatas.Add(ratio); remainRate.Labels.Add(group.Key.ToString("yyyy/MM/dd")); } remainRate.Data.Add(remainDatas); remainRate.Series.Add("留存率"); var lostRate = new ChartData() { Data = new List <List <float> >() { remainDatas.Select(d => 100 - d).ToList() }, Labels = remainRate.Labels, Series = new List <string>() { "流失率" } }; var lifeCycleRate = new ChartData() { Data = lostRate.Data.Select(raw => raw.Select(d => d == 0 ? 0 : 1 / d).ToList()).ToList(), Labels = remainRate.Labels, Series = new List <string>() { "生命周期" } }; return(new UserStatisticsData() { RemainRate = await this.GetStayLostStatisticsData(startTime, endTime, type, true, token), LostRate = lostRate, LifeCycle = lifeCycleRate }); }