CrazyIter_Bin 1 年之前
父節點
當前提交
a3482da1bd

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

@@ -280,6 +280,10 @@ namespace TEAMModelOS.SDK.Models
         public long stime { get; set; }
         public long etime { get; set; }
         /// <summary>
+        /// 0未进入专家评审阶段,1已经进入专家评审阶段。
+        /// </summary>
+        public int reviewStatus {  get; set; }
+        /// <summary>
         ///  //default 默认,评审规则
         /// </summary>
         public string ruleId { get; set; }
@@ -692,7 +696,7 @@ namespace TEAMModelOS.SDK.Models
         public string expertId { get; set; }
         public string periodSubjectKey { get; set; }
         /// <summary>
-        /// 0,未匹配,1已经匹配,2学段未选择,3学科未选择,4 学段或学科未选择
+        /// 0,默认未分配,1已经匹配,2学段未选择,3学科未选择,4 学段或学科未选择,5未上传,6学科或学段不匹配,7未匹配到符合的专家
         /// </summary>
         public int available { get; set; }
         /// <summary>

+ 56 - 99
TEAMModelOS.SDK/Models/Service/Common/ActivityService.cs

@@ -38,126 +38,75 @@ namespace TEAMModelOS.SDK
             var resultActivityEnroll=  await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityEnroll>(enrollSQL, $"ActivityEnroll-{activity.id}");
             List<ExpertContestTaskDto  > activityEnrollsInvalid = new List<ExpertContestTaskDto>();
             Dictionary<string, List<ActivityEnroll>>  uploads = new  Dictionary<string, List<ActivityEnroll>>();
