using Azure.Cosmos; using Microsoft.Azure.WebJobs; using System; using System.Collections.Generic; using System.Text; using System.Text.Json; using System.Threading.Tasks; using TEAMModelOS.SDK.DI; using TEAMModelOS.SDK.Extension; using TEAMModelOS.SDK; using TEAMModelOS.SDK.Models; using TEAMModelOS.SDK.Models.Cosmos.Common; using HTEXLib.COMM.Helpers; namespace TEAMModelFunction { public class CourseServiceBus { private readonly AzureCosmosFactory _azureCosmos; private readonly DingDing _dingDing; public CourseServiceBus(AzureCosmosFactory azureCosmos, DingDing dingDing) { _azureCosmos = azureCosmos; _dingDing = dingDing; } /// /// 完善课程变更 /// /// /// CourseChange ///// /// /// [FunctionName("Course")] public async Task Course([ServiceBusTrigger("%Azure:ServiceBus:ActiveTask%", "course", Connection = "Azure:ServiceBus:ConnectionString")] string msg) { var client = _azureCosmos.GetCosmosClient(); try { //await _dingDing.SendBotMsg($"ServiceBus,CourseChange:{msg}", GroupNames.醍摩豆服務運維群組); var jsonMsg = JsonDocument.Parse(msg); CourseChange courseChange = msg.ToObject(); if (courseChange == null) { return; } foreach (var cls in courseChange.addClass) { (List addTmdidsCls, List addStudentsCls, List classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, new List { cls }, courseChange.school); foreach (var stu in addStudentsCls) { try { ItemResponse stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}")); if (!stuCourse.Value.classId.Contains(cls)) { stuCourse.Value.classId.Add(cls); } await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}")); } catch (CosmosException ex) { if (ex.Response.Status == 404) { var course = new StuCourse { id = courseChange.id, scode = courseChange.code, name = courseChange.name, code = $"StuCourse-{courseChange.school}-{stu.id}", scope = courseChange.scope, school = courseChange.school, creatorId = courseChange.creatorId, classId = new List { cls }, pk = "StuCourse", createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }; await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(course, new PartitionKey(course.code)); } } } foreach (var tmd in addTmdidsCls) { try { ItemResponse stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}")); if (!stuCourse.Value.classId.Contains(cls)) { stuCourse.Value.classId.Add(cls); } await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}")); } catch (CosmosException ex) { if (ex.Response.Status == 404) { var course = new StuCourse { id = courseChange.id, scode = courseChange.code, name = courseChange.name, code = $"StuCourse-{tmd.id}", scope = courseChange.scope, school = courseChange.school, creatorId = courseChange.creatorId, classId = new List { cls }, pk = "StuCourse", createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }; await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(course, new PartitionKey(course.code)); } } } } foreach (var list in courseChange.addList) { (List addTmdidsCls, List addStudentsCls, List classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, new List { list }, courseChange.school); foreach (var stu in addStudentsCls) { try { ItemResponse stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync(courseChange.id, new PartitionKey($"StuCourse-{stu.schoolId}-{stu.id}")); if (!stuCourse.Value.stulist.Contains(list)) { stuCourse.Value.stulist.Add(list); await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{stu.schoolId}-{stu.id}")); } } catch (CosmosException ex) { if (ex.Response.Status == 404) { var course = new StuCourse { id = courseChange.id, scode = courseChange.code, name = courseChange.name, code = $"StuCourse-{courseChange.school}-{stu.id}", scope = courseChange.scope, school = courseChange.school, creatorId = courseChange.creatorId, stulist = new List { list }, pk = "StuCourse", createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }; await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(course, new PartitionKey(course.code)); } } } foreach (var tmd in addTmdidsCls) { try { ItemResponse stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}")); if (!stuCourse.Value.stulist.Contains(list)) { stuCourse.Value.stulist.Add(list); await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}")); } } catch (CosmosException ex) { if (ex.Response.Status == 404) { var course = new StuCourse { id = courseChange.id, scode = courseChange.code, name = courseChange.name, code = $"StuCourse-{tmd.id}", scope = courseChange.scope, school = courseChange.school, creatorId = courseChange.creatorId, stulist = new List { list }, pk = "StuCourse", createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }; await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(course, new PartitionKey(course.code)); } } } } foreach (var delCls in courseChange.delClass) { (List delTmdidsCls, List delStudentsCls, List classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, new List { delCls }, courseChange.school); foreach (var stu in delStudentsCls) { try { ItemResponse stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}")); if (stuCourse.Value.classId.Contains(delCls)) { stuCourse.Value.classId.Remove(delCls); } if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty()) { //当两个列表都不存在时则直接删除 await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}")); } else { await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}")); } } catch (CosmosException ex) { } } foreach (var tmd in delTmdidsCls) { try { ItemResponse stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}")); if (stuCourse.Value.classId.Contains(delCls)) { stuCourse.Value.classId.Remove(delCls); } if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty()) { //当两个列表都不存在时则直接删除 await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}")); } else { await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}")); } } catch (CosmosException ex) { } } } foreach (var delList in courseChange.delList) { (List delTmdidsCls, List delStudentsCls, List classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, new List { delList }, courseChange.school); foreach (var stu in delStudentsCls) { try { ItemResponse stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}")); if (stuCourse.Value.stulist.Contains(delList)) { stuCourse.Value.stulist.Remove(delList); } if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty()) { //当两个列表都不存在时则直接删除 await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}")); } else { await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}")); } } catch (CosmosException ex) { } } foreach (var tmd in delTmdidsCls) { try { ItemResponse stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}")); if (stuCourse.Value.stulist.Contains(delList)) { stuCourse.Value.stulist.Remove(delList); } if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty()) { //当两个列表都不存在时则直接删除 await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}")); } else { await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}")); } } catch (CosmosException ex) { } } } } catch (Exception ex) { await _dingDing.SendBotMsg($"CourseServiceBus-Course\n{ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組); } } } }