using Azure; using Microsoft.Azure.Cosmos; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Text.Json; using System.Threading.Tasks; using TEAMModelOS.SDK.DI; using TEAMModelOS.SDK.Extension; using TEAMModelOS.SDK.Models; using TEAMModelOS.SDK.Models.Service; namespace TEAMModelOS.SDK { public class IESActivityService { public static async Task FixActivity(CosmosClient client, DingDing _dingDing, GroupChange groupChange, string type) { try { var query = $"SELECT distinct c.owner, c.id,c.code, c.classes,c.stuLists,c.subjects,c.progress,c.scope,c.groupLists,c.startTime,c.school,c.creatorId,c.name,c.pk ,c.endTime,c.targets FROM c " + $"where (c.status<>404 or IS_DEFINED(c.status) = false ) and c.pk='{type}' " + $" and (( array_contains(c.classes,'{groupChange.listid}')) or ( array_contains(c.stuLists,'{groupChange.listid}'))or ( array_contains(c.tchLists,'{groupChange.listid}')))"; //$"and A1 in('{groupChange.listid}') "; List datas = new List(); List classId = new List(); classId.Add(groupChange.listid); if (groupChange.scope.Equals("school", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(groupChange.school)) { await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIteratorSql(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"{type}-{groupChange.school}") })) { datas.Add(item); } ///还要处理该学校每个老师发布的班级的 List teachers = new List(); await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIteratorSql(queryText: $"SELECT c.id, c.name FROM c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{groupChange.school}") })) { teachers.Add(item); } foreach (var techer in teachers) { var queryTech = $"SELECT distinct c.owner, c.id,c.code, c.classes,c.stuLists,c.subjects,c.progress,c.groupLists,c.scope,c.startTime,c.school,c.creatorId,c.name,c.pk ,c.endTime,c.targets FROM c " + $" where (c.status<>404 or IS_DEFINED(c.status) = false ) and c.school='{groupChange.school}' and c.pk='{type}'" + $" and (( array_contains(c.classes,'{groupChange.listid}')) or ( array_contains(c.stuLists,'{groupChange.listid}')))"; // $" and A1 in('{groupChange.listid}') "; await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIteratorSql(queryText: queryTech, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"{type}-{techer.id}") })) { datas.Add(item); } } } if (groupChange.scope.Equals("private", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(groupChange.creatorId)) { await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIteratorSql(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"{type}-{groupChange.creatorId}") })) { datas.Add(item); } } long nowtime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); foreach (MQActivity activity in datas) { List sub = new(); if (!type.Equals("Exam")) { if (activity.targets.Count > 0) { foreach (var course in activity.targets) { if (course.ValueKind.Equals(JsonValueKind.String) && !string.IsNullOrWhiteSpace($"{course}")) { sub.Add($"{course}"); } else if (course.ValueKind.Equals(JsonValueKind.Array)) { var info = course.ToObject>(); if (info.Count > 1) { sub.Add(info[0]); } } } } } //已经完结的不再允许加入,还未开始的。 if (string.IsNullOrEmpty(activity.progress) || activity.progress.Equals("finish") || activity.progress.Equals("pending")) { continue; } //classId = ExamService.getClasses(activity.classes, activity.stuLists); List classResults = new List(); List standerAnswers = new List(); if (type.Equals("Exam")) { if (groupChange.scope.Equals("school")) { await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIteratorSql(queryText: $"select value(c) from c where c.examId = '{activity.id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ExamClassResult-{groupChange.school}") })) { classResults.Add(item); } } else { await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIteratorSql(queryText: $"select value(c) from c where c.examId = '{activity.id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ExamClassResult-{groupChange.creatorId}") })) { classResults.Add(item); } } await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIteratorSql( queryText: $"select A0.answers from c join A0 in c.papers where c.id = '{activity.id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"{activity.code}") })) { standerAnswers.Add(item); } } //stujoin新加入名单的 /* foreach (Member member in groupChange.stujoin) { ExamInfo info = await updateClassResulte(client, classResults, standerAnswers, member, groupChange,activity); var stucourse = new StuActivity { id = activity.id, scode = activity.code, name = activity.name, source = type.Equals("Exam") ? info.source :"", ext = type.Equals("Exam") ? new Dictionary() { { "type", info.type.ToJsonString().ToObject() } } : new Dictionary(), code = $"Activity-{member.code.Replace("Base-", "")}-{member.id}", scope = activity.scope, school = activity.school, creatorId = activity.creatorId, pk = "Activity", type = type, subjects = activity.pk.ToLower().Equals("exam") && activity.subjects.IsNotEmpty() ? new List() { activity.subjects[0].id } : sub, startTime = activity.startTime, endTime = activity.endTime, blob = activity.blob, owner = activity.owner, createTime = nowtime, taskStatus = -1, classIds = classId }; await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code)); } */ //tmdjoin新加入的 /* foreach (Member member in groupChange.tmdjoin) { ExamInfo info = await updateClassResulte(client, classResults, standerAnswers, member, groupChange,activity); var stucourse = new StuActivity { id = activity.id, scode = activity.code, name = activity.name, source = type.Equals("Exam") ? info.source : "", ext = type.Equals("Exam") ? new Dictionary() { { "type", info.type.ToJsonString().ToObject() }} : new Dictionary(), code = $"Activity-{member.id}", scope = activity.scope, school = activity.school, creatorId = activity.creatorId, pk = "Activity", type = type, subjects = activity.pk.ToLower().Equals("exam") && activity.subjects.IsNotEmpty() ? new List() { activity.subjects[0].id } : sub, startTime = activity.startTime, endTime = activity.endTime, blob = activity.blob, owner = activity.owner, createTime = nowtime, taskStatus = -1, classIds = classId }; await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code)); } */ //tchjoin新加入的 /* foreach (Member member in groupChange.tchjoin) { var groupNames = activity.groupLists.FirstOrDefault().Select(x => x.Value).FirstOrDefault(); if (groupNames.Count > 0) { if (groupNames.Contains(member.groupName)) { var stucourse = new StuActivity { id = activity.id, scode = activity.code, name = activity.name, code = $"Activity-{member.id}", scope = activity.scope, school = activity.school, creatorId = activity.creatorId, pk = "Activity", type = type, subjects = activity.pk.ToLower().Equals("exam") && activity.subjects.IsNotEmpty() ? new List() { activity.subjects[0].id } : new List() { "" }, startTime = activity.startTime, endTime = activity.endTime, blob = activity.blob, owner = activity.owner, createTime = nowtime, taskStatus = -1, classIds = classId }; await client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code)); } } else { var stucourse = new StuActivity { id = activity.id, scode = activity.code, name = activity.name, code = $"Activity-{member.id}", scope = activity.scope, school = activity.school, creatorId = activity.creatorId, pk = "Activity", type = type, subjects = activity.pk.ToLower().Equals("exam") && activity.subjects.IsNotEmpty() ? new List() { activity.subjects[0].id } : new List() { "" }, startTime = activity.startTime, endTime = activity.endTime, blob = activity.blob, owner = activity.owner, createTime = nowtime, taskStatus = -1, classIds = classId }; await client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code)); } } */ /* foreach (Member member in groupChange.stuleave) { try { await updateClassResulte(client, classResults, standerAnswers, member, groupChange,activity); StuActivity stuActivity = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync(activity.id, new PartitionKey($"Activity-{member.code.Replace("Base-", "")}-{member.id}")); stuActivity.classIds.Remove(groupChange.listid); if (stuActivity.classIds.IsNotEmpty()) { await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync(stuActivity, activity.id, new PartitionKey(stuActivity.code)); } else { await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync(activity.id, new PartitionKey($"Activity-{member.code.Replace("Base-", "")}-{member.id}")); } } catch (CosmosException) { continue; } } foreach (Member member in groupChange.tmdleave) { try { await updateClassResulte(client, classResults, standerAnswers, member, groupChange,activity); StuActivity stuActivity = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync(activity.id, new PartitionKey($"Activity-{member.id}")); stuActivity.classIds.Remove(groupChange.listid); if (stuActivity.classIds.IsNotEmpty()) { await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync(stuActivity, activity.id, new PartitionKey(stuActivity.code)); } else { await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync(activity.id, new PartitionKey($"Activity-{member.id}")); } } catch (CosmosException) { continue; } } foreach (Member member in groupChange.tchleave) { try { StuActivity stuActivity = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync(activity.id, new PartitionKey($"Activity-{member.id}")); stuActivity.classIds.Remove(groupChange.listid); if (stuActivity.classIds.IsNotEmpty()) { await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync(stuActivity, activity.id, new PartitionKey(stuActivity.code)); } else { await client.GetContainer(Constant.TEAMModelOS, "Teacher").DeleteItemAsync(activity.id, new PartitionKey($"Activity-{member.id}")); } } catch (CosmosException) { continue; } } */ } } catch (CosmosException e) { await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-GroupListService-FixActivity\n{e.Message}\n{e.StackTrace}\nCosmosException{e.StatusCode}", GroupNames.醍摩豆服務運維群組); } catch (Exception ex) { await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-GroupListService-FixActivity\n{ex.Message}\n{ex.StackTrace}{groupChange.ToJsonString()}{type}", GroupNames.醍摩豆服務運維群組); } } /* public static async Task FixStuCourse(CosmosClient client, DingDing _dingDing, GroupChange groupChange) { //1.查找学校或教师的课程是否包含该名单的课程。 var query = $"select distinct c.code,c.id,c.no,c.name,c.scope, c.creatorId,c.school from c join A0 in c.schedule where A0.stulist = '{groupChange.listid}' or A0.classId = '{groupChange.listid}' "; if (groupChange.status.Equals("delete")) { query = $"select distinct value(c) from c join A0 in c.schedule where A0.stulist = '{groupChange.listid}' or A0.classId = '{groupChange.listid}' "; } List courses = new List(); if (!string.IsNullOrWhiteSpace(groupChange.creatorId)) { await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIteratorSql(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{groupChange.creatorId}") })) { courses.Add(item); } } if (!string.IsNullOrWhiteSpace(groupChange.school)) { await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIteratorSql(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{groupChange.school}") })) { courses.Add(item); } } //if (groupChange.scope.Equals("school") && !string.IsNullOrEmpty(groupChange.school)) //{ // await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIteratorSql(queryText: query, // requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{groupChange.school}") })) // { // courses.Add(item); // } //} //if (groupChange.scope.Equals("private") && !string.IsNullOrEmpty(groupChange.creatorId)) //{ // await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIteratorSql(queryText: query, // requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{groupChange.creatorId}") })) // { // courses.Add(item); // } //} long nowtime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); // await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-GroupListService-FixStuCourse\n名单发生变更 需要处理的课程\n{courses.ToJsonString()}", GroupNames.醍摩豆服務運維群組); //2.获取课程的id 并尝试添加或移除对应的学生课程记录StuCourse。 foreach (var course in courses) { //学生新加入名单的 foreach (Member member in groupChange.stujoin) { ResponseMessage response = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemStreamAsync(course.id, new PartitionKey($"StuCourse-{member.code.Replace("Base-", "")}-{member.id}")); if (response.StatusCode == System.Net.HttpStatusCode.OK) { StuCourse stuCourse = JsonDocument.Parse(response.Content).RootElement.Deserialize(); stuCourse.name = course.name; stuCourse.scode = course.code; stuCourse.name = course.name; stuCourse.scope = course.scope; stuCourse.school = course.school; stuCourse.creatorId = course.creatorId; if (groupChange.type.Equals("class")) { if (stuCourse.classId.IsNotEmpty()) { if (!stuCourse.classId.Contains(groupChange.listid)) { stuCourse.classId.Add(groupChange.listid); } } else { stuCourse.classId = new List { groupChange.listid }; } } else { if (stuCourse.stulist.IsNotEmpty()) { if (!stuCourse.stulist.Contains(groupChange.listid)) { stuCourse.stulist.Add(groupChange.listid); } } else { stuCourse.stulist = new List { groupChange.listid }; } } try { await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync(stuCourse, stuCourse.id, new PartitionKey(stuCourse.code)); } catch (Exception) { continue; } } else { var stucourse = new StuCourse { id = course.id, scode = course.code, name = course.name, code = $"StuCourse-{member.code.Replace("Base-", "")}-{member.id}", scope = course.scope, school = course.school, creatorId = course.creatorId, pk = "StuCourse", createTime = nowtime }; if (groupChange.type.Equals("class")) { stucourse.classId = new List { groupChange.listid }; } else { stucourse.stulist = new List { groupChange.listid }; } try { await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(stucourse, new PartitionKey(stucourse.code)); } catch (Exception) { continue; } } } //tmd新加入的 foreach (Member member in groupChange.tmdjoin) { try { ResponseMessage response = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemStreamAsync(course.id, new PartitionKey($"StuCourse-{member.id}")); if (response.StatusCode == System.Net.HttpStatusCode.OK) { StuCourse stuCourse = JsonDocument.Parse(response.Content).RootElement.Deserialize(); stuCourse.name = course.name; stuCourse.scode = course.code; stuCourse.name = course.name; stuCourse.scope = course.scope; stuCourse.school = course.school; stuCourse.creatorId = course.creatorId; if (groupChange.type.Equals("class")) { if (stuCourse.classId.IsNotEmpty()) { if (!stuCourse.classId.Contains(groupChange.listid)) { stuCourse.classId.Add(groupChange.listid); } } else { stuCourse.classId = new List { groupChange.listid }; } } else { if (stuCourse.stulist.IsNotEmpty()) { if (!stuCourse.stulist.Contains(groupChange.listid)) { stuCourse.stulist.Add(groupChange.listid); } } else { stuCourse.stulist = new List { groupChange.listid }; } } await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync(stuCourse, stuCourse.id, new PartitionKey(stuCourse.code)); } else { var stucourse = new StuCourse { id = course.id, scode = course.code, name = course.name, code = $"StuCourse-{member.id}", scope = course.scope, school = course.school, creatorId = course.creatorId, pk = "StuCourse", createTime = nowtime }; if (groupChange.type.Equals("class")) { stucourse.classId = new List { groupChange.listid }; } else { stucourse.stulist = new List { groupChange.listid }; } await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(stucourse, new PartitionKey(stucourse.code)); } } catch (Exception) { continue; } } //移除名单的。 在点击相关的课程,再去二次校验是否存在,不存在则再去删除。 foreach (var delStu in groupChange.stuleave) { try { ResponseMessage response = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemStreamAsync(course.id, new PartitionKey($"StuCourse-{delStu.code.Replace("Base-", "")}-{delStu.id}")); if (response.StatusCode == System.Net.HttpStatusCode.OK) { StuCourse stuCourse = JsonDocument.Parse(response.Content).RootElement.Deserialize(); stuCourse.stulist.Remove(groupChange.listid); stuCourse.classId.Remove(groupChange.listid); if (stuCourse.stulist.IsNotEmpty() || stuCourse.classId.IsNotEmpty()) { await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync(stuCourse, stuCourse.id, new PartitionKey(stuCourse.code)); } else { await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemStreamAsync(course.id, new PartitionKey($"StuCourse-{delStu.code.Replace("Base-", "")}-{delStu.id}")); } } } catch (Exception) { continue; } } foreach (var delTmd in groupChange.tmdleave) { try { ResponseMessage response = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemStreamAsync(course.id, new PartitionKey($"StuCourse-{delTmd.id}")); if (response.StatusCode == System.Net.HttpStatusCode.OK) { StuCourse stuCourse = JsonDocument.Parse(response.Content).RootElement.Deserialize(); stuCourse.stulist.Remove(groupChange.listid); stuCourse.classId.Remove(groupChange.listid); if (stuCourse.stulist.IsNotEmpty() || stuCourse.classId.IsNotEmpty()) { await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync(stuCourse, stuCourse.id, new PartitionKey(stuCourse.code)); } else { await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemStreamAsync(course.id, new PartitionKey($"StuCourse-{delTmd.id}")); } } } catch (Exception) { continue; } } } if (groupChange.status.Equals("delete")) { foreach (var item in courses) { item.schedule.ForEach(x => { if ( !string.IsNullOrWhiteSpace(x.classId) && x.classId.Equals(groupChange.listid)) { x.classId = ""; } if (!string.IsNullOrWhiteSpace(x.stulist) && x.stulist.Equals(groupChange.listid)) { x.stulist = ""; } }); if (item.scope.Equals("school")) { await client.GetContainer(Constant.TEAMModelOS, Constant.School).ReplaceItemAsync(item, item.id, new PartitionKey(item.code)); } else { await client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReplaceItemAsync(item, item.id, new PartitionKey(item.code)); } } } } */ public static async Task SaveStuActivity(CosmosClient client, DingDing _dingDing, List stuActivities, List tmdActivities, List tchActivities) { try { List>> tasks = new List>>(); if (stuActivities.IsNotEmpty()) { foreach (var x in stuActivities) { tasks.Add(client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(x, new PartitionKey(x.code))); } } if (tmdActivities.IsNotEmpty()) { foreach (var x in tmdActivities) { tasks.Add(client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(x, new PartitionKey(x.code))); } } if (tchActivities.IsNotEmpty()) { foreach (var x in tchActivities) { tasks.Add(client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(x, new PartitionKey(x.code))); } } if (tasks.Count > 0) { await tasks.TaskPage(10); } } catch (Exception ex) { await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-OS,TriggerStuActivity-SaveStuActivity\n{ex.Message}\n{ex.StackTrace}\n", GroupNames.醍摩豆服務運維群組); } return ""; } public static async Task RefreshStuActivity(CoreAPIHttpService _coreAPIHttpService, CosmosClient client, DingDing _dingDing, string id, string code) { MQActivity activity = null; try { var aactivity = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync(id, new PartitionKey(code)); using var da = await JsonDocument.ParseAsync(aactivity.Content); activity = da.ToObject(); } catch (CosmosException) { activity = null; } if (activity != null) { List>> tasks = new List>>(); List classes = ExamService.getClasses(activity.classes, activity.stuLists); (List tmdIds, List classLists) = await GroupListService.GetMemberByListids(_coreAPIHttpService, client, _dingDing, classes, activity.school); var students = tmdIds.FindAll(x => x.type == 2); var tmdids = tmdIds.FindAll(x => x.type == 1); if (tmdids.IsNotEmpty()) { foreach (RMember tmdid in tmdids) { var response = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemStreamAsync(activity.id, new PartitionKey($"Activity-{tmdid.id}")); if (response.StatusCode == System.Net.HttpStatusCode.OK) { using var json = await JsonDocument.ParseAsync(response.Content); StuActivity stu = json.ToObject(); stu.id = activity.id; stu.scode = activity.code; stu.name = activity.name; stu.source = activity.source; stu.scope = activity.scope; stu.school = activity.school; stu.creatorId = activity.creatorId; stu.type = activity.pk; stu.subjects = activity.pk.ToLower().Equals("exam") && activity.subjects.IsNotEmpty() ? new List() { activity.subjects[0].id } : new List() { "" }; stu.startTime = activity.startTime; stu.endTime = activity.endTime; stu.blob = activity.blob; stu.owner = activity.owner; stu.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); tasks.Add(client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync(stu, stu.id, new PartitionKey(stu.code))); } } } if (students.IsNotEmpty()) { foreach (RMember student in students) { var response = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemStreamAsync(activity.id, new PartitionKey($"Activity-{activity.school}-{student.id}")); if (response.StatusCode == System.Net.HttpStatusCode.OK) { using var json = await JsonDocument.ParseAsync(response.Content); StuActivity stu = json.ToObject(); stu.id = activity.id; stu.scode = activity.code; stu.name = activity.name; stu.source = activity.source; stu.scope = activity.scope; stu.school = activity.school; stu.creatorId = activity.creatorId; stu.type = activity.pk; stu.subjects = activity.pk.ToLower().Equals("exam") && activity.subjects.IsNotEmpty() ? new List() { activity.subjects[0].id } : new List() { "" }; stu.startTime = activity.startTime; stu.endTime = activity.endTime; stu.blob = activity.blob; stu.owner = activity.owner; stu.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); tasks.Add(client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync(stu, stu.id, new PartitionKey(stu.code))); } //await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code)); } } await Task.WhenAll(tasks); } } public static async Task updateClassResulte(CosmosClient client, List classResults, List standerAnswers, Member member ,GroupChange change,MQActivity activity) { ExamInfo info = new(); try { if (classResults.Count > 0) { info = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync(classResults[0].examId, new PartitionKey($"{activity.code}")); foreach (var item in classResults) { if (item.info.id.Equals(change.listid)) { int index = item.studentIds.IndexOf(member.id); if (index == -1) { List> standard = new List>(); foreach (PaperSimple simple in standerAnswers) { standard = simple.answers; } List ansPoint = new List(); List> anc = new List>(); List> mark = new List>(); foreach (List num in standard) { List newAns = new List(); foreach (string san in num) { newAns.Add(san); } anc.Add(newAns); ansPoint.Add(-1); mark.Add(new List
()); } item.mark.Add(mark); item.ans.Add(anc); item.studentIds.Add(member.id); item.studentScores.Add(ansPoint); item.studentAnswers.Add(new List()); item.sum.Add(0); //item.scIds.Add(member.code??""); item.status.Add(1); } else { item.mark.RemoveAt(index); item.ans.RemoveAt(index); item.studentIds.RemoveAt(index); item.studentScores.RemoveAt(index); item.studentAnswers.RemoveAt(index); item.sum.RemoveAt(index); //item.scIds.RemoveAt(index); item.status.RemoveAt(index); } try { bool isAns = item.studentScores.Exists(s => s.Contains(-1)); if (!isAns) { //整合名单 List classes = ExamService.getClasses(info.classes, info.stuLists); item.progress = true; info.subjects.ForEach(s => { if (s.classCount != classes.Count) { if (s.id.Equals(item.subjectId)) { s.classCount += 1; } } }); } long nowTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); info.updateTime = nowTime; await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(info, info.id, new PartitionKey($"{info.code}")); } catch (Exception e) { } } await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(item, item.id, new PartitionKey($"{item.code}")); } } } catch (Exception e) { } return info; } /* public static async Task DeleteActivity(CoreAPIHttpService _coreAPIHttpService, CosmosClient client, DingDing _dingDing, ActivityList activityList) { List<(string pId, List gid)> ps = new List<(string pId, List gid)>(); if (activityList.groupLists.Count > 0) { var group = activityList.groupLists; foreach (var keys in group) { foreach (KeyValuePair> pp in keys) { ps.Add((pp.Key, pp.Value)); } } } List classes = ExamService.getClasses(activityList.classes, activityList.stuLists); (List tmdIds, List classLists) = await GroupListService.GetMemberByListids(_coreAPIHttpService, client, _dingDing, classes, activityList.school, ps); var addStudentsCls = tmdIds.FindAll(x => x.type == 2); var addTmdidsCls = tmdIds.FindAll(x => x.type == 1); List tmds = new List(); if (addTmdidsCls.IsNotEmpty()) { tmds.AddRange(addTmdidsCls.Select(x => x.id).ToList()); } List stuActivities = new List(); List tmdActivities = new List(); List tchActivities = new List(); if (tmds.IsNotEmpty()) { tmds.ForEach(x => { tmdActivities.Add(new StuActivity { id = activityList.id, code = $"Activity-{x}", }); }); } if (addStudentsCls.IsNotEmpty()) { addStudentsCls.ForEach(x => { stuActivities.Add(new StuActivity { id = activityList.id, code = $"Activity-{x.code.Replace("Base-", "")}-{x.id}", }); }); } (List tchList, List classInfos) = await GroupListService.GetMemberByListids(_coreAPIHttpService, client, _dingDing, activityList.tchLists, activityList.school, ps); (string standard, List tmdids, string school, List update, int statistics) list = (null, null, null, new List { StatisticsService.TeacherVote }, 0); if (tchList.IsNotEmpty()) { list.tmdids = tchList.Select(x => x.id).ToList(); School school = null; if (!string.IsNullOrEmpty(activityList.school)) { school = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync(activityList.school, new PartitionKey("Base")); list.school = school.id; list.standard = school.standard; } tchList.ForEach(x => { tchActivities.Add(new StuActivity { id = activityList.id, code = $"Activity-{x.id}", }); }); } await IESActivityService.DeleteStuActivity(client, _dingDing, stuActivities, tmdActivities, tchActivities); } public static async Task DeleteStuActivity(CosmosClient client, DingDing _dingDing, List stuActivities, List tmdActivities, List tchActivities) { try { if (stuActivities.IsNotEmpty()) { foreach (var x in stuActivities) { await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemStreamAsync(x.id, new PartitionKey(x.code)); } } if (tmdActivities.IsNotEmpty()) { foreach (var x in tmdActivities) { await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemStreamAsync(x.id, new PartitionKey(x.code)); } } if (tchActivities.IsNotEmpty()) { foreach (var x in tchActivities) { await client.GetContainer(Constant.TEAMModelOS, "Teacher").DeleteItemStreamAsync(x.id, new PartitionKey(x.code)); await client.GetContainer(Constant.TEAMModelOS, "Teacher").DeleteItemStreamAsync(x.id, new PartitionKey($"StudyRecord-{x.id}")); } } } catch (Exception ex) { await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-OS,TriggerStuActivity-DeleteStuActivity\n{ex.Message}\n{ex.StackTrace}\n", GroupNames.醍摩豆服務運維群組); } return ""; } */ } public class ActivityList { public string id { get; set; } public string school { get; set; } /// /// 行政班 /// public List classes { get; set; } = new List(); /// /// 学生名单(包含自定义个人学生名单,学校教学班) /// public List stuLists { get; set; } = new List(); /// /// 教研组名单 /// public List tchLists { get; set; } = new List(); public List>> groupLists { get; set; } = new List>>(); } }