ReportedLogs.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. //using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using NPOI.HSSF.UserModel;
  7. using StackExchange.Redis;
  8. using Newtonsoft.Json.Linq;
  9. namespace StatisticsTransfer.tongji
  10. {
  11. internal class ReportedLogs
  12. {
  13. const int OneTransMaxItem = 1000;
  14. /// <summary>
  15. /// 导出客户端埋点日志
  16. /// </summary>
  17. public static void TransLog()
  18. {
  19. var workbook = new HSSFWorkbook();
  20. var mem = Redis.Ins.GetDatabase(0);
  21. MemKey_Statistics.ReportedLogs().ForEach(k =>
  22. {
  23. var sheet = workbook.CreateSheet(GetSheetName(k)); // 创建工作表
  24. var rowInfo = mem.ListRange(k, 0, 0);
  25. if (rowInfo.Length > 0)
  26. {
  27. var strJS = rowInfo[0].ToString() ?? "{}";
  28. Console.WriteLine(strJS);
  29. var json = JObject.Parse(strJS);
  30. int i = 0, y = 0;
  31. var head_row = sheet.CreateRow(y++); // 标题行
  32. foreach (var kv in json)
  33. {
  34. head_row.CreateCell(i++).SetCellValue(kv.Key); // 设置标题
  35. }
  36. var start = 0L;
  37. var end = 0L;
  38. while (mem.ListLength(k) > 0 && end < mem.ListLength(k))
  39. {
  40. if (OneTransMaxItem < mem.ListLength(k) - start)
  41. {
  42. end = start + OneTransMaxItem - 1;
  43. }
  44. else
  45. {
  46. end = mem.ListLength(k);
  47. }
  48. var arr = mem.ListRange(k, start, end);
  49. arr.ToList().ForEach(x =>
  50. {
  51. var row = sheet.CreateRow(y++);
  52. var strJS = x.ToString() ?? "{}";
  53. var json = JObject.Parse(strJS);
  54. i = 0; // 重置索引
  55. foreach (var kv in json)
  56. {
  57. var v = kv.Value?.ToString() ?? "-";
  58. row.CreateCell(i++).SetCellValue(v); // 设置列值
  59. }
  60. });
  61. start = end;
  62. // mem.ListTrim(k, OneTransMaxItem - 1, mem.ListLength(k) - OneTransMaxItem); // 清除已导数据
  63. }
  64. }
  65. }); // 遍历日志
  66. OutPut(workbook); // 保存到文件
  67. Console.WriteLine("客户端埋点日志转存完毕!");
  68. }
  69. /// <summary>
  70. /// 将excel写入文件
  71. /// </summary>
  72. /// <param name="workbook"></param>
  73. private static void OutPut(HSSFWorkbook workbook)
  74. {
  75. string txtName = "客户端埋点上报日志表_" + DateTime.Now.ToString("yyyyMMdd");
  76. string filename = Config.Ins.OutDir + txtName + ".xls";
  77. if (File.Exists(filename))
  78. {
  79. File.Delete(filename);
  80. }
  81. using var file = new FileStream(filename, FileMode.CreateNew, FileAccess.Write);
  82. workbook.Write(file);
  83. }
  84. /// <summary>
  85. /// redis中的key到 中文工作表名称的映射
  86. /// </summary>
  87. /// <param name="k"></param>
  88. /// <returns></returns>
  89. private static string GetSheetName(string k) => k switch
  90. {
  91. "stat-reported-log-e_gate" => "关卡记录",
  92. "stat-reported-log-e_task" => "任务记录",
  93. "stat-reported-log-e_k_1" => "资源更新完毕",
  94. "stat-reported-log-e_k_2" => "手机号注册完毕(龙游)",
  95. "stat-reported-log-e_k_3" => "实名认证完毕(龙游)",
  96. "stat-reported-log-e_k_4" => "用户登录完成(已加载对应区的玩家数据)",
  97. "stat-reported-log-e_k_5" => "进入新手引导场景",
  98. "stat-reported-log-e_k_6" => "离开新手引导场景",
  99. "stat-reported-log-e_k_7" => "接取了第一个主线剧情(任务)",
  100. "stat-reported-log-e_k_8" => "e_k_8-不知道",
  101. "stat-reported-log-e_k_9" => "e_k_9-不知道",
  102. _ => "-" // 默认值
  103. };
  104. }
  105. }