TriggerSurvey.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. using Azure.Cosmos;
  2. using Azure.Messaging.ServiceBus;
  3. using Microsoft.Azure.Documents;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Text;
  7. using System.Text.Json;
  8. using System.Threading.Tasks;
  9. using TEAMModelOS.SDK.DI;
  10. using TEAMModelOS.SDK.Extension;
  11. using TEAMModelOS.SDK.Models;
  12. using TEAMModelOS.SDK.Models.Cosmos;
  13. namespace TEAMModelFunction
  14. {
  15. public class TriggerSurvey
  16. {
  17. public static async void Trigger(AzureCosmosFactory _azureCosmos, AzureServiceBusFactory _serviceBus, AzureStorageFactory _azureStorage, DingDing _dingDing,
  18. CosmosClient client, Document input, string code, long stime, long etime, string school)
  19. {
  20. Survey survey = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Survey>(input.Id, new Azure.Cosmos.PartitionKey($"{code}"));
  21. List<ChangeRecord> changeRecords = await _azureStorage.FindListByDict<ChangeRecord>(new Dictionary<string, object>() { { "RowKey", input.Id }, { "PartitionKey", survey.progress } });
  22. if (survey.ttl >= 1)
  23. {
  24. //TODO 处理TTL删除业务
  25. return;
  26. }
  27. switch (survey.progress)
  28. {
  29. case "pending":
  30. var messageSurvey = new ServiceBusMessage(new { id = input.Id, progress = "going", code = code }.ToJsonString());
  31. messageSurvey.ApplicationProperties.Add("name", "Survey");
  32. if (changeRecords.Count > 0)
  33. {
  34. await _serviceBus.GetServiceBusClient().cancelMessage("active-task", changeRecords[0].sequenceNumber);
  35. long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync("active-task", messageSurvey, DateTimeOffset.FromUnixTimeMilliseconds(stime));
  36. changeRecords[0].sequenceNumber = start;
  37. await _azureStorage.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
  38. }
  39. else
  40. {
  41. long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync("active-task", messageSurvey, DateTimeOffset.FromUnixTimeMilliseconds(stime));
  42. ChangeRecord changeRecord = new ChangeRecord
  43. {
  44. RowKey = input.Id,
  45. PartitionKey = "pending",
  46. sequenceNumber = start,
  47. msgId = messageSurvey.MessageId
  48. };
  49. await _azureStorage.Save<ChangeRecord>(changeRecord);
  50. }
  51. break;
  52. case "going":
  53. ActivityData data;
  54. if (survey.scope == "school" || survey.scope == "teacher")
  55. {
  56. data = new ActivityData
  57. {
  58. id = survey.id,
  59. code = $"Activity-{survey.owner}",
  60. type = "survey",
  61. name = survey.name,
  62. startTime = survey.startTime,
  63. endTime = survey.endTime,
  64. scode = survey.code,
  65. scope = survey.scope,
  66. classes = survey.classes,
  67. tmdids = survey.tmdids,
  68. progress = "going",
  69. owner = survey.owner
  70. };
  71. await client.GetContainer("TEAMModelOS", "School").UpsertItemAsync<ActivityData>(data, new Azure.Cosmos.PartitionKey(data.code));
  72. }
  73. else if (survey.scope == "private")
  74. {
  75. data = new ActivityData
  76. {
  77. id = survey.id,
  78. code = $"Activity-Common",
  79. type = "survey",
  80. name = survey.name,
  81. startTime = survey.startTime,
  82. endTime = survey.endTime,
  83. scode = survey.code,
  84. scope = survey.scope,
  85. classes = survey.classes,
  86. progress = "going",
  87. owner = survey.owner
  88. };
  89. await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync<ActivityData>(data, new Azure.Cosmos.PartitionKey(data.code));
  90. }
  91. var messageSurveyEnd = new ServiceBusMessage(new { id = input.Id, progress = "finish", code = code }.ToJsonString());
  92. messageSurveyEnd.ApplicationProperties.Add("name", "Survey");
  93. if (changeRecords.Count > 0)
  94. {
  95. long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync("active-task", messageSurveyEnd, DateTimeOffset.FromUnixTimeMilliseconds(etime));
  96. await _serviceBus.GetServiceBusClient().cancelMessage("active-task", changeRecords[0].sequenceNumber);
  97. changeRecords[0].sequenceNumber = end;
  98. await _azureStorage.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
  99. }
  100. else
  101. {
  102. long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync("active-task", messageSurveyEnd, DateTimeOffset.FromUnixTimeMilliseconds(etime));
  103. ChangeRecord changeRecord = new ChangeRecord
  104. {
  105. RowKey = input.Id,
  106. PartitionKey = "going",
  107. sequenceNumber = end,
  108. msgId = messageSurveyEnd.MessageId
  109. };
  110. await _azureStorage.Save<ChangeRecord>(changeRecord);
  111. }
  112. break;
  113. case "finish":
  114. break;
  115. }
  116. }
  117. }
  118. }