StudyStatsWay.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using Microsoft.Azure.Cosmos;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Text.Json;
  7. using System.Threading.Tasks;
  8. using TEAMModelOS.SDK.Extension;
  9. using TEAMModelOS.SDK.Models.Cosmos.BI;
  10. using TEAMModelOS.SDK.DI;
  11. namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
  12. {
  13. public static class StudyStatsWay
  14. {
  15. /// <summary>
  16. /// 学校研修统计
  17. /// </summary>
  18. /// <param name="cosmosClient"></param>
  19. /// <param name="scId"></param>
  20. /// <returns></returns>
  21. public static async Task<StudyStats> GetSchoolAll(CosmosClient cosmosClient, string scId)
  22. {
  23. StudyStats studyStats = new();
  24. List<AreaStudy> trains = new();
  25. School school = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<School>($"{scId}", new PartitionKey("Base"));
  26. //cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIteratorSql<string>(queryText:$"select value(c.areaId) from c where c.id='{scId}'", requestOptions:new QueryRequestOptions() { PartitionKey = new PartitionKey("Base")});
  27. AreaSetting setting = null;
  28. var responSett = await cosmosClient.GetContainer("TEAMModelOS", "Normal").ReadItemStreamAsync($"{school.areaId}", new PartitionKey("AreaSetting"));
  29. if (responSett.StatusCode == System.Net.HttpStatusCode.OK)
  30. {
  31. using var fileJson = await JsonDocument.ParseAsync(responSett.Content);
  32. setting = fileJson.ToObject<AreaSetting>();
  33. }
  34. if (setting == null)
  35. {
  36. setting = new AreaSetting
  37. {
  38. allTime = 50,
  39. classTime = 5,
  40. submitTime = 15,
  41. onlineTime = 20,
  42. offlineTime = 10,
  43. lessonMinutes = 45,
  44. };
  45. }
  46. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIteratorSql<AreaStudy>(queryText: $"select c.id,c.code,c.totalTime,c.onlineTime,c.offlineTime,c.classTime,c.currency from c where c.pk='TeacherTrain' and c.school='{scId}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"TeacherTrain-{scId}") }))
  47. {
  48. trains.Add(item);
  49. }
  50. studyStats.learnTime = trains.Select(s=>s.totalTime).Sum();
  51. trains.ForEach(x =>
  52. {
  53. //线上研修
  54. if (x.onlineTime == 0) studyStats.online++; else if (x.onlineTime >= setting.onlineTime) studyStats.online++; else studyStats.online++;
  55. //线下研修
  56. if (x.offlineTime == 0) studyStats.offline++; else if (x.onlineTime >= setting.offlineTime) studyStats.offline++; else studyStats.offline++;
  57. //课堂实录
  58. if (x.classTime == 0) studyStats.classRoom++; else if (x.classTime >= setting.classTime) studyStats.classRoom++; else studyStats.classRoom++;
  59. //认证材料
  60. if (x.currency.submitTime == 0) studyStats.submit++; else if (x.currency.submitTime >= setting.submitTime) studyStats.submit++; else studyStats.submit++;
  61. if (x.currency.submitTime == 0 && x.classTime == 0 && x.offlineTime == 0 && x.onlineTime == 0) studyStats.notStarted++;
  62. else if (x.currency.submitTime >= setting.submitTime && x.classTime >= setting.classTime && x.onlineTime >= setting.offlineTime && x.onlineTime >= setting.onlineTime) studyStats.finish++;
  63. else studyStats.ongoing++;
  64. });
  65. studyStats.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  66. return studyStats;
  67. }
  68. }
  69. }