BIHttpTrigger.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Dynamic;
  4. using System.IO;
  5. using System.Net;
  6. using System.Net.Http;
  7. using System.Text.Json;
  8. using System.Threading.Tasks;
  9. using Azure.Cosmos;
  10. using Azure.Storage.Blobs;
  11. using DocumentFormat.OpenXml.Bibliography;
  12. using Microsoft.AspNetCore.Http;
  13. using Microsoft.Azure.Functions.Worker;
  14. using Microsoft.Azure.Functions.Worker.Http;
  15. using StackExchange.Redis;
  16. using TEAMModelOS.SDK.DI;
  17. using TEAMModelOS.SDK.Extension;
  18. using TEAMModelOS.SDK.Models;
  19. using TEAMModelOS.SDK.Models.Cosmos.BI;
  20. using TEAMModelOS.SDK.Models.Cosmos.BI.BISchool;
  21. using TEAMModelOS.SDK.Models.Service.BI;
  22. using TEAMModelOS.SDK.Models.Service.BIStatsWay;
  23. namespace TEAMModelOS.FunctionV4.HttpTrigger
  24. {
  25. public class BIHttpTrigger
  26. {
  27. private readonly AzureCosmosFactory _azureCosmos;
  28. private readonly DingDing _dingDing;
  29. private readonly AzureStorageFactory _azureStorage;
  30. private readonly AzureRedisFactory _azureRedis;
  31. public BIHttpTrigger(AzureCosmosFactory azureCosmos, DingDing dingDing, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis)
  32. {
  33. _azureCosmos = azureCosmos;
  34. _dingDing = dingDing;
  35. _azureStorage = azureStorage;
  36. _azureRedis = azureRedis;
  37. }
  38. /// <summary>
  39. /// 学校信息BI中间件更新
  40. /// </summary>
  41. /// <param name="req"></param>
  42. /// <returns></returns>
  43. [Function("set-sc-birelation")]
  44. public async Task<HttpResponseData> upSchoolBIRelation([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestData req)
  45. {
  46. var response = req.CreateResponse(HttpStatusCode.OK);
  47. dynamic jsondata = new ExpandoObject();
  48. try
  49. {
  50. var cosmosClient = _azureCosmos.GetCosmosClient();
  51. var tableClient = _azureStorage.GetCloudTableClient();
  52. var blobClient = _azureStorage.GetBlobContainerClient(containerName: "0-public");
  53. string data = await new StreamReader(req.Body).ReadToEndAsync();
  54. var json = JsonDocument.Parse(data).RootElement;
  55. School school = new();
  56. jsondata = json;
  57. if (json.TryGetProperty("school", out JsonElement _school))
  58. {
  59. school = _school.ToObject<School>();
  60. }
  61. string type = "";
  62. BIRelation bIRelation = new();
  63. var resBiRel = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(school.id, new PartitionKey("BIRel"));
  64. if (resBiRel.Status == 200)
  65. {
  66. using var fileJson = await JsonDocument.ParseAsync(resBiRel.ContentStream);
  67. bIRelation = fileJson.ToObject<BIRelation>();
  68. }
  69. else
  70. bIRelation.id = school.id;
  71. string aName = null;
  72. if (!string.IsNullOrEmpty($"{school.areaId}"))
  73. aName = await CosmosQueryHelper.GetStr(cosmosClient, "Normal", $"select value(c.name) from c where c.id='{school.areaId}'", "Base-Area");
  74. bIRelation.name = school.name;
  75. bIRelation.picture = school.picture;
  76. bIRelation.region = school.region;
  77. bIRelation.province = school.province;
  78. bIRelation.city = school.city;
  79. bIRelation.dist = school.dist;
  80. bIRelation.address = school.address;
  81. bIRelation.areaId = school.areaId;
  82. bIRelation.size = school.size;
  83. bIRelation.scale = school.scale;
  84. bIRelation.upDate = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  85. bIRelation.areaName = aName;
  86. if (resBiRel.Status == 200)
  87. {
  88. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<BIRelation>(bIRelation, bIRelation.id, new PartitionKey("BIRel"));
  89. type = "update";
  90. }
  91. else
  92. {
  93. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<BIRelation>(bIRelation, new PartitionKey("BIRel"));
  94. type = "add";
  95. }
  96. //保存操作记录
  97. await AzureStorageBlobExtensions.SaveBILog(blobClient, tableClient, $"birelation-{type}", $"触发更新学校信息表中间件", _dingDing);
  98. }
  99. catch (Exception ex)
  100. {
  101. await _dingDing.SendBotMsg($"stats-sc-info,{ex.Message}\n{ex.StackTrace}\n{jsondata.ToJsonString()}", GroupNames.成都开发測試群組);
  102. }
  103. return response;
  104. }
  105. /// <summary>
  106. /// 统计学校的信息
  107. /// </summary>
  108. /// <param name="req"></param>
  109. /// <returns></returns>
  110. [Function("stats-sc-info")]
  111. public async Task<HttpResponseData> StatsSchoolInfo([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestData req)
  112. {
  113. var response = req.CreateResponse(HttpStatusCode.OK);
  114. dynamic jsondata = new ExpandoObject();
  115. try
  116. {
  117. string scId = null;
  118. var cosmosClient = _azureCosmos.GetCosmosClient();
  119. var tableClient = _azureStorage.GetCloudTableClient();
  120. var blobClient = _azureStorage.GetBlobContainerClient(containerName: "0-public");
  121. string data = await new StreamReader(req.Body).ReadToEndAsync();
  122. var json = JsonDocument.Parse(data).RootElement;
  123. jsondata = json;
  124. if (json.TryGetProperty("schoolId", out JsonElement _schoolId))
  125. {
  126. scId = $"{_schoolId}";
  127. }
  128. if (string.IsNullOrEmpty(scId))
  129. {
  130. return response;
  131. }
  132. bool locKey = await _azureRedis.GetRedisClient(8).KeyExistsAsync($"Train:Statistics:Lock:{scId}");
  133. if (!locKey)
  134. {
  135. await _azureRedis.GetRedisClient(8).SetAddAsync($"Train:Statistics:Lock:{scId}", new RedisValue(scId));
  136. DateTime minutes = DateTime.UtcNow.AddMinutes(15); //15分钟
  137. await _azureRedis.GetRedisClient(8).KeyExpireAsync($"Train:Statistics:Lock:{scId}", minutes);
  138. bool isExist = true;
  139. StatsInfo statsInfo = new();
  140. var scDataStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{scId}", new PartitionKey("Stats"));
  141. if (scDataStats.Status == 200)
  142. {
  143. using var fileJson = await JsonDocument.ParseAsync(scDataStats.ContentStream);
  144. statsInfo = fileJson.ToObject<StatsInfo>();
  145. }
  146. else
  147. isExist = false;
  148. statsInfo = await SchoolStatsWay.GetSingleSc(cosmosClient, scId);
  149. statsInfo.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  150. if (isExist)
  151. statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<StatsInfo>(statsInfo, statsInfo.id, new PartitionKey("Stats"));
  152. else
  153. statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Stats"));
  154. }
  155. //保存操作记录
  156. await AzureStorageBlobExtensions.SaveBILog(blobClient, tableClient, "trigger-schoolStats", $"触发更新统计数据库", _dingDing);
  157. }
  158. catch (Exception ex)
  159. {
  160. await _dingDing.SendBotMsg($"stats-sc-info,{ex.Message}\n{ex.StackTrace}\n{jsondata.ToJsonString()}", GroupNames.成都开发測試群組);
  161. }
  162. return response;
  163. }
  164. /// <summary>
  165. /// 处理传过来的信息加入到统计信息中
  166. /// </summary>
  167. /// <param name="req"></param>
  168. /// <returns></returns>
  169. [Function("set-scstats-type")]
  170. public async Task<HttpResponseData> SetSchoolStatsType([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestData req)
  171. {
  172. var response = req.CreateResponse(HttpStatusCode.OK);
  173. dynamic jsondata = new ExpandoObject();
  174. try
  175. {
  176. string scId = null,type = null;
  177. var cosmosClient = _azureCosmos.GetCosmosClient();
  178. var tableClient = _azureStorage.GetCloudTableClient();
  179. var blobClient = _azureStorage.GetBlobContainerClient(containerName: "0-public");
  180. string data = await new StreamReader(req.Body).ReadToEndAsync();
  181. var json = JsonDocument.Parse(data).RootElement;
  182. jsondata = json;
  183. if (json.TryGetProperty("schoolId", out JsonElement _schoolId))
  184. {
  185. scId = $"{_schoolId}";
  186. }
  187. if (json.TryGetProperty("type", out JsonElement _type))
  188. {
  189. type = $"{_type}";
  190. }
  191. if (string.IsNullOrEmpty(scId) && string.IsNullOrEmpty(type))
  192. {
  193. await _dingDing.SendBotMsg($"set-scstats-type, {req.Body};转换后:{json}", GroupNames.成都开发測試群組);
  194. return response;
  195. }
  196. switch ($"{type}")
  197. {
  198. case "Exam":
  199. break;
  200. case "Survey":
  201. break;
  202. case "Vote":
  203. break;
  204. case "Homework":
  205. break;
  206. case "Less":
  207. break;
  208. }
  209. }
  210. catch (Exception ex)
  211. {
  212. await _dingDing.SendBotMsg($"set-scstats-type,{ex.Message}\n{ex.StackTrace}\n{jsondata.ToJsonString()}", GroupNames.成都开发測試群組);
  213. }
  214. return response;
  215. }
  216. }
  217. }