CrazyIter_Bin 4 månader sedan
förälder
incheckning
d0b2bd5188

+ 13 - 2
TEAMModelOS.Extension/IES.Exam/IES.ExamServer/Controllers/ManageController.cs

@@ -41,6 +41,17 @@ namespace IES.ExamServer.Controllers
             _connectionService=connectionService;
             _signalRExamServerHub=signalRExamServerHub;
         }
+        /// <summary>
+        /// 清理缓存,列出缓存占用空间,type =list列出,type=clear清理,不能清理近期及正在激活的数据,并且提示清理中暂未上传或者导出的数据。
+        /// </summary>
+        /// <param name="json"></param>
+        /// <returns></returns>
+        [HttpPost("clean-cache")]
+        [AuthToken("admin", "teacher")]
+        public async Task<IActionResult> CleanCache(JsonNode json) 
+        {
+            return Ok();
+        }
         [HttpPost("download-package")]
         [AuthToken("admin","teacher")]
         public async Task<IActionResult> DownloadPackage(JsonNode json)
@@ -291,7 +302,7 @@ namespace IES.ExamServer.Controllers
                 string packagePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "package");
                 if (!Directory.Exists(packagePath))
                     Directory.CreateDirectory(packagePath);
-                string evaluationPath = Path.Combine(packagePath, evaluationLocal.id!);
+                string evaluationPath = Path.Combine(packagePath,"exam", evaluationLocal.id!);
                // await Task.Delay(DelayMacro);
               
                 string path_evaluation = Path.Combine(evaluationPath, "evaluation.json");
