CrazyIter_Bin 1 ano atrás
pai
commit
a93d133f5e

+ 5 - 5
TEAMModelOS.FunctionV4/TimeTrigger/IESTimerTrigger.cs

@@ -71,7 +71,7 @@ namespace TEAMModelOS.FunctionV4.TimeTrigger
             try
             try
             {
             {
                 string location = Environment.GetEnvironmentVariable("Option:Location");
                 string location = Environment.GetEnvironmentVariable("Option:Location");
-                var datetime = DateTimeOffset.UtcNow.AddHours(-1);
+                var datetime = DateTimeOffset.Now.AddHours(-1);
                 var y = datetime.Year;
                 var y = datetime.Year;
                 var m = datetime.Month >= 10 ? $"{datetime.Month}" : $"0{datetime.Month}";
                 var m = datetime.Month >= 10 ? $"{datetime.Month}" : $"0{datetime.Month}";
                 var d = datetime.Day >= 10 ? $"{datetime.Day}" : $"0{datetime.Day}";
                 var d = datetime.Day >= 10 ? $"{datetime.Day}" : $"0{datetime.Day}";
@@ -89,8 +89,8 @@ namespace TEAMModelOS.FunctionV4.TimeTrigger
                     if (retn.recCnts.IsNotEmpty())
                     if (retn.recCnts.IsNotEmpty())
                     {
                     {
                         //https://teammodelos.blob.core.chinacloudapi.cn/0-public/pie-borderRadius.html
                         //https://teammodelos.blob.core.chinacloudapi.cn/0-public/pie-borderRadius.html
-                        string publishUrl = $"https://teammodelos.blob.core.chinacloudapi.cn/0-public/api-count.html?url={HttpUtility.UrlEncode(retn.saveUrls.First(), Encoding.UTF8)}&time={HttpUtility.UrlEncode(datetime.AddHours(8).ToString("yyyy年MM月dd日 HH时"), Encoding.UTF8)}";
-                        string ulrs = $"https://teammodelos.blob.core.chinacloudapi.cn/0-public/api-count.html?url={retn.saveUrls.First()}&time={datetime.AddHours(8).ToString("yyyy年MM月dd日 HH时")}";
+                        string publishUrl = $"https://teammodelos.blob.core.chinacloudapi.cn/0-public/api-count.html?url={HttpUtility.UrlEncode(retn.saveUrls.First(), Encoding.UTF8)}&time={HttpUtility.UrlEncode(datetime.ToString("yyyy年MM月dd日 HH时"), Encoding.UTF8)}";
+                        string ulrs = $"https://teammodelos.blob.core.chinacloudapi.cn/0-public/api-count.html?url={retn.saveUrls.First()}&time={datetime.ToString("yyyy年MM月dd日 HH时")}";
                         string ulr = $"http://cdhabook.teammodel.cn:8805/screen/screenshot-png?width=1920&height=1450&url={HttpUtility.UrlEncode(ulrs, Encoding.UTF8)}&delay=5000";
                         string ulr = $"http://cdhabook.teammodel.cn:8805/screen/screenshot-png?width=1920&height=1450&url={HttpUtility.UrlEncode(ulrs, Encoding.UTF8)}&delay=5000";
                         string image = "";
                         string image = "";
                         try
                         try
@@ -111,7 +111,7 @@ namespace TEAMModelOS.FunctionV4.TimeTrigger
                         {
                         {
 
 
                         }
                         }
-                        await _dingDing.SendBotMarkdown("防火墙日志记录", $"#### 防火墙日志记录(小时)\n> 记录时间:{datetime.AddHours(8).ToString("yyyy-MM-dd HH")}\n> ![screenshot]({image})\n> ###### 发布时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}" +
+                        await _dingDing.SendBotMarkdown("防火墙日志记录", $"#### 防火墙日志记录(小时)\n> 记录时间:{datetime.ToString("yyyy-MM-dd HH")}\n> ![screenshot]({image})\n> ###### 发布时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}" +
                             $" [发布地址]({publishUrl}) \n", GroupNames.醍摩豆服務運維群組);
                             $" [发布地址]({publishUrl}) \n", GroupNames.醍摩豆服務運維群組);
                     }
                     }
 
 
@@ -148,7 +148,7 @@ namespace TEAMModelOS.FunctionV4.TimeTrigger
                                 }
                                 }
                             }
                             }
                             catch (Exception ex) { }
                             catch (Exception ex) { }
