NoticeServiceBus.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using Azure.Messaging.ServiceBus;
  2. using Microsoft.Azure.WebJobs;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Text;
  6. using System.Text.Json;
  7. using System.Threading.Tasks;
  8. using TEAMModelOS.SDK.DI;
  9. using TEAMModelOS.SDK.Extension;
  10. using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
  11. using TEAMModelOS.SDK.Models;
  12. namespace TEAMModelFunction
  13. {
  14. public class NoticeServiceBus
  15. {
  16. private readonly AzureCosmosFactory _azureCosmos;
  17. private readonly AzureStorageFactory _azureStorage;
  18. private readonly AzureServiceBusFactory _serviceBus;
  19. private readonly DingDing _dingDing;
  20. public NoticeServiceBus(AzureCosmosFactory azureCosmos, DingDing dingDing,AzureStorageFactory azureStorage, AzureServiceBusFactory serviceBus)
  21. {
  22. _azureStorage = azureStorage;
  23. _azureCosmos = azureCosmos;
  24. _dingDing = dingDing;
  25. _serviceBus = serviceBus;
  26. }
  27. [FunctionName("Notice")]
  28. public async Task Notice([ServiceBusTrigger("active-task", "notice", Connection = "Azure:ServiceBus:ConnectionString")] string msg) {
  29. var client = _azureCosmos.GetCosmosClient();
  30. try {
  31. await _dingDing.SendBotMsg($"NoticeServiceBus-Notice:\n发起通知{msg}", GroupNames.成都开发測試群組);
  32. List<Task<string>> tasks = new List<Task<string>>();
  33. List<Task> sessionTasks = new List<Task>();
  34. var jsonMsg = JsonDocument.Parse(msg);
  35. Notice notice = msg.ToObject<Notice>();
  36. var blobcntr = "";
  37. if (notice.scope.Equals("school"))
  38. {
  39. blobcntr = notice.school;
  40. }
  41. else {
  42. blobcntr = notice.creatorId;
  43. }
  44. var urlNotice = $"{notice.sid}.json";
  45. var blobNotice = new {
  46. notice.sid,
  47. notice.scode,
  48. notice.spk,
  49. notice.scope,
  50. notice.school,
  51. notice.type,
  52. notice.level,
  53. notice.data,
  54. notice.stime,
  55. notice.etime,
  56. notice.creatorId
  57. };
  58. tasks.Add(_azureStorage.UploadFileByContainer(blobcntr, blobNotice.ToJsonString(), "notice", urlNotice));
  59. var urlReceiver = $"{notice.sid}_receiver.json";
  60. var blobReceiver = new
  61. {
  62. notice.stuids,
  63. notice.tmdids
  64. };
  65. tasks.Add(_azureStorage.UploadFileByContainer(blobcntr, blobReceiver.ToJsonString(), "notice", urlReceiver));
  66. long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  67. // "ttl":2592000,不能超过30天(2592000),一天(3600),一周(25200)
  68. long ttl = notice.etime - now;
  69. long day30 = 2592000L * 1000;
  70. if (ttl > day30) {
  71. ttl = day30;
  72. }
  73. if (notice.stuids.IsNotEmpty()) {
  74. // List<Receiver> receivers = new List<Receiver>();
  75. foreach (var stu in notice.stuids) {
  76. Receiver receiver = new Receiver
  77. {
  78. id = notice.sid,
  79. pk = "Receiver",
  80. status = 0,
  81. school = stu.schoolId,
  82. scope = "school",
  83. code = $"Receiver-{stu.schoolId}-{stu.id}",
  84. ttl = (int)ttl,
  85. ctime= now,
  86. urlNotice=$"notice/{urlNotice}"
  87. };
  88. await client.GetContainer("TEAMModelOS", "Student").UpsertItemAsync<Receiver>(receiver,new Azure.Cosmos.PartitionKey(receiver.code));
  89. // /student/{stuid}/receive/{notice.sid}.json
  90. //存放通知到学生容器空间
  91. var url = $"{stu.id}/receive/{notice.sid}.json";
  92. tasks.Add(_azureStorage.UploadFileByContainer(blobcntr, receiver.ToJsonString(), "student", url));
  93. var messageBlob = new ServiceBusMessage(notice.ToJsonString()) { SessionId =$"{stu.schoolId}-{stu.id}"};
  94. messageBlob.ApplicationProperties.Add("name", "Receiver");
  95. sessionTasks.Add(_serviceBus.GetServiceBusClient().SendMessageAsync("active-task", messageBlob));
  96. }
  97. }
  98. if (notice.tmdids.IsNotEmpty())
  99. {
  100. foreach (var tmdid in notice.tmdids)
  101. {
  102. Receiver receiver = new Receiver
  103. {
  104. id = notice.sid,
  105. pk = "Receiver",
  106. status = 0,
  107. //school = stu.schoolId,
  108. scope = "school",
  109. code = $"Receiver-{tmdid}",
  110. ttl = (int)ttl,
  111. ctime = now,
  112. urlNotice = $"notice/{urlNotice}"
  113. };
  114. await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync<Receiver>(receiver, new Azure.Cosmos.PartitionKey(receiver.code));
  115. // /student/{stuid}/receive/{notice.sid}.json
  116. //存放通知到学生容器空间
  117. var url = $"{notice.sid}.json";
  118. tasks.Add(_azureStorage.UploadFileByContainer(blobcntr, receiver.ToJsonString(), "receive", url));
  119. var messageBlob = new ServiceBusMessage(notice.ToJsonString()) { SessionId = $"{tmdid}" };
  120. messageBlob.ApplicationProperties.Add("name", "Receiver");
  121. sessionTasks.Add(_serviceBus.GetServiceBusClient().SendMessageAsync("active-task", messageBlob));
  122. }
  123. }
  124. await Task.WhenAll(sessionTasks);
  125. await Task.WhenAll(tasks);
  126. } catch (Exception ex) {
  127. await _dingDing.SendBotMsg($"NoticeServiceBus-Notice\n{ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  128. }
  129. }
  130. }
  131. }