浏览代码

1. 编写测试逻辑快速去重,及排查名单成员和真实数据库的学生或醍摩豆账号的差异,并标记成员变化的名单。

CrazyIter_Bin 3 年之前
父节点
当前提交
b6f0c47fa1

+ 5 - 5
TEAMModelFunction/MonitorServicesBus.cs

@@ -408,20 +408,20 @@ namespace TEAMModelFunction
                 //await StuListService.FixStuCourse(client, stuListChange);
                 //Vote投票 Survey问卷 Exam评测 Learn学习活动 Homework作业活动
                 //名单变动修改学生问卷关联信息
-                await GroupChangeService.FixActivity(client, _dingDing, groupChange, "Survey");
+                await GroupListService.FixActivity(client, _dingDing, groupChange, "Survey");
                 //名单变动修改学生投票关联信息
-                await GroupChangeService.FixActivity(client, _dingDing, groupChange, "Vote");
+                await GroupListService.FixActivity(client, _dingDing, groupChange, "Vote");
                 //名单变动修改学生评测关联信息
-                await GroupChangeService.FixActivity(client, _dingDing, groupChange, "Exam");
+                await GroupListService.FixActivity(client, _dingDing, groupChange, "Exam");
                 //TODO学习活动
                 //await FixActivity(client, stuListChange, "Learn");
                 //TODO作业活动
-                await GroupChangeService.FixActivity(client, _dingDing, groupChange, "Homework");
+                await GroupListService.FixActivity(client, _dingDing, groupChange, "Homework");
 
                 if (groupChange.type == null || !groupChange.type.Equals("research"))
                 {
                     //课程名单变动修改学生课程关联信息
-                    await GroupChangeService.FixStuCourse(client, _dingDing, groupChange);
+                    await GroupListService.FixStuCourse(client, _dingDing, groupChange);
                 }
             }
             catch (Exception ex)

+ 103 - 1
TEAMModelOS.SDK/Models/Service/GroupChangeService.cs