@@ -352,7 +363,7 @@ namespace IES.ExamServer.Controllers
                // await Task.Delay(DelayMacro);
                 msg_status =Constant._Message_status_info;
                 try {
-
+                    //TODO 重整本地文件路径。 文件可能不存在D:\VisualStudioProjects\TEAMModelOS\TEAMModelOS.Extension\IES.Exam\IES.ExamServer\wwwroot\package\exam\6af32bbd-144e-4366-8bc0-61ba4c85677c\evaluation.json
                     string evaluation_str = await System.IO.File.ReadAllTextAsync(path_evaluation);
                     JsonNode? evaluation_data = evaluation_str.ToObject<JsonNode>(); 
                     

+ 1 - 1
TEAMModelOS.Extension/IES.Exam/IES.ExamServer/appsettings.json

@@ -27,7 +27,7 @@
   "ExamServer": {
     "Timeout": 30000,
     "Delay": 500,
-    "CenterUrl": "https://www.teammodel.cn"
+    "CenterUrl": "https://localhost:5001"
   },
   "ExamClient": {
     "Domain": "edge-exam.habook.cn"

+ 73 - 7
TEAMModelOS.Extension/IES.ExamLib/Models/EvaluationCommon.cs

@@ -42,16 +42,22 @@ namespace IES.ExamServer.Models
         /// 数据范围
         /// </summary>
         public string? scope { get; set; }
-      
         /// <summary>
         /// 源code
         /// </summary>
         public string? scode { get; set; }
         /// <summary>
-        /// 科目
+        /// 评测科目
         /// </summary>
         public List<SubjectExam> subjects { get; set; } = new List<SubjectExam>();
-
+        /// <summary>
+        /// 扩展活动项目,投票评选Vote,问卷调查Survey
+        /// </summary>
+        public List<ExtendActivity> activities { get; set; } = new List<ExtendActivity>();
+        /// <summary>
+        /// AI音乐评测
+        /// </summary>
+        public AIMusic? music { get; set; }
         /// <summary>
         /// 活动数据包生成最新时间戳
         /// </summary>
@@ -117,8 +123,7 @@ namespace IES.ExamServer.Models
         public string? shortCode { get; set; }
       
     }
-
-
+  
     public class EvaluationClient : EvaluationMain
     {
         /// <summary>
@@ -146,14 +151,72 @@ namespace IES.ExamServer.Models
     public class SubjectExam
     {
         public string? examId { get; set; }
+        public string? examName { get; set; }
         public string? subjectId { get; set; }
         public string? subjectName { get; set; }
         public List<SubjectExamPaper> papers { get; set; } = new List<SubjectExamPaper>();
     }
+    /// <summary>
+    /// 扩展活动
+    /// </summary>
+    public class ExtendActivity
+    {
+        public string? activityId { get; set; }
+        public string? activityName { get; set; }
+        /// <summary>
+        /// 投票评选Vote,问卷调查Survey
+        /// </summary>
+        public string? type { get; set; }
+        public List<SubjectExamPaper> papers { get; set; } = new List<SubjectExamPaper>();
+    }
+    /// <summary>
+    /// AI音乐评测
+    /// </summary>
+    public class AIMusic
+    {
+        /// <summary>
+        /// 关联的评测
+        /// </summary>
+        public string? examId { get; set; }
+        /// <summary>
+        /// 关联的区级评测id
+        /// </summary>
+        public string? pid {  get; set; }
+        /// <summary>
+        /// 评测名称
+        /// </summary>
+        public string? examName { get; set; }
+        /// <summary>
+        /// AI 音乐评测题目id
+        /// </summary>
+        public string? questionId {  get; set; }
+        /// <summary>
+        /// AI 音乐评测题目名称
+        /// </summary>
+        public string? questionName {  get; set; }
+        /// <summary>
+        /// 必唱歌曲
+        /// </summary>
+        public List<AISong> mustSong {  get; set; }= new List<AISong>();
+        /// <summary>
+        /// 选唱歌曲
+        /// </summary>
+        public List<AISong> optionSong { get; set; } = new List<AISong>();
+    }
 
+    public class AISong 
+    {
+        /// <summary>
+        /// 歌曲id
+        /// </summary>
+        public string? songId { get; set; }
+        /// <summary>
+        /// 歌曲名称
+        /// </summary>
+        public string? songName { get; set; }
+    }
     public class EvaluationExam 
     {
-
         /// <summary>
         /// 评测的id
         /// </summary>
@@ -180,11 +243,14 @@ namespace IES.ExamServer.Models
         /// </summary>
         public List<string> classes { get; set; } = new List<string>();
         public string? owner { get; set; }
-      
         
         public string? scope {  get; set; }
         public long stime { get; set; }
         public long etime { get; set; }
+        /// <summary>
+        /// 评测类型Exam,投票评选Vote,问卷调查Survey
+        /// </summary>
+        public string? type { get; set; }
     }
     public class SubjectExamPaper
     {

+ 55 - 9
TEAMModelOS.SDK/Models/Service/EvaluationSyncInfoService.cs

@@ -33,7 +33,7 @@ namespace TEAMModelOS.SDK.Models.Service
         /// <returns></returns>
         public static async Task<(EvaluationSyncInfo evaluation, bool change,string newGrouplistHash, List<RMember> members, List<RGroupList> groupLists)> CheckEvaluationGroupList(EvaluationSyncInfo evaluationSyncInfo, CoreAPIHttpService _coreAPIHttpService, AzureCosmosFactory _azureCosmos, DingDing _dingDing)
         {
-            var listInfo = await GroupListService.GetMemberByListids(_coreAPIHttpService, _azureCosmos.GetCosmosClient(), _dingDing, evaluationSyncInfo.grouplist, evaluationSyncInfo.owner);
+            var listInfo = await GroupListService.GetMemberByListids(_coreAPIHttpService, _azureCosmos.GetCosmosClient(), _dingDing, evaluationSyncInfo.grouplist, evaluationSyncInfo.ownerId);
             //计算数据的hash值
             StringBuilder groupListData = new StringBuilder();
             //名单的hash值
@@ -163,6 +163,7 @@ namespace TEAMModelOS.SDK.Models.Service
                             evaluationSyncInfo.subjects = exam.subjects?.Select(x=>new IES.ExamServer.Models.SubjectExam { subjectId=x.id,subjectName=x.name,examId=id}).ToList();
                             evaluationSyncInfo.dataTime= DateTimeOffset.Now.ToUnixTimeMilliseconds();
                             evaluationSyncInfo.scode=exam.code;
+                            evaluationSyncInfo.owner=exam.owner;
                             stime=exam.startTime;
                             etime=exam.endTime;
                             HashSet<string> grouplist = new HashSet<string>();
@@ -223,6 +224,7 @@ namespace TEAMModelOS.SDK.Models.Service
                             evaluationSyncInfo.pid= art.pId;
                             evaluationSyncInfo.scode=art.code;
                             evaluationSyncInfo.dataTime = DateTimeOffset.Now.ToUnixTimeMilliseconds();
+                            evaluationSyncInfo.owner=art.owner;
                             HashSet<string> grouplist = new HashSet<string>();
                             if (art.classes.IsNotEmpty())
                             {
@@ -241,8 +243,8 @@ namespace TEAMModelOS.SDK.Models.Service
                             dataTime= art._ts*1000;
                             stime=art.startTime;
                             etime=art.endTime;
-                            var quota_22 = art.settings.Find(x => x.id.Equals("quota_21"));
-                            foreach (var item in quota_22.task) 
+                            var quota_21 = art.settings.Find(x => x.id.Equals("quota_21"));
+                            foreach (var item in quota_21.task) 
                             {
                                 if (!string.IsNullOrWhiteSpace(item.acId)) 
                                 {
@@ -287,6 +289,43 @@ namespace TEAMModelOS.SDK.Models.Service
                                     }
                                 }
                             }
+                            var quota_22 = art.settings.Find(x => x.id.Equals("quota_22"));
+                            if (quota_22!=null) 
+                            {
+                                foreach (var item in quota_22.task) 
+                                {
+                                    //获取基本技能(智音音乐曲目)
+                                    if (item.subject.Equals("subject_music"))
+                                    {
+                                        string AIMuiscId = string.Empty;
+                                        if (!string.IsNullOrWhiteSpace(art.pId))
+                                        {
+                                            AIMuiscId=art.pId;
+                                        }
+                                        else {
+                                            AIMuiscId=art.id;
+                                        }
+                                        var artMusicResponse = await azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(AIMuiscId, new PartitionKey("ArtMusic"));
+                                        if (artMusicResponse.IsSuccessStatusCode) 
+                                        {
+                                            ArtMusic artMusic = JsonDocument.Parse(artMusicResponse.Content).RootElement.Deserialize<ArtMusic>() ;
+                                            if (artMusic!=null)
+                                            {
+                                                evaluationSyncInfo.music= new AIMusic()
+                                                {
+                                                  examId= art.id,
+                                                  examName= art.name,
+                                                  pid=art.pId,
+                                                  questionId=artMusic.questionId,
+                                                  questionName=artMusic.questionName,
+                                                  mustSong=artMusic.mustSong?.Select(x=>new AISong { songId=x.songId,songName=x.songName}).ToList(),
+                                                  optionSong=artMusic.optionSong?.Select(x => new AISong { songId=x.songId, songName=x.songName }).ToList(),
+                                                };
+                                            }
+                                        }
+                                    }
+                                }
+                            }
                         }
                     }
                     break;
@@ -313,6 +352,7 @@ namespace TEAMModelOS.SDK.Models.Service
                     var evaluationExam =  evaluationExams.FindAll(x => x.subjectId.Equals(subject.subjectId)).FirstOrDefault();
                     foreach (var paper in subject.papers)
                     {
+                        EvaluationPaper evaluationPaper = null;
                         List<BlobHashInfo> blobs = new List<BlobHashInfo>();
                         try
                         {
@@ -334,7 +374,7 @@ namespace TEAMModelOS.SDK.Models.Service
                                     size = size.HasValue ? size.Value : 0
                                 });
                             };
-                            var evaluationPaper=  evaluationExam.papers.Find(x => x.paperId.Equals(paper.paperId));
+                            evaluationPaper =  evaluationExam.papers.Find(x => x.paperId.Equals(paper.paperId));
                             evaluationPaper.blobs=blobs;
                         }
                         catch
