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