-                            await _dingDing.SendBotMarkdown("防火墙日志记录", $"#### 防火墙日志记录(天)\n> 记录时间:{pastTime.AddHours(8).ToString("yyyy-MM-dd")}\n> ![screenshot]({dayImage})\n> ###### 发布时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}" +
+                            await _dingDing.SendBotMarkdown("防火墙日志记录", $"#### 防火墙日志记录(天)\n> 记录时间:{pastTime.ToString("yyyy-MM-dd")}\n> ![screenshot]({dayImage})\n> ###### 发布时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}" +
                             $" [发布地址]({dayPublishUrl}) \n", GroupNames.醍摩豆服務運維群組);
                             $" [发布地址]({dayPublishUrl}) \n", GroupNames.醍摩豆服務運維群組);
                         }
                         }
                     }
                     }

+ 13 - 3
TEAMModelOS.SDK/Models/Cosmos/Common/Activity.cs

@@ -485,7 +485,15 @@ namespace TEAMModelOS.SDK.Models
         /// </summary>
         /// </summary>
         public string type { get; set; }
         public string type { get; set; }
 
 
-        public  HashSet<string> uploadType { get; set; }
+        public  HashSet<string> uploadType { get; set; }= new HashSet<string>();
+        /// <summary>
+        /// 必须上传的类型
+        /// </summary>
+        public HashSet<string> uploadTypeNecessary { get; set; } = new HashSet<string>();
+        /// <summary>
+        /// 上传类型数量限制0 不限制。1 限制任意一种, 当uploadType.count==limit,则表示 所有类型都需要上传。 即 当uploadType[ file,sokrates,lesson],limit==3  则所有类型均要上传。
+        /// </summary>
+        public int limit { get; set; } 
         /// <summary>
         /// <summary>
         /// ["file"], 提交作品的格式
         /// ["file"], 提交作品的格式
         /// </summary>
         /// </summary>
@@ -614,6 +622,7 @@ namespace TEAMModelOS.SDK.Models
         /// </summary>
         /// </summary>
         public int contestUpload { get; set; }
         public int contestUpload { get; set; }
         public string uploadType { get; set; }
         public string uploadType { get; set; }
+        public HashSet<string> uploadTypes { get; set; } = new HashSet<string>();
         public long uploadTime { get; set; } = -1;
         public long uploadTime { get; set; } = -1;
     }
     }
 
 
@@ -754,7 +763,6 @@ namespace TEAMModelOS.SDK.Models
         /// file  sokrates,lesson
         /// file  sokrates,lesson
         /// </summary>
         /// </summary>
         public string type { get; set; }
         public string type { get; set; }
-        public HashSet<string> uploadType { get; set; }= new HashSet<string>();
         public string schoolId { get; set; }
         public string schoolId { get; set; }
         public string schoolName { get; set; }
         public string schoolName { get; set; }
         public string schoolPicture { get; set; }
         public string schoolPicture { get; set; }
@@ -914,6 +922,8 @@ namespace TEAMModelOS.SDK.Models
         /// null没有上传模块的默认状态,file文件  sokrates 苏格拉底
         /// null没有上传模块的默认状态,file文件  sokrates 苏格拉底
         /// </summary>
         /// </summary>
         public string uploadContestType { get; set; }
         public string uploadContestType { get; set; }
+
+        public HashSet<string> uploadContestTypes { get; set; } = new HashSet<string>();
         /// <summary>
         /// <summary>
         /// 作品分数
         /// 作品分数
         /// </summary>
         /// </summary>
@@ -973,7 +983,7 @@ namespace TEAMModelOS.SDK.Models
         /// <summary>
         /// <summary>
         /// sokrates 苏格拉底 ,file 作品
         /// sokrates 苏格拉底 ,file 作品
         /// </summary>
         /// </summary>
-        public List<string> uploadTypes { get; set; } = new List<string>();
+        public HashSet<string> uploadTypes { get; set; } = new HashSet<string>();
         /// <summary>
         /// <summary>
         /// 上传文件和苏格拉底链接的数量
         /// 上传文件和苏格拉底链接的数量
         /// </summary>
         /// </summary>

