Example #1
0
        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));
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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));
        }
Example #5
0
        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));
        }
Example #7
0
        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 });
        }
Example #8
0
        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);
        }
Example #9
0
        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
            });
        }