SchoolStatsWay.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. using Azure.Cosmos;
  2. using DocumentFormat.OpenXml.Bibliography;
  3. using DocumentFormat.OpenXml.Math;
  4. using Microsoft.AspNetCore.Mvc;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Text.Json;
  10. using System.Threading.Tasks;
  11. using TEAMModelOS.Models;
  12. using TEAMModelOS.SDK.DI;
  13. using TEAMModelOS.SDK.Extension;
  14. using TEAMModelOS.SDK.Models.Cosmos.BI;
  15. using TEAMModelOS.SDK.Models.Service.BI;
  16. namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
  17. {
  18. public static class SchoolStatsWay
  19. {
  20. /// <summary>
  21. /// 统计单个学校
  22. /// </summary>
  23. /// <param name="cosmosClient"></param>
  24. /// <param name="scId"></param>
  25. /// <returns></returns>
  26. public static async Task<StatsInfo> GetSingleSc(CosmosClient cosmosClient, string scId)
  27. {
  28. StatsInfo statsInfo = new() { id = $"{scId}" };
  29. DateTimeOffset dateTime = DateTimeOffset.UtcNow;
  30. var (dayS, dayE) = TimeHelper.GetStartOrEnd(dateTime); //今天开始时间 13位
  31. var (lastWeekS, lastWeekE) = TimeHelper.GetStartOrEnd(dateTime, "lastweek"); //计算上周开始/结束时间
  32. var (weekS, weekE) = TimeHelper.GetStartOrEnd(dateTime, "week"); //计算本周开始/结束时间
  33. var (lastTermS, lastTermE) = TimeHelper.GetStartOrEnd(dateTime, "lastterm"); //计算上学期开始/结束时间
  34. var (termS, termE) = TimeHelper.GetStartOrEnd(dateTime, "term"); //计算本学期开始/结束时间
  35. var (lastMthS, LastmthE) = TimeHelper.GetStartOrEnd(dateTime, "lastMonth"); //上月开始/结束时间
  36. var (mthS, mthE) = TimeHelper.GetStartOrEnd(dateTime, "month"); //本月开始/结束时间
  37. var (lastYearS, lastYearE) = TimeHelper.GetStartOrEnd(DateTimeOffset.Parse($"{dateTime.Year - 1}-1-1"), "year"); //计算去年开始/结束时间
  38. var (yearS, yearE) = TimeHelper.GetStartOrEnd(dateTime, "year"); //计算今年开始/结束时间
  39. string currSql = "select value(count(c.id)) from c";
  40. string dayWhereSql = $"c.createTime >= {dayS} and c.createTime <= {dayE}";
  41. string weekWhereSql = $"c.createTime >= {weekS} and c.createTime <= {weekE}";
  42. string monthWhereSql = $"c.createTime >= {mthS} and c.createTime <= {mthE}";
  43. ScBase scBase = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<ScBase>(statsInfo.id, new PartitionKey("Base"));
  44. statsInfo.name = scBase.name;
  45. statsInfo.picture = scBase.picture;
  46. statsInfo.size = scBase.size;
  47. statsInfo.scCreateTime = scBase.createTime;
  48. string tchSql = $"{currSql} where ARRAY_CONTAINS(c.roles, 'teacher', true) AND c.status = 'join'";
  49. statsInfo.tch = await JointlySingleQuery.GetValueInt(cosmosClient, "School", tchSql, code: $"Teacher-{scBase.id}");
  50. statsInfo.dayTch = await JointlySingleQuery.GetValueInt(cosmosClient, "School", $"{tchSql} and {dayWhereSql} ", code: $"Teacher-{scBase.id}");
  51. statsInfo.weekTch = await JointlySingleQuery.GetValueInt(cosmosClient, "School", $"{tchSql} and {weekWhereSql}", code: $"Teacher-{scBase.id}");
  52. statsInfo.monthTch = await JointlySingleQuery.GetValueInt(cosmosClient, "School", $"{tchSql} and {monthWhereSql}", code: $"Teacher-{scBase.id}");
  53. statsInfo.stu = await JointlySingleQuery.GetValueInt(cosmosClient, "Student", currSql, code: $"Base-{scBase.id}");
  54. statsInfo.dayStu = await JointlySingleQuery.GetValueInt(cosmosClient, "Student", $"{currSql} where {dayWhereSql}", code: $"Base-{scBase.id}");
  55. statsInfo.weekStu = await JointlySingleQuery.GetValueInt(cosmosClient, "Student", $"{currSql} where {weekWhereSql}", code: $"Base-{scBase.id}");
  56. statsInfo.monthStu = await JointlySingleQuery.GetValueInt(cosmosClient, "Student", $"{currSql} where {monthWhereSql}", code: $"Base-{scBase.id}");
  57. statsInfo.room = await JointlySingleQuery.GetValueInt(cosmosClient, "School", currSql, code: $"Room-{scBase.id}");
  58. statsInfo.witRoom = await JointlySingleQuery.GetValueInt(cosmosClient, "School", $"{currSql} where (c.serial != null or c.serial != '' or IS_DEFINED(c.serial) = true)", code: $"Room-{scBase.id}");
  59. statsInfo.lesson = await LessonRecordStatsWay.GetSchoolAll(cosmosClient, statsInfo.id);
  60. statsInfo.activity = await ActivityStatsWay.GetSchoolAll(cosmosClient, statsInfo.id);
  61. statsInfo.study = await StudyStatsWay.GetSchoolAll(cosmosClient, statsInfo.id);
  62. return statsInfo;
  63. }
  64. /// <summary>
  65. /// 多个学校统计
  66. /// </summary>
  67. /// <param name="cosmosClient"></param>
  68. /// <param name="statsInfos"></param>
  69. /// <param name="_httpTrigger"></param>
  70. /// <param name="_option"></param>
  71. /// <param name="area"></param>
  72. /// <returns></returns>
  73. public static async Task<StatsInfo> GetAreaStats(CosmosClient cosmosClient, HttpTrigger _httpTrigger, Option _option, List<StatsInfo> statsInfos, List<string> scIds = null, Area area = null)
  74. {
  75. StatsInfo areaInfo = new()
  76. {
  77. id = area == null ? "" : area.id,
  78. pk = "Stats",
  79. code = "Stats",
  80. name = area == null ? "" : area.name,
  81. picture = "",
  82. tch = statsInfos.Select(s => s.tch).Sum(),
  83. dayTch = statsInfos.Select(s => s.dayTch).Sum(),
  84. weekTch = statsInfos.Select(s => s.weekTch).Sum(),
  85. monthTch = statsInfos.Select(s => s.monthTch).Sum(),
  86. stu = statsInfos.Select(s => s.stu).Sum(),
  87. dayStu = statsInfos.Select(s => s.dayStu).Sum(),
  88. weekStu = statsInfos.Select(s => s.weekStu).Sum(),
  89. monthStu = statsInfos.Select(s => s.monthStu).Sum(),
  90. room = statsInfos.Select(s => s.room).Sum(),
  91. witRoom = statsInfos.Select(s => s.witRoom).Sum(),
  92. size = statsInfos.Select(s => s.size).Sum()
  93. };
  94. areaInfo.lesson.open = statsInfos.Select(s => s.lesson.open).Sum();
  95. areaInfo.lesson.less = statsInfos.Select(s => s.lesson.less).Sum();
  96. areaInfo.lesson.lastDay = statsInfos.Select(s => s.lesson.lastDay).Sum();
  97. areaInfo.lesson.day = statsInfos.Select(s => s.lesson.day).Sum();
  98. areaInfo.lesson.lastWeek = statsInfos.Select(s => s.lesson.lastWeek).Sum();
  99. areaInfo.lesson.week = statsInfos.Select(s => s.lesson.week).Sum();
  100. areaInfo.lesson.lastTerm = statsInfos.Select(s => s.lesson.lastTerm).Sum();
  101. areaInfo.lesson.term = statsInfos.Select(s => s.lesson.term).Sum();
  102. areaInfo.lesson.lastDayInter = statsInfos.Select(s => s.lesson.lastDayInter).Sum();
  103. areaInfo.lesson.dayInter = statsInfos.Select(s => s.lesson.dayInter).Sum();
  104. areaInfo.lesson.lastMonthInter = statsInfos.Select(s => s.lesson.lastMonthInter).Sum();
  105. areaInfo.lesson.monthInter = statsInfos.Select(s => s.lesson.monthInter).Sum();
  106. areaInfo.lesson.lastYearInter = statsInfos.Select(s => s.lesson.lastYearInter).Sum();
  107. areaInfo.lesson.yearInter = statsInfos.Select(s => s.lesson.yearInter).Sum();
  108. areaInfo.activity.cnt = statsInfos.Select(s => s.activity.cnt).Sum();
  109. areaInfo.activity.exam = statsInfos.Select(s => s.activity.exam).Sum();
  110. areaInfo.activity.survey = statsInfos.Select(s => s.activity.survey).Sum();
  111. areaInfo.activity.vote = statsInfos.Select(s => s.activity.vote).Sum();
  112. areaInfo.activity.homework = statsInfos.Select(s => s.activity.homework).Sum();
  113. areaInfo.activity.lastDay = statsInfos.Select(s => s.activity.lastDay).Sum();
  114. areaInfo.activity.dayCnt = statsInfos.Select(s => s.activity.dayCnt).Sum();
  115. areaInfo.activity.lastWeek = statsInfos.Select(s => s.activity.lastWeek).Sum();
  116. areaInfo.activity.week = statsInfos.Select(s => s.activity.week).Sum();
  117. areaInfo.activity.lastTerm = statsInfos.Select(s => s.activity.lastTerm).Sum();
  118. areaInfo.activity.term = statsInfos.Select(s => s.activity.term).Sum();
  119. List<Task<ItemResponse<StatsInfo>>> taskStatsInfos = new();
  120. foreach (var itemId in scIds)
  121. {
  122. bool isExist = true;
  123. StatsInfo statsInfo = new();
  124. var scDataStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{itemId}", new PartitionKey("Stats"));
  125. if (scDataStats.Status == 200)
  126. {
  127. using var fileJson = await JsonDocument.ParseAsync(scDataStats.ContentStream);
  128. statsInfo = fileJson.ToObject<StatsInfo>();
  129. }
  130. else
  131. {
  132. statsInfo.id = itemId;
  133. isExist = false;
  134. }
  135. bool isnew = false;
  136. DateTimeOffset dateTime = DateTimeOffset.UtcNow;
  137. long now = dateTime.ToUnixTimeMilliseconds();
  138. if (statsInfo.upTime > 0 && !isnew)
  139. {
  140. long timedis = 20 * 60 * 1000;//20分钟
  141. if (now - statsInfo.upTime < timedis)
  142. isnew = true;
  143. }
  144. if (statsInfo.upTime == 0 && isnew)
  145. statsInfo.upTime = now;
  146. if (statsInfo.upTime == 0 && isnew)
  147. statsInfo.upTime = DateTimeOffset.UtcNow.Add(new TimeSpan(-1, 0, 0, 0)).ToUnixTimeMilliseconds();
  148. if (!isnew)
  149. {
  150. ////Function 处理Function 更新或者新增
  151. //_ = _httpTrigger.RequestHttpTrigger(new { schoolId = $"{itemId}"}, _option.Location, "stats-sc-info");
  152. //异步方法处理 同步更新
  153. statsInfo = await SchoolStatsWay.GetSingleSc(cosmosClient, itemId);
  154. statsInfo.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  155. if (isExist)
  156. taskStatsInfos.Add(cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<StatsInfo>(statsInfo, statsInfo.id, new PartitionKey("Stats")));
  157. else
  158. taskStatsInfos.Add(cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Stats")));
  159. }
  160. }
  161. if (taskStatsInfos.Count < 256)
  162. await Task.WhenAll(taskStatsInfos);
  163. else
  164. {
  165. int pages = (taskStatsInfos.Count + 256) / 256;
  166. for (int i = 0; i < pages; i++)
  167. {
  168. List<Task<ItemResponse<StatsInfo>>> tempStatsInfos = taskStatsInfos.Skip((i) * 256).Take(256).ToList();
  169. await Task.WhenAll(tempStatsInfos);
  170. }
  171. }
  172. return areaInfo;
  173. }
  174. }
  175. }