@@ -350,7 +390,9 @@ namespace TEAMModelOS.SDK.Models.Service
                             var order = blobs.OrderBy(x => $"{x.path}-{x.hash}-{x.size}-{x.last}");
                             string blobStr = string.Join(",", order.Select(x=> $"{x.path}-{x.hash}-{x.size}-{x.last}"));
                             // 计算hash,校准路径,文件hash,文件大小,最后修改时间
-                            paper.paperHash= ShaHashHelper.GetSHA1(blobStr);
+                            string paperHash = ShaHashHelper.GetSHA1(blobStr);
+                            paper.paperHash= paperHash;
+                            evaluationPaper.paperHash= paperHash;
                         }
                          
                     }
@@ -393,10 +435,13 @@ namespace TEAMModelOS.SDK.Models.Service
                     dataStr.Append(evaluationSyncInfo.shortCode);
                     dataStr.Append($"{stime}{etime}");
                     dataStr.Append(string.Join("", order.Select(x=>x.subjectId)));
+                    if (evaluationSyncInfo.music!=null)
+                    {
+                        dataStr.Append($"{evaluationSyncInfo.music.questionId}{string.Join("", evaluationSyncInfo.music.mustSong?.Select(x=>x.songId))}{string.Join("",evaluationSyncInfo.music.optionSong?.Select(x=>x.songId))}");
+                    }
                     //计算dataHash
                     evaluationSyncInfo.dataHash = ShaHashHelper.GetSHA1(dataStr.ToString());
                 }
