CrazyIter_Bin 1 年之前
父节点
当前提交
4d342b6784

+ 6 - 1
TEAMModelOS.SDK/Models/Cosmos/Common/Activity.cs

@@ -644,11 +644,16 @@ namespace TEAMModelOS.SDK.Models
     public class ActivityTeacherScore : ActivityTeacherUploadData
     {
         public double score { get; set; }
-
     }
+    public class ActivityScoreLevel {
+        public string lable { get; set; }
+        public List<ActivityTeacherScoreLevel> scores { get; set; }= new List<ActivityTeacherScoreLevel>();
+    }
+
     public class ActivityTeacherScoreLevel : ActivityTeacherUploadData
     {
         public string scoreLevel { get; set; }
+        public double score { get; set; }
 
     }
     public class ActivityTeacherScoreMask : ActivityTeacherScore

+ 171 - 0
TEAMModelOS.SDK/Models/Service/Common/ActivityService.cs

@@ -13,6 +13,7 @@ using System;
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.Linq;
+using System.Net.NetworkInformation;
 using System.Text;
 using System.Text.Json;
 using System.Threading.Tasks;
@@ -20,12 +21,182 @@ using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.Services;
+using static TEAMModelOS.SDK.Models.Cosmos.Student.StudentAnalysis;
 using Activity = TEAMModelOS.SDK.Models.Activity;
 
 namespace TEAMModelOS.SDK
 {
     public static class ActivityService
     {
+
+        public static async Task<List<ActivityScoreLevel>> ActivityScores (AzureCosmosFactory _azureCosmos,JsonElement _activityId,string teacherId= null) {
+            List<ActivityScoreLevel> scoreLevels = new List<ActivityScoreLevel>();
+            Azure.Response responseContest = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("Contest"));
+            if (responseContest.Status == 200)
+            {
+
+                long now = DateTimeOffset.Now.ToUnixTimeMilliseconds();
+                Contest contest = JsonDocument.Parse(responseContest.Content).RootElement.ToObject<Contest>();
+                string sql = $"select value c from c ";
+                if (!string.IsNullOrWhiteSpace(teacherId)) {
+                    sql=$"{sql} where c.id ='{teacherId}'";
+                }
+                var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityEnroll>(sql, $"ActivityEnroll-{_activityId}");
+                //List<ActivityTeacherScoreLevel> teacherScoreLevels = new List<ActivityTeacherScoreLevel>();
+                List<ActivityTeacherScore> teacherScores = new List<ActivityTeacherScore>();
+
+                if (result.list.IsNotEmpty())
+                {
+                    if (contest.sign.type==1)
+                    {
+                        var teams = result.list.Where(x => !string.IsNullOrEmpty(x.contest?.cipher)).GroupBy(z => z.contest.cipher);
+                        foreach (var team in teams)
+                        {
+                            var members = team.ToList();
+                            var leader = members.FindAll(z => z.contest.leader==1)?.FirstOrDefault();
+                            if (leader==null)
+                            {
+                                leader=members.First();
+                            }
+                            double score = leader.upload?.score??-1;
+                            if (leader.upload?.showScore==1)
+                            {
+                                score= leader.upload.maskScore;
+                            }
+                            teacherScores.Add(new ActivityTeacherScore
+                            {
+                                uploadId=leader.upload?.uploadId,
+                                uploadName=!string.IsNullOrWhiteSpace(leader.upload?.name) ? leader.upload?.name : $"{leader.contest.teamName}",
+                                score=score,
+                                tmdid=leader.id,
+                                nickname=leader.tmdName,
+                                name=leader.contest.enrollInfos.Find(z => z.code.Equals("name"))?.val,
+                                picture=leader.tmdPicture,
+                                school=leader.schoolId,
+                                schoolName=leader.schoolName,
+                                schoolPicture=leader.schoolPicture,
+                                cipher=leader.contest.cipher,
+                                teamName=leader.contest.teamName,
+                                type=leader.contest.type,
+                                members=members.Select(z => new IdNameCode { id=z.id, name=z.contest.enrollInfos.Find(x => x.code.Equals("name"))?.val, picture=z.tmdPicture, nickname=z.tmdName }).ToList(),
+                            });
+                        }
+                    }
+                    else
+                    {
+                        ///个人组
+                        foreach (var item in result.list)
+                        {
+                            double score = item.upload?.score??-1;
+                            if (item.upload?.showScore==1)
+                            {
+                                score= item.upload.maskScore;
+                            }
+                            teacherScores.Add(new ActivityTeacherScore
+                            {
+                                uploadId=item.upload?.uploadId,
+                                uploadName=!string.IsNullOrWhiteSpace(item.upload?.name) ? item.upload?.name : $"{item.contest.enrollInfos.Find(z => z.code.Equals("name"))?.val}",
+                                score=score,
+                                tmdid=item.id,
+                                nickname=item.tmdName,
+                                name=item.contest.enrollInfos.Find(z => z.code.Equals("name"))?.val,
+                                picture=item.tmdPicture,
+                                school=item.schoolId,
+                                schoolName=item.schoolName,
+                                schoolPicture=item.schoolPicture,
+                                type=item.contest.type,
+                            });
+                        }
+                    }
+
+                    if (contest.score.showType==1)
+                    {
+                        teacherScores= teacherScores.Where(x => x.score>=0).OrderByDescending(x => x.score).ToList();
+
+                        if (contest.score.levelType==1)
+                        {
+                            var levels = contest.score.scoreLevels.OrderBy(x => x.order).ToList();
+
+
+                            foreach (var level in levels)
+                            {
+                                var datas = teacherScores.Take(level.top);
+                                var scores = datas.ToJsonString().ToObject<List<ActivityTeacherScoreLevel>>();
+                                scores.ForEach(z => { z.scoreLevel=level.lable; });
+                                scoreLevels.Add(new ActivityScoreLevel { lable=level.lable, scores=scores });
+                                teacherScores.RemoveAll(x => scores.Select(v => v.uploadId).Contains(x.uploadId));
+                            }
+                        }
+                        else
+                        {
+                            var levels = contest.score.scoreLevels.OrderByDescending(x => x.max);
+                            foreach (var level in levels) 
+                            {
+                                scoreLevels.Add(new ActivityScoreLevel { lable=level.lable});
+                                foreach (var item in teacherScores)
+                                {
+                                    string label = string.Empty;
+                                    if (level.max==100)
+                                    {
+                                        if (item.score>level.min  && item.score<=level.max)
+                                        {
+                                            label=level.lable;
+                                        }
+                                    }
+                                    else
+                                    {
+                                        if (item.score>level.min  && item.score<level.max)
+                                        {
+                                            label=level.lable;
+                                        }
+                                    }
+                                    if (!string.IsNullOrWhiteSpace(label))
+                                    {
+                                        var score = item.ToJsonString().ToObject<ActivityTeacherScoreLevel>();
+                                        score.scoreLevel=label;
+                                        score.score=item.score;
+                                        var data = scoreLevels.Find(x => x.lable.Equals(label));
+                                        if (data!=null)
+                                        {
+                                            data.scores.Add(score);
+                                        }
+                                        else
+                                        {
+                                            scoreLevels.Add(new ActivityScoreLevel { lable=label, scores= new List<ActivityTeacherScoreLevel>() { score } });
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    else
+                    {
+                        if (contest.score.top>-1)
+                        {
+                            teacherScores= teacherScores.Where(x => x.score>=0).OrderByDescending(x => x.score).Take(contest.score.top).ToList();
+                        }
+                        else
+                        {
+                            teacherScores= teacherScores.Where(x => x.score>=0).ToList();
+                        }
+
+                        var scores = new List<ActivityTeacherScoreLevel>();
+                        foreach (var item in teacherScores)
+                        {
+                            double score = item.score;
+                            var teacher = item.ToJsonString().ToObject<ActivityTeacherScoreLevel>();
+                            teacher.scoreLevel=$"{score}";
+                            teacher.score=score;
+                            scores.Add(teacher);
+                        }
+                        scoreLevels.Add(new ActivityScoreLevel { lable="", scores=scores });
+                    }
+
+                }
+            }
+
+            return scoreLevels;
+        }
  
         public static async Task<(List<ExpertContestTaskDto> expertContestTasks, List<ExpertContestTaskDto> activityEnrollsInvalid, List<ExpertContestTaskDto> expertContestTasksDB)>
            AllocationTask(AzureCosmosFactory _azureCosmos, IEnumerable<ExpertPeriodSubjectDto> experts, Contest contest, HashSet<string> periodSubjectKeys, string distribute, int taskCount)

+ 31 - 159
TEAMModelOS/Controllers/Common/ActivityController.cs

@@ -38,6 +38,7 @@ using static TEAMModelOS.Controllers.FixDataController;
 using DocumentFormat.OpenXml.Spreadsheet;
 using DocumentFormat.OpenXml.Office2013.Drawing.ChartStyle;
 using static TEAMModelOS.SDK.Models.Cosmos.Student.StudentAnalysis;
+using System.Net.NetworkInformation;
 namespace TEAMModelOS.Controllers
 {
 
@@ -2697,154 +2698,8 @@ namespace TEAMModelOS.Controllers
                     case bool when $"{grant_type}".Equals("preview-scores", StringComparison.OrdinalIgnoreCase): 
                         {
                             if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
-                            Azure.Response responseContest = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("Contest"));
-                            if (responseContest.Status == 200)
-                            {
-                                List<ActivityTeacherScore> teacherScores = new List<ActivityTeacherScore>();
-                                long now = DateTimeOffset.Now.ToUnixTimeMilliseconds();
-                                Contest contest = JsonDocument.Parse(responseContest.Content).RootElement.ToObject<Contest>();
-                                string sql = $"select value c from c ";
-                                var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityEnroll>(sql, $"ActivityEnroll-{_activityId}");
-                                List<ActivityTeacherScoreLevel> teacherScoreLevels = new List<ActivityTeacherScoreLevel>();
-                                if (result.list.IsNotEmpty())
-                                {
-                                    if (contest.sign.type==1)
-                                    {
-                                        var teams = result.list.Where(x => !string.IsNullOrEmpty(x.contest?.cipher)).GroupBy(z => z.contest.cipher);
-                                        foreach (var team in teams)
-                                        {
-                                            var members = team.ToList();
-                                            var leader = members.FindAll(z => z.contest.leader==1)?.FirstOrDefault();
-                                            if (leader==null)
-                                            {
-                                                leader=members.First();
-                                            }
-                                            double score = leader.upload?.score??-1;
-                                            if (leader.upload?.showScore==1)
-                                            {
-                                                score= leader.upload.maskScore;
-                                            }
-                                            teacherScores.Add(new ActivityTeacherScore
-                                            {
-                                                uploadId=leader.upload?.uploadId,
-                                                uploadName=!string.IsNullOrWhiteSpace(leader.upload?.name) ? leader.upload?.name : $"{leader.contest.teamName}",
-                                                score=score,
-                                                tmdid=leader.id,
-                                                nickname=leader.tmdName,
-                                                name=leader.contest.enrollInfos.Find(z => z.code.Equals("name"))?.val,
-                                                picture=leader.tmdPicture,
-                                                school=leader.schoolId,
-                                                schoolName=leader.schoolName,
-                                                schoolPicture=leader.schoolPicture,
-                                                cipher=leader.contest.cipher,
-                                                teamName=leader.contest.teamName,
-                                                type=leader.contest.type,
-                                                members=members.Select(z => new IdNameCode { id=z.id, name=z.contest.enrollInfos.Find(x => x.code.Equals("name"))?.val, picture=z.tmdPicture, nickname=z.tmdName }).ToList(),
-                                            });
-                                        }
-                                    }
-                                    else
-                                    {
-                                        ///个人组
-                                        foreach (var item in result.list)
-                                        {
-                                            double score = item.upload?.score??-1;
-                                            if (item.upload?.showScore==1)
-                                            {
-                                                score= item.upload.maskScore;
-                                            }
-                                            teacherScores.Add(new ActivityTeacherScore
-                                            {
-                                                uploadId=item.upload?.uploadId,
-                                                uploadName=!string.IsNullOrWhiteSpace(item.upload?.name) ? item.upload?.name : $"{item.contest.enrollInfos.Find(z => z.code.Equals("name"))?.val}",
-                                                score=score,
-                                                tmdid=item.id,
-                                                nickname=item.tmdName,
-                                                name=item.contest.enrollInfos.Find(z => z.code.Equals("name"))?.val,
-                                                picture=item.tmdPicture,
-                                                school=item.schoolId,
-                                                schoolName=item.schoolName,
-                                                schoolPicture=item.schoolPicture,
-                                                type=item.contest.type,
-                                            });
-                                        }
-                                    }
-
-                                    if (contest.score.showType==1)
-                                    {
-                                        teacherScores= teacherScores.Where(x => x.score>=0).OrderByDescending(x => x.score).ToList();
-
-                                        if (contest.score.levelType==1)
-                                        {
-                                            var scoreLevels = contest.score.scoreLevels.OrderBy(x => x.order).ToList();
-                                            foreach (var level in scoreLevels)
-                                            {
-                                                var datas = teacherScores.Take(level.top);
-                                                var scores = datas.ToJsonString().ToObject<List<ActivityTeacherScoreLevel>>();
-                                                scores.ForEach(z => { z.scoreLevel=level.lable; });
-                                                teacherScoreLevels.AddRange(scores);
-                                                teacherScores.RemoveAll(x => scores.Select(v => v.uploadId).Contains(x.uploadId));
-                                            }
-                                        }
-                                        else
-                                        {
-                                            foreach (var item in teacherScores)
-                                            {
-                                                string label = string.Empty;
-                                                foreach (var level in contest.score.scoreLevels)
-                                                {
-                                                    if (level.max==100)
-                                                    {
-                                                        if (item.score>level.min  && item.score<=level.max)
-                                                        {
-                                                            label=level.lable;
-                                                            break;
-                                                        }
-                                                    }
-                                                    else
-                                                    {
-                                                        if (item.score>level.min  && item.score<level.max)
-                                                        {
-                                                            label=level.lable;
-                                                            break;
-                                                        }
-                                                    }
-                                                }
-                                                if (!string.IsNullOrWhiteSpace(label))
-                                                {
-                                                    var score = item.ToJsonString().ToObject<ActivityTeacherScoreLevel>();
-                                                    score.scoreLevel=label;
-                                                    teacherScoreLevels.Add(score);
-                                                }
-                                            }
-                                        }
-                                    }
-                                    else
-                                    {
-                                        if (contest.score.top>-1)
-                                        {
-                                            teacherScores= teacherScores.Where(x => x.score>=0).OrderByDescending(x => x.score).Take(contest.score.top).ToList();
-                                        }
-                                        else
-                                        {
-                                            teacherScores= teacherScores.Where(x => x.score>=0).ToList();
-                                        }
-                                        foreach (var item in teacherScores)
-                                        {
-                                            double score = item.score;
-                                            var teacher = item.ToJsonString().ToObject<ActivityTeacherScoreLevel>();
-                                            teacher.scoreLevel=$"{score}";
-                                            teacherScoreLevels.Add(teacher);
-                                        }
-                                    }
-
-                                }
-                                return Ok(new {code=200, teacherScoreLevels });
-                            }
-                            else {
-                                return Ok(new { code = 1, msg="活动不存在!" });
-                            }
-                           
+                            List<ActivityScoreLevel> contestScores = await ActivityService.ActivityScores(_azureCosmos,_activityId);
+                            return Ok(new { code = 200, contestScores });
                         }
                 }
             }
@@ -3090,19 +2945,12 @@ namespace TEAMModelOS.Controllers
                 activity.url=blob_uri;
                 long now = DateTimeOffset.Now.ToUnixTimeMilliseconds();
                 activity.publish=now>activity.etime ? 2 : activity.publish;
+                List<ActivityScoreLevel> contestScores = null; 
                 if (contest.score!=null  && contest.score.scoreStatus==1  && now>contest.score?.stime  && now<contest.score.etime)
                 {
-                    string sql = $"select value c from c ";
-                    var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityEnroll>(sql, $"ActivityEnroll-{_activityId}");
-                    if (result.list.IsNotEmpty()) {
-                        
-                        if (contest.score.top>-1)
-                        {
-
-                        }
-                    }
+                    contestScores = await ActivityService.ActivityScores(_azureCosmos, _activityId);
                 }
-                return Ok(new { code = 200, activity, contest, reviewRule, training, research });
+                return Ok(new { code = 200, activity, contest, reviewRule, training, research, contestScores });
             }
             else
             {
@@ -3632,9 +3480,33 @@ namespace TEAMModelOS.Controllers
                                             }
                                         }
                                         enroll= JsonDocument.Parse(responseActivityEnroll.Content).RootElement.ToObject<ActivityEnroll>();
+                                        
+                                        double score = -1;
+                                        int levelStatus = -1;
+                                        string scoreLevel = string.Empty;
+                                        if (contest.score!=null  && contest.score.scoreStatus==1  && now>contest.score?.stime  && now<contest.score.etime)
+                                        {
+                                            score=enroll.upload.score;
+                                            if (enroll.upload.showScore==1) {
+                                                score=enroll.upload.maskScore;
+                                            }
+                                            List<ActivityScoreLevel> contestScores = await ActivityService.ActivityScores(_azureCosmos, _activityId, enroll.id);
+                                            var levels = contestScores.SelectMany(x => x.scores).Where(x => x.tmdid.Equals(enroll.id));
+                                            ActivityTeacherScoreLevel level = null;
+                                            if (level!=null  && levels.Count()>0)
+                                            {
+                                                level=levels.First();
+                                                levelStatus=1;
+                                                scoreLevel=level.scoreLevel;
+                                                score= level.score;
+                                            }
+                                            else {
+                                                levelStatus=0;
+                                            }
+                                        }
                                         enroll.upload.score=-1;
                                         enroll.upload.maskScore=-1;
-                                        return Ok(new { code = 200, enroll });
+                                        return Ok(new { code = 200, enroll,scoreData=new { levelStatus , score, scoreLevel, showType=contest.score.showType } });
                                     }
                                     return Ok(new { code = 1, msg = "暂无报名数据!", });