|
@@ -36,6 +36,7 @@ using DocumentFormat.OpenXml.Drawing.Charts;
|
|
|
using static SKIT.FlurlHttpClient.Wechat.TenpayV3.Models.CreateApplyForSubjectApplymentRequest.Types;
|
|
|
using static TEAMModelOS.Controllers.FixDataController;
|
|
|
using DocumentFormat.OpenXml.Spreadsheet;
|
|
|
+using DocumentFormat.OpenXml.Office2013.Drawing.ChartStyle;
|
|
|
namespace TEAMModelOS.Controllers
|
|
|
{
|
|
|
|
|
@@ -899,6 +900,7 @@ namespace TEAMModelOS.Controllers
|
|
|
TEAMModelOS.SDK.Models.Research research = null;
|
|
|
var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(activity.owner, BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
|
|
|
activity.sas=blob_sas;
|
|
|
+ activity.url=blob_uri;
|
|
|
return Ok(new { code = 200, activity, contest, reviewRule, training, research });
|
|
|
}
|
|
|
else
|
|
@@ -1366,10 +1368,18 @@ namespace TEAMModelOS.Controllers
|
|
|
{
|
|
|
foreach (var task in item.contestTasks)
|
|
|
{
|
|
|
- var teachers = inviteEnrollTeachers.FindAll(z => z.uploadContestId.Equals(task.uploadId));
|
|
|
+ var teachers = inviteEnrollTeachers.FindAll(z => !string.IsNullOrWhiteSpace(z.uploadContestId) && z.uploadContestId.Equals(task.uploadId));
|
|
|
if (teachers!=null)
|
|
|
{
|
|
|
- teachers.ForEach(z => { z.reviewContestAssignCount+=1; z.reviewContestExperts.Add(new IdNameCode { id= item.id, name=item.name, nickname=item.tmdname, picture=item.picture }); });
|
|
|
+ teachers.ForEach(z => { z.reviewContestAssignCount+=1; z.reviewContestExperts.Add(new ExpertUploadScore
|
|
|
+ {
|
|
|
+ score=task.score,
|
|
|
+ detailScore=task.detailScore,
|
|
|
+ id= item.id,
|
|
|
+ name=item.name,
|
|
|
+ nickname=item.tmdname,
|
|
|
+ picture=item.picture
|
|
|
+ }); });
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -1757,7 +1767,7 @@ namespace TEAMModelOS.Controllers
|
|
|
{
|
|
|
contest = JsonDocument.Parse(contestResponse.Content).RootElement.ToObject<Contest>();
|
|
|
}
|
|
|
- var expertDtos = activityExpert.experts.Select(z => z.ToJsonString().ToObject<ExpertDto>());
|
|
|
+ List<ExpertDto> expertDtos = activityExpert.experts.Select(z => z.ToJsonString().ToObject<ExpertDto>()).ToList();
|
|
|
long now = DateTimeOffset.Now.ToUnixTimeMilliseconds();
|
|
|
//进入评审环节
|
|
|
if (contest.review!= null && now > contest.review.stime) {
|
|
@@ -1769,34 +1779,63 @@ namespace TEAMModelOS.Controllers
|
|
|
{
|
|
|
string taskSql = $"select value c from c where c.id in ({string.Join(",", hasIds.Select(z => $"'{z.id}'"))})";
|
|
|
var taskResults = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityExpertTask>(taskSql, $"ActivityExpertTask-{_activityId}");
|
|
|
- foreach (var dto in expertDtos)
|
|
|
- {
|
|
|
- var task = taskResults.list.Find(z => z.id.Equals(dto.id));
|
|
|
- if (task!=null)
|
|
|
+
|
|
|
+ foreach (var item in taskResults.list) {
|
|
|
+ var dto = expertDtos.Find(z => !string.IsNullOrWhiteSpace(z.id) && z.id.Equals(item.id));
|
|
|
+ if (dto!=null )
|
|
|
{
|
|
|
- dto.taskCount =task.contestTasks.Count();
|
|
|
- dto.teacherCount=task.contestTasks.SelectMany(z => z.members).Count();
|
|
|
- dto.completeCount=task.contestTasks.Where(z => z.status==1).Count();
|
|
|
- dto.uploads= task.contestTasks.Select(z => new IdCodeCount { name = z.name, id=z.uploadId, code=string.Join(",", z.uploadTypes), count=z.count }).ToList();
|
|
|
+ dto.taskCount =item.contestTasks.Count();
|
|
|
+ dto.teacherCount=item.contestTasks.SelectMany(z => z.members).Count();
|
|
|
+ dto.completeCount=item.contestTasks.Where(z => z.status==1).Count();
|
|
|
+ dto.uploads= item.contestTasks.Select(z => new ContestUploadData { name = z.name, id=z.uploadId, code=string.Join(",", z.uploadTypes), count=z.count,status= z.status,score=z.score, detailScore=z.detailScore }).ToList();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
expertTasks.AddRange(expertDtos);
|
|
|
}
|
|
|
return Ok(new { expertTasks, code = 200 });
|
|
|
}
|
|
|
- //专家在Protal
|
|
|
- case bool when $"{grant_type}".Equals("expert-visible", StringComparison.OrdinalIgnoreCase):
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
|
|
|
- case bool when $"{grant_type}".Equals("analyze-contest", StringComparison.OrdinalIgnoreCase):
|
|
|
+ case bool when $"{grant_type}".Equals("update-reviewStatus", StringComparison.OrdinalIgnoreCase):
|
|
|
{
|
|
|
- break;
|
|
|
+
|
|
|
+ if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
|
|
|
+ if (!request.TryGetProperty("reviewStatus", out JsonElement _reviewStatus)) return BadRequest();
|
|
|
+ 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 = 1, msg = "不在评审时间范围内!" });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return Ok(new { code = 2, msg = "未配置评审模块!" });
|
|
|
+ }
|
|
|
+ if (int.TryParse($"{_reviewStatus}", out int reviewStatus))
|
|
|
+ {
|
|
|
+ contest.review.reviewStatus = reviewStatus;
|
|
|
+ await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).UpsertItemAsync(contest, new PartitionKey("Contest"));
|
|
|
+ return Ok(new { code = 200, msg = "操作成功!" });
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return Ok(new { code = 4, msg = "评审参数错误!" });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return Ok(new { code = 3, msg = "活动不存在!" });
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
//分配评审作品任务-检查,自动分配
|
|
|
case bool when $"{grant_type}".Equals("allocation-task-auto-assign", StringComparison.OrdinalIgnoreCase):
|
|
@@ -2033,7 +2072,7 @@ namespace TEAMModelOS.Controllers
|
|
|
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())
|
|
|
{
|
|
@@ -2041,12 +2080,28 @@ namespace TEAMModelOS.Controllers
|
|
|
}
|
|
|
}
|
|
|
HashSet<ActivityExpertTask> expertTasksChange = new HashSet<ActivityExpertTask>();
|
|
|
+ Azure.Response responseContest = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("Contest"));
|
|
|
+ Contest contest = null;
|
|
|
+ if (responseContest.Status == 200)
|
|
|
+ {
|
|
|
+ long now = DateTimeOffset.Now.ToUnixTimeMilliseconds();
|
|
|
+ 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 = "不在评审时间范围内!" });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
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)
|
|
|
{
|
|
@@ -2062,6 +2117,7 @@ namespace TEAMModelOS.Controllers
|
|
|
id = contestTask.expertId,
|
|
|
code = $"ActivityExpertTask-{_activityId}",
|
|
|
pk = "ActivityExpertTask",
|
|
|
+ activityId=_activityId.GetString(),
|
|
|
picture=contestTask.expertPicture,
|
|
|
name=contestTask.expertName,
|
|
|
tmdname=contestTask.expertTmdname,
|
|
@@ -2105,7 +2161,9 @@ namespace TEAMModelOS.Controllers
|
|
|
tmdid=z.tmdid,
|
|
|
score=z.score,
|
|
|
status=z.status,
|
|
|
- detailScore=z.detailScore
|
|
|
+ detailScore=z.detailScore,
|
|
|
+
|
|
|
+ activityId=_activityId.GetString()
|
|
|
}));
|
|
|
}
|
|
|
return Ok(new { code = 200, tasksDb = tasksDb });
|
|
@@ -2118,22 +2176,204 @@ namespace TEAMModelOS.Controllers
|
|
|
if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
|
|
|
if (!request.TryGetProperty("uploadId", out JsonElement _uploadId)) return BadRequest();
|
|
|
if (!request.TryGetProperty("expertId", out JsonElement _expertId)) return BadRequest();
|
|
|
- // if (!request.TryGetProperty("expertId", out JsonElement _expertId)) return BadRequest();
|
|
|
+ request.TryGetProperty("expertIdOld", out JsonElement _expertIdOld);
|
|
|
string sql = $"select value c from c where c.upload.uploadId='{_uploadId}' and c.pk='ActivityEnroll'";
|
|
|
var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityEnroll>(sql, $"ActivityEnroll-{_activityId}");
|
|
|
if (result.list.IsNotEmpty())
|
|
|
{
|
|
|
+ ActivityExpertTask expertTask = null;
|
|
|
+
|
|
|
+ ExpertContestTask contestTask = new ExpertContestTask
|
|
|
+ {
|
|
|
+ uploadId=_uploadId.GetString(),
|
|
|
+
|
|
|
+ };
|
|
|
+ string name = string.Empty;
|
|
|
+ int count = 0;
|
|
|
+ if (result.list.Count>1)
|
|
|
+ {
|
|
|
+ var leaders = result.list.FindAll(z => z.contest.leader == 1);
|
|
|
+ var leader = leaders?.First();
|
|
|
+ if (leader!=null)
|
|
|
+ {
|
|
|
+ name = leader?.contest?.teamName;
|
|
|
+ if (string.IsNullOrEmpty(name))
|
|
|
+ {
|
|
|
+ name = $"{leader?.contest?.enrollInfos?.Find(z => z.code.Equals("name"))?.val}({result.list.Count})";
|
|
|
+ }
|
|
|
+ if (leader?.upload != null && leader.upload.sokrates.IsNotEmpty())
|
|
|
+ {
|
|
|
+ count += leader.upload.sokrates.Count;
|
|
|
+ }
|
|
|
+ if (leader?.upload != null && leader.upload.files.IsNotEmpty())
|
|
|
+ {
|
|
|
+ count += leader.upload.files.Count;
|
|
|
+ }
|
|
|
+ List<IdNameCode> members = result.list.Select(z => new IdNameCode { id = z.id, code = z.schoolId, picture = z.tmdPicture, nickname = z.tmdName, name = z.contest?.enrollInfos?.Find(e => e.code.Equals("name")).val }).ToList();
|
|
|
+ var period = leader?.contest?.enrollInfos?.Find(z => z.code.Equals("period"));
|
|
|
+ var subject = leader?.contest?.enrollInfos?.Find(z => z.code.Equals("subject"));
|
|
|
+ contestTask.name= $"{leader?.schoolName}-{name}";
|
|
|
+ contestTask.uploadTypes=new List<string> { leader.upload?.type };
|
|
|
+ contestTask.count=count;
|
|
|
+ contestTask.cipher=leader.contest?.cipher;
|
|
|
+ contestTask.type=leader.contest.type;
|
|
|
+ contestTask.leader=leader.contest.leader;
|
|
|
+ contestTask.members= members;
|
|
|
+ contestTask.tmdid=leader.id;
|
|
|
+ contestTask.period=period?.val;
|
|
|
+ contestTask.subject=subject?.val;
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return Ok(new { code = 3, msg = "该队伍没有队长!" });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (result.list.Count==1)
|
|
|
+ {
|
|
|
+ var leader = result.list[0];
|
|
|
+ name = leader?.contest?.enrollInfos?.Find(z => z.code.Equals("name"))?.val;
|
|
|
+ if (leader?.upload != null && leader.upload.sokrates.IsNotEmpty())
|
|
|
+ {
|
|
|
+ count += leader.upload.sokrates.Count;
|
|
|
+ }
|
|
|
+ if (leader?.upload != null && leader.upload.files.IsNotEmpty())
|
|
|
+ {
|
|
|
+ count += leader.upload.files.Count;
|
|
|
+ }
|
|
|
+ var period = leader?.contest?.enrollInfos?.Find(z => z.code.Equals("period"));
|
|
|
+ var subject = leader?.contest?.enrollInfos?.Find(z => z.code.Equals("subject"));
|
|
|
+ contestTask.name= $"{leader?.schoolName}-{name}";
|
|
|
+ contestTask.uploadTypes=new List<string> { leader.upload?.type };
|
|
|
+ contestTask.count=count;
|
|
|
+ contestTask.type=leader.contest.type;
|
|
|
+ contestTask.tmdid=leader.id;
|
|
|
+ contestTask.period=period?.val;
|
|
|
+ contestTask.subject=subject?.val;
|
|
|
+ }
|
|
|
+
|
|
|
ActivityExpert activityExpert = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemAsync<ActivityExpert>(_activityId.GetString(), new PartitionKey("ActivityExpert"));
|
|
|
Expert expert= activityExpert.experts.Find(z => !string.IsNullOrWhiteSpace(z.id) && z.id.Equals(_expertId.GetString()));
|
|
|
- if (expert!=null) {
|
|
|
-
|
|
|
- }
|
|
|
+ if (expert!=null) {
|
|
|
+ //作品是否有分配过
|
|
|
+ string taskSQL = $"select value c from c join b in c.contestTasks where b.uploadId='{_uploadId}' and c.pk='ActivityExpertTask' " ;
|
|
|
+ var resultTask = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityExpertTask>(taskSQL, $"ActivityExpertTask-{_activityId}");
|
|
|
+ if (resultTask.list.IsNotEmpty())
|
|
|
+ {
|
|
|
+ if (!string.IsNullOrWhiteSpace($"{_expertIdOld}")) {
|
|
|
+
|
|
|
+ if (!expert.id.Equals(_expertIdOld.GetString()))
|
|
|
+ {
|
|
|
+ //从旧的分配中移除
|
|
|
+ var oldTaskExpert = resultTask.list.Find(z => z.id.Equals(_expertIdOld.GetString()));
|
|
|
+ if (oldTaskExpert!=null)
|
|
|
+ {
|
|
|
+ var changeCount = oldTaskExpert.contestTasks.RemoveAll(z => z.uploadId.Equals(_uploadId.GetString()));
|
|
|
+ if (changeCount>0)
|
|
|
+ {
|
|
|
+ await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(oldTaskExpert, new PartitionKey(oldTaskExpert.code));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return Ok(new { code = 2, msg = "未找到该作品已经分配的专家!" });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return Ok(new { code = 4, msg = "作品变更评审专家,调整后的专家不能与已分配的专家相同!" });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 除去被调整的专家(oldExpert),(resultTask)可能还有别的专家已分配的,但是不影响该作品继续被分配到新的专家, 可以理解为,作品分配次数+1,
|
|
|
+ //作品未被分配的情况、
|
|
|
+ string expTaskSQL = $"select value c from c where c.id='{expert.id}' and c.pk='ActivityExpertTask' ";
|
|
|
+ var resultExpTask = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityExpertTask>(expTaskSQL, $"ActivityExpertTask-{_activityId}");
|
|
|
+
|
|
|
+ if (resultExpTask.list.IsNotEmpty())
|
|
|
+ {
|
|
|
+ var task = resultExpTask.list[0].contestTasks.Find(z => z.uploadId.Equals(_uploadId.GetString()));
|
|
|
+ if (task!=null)
|
|
|
+ {
|
|
|
+ task=contestTask;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ resultExpTask.list[0].contestTasks.Add(contestTask);
|
|
|
+ }
|
|
|
+ expertTask=resultExpTask.list[0];
|
|
|
+ expertTask.activityId=_activityId.GetString();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //专家没有任何被分配的作品
|
|
|
+ expertTask = new ActivityExpertTask()
|
|
|
+ {
|
|
|
+ id= expert.id,
|
|
|
+ code=$"ActivityExpertTask-{_activityId}",
|
|
|
+ pk="ActivityExpertTask",
|
|
|
+ ttl=-1,
|
|
|
+ activityId=_activityId.GetString(),
|
|
|
+ name=expert.iname,
|
|
|
+ tmdname=expert.name,
|
|
|
+ picture=expert.picture,
|
|
|
+ contestTasks= new List<ExpertContestTask> { contestTask }
|
|
|
+ };
|
|
|
+ }
|
|
|
+ if (expertTask!=null) {
|
|
|
+ await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(expertTask, new PartitionKey(expertTask.code));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ //旧专家,和作品没有匹配的情况,未分配过,不能调整。
|
|
|
+ if (!string.IsNullOrWhiteSpace($"{_expertIdOld}"))
|
|
|
+ {
|
|
|
+ return Ok(new { code = 2, msg = "未找到该作品已经分配的专家!" });
|
|
|
+ }
|
|
|
+
|
|
|
+ //作品未被分配的情况、
|
|
|
+ string expTaskSQL = $"select value c from c where c.id='{expert.id}' and c.pk='ActivityExpertTask' ";
|
|
|
+ var resultExpTask = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityExpertTask>(expTaskSQL, $"ActivityExpertTask-{_activityId}");
|
|
|
+
|
|
|
+ if (resultExpTask.list.IsNotEmpty())
|
|
|
+ {
|
|
|
+ var task = resultExpTask.list[0].contestTasks.Find(z => z.uploadId.Equals(_uploadId.GetString()));
|
|
|
+ if (task!=null)
|
|
|
+ {
|
|
|
+ task=contestTask;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ resultExpTask.list[0].contestTasks.Add(contestTask);
|
|
|
+ }
|
|
|
+ expertTask=resultExpTask.list[0];
|
|
|
+ expertTask.activityId=_activityId.GetString();
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ //专家没有任何被分配的作品
|
|
|
|
|
|
+ expertTask = new ActivityExpertTask()
|
|
|
+ {
|
|
|
+ id= expert.id,
|
|
|
+ code=$"ActivityExpertTask-{_activityId}",
|
|
|
+ pk="ActivityExpertTask",
|
|
|
+ ttl=-1,
|
|
|
+ activityId=_activityId.GetString(),
|
|
|
+ name=expert.iname,
|
|
|
+ tmdname=expert.name,
|
|
|
+ picture=expert.picture,
|
|
|
+ contestTasks= new List<ExpertContestTask> { contestTask }
|
|
|
+ };
|
|
|
+ }
|
|
|
+ if (expertTask!=null)
|
|
|
+ {
|
|
|
+ await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(expertTask, new PartitionKey(expertTask.code));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return Ok(new { code = 200, expertTask });
|
|
|
}
|
|
|
else {
|
|
|
return Ok(new { code=1,msg ="作品不存在!"});
|
|
|
}
|
|
|
- break;
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -2303,7 +2543,10 @@ namespace TEAMModelOS.Controllers
|
|
|
{
|
|
|
cnt="02944f32-f534-3397-ea56-e6f1fc6c3714";
|
|
|
}
|
|
|
- z.sas= _azureStorage.GetBlobContainerSAS(cnt, BlobContainerSasPermissions.Read).sas;
|
|
|
+ var it = _azureStorage.GetBlobContainerSAS(cnt, BlobContainerSasPermissions.Read);
|
|
|
+ z.sas= it.sas;
|
|
|
+ z.url=it.uri;
|
|
|
+
|
|
|
});
|
|
|
string cnt = website.id;
|
|
|
if (website.id.Equals("teammodel"))
|
|
@@ -2312,6 +2555,7 @@ namespace TEAMModelOS.Controllers
|
|
|
}
|
|
|
var blob = _azureStorage.GetBlobContainerSAS(cnt, BlobContainerSasPermissions.Read);
|
|
|
website.sas= blob.sas;
|
|
|
+ website.url=blob.uri;
|
|
|
string blobUrl = blob.uri;
|
|
|
return Ok(new { code = 200, website, websites, blobUrl });
|
|
|
}
|
|
@@ -2371,6 +2615,7 @@ namespace TEAMModelOS.Controllers
|
|
|
TEAMModelOS.SDK.Models.Research research = null;
|
|
|
var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(activity.owner, BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
|
|
|
activity.sas=blob_sas;
|
|
|
+ activity.url=blob_uri;
|
|
|
return Ok(new { code = 200, activity, contest, reviewRule, training, research });
|
|
|
}
|
|
|
else
|
|
@@ -2421,7 +2666,10 @@ namespace TEAMModelOS.Controllers
|
|
|
{
|
|
|
cnt="02944f32-f534-3397-ea56-e6f1fc6c3714";
|
|
|
}
|
|
|
- website.sas= _azureStorage.GetBlobContainerSAS(cnt, BlobContainerSasPermissions.Read).sas;
|
|
|
+ var blob = _azureStorage.GetBlobContainerSAS(cnt, BlobContainerSasPermissions.Read);
|
|
|
+ website.sas= blob.sas;
|
|
|
+ website.url=blob.uri;
|
|
|
+
|
|
|
return Ok(new { code = 200, website });
|
|
|
}
|
|
|
else
|
|
@@ -2451,40 +2699,218 @@ namespace TEAMModelOS.Controllers
|
|
|
{
|
|
|
(string tmdid, string name, string picture, _) = HttpContext.GetAuthTokenInfo();
|
|
|
if (!request.TryGetProperty("grant_type", out JsonElement grant_type)) return BadRequest();
|
|
|
- if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
|
|
|
+
|
|
|
var client = _azureCosmos.GetCosmosClient();
|
|
|
- Azure.Response response = await client.GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("Activity"));
|
|
|
- if (response.Status==200)
|
|
|
- {
|
|
|
- Activity activity = JsonDocument.Parse(response.Content).RootElement.ToObject<Activity>();
|
|
|
- if (activity.publish==1)
|
|
|
- {
|
|
|
- switch (true)
|
|
|
+
|
|
|
+ switch (true)
|
|
|
+ { //获取分配的任务
|
|
|
+ case bool when $"{grant_type}".Equals("get-enroll-by-uploadId", StringComparison.OrdinalIgnoreCase):
|
|
|
+ {
|
|
|
+ if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
|
|
|
+ if (!request.TryGetProperty("uploadId", out JsonElement _uploadId)) return BadRequest();
|
|
|
+ string enrollSQL = $"select value c from c where c.activityId='{_activityId.GetString()}' and c.upload.uploadId='{_uploadId}' ";
|
|
|
+ //不是自己的,且学校不为空,则查询指定学校的,否则获取所有报名的数据
|
|
|
+ var enrollResult = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityEnroll>(enrollSQL, $"ActivityEnroll-{_activityId}");
|
|
|
+ EnrollUpload upload = null;
|
|
|
+ if (enrollResult.list.IsNotEmpty()) {
|
|
|
+ upload= enrollResult.list[0].upload;
|
|
|
+ }
|
|
|
+ return Ok(new { upload });
|
|
|
+ }
|
|
|
+ //获取分配的任务
|
|
|
+ case bool when $"{grant_type}".Equals("list-task", StringComparison.OrdinalIgnoreCase):
|
|
|
{
|
|
|
- //获取分配的任务
|
|
|
- case bool when $"{grant_type}".Equals("list-task", StringComparison.OrdinalIgnoreCase):
|
|
|
+ List<ActivityExpertDto> activities = new List<ActivityExpertDto>();
|
|
|
+ long now = DateTimeOffset.Now.ToUnixTimeMilliseconds();
|
|
|
+ //在时间内正在进入评审阶段的活动。
|
|
|
+ string contestSQL = $"select value c from c where c.review.stime<={now} and c.review.etime>={now} and c.review.reviewStatus=1";
|
|
|
+ var contestResult = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Contest>(contestSQL, "Contest");
|
|
|
+ if (contestResult.list.IsNotEmpty())
|
|
|
+ {
|
|
|
+ string baseSQL = $"select value c from c where c.id in ({string.Join(",", contestResult.list.Select(z => $"'{z.id}'"))}) ";
|
|
|
+ var activityResult = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(baseSQL, "Activity");
|
|
|
+ string sql = $"select value c from c where c.activityId in ({string.Join(",", contestResult.list.Select(z => $"'{z.id}'"))}) and c.id='{tmdid}' and c.pk='ActivityExpertTask'";
|
|
|
+ var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityExpertTask>(sql);
|
|
|
+ foreach (var item in result.list)
|
|
|
{
|
|
|
+ var contest = contestResult.list.Find(z => z.id.Equals(item.activityId));
|
|
|
+ var activity = activityResult.list.Find(z => z.id.Equals(item.activityId));
|
|
|
+ var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(activity.owner, BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
|
|
|
|
|
|
- break;
|
|
|
+ activities.Add(new ActivityExpertDto
|
|
|
+ {
|
|
|
+ activityId=item.activityId,
|
|
|
+ activityName=activity?.name,
|
|
|
+ stime=contest?.review?.stime??0,
|
|
|
+ etime=contest?.review?.etime??0,
|
|
|
+ taskCount=item.contestTasks.Count(),
|
|
|
+ completeCount=item.contestTasks.Where(z => z.status==1).Count(),
|
|
|
+ contestTasks=item.contestTasks,
|
|
|
+ sas=blob_sas,
|
|
|
+ url=blob_uri
|
|
|
+ }) ;
|
|
|
}
|
|
|
- ///评分
|
|
|
- case bool when $"{grant_type}".Equals("decide-score", StringComparison.OrdinalIgnoreCase):
|
|
|
+ }
|
|
|
+ return Ok(new { activities,code=200 });
|
|
|
+ }
|
|
|
+ ///评分
|
|
|
+ case bool when $"{grant_type}".Equals("decide-score", StringComparison.OrdinalIgnoreCase):
|
|
|
+ {
|
|
|
+ if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
|
|
|
+ if (!request.TryGetProperty("scoreData", out JsonElement _scoreData)) return BadRequest();
|
|
|
+ Azure.Response response = await client.GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("Contest"));
|
|
|
+ if (response.Status==200)
|
|
|
+ {
|
|
|
+ long now = DateTimeOffset.Now.ToUnixTimeMilliseconds();
|
|
|
+ Contest contest = JsonDocument.Parse(response.Content).RootElement.ToObject<Contest>();
|
|
|
+ if (contest.review!= null &&contest.review.stime<now &&contest.review.etime>now)
|
|
|
{
|
|
|
-
|
|
|
- break;
|
|
|
+ if (contest.review.reviewStatus==1)
|
|
|
+ {
|
|
|
+ //作品安分配次数,如果分数全部打完成,自动汇算
|
|
|
+ ReviewScoreData scoreData= _scoreData.ToObject<ReviewScoreData>();
|
|
|
+ var ruleResponse= await client.GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("ReviewRule-disposable"));
|
|
|
+ ReviewRule reviewRule = JsonDocument.Parse(ruleResponse.Content).RootElement.ToObject<ReviewRule>();
|
|
|
+ if (reviewRule.scoreDetail==1) {
|
|
|
+ if (!scoreData.detailScore.IsNotEmpty())
|
|
|
+ {
|
|
|
+ return Ok(new { code = 5, msg = "需要进行细项评分!" });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (scoreData.score<0) {
|
|
|
+ return Ok(new { code = 6, msg = "分数不能小于0!" });
|
|
|
+ }
|
|
|
+ if (!string.IsNullOrWhiteSpace(scoreData.uploadId))
|
|
|
+ {
|
|
|
+ ActivityExpertTask expertTask = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemAsync<ActivityExpertTask>(tmdid, new PartitionKey($"ActivityExpertTask-{_activityId}"));
|
|
|
+ var task = expertTask.contestTasks.Find(x => x.uploadId.Equals(scoreData.uploadId));
|
|
|
+ task.score = scoreData.score;
|
|
|
+ task.status=1;
|
|
|
+ task.detailScore = ActivityService.TreeToList(scoreData.detailScore, new List<RuleConfig>()) ;
|
|
|
+ await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(expertTask, new PartitionKey($"ActivityExpertTask-{_activityId}"));
|
|
|
+ //检查作品是否完成评审自动结算
|
|
|
+ {
|
|
|
+ string sql = $"select distinct value c from c join b in c.contestTasks where c.activityId='{_activityId}' and b.uploadId='{scoreData.uploadId}'";
|
|
|
+ var uploadAllResult = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityExpertTask>(sql, $"ActivityExpertTask-{_activityId}");
|
|
|
+ if (uploadAllResult.list.IsNotEmpty())
|
|
|
+ {
|
|
|
+ var unfinish = uploadAllResult.list.SelectMany(x=>x.contestTasks).Where(z => z.status==0 && z.uploadId.Equals(scoreData.uploadId));
|
|
|
+ if (!(unfinish!=null && unfinish.Count()>0)) {
|
|
|
+ //没有未完成的评审作品自动结算、
|
|
|
+ string enrollSQL =$"select value c from c where c.upload.uploadId='{scoreData.uploadId}'and c.pk ='ActivityEnroll' ";
|
|
|
+ var enrollResult = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityEnroll>(enrollSQL, $"ActivityEnroll-{_activityId}");
|
|
|
+ foreach (var item in enrollResult.list)
|
|
|
+ {
|
|
|
+ bool change = false;
|
|
|
+ List<ExpertUploadScore> expertScores= new List<ExpertUploadScore>();
|
|
|
+ foreach (var expertScore in uploadAllResult.list)
|
|
|
+ {
|
|
|
+ var taskScore = expertScore.contestTasks.Find(z => z.uploadId.Equals(item.upload.uploadId));
|
|
|
+ if (taskScore!= null) {
|
|
|
+ expertScores.Add(new ExpertUploadScore {
|
|
|
+ id= expertScore.id,
|
|
|
+ name=expertScore.name,
|
|
|
+ score=taskScore.score,
|
|
|
+ detailScore=taskScore.detailScore
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ switch (reviewRule.scoreRule)
|
|
|
+ {
|
|
|
+ case "only":
|
|
|
+ if (expertScores.IsNotEmpty() && expertScores.Count==1)
|
|
|
+ {
|
|
|
+ item.upload.score= expertScores.First().score;
|
|
|
+ change=true;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "avg":
|
|
|
+ if (expertScores.IsNotEmpty() && expertScores.Count>=2)
|
|
|
+ {
|
|
|
+ item.upload.score= expertScores.Average(z => z.score);
|
|
|
+ change=true;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "top":
|
|
|
+ if (expertScores.IsNotEmpty() && expertScores.Count>2) {
|
|
|
+ item.upload.score= expertScores.Max(z => z.score);
|
|
|
+ change=true;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "rmLowAvg":
|
|
|
+ if (expertScores.IsNotEmpty() && expertScores.Count>=3)
|
|
|
+ {
|
|
|
+ expertScores.Remove(expertScores.Min());
|
|
|
+ if (expertScores.IsNotEmpty()) {
|
|
|
+ item.upload.score= expertScores.Average(z => z.score);
|
|
|
+ change=true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "rmTopAvg":
|
|
|
+ if (expertScores.IsNotEmpty() && expertScores.Count>=3)
|
|
|
+ {
|
|
|
+ expertScores.Remove(expertScores.Max());
|
|
|
+ if (expertScores.IsNotEmpty())
|
|
|
+ {
|
|
|
+ item.upload.score= expertScores.Average(z => z.score);
|
|
|
+ change=true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "rmLowTopAvg":
|
|
|
+ if (expertScores.IsNotEmpty() && expertScores.Count>=4)
|
|
|
+ {
|
|
|
+ expertScores.Remove(expertScores.Max());
|
|
|
+ expertScores.Remove(expertScores.Min());
|
|
|
+ if (expertScores.IsNotEmpty())
|
|
|
+ {
|
|
|
+ item.upload.score= expertScores.Average(z => z.score);
|
|
|
+ change=true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (change)
|
|
|
+ {
|
|
|
+ await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(item, new PartitionKey($"ActivityEnroll-{_activityId}"));
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return Ok(new { code = 200, completeCount = expertTask.contestTasks.Where(z => z.status==1).Count(), contestTasks = expertTask.contestTasks });
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return Ok(new { code = 4, msg = "参数错误!" });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return Ok(new { code = 2, msg = "评审已关闭!" });
|
|
|
+ }
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return Ok(new { code = 1, msg = "已过评审时间!" });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return Ok(new { code = 3, msg = "活动不存在!" });
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
}
|
|
|
return Ok();
|
|
|
}
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 教师在赛课模块的操作
|
|
|
- /// </summary>
|
|
|
- /// <param name="request"></param>
|
|
|
- /// <returns></returns>
|
|
|
- [ProducesDefaultResponseType]
|
|
|
+ /// <summary>
|
|
|
+ /// 教师在赛课模块的操作
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="request"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [ProducesDefaultResponseType]
|
|
|
[HttpPost("teacher-contest")]
|
|
|
[AuthToken(Roles = "teacher")]
|
|
|
#if !DEBUG
|
|
@@ -2526,8 +2952,9 @@ namespace TEAMModelOS.Controllers
|
|
|
{
|
|
|
if (contest.review!=null)
|
|
|
{
|
|
|
- if (now>= contest.review?.stime)
|
|
|
+ if (now>= contest.review?.stime && !$"{grant_type}".Equals("get-enroll", StringComparison.OrdinalIgnoreCase))
|
|
|
{
|
|
|
+ //只能查看报名信息
|
|
|
return Ok(new { code = 35, msg = "已到截至日期,不能操作!" });
|
|
|
}
|
|
|
}
|
|
@@ -3418,6 +3845,7 @@ namespace TEAMModelOS.Controllers
|
|
|
{
|
|
|
var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(z.owner, BlobContainerSasPermissions.Read);
|
|
|
z.sas=blob_sas;
|
|
|
+ z.url=blob_uri;
|
|
|
});
|
|
|
return Ok(new { activities, website });
|
|
|
}
|