Beispiel #1
0
        private AnalysisModel Analysis(bool uniq = false)
        {
            var all = InterviewBll.SqlQuery <InterviewAnalysisDto>("select id,ip,BrowserType,Province,ViewTime,OnlineSpanSeconds from Interview ORDER BY ViewTime desc").ToList();
            //var unique = InterviewBll.SqlQuery<InterviewAnalysisDto>("select ip,BrowserType,Province,ViewTime,OnlineSpanSeconds from Interview where Id in(select max(Id) from Interview group by ip ) ORDER BY ViewTime desc").ToList();
            var unique   = all.GroupBy(i => i.IP).Select(g => g.LastOrDefault()).ToList();
            var entities = uniq ? unique : all;
            var dap      = InterviewBll.SqlQuery <BounceRate>(@"DECLARE @a float DECLARE @b int
                                                                        SET @a=((SELECT count(1) from (SELECT interviewid FROM InterviewDetail GROUP BY interviewid HAVING count(1)=1) as t)*1.0)
                                                                        SET @b=(SELECT count(1) from (SELECT interviewid FROM InterviewDetail GROUP BY interviewid) as t)
                                                                        SET @b=case when @b=0 then 1 else @b end
                                                                        SELECT @a Dap,@b [All],@a/@b Result").FirstOrDefault();                                                                                                                                                                                                                                                                                                                       //计算跳出率
            var dapAgg   = InterviewBll.SqlQuery <BounceRateAggregate>("SELECT CONVERT(datetime,t.tt) [Time],sum(CASE WHEN t.c=1 THEN 1 ELSE 0 END) as Dap,count(t.c) as [All],sum(CASE WHEN t.c=1 THEN 1 ELSE 0 END)*1.0/count(t.c) as Rate from (SELECT interviewid,convert(char(10),[Time],23) tt,count(InterviewId) c FROM [dbo].[InterviewDetail] GROUP BY convert(char(10),[Time],23),InterviewId) as t GROUP BY t.tt ORDER BY Time").ToList(); //每日跳出率统计
            //今日统计
            var todaypv = all.Count(i => i.ViewTime >= DateTime.Today);
            var todayuv = unique.Count(i => i.ViewTime >= DateTime.Today);

            //本月统计
            var monthStart = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
            var monthpv    = all.Count(i => i.ViewTime >= monthStart);
            var monthuv    = unique.Count(i => i.ViewTime >= monthStart);

            //YTD统计
            var yearStart = new DateTime(DateTime.Now.Year, 1, 1);
            var yearpv    = all.Count(i => i.ViewTime >= yearStart);
            var yearuv    = unique.Count(i => i.ViewTime >= yearStart);

            //完全统计
            var totalpv = all.Count;
            var totaluv = unique.Count;
            var client  = new List <object>();
            var region  = new List <object>();

            //省份和世界地区统计
            entities.Where(i => i.Province != "XX").GroupBy(i => i.Province).OrderBy(g => Guid.NewGuid()).ForEach(g =>
            {
                if (string.IsNullOrEmpty(g.Key))
                {
                    return;
                }
                string name;
                if (g.Key.Contains("新疆"))
                {
                    name = "新疆";
                }
                else if (g.Key.Contains("广西"))
                {
                    name = "广西";
                }
                else if (g.Key.Contains("西藏"))
                {
                    name = "西藏";
                }
                else if (g.Key.Contains("香港"))
                {
                    name = "香港";
                }
                else if (g.Key.Contains("澳门"))
                {
                    name = "澳门";
                }
                else if (g.Key.Contains("内蒙古"))
                {
                    name = "内蒙古";
                }
                else if (g.Key.Contains("宁夏"))
                {
                    name = "宁夏";
                }
                else if (g.Key.Contains("海南"))
                {
                    name = "海南";
                }
                else if (g.Key.Contains("台湾"))
                {
                    name = "台湾";
                }
                else if (g.Key.Contains("省"))
                {
                    name = g.Key.Replace("省", "");
                }
                else if (g.Key.Contains("市"))
                {
                    name = g.Key.Replace("市", "");
                }
                else if (g.Key.Contains("XX"))
                {
                    return;
                }
                else
                {
                    name = g.Key;
                }
                client.Add(new
                {
                    name,
                    value = g.Count()
                });
                region.Add(new dynamic[]
                {
                    name,
                    g.Count()
                });
            });
            var browser = entities.GroupBy(i => i.BrowserType).OrderBy(g => g.Key).Select(g => new object[]
            {
                g.Key,
                g.Count()
            }).ToList();
            var reduce = all.OrderBy(i => i.ViewTime).GroupBy(i => i.ViewTime.Date).Select(g => new
            {
                g.Key,
                pv = g.Count(),
                uv = g.DistinctBy(i => i.IP).Count()
            }).ToList(); //汇总统计

            //找出PV最高的一天
            var p      = reduce.FirstOrDefault(e => e.pv == reduce.Max(a => a.pv));
            var highpv = new
            {
                date = p.Key,
                p.pv,
                p.uv
            };

            //找出UV最高的一天
            var u      = reduce.FirstOrDefault(e => e.uv == reduce.Max(a => a.uv));
            var highuv = new
            {
                date = u.Key,
                u.pv,
                u.uv
            };

            //汇总统计
            var pv = reduce.Select(g => new List <object>
            {
                g.Key.GetTotalMilliseconds(),
                g.pv
            }).ToList(); //每日PV
            var uv = reduce.Select(g => new List <object>
            {
                g.Key.GetTotalMilliseconds(),
                g.uv
            }).ToList(); //每日UV
            var iv = all.OrderBy(i => i.ViewTime).DistinctBy(e => e.IP).GroupBy(i => i.ViewTime.Date).Select(g => new List <object>
            {
                g.Key.GetTotalMilliseconds(),
                g.Count()
            }).ToList(); //每日新增独立访客

            //访问时长统计
            InterviewAnalysisDto maxSpanViewer      = all.OrderByDescending(i => i.OnlineSpanSeconds).FirstOrDefault();                                               //历史最久访客
            InterviewAnalysisDto maxSpanViewerToday = all.Where(i => DateTime.Today == i.ViewTime.Date).OrderByDescending(i => i.OnlineSpanSeconds).FirstOrDefault(); //今日最久访客
            double average  = 0;
            double average2 = 0;

            if (all.Any(i => DateTime.Today == i.ViewTime.Date && i.OnlineSpanSeconds > 0))
            {
                average  = all.Where(i => i.OnlineSpanSeconds > 0).Average(i => i.OnlineSpanSeconds);
                average2 = all.Where(i => DateTime.Today == i.ViewTime.Date && i.OnlineSpanSeconds > 0).Average(i => i.OnlineSpanSeconds);
            }
            var averSpan      = TimeSpan2String(TimeSpan.FromSeconds(average));  //平均访问时长
            var averSpanToday = TimeSpan2String(TimeSpan.FromSeconds(average2)); //今日访问时长

            BounceRateAggregate todayDap = dapAgg.LastOrDefault();

            return(new AnalysisModel()
            {
                Browser = browser,
                Client = client,
                Highpv = highpv,
                Highuv = highuv,
                Iv = iv,
                Monthpv = monthpv,
                Monthuv = monthuv,
                Pv = pv,
                Region = region,
                Todaypv = todaypv,
                Todayuv = todayuv,
                Totalpv = totalpv,
                Totaluv = totaluv,
                Uv = uv,
                Yearpv = yearpv,
                Yearuv = yearuv,
                BounceRate = $"{dap?.Dap}/{dap?.All}({dap?.Result:P})",
                BounceRateAggregate = dapAgg.Select(a => new object[]
                {
                    a.Time.GetTotalMilliseconds(),
                    a.Rate * 100
                }).ToList(),
                BounceRateToday = $"{todayDap?.Dap}/{todayDap?.All}({todayDap?.Rate:P})",
                OnlineSpanAggregate = new
                {
                    maxSpanViewerToday = new
                    {
                        maxSpanViewerToday?.IP,
                        maxSpanViewerToday?.BrowserType,
                        maxSpanViewerToday?.Province,
                        maxSpanViewerToday?.ViewTime,
                        OnlineSpanSeconds = TimeSpan2String(TimeSpan.FromSeconds(maxSpanViewerToday?.OnlineSpanSeconds ?? 0))
                    },
                    averSpanToday,
                    maxSpanViewer = new
                    {
                        maxSpanViewer?.IP,
                        maxSpanViewer?.BrowserType,
                        maxSpanViewer?.Province,
                        maxSpanViewer?.ViewTime,
                        OnlineSpanSeconds = TimeSpan2String(TimeSpan.FromSeconds(maxSpanViewer?.OnlineSpanSeconds ?? 0))
                    },
                    averSpan,
                }
            });
        }
        private (AnalysisModel, AnalysisModel) Analysis()
        {
            List <Interview> list;

            using (RedisHelper redisHelper = RedisHelper.GetInstance())
            {
                list = redisHelper.ListRange <Interview>($"Interview:{DateTime.Today:yyyy:MM:dd}");
                for (int i = -60; i < 0; i++)
                {
                    list.AddRange(redisHelper.ListRange <Interview>($"Interview:{DateTime.Today.AddDays(i):yyyy:MM:dd}"));
                }
                list = list.OrderBy(i => i.ViewTime).ToList();
            }
            if (!list.Any())
            {
                return(null, null);
            }
            CommonHelper.AverageCount = list.Count * 1.0 / list.GroupBy(i => i.ViewTime.Date).Count();
            var dap = list.Select(i =>
            {
                var(a, d) = (list.GroupBy(g => g.Uid).Count(), list.Count(g => g.InterviewDetails.Count == 1));
                return(new BounceRate()
                {
                    All = a,
                    Dap = d,
                    Result = d * 1.0 / a
                });
            }).FirstOrDefault();
            var dapAgg = list.GroupBy(i => i.ViewTime.Date).Select(gs =>
            {
                var(a, d) = (gs.GroupBy(g => g.Uid).Count(), gs.Count(g => g.InterviewDetails.Count == 1));
                return(new BounceRateAggregate()
                {
                    Time = gs.Key,
                    Dap = d,
                    All = a,
                    Rate = d * 1.0m / a
                });
            });
            int todaypv = list.Count(i => i.ViewTime >= DateTime.Today);
            int todayuv = list.DistinctBy(i => i.IP).Count(i => i.ViewTime >= DateTime.Today);

            //本月统计
            var monthStart = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
            int monthpv    = list.Count(i => i.ViewTime >= monthStart);
            int monthuv    = list.DistinctBy(i => i.IP).Count(i => i.ViewTime >= monthStart);

            ////YTD统计
            //var yearStart = new DateTime(DateTime.Now.Year, 1, 1);
            //int yearpv = list.Count(i => i.ViewTime >= yearStart);
            //int yearuv = list.DistinctBy(i => i.IP).Count(i => i.ViewTime >= yearStart);

            ////完全统计
            //int totalpv = list.Count();
            //int totaluv = list.DistinctBy(i => i.IP).Count();

            var allClient = new List <object>();
            var uniClient = new List <object>();
            var allRegion = new List <object>();
            var uniRegion = new List <object>();

            //省份和世界地区统计
            list.Where(i => !string.IsNullOrEmpty(i.Province)).GroupBy(i => i.Province).Select(gs => new KeyCount()
            {
                Key         = gs.Key,
                Count       = gs.Count(),
                UniqueCount = gs.DistinctBy(i => i.IP).Count()
            }).OrderBy(g => Guid.NewGuid()).ForEach(g =>
            {
                if (string.IsNullOrEmpty(g.Key))
                {
                    return;
                }
                string name;
                if (g.Key.Contains("新疆"))
                {
                    name = "新疆";
                }
                else if (g.Key.Contains("广西"))
                {
                    name = "广西";
                }
                else if (g.Key.Contains("西藏"))
                {
                    name = "西藏";
                }
                else if (g.Key.Contains("香港"))
                {
                    name = "香港";
                }
                else if (g.Key.Contains("澳门"))
                {
                    name = "澳门";
                }
                else if (g.Key.Contains("内蒙古"))
                {
                    name = "内蒙古";
                }
                else if (g.Key.Contains("宁夏"))
                {
                    name = "宁夏";
                }
                else if (g.Key.Contains("海南"))
                {
                    name = "海南";
                }
                else if (g.Key.Contains("台湾"))
                {
                    name = "台湾";
                }
                else if (g.Key.Contains("省"))
                {
                    name = g.Key.Replace("省", "");
                }
                else if (g.Key.Contains("市"))
                {
                    name = g.Key.Replace("市", "");
                }
                else if (g.Key.Contains("XX"))
                {
                    return;
                }
                else
                {
                    name = g.Key;
                }
                allClient.Add(new
                {
                    name,
                    value = g.Count
                });
                uniClient.Add(new
                {
                    name,
                    value = g.UniqueCount
                });
                allRegion.Add(new dynamic[]
                {
                    name,
                    g.Count
                });
                uniRegion.Add(new dynamic[]
                {
                    name,
                    g.UniqueCount
                });
            });
            var allBrowser = list.GroupBy(i => i.BrowserType).OrderBy(g => g.Key).Select(g => new object[]
            {
                g.Key,
                g.Count()
            }).ToList();
            var uniBrowser = list.GroupBy(i => i.BrowserType).OrderBy(g => g.Key).Select(g => new object[]
            {
                g.Key,
                g.DistinctBy(i => i.IP).Count()
            }).ToList();
            Dictionary <DateTime, int> dic = list.DistinctBy(i => i.IP).GroupBy(g => g.ViewTime.Date).ToDictionary(g => g.Key, g => g.Count());
            var reduce = list.GroupBy(i => i.ViewTime.Date).Select(g =>
            {
                var count = g.DistinctBy(i => i.IP).Count();
                return(new
                {
                    Date = g.Key,
                    TimeStamp = g.Key.GetTotalMilliseconds(),
                    pv = g.Count(),
                    uv = count,
                    iv = count - dic[g.Key]
                });
            }).ToList(); //汇总统计

            //找出PV最高的一天
            var p      = reduce.FirstOrDefault(e => e.pv == reduce.Max(a => a.pv));
            var highpv = new
            {
                date = p.Date,
                p.pv,
                p.uv
            };

            //找出UV最高的一天
            var u      = reduce.FirstOrDefault(e => e.uv == reduce.Max(a => a.uv));
            var highuv = new
            {
                date = u.Date,
                u.pv,
                u.uv
            };

            //汇总统计
            var pv = reduce.Select(g => new List <object>
            {
                g.TimeStamp,
                g.pv
            }).ToList(); //每日PV
            var uv = reduce.Select(g => new List <object>
            {
                g.TimeStamp,
                g.uv
            }).ToList(); //每日UV
            var iv = reduce.Select(g => new List <object>
            {
                g.TimeStamp,
                g.iv
            }).ToList();  //每日新增独立访客

            ////访问时长统计
            //InterviewAnalysisDto maxSpanViewer = list.OrderByDescending(i => i.OnlineSpanSeconds).Select(i => new InterviewAnalysisDto
            //{
            //    ViewTime = i.ViewTime,
            //    IP = i.IP,
            //    BrowserType = i.BrowserType,
            //    Province = i.Province,
            //    OnlineSpanSeconds = i.OnlineSpanSeconds
            //}).FirstOrDefault(); //历史最久访客
            //InterviewAnalysisDto maxSpanViewerToday = list.Where(i => i.ViewTime >= DateTime.Today).OrderByDescending(i => i.OnlineSpanSeconds).Select(i => new InterviewAnalysisDto
            //{
            //    ViewTime = i.ViewTime,
            //    IP = i.IP,
            //    BrowserType = i.BrowserType,
            //    Province = i.Province,
            //    OnlineSpanSeconds = i.OnlineSpanSeconds
            //}).FirstOrDefault(); //今日最久访客

            double average  = 0;
            double average2 = 0;

            if (list.Any(i => i.OnlineSpanSeconds > 0 && i.ViewTime >= DateTime.Today))
            {
                average  = list.Where(i => i.OnlineSpanSeconds > 0).Average(i => i.OnlineSpanSeconds);
                average2 = list.Where(i => i.OnlineSpanSeconds > 0 && i.ViewTime >= DateTime.Today).Average(i => i.OnlineSpanSeconds);
            }
            var averSpan      = TimeSpan2String(TimeSpan.FromSeconds(average));  //平均访问时长
            var averSpanToday = TimeSpan2String(TimeSpan.FromSeconds(average2)); //今日访问时长

            BounceRateAggregate todayDap = dapAgg.LastOrDefault();
            var all = new AnalysisModel()
            {
                Browser = allBrowser,
                Client  = allClient,
                Region  = allRegion,
                Highpv  = highpv,
                Highuv  = highuv,
                Iv      = iv,
                Monthpv = monthpv,
                Monthuv = monthuv,
                Pv      = pv,
                Todaypv = todaypv,
                Todayuv = todayuv,
                //Totalpv = totalpv,
                //Totaluv = totaluv,
                Uv = uv,
                //Yearpv = yearpv,
                //Yearuv = yearuv,
                BounceRate          = $"{dap?.Dap}/{dap?.All}({dap?.Result:P})",
                BounceRateAggregate = dapAgg.Select(a => new object[]
                {
                    a.Time.GetTotalMilliseconds(),
                    a.Rate * 100
                }).ToList(),
                BounceRateToday     = $"{todayDap?.Dap}/{todayDap?.All}({todayDap?.Rate:P})",
                OnlineSpanAggregate = new
                {
                    //maxSpanViewerToday = new
                    //{
                    //    maxSpanViewerToday?.IP,
                    //    maxSpanViewerToday?.BrowserType,
                    //    maxSpanViewerToday?.Province,
                    //    maxSpanViewerToday?.ViewTime,
                    //    OnlineSpanSeconds = TimeSpan2String(TimeSpan.FromSeconds(maxSpanViewerToday?.OnlineSpanSeconds ?? 0))
                    //},
                    averSpanToday,
                    //maxSpanViewer = new
                    //{
                    //    maxSpanViewer?.IP,
                    //    maxSpanViewer?.BrowserType,
                    //    maxSpanViewer?.Province,
                    //    maxSpanViewer?.ViewTime,
                    //    OnlineSpanSeconds = TimeSpan2String(TimeSpan.FromSeconds(maxSpanViewer?.OnlineSpanSeconds ?? 0))
                    //},
                    averSpan,
                }
            };
            var unique = all.Copy();

            unique.Browser = uniBrowser;
            unique.Client  = uniClient;
            unique.Region  = uniRegion;
            return(all, unique);
        }