UserStatistics.cs 9.0 KB

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