NoticeServiceBus.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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 AzureRedisFactory _azureRedis;
  17. private readonly AzureStorageFactory _azureStorage;
  18. private readonly AzureServiceBusFactory _serviceBus;
  19. private readonly DingDing _dingDing;
  20. public NoticeServiceBus(AzureRedisFactory azureRedis, 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("%Azure:ServiceBus:NoticeTask%", "notice", Connection = "Azure:ServiceBus:ConnectionString")] string msg) {
  29. var client = _azureRedis.GetRedisClient(8);
  30. try {
  31. Console.WriteLine(msg);
  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. if (string.IsNullOrEmpty(blobcntr)) {
  45. return;
  46. }
  47. #if DEBUG
  48. await _dingDing.SendBotMsg($"NoticeServiceBus-Notice:\n发起通知{msg}", GroupNames.成都开发測試群組);
  49. #endif
  50. var urlNotice = $"{notice.msgId}.json";
  51. var blobNotice = new {
  52. notice.type,
  53. notice.priority,
  54. notice.body,
  55. notice.creation,
  56. notice.expire,
  57. notice.creatorId
  58. };
  59. await _azureStorage.UploadFileByContainer(blobcntr, blobNotice.ToJsonString(), "notice", urlNotice) ;
  60. var urlReceiver = $"{notice.msgId}_receiver.json";
  61. var blobReceiver = new
  62. {
  63. notice.stuids,
  64. notice.tmdids
  65. };
  66. await _azureStorage.UploadFileByContainer(blobcntr, blobReceiver.ToJsonString(), "notice", urlReceiver);
  67. long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  68. // "ttl":2592000,不能超过30天(2592000),一天(3600),一周(25200)
  69. if (notice.stuids.IsNotEmpty()) {
  70. // List<Receiver> receivers = new List<Receiver>();
  71. foreach (var stu in notice.stuids) {
  72. Receiver receiver = new Receiver
  73. {
  74. id = notice.msgId,
  75. pk = "Receiver",
  76. status = 0,
  77. scope = "school",
  78. ctime= now,
  79. urlNotice = $"/notice/{urlNotice}",
  80. rid =$"{stu.schoolId}-{stu.id}"
  81. };
  82. var url = $"{stu.id}/receive/{notice.msgId}.json";
  83. await client.HashSetAsync($"Notice:Receiver:{stu.schoolId}-{stu.id}", notice.msgId, $"/student/{url}");
  84. // await client.GetContainer("TEAMModelOS", "Common").UpsertItemAsync<Receiver>(receiver,new Azure.Cosmos.PartitionKey(receiver.code));
  85. // /student/{stuid}/receive/{notice.sid}.json
  86. //存放通知到学生容器空间
  87. await _azureStorage.UploadFileByContainer(blobcntr, receiver.ToJsonString(), "student", url) ;
  88. var messageBlob = new ServiceBusMessage(receiver.ToJsonString()) { SessionId =$"{stu.schoolId}-{stu.id}"};
  89. // messageBlob.ApplicationProperties.Add("name", "Receiver");
  90. await _serviceBus.GetServiceBusClient().SendMessageAsync("notice-task", messageBlob);
  91. }
  92. }
  93. if (notice.tmdids.IsNotEmpty())
  94. {
  95. foreach (var tmdid in notice.tmdids)
  96. {
  97. Receiver receiver = new Receiver
  98. {
  99. id = notice.msgId,
  100. pk = "Receiver",
  101. status = 0,
  102. //school = stu.schoolId,
  103. scope = "school",
  104. ctime = now,
  105. urlNotice = $"/notice/{urlNotice}",
  106. rid = $"{tmdid}"
  107. };
  108. var url = $"{notice.msgId}.json";
  109. await client.HashSetAsync($"Notice:Receiver:{tmdid}", notice.msgId,new { now,url = $"/receive/{url}" }.ToJsonString());
  110. //await client.GetContainer("TEAMModelOS", "Common").UpsertItemAsync<Receiver>(receiver, new Azure.Cosmos.PartitionKey(receiver.code));
  111. // /student/{stuid}/receive/{notice.sid}.json
  112. //存放通知到学生容器空间
  113. await _azureStorage.UploadFileByContainer(blobcntr, receiver.ToJsonString(), "receive", url);
  114. var messageBlob = new ServiceBusMessage(receiver.ToJsonString()) { SessionId = $"{tmdid}" };
  115. //messageBlob.ApplicationProperties.Add("name", "Receiver");
  116. await _serviceBus.GetServiceBusClient().SendMessageAsync("notice-task", messageBlob);
  117. }
  118. }
  119. } catch (Exception ex) {
  120. await _dingDing.SendBotMsg($"NoticeServiceBus-Notice\n{ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  121. }
  122. }
  123. }
  124. }