|
@@ -12,8 +12,9 @@ using System.Text.Json;
|
|
|
using TEAMModelOS.Models;
|
|
|
using Azure.Messaging.ServiceBus;
|
|
|
using Microsoft.Extensions.Configuration;
|
|
|
+using TEAMModelOS.SDK.Models.Service;
|
|
|
|
|
|
-namespace TEAMModelOS.SDK.Models.Service
|
|
|
+namespace TEAMModelOS.SDK.Models
|
|
|
{
|
|
|
public class GroupListService
|
|
|
{
|
|
@@ -59,7 +60,7 @@ namespace TEAMModelOS.SDK.Models.Service
|
|
|
else
|
|
|
{
|
|
|
status = 0;
|
|
|
- stuList.members.Add(new Member { id = userid, name = name, no = no, picture = picture, type = type });
|
|
|
+ stuList.members.Add(new Member { id = userid, no = no,type = type });
|
|
|
}
|
|
|
}
|
|
|
else if (type == 2)
|
|
@@ -73,7 +74,7 @@ namespace TEAMModelOS.SDK.Models.Service
|
|
|
else
|
|
|
{
|
|
|
status = 0;
|
|
|
- stuList.members.Add(new Member { id = userid, code = school, name = name, no = no, picture = picture, type = type });
|
|
|
+ stuList.members.Add(new Member { id = userid, code = school, no = no, type = type });
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -173,23 +174,25 @@ namespace TEAMModelOS.SDK.Models.Service
|
|
|
else
|
|
|
{
|
|
|
//离开的
|
|
|
- var tmdids = oldList.members.FindAll(x => x.type == 1);
|
|
|
- if (tmdids.IsNotEmpty())
|
|
|
- {
|
|
|
- if (list.type.Equals("research"))
|
|
|
+ if (oldList != null) {
|
|
|
+ var tmdids = oldList.members.FindAll(x => x.type == 1);
|
|
|
+ if (tmdids.IsNotEmpty())
|
|
|
{
|
|
|
- change.tchleave.AddRange(tmdids);
|
|
|
+ if (list.type.Equals("research"))
|
|
|
+ {
|
|
|
+ change.tchleave.AddRange(tmdids);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ change.tmdleave.AddRange(tmdids);
|
|
|
+ }
|
|
|
}
|
|
|
- else
|
|
|
+ var stuids = oldList.members.FindAll(x => x.type == 2);
|
|
|
+ if (stuids.IsNotEmpty())
|
|
|
{
|
|
|
- change.tmdleave.AddRange(tmdids);
|
|
|
+ change.stuleave.AddRange(stuids);
|
|
|
}
|
|
|
}
|
|
|
- var stuids = oldList.members.FindAll(x => x.type == 2);
|
|
|
- if (stuids.IsNotEmpty())
|
|
|
- {
|
|
|
- change.stuleave.AddRange(stuids);
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
if (change.tmdjoin.Count != 0 || change.tmdleave.Count != 0 || change.stujoin.Count != 0 || change.stuleave.Count != 0
|
|
@@ -273,16 +276,100 @@ namespace TEAMModelOS.SDK.Models.Service
|
|
|
}
|
|
|
return list;
|
|
|
}
|
|
|
- public static async Task<List<GroupList>> GetStutmdidListids(CosmosClient client, DingDing _dingDing, List<string> classes, string school)
|
|
|
+ public static async Task<List<GroupListDto> > GetGroupListListids(CosmosClient client, DingDing _dingDing, List<string> classes, string school,string SummarySql) {
|
|
|
+ List<GroupListDto> groupLists = null;
|
|
|
+ if (classes.Count == 1 && classes.First().Equals("default") && !string.IsNullOrEmpty(school))
|
|
|
+ {
|
|
|
+ //默认的教研组
|
|
|
+
|
|
|
+ GroupListDto groupList = new GroupListDto
|
|
|
+ {
|
|
|
+ id = "default",
|
|
|
+ name = "default",
|
|
|
+ code = $"GroupList-{school}",
|
|
|
+ school = school,
|
|
|
+ scope = "school",
|
|
|
+ type = "research",
|
|
|
+ };
|
|
|
+ groupLists = new List<GroupListDto> { groupList };
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Dictionary<string, List<GroupListDto>> groups = new Dictionary<string, List<GroupListDto>>();
|
|
|
+ //List<Student> students = new List<Student>();
|
|
|
+ string sql = string.Join(",", classes.Select(x => $"'{x}'"));
|
|
|
+ if (!string.IsNullOrEmpty(school))
|
|
|
+ {
|
|
|
+ List<GroupListDto> schoolList = new List<GroupListDto>();
|
|
|
+
|
|
|
+ await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<GroupListDto>(queryText: $"select {SummarySql} from c where c.id in ({sql})",
|
|
|
+ requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"GroupList-{school}") }))
|
|
|
+ {
|
|
|
+ schoolList.Add(item);
|
|
|
+ }
|
|
|
+ if (schoolList.IsNotEmpty())
|
|
|
+ {
|
|
|
+ groups.Add("School", schoolList);
|
|
|
+ }
|
|
|
+ //取差集,减少二次搜寻
|
|
|
+ classes = classes.Except(schoolList.Select(y => y.id)).ToList();
|
|
|
+ if (classes.IsNotEmpty())
|
|
|
+ {
|
|
|
+ string insql = string.Join(",", classes.Select(x => $"'{x}'"));
|
|
|
+ //搜寻没有关联学生的行政班
|
|
|
+ await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<GroupListDto>(queryText: $"select c.id,c.code,c.name,c.no,c.periodId,c.scope,c.school,c.creatorId,c.type,c.year,c.tcount,c.scount,c.teacher.id as leader from c where c.id in ({insql})",
|
|
|
+ requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Class-{school}") }))
|
|
|
+ {
|
|
|
+ ///行政班(学生搜寻classId动态返回)class
|
|
|
+ GroupListDto group = new GroupListDto
|
|
|
+ {
|
|
|
+ id = item.id,
|
|
|
+ code = $"GroupList-{school}",
|
|
|
+ name = item.name,
|
|
|
+ periodId = item.periodId,
|
|
|
+ scope = "school",
|
|
|
+ school = school,
|
|
|
+ type = "class",
|
|
|
+ year = item.year,
|
|
|
+ leader= item.leader,
|
|
|
+ no= item.no,
|
|
|
+ pk= "GroupList",
|
|
|
+ };
|
|
|
+ groupLists.Add(group);
|
|
|
+ }
|
|
|
+ //取差集,减少二次搜寻
|
|
|
+ classes = classes.Except(groupLists.Select(y => y.id)).ToList();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (classes.IsNotEmpty())
|
|
|
+ {
|
|
|
+ List<GroupListDto> privateList = new List<GroupListDto>();
|
|
|
+ sql = string.Join(",", classes.Select(x => $"'{x}'"));
|
|
|
+ await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<GroupListDto>(queryText: $"select {SummarySql} from c where c.id in ({sql})",
|
|
|
+ requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"GroupList") }))
|
|
|
+ {
|
|
|
+ privateList.Add(item);
|
|
|
+ }
|
|
|
+ if (privateList.IsNotEmpty())
|
|
|
+ {
|
|
|
+ groups.Add("Teacher", privateList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ groupLists = groups.SelectMany(x => x.Value).ToList();
|
|
|
+ }
|
|
|
+ return groupLists;
|
|
|
+ }
|
|
|
+ public static async Task<(List<RMember>, List<RGroupList> groups)> GetStutmdidListids(CosmosClient client, DingDing _dingDing, List<string> classes, string school)
|
|
|
{
|
|
|
- List<GroupList> groupLists = null;
|
|
|
+ List<RMember> members = new List<RMember>();
|
|
|
+ List<RGroupList> groupLists = new List<RGroupList>();
|
|
|
if (classes.Count == 1 && classes.First().Equals("default") && !string.IsNullOrEmpty(school))
|
|
|
{
|
|
|
//默认的教研组
|
|
|
- List<Member> members = new List<Member>();
|
|
|
+ members = new List<RMember>();
|
|
|
await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<TmdInfo>(queryText: $"SELECT value(c) FROM c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{school}") }))
|
|
|
{
|
|
|
- Member member = new Member
|
|
|
+ RMember member = new RMember
|
|
|
{
|
|
|
id = item.id,
|
|
|
name = item.name,
|
|
@@ -291,7 +378,7 @@ namespace TEAMModelOS.SDK.Models.Service
|
|
|
};
|
|
|
members.Add(member);
|
|
|
}
|
|
|
- GroupList groupList = new GroupList
|
|
|
+ RGroupList groupList = new RGroupList
|
|
|
{
|
|
|
id = "default",
|
|
|
name = "default",
|
|
@@ -301,18 +388,18 @@ namespace TEAMModelOS.SDK.Models.Service
|
|
|
type = "research",
|
|
|
members = members
|
|
|
};
|
|
|
- groupLists = new List<GroupList> { groupList };
|
|
|
+ groupLists = new List<RGroupList> { groupList };
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- Dictionary<string, List<GroupList>> groups = new Dictionary<string, List<GroupList>>();
|
|
|
+ Dictionary<string, List<RGroupList>> groups = new Dictionary<string, List<RGroupList>>();
|
|
|
List<Student> students = new List<Student>();
|
|
|
string sql = string.Join(",", classes.Select(x => $"'{x}'"));
|
|
|
if (!string.IsNullOrEmpty(school))
|
|
|
{
|
|
|
- List<GroupList> schoolList = new List<GroupList>();
|
|
|
+ List<RGroupList> schoolList = new List<RGroupList>();
|
|
|
|
|
|
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<GroupList>(queryText: $"select value(c) from c where c.id in ({sql})",
|
|
|
+ await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<RGroupList>(queryText: $"select value(c) from c where c.id in ({sql})",
|
|
|
requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"GroupList-{school}") }))
|
|
|
{
|
|
|
schoolList.Add(item);
|
|
@@ -334,12 +421,43 @@ namespace TEAMModelOS.SDK.Models.Service
|
|
|
//取差集,减少二次搜寻
|
|
|
classes = classes.Except(students.Select(y => y.classId)).ToList();
|
|
|
}
|
|
|
+ if (classes.IsNotEmpty()) {
|
|
|
+ string insql = string.Join(",", classes.Select(x => $"'{x}'"));
|
|
|
+ //搜寻没有关联学生的行政班
|
|
|
+ await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School")
|
|
|
+ .GetItemQueryIterator<RGroupList>(queryText: $"select c.id,c.code,c.name,c.no,c.periodId,c.scope,c.school,c.creatorId,c.type,c.year,c.tcount,c.scount,c.teacher.id as leader from c where c.id in ({insql})",
|
|
|
+ requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Class-{school}") }))
|
|
|
+ {
|
|
|
+ ///行政班(学生搜寻classId动态返回)class
|
|
|
+ List<RMember> smembers = new List<RMember>();
|
|
|
+ RGroupList group = new RGroupList
|
|
|
+ {
|
|
|
+ id = item.id,
|
|
|
+ code = $"GroupList-{school}",
|
|
|
+ name = item.name,
|
|
|
+ periodId = item.periodId,
|
|
|
+ scope = "school",
|
|
|
+ school = school,
|
|
|
+ type = "class",
|
|
|
+ year = item.year,
|
|
|
+ members = smembers,
|
|
|
+ scount = smembers.Count,
|
|
|
+ pk= "GroupList",
|
|
|
+ leader=item.leader,
|
|
|
+ no=item.no,
|
|
|
+ };
|
|
|
+ groupLists.Add(group);
|
|
|
+ }
|
|
|
+ //取差集,减少二次搜寻
|
|
|
+ classes = classes.Except(groupLists.Select(y => y.id)).ToList();
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
if (classes.IsNotEmpty())
|
|
|
{
|
|
|
- List<GroupList> privateList = new List<GroupList>();
|
|
|
+ List<RGroupList> privateList = new List<RGroupList>();
|
|
|
sql = string.Join(",", classes.Select(x => $"'{x}'"));
|
|
|
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<GroupList>(queryText: $"select value(c) from c where c.id in ({sql})",
|
|
|
+ await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<RGroupList>(queryText: $"select value(c) from c where c.id in ({sql})",
|
|
|
requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"GroupList") }))
|
|
|
{
|
|
|
privateList.Add(item);
|
|
@@ -354,20 +472,37 @@ namespace TEAMModelOS.SDK.Models.Service
|
|
|
var list = item.Value.GroupBy(x => x.type).Select(y => new { key = y.Key, list = y.ToList() });
|
|
|
foreach (var group in list)
|
|
|
{
|
|
|
- await GetGroupListMemberInfo(client, group.key, group.list, item.Key);
|
|
|
+ (List<RGroupList> rgroups, List<RMember> rmembers) =await GetGroupListMemberInfo(client, group.key, group.list, item.Key,_dingDing);
|
|
|
+ members.AddRange(rmembers);
|
|
|
}
|
|
|
}
|
|
|
- groupLists = groups.SelectMany(x => x.Value).ToList();
|
|
|
+ groupLists .AddRange(groups.SelectMany(x => x.Value).ToList());
|
|
|
if (students.IsNotEmpty())
|
|
|
{
|
|
|
List<string> sqlList = students.Select(x => x.classId).ToList();
|
|
|
string insql = string.Join(",", sqlList.Select(x => $"'{x}'"));
|
|
|
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<ClassInfo>(queryText: $"select c.id,c.name ,c.periodId ,c.year from c where c.id in ({insql})",
|
|
|
+ await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").
|
|
|
+ GetItemQueryIterator<RGroupList>(queryText: $"select c.id,c.code,c.name,c.no,c.periodId,c.scope,c.school,c.creatorId,c.type,c.year,c.tcount,c.scount,c.teacher.id as leader from c where c.id in ({insql})",
|
|
|
requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Class-{school}") }))
|
|
|
{
|
|
|
///行政班(学生搜寻classId动态返回)class
|
|
|
- List<Member> members = students.Where(x => x.classId.Equals(item.id)).Select(y => new Member { id = y.id, code = school, name = y.name, type = 2, picture = y.picture, no = y.no }).ToList();
|
|
|
- GroupList group = new GroupList
|
|
|
+ List<RMember> smembers = students.Where(x => x.classId.Equals(item.id))
|
|
|
+ .Select(y => new RMember
|
|
|
+ {
|
|
|
+ id = y.id,
|
|
|
+ code = school,
|
|
|
+ name = y.name,
|
|
|
+ type = 2,
|
|
|
+ picture = y.picture,
|
|
|
+ no = y.no,
|
|
|
+ classId=y.classId,
|
|
|
+ groupId=y.groupId,
|
|
|
+ groupName=y.groupName ,
|
|
|
+ irs=y.irs,
|
|
|
+ }).ToList();
|
|
|
+ members.AddRange(smembers);
|
|
|
+
|
|
|
+ RGroupList group = new RGroupList
|
|
|
{
|
|
|
id = item.id,
|
|
|
code = $"GroupList-{school}",
|
|
@@ -377,376 +512,155 @@ namespace TEAMModelOS.SDK.Models.Service
|
|
|
school = school,
|
|
|
type = "class",
|
|
|
year = item.year,
|
|
|
- members = members,
|
|
|
- scount = members.Count
|
|
|
+ members = smembers,
|
|
|
+ scount = smembers.Count,
|
|
|
+ no=item.no,
|
|
|
+ leader=item.leader,
|
|
|
+ pk= "GroupList"
|
|
|
};
|
|
|
groupLists.Add(group);
|
|
|
}
|
|
|
+ //去重。
|
|
|
+ members = 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();
|
|
|
}
|
|
|
}
|
|
|
- return groupLists;
|
|
|
+ return (members,groupLists);
|
|
|
}
|
|
|
|
|
|
- public static async Task<(List<GroupList> groups, List<Member> members)> GetGroupListMemberInfo(CosmosClient client, string type, List<GroupList> groups, string groupTbname)
|
|
|
+ public static async Task<(List<RGroupList> groups, List<RMember> members)> GetGroupListMemberInfo(CosmosClient client, string type, List<RGroupList> groups, string groupTbname, DingDing _dingDing)
|
|
|
{
|
|
|
|
|
|
- var members = groups.SelectMany(y => y.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(y => new { key = y.Key, list = y.ToList() });
|
|
|
- List<Student> studentsData = new List<Student>();
|
|
|
- if (stu != null)
|
|
|
- {
|
|
|
- foreach (var item in stu)
|
|
|
+ try {
|
|
|
+ var members = groups.SelectMany(y => y.members).ToList();
|
|
|
+ //去重
|
|
|
+ List<RMember> tmdids = 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<RMember> 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(y => new { key = y.Key, list = y.ToList() });
|
|
|
+ List<Student> studentsData = new List<Student>();
|
|
|
+ if (stu != null)
|
|
|
{
|
|
|
- var ids = item.list.Select(x => x.id).ToList();
|
|
|
- if (ids.IsNotEmpty())
|
|
|
+ foreach (var item in stu)
|
|
|
{
|
|
|
- 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}") }))
|
|
|
+ var ids = item.list.Select(x => x.id).ToList();
|
|
|
+ if (ids.IsNotEmpty())
|
|
|
{
|
|
|
- studentsData.Add(student);
|
|
|
+ StringBuilder stuSql = new StringBuilder($"SELECT distinct c.name,c.id,c.code,c.picture,c.no,c.irs,c.classId FROM c ");
|
|
|
+ string insql = string.Join(",", ids.Select(x => $"'{x}'"));
|
|
|
+ stuSql.Append($"where 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}") }))
|
|
|
+ {
|
|
|
+ student.schoolId = item.key;
|
|
|
+ studentsData.Add(student);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- List<TmdUser> tmdsData = 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"))
|
|
|
+ List<TmdUser> tmdsData = new List<TmdUser>();
|
|
|
+ if (tmdids.IsNotEmpty())
|
|
|
{
|
|
|
- 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($" where 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") }))
|
|
|
- {
|
|
|
- tmdsData.Add(tmd);
|
|
|
- }
|
|
|
- }
|
|
|
- if ($"{type}".Equals("teach") || $"{type}".Equals("friend") || $"{type}".Equals("group"))
|
|
|
- {
|
|
|
- //取差集,减少二次搜寻
|
|
|
- var tmdidexp = tmids.Select(x => x.id).Except(tmdsData.Select(y => y.id)).ToList();
|
|
|
- if (tmdidexp.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(",", tmdidexp.Select(x => $"'{x}'"));
|
|
|
+ string insql = string.Join(",", tmdids.Select(x => $"'{x.id}'"));
|
|
|
tmdidSql.Append($" where c.id in ({insql})");
|
|
|
-
|
|
|
- memberTbname = "Student";
|
|
|
+ memberTbname = "Teacher";
|
|
|
await foreach (var tmd in client.GetContainer(Constant.TEAMModelOS, memberTbname).GetItemQueryIterator<TmdUser>(queryText: tmdidSql.ToString(),
|
|
|
requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
|
|
|
{
|
|
|
tmdsData.Add(tmd);
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- //去重
|
|
|
- tmdsData = tmdsData.Where((x, i) => tmdsData.FindIndex(n => n.id.Equals(x.id)) == i).ToList();
|
|
|
- }
|
|
|
- HashSet<GroupList> changes = new HashSet<GroupList>();
|
|
|
- var unexist_tmdid = tmids.Select(x => x.id).Except(tmdsData.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 CompareIdCode()).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);
|
|
|
- }
|
|
|
- });
|
|
|
- if (changes.Count > 0 && !string.IsNullOrEmpty(groupTbname))
|
|
|
- {
|
|
|
- foreach (var change in changes)
|
|
|
- {
|
|
|
- change.tcount = change.members.Where(x => x.type == 1).Count();
|
|
|
- change.scount = change.members.Where(x => x.type == 2).Count();
|
|
|
- await client.GetContainer(Constant.TEAMModelOS, groupTbname).ReplaceItemAsync(change, change.id, new PartitionKey(change.code));
|
|
|
- }
|
|
|
- }
|
|
|
- tmids.ForEach(x =>
|
|
|
- {
|
|
|
- var user = tmdsData.Find(y => y.id.Equals(x.id));
|
|
|
- x.name = user?.name;
|
|
|
- x.picture = user?.picture;
|
|
|
- });
|
|
|
- students.ForEach(x =>
|
|
|
- {
|
|
|
- var student = studentsData.Find(y => y.id.Equals(x.id) && y.code.Equals(x.code));
|
|
|
- x.name = student?.name;
|
|
|
- x.picture = student?.picture;
|
|
|
- x.no = student?.no;
|
|
|
- });
|
|
|
- var mbs = tmids;
|
|
|
- mbs.AddRange(students);
|
|
|
- return (groups, mbs);
|
|
|
- }
|
|
|
-
|
|
|
- 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.startTime,c.school,c.creatorId,c.name,c.pk ,c.endTime FROM c where 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<MQActivity> datas = new List<MQActivity>();
|
|
|
- if (groupChange.scope.Equals("school", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(groupChange.school))
|
|
|
- {
|
|
|
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<MQActivity>(queryText: query,
|
|
|
- requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"{type}-{groupChange.school}") }))
|
|
|
- {
|
|
|
- datas.Add(item);
|
|
|
- }
|
|
|
- ///还要处理该学校每个老师发布的班级的
|
|
|
- List<SchoolTeacher> teachers = new List<SchoolTeacher>();
|
|
|
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<SchoolTeacher>(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)
|
|
|
+ if ($"{type}".Equals("teach") || $"{type}".Equals("friend") || $"{type}".Equals("group"))
|
|
|
{
|
|
|
- var queryTech = $"SELECT distinct c.owner, c.id,c.code, c.classes,c.stuLists,c.subjects,c.progress,c.scope,c.startTime,c.school,c.creatorId,c.name,c.pk ,c.endTime FROM c " +
|
|
|
- $" where 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").GetItemQueryIterator<MQActivity>(queryText: queryTech,
|
|
|
- requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"{type}-{techer.id}") }))
|
|
|
+ //取差集,减少二次搜寻
|
|
|
+ var tmdidexp = tmdids.Select(x => x.id).Except(tmdsData.Select(y => y.id)).ToList();
|
|
|
+ if (tmdidexp.IsNotEmpty())
|
|
|
{
|
|
|
- datas.Add(item);
|
|
|
+ StringBuilder tmdidSql = new StringBuilder($"SELECT distinct c.name,c.id,c.picture FROM c ");
|
|
|
+ string insql = string.Join(",", tmdidexp.Select(x => $"'{x}'"));
|
|
|
+ tmdidSql.Append($" where 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") }))
|
|
|
+ {
|
|
|
+ tmdsData.Add(tmd);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+ //去重
|
|
|
+ tmdsData = tmdsData.Where((x, i) => tmdsData.FindIndex(n => n.id.Equals(x.id)) == i).ToList();
|
|
|
}
|
|
|
- if (groupChange.scope.Equals("private", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(groupChange.creatorId))
|
|
|
+ HashSet<RGroupList> changes = new HashSet<RGroupList>();
|
|
|
+ var unexist_tmdid = tmdids.Select(x => x.id).Except(tmdsData.Select(y => y.id)).ToList();
|
|
|
+ groups.ForEach(x =>
|
|
|
{
|
|
|
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<MQActivity>(queryText: query,
|
|
|
- requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"{type}-{groupChange.creatorId}") }))
|
|
|
+ int item = x.members.RemoveAll(y => unexist_tmdid.Contains(y.id) && y.type == 1);
|
|
|
+ if (item > 0)
|
|
|
{
|
|
|
- datas.Add(item);
|
|
|
+ changes.Add(x);
|
|
|
}
|
|
|
- }
|
|
|
- long nowtime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
|
|
|
- foreach (MQActivity activity in datas)
|
|
|
+ });
|
|
|
+ var unexist_student = students.Select(x => (x.id, x.code)).Except(studentsData.Select(y => (y.id, y.schoolId)), new CompareIdCode()).ToList();
|
|
|
+ groups.ForEach(x =>
|
|
|
{
|
|
|
- //已经完结的不再允许加入,还未开始的。
|
|
|
- if (string.IsNullOrEmpty(activity.progress)|| activity.progress.Equals("finish") || activity.progress.Equals("pending"))
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
- List<string> classes = ExamService.getClasses(activity.classes, activity.stuLists);
|
|
|
- //stujoin新加入名单的
|
|
|
- foreach (Member member in groupChange.stujoin)
|
|
|
- {
|
|
|
- var stucourse = new StuActivity
|
|
|
- {
|
|
|
- id = activity.id,
|
|
|
- scode = activity.code,
|
|
|
- name = activity.name,
|
|
|
- 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<string>() { activity.subjects[0].id } : new List<string>() { "" },
|
|
|
- startTime = activity.startTime,
|
|
|
- endTime = activity.endTime,
|
|
|
- blob = activity.blob,
|
|
|
- owner = activity.owner,
|
|
|
- createTime = nowtime,
|
|
|
- taskStatus = -1,
|
|
|
- classIds = classes
|
|
|
- };
|
|
|
- await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
|
|
|
- }
|
|
|
-
|
|
|
- //tmdjoin新加入的
|
|
|
- foreach (Member member in groupChange.tmdjoin)
|
|
|
- {
|
|
|
- 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<string>() { activity.subjects[0].id } : new List<string>() { "" },
|
|
|
- startTime = activity.startTime,
|
|
|
- endTime = activity.endTime,
|
|
|
- blob = activity.blob,
|
|
|
- owner = activity.owner,
|
|
|
- createTime = nowtime,
|
|
|
- taskStatus = -1,
|
|
|
- classIds = classes
|
|
|
- };
|
|
|
- await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
|
|
|
- }
|
|
|
- //tchjoin新加入的
|
|
|
- foreach (Member member in groupChange.tchjoin)
|
|
|
- {
|
|
|
- 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<string>() { activity.subjects[0].id } : new List<string>() { "" },
|
|
|
- startTime = activity.startTime,
|
|
|
- endTime = activity.endTime,
|
|
|
- blob = activity.blob,
|
|
|
- owner = activity.owner,
|
|
|
- createTime = nowtime,
|
|
|
- taskStatus = -1,
|
|
|
- classIds = classes
|
|
|
- };
|
|
|
- await client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
|
|
|
- }
|
|
|
- foreach (Member member in groupChange.stuleave)
|
|
|
- {
|
|
|
- try
|
|
|
- {
|
|
|
-
|
|
|
- await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync<StuActivity>(activity.id, new PartitionKey($"Activity-{member.code.Replace("Base-", "")}-{member.id}"));
|
|
|
- }
|
|
|
- catch (CosmosException)
|
|
|
- {
|
|
|
- continue;
|
|
|
- // 继续执行 删除失败
|
|
|
- }
|
|
|
- }
|
|
|
- foreach (Member member in groupChange.tmdleave)
|
|
|
+ int item = x.members.RemoveAll(y => y.type == 2 && unexist_student.Exists(x => x.id.Equals(y.id) && x.Item2.Equals(y.code)));
|
|
|
+ if (item > 0)
|
|
|
{
|
|
|
- try
|
|
|
- {
|
|
|
-
|
|
|
- await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync<StuActivity>(activity.id, new PartitionKey($"Activity-{member.id}"));
|
|
|
- }
|
|
|
- catch (CosmosException)
|
|
|
- {
|
|
|
- continue;
|
|
|
- // 继续执行 删除失败
|
|
|
- }
|
|
|
+ changes.Add(x);
|
|
|
}
|
|
|
- foreach (Member member in groupChange.tchleave)
|
|
|
- {
|
|
|
- try
|
|
|
- {
|
|
|
- await client.GetContainer(Constant.TEAMModelOS, "Teacher").DeleteItemAsync<StuActivity>(activity.id, new PartitionKey($"Activity-{member.id}"));
|
|
|
- }
|
|
|
- catch (CosmosException)
|
|
|
- {
|
|
|
- continue;
|
|
|
- // 继续执行 删除失败
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- catch (Exception ex)
|
|
|
- {
|
|
|
- await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-StuListService-FixActivity\n{ex.Message}{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}'";
|
|
|
- List<Course> courses = new List<Course>();
|
|
|
- if (groupChange.scope.Equals("school") && !string.IsNullOrEmpty(groupChange.school))
|
|
|
- {
|
|
|
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Course>(queryText: query,
|
|
|
- requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Course-{groupChange.school}") }))
|
|
|
+ });
|
|
|
+ tmdids.ForEach(x =>
|
|
|
{
|
|
|
- courses.Add(item);
|
|
|
- }
|
|
|
- }
|
|
|
- if (groupChange.scope.Equals("private") && !string.IsNullOrEmpty(groupChange.creatorId))
|
|
|
- {
|
|
|
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<Course>(queryText: query,
|
|
|
- requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Course-{groupChange.creatorId}") }))
|
|
|
+ var user = tmdsData.Find(y => y.id.Equals(x.id));
|
|
|
+ x.name = user?.name;
|
|
|
+ x.picture = user?.picture;
|
|
|
+ });
|
|
|
+ students.ForEach(x =>
|
|
|
{
|
|
|
- courses.Add(item);
|
|
|
- }
|
|
|
- }
|
|
|
- long nowtime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
|
|
|
- // await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-StuListService-FixStuCourse\n名单发生变更 需要处理的课程\n{courses.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
|
|
|
- //2.获取课程的id 并尝试添加或移除对应的学生课程记录StuCourse。
|
|
|
- foreach (var course in courses)
|
|
|
- {
|
|
|
- //学生新加入名单的
|
|
|
- foreach (Member member in groupChange.stujoin)
|
|
|
+ var student = studentsData.Find(y => y.id.Equals(x.id) && y.schoolId.Equals(x.code));
|
|
|
+ x.name = student?.name;
|
|
|
+ x.picture = student?.picture;
|
|
|
+ x.classId = student?.classId;
|
|
|
+ });
|
|
|
+ var mbs = tmdids;
|
|
|
+ mbs.AddRange(students);
|
|
|
+ if (changes.Count > 0 && !string.IsNullOrEmpty(groupTbname))
|
|
|
{
|
|
|
- var stucourse = new StuCourse
|
|
|
+ foreach (var change in changes)
|
|
|
{
|
|
|
- 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",
|
|
|
- stulist = new List<string> { groupChange.listid },
|
|
|
- createTime = nowtime
|
|
|
- };
|
|
|
- // await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-StuListService-FixStuCourse\n名单发生变更 新建课程中间表\n{stucourse.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
|
|
|
- await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
|
|
|
- }
|
|
|
- //tmd新加入的
|
|
|
- foreach (Member member in groupChange.tmdjoin)
|
|
|
- {
|
|
|
- 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",
|
|
|
- stulist = new List<string> { groupChange.listid },
|
|
|
- createTime = nowtime
|
|
|
- };
|
|
|
- // await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-StuListService-FixStuCourse\n名单发生变更 新建课程中间表\n{stucourse.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
|
|
|
- await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
|
|
|
- }
|
|
|
- //移除名单的。 在点击相关的课程,再去二次校验是否存在,不存在则再去删除。
|
|
|
- foreach (var delStu in groupChange.stuleave)
|
|
|
- {
|
|
|
- await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemStreamAsync(course.id, new PartitionKey($"StuCourse-{delStu.code.Replace("Base-", "")}-{delStu.id}"));
|
|
|
- }
|
|
|
- foreach (var delTmd in groupChange.tmdleave)
|
|
|
- {
|
|
|
- await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemStreamAsync(course.id, new PartitionKey($"StuCourse-{delTmd}"));
|
|
|
+ change.tcount = change.members.Where(x => x.type == 1).Count();
|
|
|
+ change.scount = change.members.Where(x => x.type == 2).Count();
|
|
|
+ GroupList group= change.ToJsonString().ToObject<GroupList>();
|
|
|
+ await client.GetContainer(Constant.TEAMModelOS, groupTbname).ReplaceItemAsync(group, group.id, new PartitionKey(group.code));
|
|
|
+ }
|
|
|
}
|
|
|
+ groups.ForEach(x => x.members.ForEach(y=> {
|
|
|
+ if (y.type == 1) {
|
|
|
+ var tmd =tmdids.Find(t => t.id.Equals(y.id));
|
|
|
+ y.name = tmd?.name;
|
|
|
+ y.picture = tmd?.picture;
|
|
|
+ }
|
|
|
+ if (y.type == 2)
|
|
|
+ {
|
|
|
+ var student = students.Find(t => t.id.Equals(y.id)&& t.code.Equals(y.code));
|
|
|
+ y.name = student?.name;
|
|
|
+ y.picture = student?.picture;
|
|
|
+ y.classId = student?.classId;
|
|
|
+ }
|
|
|
+ }));
|
|
|
+ return (groups, mbs);
|
|
|
+ } catch (Exception ex) {
|
|
|
+ await _dingDing.SendBotMsg($"OS,GetGroupListMemberInfo()\n{ex.Message}{ex.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
|
|
|
}
|
|
|
+ return (null, null);
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
public class CompareIdCode : IEqualityComparer<(string id, string code)>
|
|
|
{
|