using System; using System.Collections.Generic; using System.Dynamic; using System.IO; using System.Net; using System.Net.Http; using System.Text.Json; using System.Threading.Tasks; using Azure.Cosmos; using Azure.Storage.Blobs; using DocumentFormat.OpenXml.Bibliography; using Microsoft.AspNetCore.Http; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using StackExchange.Redis; using TEAMModelOS.SDK.DI; using TEAMModelOS.SDK.Extension; using TEAMModelOS.SDK.Models; using TEAMModelOS.SDK.Models.Cosmos.BI; using TEAMModelOS.SDK.Models.Cosmos.BI.BISchool; using TEAMModelOS.SDK.Models.Service.BI; using TEAMModelOS.SDK.Models.Service.BIStatsWay; namespace TEAMModelOS.FunctionV4.HttpTrigger { public class BIHttpTrigger { private readonly AzureCosmosFactory _azureCosmos; private readonly DingDing _dingDing; private readonly AzureStorageFactory _azureStorage; private readonly AzureRedisFactory _azureRedis; public BIHttpTrigger(AzureCosmosFactory azureCosmos, DingDing dingDing, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis) { _azureCosmos = azureCosmos; _dingDing = dingDing; _azureStorage = azureStorage; _azureRedis = azureRedis; } /// /// 学校信息BI中间件更新 /// /// /// [Function("set-sc-birelation")] public async Task upSchoolBIRelation([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestData req) { var response = req.CreateResponse(HttpStatusCode.OK); dynamic jsondata = new ExpandoObject(); try { var cosmosClient = _azureCosmos.GetCosmosClient(); var tableClient = _azureStorage.GetCloudTableClient(); var blobClient = _azureStorage.GetBlobContainerClient(containerName: "0-public"); string data = await new StreamReader(req.Body).ReadToEndAsync(); var json = JsonDocument.Parse(data).RootElement; School school = new(); jsondata = json; if (json.TryGetProperty("school", out JsonElement _school)) { school = _school.ToObject(); } string type = ""; BIRelation bIRelation = new(); var resBiRel = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(school.id, new PartitionKey("BIRel")); if (resBiRel.Status == 200) { using var fileJson = await JsonDocument.ParseAsync(resBiRel.ContentStream); bIRelation = fileJson.ToObject(); } else bIRelation.id = school.id; string aName = null; if (!string.IsNullOrEmpty($"{school.areaId}")) aName = await CosmosQueryHelper.GetStr(cosmosClient, "Normal", $"select value(c.name) from c where c.id='{school.areaId}'", "Base-Area"); bIRelation.name = school.name; bIRelation.picture = school.picture; bIRelation.region = school.region; bIRelation.province = school.province; bIRelation.city = school.city; bIRelation.dist = school.dist; bIRelation.address = school.address; bIRelation.areaId = school.areaId; bIRelation.size = school.size; bIRelation.scale = school.scale; bIRelation.upDate = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); bIRelation.areaName = aName; if (resBiRel.Status == 200) { await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(bIRelation, bIRelation.id, new PartitionKey("BIRel")); type = "update"; } else { await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync(bIRelation, new PartitionKey("BIRel")); type = "add"; } //保存操作记录 await AzureStorageBlobExtensions.SaveBILog(blobClient, tableClient, $"birelation-{type}", $"触发更新学校信息表中间件", _dingDing); } catch (Exception ex) { await _dingDing.SendBotMsg($"stats-sc-info,{ex.Message}\n{ex.StackTrace}\n{jsondata.ToJsonString()}", GroupNames.成都开发測試群組); } return response; } /// /// 统计学校的信息 /// /// /// [Function("stats-sc-info")] public async Task StatsSchoolInfo([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestData req) { var response = req.CreateResponse(HttpStatusCode.OK); dynamic jsondata = new ExpandoObject(); try { string scId = null; var cosmosClient = _azureCosmos.GetCosmosClient(); var tableClient = _azureStorage.GetCloudTableClient(); var blobClient = _azureStorage.GetBlobContainerClient(containerName: "0-public"); string data = await new StreamReader(req.Body).ReadToEndAsync(); var json = JsonDocument.Parse(data).RootElement; jsondata = json; if (json.TryGetProperty("schoolId", out JsonElement _schoolId)) { scId = $"{_schoolId}"; } if (string.IsNullOrEmpty(scId)) { return response; } bool locKey = await _azureRedis.GetRedisClient(8).KeyExistsAsync($"Train:Statistics:Lock:{scId}"); if (!locKey) { await _azureRedis.GetRedisClient(8).SetAddAsync($"Train:Statistics:Lock:{scId}", new RedisValue(scId)); DateTime minutes = DateTime.UtcNow.AddMinutes(15); //15分钟 await _azureRedis.GetRedisClient(8).KeyExpireAsync($"Train:Statistics:Lock:{scId}", minutes); bool isExist = true; StatsInfo statsInfo = new(); var scDataStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{scId}", new PartitionKey("Stats")); if (scDataStats.Status == 200) { using var fileJson = await JsonDocument.ParseAsync(scDataStats.ContentStream); statsInfo = fileJson.ToObject(); } else isExist = false; statsInfo = await SchoolStatsWay.GetSingleSc(cosmosClient, scId); statsInfo.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); if (isExist) statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(statsInfo, statsInfo.id, new PartitionKey("Stats")); else statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync(statsInfo, new PartitionKey("Stats")); } //保存操作记录 await AzureStorageBlobExtensions.SaveBILog(blobClient, tableClient, "trigger-schoolStats", $"触发更新统计数据库", _dingDing); } catch (Exception ex) { await _dingDing.SendBotMsg($"stats-sc-info,{ex.Message}\n{ex.StackTrace}\n{jsondata.ToJsonString()}", GroupNames.成都开发測試群組); } return response; } /// /// 处理传过来的信息加入到统计信息中 /// /// /// [Function("set-scstats-type")] public async Task SetSchoolStatsType([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestData req) { var response = req.CreateResponse(HttpStatusCode.OK); dynamic jsondata = new ExpandoObject(); try { string scId = null,type = null; var cosmosClient = _azureCosmos.GetCosmosClient(); var tableClient = _azureStorage.GetCloudTableClient(); var blobClient = _azureStorage.GetBlobContainerClient(containerName: "0-public"); string data = await new StreamReader(req.Body).ReadToEndAsync(); var json = JsonDocument.Parse(data).RootElement; jsondata = json; if (json.TryGetProperty("schoolId", out JsonElement _schoolId)) { scId = $"{_schoolId}"; } if (json.TryGetProperty("type", out JsonElement _type)) { type = $"{_type}"; } if (string.IsNullOrEmpty(scId) && string.IsNullOrEmpty(type)) { await _dingDing.SendBotMsg($"set-scstats-type, {req.Body};转换后:{json}", GroupNames.成都开发測試群組); return response; } switch ($"{type}") { case "Exam": break; case "Survey": break; case "Vote": break; case "Homework": break; case "Less": break; } } catch (Exception ex) { await _dingDing.SendBotMsg($"set-scstats-type,{ex.Message}\n{ex.StackTrace}\n{jsondata.ToJsonString()}", GroupNames.成都开发測試群組); } return response; } } }