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