-            foreach (ActivityEnroll enroll in resultActivityEnroll.list) 
+            foreach (ActivityEnroll enroll in resultActivityEnroll.list)
             {
+                var period = enroll.contest?.enrollInfos?.Find(z => z.code.Equals("period"));
+                var subject = enroll.contest?.enrollInfos?.Find(z => z.code.Equals("subject"));
                 string periodSubjectKey =string.Empty;
+                int count = 0;
+                if (enroll.upload != null && enroll.upload.sokrates.IsNotEmpty())
+                {
+                    count += enroll.upload.sokrates.Count;
+                }
+                if (enroll.upload != null && enroll.upload.files.IsNotEmpty())
+                {
+                    count += enroll.upload.files.Count;
+                }
+                //学段学科不匹配
+                var taskDto = new ExpertContestTaskDto
+                {
+                    uploadId = enroll.upload?.uploadId,
+                    name = $"{enroll?.schoolName}-{enroll?.tmdName}",
+                    uploadTypes = new List<string> { enroll?.upload.type },
+                    count = count,
+                    cipher = enroll.contest?.cipher,
+                    type = enroll.contest != null ? enroll.contest.type : 0,
+                    leader = enroll.contest != null ? enroll.contest.type : 0,
+                    tmdid = enroll.id,
+                    status = -1,
+                    score = -1,
+                    //detailScore=new List<RuleConfig>()
+                    members = new List<IdNameCode>(),
+                    periodSubjectKey = periodSubjectKey,
+                    period = period?.val,
+                    subject = subject?.val,
+                   
+                };
                 if (distribute.Equals("period"))
                 {
-                    var period = enroll.contest?.enrollInfos?.Find(z => z.code.Equals("period"));
                     if (period != null)
                     {
                         periodSubjectKey = $"{period.val}-";
                     }
                     else {
-                        int count = 0;
-                        if (enroll.upload!=null  && enroll.upload.sokrates.IsNotEmpty())
-                        {
-                            count += enroll.upload.sokrates.Count;
-                        }
-                        if (enroll.upload != null && enroll.upload.files.IsNotEmpty())
-                        {
-                            count += enroll.upload.files.Count;
-                        }
-                        //学段学科不匹配
-                        var  invalidTask = new ExpertContestTaskDto
-                        {
-                            uploadId = enroll.upload?.uploadId,
-                            name = $"{enroll?.schoolName}-{enroll?.tmdName}",
-                            uploadTypes = new List<string> { enroll?.upload.type },
-                            count = count,
-                            cipher = enroll.contest?.cipher,
-                            type = enroll.contest != null ? enroll.contest.type : 0,
-                            leader = enroll.contest != null ? enroll.contest.type : 0,
-                            tmdid = enroll.id,
-                            status = -1,
-                            score = -1,
-                            //detailScore=new List<RuleConfig>()
-                            members = new List<IdNameCode>(),
-                            periodSubjectKey = periodSubjectKey,
-                            period = period?.val,
-                            subject =null,
-                            available=2
-                        };
-                        activityEnrollsInvalid.Add(invalidTask);
+                        taskDto.available = 2;
+                        activityEnrollsInvalid.Add(taskDto);
                         break;
                     }
                 }
                 else if (distribute.Equals("subject"))
                 {
-                    var subject = enroll.contest?.enrollInfos?.Find(z => z.code.Equals("subject"));
+                    
                     if (subject != null)
                     {
                         periodSubjectKey = $"-{subject.val}";
                     }
                     else {
-                        int count = 0;
-                        if (enroll.upload != null && enroll.upload.sokrates.IsNotEmpty())
-                        {
-                            count += enroll.upload.sokrates.Count;
-                        }
-                        if (enroll.upload != null && enroll.upload.files.IsNotEmpty())
-                        {
-                            count += enroll.upload.files.Count;
-                        }
-                        //学段学科不匹配
-                        var invalidTask = new ExpertContestTaskDto
-                        {
-                            uploadId = enroll.upload?.uploadId,
-                            name = $"{enroll?.schoolName}-{enroll?.tmdName}",
-                            uploadTypes = new List<string> { enroll?.upload.type },
-                            count = count,
-                            cipher = enroll.contest?.cipher,
-                            type = enroll.contest != null ? enroll.contest.type : 0,
-                            leader = enroll.contest != null ? enroll.contest.type : 0,
-                            tmdid = enroll.id,
-                            status = -1,
-                            score = -1,
-                            members = new List<IdNameCode>(),
-                            periodSubjectKey = periodSubjectKey,
-                            period = null,
-                            subject = subject?.val,
-                            available = 3
-                        }; activityEnrollsInvalid.Add(invalidTask);
+                        taskDto.available = 3;
+                        activityEnrollsInvalid.Add(taskDto);
                         break;
                     }
                 }
                 else if (distribute.Equals("periodAndSubject"))
                 {
-                    var period = enroll.contest?.enrollInfos?.Find(z => z.code.Equals("period"));
-                    var subject = enroll.contest?.enrollInfos?.Find(z => z.code.Equals("subject"));
+                   
                     if (period != null && subject != null)
                     {
                         periodSubjectKey = $"{period.val}-{subject.val}";
                     }
                     else {
-                        int count = 0;
-                        if (enroll.upload != null && enroll.upload.sokrates.IsNotEmpty())
-                        {
-                            count += enroll.upload.sokrates.Count;
-                        }
-                        if (enroll.upload != null && enroll.upload.files.IsNotEmpty())
-                        {
-                            count += enroll.upload.files.Count;
-                        }
-                        //学段学科不匹配
-                        var invalidTask = new ExpertContestTaskDto
-                        {
-                            uploadId = enroll.upload?.uploadId,
-                            name = $"{enroll?.schoolName}-{enroll?.tmdName}",
-                            uploadTypes = new List<string> { enroll?.upload.type },
-                            count = count,
-                            cipher = enroll.contest?.cipher,
-                            type = enroll.contest != null ? enroll.contest.type : 0,
-                            leader = enroll.contest != null ? enroll.contest.type : 0,
-                            tmdid = enroll.id,
-                            status = -1,
-                            score = -1,
-                            members = new List<IdNameCode>(),
-                            periodSubjectKey = periodSubjectKey,
-                            period = period?.val,
-                            subject = subject?.val,
-                            available = 3
-                        }; activityEnrollsInvalid.Add(invalidTask);
+                        taskDto.available = 4;
+                        activityEnrollsInvalid.Add(taskDto);
                         break;
                     }
                 }
@@ -183,11 +132,15 @@ namespace TEAMModelOS.SDK
                         }
                     }
                     else {
+                        taskDto.available = 5;
+                        activityEnrollsInvalid.Add(taskDto);
                         //未上传作品
                         //activityEnrollsInvalid.Add((enroll, 2));
                     }
                 }
                 else {
+                    taskDto.available =6;
+                    activityEnrollsInvalid.Add(taskDto);
                     //学段学科不匹配
                     //activityEnrollsInvalid.Add((enroll, 1));
                 }
