|
@@ -90,6 +90,13 @@ namespace TEAMModelOS.Controllers.Common
|
|
if(string.IsNullOrWhiteSpace(tmid)) return BadRequest();
|
|
if(string.IsNullOrWhiteSpace(tmid)) return BadRequest();
|
|
long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
|
|
long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
|
|
var client = _azureCosmos.GetCosmosClient();
|
|
var client = _azureCosmos.GetCosmosClient();
|
|
|
|
+ //取得個人權限
|
|
|
|
+ bool hasAdmin = false;
|
|
|
|
+ Teacher teacher = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Teacher>(tmid, new PartitionKey("Base"));
|
|
|
|
+ List<string> permission = teacher.permission;
|
|
|
|
+ if (permission.Contains("admin-joint-event")) hasAdmin = true;
|
|
|
|
+
|
|
|
|
+ //取得統測活動
|
|
StringBuilder stringBuilderSelect = new($"SELECT * FROM c WHERE 1=1 ");
|
|
StringBuilder stringBuilderSelect = new($"SELECT * FROM c WHERE 1=1 ");
|
|
StringBuilder stringBuilderWhere = new();
|
|
StringBuilder stringBuilderWhere = new();
|
|
string jointEventId = (request.TryGetProperty("jointEventId", out JsonElement _jointEventId)) ? _jointEventId.ToString() : string.Empty;
|
|
string jointEventId = (request.TryGetProperty("jointEventId", out JsonElement _jointEventId)) ? _jointEventId.ToString() : string.Empty;
|
|
@@ -171,6 +178,11 @@ namespace TEAMModelOS.Controllers.Common
|
|
stringBuilderWhere.Append(" AND " + whereGeo);
|
|
stringBuilderWhere.Append(" AND " + whereGeo);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ //根據權限取得活動 ※非管理者只能取得JointEvent.admin裡面有自己ID的活動
|
|
|
|
+ if (!hasAdmin)
|
|
|
|
+ {
|
|
|
|
+ stringBuilderWhere.Append($" AND ARRAY_CONTAINS(c.admin,'{tmid}') ");
|
|
|
|
+ }
|
|
List<JointEventDto> eventInfo = new List<JointEventDto>();
|
|
List<JointEventDto> eventInfo = new List<JointEventDto>();
|
|
StringBuilder sql = stringBuilderSelect.Append(stringBuilderWhere);
|
|
StringBuilder sql = stringBuilderSelect.Append(stringBuilderWhere);
|
|
await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIteratorSql(queryText: sql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("JointEvent") }))
|
|
await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIteratorSql(queryText: sql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("JointEvent") }))
|
|
@@ -438,7 +450,7 @@ namespace TEAMModelOS.Controllers.Common
|
|
{
|
|
{
|
|
jointEvent.schedule.Add(jointEventSchedule);
|
|
jointEvent.schedule.Add(jointEventSchedule);
|
|
}
|
|
}
|
|
- //製作Schedule progress更新訊息(active-task)
|
|
|
|
|
|
+ //製作Schedule progress更新訊息(active-task) ※時間到觸發流程開始結束用
|
|
bool sendScheduleMsg = (!startTimeOld.Equals(jointEventSchedule.startTime) || !endTimeOld.Equals(jointEventSchedule.endTime) ) ? true : false; //是否發送變更Schedule.progress訊息
|
|
bool sendScheduleMsg = (!startTimeOld.Equals(jointEventSchedule.startTime) || !endTimeOld.Equals(jointEventSchedule.endTime) ) ? true : false; //是否發送變更Schedule.progress訊息
|
|
if(sendScheduleMsg)
|
|
if(sendScheduleMsg)
|
|
{
|
|
{
|
|
@@ -579,21 +591,6 @@ namespace TEAMModelOS.Controllers.Common
|
|
foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
|
|
foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
|
|
{
|
|
{
|
|
JointEventGroupDto jointEventGroupDto = obj.ToObject<JointEventGroupDto>();
|
|
JointEventGroupDto jointEventGroupDto = obj.ToObject<JointEventGroupDto>();
|
|
- foreach(JointEventGroupDto.JointEventGroupCourseDto course in jointEventGroupDto.courseLists)
|
|
|
|
- {
|
|
|
|
- foreach(JointEventGroupDto.JointEventGroupCourseGroupDto group in course.groupLists)
|
|
|
|
- {
|
|
|
|
- foreach (JointEventSchedule schedule in jointEvent.schedule)
|
|
|
|
- {
|
|
|
|
- string scheduleStatus = await GetGroupFinishJointSchedule(jointEventGroupDto.jointEventId, jointEventGroupDto.jointGroupId, group.id, schedule, creatorId);
|
|
|
|
- group.schedule.Add(new {id = schedule.id, name = schedule.name, status = scheduleStatus });
|
|
|
|
- }
|
|
|
|
- if(!groupIdList.Contains(group.id))
|
|
|
|
- {
|
|
|
|
- groupIdList.Add(group.id);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
JointCourseDto.Add(jointEventGroupDto);
|
|
JointCourseDto.Add(jointEventGroupDto);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -771,6 +768,9 @@ namespace TEAMModelOS.Controllers.Common
|
|
}
|
|
}
|
|
}
|
|
}
|
|
jointCourse.courseLists = courseListsFix;
|
|
jointCourse.courseLists = courseListsFix;
|
|
|
|
+ //各Schedule Status計算
|
|
|
|
+ jointCourse = await JointService.CalJointCourseGroupScheduleStatusAsync(client, jointEventId, jointGroupId, creatorId, jointCourse, null);
|
|
|
|
+ //報名班級 DB更新
|
|
await client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync<JointEventGroupDb>(jointCourse, new PartitionKey("JointCourse"));
|
|
await client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync<JointEventGroupDb>(jointCourse, new PartitionKey("JointCourse"));
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1314,133 +1314,6 @@ namespace TEAMModelOS.Controllers.Common
|
|
return Ok(sasList);
|
|
return Ok(sasList);
|
|
}
|
|
}
|
|
|
|
|
|
- //判斷某groupId在某JointSchedule是否完成
|
|
|
|
- private async Task<string> GetGroupFinishJointSchedule(string jointEventId, string jointGroupId, string groupId, JointEventSchedule schedule, string creatorId)
|
|
|
|
- {
|
|
|
|
- string result = "undo";
|
|
|
|
- var client = _azureCosmos.GetCosmosClient();
|
|
|
|
- string scope = "private"; //先只指定個人
|
|
|
|
- string container = (scope.Equals("school")) ? Constant.School : Constant.Teacher;
|
|
|
|
- switch (schedule.type)
|
|
|
|
- {
|
|
|
|
- //報名
|
|
|
|
- case "join":
|
|
|
|
- StringBuilder stringBuilder = new($"SELECT DISTINCT ccg.id FROM c JOIN cc IN c.courseLists JOIN ccg IN cc.groupLists WHERE c.jointEventId = '{jointEventId}' AND c.jointGroupId = '{jointGroupId}' AND (c.type = 'regular' OR NOT IS_DEFINED(c.type) OR IS_NULL(c.type)) AND ccg.id = '{groupId}' ");
|
|
|
|
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, container).GetItemQueryStreamIteratorSql(queryText: stringBuilder.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())
|
|
|
|
- {
|
|
|
|
- if (obj.GetProperty("id").GetString().Equals(groupId))
|
|
|
|
- {
|
|
|
|
- result = "complete";
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- //競賽
|
|
|
|
- case "exam":
|
|
|
|
- //取得老師報名課程或決賽老師課程
|
|
|
|
- List<JointEventGroupDb> jointEventGroup = new List<JointEventGroupDb>(); //個人課程
|
|
|
|
- StringBuilder stringBuilderEventGroup = new($"SELECT * FROM c WHERE c.jointEventId = '{jointEventId}' AND c.jointGroupId = '{jointGroupId}' ");
|
|
|
|
- if (schedule.examType.Equals("regular")) //熱身賽
|
|
|
|
- {
|
|
|
|
- stringBuilderEventGroup.Append($" AND (c.type = 'regular' OR NOT IS_DEFINED(c.type) OR IS_NULL(c.type)) ");
|
|
|
|
- }
|
|
|
|
- else if(schedule.examType.Equals("custom")) //決賽
|
|
|
|
- {
|
|
|
|
- stringBuilderEventGroup.Append($" AND c.type = 'custom' AND c.jointScheduleId = '{schedule.id}' ");
|
|
|
|
- }
|
|
|
|
- if(!string.IsNullOrWhiteSpace(creatorId))
|
|
|
|
- {
|
|
|
|
- stringBuilderEventGroup.Append($" AND c.creatorId = '{creatorId}' ");
|
|
|
|
- }
|
|
|
|
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetItemQueryStreamIteratorSql(queryText: stringBuilderEventGroup.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())
|
|
|
|
- {
|
|
|
|
- jointEventGroup.Add(obj.ToObject<JointEventGroupDb>());
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- //取得本Schedule的所有JointExam
|
|
|
|
- List<string> jointExamIdList = new List<string>();
|
|
|
|
- StringBuilder stringBuilderJointExam = new($"SELECT DISTINCT VALUE c.id FROM c WHERE c.jointEventId = '{jointEventId}' AND c.jointGroupId = '{jointGroupId}' AND c.jointScheduleId = '{schedule.id}' ");
|
|
|
|
- var resultJointExam = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<string>(stringBuilderJointExam.ToString(), $"JointExam");
|
|
|
|
- if (resultJointExam.list.IsNotEmpty())
|
|
|
|
- {
|
|
|
|
- jointExamIdList = new List<string>(resultJointExam.list);
|
|
|
|
- }
|
|
|
|
- //取得所有個人評量
|
|
|
|
- List<string> examIdList = new List<string>();
|
|
|
|
- string sqlExam = $"SELECT DISTINCT VALUE c.id FROM c WHERE ARRAY_CONTAINS({JsonSerializer.Serialize(jointExamIdList)}, c.jointExamId) AND ARRAY_CONTAINS(c.stuLists, '{groupId}') AND CONTAINS(c.code, 'Exam-')";
|
|
|
|
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, Constant.Common).GetItemQueryIteratorSql<string>(queryText: sqlExam, requestOptions: new QueryRequestOptions { }))
|
|
|
|
- {
|
|
|
|
- examIdList.Add(item);
|
|
|
|
- }
|
|
|
|
- //取得所有考試的作答結果
|
|
|
|
- List<string> finishExamIdList = new List<string>();
|
|
|
|
- string sqlExamClassResult = $"SELECT c.examId, c.info.id as classId, c.studentAnswers FROM c WHERE ARRAY_CONTAINS({JsonSerializer.Serialize(examIdList)}, c.examId) AND c.info.id = '{groupId}' AND c.progress=true AND CONTAINS(c.code, 'ExamClassResult')";
|
|
|
|
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, Constant.Common).GetItemQueryStreamIteratorSql(queryText: sqlExamClassResult, requestOptions: new QueryRequestOptions() { }))
|
|
|
|
- {
|
|
|
|
- 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 examId = obj.GetProperty("examId").ToString();
|
|
|
|
- string classId = obj.GetProperty("classId").ToString();
|
|
|
|
- List<List<string>> studentAnswers = obj.GetProperty("studentAnswers").ToObject<List<List<string>>>();
|
|
|
|
- bool isFinish = false; //評量是否已完成 ※有任一學生有作答則視為已完成
|
|
|
|
- foreach (List<string> studentAnswer in studentAnswers)
|
|
|
|
- {
|
|
|
|
- if (studentAnswer.Count > 0) { isFinish = true; break; }
|
|
|
|
- }
|
|
|
|
- if (isFinish)
|
|
|
|
- {
|
|
|
|
- finishExamIdList.Add(examId);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- //結果判斷
|
|
|
|
- JointEventGroupBase.JointEventGroupCourseGroup classInGroup = new JointEventGroupBase.JointEventGroupCourseGroup(); //取得該班級的報名/決賽資訊
|
|
|
|
- foreach(JointEventGroupDb eventGroup in jointEventGroup)
|
|
|
|
- {
|
|
|
|
- foreach(JointEventGroupBase.JointEventGroupCourse eventCourse in eventGroup.courseLists)
|
|
|
|
- {
|
|
|
|
- foreach (JointEventGroupBase.JointEventGroupCourseGroup group in eventCourse.groupLists)
|
|
|
|
- {
|
|
|
|
- if(group.id.Equals(groupId))
|
|
|
|
- {
|
|
|
|
- classInGroup = group;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if (jointEventGroup.Count.Equals(0) || string.IsNullOrWhiteSpace(classInGroup.id)) //資格不符
|
|
|
|
- {
|
|
|
|
- result = "disqualify";
|
|
|
|
- }
|
|
|
|
- else if (jointExamIdList.Count > 0 && jointExamIdList.Count.Equals(finishExamIdList.Count))
|
|
|
|
- {
|
|
|
|
- result = "complete";
|
|
|
|
- }
|
|
|
|
- else if (jointExamIdList.Count > 0 && finishExamIdList.Count > 0 && jointExamIdList.Count > finishExamIdList.Count)
|
|
|
|
- {
|
|
|
|
- result = "doing";
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- return result;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
//生成決賽名單
|
|
//生成決賽名單
|
|
[ProducesDefaultResponseType]
|
|
[ProducesDefaultResponseType]
|
|
#if !DEBUG
|
|
#if !DEBUG
|