TriggerSurvey.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using Azure.Cosmos;
  2. using Azure.Messaging.ServiceBus;
  3. using Azure.Storage.Blobs.Models;
  4. using Microsoft.Azure.Documents;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Text;
  8. using System.Text.Json;
  9. using System.Threading.Tasks;
  10. using TEAMModelOS.SDK.DI;
  11. using TEAMModelOS.SDK.Extension;
  12. using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
  13. using TEAMModelOS.SDK.Models;
  14. using TEAMModelOS.SDK.Models.Cosmos;
  15. namespace TEAMModelFunction
  16. {
  17. public class TriggerSurvey
  18. {
  19. public static async void Trigger(AzureCosmosFactory _azureCosmos, AzureServiceBusFactory _serviceBus, AzureStorageFactory _azureStorage, DingDing _dingDing,
  20. CosmosClient client, Document input, string code, long stime, long etime, string school,AzureRedisFactory _azureRedis)
  21. {
  22. Survey survey = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Survey>(input.Id, new Azure.Cosmos.PartitionKey($"{code}"));
  23. List<ChangeRecord> changeRecords = await _azureStorage.FindListByDict<ChangeRecord>(new Dictionary<string, object>() { { "RowKey", input.Id }, { "PartitionKey", survey.progress } });
  24. if (survey.ttl >= 1)
  25. {
  26. //TODO 处理TTL删除业务
  27. return;
  28. }
  29. switch (survey.progress)
  30. {
  31. case "pending":
  32. var messageSurvey = new ServiceBusMessage(new { id = input.Id, progress = "going", code = code }.ToJsonString());
  33. messageSurvey.ApplicationProperties.Add("name", "Survey");
  34. if (changeRecords.Count > 0)
  35. {
  36. await _serviceBus.GetServiceBusClient().cancelMessage("active-task", changeRecords[0].sequenceNumber);
  37. long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync("active-task", messageSurvey, DateTimeOffset.FromUnixTimeMilliseconds(stime));
  38. changeRecords[0].sequenceNumber = start;
  39. await _azureStorage.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
  40. }
  41. else
  42. {
  43. long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync("active-task", messageSurvey, DateTimeOffset.FromUnixTimeMilliseconds(stime));
  44. ChangeRecord changeRecord = new ChangeRecord
  45. {
  46. RowKey = input.Id,
  47. PartitionKey = "pending",
  48. sequenceNumber = start,
  49. msgId = messageSurvey.MessageId
  50. };
  51. await _azureStorage.Save<ChangeRecord>(changeRecord);
  52. }
  53. break;
  54. case "going":
  55. ActivityData data;
  56. if (survey.scope == "school")
  57. {
  58. data = new ActivityData
  59. {
  60. id = survey.id,
  61. code = $"Activity-{survey.owner}",
  62. type = "survey",
  63. name = survey.name,
  64. startTime = survey.startTime,
  65. endTime = survey.endTime,
  66. scode = survey.code,
  67. scope = survey.scope,
  68. classes = survey.classes.IsNotEmpty() ? survey.classes : new List<string> { "" },
  69. tmdids = survey.tmdids.IsNotEmpty() ? survey.tmdids : new List<string> { "" },
  70. progress = "going",
  71. owner = survey.owner,
  72. subjects = new List<string> { "" }
  73. };
  74. await client.GetContainer("TEAMModelOS", "School").UpsertItemAsync<ActivityData>(data, new Azure.Cosmos.PartitionKey(data.code));
  75. }
  76. else if (survey.scope == "private")
  77. {
  78. data = new ActivityData
  79. {
  80. id = survey.id,
  81. code = $"Activity-Common",
  82. type = "survey",
  83. name = survey.name,
  84. startTime = survey.startTime,
  85. endTime = survey.endTime,
  86. scode = survey.code,
  87. scope = survey.scope,
  88. progress = "going",
  89. classes = survey.classes.IsNotEmpty() ? survey.classes : new List<string> { "" },
  90. owner = survey.owner,
  91. tmdids = new List<string> { "" },
  92. subjects = new List<string> { "" }
  93. };
  94. await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync<ActivityData>(data, new Azure.Cosmos.PartitionKey(data.code));
  95. }
  96. var messageSurveyEnd = new ServiceBusMessage(new { id = input.Id, progress = "finish", code = code }.ToJsonString());
  97. messageSurveyEnd.ApplicationProperties.Add("name", "Survey");
  98. if (changeRecords.Count > 0)
  99. {
  100. long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync("active-task", messageSurveyEnd, DateTimeOffset.FromUnixTimeMilliseconds(etime));
  101. await _serviceBus.GetServiceBusClient().cancelMessage("active-task", changeRecords[0].sequenceNumber);
  102. changeRecords[0].sequenceNumber = end;
  103. await _azureStorage.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
  104. }
  105. else
  106. {
  107. long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync("active-task", messageSurveyEnd, DateTimeOffset.FromUnixTimeMilliseconds(etime));
  108. ChangeRecord changeRecord = new ChangeRecord
  109. {
  110. RowKey = input.Id,
  111. PartitionKey = "going",
  112. sequenceNumber = end,
  113. msgId = messageSurveyEnd.MessageId
  114. };
  115. await _azureStorage.Save<ChangeRecord>(changeRecord);
  116. }
  117. break;
  118. case "finish":
  119. var records =await _azureRedis.GetRedisClient(8).HashGetAllAsync($"Survey:Record:{survey.id}");
  120. List<dynamic> recs = new List<dynamic>();
  121. foreach (var rcd in records) {
  122. var value = rcd.Value.ToString().ToObject<JsonElement>();
  123. recs.Add(new { index = rcd.Name.ToString(), ans = value });
  124. }
  125. var cods = new { records = recs };
  126. //问卷整体情况
  127. await _azureStorage.UploadFileByContainer(survey.owner, cods.ToJsonString(), "survey", $"{survey.id}/record.json");
  128. //结算每道题的答题情况
  129. var ContainerClient = _azureStorage.GetBlobContainerClient(survey.owner);
  130. var route = ContainerClient.Uri.ToString();
  131. List<BlobItem> items = await ContainerClient.List($"survey/{survey.id}/urecord");
  132. items.ForEach(x => {
  133. var url = $"{route}/{x.Name}";
  134. });
  135. break;
  136. }
  137. }
  138. }
  139. }