@@ -362,9 +315,10 @@ namespace TEAMModelOS.SDK
                         }));
                     }
                 }
-              var data = AssignWorksToExperts(expertContestTasks, worksDB, experts, taskCount);
+                var data = AssignWorksToExperts(expertContestTasks, worksDB, experts, taskCount);
                 expertContestTasks = data.assignmentsAdd;
-                expertContestTasksDB = data.worksDB;
+                expertContestTasksDB = worksDB;
+                activityEnrollsInvalid.AddRange(data.assignmentsInvalid);
             }
             return (expertContestTasks, activityEnrollsInvalid, expertContestTasksDB);
         }
@@ -375,17 +329,20 @@ namespace TEAMModelOS.SDK
         /// <param name="experts"></param>
         /// <param name="N"></param>
         /// <returns></returns>
-        static (List<ExpertContestTaskDto> assignmentsAdd, List<ExpertContestTaskDto> worksDB) AssignWorksToExperts(List<ExpertContestTaskDto> works,List<ExpertContestTaskDto> worksDB, IEnumerable<ExpertPeriodSubjectDto> experts, int N)
+        static (List<ExpertContestTaskDto> assignmentsAdd, List<ExpertContestTaskDto> assignmentsInvalid) AssignWorksToExperts(List<ExpertContestTaskDto> works,List<ExpertContestTaskDto> worksDB, IEnumerable<ExpertPeriodSubjectDto> experts, int N)
         {
             //增加的
             var assignmentsAdd = new List<ExpertContestTaskDto>();
+            //未分配到的
+            var assignmentsInvalid = new List<ExpertContestTaskDto>();
             var random = new Random();
+            //用于处理数据库和新分配的结果中检查已经分配过的作品和专家
             var assignmentsAll = worksDB.ToJsonString().ToObject<List<ExpertContestTaskDto>>();
             foreach (var work in works)
             {
                 for (int i = 0; i < N; i++)
                 {
-                    //分配次数已经Ok
+                    //分配次数已经Ok,分配结果完善的,不需要再去处理
                     if (assignmentsAll.Count(z => z.uploadId.Equals(work.uploadId))>=N) {
                         continue;
                     }
@@ -407,17 +364,17 @@ namespace TEAMModelOS.SDK
                     {
                         var newWork = work.DeepCopy<ExpertContestTaskDto>();
                         newWork.expertId =null;
-                        newWork.available = 0;
+                        newWork.available = 7;
                         newWork.turn = i + 1;
                         //作品在第几轮未匹配到
-                        assignmentsAdd.Add(newWork);
-                        assignmentsAll.Add(newWork);
+                        assignmentsInvalid.Add(newWork);
                         //Console.WriteLine($"No available expert for WorkId {work.uploadId} and subject {work.periodSubjectKey} in attempt {i + 1}.");
                         break;
                     }
                 }
             }
-            return (assignmentsAdd, worksDB);
+
+            return (assignmentsAdd, assignmentsInvalid);
         }
         /// <summary>
         /// 删除活动关联的数据

+ 62 - 2
TEAMModelOS/Controllers/Common/ActivityController.cs

@@ -1707,7 +1707,7 @@ namespace TEAMModelOS.Controllers
                             break;
                         }
                     //分配评审作品任务-检查,自动分配
