|
@@ -16,13 +16,14 @@ using TEAMModelOS.SDK.Services;
|
|
|
using static TEAMModelOS.SDK.Models.JointEventGroupBase;
|
|
|
using Azure.Core;
|
|
|
using Microsoft.Extensions.Configuration;
|
|
|
+using static TEAMModelOS.SDK.Models.JointEvent;
|
|
|
|
|
|
namespace TEAMModelOS.SDK.Models.Service
|
|
|
{
|
|
|
public static class JointService
|
|
|
{
|
|
|
//取得JointExam生成Exam
|
|
|
- public static async Task GenerateExamFromJointExamAsync(CosmosClient client, AzureStorageFactory _azureStorage, AzureServiceBusFactory _serviceBus, CoreAPIHttpService _coreAPIHttpService, AzureRedisFactory _azureRedis, IConfiguration _configuration, DingDing _dingDing, JointExam jointExam)
|
|
|
+ public static async Task GenerateExamFromJointExamAsync(CosmosClient client, AzureStorageFactory _azureStorage, AzureServiceBusFactory _serviceBus, CoreAPIHttpService _coreAPIHttpService, AzureRedisFactory _azureRedis, IConfiguration _configuration, DingDing _dingDing, JointExam jointExam, string creatorId)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
@@ -35,7 +36,8 @@ namespace TEAMModelOS.SDK.Models.Service
|
|
|
if (!jointExam.examType.Equals("custom")) //老師報名名單
|
|
|
{
|
|
|
string jointCourseSql = $"SELECT * FROM c WHERE c.jointEventId = '{jointExam.jointEventId}' AND c.jointGroupId = '{jointExam.jointGroupId}' AND ( IS_DEFINED(c.type) = false OR c.type = 'regular' )";
|
|
|
- await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIteratorSql<JointEventGroupDb>(queryText: jointCourseSql, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"JointCourse") }))
|
|
|
+ if (!string.IsNullOrWhiteSpace(creatorId)) jointCourseSql += $" AND c.creatorId = '{creatorId}' ";
|
|
|
+ await foreach (var item in client.GetContainer("TEAMModelOS", Constant.Teacher).GetItemQueryIteratorSql<JointEventGroupDb>(queryText: jointCourseSql, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"JointCourse") }))
|
|
|
{
|
|
|
jointCourses.Add(item);
|
|
|
}
|
|
@@ -55,8 +57,8 @@ namespace TEAMModelOS.SDK.Models.Service
|
|
|
//評量資料生成
|
|
|
ExamInfo actExamInfo = new ExamInfo();
|
|
|
///取得已生成的Exam ※
|
|
|
- string examSql = $"SELECT DISTINCT c.id, c.source, c.name, c.jointExamId, c.subjects, c.stuLists, c.targets, c.papers, c.year, c.startTime, c.endTime FROM c JOIN s IN c.subjects WHERE c.jointExamId = '{jointExam.id}' AND s.id = '{actExamCourseId}'";
|
|
|
- await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIteratorSql<ExamInfo>(queryText: examSql, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Exam-{actExamCreatorId}") }))
|
|
|
+ string examSql = $"SELECT DISTINCT c.id, c.source, c.name, c.jointExamId, c.subjects, c.stuLists, c.targets, c.papers, c.year, c.startTime, c.endTime, c.code, c.owner, c.scope, c.creatorId FROM c JOIN s IN c.subjects WHERE c.jointExamId = '{jointExam.id}' AND s.id = '{actExamCourseId}'";
|
|
|
+ await foreach (var item in client.GetContainer("TEAMModelOS", Constant.Common).GetItemQueryIteratorSql<ExamInfo>(queryText: examSql, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Exam-{actExamCreatorId}") }))
|
|
|
{
|
|
|
actExamInfo = item;
|
|
|
}
|
|
@@ -82,7 +84,16 @@ namespace TEAMModelOS.SDK.Models.Service
|
|
|
}
|
|
|
List<string> targetRow = new List<string>() { actExamCourseId, actGroup.id };
|
|
|
var targetRowJson = JsonSerializer.SerializeToElement(targetRow);
|
|
|
- if(!actExamInfo.targets.Contains(targetRowJson))
|
|
|
+ bool add = true;
|
|
|
+ foreach(JsonElement target in actExamInfo.targets)
|
|
|
+ {
|
|
|
+ if(target.ToJsonString().Equals(targetRowJson.ToJsonString()))
|
|
|
+ {
|
|
|
+ add = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(add)
|
|
|
{
|
|
|
actExamInfo.targets.Add(targetRowJson);
|
|
|
}
|
|
@@ -261,5 +272,295 @@ namespace TEAMModelOS.SDK.Models.Service
|
|
|
|
|
|
return Result;
|
|
|
}
|
|
|
+
|
|
|
+ //以JointSchedule為單位,判斷班級/課程名單是否完成並生成決賽名單
|
|
|
+ public static async Task<List<JointEventGroupDb>> CreatePassJointCourseBySchedule(CosmosClient client, string jointEventId, string jointGroupId, string jointScheduleId, string scope)
|
|
|
+ {
|
|
|
+ List<JointEventGroupDb> result = new List<JointEventGroupDb>();
|
|
|
+ //0. 取得jointEvent、JointEventSchedule
|
|
|
+ JointEvent jointEvent = await client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemAsync<JointEvent>(jointEventId, new PartitionKey("JointEvent"));
|
|
|
+ if (jointEvent == null)
|
|
|
+ {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ JointEventSchedule jointEventSchedule = jointEvent.schedule.Where(s => s.id.Equals(jointScheduleId)).FirstOrDefault();
|
|
|
+ if (jointEventSchedule == null)
|
|
|
+ {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ //1. 用jointEventId、jointGroupId 取得所有老師報名的 班級/課程名單
|
|
|
+ List<JointEventGroupDb> jointEventCourse = new List<JointEventGroupDb>();
|
|
|
+ StringBuilder stringBuilderJointCourse = new($"SELECT * FROM c WHERE c.jointEventId = '{jointEventId}' AND c.jointGroupId = '{jointGroupId}' AND c.scope = '{scope}' AND (c.type = 'regular' OR NOT IS_DEFINED(c.type) OR IS_NULL(c.type)) ");
|
|
|
+ string container = (scope.Equals("school")) ? Constant.School : Constant.Teacher;
|
|
|
+ await foreach (var item in client.GetContainer(Constant.TEAMModelOS, container).GetItemQueryStreamIteratorSql(queryText: stringBuilderJointCourse.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("JointCourse") }))
|
|
|
+ {
|
|
|
+ using var json = await JsonDocument.ParseAsync(item.Content);
|
|
|
+ if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
|
|
|
+ {
|
|
|
+ foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
+ {
|
|
|
+ jointEventCourse.Add(obj.ToObject<JointEventGroupDb>());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //2. 取得本Schedule的所有JointExam
|
|
|
+ List<string> jointExamIdList = new List<string>();
|
|
|
+ List<JointExam> jointEventExam = new List<JointExam>();
|
|
|
+ StringBuilder stringBuilderJointExam = new($"SELECT * FROM c WHERE c.jointEventId = '{jointEventId}' AND c.jointGroupId = '{jointGroupId}' AND c.jointScheduleId = '{jointScheduleId}' ");
|
|
|
+ await foreach (var item in client.GetContainer(Constant.TEAMModelOS, Constant.Common).GetItemQueryStreamIteratorSql(queryText: stringBuilderJointExam.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("JointExam") }))
|
|
|
+ {
|
|
|
+ using var json = await JsonDocument.ParseAsync(item.Content);
|
|
|
+ if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
|
|
|
+ {
|
|
|
+ foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
+ {
|
|
|
+ JointExam jointExamRow = obj.ToObject<JointExam>();
|
|
|
+ jointEventExam.Add(jointExamRow);
|
|
|
+ if (!jointExamIdList.Contains(jointExamRow.id))
|
|
|
+ {
|
|
|
+ jointExamIdList.Add(jointExamRow.id);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //3. 取得所有JointExam關聯的Exam
|
|
|
+ List<ExamInfo> exam = new List<ExamInfo>();
|
|
|
+ StringBuilder stringBuilderExam = new($"SELECT * FROM c WHERE c.pk = 'Exam' AND ARRAY_CONTAINS({JsonSerializer.Serialize(jointExamIdList)}, c.jointExamId) ");
|
|
|
+ await foreach (var item in client.GetContainer(Constant.TEAMModelOS, Constant.Common).GetItemQueryStreamIteratorSql(queryText: stringBuilderExam.ToString(), requestOptions: null))
|
|
|
+ {
|
|
|
+ using var json = await JsonDocument.ParseAsync(item.Content);
|
|
|
+ if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
|
|
|
+ {
|
|
|
+ foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
+ {
|
|
|
+ exam.Add(obj.ToObject<ExamInfo>());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //4. 用 IfJointExamComplete 列出完成評量的 班級/課程名單
|
|
|
+ List<JointEventGroupPassDto> passGroupsBindJointexam = new List<JointEventGroupPassDto>(); //已完成的課程名單和已完成的JointExam對照表
|
|
|
+ JointEventSchedule finalSchedule = jointEvent.schedule.Where(s => s.type.Equals("exam") && s.examType.Equals("custom")).FirstOrDefault(); //取schedule中的決賽為jointScheduleId ※應該只會有一個決賽
|
|
|
+ if (finalSchedule != null) //可取得挑戰賽才繼續
|
|
|
+ {
|
|
|
+ foreach (JointExam jointExamRow in jointEventExam)
|
|
|
+ {
|
|
|
+ ///第1層 JointExam
|
|
|
+ List<ExamInfo> examsNow = exam.Where(e => e.jointExamId.Equals(jointExamRow.id)).ToList();
|
|
|
+ foreach (JointEventGroupDb jointEventCourseRow in jointEventCourse)
|
|
|
+ {
|
|
|
+ ///第2層 jointEventCourse
|
|
|
+ string creatorIdRow = jointEventCourseRow.creatorId;
|
|
|
+ foreach (JointEventGroupBase.JointEventGroupCourse jointCourseIn in jointEventCourseRow.courseLists)
|
|
|
+ {
|
|
|
+ ///第3層 老師報名的course
|
|
|
+ string courseId = jointCourseIn.courseId;
|
|
|
+ string courseName = jointCourseIn.courseName;
|
|
|
+ List<string> groupIds = jointCourseIn.groupLists.Select(c => c.id).ToList();
|
|
|
+ ExamInfo examNow = examsNow.Where(e => e.creatorId.Equals(creatorIdRow) && e.subjects[0].id.Equals(courseId)).FirstOrDefault();
|
|
|
+ if (examNow != null)
|
|
|
+ {
|
|
|
+ string examId = examNow.id;
|
|
|
+ string schoolId = string.Empty;
|
|
|
+ string classId = string.Empty;
|
|
|
+ foreach (string groupId in groupIds)
|
|
|
+ {
|
|
|
+ JointEventGroupBase.JointEventGroupCourseGroup passGroupInfo = await IfExamComplete(client, examId, scope, creatorIdRow, schoolId, classId, groupId);
|
|
|
+ if (passGroupInfo != null)
|
|
|
+ {
|
|
|
+ //生成決賽通過的老師課程名單用中間model
|
|
|
+ JointEventGroupPassDto passGroupRow = passGroupsBindJointexam.Where(p => p.creatorId.Equals(jointEventCourseRow.creatorId) && p.courseId.Equals(courseId) && p.groupId.Equals(groupId)).FirstOrDefault();
|
|
|
+ if (passGroupRow == null)
|
|
|
+ {
|
|
|
+ passGroupsBindJointexam.Add(new JointEventGroupPassDto()
|
|
|
+ {
|
|
|
+ creatorId = jointEventCourseRow.creatorId,
|
|
|
+ courseId = courseId,
|
|
|
+ groupId = groupId
|
|
|
+ });
|
|
|
+ passGroupRow = passGroupsBindJointexam.Where(p => p.creatorId.Equals(jointEventCourseRow.creatorId) && p.courseId.Equals(courseId) && p.groupId.Equals(groupId)).FirstOrDefault();
|
|
|
+ }
|
|
|
+ if (!passGroupRow.jointExamId.Contains(jointExamRow.id))
|
|
|
+ {
|
|
|
+ passGroupRow.jointExamId.Add(jointExamRow.id);
|
|
|
+ }
|
|
|
+ if (passGroupRow.jointExamId.Count.Equals(jointExamIdList.Count))
|
|
|
+ {
|
|
|
+ passGroupRow.pass = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //5. 決賽課程生成
|
|
|
+ ///生成資料製作
|
|
|
+ List<JointEventGroupDb> jointCourseCreates = new List<JointEventGroupDb>(); //要生成的老師課程名單
|
|
|
+ foreach (JointEventGroupDb jointEventCourseRow in jointEventCourse)
|
|
|
+ {
|
|
|
+ foreach (JointEventGroupBase.JointEventGroupCourse course in jointEventCourseRow.courseLists)
|
|
|
+ {
|
|
|
+ foreach (JointEventGroupBase.JointEventGroupCourseGroup group in course.groupLists)
|
|
|
+ {
|
|
|
+ JointEventGroupPassDto passGroupRow = passGroupsBindJointexam.Where(g => g.creatorId.Equals(jointEventCourseRow.creatorId) && g.courseId.Equals(course.courseId) && g.groupId.Equals(group.id) && g.pass.Equals(true)).FirstOrDefault();
|
|
|
+ if (passGroupRow != null)
|
|
|
+ {
|
|
|
+ string courseId = course.courseId;
|
|
|
+ string courseName = course.courseName;
|
|
|
+ JointEventGroupDb jointCourseCreateRow = jointCourseCreates.Where(c => c.jointEventId.Equals(jointEventCourseRow.jointEventId) && c.jointGroupId.Equals(jointEventCourseRow.jointGroupId) && c.creatorId.Equals(jointEventCourseRow.creatorId)).FirstOrDefault();
|
|
|
+ if (jointCourseCreateRow == null)
|
|
|
+ {
|
|
|
+ JointEventGroupDb finalEventCourse = new JointEventGroupDb();
|
|
|
+ finalEventCourse.jointEventId = jointEventCourseRow.jointEventId;
|
|
|
+ finalEventCourse.jointGroupId = jointEventCourseRow.jointGroupId;
|
|
|
+ finalEventCourse.code = jointEventCourseRow.code;
|
|
|
+ finalEventCourse.pk = jointEventCourseRow.pk;
|
|
|
+ finalEventCourse.scope = jointEventCourseRow.scope;
|
|
|
+ finalEventCourse.type = "custom"; //決賽
|
|
|
+ finalEventCourse.creatorId = jointEventCourseRow.creatorId;
|
|
|
+ finalEventCourse.creatorName = jointEventCourseRow.creatorName;
|
|
|
+ finalEventCourse.creatorEmail = jointEventCourseRow.creatorEmail;
|
|
|
+ finalEventCourse.schoolId = jointEventCourseRow.schoolId;
|
|
|
+ finalEventCourse.schoolName = jointEventCourseRow.schoolName;
|
|
|
+ finalEventCourse.jointScheduleId = finalSchedule.id;
|
|
|
+ finalEventCourse.courseLists.Add(new JointEventGroupBase.JointEventGroupCourse()
|
|
|
+ {
|
|
|
+ courseId = courseId,
|
|
|
+ courseName = courseName,
|
|
|
+ groupLists = new List<JointEventGroupBase.JointEventGroupCourseGroup>() {
|
|
|
+ new() { id = group.id, name = group.name }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ jointCourseCreates.Add(finalEventCourse);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ JointEventGroupBase.JointEventGroupCourse courseRowNow = jointCourseCreateRow.courseLists.Where(c => c.courseId.Equals(courseId)).FirstOrDefault();
|
|
|
+ if (courseRowNow == null)
|
|
|
+ {
|
|
|
+ jointCourseCreateRow.courseLists.Add(
|
|
|
+ new JointEventGroupBase.JointEventGroupCourse
|
|
|
+ {
|
|
|
+ courseId = courseId,
|
|
|
+ courseName = courseName,
|
|
|
+ groupLists = new List<JointEventGroupBase.JointEventGroupCourseGroup>() {
|
|
|
+ new() { id = group.id, name = group.name }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ );
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ JointEventGroupBase.JointEventGroupCourseGroup groupRowNow = courseRowNow.groupLists.Where(g => g.id.Equals(group.id)).FirstOrDefault();
|
|
|
+ if (groupRowNow == null)
|
|
|
+ {
|
|
|
+ courseRowNow.groupLists.Add(
|
|
|
+ new() { id = group.id, name = group.name }
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ///DB
|
|
|
+ if (jointCourseCreates.Count > 0)
|
|
|
+ {
|
|
|
+ //取得所有已存在的決賽課程名單
|
|
|
+ List<JointEventGroupDb> jointCourseFinalExist = new List<JointEventGroupDb>();
|
|
|
+ StringBuilder stringBuilderJointCourseCreates = new($"SELECT * FROM c WHERE c.jointEventId = '{jointEventId}' AND c.jointGroupId = '{jointGroupId}' AND c.scope = '{scope}' AND c.type = 'custom' AND c.jointScheduleId = '{finalSchedule.id}' ");
|
|
|
+ await foreach (var item in client.GetContainer(Constant.TEAMModelOS, container).GetItemQueryStreamIteratorSql(queryText: stringBuilderJointCourseCreates.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("JointCourse") }))
|
|
|
+ {
|
|
|
+ using var json = await JsonDocument.ParseAsync(item.Content);
|
|
|
+ if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
|
|
|
+ {
|
|
|
+ foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
+ {
|
|
|
+ jointCourseFinalExist.Add(obj.ToObject<JointEventGroupDb>());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //生成決賽課程名單
|
|
|
+ foreach (JointEventGroupDb jointCourseCreateRow in jointCourseCreates)
|
|
|
+ {
|
|
|
+ JointEventGroupDb jointCourseFinalExistRow = jointCourseFinalExist.Where(j => j.creatorId.Equals(jointCourseCreateRow.creatorId)).FirstOrDefault();
|
|
|
+ jointCourseCreateRow.id = (jointCourseFinalExistRow != null) ? jointCourseFinalExistRow.id : Guid.NewGuid().ToString();
|
|
|
+ await client.GetContainer(Constant.TEAMModelOS, container).UpsertItemAsync(jointCourseCreateRow);
|
|
|
+ result.Add(jointCourseCreateRow);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ //判斷某課程名單是否已完成評量
|
|
|
+ //回傳值: 班級ID 或 課程名單ID 列表
|
|
|
+ private static async Task<JointEventGroupCourseGroup> IfExamComplete(CosmosClient client, string examId, string scope, string creatorId, string school, string classId, string groupId)
|
|
|
+ {
|
|
|
+ JointEventGroupCourseGroup result = null;
|
|
|
+ try
|
|
|
+ {
|
|
|
+ if (string.IsNullOrWhiteSpace(classId) && string.IsNullOrWhiteSpace(groupId)) return result;
|
|
|
+ if ((scope.Equals("private") && string.IsNullOrWhiteSpace(creatorId)) || (scope.Equals("school") && string.IsNullOrWhiteSpace(school))) return result;
|
|
|
+ string examClassResultCode = (scope.Equals("school") && !string.IsNullOrWhiteSpace(school)) ? $"ExamClassResult-{school}" : $"ExamClassResult-{creatorId}";
|
|
|
+ StringBuilder stringBuilder = new($"SELECT c.info.id AS infoId, c.info.name AS infoName, c.studentIds, c.studentAnswers FROM c WHERE c.examId = '{examId}' ");
|
|
|
+ if (!string.IsNullOrWhiteSpace(classId))
|
|
|
+ {
|
|
|
+ stringBuilder.Append($" AND c.info.id = '{classId}' ");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ stringBuilder.Append($" AND c.info.id = '{groupId}' ");
|
|
|
+ }
|
|
|
+ await foreach (var item in client.GetContainer(Constant.TEAMModelOS, Constant.Common).GetItemQueryStreamIteratorSql(queryText: stringBuilder.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"{examClassResultCode}") }))
|
|
|
+ {
|
|
|
+ using var json = await JsonDocument.ParseAsync(item.Content);
|
|
|
+ if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
|
|
|
+ {
|
|
|
+ foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
+ {
|
|
|
+ string infoId = obj.GetProperty("infoId").GetString();
|
|
|
+ string infoName = obj.GetProperty("infoName").GetString();
|
|
|
+ List<string> studentIds = obj.GetProperty("studentIds").ToObject<List<string>>();
|
|
|
+ List<List<string>> studentAnswers = obj.GetProperty("studentAnswers").ToObject<List<List<string>>>();
|
|
|
+ bool hasAnswer = false;
|
|
|
+ foreach (List<string> studentAnswer in studentAnswers)
|
|
|
+ {
|
|
|
+ if (studentAnswer.Count > 0)
|
|
|
+ {
|
|
|
+ hasAnswer = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (hasAnswer)
|
|
|
+ {
|
|
|
+ result = new JointEventGroupBase.JointEventGroupCourseGroup() { id = infoId, name = infoName };
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 計算決賽通過的老師課程名單用中間model
|
|
|
+ /// </summary>
|
|
|
+ public class JointEventGroupPassDto
|
|
|
+ {
|
|
|
+ public string creatorId { get; set; }
|
|
|
+ public string courseId { get; set; }
|
|
|
+ public string groupId { get; set; }
|
|
|
+ public bool pass { get; set; }
|
|
|
+ public List<string> jointExamId { get; set; } = new(); //已完成的活動評量ID
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
}
|