+ 24 - 2
TEAMModelOS.SDK/Models/Service/Common/ActivityService.cs

@@ -291,6 +291,11 @@ namespace TEAMModelOS.SDK
                         {
                         {
                             count += leader.upload.lessons.Count;
                             count += leader.upload.lessons.Count;
                         }
                         }
+
+                        if (leader?.upload!=null  && leader.upload.complexes.IsNotEmpty()) 
+                        {
+                            count+=leader.upload.complexes.Count();
+                        }
                         if (count <= 0)
                         if (count <= 0)
                         {
                         {
                             uploadId = enroll.contest.cipher;
                             uploadId = enroll.contest.cipher;
@@ -314,7 +319,8 @@ namespace TEAMModelOS.SDK
                         {
                         {
                             uploadId = leader.upload?.uploadId,
                             uploadId = leader.upload?.uploadId,
                             name = $"{leader.schoolName}-{name}",
                             name = $"{leader.schoolName}-{name}",
-                            uploadTypes = new List<string> { leader?.upload.type },
+                           // uploadTypes = new List<string> { leader?.upload.type },
+                            uploadTypes =leader.upload!=null ? new HashSet<string>() { leader.upload.type } : leader.upload.uploadType,
                             count = count,
                             count = count,
                             cipher = leader.contest?.cipher,
                             cipher = leader.contest?.cipher,
                             type = 1,
                             type = 1,
@@ -378,6 +384,10 @@ namespace TEAMModelOS.SDK
                         {
                         {
                             count += enroll.upload.lessons.Count;
                             count += enroll.upload.lessons.Count;
                         }
                         }
+                        if (enroll.upload != null  && enroll.upload.complexes.IsNotEmpty())
+                        {
+                            count+=enroll.upload.complexes.Count();
+                        }
                         if (count <= 0)
                         if (count <= 0)
                         {
                         {
                             available = 5;
                             available = 5;
@@ -401,7 +411,8 @@ namespace TEAMModelOS.SDK
                         {
                         {
                             uploadId = uploadId,
                             uploadId = uploadId,
                             name = $"{enroll.schoolName}-{name}",
                             name = $"{enroll.schoolName}-{name}",
-                            uploadTypes = new List<string> { enroll.upload?.type },
+                            //uploadTypes = new List<string> { enroll.upload?.type },
+                            uploadTypes =enroll.upload!=null ? new HashSet<string>() { enroll.upload.type } :enroll.upload.uploadType,
                             count = count,
                             count = count,
                             cipher = enroll.contest?.cipher,
                             cipher = enroll.contest?.cipher,
                             type = 1,
                             type = 1,
@@ -855,12 +866,23 @@ namespace TEAMModelOS.SDK
                             activityDto.contestType=enroll.contest.type;
                             activityDto.contestType=enroll.contest.type;
 
 
                         }
                         }
+
+
                         if (enroll.upload!=null  && (enroll.upload.files.IsNotEmpty()  ||  enroll.upload.sokrates.IsNotEmpty() ||  enroll.upload.lessons.IsNotEmpty())  )
                         if (enroll.upload!=null  && (enroll.upload.files.IsNotEmpty()  ||  enroll.upload.sokrates.IsNotEmpty() ||  enroll.upload.lessons.IsNotEmpty())  )
                         {
                         {
                             activityDto.contestUpload=1;
                             activityDto.contestUpload=1;
                             activityDto.uploadTime=enroll.upload.uploadTime;
                             activityDto.uploadTime=enroll.upload.uploadTime;
                             activityDto.uploadType=enroll.upload.type;
                             activityDto.uploadType=enroll.upload.type;
                         }
                         }
+
+
+
+                        if (enroll.upload!=null  &&enroll.upload.complexes.IsNotEmpty())
+                        {
+                            activityDto.contestUpload=1;
+                            activityDto.uploadTime=enroll.upload.uploadTime;
+                            activityDto.uploadTypes=enroll.upload.uploadType;
+                        }
                     }
                     }
                 }
                 }
             }
             }

+ 112 - 2
TEAMModelOS/Controllers/Common/ActivityController.cs

