CrazyIter_Bin 1 năm trước cách đây
mục cha
commit
b9a5bc7aa7

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

@@ -19,7 +19,32 @@ namespace TEAMModelOS.SDK
 {
     public static class ActivityService
     {
+        /// <summary>
+        /// 分配作品
+        /// </summary>
+        /// <param name="_azureCosmos"></param>
+        /// <param name="activity"></param>
+        /// <returns></returns>
 
+        public static async Task AllocationTask(AzureCosmosFactory _azureCosmos, Activity activity,List<string> periodSubjectKeys)
+        {
+            //检查报名,学段和科目是否匹配
+            string enrollSQL = "select value  c from c where c.pk='ActivityEnroll'";
+            var resultActivityEnroll=  await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityEnroll>(enrollSQL, $"ActivityEnroll-{activity.id}");
+            List<ActivityEnroll> activityEnrollsInvalid = new List<ActivityEnroll>();
+            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 = $"{period?.val}-{subject.val}";
+                if (periodSubjectKeys.Contains(periodSubjectKey))
+                {
+                }
+                else { 
+                    
+                }
+            }
+        }
         /// <summary>
         /// 删除活动关联的数据
         /// </summary>

+ 76 - 4
TEAMModelOS.TEST/Program.cs

@@ -11,11 +11,40 @@ namespace TEAMModelOS.TEST
     {
         static void Main(string[] args)
         {
+            // 作品数据
+            var works = new List<Work>
+        {
+            new Work { WorkId = "1", Subject = "语文" },
+            new Work { WorkId = "2", Subject = "数学" },
+            new Work { WorkId = "3", Subject = "英语" },
+            new Work { WorkId = "4", Subject = "数学" },
+            new Work { WorkId = "5", Subject = "英语" },
+            new Work { WorkId = "6", Subject = "语文" },
+            new Work { WorkId = "7", Subject = "语文" }
+        };
+
+            // 专家数据
+            var experts = new List<ExpertS>
+        {
+            //new ExpertS { ExpertId = "a", Subjects = new List<string> { "语文", "数学" ,"英语"} },
+            new ExpertS { ExpertId = "b", Subjects = new List<string> { "数学" } },
+            //new ExpertS { ExpertId = "c", Subjects = new List<string> { "英语", "英语" } },
+            new ExpertS { ExpertId = "d", Subjects = new List<string> { "数学" } },
+            new ExpertS { ExpertId = "e", Subjects = new List<string> { "英语", "数学" } },
+            //new ExpertS { ExpertId = "f", Subjects = new List<string> { "语文" } }
+        };
+
+            // 分配作品给专家
+            int N = 1; // 指定评审次数
+            var assignments = AssignWorksToExperts(works, experts, N);
+
+            // 输出结果
+            foreach (var assignment in assignments)
+            {
+                Console.WriteLine($"WorkId: {assignment.WorkId}, ExpertId: {assignment.ExpertId}");
+            }
 
-            //List<string> groupNames = new List<string>() { "組別4", "組別2", "組別3", "組別4", "組別1", "組別1" };
-            //groupNames =groupNames.OrderBy(x => x).ToList();
-            //var jsonAuth = System.IO.File.ReadAllText("C:\\Users\\CrazyIter\\Downloads\\492266088181141504\\ActivityInfo.json", Encoding.UTF8);
-            //var jsonData = jsonAuth.ToObject<LessonRecordActivityInfo>();
+             
             string path = "C:\\Users\\CrazyIter\\Downloads\\消费清单(2022-2023)\\bill";
             List<List<string>> inputArray = new List<List<string>>
             {  
@@ -39,6 +68,33 @@ namespace TEAMModelOS.TEST
                 Console.WriteLine($"id: {item.Id}, count: {item.Count}, pid: {item.Pid}");
             }
         }
+
+        static List<Assignment> AssignWorksToExperts(List<Work> works, List<ExpertS> experts, int N)
+        {
+            var assignments = new List<Assignment>();
+            foreach (var work in works)
+            {
+                for (int i = 0; i < N; i++)
+                {
+                    var availableExperts = experts
+                        .OrderBy(expert => assignments.Count(a => a.ExpertId == expert.ExpertId))
+                        .Where(expert => expert.Subjects.Contains(work.Subject) && !assignments.Any(a => a.WorkId == work.WorkId && a.ExpertId == expert.ExpertId))
+                        .ToList();
+                    if (availableExperts.Count > 0)
+                    {
+                        var selectedExpert = availableExperts.First();
+                        assignments.Add(new Assignment { WorkId = work.WorkId, ExpertId = selectedExpert.ExpertId });
+                    }
+                    else
+                    {
+                        Console.WriteLine($"No available expert for WorkId {work.WorkId} and subject {work.Subject} in attempt {i + 1}.");
+                        break;
+                    }
+                }
+            }
+
+            return assignments;
+        }
         static List<ClassifiedItem> ClassifyHierarchy(List<List<string>> inputArray)
         {
             Dictionary<string, int> hierarchyCount = new Dictionary<string, int>();
@@ -89,7 +145,23 @@ namespace TEAMModelOS.TEST
             public string Pid { get; set; }
         }
     }
+    class Work
+    {
+        public string WorkId { get; set; }
+        public string Subject { get; set; }
+    }
 
+    class ExpertS
+    {
+        public string ExpertId { get; set; }
+        public List<string> Subjects { get; set; }
+    }
+
+    class Assignment
+    {
+        public string WorkId { get; set; }
+        public string ExpertId { get; set; }
+    }
     public class LessonBase {
         public string? id { get; set; }
         public string? duration { get; set; }

+ 97 - 5
TEAMModelOS/Controllers/Common/ActivityController.cs

@@ -1716,11 +1716,103 @@ namespace TEAMModelOS.Controllers
                                         Azure.Response responseActivityExpert = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemStreamAsync($"{_activityId}", new PartitionKey("ActivityExpert"));
                                         if (responseActivityExpert.Status==200) {
                                             ActivityExpert activityExpert = JsonDocument.Parse(responseActivityExpert.Content).RootElement.ToObject<ActivityExpert>();
-                                            if (activityExpert.experts.Count() >=reviewRule.taskCount)
-                                            {
-                                            }
-                                            else {
-                                                return Ok(new { code = 1, msg = "评审专家人数不应少于作品分配次数" });
+                                            List<string> periodSubjectKey = new List<string>();
+                                            List<dynamic> distributeInvalid = new List<dynamic>();
+                                            switch (reviewRule.distribute)
+                                            { 
+                                                case "period":
+                                                    {
+                                                        var fieldPeriod = contest.sign.fields.Find(z => z.field.Equals("period"));
+                                                        if (fieldPeriod== null)
+                                                        {
+                                                            return Ok(new { code = 2, msg = "评审规则匹配学段,但赛课表单未配置学段。" });
+                                                        }
+                                                        else
+                                                        {
+                                                            foreach (string item in fieldPeriod.item) {
+                                                                periodSubjectKey.Add($"{item}-");
+                                                                var periodExperts= activityExpert.experts.Where(z => z.modules.Contains("Contest") &&   z.subjects!=null  && z.subjects.Where(v => !string.IsNullOrWhiteSpace(v.period)).Select(c => c.period).Contains(item));
+                                                                if (periodExperts.Count()<reviewRule.taskCount) 
+                                                                {
+                                                                    distributeInvalid.Add(new {name =item, expertCount= periodExperts.Count(), needCount = reviewRule.taskCount});
+                                                                }
+                                                            }
+                                                        }
+                                                        if (distributeInvalid.Count>0)
+                                                        {
+                                                            return Ok(new { code = 4, msg = "学段匹配的专家数量不足。", distributeInvalid });
+                                                        }
+                                                        return Ok();
+                                                    } 
+                                                case "subject":
+                                                    {
+                                                        var fieldSubject = contest.sign.fields.Find(z => z.field.Equals("subject"));
+                                                        if (fieldSubject== null)
+                                                        {
+                                                            return Ok(new { code = 3, msg = "评审规则匹配学科,但赛课表单未配置学科。" });
+                                                        }
+                                                        else
+                                                        {
+                                                            foreach (string item in fieldSubject.item)
+                                                            {
+                                                                periodSubjectKey.Add($"-{item}");
+                                                                var subjectExperts = activityExpert.experts.Where(z => z.modules.Contains("Contest") && z.subjects!=null  && z.subjects.Where(v => !string.IsNullOrWhiteSpace(v.subject)).Select(c => c.subject).Contains(item));
+                                                                if (subjectExperts.Count()<reviewRule.taskCount)
+                                                                {
+                                                                    distributeInvalid.Add(new { name = item, expertCount = subjectExperts.Count(), needCount = reviewRule.taskCount });
+                                                                }
+                                                             
+                                                            }
+                                                        }
+                                                        if (distributeInvalid.Count>0)
+                                                        {
+                                                            return Ok(new { code = 5, msg = "学科匹配的专家数量不足。", distributeInvalid });
+                                                        }
+                                                        return Ok();
+                                                    }
+                                                    
+                                                case "periodAndSubject":
+                                                    {
+                                                        var fieldPeriod = contest.sign.fields.Find(z => z.field.Equals("period"));
+                                                        if (fieldPeriod== null)
+                                                        {
+                                                            return Ok(new { code = 2, msg = "评审规则匹配学段和学科,但赛课表单未配置学段。" });
+                                                        }
+                                                        var fieldSubject = contest.sign.fields.Find(z => z.field.Equals("subject"));
+                                                        if (fieldSubject== null)
+                                                        {
+                                                            return Ok(new { code = 3, msg = "评审规则匹配学段和学科,但赛课表单未配置学科。" });
+                                                        }
+                                                        foreach (var period in fieldPeriod.item) {
+                                                            foreach (var subject in fieldSubject.item)
+                                                            {
+                                                                periodSubjectKey.Add($"{period}-{subject}");
+                                                                var periodSubjectExperts = activityExpert.experts.FindAll(z => z.modules.Contains("Contest") && z.subjects!=null  && z.subjects.Where(v => !string.IsNullOrWhiteSpace(v.period) && !string.IsNullOrWhiteSpace(v.subject))
+                                                                        .Select(c => $"{c.period}-{c.subject}").Contains($"{period}-{subject}"));
+                                                                if (periodSubjectExperts.Count()<reviewRule.taskCount)
+                                                                {
+                                                                    distributeInvalid.Add(new { name = $"{period}-{subject}", expertCount = periodSubjectExperts.Count(), needCount = reviewRule.taskCount });
+                                                                }
+                                                            }
+                                                        }
+                                                        if (distributeInvalid.Count>0)
+                                                        {
+                                                            return Ok(new { code = 6, msg = "学段和学科匹配的专家数量不足。", distributeInvalid });
+                                                        }
+                                                        return Ok();
+                                                    }
+                                                default:
+                                                    //distribute=none
+                                                    {
+                                                        if (activityExpert.experts.Count() >=reviewRule.taskCount)
+                                                        {
+                                                            return Ok();
+                                                        }
+                                                        else
+                                                        {
+                                                            return Ok(new { code = 1, msg = "评审专家人数不应少于作品分配次数。" });
+                                                        }
+                                                    }
                                             }
                                         }
                                     }