Пример #1
0
        /// <summary>根据模型查找</summary>
        /// <param name="model"></param>
        /// <param name="cache"></param>
        /// <returns></returns>
        public static VisitStat FindByModel(VisitStatModel model, Boolean cache)
        {
            if (model == null)
            {
                return(null);
            }

            if (cache)
            {
                if (_cache.FindMethod == null)
                {
                    _cache.FindMethod = m => FindByModel(m, false);
                }

                return(_cache[model]);
            }

            var exp = new WhereExpression();

            exp &= _.Level == model.Level;
            if (model.Level > 0 && model.Time > DateTime.MinValue)
            {
                exp &= _.Time == model.GetDate(model.Level);
            }
            exp &= _.Page == model.Page;

            return(Find(exp));
        }
Пример #2
0
        /// <summary>高级查询访问统计</summary>
        /// <param name="model"></param>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <param name="param"></param>
        /// <returns></returns>
        public static IList <VisitStat> Search(VisitStatModel model, DateTime start, DateTime end, PageParameter param)
        {
            var exp = new WhereExpression();

            if (model.Level >= 0)
            {
                exp &= _.Level == model.Level;
            }
            if (model.Level > 0 && model.Time > DateTime.MinValue)
            {
                exp &= _.Time == model.GetDate(model.Level);
            }
            if (!model.Page.IsNullOrEmpty())
            {
                exp &= _.Page == model.Page;
            }

            exp &= _.Time.Between(start, end);

            return(FindAll(exp, param));
        }
Пример #3
0
        /// <summary>业务统计</summary>
        /// <param name="model">模型</param>
        /// <param name="levels">要统计的层级</param>
        /// <returns></returns>
        public static void Process(VisitStatModel model, params StatLevels[] levels)
        {
            model = model.Clone();

            if (levels == null || levels.Length == 0)
            {
                levels = new[] { StatLevels.Day, StatLevels.Month, StatLevels.Year }
            }
            ;

            // 当前
            var list = model.Split(levels);

            // 全局
            if (!model.Page.IsNullOrEmpty())
            {
                model.Page = "全部";

                list.AddRange(model.Split(levels));
            }

            // 并行处理
            Parallel.ForEach(list, m => ProcessItem(m as VisitStatModel));
        }
Пример #4
0
        private static VisitStat ProcessItem(VisitStatModel model)
        {
            var st = StatHelper.GetOrAdd(model, FindByModel, e =>
            {
                e.Page = model.Page;
            });

            if (st == null)
            {
                return(null);
            }

            // 历史平均
            if (st.Cost > 0)
            {
                st.Cost = (Int32)Math.Round(((Double)st.Cost * st.Times + model.Cost) / (st.Times + 1));
            }
            else
            {
                st.Cost = model.Cost;
            }
            if (model.Cost > st.MaxCost)
            {
                st.MaxCost = model.Cost;
            }

            if (!model.Title.IsNullOrEmpty())
            {
                st.Title = model.Title;
            }
            //st.Times++;
            Interlocked.Increment(ref st._Times);

            if (!model.Error.IsNullOrEmpty())
            {
                //st.Error++;
                Interlocked.Increment(ref st._Error);
            }

            var user = model.User;
            var ip   = model.IP;

            if (!user.IsNullOrEmpty() || !ip.IsNullOrEmpty())
            {
                // 计算用户和IP,合并在Remark里面
                var ss = new HashSet <String>((st.Remark + "").Split(","));
                if (!user.IsNullOrEmpty() && !ss.Contains(user))
                {
                    //st.Users++;
                    Interlocked.Increment(ref st._Users);
                    ss.Add(user + "");
                }
                if (!ip.IsNullOrEmpty() && !ss.Contains(ip))
                {
                    //st.IPs++;
                    Interlocked.Increment(ref st._IPs);
                    ss.Add(ip);
                }
                // 如果超长,砍掉前面
                var ds = ss as IEnumerable <String>;
                var k  = 1;
                while (true)
                {
                    var str = ds.Join(",");
                    if (str.Length <= _.Remark.Length)
                    {
                        st.Remark = str;
                        break;
                    }

                    ds = ss.Skip(k++);
                }
            }

            st.SaveAsync(5_000);

            return(st);
        }