@@ -6,10 +6,112 @@ using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using HTEXLib.COMM.Helpers;
+using System.Linq;
+using System.Text;
+using System.Diagnostics.CodeAnalysis;
+
 namespace TEAMModelOS.SDK.Models.Service
 {
-   public class GroupChangeService
+   public class GroupListService
     {
+        public static async Task<(List<GroupList> groups, List<GroupList> changes)> GetGroupListMemberInfo(CosmosClient client, DingDing _dingDing,string type, List<GroupList> groups) {
+
+            var members = groups.SelectMany(x => x.members).ToList();
+            //去重
+            List<Member> tmids = members.FindAll(x => x.type == 1).Where((x, i) =>   members.FindAll(x => x.type == 1).FindIndex(n => n.id.Equals(x.id)) == i).ToList();
+            List<Member> students = members.FindAll(x => x.type == 2).Where((x, i) => members.FindAll(x => x.type == 2).FindIndex(n => n.id.Equals(x.id) && n.code.Equals(x.code)) == i).ToList();
+            var stu = students.GroupBy(x => x.code).Select(x => new { key = x.Key, list = x.ToList() });
+            List<Student> studentsData = new List<Student>();
+            if (stu != null)
+            {
+                foreach (var item in stu)
+                {
+                    var ids = item.list.Select(x => x.id).ToList();
+                    if (ids.IsNotEmpty())
+                    {
+                        StringBuilder stuSql = new StringBuilder($"SELECT distinct c.name,c.id,c.code,c.picture,c.no FROM c ");
+                        string insql = string.Join(",", ids.Select(x => $"'{x}'"));
+                        stuSql.Append($"c.id in ({insql})");
+                        await foreach (var student in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryIterator<Student>(queryText: stuSql.ToString(),
+                            requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-{item.key}") }))
+                        {
+                            studentsData.Add(student);
+                        }
+                    }
+                }
+            }
+            List<TmdUser> tmds = new List<TmdUser>();
+            if (tmids.IsNotEmpty())
+            {
+                string memberTbname = "";
+                //可能会出现在两种表中
+                if ($"{type}".Equals("teach") || $"{type}".Equals("research") || $"{type}".Equals("group")
+                    || $"{type}".Equals("friend") || $"{type}".Equals("manage") || $"{type}".Equals("subject"))
+                {
+                    StringBuilder tmdidSql = new StringBuilder($"SELECT distinct c.name,c.id,c.picture FROM c ");
+                    string insql = string.Join(",", tmids.Select(x => $"'{x.id}'"));
+                    tmdidSql.Append($"c.id in ({insql})");
+                    memberTbname = "Teacher";
+                    await foreach (var tmd in client.GetContainer(Constant.TEAMModelOS, memberTbname).GetItemQueryIterator<TmdUser>(queryText: tmdidSql.ToString(),
+                            requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
+                    {
+                        tmds.Add(tmd);
+                    }
+                }
+                if ($"{type}".Equals("teach") || $"{type}".Equals("friend") || $"{type}".Equals("group"))
+                {
+                    //取差集,减少二次搜寻
+                    var tmdidexp = tmids.Select(x => x.id).Except(tmds.Select(y => y.id)).ToList();
+                    StringBuilder tmdidSql = new StringBuilder($"SELECT distinct c.name,c.id,c.picture FROM c ");
+                    string insql = string.Join(",", tmdidexp.Select(x => $"'{x}'"));
+                    tmdidSql.Append($"c.id in ({insql})");
+
+                    memberTbname = "Student";
+                    await foreach (var tmd in client.GetContainer(Constant.TEAMModelOS, memberTbname).GetItemQueryIterator<TmdUser>(queryText: tmdidSql.ToString(),
+                           requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
+                    {
+                        tmds.Add(tmd);
+                    }
+                }
+                //去重
+                tmds = tmds.Where((x, i) => tmds.FindIndex(n => n.id.Equals(x.id)) == i).ToList();
+            }
+            HashSet<GroupList> changes = new HashSet<GroupList>();
+            var unexist_tmdid = tmids.Select(x => x.id).Except(tmds.Select(y => y.id)).ToList();
+            groups.ForEach(x => {
+                int item = x.members.RemoveAll(y => unexist_tmdid.Contains(y.id) && y.type == 1);
+                if (item > 0)
+                {
+                    changes.Add(x);
+                }
+            });
+            var unexist_student = students.Select(x => (x.id, x.code)).Except(studentsData.Select(y => (y.id, y.code)), new CompareStudent()).ToList();
+            groups.ForEach(x => {
+                int item = x.members.RemoveAll(y => y.type == 2 && unexist_student.Exists(x => x.id.Equals(y.id) && x.code.Equals(y.code)));
+                if (item > 0)
+                {
+                    changes.Add(x);
+                }
+            });
+            return (groups, changes.ToList());
+        }
+        class CompareStudent : IEqualityComparer<(string id, string code)>
+        {
+            public bool Equals( (string id, string code) x,(string id, string code) y)
+            {
+                return x.id.Equals(y.id) && x.code.Equals(y.code);
+            }
+
+            public int GetHashCode((string id, string code) obj)
+            {
+                if (obj.id != null && obj.code != null) {
+                    return 1;
+                }
+                else {
+                    return 0;
+                }
+            }
+        }
         public static async Task FixActivity(CosmosClient client, DingDing _dingDing, GroupChange groupChange, string type)
         {
             try

+ 9 - 1
TEAMModelOS/Controllers/Core/CoreController.cs

@@ -40,7 +40,15 @@ namespace TEAMModelOS.Controllers.Core
         [HttpPost("apply-school")]
         public async Task<IActionResult> ApplySchool(ApplySchool request)
         {
-            string msg = $"有新学校申请。\n申请站点:{_option.Location}\n申请学校:{request.name}\n学制:{string.Join(",", request.period)}\n机构代码:{request.orgCode}\n所在国家\\地区:{request.area}\n申请人:{request.tmdname}({request.tmdid})\n联系电话:{request.cellphone}\n备注:{request.content}";
+            string msg = $"有新学校申请。\n" +
+                $"申请站点:{_option.Location}\n" +
+                $"申请学校:{request.name}\n" +
+                $"学制:{string.Join(",", request.period)}\n" +
+                $"机构代码:{request.orgCode}\n" +
+                $"所在国家\\地区:{request.area}\n" +
+                $"申请人:{request.tmdname}({request.tmdid})\n" +
+                $"联系电话:{request.cellphone}\n" +
+                $"备注:{request.content}";
             await _dingDing.SendBotMsg(msg, GroupNames.AI智慧學校申請通知群);
             return Ok(new { msg });
 

+ 1 - 0
TEAMModelOS/Controllers/School/GroupListController.cs

@@ -82,6 +82,7 @@ namespace TEAMModelOS.Controllers
                 {
                     groups.Add(item);
                 }
+                
             }
             catch (CosmosException)
             {

+ 2 - 2
TEAMModelOS/Controllers/School/StudentController.cs

@@ -1622,11 +1622,11 @@ namespace TEAMModelOS.Controllers
                         id = student.GetProperty("id").GetString();
                         var ret = await container.DeleteItemStreamAsync(id, new PartitionKey($"Base-{schoolId}"));
                         if (ret.Status == (int)HttpStatusCode.NoContent) sucIds.Add(id);
-                        await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<StuList>(queryText: $"select value(c) from c join A0 c.students where A0.id = {id}", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"StuList-{schoolId}") }))
+                        await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<StuList>(queryText: $"select value(c) from c join A0 in c.students where A0.id = '{id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"StuList-{schoolId}") }))
                         {
                             scStuLists.Add(item);
                         }
-                        await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<StuList>(queryText: $"select value(c) from c join A0 c.students where A0.id = {id}", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"StuList") }))
+                        await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<StuList>(queryText: $"select value(c) from c join A0 in  c.students where A0.id = '{id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"StuList") }))
                         {
                             teStuLists.Add(item);
                         }