Browse Source

新增字段记录缺考数据,新增Function逻辑代码处理缺考流程

zhouj1203@hotmail.com 2 years ago
parent
commit
8773790495

+ 191 - 97
TEAMModelOS.FunctionV4/CosmosDB/TriggerArt.cs

@@ -18,7 +18,7 @@ using TEAMModelOS.SDK.Models.Service;
 
 namespace TEAMModelOS.FunctionV4.CosmosDB
 {
-    internal class TriggerArt
+    public class TriggerArt
     {
         public static async Task Trigger(CoreAPIHttpService _coreAPIHttpService, AzureServiceBusFactory _serviceBus, AzureStorageFactory _azureStorage, DingDing _dingDing,
             CosmosClient client, JsonElement input, TriggerData tdata, AzureRedisFactory _azureRedis, IConfiguration _configuration)
@@ -69,7 +69,7 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
                     switch (art.progress)
                     {
                         case "pending":
-                            var messageVote = new ServiceBusMessage(new { id = tdata.id, progress = "going", code = tdata.code }.ToJsonString());
+                            var messageVote = new ServiceBusMessage(new { tdata.id, progress = "going", code = tdata.code }.ToJsonString());
                             messageVote.ApplicationProperties.Add("name", "Art");
                             if (voteRecords.Count > 0)
                             {
@@ -86,121 +86,123 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
                             }
                             else
                             {
-                                if (art.classes.Count > 0) {
-                                    long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageVote, DateTimeOffset.FromUnixTimeMilliseconds(tdata.startTime));
-                                    ChangeRecord changeRecord = new ChangeRecord
-                                    {
-                                        RowKey = tdata.id,
-                                        PartitionKey = PartitionKey,
-                                        sequenceNumber = start,
-                                        msgId = messageVote.MessageId
-                                    };
-                                    await table.Save<ChangeRecord>(changeRecord);
-                                }                               
+
+                                long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageVote, DateTimeOffset.FromUnixTimeMilliseconds(tdata.startTime));
+                                ChangeRecord changeRecord = new ChangeRecord
+                                {
+                                    RowKey = tdata.id,
+                                    PartitionKey = PartitionKey,
+                                    sequenceNumber = start,
+                                    msgId = messageVote.MessageId
+                                };
+                                await table.Save<ChangeRecord>(changeRecord);
                             }
                             break;
                         case "going":
 
-                            List<string> classes = ExamService.getClasses(art.classes, art.stuLists);
-                            (List<RMember> tmdIds, List<RGroupList> classLists) = await GroupListService.GetMemberByListids(_coreAPIHttpService, client, _dingDing, classes, art.school, null);
-                            var addStudentsCls = tmdIds.FindAll(x => x.type == 2);
-                            var addTmdidsCls = tmdIds.FindAll(x => x.type == 1);
-                            List<string> tmds = new List<string>();
-                            if (addTmdidsCls.IsNotEmpty())
+                            if (art.classes.Count > 0)
                             {
-                                tmds.AddRange(addTmdidsCls.Select(x => x.id).ToList());
-                            }
-                            List<StuActivity> stuActivities = new List<StuActivity>();
-                            List<StuActivity> tmdActivities = new List<StuActivity>();
-                            List<StuActivity> tchActivities = new List<StuActivity>();
-                            List<string> sub = new();
-                            if (art.subjects.Count > 0)
-                            {
-                                foreach (var course in art.subjects)
+                                List<string> classes = ExamService.getClasses(art.classes, art.stuLists);
+                                (List<RMember> tmdIds, List<RGroupList> classLists) = await GroupListService.GetMemberByListids(_coreAPIHttpService, client, _dingDing, classes, art.school, null);
+                                var addStudentsCls = tmdIds.FindAll(x => x.type == 2);
+                                var addTmdidsCls = tmdIds.FindAll(x => x.type == 1);
+                                List<string> tmds = new List<string>();
+                                if (addTmdidsCls.IsNotEmpty())
                                 {
-                                    sub.Add(course.id);
+                                    tmds.AddRange(addTmdidsCls.Select(x => x.id).ToList());
                                 }
-                            }
-                            if (tmds.IsNotEmpty())
-                            {
-                                tmds.ForEach(x =>
+                                List<StuActivity> stuActivities = new List<StuActivity>();
+                                List<StuActivity> tmdActivities = new List<StuActivity>();
+                                List<StuActivity> tchActivities = new List<StuActivity>();
+                                List<string> sub = new();
+                                if (art.subjects.Count > 0)
+                                {
+                                    foreach (var course in art.subjects)
+                                    {
+                                        sub.Add(course.id);
+                                    }
+                                }
+                                if (tmds.IsNotEmpty())
                                 {
-                                    HashSet<string> classIds = new HashSet<string>();
-                                    classLists.ForEach(z =>
+                                    tmds.ForEach(x =>
                                     {
-                                        z.members.ForEach(y =>
+                                        HashSet<string> classIds = new HashSet<string>();
+                                        classLists.ForEach(z =>
                                         {
-                                            if (y.id.Equals(x) && y.type == 1)
+                                            z.members.ForEach(y =>
                                             {
-                                                classIds.Add(z.id);
-                                            }
+                                                if (y.id.Equals(x) && y.type == 1)
+                                                {
+                                                    classIds.Add(z.id);
+                                                }
+                                            });
+                                        });
+                                        tmdActivities.Add(new StuActivity
+                                        {
+                                            pk = "Activity",
+                                            id = art.id,
+                                            code = $"Activity-{x}",
+                                            type = "Art",
+                                            name = art.name,
+                                            startTime = art.startTime,
+                                            endTime = art.endTime,
+                                            scode = art.code,
+                                            scope = art.scope,
+                                            school = art.school,
+                                            creatorId = art.creatorId,
+                                            subjects = sub,
+                                            blob = null,
+                                            owner = art.owner,
+                                            createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
+                                            ext = new Dictionary<string, JsonElement>() { { "subjects", art.subjects.ToJsonString().ToObject<JsonElement>() } },
+                                            taskStatus = -1,
+                                            classIds = classIds.ToList()
                                         });
                                     });
-                                    tmdActivities.Add(new StuActivity
-                                    {
-                                        pk = "Activity",
-                                        id = art.id,
-                                        code = $"Activity-{x}",
-                                        type = "Art",
-                                        name = art.name,
-                                        startTime = art.startTime,
-                                        endTime = art.endTime,
-                                        scode = art.code,
-                                        scope = art.scope,
-                                        school = art.school,
-                                        creatorId = art.creatorId,
-                                        subjects = sub,
-                                        blob = null,
-                                        owner = art.owner,
-                                        createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
-                                        ext = new Dictionary<string, JsonElement>() { { "subjects", art.subjects.ToJsonString().ToObject<JsonElement>() } },
-                                        taskStatus = -1,
-                                        classIds = classIds.ToList()
-                                    });
-                                });
-                            }
-                            if (addStudentsCls.IsNotEmpty())
-                            {
-                                addStudentsCls.ForEach(x =>
+                                }
+                                if (addStudentsCls.IsNotEmpty())
                                 {
-                                    HashSet<string> classIds = new HashSet<string>();
-                                    classLists.ForEach(z =>
+                                    addStudentsCls.ForEach(x =>
                                     {
-                                        z.members.ForEach(y =>
+                                        HashSet<string> classIds = new HashSet<string>();
+                                        classLists.ForEach(z =>
                                         {
-                                            if (y.id.Equals(x.id) && y.code.Equals(art.school) && y.type == 2)
+                                            z.members.ForEach(y =>
                                             {
-                                                classIds.Add(z.id);
-                                            }
+                                                if (y.id.Equals(x.id) && y.code.Equals(art.school) && y.type == 2)
+                                                {
+                                                    classIds.Add(z.id);
+                                                }
+                                            });
+                                        });
+                                        stuActivities.Add(new StuActivity
+                                        {
+                                            pk = "Activity",
+                                            id = art.id,
+                                            code = $"Activity-{x.code.Replace("Base-", "")}-{x.id}",
+                                            type = "Atr",
+                                            name = art.name,
+                                            startTime = art.startTime,
+                                            endTime = art.endTime,
+                                            scode = art.code,
+                                            scope = art.scope,
+                                            school = art.school,
+                                            creatorId = art.creatorId,
+                                            subjects = sub,
+                                            blob = null,
+                                            owner = art.owner,
+                                            createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
+                                            ext = new Dictionary<string, JsonElement>() { { "subjects", art.subjects.ToJsonString().ToObject<JsonElement>() } },
+                                            taskStatus = -1,
+                                            classIds = classIds.ToList()
                                         });
                                     });
-                                    stuActivities.Add(new StuActivity
-                                    {
-                                        pk = "Activity",
-                                        id = art.id,
-                                        code = $"Activity-{x.code.Replace("Base-", "")}-{x.id}",
-                                        type = "Atr",
-                                        name = art.name,
-                                        startTime = art.startTime,
-                                        endTime = art.endTime,
-                                        scode = art.code,
-                                        scope = art.scope,
-                                        school = art.school,
-                                        creatorId = art.creatorId,
-                                        subjects = sub,
-                                        blob = null,
-                                        owner = art.owner,
-                                        createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
-                                        ext = new Dictionary<string, JsonElement>() {{ "subjects", art.subjects.ToJsonString().ToObject<JsonElement>() } },
-                                        taskStatus = -1,
-                                        classIds = classIds.ToList()
-                                    });
-                                });
+                                }
+                                await ActivityService.SaveStuActivity(client, _dingDing, stuActivities, tmdActivities, tchActivities);
+                                //await StatisticsService.SendServiceBus(list, _configuration, _serviceBus, client)
+                                
                             }
-                            await ActivityService.SaveStuActivity(client, _dingDing, stuActivities, tmdActivities, tchActivities);
-                            //await StatisticsService.SendServiceBus(list, _configuration, _serviceBus, client);
-
-                            var messageVoteEnd = new ServiceBusMessage(new { id = tdata.id, progress = "finish", code = tdata.code }.ToJsonString());
+                            var messageVoteEnd = new ServiceBusMessage(new { tdata.id, progress = "finish",tdata.code }.ToJsonString());
                             messageVoteEnd.ApplicationProperties.Add("name", "Art");
                             if (voteRecords.Count > 0)
                             {
@@ -228,11 +230,78 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
                                 await table.Save<ChangeRecord>(changeRecord);
                             }
 
+
                             break;
                         case "finish":
+                            //判定是否是区级创建的活动内容
+                            if (!art.lost.Any())
+                            {
+                                if (art.owner.Equals("area") && string.IsNullOrEmpty(art.pId))
+                                {
+                                    List<(string id, string code, List<Tasks> settings)> artSchools = new();
+                                    string ql = $"select c.id,c.school,c.settings,c.classes from c where  c.pk = 'Art' and c.pId = '{art.id}'";
+                                    await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: ql))
+                                    {
+                                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                                        {
+                                            var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                                            while (accounts.MoveNext())
+                                            {
+                                                JsonElement account = accounts.Current;
+                                                List<Tasks> settings = account.GetProperty("settings").ToObject<List<Tasks>>();
+                                                artSchools.Add((account.GetProperty("id").GetString(), account.GetProperty("school").GetString(), settings));
 
+                                            }
+                                        }
+                                    }
+                                    foreach (var (id, code, settings) in artSchools)
+                                    {
+                                        List<(string eId, string sId)> ids = new();
+                                        var examIds = settings.SelectMany(s => s.task).Where(a => a.type == 1).Select(z => new { z.acId,z.subject}).ToList();
+                                        examIds.ForEach(x => {
+                                            ids.Add((x.acId,x.subject));
+                                        });
+                                        List<(string code,string sub, List<string> stu)> stuInfo = await getLostAsync(ids, client, code);
+
+                                        foreach (var lost in stuInfo)
+                                        {
+                                            LostStudent lostStudent = new()
+                                            {
+                                                code = lost.code,
+                                                subject = lost.sub,
+                                                stu = lost.stu.Count
+                                            };
+                                            art.lost.Add(lostStudent);
+                                        }
+
+                                    }
+                                    await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync<ArtEvaluation>(art, art.id, new PartitionKey(art.code));
+                                }
+                                else
+                                {
+                                    //获取当前艺术评价相关评测ID目前暂时排除区级发布的评测信息
 
+                                    List<(string eId, string sId)> ids = new();
+                                    var examId = art.settings.SelectMany(x => x.task).Where(c => c.type == 1).Select(z => new { z.acId,z.subject}).ToList();
+                                    examId.ForEach(x => {
+                                        ids.Add((x.acId, x.subject));
+                                    });
+                                    List<(string code,string sub, List<string> stu)> stuInfo = await getLostAsync(ids, client, art.school);
 
+                                    foreach (var (code,sub, stu) in stuInfo)
+                                    {
+                                        LostStudent lostStudent = new()
+                                        {
+                                            code = code,
+                                            subject = sub,
+                                            stu = stu.Count
+                                        };
+                                        art.lost.Add(lostStudent);
+                                    }
+                                    await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync<ArtEvaluation>(art, art.id, new PartitionKey(art.code));
+                                }
+                            }
                             break;
                     }
                 }