-
                 evaluationClient= new EvaluationClient
                 {
                     id = evaluationSyncInfo.id,
@@ -429,6 +474,7 @@ namespace TEAMModelOS.SDK.Models.Service
                     ownerId = evaluationSyncInfo.ownerId,
                     ownerPicture =evaluationSyncInfo.ownerPicture,
                     ownerName = evaluationSyncInfo.ownerName,
+                    music = evaluationSyncInfo.music,
                     //password = evaluationSyncInfo.password,
                     //recordUrl = evaluationSyncInfo.recordUrl
                 };
@@ -455,9 +501,9 @@ namespace TEAMModelOS.SDK.Models.Service
                 string evaluationSyncInfoSJson = evaluationSyncInfo.ToJsonString();
                 dataSize+= Encoding.UTF8.GetByteCount(evaluationSyncInfoSJson);
                 evaluationClient.dataSize = dataSize;
-                await azureStorage.GetBlobContainerClient(ownerId).UploadFileByContainer(sourceJson, $"package/{id}/exam", "source.json");
-                await azureStorage.GetBlobContainerClient(ownerId).UploadFileByContainer(groupListJson, $"package/{id}/exam", "grouplist.json");
-                await azureStorage.GetBlobContainerClient(ownerId).UploadFileByContainer(new { evaluationClient, evaluationExams }.ToJsonString(), $"package/{id}/exam", "evaluation.json");
+                await azureStorage.GetBlobContainerClient(ownerId).UploadFileByContainer(sourceJson, $"package/exam/{id}", "source.json");
+                await azureStorage.GetBlobContainerClient(ownerId).UploadFileByContainer(groupListJson, $"package/exam/{id}", "grouplist.json");
+                await azureStorage.GetBlobContainerClient(ownerId).UploadFileByContainer(new { evaluationClient, evaluationExams }.ToJsonString(), $"package/exam/{id}", "evaluation.json");
                 evaluationSyncInfo.dataSize = dataSize;
               
                 await azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync<EvaluationSyncInfo>(evaluationSyncInfo, new PartitionKey("EvaluationSyncInfo"));

