UserStatistics.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Newtonsoft.Json;
  7. using System.Threading;
  8. using System.Data;
  9. using StackExchange.Redis;
  10. using CSharpUtil;
  11. using Newtonsoft.Json.Linq;
  12. using System.Diagnostics;
  13. namespace DataTransfer.tongji
  14. {
  15. class UserStatistics
  16. {
  17. public static void DataDeal()
  18. {
  19. LoseUserTargetCollect();
  20. }
  21. /// <summary>
  22. /// 流失玩家的指标的统计
  23. /// </summary>
  24. public static void LoseUserTargetCollect()
  25. {
  26. Console.WriteLine("进入流失玩家的指标的统计方法..............");
  27. TimeSpan ts = DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1);
  28. float curday = MathF.Floor((long)ts.TotalSeconds / 24 / 60 / 60);
  29. float day = curday - 1;
  30. //float day = MathF.Floor((long)ts.TotalSeconds / 24 / 60 / 60);
  31. Console.WriteLine("当前时间day==.............."+ day);
  32. var mem = Redis.Ins.GetDatabase(0);
  33. List<int> retainedlist = new List<int>();
  34. retainedlist.Add(1);
  35. retainedlist.Add(2);
  36. retainedlist.Add(3);
  37. retainedlist.Add(4);
  38. retainedlist.Add(5);
  39. retainedlist.Add(6);
  40. retainedlist.Add(7);
  41. retainedlist.Add(14);
  42. //retainedlist.Add(30);
  43. HashEntry[] zoneidList = mem.HashGetAll(MemKey_Statistics.Zonelist());
  44. foreach (var item in zoneidList)
  45. {
  46. string[] sList = item.ToString().Split(':');
  47. int zoneid = int.Parse(sList[0]);//区
  48. Console.WriteLine("zoneid............"+zoneid);
  49. userNumRecord(zoneid);//统计下每天的人数
  50. //下面是流失人员指标统计
  51. foreach (int type in retainedlist)
  52. {
  53. Console.WriteLine("type............" + type);
  54. if (mem.KeyExists(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day)))
  55. {
  56. //loseUserDataTransfer.excelText(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), type, zoneid,day);
  57. continue;
  58. }
  59. List<string> loseUIdList = loseUserListCollect(type,zoneid,day);
  60. if (loseUIdList.Count <= 0)
  61. {
  62. continue;
  63. }
  64. TargetCollect(loseUIdList,type,zoneid, day);
  65. }
  66. }
  67. }
  68. /// <summary>
  69. /// 统计流失玩家uid
  70. /// </summary>
  71. /// <param name="type"></param>
  72. /// <param name="zoneid"></param>
  73. /// <param name="day"></param>
  74. public static List<string> loseUserListCollect(int type,int zoneid, float day)
  75. {
  76. //次日留存
  77. string dayKey = MemKey_Statistics.GamerunLoginUser(zoneid, day);
  78. string lastDayKey = MemKey_Statistics.GamerunLoginUser(zoneid, day - type);
  79. List<string> loseUIdList = new List<string>();
  80. var mem = Redis.Ins.GetDatabase(0);
  81. if (!mem.KeyExists(dayKey) || !mem.KeyExists(lastDayKey))
  82. {
  83. return loseUIdList;
  84. }
  85. string[] list = mem.HashKeys(dayKey).ToStringArray();
  86. string[] nextDaylist = mem.HashKeys(lastDayKey).ToStringArray();
  87. foreach (string uid in nextDaylist)
  88. {
  89. if (!list.Contains(uid))
  90. {
  91. Console.WriteLine("uid............" + uid);
  92. loseUIdList.Add(uid);
  93. }
  94. }
  95. return loseUIdList;
  96. }
  97. /// <summary>
  98. /// 查看次日流失玩家的指标信息
  99. /// </summary>
  100. /// <param name="loseUIdList"></param>
  101. /// <param name="zoneid"></param>
  102. /// <param name="day"></param>
  103. public static void TargetCollect(List<string> loseUIdList,int type,int zoneid,float day)
  104. {
  105. var mem = Redis.Ins.GetDatabase(0);
  106. foreach (string uid in loseUIdList)
  107. {
  108. if (!mem.KeyExists(MemKey_User.gameInfo(uid, zoneid)))
  109. {
  110. continue;
  111. }
  112. #region----------玩家等级
  113. //玩家等级
  114. string baseInfo = mem.HashGet(MemKey_User.gameInfo(uid, zoneid), "baseInfo");
  115. JObject baseInfoDic = JObject.Parse(baseInfo);
  116. int level = int.Parse(baseInfoDic["level"].ToString());
  117. string k = "level-" + level;
  118. if (mem.HashExists(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), k))
  119. {
  120. mem.HashIncrement(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), k, 1);
  121. }
  122. else
  123. {
  124. List<HashEntry> list = new List<HashEntry>();
  125. HashEntry d = new HashEntry(k, 1);
  126. list.Add(d);
  127. mem.HashSet(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), list.ToArray());
  128. }
  129. #endregion
  130. #region--------------主线任务
  131. //主线任务
  132. string privateState = mem.HashGet(MemKey_User.gameInfo(uid, zoneid), "privateState");
  133. JObject privateStateDic = JObject.Parse(privateState); //
  134. JObject jtaskCardTracing = JObject.Parse(privateStateDic["taskCardTracing"].ToString());
  135. string taskId = "0";
  136. if (jtaskCardTracing.ContainsKey("1"))//主线
  137. {
  138. taskId = jtaskCardTracing["1"].ToString();
  139. }
  140. string store = mem.HashGet(MemKey_User.gameInfo(uid, zoneid), "store");
  141. JObject storeDic = JObject.Parse(store);
  142. JObject taskcardsDic = JObject.Parse(storeDic["taskcards"].ToString());
  143. if (taskId != "0" )
  144. {
  145. JObject dict = JObject.Parse(taskcardsDic[taskId].ToString());
  146. string typeId = dict["typeId"].ToString();
  147. string taskKey = "task-" + typeId;
  148. if (mem.HashExists(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), taskKey))
  149. {
  150. mem.HashIncrement(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), taskKey, 1);
  151. }
  152. else
  153. {
  154. List<HashEntry> list = new List<HashEntry>();
  155. HashEntry d = new HashEntry(taskKey, 1);
  156. list.Add(d);
  157. mem.HashSet(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), list.ToArray());
  158. }
  159. }
  160. #endregion
  161. #region--------------关卡
  162. string gates = mem.HashGet(MemKey_User.gameInfo(uid, zoneid), "gates");
  163. JObject gatesDic = JObject.Parse(gates);
  164. JObject normalsDic = JObject.Parse(gatesDic["normal"].ToString());
  165. JObject lastgatesDic = JObject.Parse(normalsDic["gates"].ToString());
  166. int gateId = 0;
  167. foreach (KeyValuePair<string,JToken>kv in lastgatesDic)
  168. {
  169. gateId = int.Parse(kv.Key);
  170. }
  171. string gateKey = "gateId-" + gateId;
  172. if (mem.HashExists(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), gateKey))
  173. {
  174. mem.HashIncrement(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), gateKey, 1);
  175. }
  176. else
  177. {
  178. List<HashEntry> list = new List<HashEntry>();
  179. HashEntry d = new HashEntry(gateKey, 1);
  180. list.Add(d);
  181. mem.HashSet(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day), list.ToArray());
  182. }
  183. #endregion
  184. }
  185. loseUserDataTransfer.excelText(MemKey_Statistics.LoseUserKeyCount(type, zoneid, day),type,zoneid,day);
  186. }
  187. /// <summary>
  188. /// 每天登陆人数纪录----以防刚哥记得的uid的rediskey删除
  189. /// </summary>
  190. /// <param name="zoneid"></param>
  191. public static void userNumRecord(int zoneid)
  192. {
  193. TimeSpan ts = DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1);
  194. float day = MathF.Floor((long)ts.TotalSeconds / 24 / 60 / 60);
  195. var mem = Redis.Ins.GetDatabase(0);
  196. HashEntry[] ctxList = mem.HashGetAll(MemKey_Statistics.GamerunLoginUser(zoneid, day - 1));
  197. int length = ctxList.Length;
  198. List<HashEntry> list = new List<HashEntry>();
  199. HashEntry d = new HashEntry(day-1, length);
  200. list.Add(d);
  201. mem.HashSet(MemKey_Statistics.userNumRecord(zoneid), list.ToArray());
  202. }
  203. }
  204. }