@@ -247,5 +316,30 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
             }
 
         }
+        public static async Task<List<(string code, string subject,List<string> stus)>> getLostAsync(List<(string eId, string sId)> examIds, CosmosClient client, string code)
+        {
+            List<(string code,string sub, List<string> stu)> stuInfo = new();
+            if (examIds.Any())
+            {
+                string examSql = $"select c.id,c.school,c.lostStu from c where c.id in ({string.Join(",", examIds.Select(o => $"'{o.eId}'"))})";
+                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: examSql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Exam-{code}") }))
+                {
+                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                    {
+                        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                        while (accounts.MoveNext())
+                        {
+                            JsonElement account = accounts.Current;
+                            List<string> lostStu = account.GetProperty("lostStu").ToObject<List<string>>();
+                            string id = account.GetProperty("id").GetString();
+                            string sub = examIds.Where(c => c.eId.Equals(id)).FirstOrDefault().sId;
+                            stuInfo.Add((account.GetProperty("school").GetString(), sub, lostStu));
+                        }
+                    }
+                }
+            }
+            return stuInfo;
+        }
     }
 }

+ 6 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/ArtEvaluation.cs

@@ -67,6 +67,12 @@ namespace TEAMModelOS.SDK.Models.Cosmos.Common
         public List<ArtSubject> subjects { get; set; } = new List<ArtSubject>();
         public PeriodSimple period { get; set; }
         public string periodType { get; set; }
+        public List<LostStudent> lost { get; set; } = new List<LostStudent>();
+    }
+    public class LostStudent { 
+        public string code { get; set; }
+        public string subject { get; set; }
+        public double stu { get; set; }
     }
     public class Tasks {
         public string id { get; set; }