using Microsoft.Extensions.Configuration; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text; using System.Text.Json; using System.Threading.Tasks; using TEAMModelOS.SDK.DI; using TEAMModelOS.SDK; using Azure.Cosmos; using TEAMModelOS.SDK.Models.Cosmos.School; using TEAMModelOS.SDK.Models; using TEAMModelOS.SDK.Extension; using HTEXLib.COMM.Helpers; using OpenXmlPowerTools; using Microsoft.OData.Edm; namespace TEAMModelOS.FunctionV4.CosmosDB { public class TriggerQuotaImport { public static async Task Trigger(CoreAPIHttpService _coreAPIHttpService, AzureCosmosFactory _azureCosmos, AzureServiceBusFactory _serviceBus, AzureStorageFactory _azureStorage, DingDing _dingDing, CosmosClient client, JsonElement input, TriggerData data, IHttpClientFactory _httpClient, IConfiguration _configuration,AzureRedisFactory _azureRedis) { QuotaImport quotaImport = input.ToObject(); if (quotaImport != null) { HashSet ids = new HashSet(); foreach (var x in quotaImport.students) { string id = $"{quotaImport.year}-{quotaImport.semesterId}-{x.id}"; ids.Add(id); } HashSet overallEducations = new HashSet(); string sql = $"select value c from c where c.id in ({string.Join(",", ids.Select(z => $"'{z}'"))}) and c.periodId='{quotaImport.periodId}' "; var result = await client.GetContainer(Constant.TEAMModelOS, Constant.Student).GetList(sql, $"OverallEducation-{quotaImport.school}"); IEnumerable notInDbIds = null; if (result.list.IsNotEmpty()) { notInDbIds = ids.Except(result.list.Select(x => x.id)); overallEducations = new HashSet(result.list); } else { notInDbIds = ids; } HashSet overallEducationChanged = new HashSet(); foreach (var y in quotaImport.students) { string id = $"{quotaImport.year}-{quotaImport.semesterId}-{y.id}"; var overallEducation = overallEducations.Where(z => z.id.Equals(id)).FirstOrDefault(); if (overallEducation != null) { EducationScore quota = null; if (quotaImport.dimension.Equals("virtue")) { quota = overallEducation.virtue.Find(f => f.examId.Equals($"{overallEducation.stuYear}-{overallEducation.semesterId}")); } else if (quotaImport.dimension.Equals("labour")) { quota = overallEducation.labour.Find(f => f.examId.Equals($"{overallEducation.stuYear}-{overallEducation.semesterId}")); } else if (quotaImport.dimension.Equals("sports")) { quota = overallEducation.sports.Find(f => f.examId.Equals($"{overallEducation.stuYear}-{overallEducation.semesterId}")); } if (quota != null) { //体育成绩直接覆盖 if (quotaImport.dimension.Equals("sports")) { List itemScores = y.items.Select(z => new ItemScore { totalScore = !quotaImport.dimension.Equals("sports") ? 0 : 100, name = z.code, score = z.value, type = z.code, id = !quotaImport.dimension.Equals("sports") ? $"{y.date}-{z.code}" : z.code, time = y.time }).ToList(); quota.itemScore = itemScores; overallEducationChanged.Add(overallEducation); } else { y.items.ForEach(z => { var item = quota.itemScore.Find(f => f.id.Equals(!quotaImport.dimension.Equals("sports") ? $"{y.date}-{z.code}" : z.code)); if (item != null) { item.name = z.code; if (item.score != z.value) { item.score = z.value; overallEducationChanged.Add(overallEducation); } item.totalScore = !quotaImport.dimension.Equals("sports") ? 0 : 100; item.type = z.code; item.time = y.time; item.id = !quotaImport.dimension.Equals("sports") ? $"{y.date}-{z.code}" : z.code; } else { overallEducationChanged.Add(overallEducation); quota.itemScore.Add(new ItemScore { totalScore = !quotaImport.dimension.Equals("sports") ? 0 : 100, name = z.code, score = z.value, type = z.code, id = id = !quotaImport.dimension.Equals("sports") ? $"{y.date}-{z.code}" : z.code, time = y.time }); } }); } if (quota.sumScore != quota.itemScore.Sum(z => z.score)) { overallEducationChanged.Add(overallEducation); quota.sumScore = quota.itemScore.Sum(z => z.score); } if (quota.totalScore != quota.itemScore.Sum(z => z.totalScore)) { overallEducationChanged.Add(overallEducation); quota.totalScore = quota.itemScore.Sum(z => z.totalScore); } quota.rate = quotaImport.dimension.Equals("sports") && quota.itemScore.Sum(z => z.totalScore) > 0 ? quota.itemScore.Sum(z => z.score) * 1.0 / quota.itemScore.Sum(z => z.totalScore) : 0; quota.excellenceRate = quotaImport.dimension.Equals("sports") && quota.itemScore.Sum(z => z.totalScore) > 0 ? quota.itemScore.Where(z => z.score >= 90).Sum(z => z.score) * 1.0 / quota.itemScore.Sum(z => z.totalScore) : 0; quota.passRate = quotaImport.dimension.Equals("sports") && quota.itemScore.Sum(z => z.totalScore) > 0 ? quota.itemScore.Where(z => z.score >= 60).Sum(z => z.score) * 1.0 / quota.itemScore.Sum(z => z.totalScore) : 0; quota.examType = quotaImport.type; quota.examDate = quotaImport.time; quota.examName = $"{overallEducation.stuYear}-{overallEducation.semesterId}"; } else { List itemScores = y.items.Select(z =>new ItemScore { totalScore = !quotaImport.dimension.Equals("sports") ? 0 : 100, name = z.code, score = z.value, type = z.code, id = !quotaImport.dimension.Equals("sports") ? $"{y.date}-{z.code}" : z.code, time = y.time }).ToList(); EducationScore educationScore = new EducationScore { examName = $"{overallEducation.stuYear}-{overallEducation.semesterId}", examId = $"{overallEducation.stuYear}-{overallEducation.semesterId}", examDate = quotaImport.time, examType = quotaImport.type, sumScore = itemScores.Sum(z => z.score), itemScore = itemScores, totalScore = itemScores.Sum(z => z.totalScore), rate = quotaImport.dimension.Equals("sports") && itemScores.Sum(z => z.totalScore) > 0 ? itemScores.Sum(z => z.score) * 1.0 / itemScores.Sum(z => z.totalScore) : 0, excellenceRate = quotaImport.dimension.Equals("sports") && itemScores.Sum(z => z.totalScore) > 0 ? itemScores.Where(z => z.score >= 90).Sum(z => z.score) * 1.0 / itemScores.Sum(z => z.totalScore) : 0, passRate = quotaImport.dimension.Equals("sports") && itemScores.Sum(z => z.totalScore) > 0 ? itemScores.Where(z => z.score >= 60).Sum(z => z.score) * 1.0 / itemScores.Sum(z => z.totalScore) : 0, }; if (quotaImport.dimension.Equals("virtue")) { overallEducation.virtue.Add(educationScore); } else if (quotaImport.dimension.Equals("labour")) { overallEducation.labour.Add(educationScore); } else if (quotaImport.dimension.Equals("sports")) { overallEducation.sports.Add(educationScore); } overallEducationChanged.Add(overallEducation); } } else { List itemScores = y.items.Select(z => new ItemScore { totalScore = !quotaImport.dimension.Equals("sports") ? 0 : 100, name = z.code, score = z.value, type = z.code, id = !quotaImport.dimension.Equals("sports") ? $"{y.date}-{z.code}" : z.code, time = y.time } ).ToList(); var educationScores = new List { new EducationScore { examName=$"{y.stuYear}-{quotaImport.semesterId}", examId =$"{y.stuYear}-{quotaImport.semesterId}", examDate=quotaImport.time, examType=quotaImport.type, sumScore = itemScores.Sum(z => z.score), itemScore = itemScores, totalScore = itemScores.Sum(z => z.totalScore), rate= quotaImport.dimension.Equals("sports") && itemScores.Sum(z => z.totalScore)>0 ? itemScores.Sum(z => z.score) *1.0 / itemScores.Sum(z => z.totalScore):0, excellenceRate=quotaImport.dimension.Equals("sports")&& itemScores.Sum(z => z.totalScore)>0 ? itemScores.Where(z => z.score >= 90).Sum(z => z.score) *1.0 / itemScores.Sum(z => z.totalScore):0, passRate= quotaImport.dimension.Equals("sports") && itemScores.Sum(z => z.totalScore)>0 ? itemScores.Where(z => z.score >= 60).Sum(z => z.score) *1.0 / itemScores.Sum(z => z.totalScore):0, } }; overallEducation = new OverallEducation { id = id, code = $"OverallEducation-{quotaImport.school}", pk = "OverallEducation", periodId = quotaImport.periodId, year = quotaImport.year, semesterId = quotaImport.semesterId, schoolCode = quotaImport.school, studentId = y.id, name = y.name, classId = y.classId, stuYear = y.stuYear }; if (quotaImport.dimension.Equals("virtue")) { overallEducation.virtue= educationScores; } else if (quotaImport.dimension.Equals("labour")) { overallEducation.labour= educationScores; } else if (quotaImport.dimension.Equals("sports")) { overallEducation.sports= educationScores; } overallEducationChanged.Add(overallEducation); overallEducations.Add(overallEducation); } } foreach (var item in overallEducationChanged) { await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS,Constant.Student).UpsertItemAsync(item,new PartitionKey (item.code)); string key = $"OverallEducation:{item.schoolCode}:{item.periodId}:{item.year}:{item.semesterId}:{item.classId}"; await _azureRedis.GetRedisClient(8).HashSetAsync(key, item.studentId, item.ToJsonString()); await _azureRedis.GetRedisClient(8).KeyExpireAsync(key, new TimeSpan(180 * 24, 0, 0)); } } } } }