using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.Threading;
using System.Data;
using StackExchange.Redis;
using CSharpUtil;
using Newtonsoft.Json.Linq;
using System.Diagnostics;
namespace DataTransfer.tongji
{
class UserStatistics
{
public static void DataDeal()
{
LoseUserTargetCollect();
}
///
/// 流失玩家的指标的统计
///
public static void LoseUserTargetCollect()
{
Console.WriteLine("进入流失玩家的指标的统计方法..............");
TimeSpan ts = DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1);
float day = MathF.Floor((long)ts.TotalSeconds / 24 / 60 / 60);
Console.WriteLine("当前时间day==.............."+ day);
var mem = Redis.Ins.GetDatabase(0);
List retainedlist = new List();
retainedlist.Add(1);
retainedlist.Add(2);
retainedlist.Add(3);
retainedlist.Add(4);
retainedlist.Add(5);
retainedlist.Add(6);
retainedlist.Add(7);
retainedlist.Add(14);
//retainedlist.Add(30);
HashEntry[] zoneidList = mem.HashGetAll(MemKey_Statistics.Zonelist());
foreach (var item in zoneidList)
{
string[] sList = item.ToString().Split(':');
int zoneid = int.Parse(sList[0]);//区
Console.WriteLine("zoneid............"+zoneid);
foreach (int type in retainedlist)
{
Console.WriteLine("type............" + type);
if (mem.KeyExists(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day)))
{
//loseUserDataTransfer.excelText(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), type, zoneid,day);
continue;
}
List loseUIdList = loseUserListCollect(type,zoneid,day);
if (loseUIdList.Count <= 0)
{
continue;
}
TargetCollect(loseUIdList,type,zoneid, day);
}
userNumRecord(zoneid);
}
}
///
/// 统计流失玩家uid
///
///
///
///
public static List loseUserListCollect(int type,int zoneid, float day)
{
//次日留存
string dayKey = MemKey_Statistics.GamerunLoginUser(zoneid, day);
string lastDayKey = MemKey_Statistics.GamerunLoginUser(zoneid, day - type);
List loseUIdList = new List();
var mem = Redis.Ins.GetDatabase(0);
if (!mem.KeyExists(dayKey) || !mem.KeyExists(lastDayKey))
{
return loseUIdList;
}
string[] list = mem.HashKeys(dayKey).ToStringArray();
string[] nextDaylist = mem.HashKeys(lastDayKey).ToStringArray();
foreach (string uid in nextDaylist)
{
if (!list.Contains(uid))
{
Console.WriteLine("uid............" + uid);
loseUIdList.Add(uid);
}
}
return loseUIdList;
}
///
/// 查看次日流失玩家的指标信息
///
///
///
///
public static void TargetCollect(List loseUIdList,int type,int zoneid,float day)
{
var mem = Redis.Ins.GetDatabase(0);
foreach (string uid in loseUIdList)
{
if (!mem.KeyExists(MemKey_User.gameInfo(uid, zoneid)))
{
continue;
}
#region----------玩家等级
//玩家等级
string baseInfo = mem.HashGet(MemKey_User.gameInfo(uid, zoneid), "baseInfo");
JObject baseInfoDic = JObject.Parse(baseInfo);
int level = int.Parse(baseInfoDic["level"].ToString());
string k = "level-" + level;
if (mem.HashExists(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), k))
{
mem.HashIncrement(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), k, 1);
}
else
{
List list = new List();
HashEntry d = new HashEntry(k, 1);
list.Add(d);
mem.HashSet(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), list.ToArray());
}
#endregion
#region--------------主线任务
//主线任务
string privateState = mem.HashGet(MemKey_User.gameInfo(uid, zoneid), "privateState");
JObject privateStateDic = JObject.Parse(privateState); //
JObject jtaskCardTracing = JObject.Parse(privateStateDic["taskCardTracing"].ToString());
string taskId = "0";
if (jtaskCardTracing.ContainsKey("1"))//主线
{
taskId = jtaskCardTracing["1"].ToString();
}
string store = mem.HashGet(MemKey_User.gameInfo(uid, zoneid), "store");
JObject storeDic = JObject.Parse(store);
JObject taskcardsDic = JObject.Parse(storeDic["taskcards"].ToString());
if (taskId != "0" )
{
JObject dict = JObject.Parse(taskcardsDic[taskId].ToString());
string typeId = dict["typeId"].ToString();
string taskKey = "task-" + typeId;
if (mem.HashExists(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), taskKey))
{
mem.HashIncrement(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), taskKey, 1);
}
else
{
List list = new List();
HashEntry d = new HashEntry(taskKey, 1);
list.Add(d);
mem.HashSet(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), list.ToArray());
}
}
#endregion
#region--------------关卡
string gates = mem.HashGet(MemKey_User.gameInfo(uid, zoneid), "gates");
JObject gatesDic = JObject.Parse(gates);
JObject normalsDic = JObject.Parse(gatesDic["normal"].ToString());
JObject lastgatesDic = JObject.Parse(normalsDic["gates"].ToString());
int gateId = 0;
foreach (KeyValuePairkv in lastgatesDic)
{
gateId = int.Parse(kv.Key);
}
string gateKey = "gateId-" + gateId;
if (mem.HashExists(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), gateKey))
{
mem.HashIncrement(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), gateKey, 1);
}
else
{
List list = new List();
HashEntry d = new HashEntry(gateKey, 1);
list.Add(d);
mem.HashSet(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), list.ToArray());
}
#endregion
}
loseUserDataTransfer.excelText(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day),type,zoneid,day);
}
///
/// 每天登陆人数纪录----以防刚哥记得的uid的rediskey删除
///
///
public static void userNumRecord(int zoneid)
{
TimeSpan ts = DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1);
float day = MathF.Floor((long)ts.TotalSeconds / 24 / 60 / 60);
var mem = Redis.Ins.GetDatabase(0);
HashEntry[] ctxList = mem.HashGetAll(MemKey_Statistics.GamerunLoginUser(zoneid, day - 1));
int length = ctxList.Length;
List list = new List();
HashEntry d = new HashEntry(day, length);
list.Add(d);
mem.HashSet(MemKey_Statistics.userNumRecord(zoneid), list.ToArray());
}
}
}