|
@@ -248,6 +248,7 @@ namespace IES.ExamServer.Controllers
|
|
|
List<string> successMsgs = new List<string>();
|
|
|
List<string> errorMsgs = new List<string>();
|
|
|
EvaluationCheckFileResult result = new EvaluationCheckFileResult() { successMsgs=successMsgs, errorMsgs=errorMsgs };
|
|
|
+
|
|
|
if (token.scope.Equals(ExamConstant.ScopeTeacher) || token.scope.Equals(ExamConstant.ScopeVisitor))
|
|
|
{
|
|
|
if (_connectionService.centerIsConnected)
|
|
@@ -257,11 +258,19 @@ namespace IES.ExamServer.Controllers
|
|
|
string shortCode = $"{json["shortCode"]}";
|
|
|
string deviceId = $"{json["deviceId"]}";
|
|
|
EvaluationClient? evaluationClient = _liteDBFactory.GetLiteDatabase().GetCollection<EvaluationClient>().FindOne(x => x.id!.Equals(id) && x.shortCode!.Equals(shortCode));
|
|
|
+
|
|
|
if (teacher != null && evaluationClient!= null)
|
|
|
{
|
|
|
+ int msg_status = Constant._Message_status_info;
|
|
|
+ string msg_content = msg_status.Equals(Constant._Message_status_success) ? "成功" : "失败";
|
|
|
+ await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
|
|
|
+ new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = 0, content = "检测云端数据是否匹配..." });
|
|
|
var dataInfo= await GetEvaluationFromCenter(GetXAuthToken(), _configuration, _httpClientFactory, shortCode, evaluationClient.id!);
|
|
|
+
|
|
|
if (dataInfo.centerCode.Equals("200")&& dataInfo.evaluationCloud!=null)
|
|
|
{
|
|
|
+ await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
|
|
|
+ new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_success, content = $"云端数据检测结果:{dataInfo.centerMsg},状态:{dataInfo.centerCode}" },true);
|
|
|
string? CenterUrl = _configuration.GetValue<string>("ExamServer:CenterUrl");
|
|
|
var client = _httpClientFactory.CreateClient();
|
|
|
if (client.DefaultRequestHeaders.Contains(Constant._X_Auth_AuthToken))
|
|
@@ -283,8 +292,21 @@ namespace IES.ExamServer.Controllers
|
|
|
sas = $"{jsonNode["sas"]}";
|
|
|
cnt = $"{jsonNode["name"]}";
|
|
|
url = $"{jsonNode["url"]}";
|
|
|
+ msg_status = Constant._Message_status_success;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ msg_status = Constant._Message_status_error;
|
|
|
}
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ msg_status = Constant._Message_status_error;
|
|
|
+
|
|
|
+ }
|
|
|
+ msg_content = msg_status.Equals(Constant._Message_status_success) ? "成功" : "失败";
|
|
|
+ await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
|
|
|
+ new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = msg_status, content = $"获取云端下载授权=>{msg_content}" }, true);
|
|
|
var httpClient = _httpClientFactory.CreateClient();
|
|
|
string packagePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "package");
|
|
|
string evaluationPath = Path.Combine(packagePath, dataInfo.evaluationCloud.id!);
|
|
@@ -295,7 +317,9 @@ namespace IES.ExamServer.Controllers
|
|
|
{
|
|
|
Directory.CreateDirectory(evaluationDataPath);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+ await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
|
|
|
+ new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_info, content = $"下载前清理资源" });
|
|
|
string evaluationData = string.Empty;
|
|
|
{
|
|
|
//evaluation
|
|
@@ -308,30 +332,40 @@ namespace IES.ExamServer.Controllers
|
|
|
string path_evaluation = Path.Combine(evaluationDataPath, "evaluation.json");
|
|
|
await System.IO.File.WriteAllTextAsync(path_evaluation, content);
|
|
|
successMsgs.Add("评测信息文件evaluation.json文件下载成功!");
|
|
|
+ await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
|
|
|
+ new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_success, content = $"评测信息文件evaluation.json文件下载成功!" });
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
errorMsgs.Add("评测信息文件evaluation.json文件下载失败!");
|
|
|
+ await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
|
|
|
+ new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_error, content = $"评测信息文件evaluation.json文件下载失败!" }, true);
|
|
|
}
|
|
|
|
|
|
|
|
|
}
|
|
|
- {
|
|
|
- //source.json
|
|
|
- string sourceUrl = $"{url}/{cnt}/package/{json["evaluationId"]}/data/source.json?{sas}";
|
|
|
- HttpResponseMessage dataMessage = await httpClient.GetAsync(sourceUrl);
|
|
|
- if (dataMessage.IsSuccessStatusCode)
|
|
|
- {
|
|
|
- var content = await dataMessage.Content.ReadAsStringAsync();
|
|
|
- string path_source = Path.Combine(evaluationDataPath, "source.json");
|
|
|
- await System.IO.File.WriteAllTextAsync(path_source, content);
|
|
|
- successMsgs.Add("评测数据原始文件source.json文件下载成功!");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- errorMsgs.Add("评测数据原始文件source.json文件下载失败!");
|
|
|
- }
|
|
|
- }
|
|
|
+ //{
|
|
|
+ // //source.json
|
|
|
+ // string sourceUrl = $"{url}/{cnt}/package/{json["evaluationId"]}/data/source.json?{sas}";
|
|
|
+ // HttpResponseMessage dataMessage = await httpClient.GetAsync(sourceUrl);
|
|
|
+ // if (dataMessage.IsSuccessStatusCode)
|
|
|
+ // {
|
|
|
+ // var content = await dataMessage.Content.ReadAsStringAsync();
|
|
|
+ // string path_source = Path.Combine(evaluationDataPath, "source.json");
|
|
|
+ // await System.IO.File.WriteAllTextAsync(path_source, content);
|
|
|
+ // successMsgs.Add("评测数据原始文件source.json文件下载成功!");
|
|
|
+ // await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
|
|
|
+ // new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_success, content = $"评测数据原始文件source.json文件下载成功!" });
|
|
|
+
|
|
|
+ // }
|
|
|
+ // else
|
|
|
+ // {
|
|
|
+ // errorMsgs.Add("评测数据原始文件source.json文件下载失败!");
|
|
|
+ // await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
|
|
|
+ // new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_error, content = $"评测数据原始文件source.json文件下载失败!" }, true);
|
|
|
+
|
|
|
+ // }
|
|
|
+ //}
|
|
|
{
|
|
|
//grouplist.json
|
|
|
string grouplistUrl = $"{url}/{cnt}/package/{json["evaluationId"]}/data/grouplist.json?{sas}";
|
|
@@ -342,16 +376,25 @@ namespace IES.ExamServer.Controllers
|
|
|
string path_groupList = Path.Combine(evaluationDataPath, "grouplist.json");
|
|
|
await System.IO.File.WriteAllTextAsync(path_groupList, content);
|
|
|
successMsgs.Add("评测名单grouplist.json文件下载成功!");
|
|
|
+ await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
|
|
|
+ new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_success, content = $"评测名单grouplist.json文件下载成功!" });
|
|
|
+
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
errorMsgs.Add("评测名单grouplist.json文件下载失败!");
|
|
|
+ await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
|
|
|
+ new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_error, content = $"评测名单grouplist.json文件下载失败!" }, true);
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
|
|
|
{
|
|
|
+
|
|
|
//下载试卷文件
|
|
|
List<EvaluationExam>? evaluationExams = evaluationData.ToObject<JsonNode>()?["evaluationExams"]?.ToObject<List<EvaluationExam>>();
|
|
|
+ int blobCount = evaluationExams!.SelectMany(x => x.papers).SelectMany(x=>x.blobs).Count();
|
|
|
+ int currCount = 0;
|
|
|
foreach (var evaluationExam in evaluationExams!)
|
|
|
{
|
|
|
foreach (var evaluationPaper in evaluationExam.papers)
|
|
@@ -366,11 +409,13 @@ namespace IES.ExamServer.Controllers
|
|
|
// 使用 Parallel.ForEachAsync 并行处理每个 blob
|
|
|
await Parallel.ForEachAsync(evaluationPaper.blobs, parallelOptions, async (blob, cancellationToken) =>
|
|
|
{
|
|
|
+ currCount++;
|
|
|
try
|
|
|
{
|
|
|
// 下载 Blob 文件到本地
|
|
|
- httpClient.Timeout = TimeSpan.FromSeconds(300);
|
|
|
+ //httpClient.Timeout = TimeSpan.FromSeconds(300);
|
|
|
HttpResponseMessage blobMessage = await httpClient.GetAsync($"{url}/{cnt}/{blob.path}?{sas}", cancellationToken);
|
|
|
+
|
|
|
if (blobMessage.IsSuccessStatusCode)
|
|
|
{
|
|
|
byte[] bytes = await blobMessage.Content.ReadAsByteArrayAsync(cancellationToken);
|
|
@@ -388,17 +433,26 @@ namespace IES.ExamServer.Controllers
|
|
|
await System.IO.File.WriteAllBytesAsync(Path.Combine(path_paper, fileName!), bytes, cancellationToken);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
|
|
|
+ new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_error, content = $"[进度:{currCount}/[{blobCount}]][大小:{blob.size * 1.0 / 1024 / 1024}kb]{evaluationExam.subjectName},{evaluationPaper.paperName},{blob.path}文件下载成功。" });
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
string? error = await blobMessage.Content.ReadAsStringAsync(cancellationToken);
|
|
|
errorMsgs.Add($"{evaluationExam.subjectName},{evaluationPaper.paperName},{blob.path}文件下载失败,{blobMessage.StatusCode},{error}");
|
|
|
+ await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
|
|
|
+ new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_error, content = $"[进度:{currCount}/[{blobCount}]][大小:{blob.size * 1.0 / 1024 / 1024}kb]{evaluationExam.subjectName},{evaluationPaper.paperName},{blob.path}文件下载失败,{blobMessage.StatusCode},{error}" }, true);
|
|
|
+
|
|
|
// Console.WriteLine($"Error downloading {blob.path},{blobMessage.StatusCode},{error}");
|
|
|
}
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
errorMsgs.Add($"{evaluationExam.subjectName},{evaluationPaper.paperName},{blob.path}文件下载错误,{ex.Message}");
|
|
|
+ await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
|
|
|
+ new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_error, content = $"[进度:{currCount}/[{blobCount}]][大小:{blob.size * 1.0 / 1024 / 1024}kb]{evaluationExam.subjectName},{evaluationPaper.paperName},{blob.path}文件下载错误,{ex.Message}" }, true);
|
|
|
+
|
|
|
// 处理异常
|
|
|
//Console.WriteLine($"Error downloading {blob.path}: {ex.Message}");
|
|
|
}
|
|
@@ -409,7 +463,7 @@ namespace IES.ExamServer.Controllers
|
|
|
|
|
|
_liteDBFactory.GetLiteDatabase().GetCollection<EvaluationClient>().Upsert(dataInfo.evaluationCloud!);
|
|
|
|
|
|
- (successMsgs, errorMsgs) = await ManageService.CheckFile(dataInfo.evaluationCloud!, successMsgs, errorMsgs, _signalRExamServerHub, _memoryCache, _logger, deviceId, evaluationPath);
|
|
|
+ (successMsgs, errorMsgs) = await ManageService.CheckFile(dataInfo.evaluationCloud!, successMsgs, errorMsgs, _signalRExamServerHub, _memoryCache, _logger, deviceId, evaluationPath, Constant._Message_grant_type_download_file);
|
|
|
//下载完成后,对数据进行检查,然后在加密压缩。
|
|
|
string zipPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "zip");
|
|
|
if (!Directory.Exists(zipPath))
|
|
@@ -422,17 +476,23 @@ namespace IES.ExamServer.Controllers
|
|
|
if (zipInfo.res)
|
|
|
{
|
|
|
successMsgs.Add("评测数据压缩包创建成功!");
|
|
|
+ await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
|
|
|
+ new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_success, content = $"评测数据压缩包创建成功!" });
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
errorMsgs.Add("评测数据压缩包创建失败!");
|
|
|
- }
|
|
|
+ await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
|
|
|
+ new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_error, content = $"评测数据压缩包创建失败!" }, true);
|
|
|
|
|
|
+ }
|
|
|
}
|
|
|
else {
|
|
|
- errorMsgs.Add($"云端数据检测结果:{dataInfo. centerMsg},状态:{dataInfo. centerCode}");
|
|
|
+ string content = $"云端数据检测结果:{dataInfo.centerMsg},状态:{dataInfo.centerCode}";
|
|
|
+ errorMsgs.Add(content);
|
|
|
+ await _signalRExamServerHub.SendMessage(_memoryCache, _logger, deviceId, Constant._Message_grant_type_download_file,
|
|
|
+ new MessageContent { dataId = evaluationClient.id, dataName = evaluationClient.name, messageType = Constant._Message_type_message, status = Constant._Message_status_error, content = content }, true);
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -512,12 +572,12 @@ namespace IES.ExamServer.Controllers
|
|
|
Directory.CreateDirectory(evaluationPath);
|
|
|
}
|
|
|
//解压文件包
|
|
|
- var extractRes = ZipHelper.ExtractPasswordProtectedZip(Path.Combine(zipPath, $"{evaluationLocal.id}-{evaluationLocal.blobHash}.zip"), evaluationPath, evaluationLocal.openCode!);
|
|
|
+ var extractRes = await ZipHelper.ExtractPasswordProtectedZip(Path.Combine(zipPath, $"{evaluationLocal.id}-{evaluationLocal.blobHash}.zip"), evaluationPath, evaluationLocal.openCode!, _signalRExamServerHub,_memoryCache,_logger,deviceId,evaluationLocal);
|
|
|
if (extractRes.res)
|
|
|
{
|
|
|
_memoryCache.Set(key,key,TimeSpan.FromSeconds(30));
|
|
|
successMsgs.Add("评测试卷文件包解压成功!");
|
|
|
- (successMsgs, errorMsgs) = await ManageService.CheckFile(evaluationLocal, successMsgs, errorMsgs, _signalRExamServerHub, _memoryCache, _logger, deviceId, evaluationPath);
|
|
|
+ (successMsgs, errorMsgs) = await ManageService.CheckFile(evaluationLocal, successMsgs, errorMsgs, _signalRExamServerHub, _memoryCache, _logger, deviceId, evaluationPath, Constant._Message_grant_type_check_file);
|
|
|
}
|
|
|
else {
|
|
|
errorMsgs.Add("评测试卷文件包解压失败!");
|