123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- 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 Microsoft.Azure.Cosmos;
- using TEAMModelOS.SDK.Models.Cosmos.School;
- using TEAMModelOS.SDK.Models;
- using TEAMModelOS.SDK.Extension;
- using Microsoft.OData.Edm;
- using TEAMModelOS.Function;
- namespace TEAMModelOS.CosmosDBTriggers
- {
- 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<QuotaImport>();
- if (quotaImport != null)
- {
- HashSet<string> ids = new HashSet<string>();
- foreach (var x in quotaImport.students)
- {
- string id = $"{quotaImport.year}-{quotaImport.semesterId}-{x.id}";
- ids.Add(id);
- }
- HashSet<OverallEducation> overallEducations = new HashSet<OverallEducation>();
- 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<OverallEducation>(sql, $"OverallEducation-{quotaImport.school}");
- IEnumerable<string> notInDbIds = null;
- if (result.list.IsNotEmpty())
- {
- notInDbIds = ids.Except(result.list.Select(x => x.id));
- overallEducations = new HashSet<OverallEducation>(result.list);
- }
- else
- {
- notInDbIds = ids;
- }
- HashSet<OverallEducation> overallEducationChanged = new HashSet<OverallEducation>();
- 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<ItemScore> 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<ItemScore> 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<ItemScore> 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<EducationScore>
- {
- 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));
- }
- }
- }
- }
- }
|