UserStatsWay.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using Microsoft.Azure.Cosmos;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Threading.Tasks;
  5. using TEAMModelOS.SDK.Models.Cosmos.BI;
  6. using TEAMModelOS.SDK.Models.Service.BI;
  7. using TEAMModelOS.SDK.DI;
  8. namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
  9. {
  10. public class UserStatsWay
  11. {
  12. /// <summary>
  13. /// 统计人数
  14. /// </summary>
  15. /// <param name="cosmosClient"></param>
  16. /// <param name="id"></param>
  17. /// <param name="year"></param>
  18. /// <param name="userType"></param>
  19. /// <returns></returns>
  20. public static async Task<List<double>> GetYearTecherStudent(CosmosClient cosmosClient, string id, int year, int userType = 1)
  21. {
  22. List<double> result = new(366);
  23. DateTimeOffset dateTime = DateTimeOffset.UtcNow;
  24. if (year < dateTime.Year)
  25. dateTime = new(year, 12, 31, 23, 59, 59, TimeSpan.Zero);
  26. var (yearS, yearE) = TimeHelper.GetStartOrEnd(dateTime, "year"); //计算今年开始/结束时间
  27. string code = $"Teacher-{id}";
  28. string container = "School";
  29. if (userType != 1)
  30. {
  31. code = $"Base-{id}";
  32. container = "Student";
  33. }
  34. List<ArtRelStats> artRelStats = new();
  35. string sql = $"select c.id,c.code,c.createTime from c where c.startTime >= {yearS} and c.startTime <= {yearE}";
  36. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", container).GetItemQueryIteratorSql<ArtRelStats>(queryText: sql, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"{code}") }))
  37. {
  38. artRelStats.Add(item);
  39. }
  40. DateTimeOffset yearDay = new(year, dateTime.Month, dateTime.Day, dateTime.Hour, dateTime.Minute, dateTime.Second, TimeSpan.Zero);
  41. List<StartEndTime> everyDay = TimeHelper.GetYearEveryDay(dateTime);
  42. for (int i = 0; i < everyDay.Count; i++)
  43. {
  44. result.Add(artRelStats.FindAll(f => (f.createTime >= everyDay[i].start && f.createTime <= everyDay[i].end)).Count);
  45. }
  46. if (result.Count < 366)
  47. result.Add(0);
  48. return result;
  49. }
  50. }
  51. }