// 统计留存 private void statXDayRemain(ParamStat param, int days, ref int remainCount) { m_regeditAccList.Clear(); ChannelInfo statDay = (ChannelInfo)param.m_channel; queryRegeditAcc(param, StatBase.getRemainRegTime(statDay, days)); int regeditCount = m_regeditAccList.Count; if (regeditCount == 0) // 没有注册,此时今天的留存是0 { return; } DateTime mint = statDay.m_statDay.Date.AddDays(-1); DateTime maxt = statDay.m_statDay.Date; int count = 0; foreach (var acc in m_regeditAccList) { if (isLogin(param, ACC_KEY, acc, mint, maxt)) { count++; } } remainCount = count; }
// 统计30日留存 private void stat30DayRemain(ParamStat param, StatResult result) { queryAccList(param, 30); statXDayRemain(param, m_regeditAccList, ref result.m_30DayRemainCountTmp); statXDayRemain(param, m_regeditWithRecharge, ref result.m_30DayRemainCountRechargeTmp); statXDayDevRemain(param, 30, ref result.m_30DayDevRemainCountTmp); }
public override void doStat(object param, StatResult result) { ParamStat p = (ParamStat)param; ChannelInfo cinfo = p.m_channel; DateTime mint = cinfo.m_statDay.Date.AddDays(-1), maxt = cinfo.m_statDay.Date; IMongoQuery imq1 = Query.LT("time", BsonValue.Create(maxt)); IMongoQuery imq2 = Query.GTE("time", BsonValue.Create(mint)); IMongoQuery imq3 = Query.EQ("channel", BsonValue.Create(cinfo.m_channelNum)); IMongoQuery imq = Query.And(imq1, imq2, imq3); MapReduceResult mapResult = MongodbPayment.Instance.executeMapReduce(cinfo.m_paymentTable, imq, MapReduceTable.getMap("recharge"), MapReduceTable.getReduce("recharge")); if (mapResult != null) { IEnumerable <BsonDocument> bson = mapResult.GetResults(); foreach (BsonDocument d in bson) { BsonValue resValue = d["value"]; result.m_totalIncome += resValue["total"].ToInt32(); result.m_rechargePersonNum++; result.m_rechargeCount += resValue["rechargeCount"].ToInt32(); } } statPaytype(imq, cinfo); }
private bool statChannelByInterval(ChannelInfo info) { //beginStat("渠道[{0}]开始统计", info.m_channelName); ParamStat param = new ParamStat(); param.m_channel = info; StatResult result = new StatResult(); foreach (var stat in m_statModule) { if (stat.Key == StatFlag.STAT_FLAG_REMAIN) { continue; } if (stat.Key == StatFlag.STAT_LTV) { continue; } stat.Value.doStat(param, result); } IMongoQuery imq = null; Dictionary <string, object> newData = getData(result, info, ref imq); string str = MongodbAccount.Instance.ExecuteStoreByQuery(TableName.CHANNEL_TD, imq, newData); //endStat("渠道[{0}]结束统计", info.m_channelName); return(str == string.Empty); }
// 统计几天前,注册玩家充值总额 private void statXDayTotalRecharge(ParamStat param, int days, ref int totalRecharge, StatResult result = null) { totalRecharge = 0; m_regeditAccList.Clear(); ChannelInfo statDay = (ChannelInfo)param.m_channel; queryRegeditAcc(param, StatBase.getRemainRegTime(statDay, days)); if (m_regeditAccList.Count == 0) // 没有注册 { return; } int playerCount = 0; IMongoQuery imq = StatBase.getRechargeCond(param, days + 1); foreach (var acc in m_regeditAccList) { int tmp = statPlayerRecharge(statDay, imq, acc); totalRecharge += tmp; if (tmp > 0) { playerCount++; } } if (days == 0) { result.m_newAccRechargePersonNum = playerCount; } }
public override void doStat(object param, StatResult result) { ParamStat p = (ParamStat)param; ChannelInfo cinfo = p.m_channel; DateTime mint = cinfo.m_statDay.Date.AddDays(-1), maxt = cinfo.m_statDay.Date; statRegeditCount(cinfo, result, mint, maxt); statDeviceActivation(cinfo, result, mint, maxt); }
public override void doStat(object param, StatResult result) { ParamStat p = (ParamStat)param; stat2DayRemain(p, result); stat3DayRemain(p, result); stat7DayRemain(p, result); stat30DayRemain(p, result); }
private bool statChannel(ChannelInfo info) { if (!StatBase.canStat(info)) { return(false); } ParamStat param = new ParamStat(); param.m_channel = info; StatResult result = new StatResult(); foreach (var stat in m_statModule.Values) { stat.doStat(param, result); } Dictionary <string, object> newData = new Dictionary <string, object>(); newData.Add("genTime", info.m_statDay.Date.AddDays(-1)); newData.Add("channel", info.m_channelNum); newData.Add("regeditCount", result.m_regeditCount); newData.Add("deviceActivationCount", result.m_deviceActivationCount); newData.Add("activeCount", result.m_activeCount); newData.Add("totalIncome", result.m_totalIncome); newData.Add("rechargePersonNum", result.m_rechargePersonNum); newData.Add("rechargeCount", result.m_rechargeCount); // newData.Add("2DayRegeditCount", result.m_2DayRegeditCount); newData.Add("2DayRemainCount", result.m_2DayRemainCount); // newData.Add("3DayRegeditCount", result.m_3DayRegeditCount); newData.Add("3DayRemainCount", result.m_3DayRemainCount); // newData.Add("7DayRegeditCount", result.m_7DayRegeditCount); newData.Add("7DayRemainCount", result.m_7DayRemainCount); //newData.Add("30DayRegeditCount", result.m_30DayRegeditCount); newData.Add("30DayRemainCount", result.m_30DayRemainCount); IMongoQuery imq1 = Query.EQ("genTime", BsonValue.Create(info.m_statDay.Date.AddDays(-1))); IMongoQuery imq2 = Query.EQ("channel", BsonValue.Create(info.m_channelNum)); IMongoQuery imq = Query.And(imq1, imq2); updateRemain(info, 1, result); updateRemain(info, 3, result); updateRemain(info, 7, result); updateRemain(info, 30, result); string str = MongodbAccount.Instance.ExecuteStoreByQuery(TableName.CHANNEL_TD, imq, newData); return(str == string.Empty); }
// 指定渠道的账号是否在一段时间内登录过 private bool isLogin(ParamStat param, string key, string acc, DateTime mint, DateTime maxt) { IMongoQuery imq1 = Query.LT("time", BsonValue.Create(maxt)); IMongoQuery imq2 = Query.GTE("time", BsonValue.Create(mint)); IMongoQuery imq3 = Query.EQ(key, BsonValue.Create(acc)); IMongoQuery imq4 = Query.EQ("channel", BsonValue.Create(param.m_channel.m_channelNum)); IMongoQuery imq = Query.And(imq1, imq2, imq3, imq4); bool res = MongodbAccount.Instance.KeyExistsByQuery(param.m_channel.m_loginTable, imq); return(res); }
// 返回充值统计条件 public static IMongoQuery getRechargeCond(ParamStat param, int days) { ChannelInfo cinfo = param.m_channel; DateTime mint = cinfo.m_statDay.Date.AddDays(-days), maxt = cinfo.m_statDay.Date; IMongoQuery imq1 = Query.LT("time", BsonValue.Create(maxt)); IMongoQuery imq2 = Query.GTE("time", BsonValue.Create(mint)); IMongoQuery imq3 = Query.EQ("channel", BsonValue.Create(cinfo.m_channelNum)); IMongoQuery imq = Query.And(imq1, imq2, imq3); return(imq); }
// 账号在dt这一天是否有过付费行为 bool isRecharge(ParamStat param, DateTime dt, string acc) { DateTime mint = dt.Date, maxt = dt.Date.AddDays(1); IMongoQuery imq1 = Query.LT("time", BsonValue.Create(maxt)); IMongoQuery imq2 = Query.GTE("time", BsonValue.Create(mint)); IMongoQuery imq3 = Query.EQ("channel", BsonValue.Create(param.m_channel.m_channelNum)); IMongoQuery imq4 = Query.EQ(StatLTV.ACC_KEY_1, acc); IMongoQuery imq = Query.And(imq1, imq2, imq3, imq4); bool res = MongodbPayment.Instance.KeyExistsByQuery(param.m_channel.m_paymentTable, imq); return(res); }
public override void doStat(object param, StatResult result) { ParamStat p = (ParamStat)param; statXDayTotalRecharge(p, 0, ref result.m_newAccIncome, result); statXDayTotalRecharge(p, 1, ref result.m_1DayTotalRechargeTmp); statXDayTotalRecharge(p, 3, ref result.m_3DayTotalRechargeTmp); statXDayTotalRecharge(p, 7, ref result.m_7DayTotalRechargeTmp); statXDayTotalRecharge(p, 14, ref result.m_14DayTotalRechargeTmp); statXDayTotalRecharge(p, 30, ref result.m_30DayTotalRechargeTmp); statXDayTotalRecharge(p, 60, ref result.m_60DayTotalRechargeTmp); statXDayTotalRecharge(p, 90, ref result.m_90DayTotalRechargeTmp); }
// 查询2个列表,1是dt这一天的注册用户,2是注册账号并且付费的账号 protected void queryAccList(ParamStat param, int days) { m_regeditAccList.Clear(); m_regeditWithRecharge.Clear(); DateTime dt = StatBase.getRemainRegTime(param.m_channel, days); queryRegeditAcc(param, dt); foreach (var acc in m_regeditAccList) { if (isRecharge(param, dt, acc)) { m_regeditWithRecharge.Add(acc); } } }
private bool statChannel(ChannelInfo info) { if (!StatBase.canStat(info)) { return(false); } beginStat("渠道[{0}]开始统计", info.m_channelName); ParamStat param = new ParamStat(); param.m_channel = info; StatResult result = new StatResult(); foreach (var stat in m_statModule.Values) { stat.doStat(param, result); } IMongoQuery imq = null; Dictionary <string, object> newData = getData(result, info, ref imq); foreach (var d in s_remain) { updateRemain(info, d, result); updateDevRemain(info, d, result); } foreach (var d in s_totalRecharge) { updateTotalRecharge(info, d, result); } string str = MongodbAccount.Instance.ExecuteStoreByQuery(TableName.CHANNEL_TD, imq, newData); endStat("渠道[{0}]结束统计", info.m_channelName); return(str == string.Empty); }
public override void doStat(object param, StatResult result) { ParamStat p = (ParamStat)param; ChannelInfo cinfo = p.m_channel; DateTime mint = cinfo.m_statDay.Date.AddDays(-1), maxt = cinfo.m_statDay.Date; IMongoQuery imq1 = Query.LT("time", BsonValue.Create(maxt)); IMongoQuery imq2 = Query.GTE("time", BsonValue.Create(mint)); IMongoQuery imq3 = Query.EQ("channel", BsonValue.Create(cinfo.m_channelNum)); IMongoQuery imq = Query.And(imq1, imq2, imq3); MapReduceResult mapResult = MongodbAccount.Instance.executeMapReduce(cinfo.m_loginTable, imq, MapReduceTable.getMap("active"), MapReduceTable.getReduce("active")); if (mapResult != null) { result.m_activeCount = (int)mapResult.OutputCount; } }
/* * 获取某渠道在指定日的注册列表 * dt 指定日期 */ protected void queryRegeditAcc(ParamStat param, DateTime dt) { ChannelInfo cinfo = param.m_channel; DateTime mint = dt.Date, maxt = dt.Date.AddDays(1); IMongoQuery imq1 = Query.LT("time", BsonValue.Create(maxt)); IMongoQuery imq2 = Query.GTE("time", BsonValue.Create(mint)); IMongoQuery imq3 = Query.EQ("channel", BsonValue.Create(cinfo.m_channelNum)); IMongoQuery imq = Query.And(imq1, imq2, imq3); List <Dictionary <string, object> > dataList = MongodbAccount.Instance.ExecuteGetListByQuery(cinfo.m_regeditTable, imq, new string[] { ACC_KEY }); for (int i = 0; i < dataList.Count; i++) { if (dataList[i].ContainsKey(ACC_KEY)) { string acc = Convert.ToString(dataList[i][ACC_KEY]); m_regeditAccList.Add(acc); } } }
// 统计30日留存 private void stat30DayRemain(ParamStat param, StatResult result) { statXDayRemain(param, 30, ref result.m_30DayRemainCountTmp); statXDayDevRemain(param, 30, ref result.m_30DayDevRemainCountTmp); }