+ 3 - 3
TEAMModelOS/Controllers/Both/EvaluationSyncInfoController.cs

@@ -130,7 +130,7 @@ namespace TEAMModelOS.Controllers.Both
             EvaluationClient evaluationClient = null;
             try 
             {
-                BlobDownloadResult downloadResult = await _azureStorage.GetBlobContainerClient(evaluationSyncInfo.ownerId).GetBlobClient($"exam/{evaluationSyncInfo.id}/package/evaluation.json").DownloadContentAsync();
+                BlobDownloadResult downloadResult = await _azureStorage.GetBlobContainerClient(evaluationSyncInfo.ownerId).GetBlobClient($"package/exam/{evaluationSyncInfo.id}/evaluation.json").DownloadContentAsync();
                 var evaluationData = JsonDocument.Parse(downloadResult.Content).RootElement;
                  evaluationClient= evaluationData.GetProperty("evaluationClient").ToObject<EvaluationClient>();
                 List<EvaluationExam> evaluationExams = evaluationData.GetProperty("evaluationExams").ToObject<List<EvaluationExam>>();
@@ -151,7 +151,7 @@ namespace TEAMModelOS.Controllers.Both
                     evaluationClient.grouplistHash=listInfo.newGrouplistHash;
                     evaluationClient.studentCount=evaluationSyncInfo.studentCount;
                     evaluationClient.grouplist=evaluationSyncInfo.grouplist;
-                    await _azureStorage.GetBlobContainerClient(evaluationClient.ownerId).UploadFileByContainer(new { evaluationClient, evaluationExams }.ToJsonString(), $"exam/{evaluationClient.id}/package", "evaluation.json");
+                    await _azureStorage.GetBlobContainerClient(evaluationClient.ownerId).UploadFileByContainer(new { evaluationClient, evaluationExams }.ToJsonString(), $"package/exam/{evaluationClient.id}", "evaluation.json");
                 }
                 else {
                     if (!evaluationClient.grouplistHash.Equals(evaluationSyncInfo.grouplistHash))
@@ -174,7 +174,7 @@ namespace TEAMModelOS.Controllers.Both
                 }
                 else 
                 {
-                    BlobDownloadResult downloadResult = await _azureStorage.GetBlobContainerClient(evaluationSyncInfo.ownerId).GetBlobClient($"exam/{evaluationSyncInfo.id}/package/grouplist.json").DownloadContentAsync();
+                    BlobDownloadResult downloadResult = await _azureStorage.GetBlobContainerClient(evaluationSyncInfo.ownerId).GetBlobClient($"package/exam/{evaluationSyncInfo.id}/grouplist.json").DownloadContentAsync();
                     var grouplistJson = JsonDocument.Parse(downloadResult.Content).RootElement;
                     var groupList = grouplistJson.GetProperty("groupList").ToObject<List<RGroupList>>();
                     StringBuilder groupListData = new StringBuilder();

+ 4 - 0
TEAMModelOS/Controllers/Client/HiTAControlller.cs

@@ -380,7 +380,11 @@ namespace TEAMModelOS.Controllers.Client
                     //await _dingDing.SendBotMsg(join.ToJsonString(), GroupNames.成都开发測試群組);
                      idd = jwt.Payload.Sub;
                 }
+#if DEBUG 
+                await _azureRedis.GetRedisClient(8).StringSetAsync($"HiTA:Login:{join.code}", idd,expiry: new  TimeSpan(0,5,30));
+#else
                 await _azureRedis.GetRedisClient(8).StringSetAsync($"HiTA:Login:{join.code}", idd,expiry: new  TimeSpan(0,0,30));
+#endif
                 return Ok(new { name= ",关闭弹窗以获取登录信息" ,school="tmd"});
             }
             await _dingDing.SendBotMsg(join.ToJsonString()+ dict.ToJsonString(), GroupNames.成都开发測試群組);