-                    case bool when $"{grant_type}".Equals("allocation-task-check-assign", StringComparison.OrdinalIgnoreCase): {
+                    case bool when $"{grant_type}".Equals("allocation-task-auto-assign", StringComparison.OrdinalIgnoreCase): {
                             if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
                             Azure.Response responseReviewRule =  await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("ReviewRule-disposable"));
                             if (responseReviewRule.Status == 200)
@@ -1716,8 +1716,20 @@ namespace TEAMModelOS.Controllers
                                 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>();
+                                    if (contest.modules.Contains("review") && contest.review != null) {
+
+                                        if (now < contest.review.stime || now > contest.review.etime) {
+                                            return Ok(new { code = 12, msg = "不在评审时间范围内!" });
+                                        }
+                                    }
+                                    else {
+                                           return Ok(new { code = 11, msg ="未配置评审模块!" });
+                                    }
+
                                     var result = ActivityService.CheckReviewRule(reviewRule, contest);
+
                                     if (result.invalidCode == 200)
                                     {
                                         Azure.Response responseActivityExpert = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemStreamAsync($"{_activityId}", new PartitionKey("ActivityExpert"));
@@ -1903,7 +1915,55 @@ namespace TEAMModelOS.Controllers
                     //分配评审作品任务-自动
                     case bool when $"{grant_type}".Equals("allocation-task-auto-save", StringComparison.OrdinalIgnoreCase):
                         {
-                            
+                            if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
+                            if (!request.TryGetProperty("taskKey", out JsonElement _taskKey)) return BadRequest();
+                            var value =  await _azureRedis.GetRedisClient(8).StringGetAsync(_taskKey.GetString());
+                            if (value.HasValue) { 
+                                List<ExpertContestTaskDto> contestTasks= value.ToString().ToObject<List<ExpertContestTaskDto>>();
+                                List<ActivityExpertTask> expertTasks = new List<ActivityExpertTask>();
+                                var expertIds=   contestTasks.Where(x => !string.IsNullOrWhiteSpace(x.expertId)).Select(z => z.expertId).ToHashSet();
+                                if (expertIds != null && expertIds.Count > 0) {
+                                    string taskSQL = $"select value c from c where c.pk='ActivityExpertTask' and c.id in ({string.Join(",",expertIds.Select(z=>$"'{z}'"))})";
+                                    List<ExpertContestTaskDto> worksDB = new List<ExpertContestTaskDto>();
+                                    var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityExpertTask>(taskSQL, $"ActivityExpertTask-{_activityId}");
+                                    if (result.list.IsNotEmpty()) {
+                                        expertTasks.AddRange(result.list);
+                                    }
+                                }
+                                HashSet<ActivityExpertTask> expertTasksChange = new HashSet<ActivityExpertTask>();
+                                foreach (var contestTask in contestTasks) {
+                                    ExpertContestTask expertContestTask = contestTask.ToJsonString().ToObject<ExpertContestTask>();
+                                    var expertTask =  expertTasks.Find(z => z.id.Equals(contestTask.expertId));
+                                    if (expertTask != null)
+                                    {
+                                        var task = expertTask.contestTasks.Find(z => z.uploadId.Equals(contestTask.uploadId));
+                                        if (task == null) {
+                                            expertTask.contestTasks.Add(expertContestTask);
+                                            expertTasksChange.Add(expertTask);
+                                        }
+                                    }
+                                    else {
+                                        
+                                        ActivityExpertTask activityExpertTask = new ActivityExpertTask()
+                                        {
+                                            id = contestTask.expertId,
+                                            code = $"ActivityExpertTask-{_activityId}",
+                                            pk = "ActivityExpertTask",
+                                            contestTasks = new List<ExpertContestTask> { expertContestTask }
+                                        };
+                                        expertTasksChange.Add(activityExpertTask);
+                                    }
+                                }
+                                List<Task<ItemResponse<ActivityExpertTask>>> responses = new List<Task<ItemResponse<ActivityExpertTask>>>();
+                                foreach (var contestTask in expertTasksChange) {
+                                    responses.Add(_azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(contestTask, new PartitionKey($"ActivityExpertTask-{_activityId}")));
+                                }
+                                if (responses.IsNotEmpty()) {
+                                    await Task.WhenAll(responses);
+                                }
+                                await _azureRedis.GetRedisClient(8).KeyDeleteAsync(_taskKey.GetString());
+                                return Ok(new { code=200});
+                            }
                             break;
                         }
                     //分配评审作品任务-手动