@@ -1342,6 +1342,7 @@ namespace TEAMModelOS.Controllers
                                     {
                                     {
                                         inviteEnrollTeacher.uploadContestId=activityEnroll.upload.uploadId;
                                         inviteEnrollTeacher.uploadContestId=activityEnroll.upload.uploadId;
                                         inviteEnrollTeacher.uploadContestType=activityEnroll.upload.type;
                                         inviteEnrollTeacher.uploadContestType=activityEnroll.upload.type;
+                                        inviteEnrollTeacher.uploadContestTypes= activityEnroll.upload.uploadType;
                                         inviteEnrollTeacher.uploadContestStatus=1;
                                         inviteEnrollTeacher.uploadContestStatus=1;
                                         inviteEnrollTeacher.uploadContestTime= activityEnroll.upload.uploadTime;
                                         inviteEnrollTeacher.uploadContestTime= activityEnroll.upload.uploadTime;
                                         inviteEnrollTeacher.uploadContestScore=activityEnroll.upload.score;
                                         inviteEnrollTeacher.uploadContestScore=activityEnroll.upload.score;
@@ -2205,11 +2206,17 @@ namespace TEAMModelOS.Controllers
                                         {
                                         {
                                             count += leader.upload.lessons.Count;
                                             count += leader.upload.lessons.Count;
                                         }
                                         }
+
+                                        if (leader?.upload!=null  && leader.upload.complexes.IsNotEmpty())
+                                        {
+                                            count+= leader.upload.complexes.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();
                                         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 period = leader?.contest?.enrollInfos?.Find(z => z.code.Equals("period"));
                                         var subject = leader?.contest?.enrollInfos?.Find(z => z.code.Equals("subject"));
                                         var subject = leader?.contest?.enrollInfos?.Find(z => z.code.Equals("subject"));
                                         contestTask.name= $"{leader?.schoolName}-{name}";
                                         contestTask.name= $"{leader?.schoolName}-{name}";
-                                        contestTask.uploadTypes=new List<string> { leader.upload?.type };
+                                        //contestTask.uploadTypes=new List<string> { leader.upload?.type };
+                                        contestTask.uploadTypes =leader.upload!=null ? new HashSet<string>() { leader.upload.type } : leader.upload.uploadType;
                                         contestTask.count=count;
                                         contestTask.count=count;
                                         contestTask.cipher=leader.contest?.cipher;
                                         contestTask.cipher=leader.contest?.cipher;
                                         contestTask.type=leader.contest.type;
                                         contestTask.type=leader.contest.type;
@@ -2244,7 +2251,7 @@ namespace TEAMModelOS.Controllers
                                     var period = leader?.contest?.enrollInfos?.Find(z => z.code.Equals("period"));
                                     var period = leader?.contest?.enrollInfos?.Find(z => z.code.Equals("period"));
                                     var subject = leader?.contest?.enrollInfos?.Find(z => z.code.Equals("subject"));
                                     var subject = leader?.contest?.enrollInfos?.Find(z => z.code.Equals("subject"));
                                     contestTask.name= $"{leader?.schoolName}-{name}";
                                     contestTask.name= $"{leader?.schoolName}-{name}";
-                                    contestTask.uploadTypes=new List<string> { leader.upload?.type };
+                                    contestTask.uploadTypes=leader.upload!=null ? new HashSet<string>() { leader.upload.type } : leader.upload.uploadType;
                                     contestTask.count=count;
                                     contestTask.count=count;
                                     contestTask.type=leader.contest.type;
                                     contestTask.type=leader.contest.type;
                                     contestTask.tmdid=leader.id;
                                     contestTask.tmdid=leader.id;
@@ -4081,6 +4088,109 @@ namespace TEAMModelOS.Controllers
                                         }
                                         }
                                         if (check==1)
                                         if (check==1)
                                         {
                                         {
+                                            if (uploadContest.complexes.IsNotEmpty())
+                                            {
+                                                if (contest.upload.limit>0)
+                                                {
+                                                    if (contest.upload.limit<contest.upload.uploadType.Count())
+                                                    {
+                                                        ///上传类型数量限制小于文件类型数量,表示可以上传任意N种类型的文件。
+                                                        if (uploadContest.complexes.Count>=contest.upload.limit  && uploadContest.complexes.Count<= contest.upload.uploadType.Count())
+                                                        {
+                                                            var types = uploadContest.complexes.Select(x => x.type).ToHashSet();
+                                                            foreach (var type in types)
+                                                            {
+                                                                if (!contest.upload.uploadType.Contains(type))
+                                                                {
+                                                                    return Ok(new { code = 7, msg = "上传的文件类型与活动要求的文件类型不符!" });
+                                                                }
+                                                            }
+                                                        }
+                                                        else
+                                                        {
+                                                            return Ok(new { code = 10, msg = "文件上传数量不满足活动要求上传的文件类型数量!" });
+                                                        }
+                                                    }
+                                                    else
+                                                    {
+                                                        ///上传类型数量限制大于等于则表示需要上传所有类型的文件。
+                                                        if (uploadContest.complexes.Count== contest.upload.uploadType.Count())
+                                                        {
+                                                            var types = uploadContest.complexes.Select(x => x.type).ToHashSet();
+                                                            bool hasError = false;
+                                                            foreach (var type in contest.upload.uploadType)
+                                                            {
+                                                                if (!contest.upload.uploadType.Contains(type))
+                                                                {
+                                                                    hasError=true;
+                                                                }
+                                                            }
+                                                            if (hasError)
+                                                            {
+                                                                return Ok(new { code = 7, msg = "上传的文件类型与活动要求的文件类型不符!" });
+                                                            }
+                                                        }
+                                                        else
+                                                        {
+                                                            return Ok(new { code = 10, msg = "文件上传数量不满足活动要求上传的文件类型数量!" });
+                                                        }
+                                                    }
+                                                }
+                                                else
+                                                {
+                                                    ///在上传类型范围内,不限制上传文件的种类和类型的数量。
+                                                    var types = uploadContest.complexes.Select(x => x.type).ToHashSet();
+                                                    foreach (var type in types)
+                                                    {
+                                                        if (!contest.upload.uploadType.Contains(type))
+                                                        {
+                                                            return Ok(new { code = 7, msg = "上传的文件类型与活动要求的文件类型不符!" });
+                                                        }
+                                                    }
+                                                }
+                                                ///检查必须上传的类型
+                                                if (contest.upload.uploadTypeNecessary!=null  && contest.upload.uploadTypeNecessary.Count>0)
+                                                {
+
+                                                    var types = uploadContest.complexes.Select(x => x.type).ToHashSet();
+                                                    foreach (var type in contest.upload.uploadTypeNecessary)
+                                                    {
+                                                        if (!types.Contains(type))
+                                                        {
+                                                            return Ok(new { code = 9, msg = "没有上传活动要求必须上传的文件类型!" });
+
+                                                        }
+                                                    }
+                                                }
+                                                //覆盖更新
+                                                enroll.upload= new EnrollUpload
+                                                {
+                                                    uploadTime=now,
+                                                    complexes=uploadContest.complexes,
+                                                    uploadType=uploadContest.complexes.Select(x=>x.type).ToHashSet(),
+                                                    uploadId=Guid.NewGuid().ToString(),
+                                                    name=uploadContest.name,
+                                                };
+                                                await client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(enroll, new PartitionKey($"ActivityEnroll-{_activityId.GetString()}"));
+                                                if (captainUpload==1&& !string.IsNullOrWhiteSpace(enroll.contest.cipher))
+                                                {
+                                                    //获取队员报名信息
+                                                    string cipherSQL = $"select value  c  from c where c.contest!=null  and c.activityId='{_activityId.GetString()}' and c.contest.type=1 and  c.contest.cipher='{enroll.contest.cipher}' ";
+                                                    var cipherResult = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityEnroll>(cipherSQL, $"ActivityEnroll-{_activityId}");
+                                                    //队长统一上传
+                                                    cipherResult.list.RemoveAll(z => z.contest.leader==1);
+                                                    foreach (var z in cipherResult.list)
+                                                    {
+                                                        z.upload=enroll.upload;
+                                                        //队长统一上传的作品不需要单独生成作品id.
+                                                        // z.upload.uploadId=Guid.NewGuid().ToString();
+                                                        await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(z, new PartitionKey(z.code));
+                                                    }
+                                                }
+                                                return Ok(new { code = 200, });
+                                            }
+                                           
+
                                             if (contest.upload.type.Equals(uploadContest.type))
                                             if (contest.upload.type.Equals(uploadContest.type))
                                             {
                                             {
                                                 if (uploadContest.type.Equals("sokrates"))
                                                 if (uploadContest.type.Equals("sokrates"))