浏览代码

Merge branch 'PL/develop-IES5' into develop

Li 2 年之前
父节点
当前提交
0b5d19ffda

+ 28 - 4
TEAMModelBI/Controllers/BITest/TestController.cs

@@ -54,6 +54,7 @@ using Azure.Storage.Blobs.Specialized;
 using System.Web;
 using Azure.Storage.Sas;
 using DocumentFormat.OpenXml.Drawing.Diagrams;
+using DocumentFormat.OpenXml.Bibliography;
 
 namespace TEAMModelBI.Controllers.BITest
 {
@@ -164,7 +165,7 @@ namespace TEAMModelBI.Controllers.BITest
         /// <param name="jsonElement"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
-        [AuthToken(Roles = "assist,admin")]
+        //[AuthToken(Roles = "assist,admin")]
         [HttpPost("set-savebilog")]
         public async Task<IActionResult> SetTestSaveBIlog(JsonElement jsonElement)
         {
@@ -184,10 +185,33 @@ namespace TEAMModelBI.Controllers.BITest
             //    redisClinet = _azureRedis.GetRedisClient(dbnum: 8, name: BIConst.Global);
             //}
 
-            var (_tmdId, _tmdName, pic, did, dname, dpic) = HttpJwtAnalysis.JwtXAuthBI(HttpContext.GetXAuth("AuthToken"), _option);
-            await _azureStorage.SaveLog(type: "table-save", msg: "测试保存方法01", dingDing: _dingDing, httpContext: HttpContext); //IES5 日志记录
+            var blob = _azureStorage.GetBlobContainerClient(containerName: "hbcn");
+            await foreach (BlobItem blobItem in blob.GetBlobsAsync(BlobTraits.None, BlobStates.None, $"records/{383558646003404800}/IES"))
+            {
+                if (blobItem.Name.EndsWith("base.json") || blobItem.Name.EndsWith("TimeLine.json"))
+                {
+                    BlobClient tempClient = blob.GetBlobClient(blobItem.Name);
+                    if (await tempClient.ExistsAsync())
+                    {
+                        using (var meomoryStream = new MemoryStream())
+                        {
+                            var response = blob.GetBlobClient($"{blobItem.Name}").DownloadTo(meomoryStream);
+                            string setr = Encoding.UTF8.GetString(meomoryStream.ToArray()).ToString();
+
+                            //LessonBase res = Encoding.UTF8.GetString(meomoryStream.ToArray()).ToString().ToObject<LessonBase>();
+
+                            //var response = await blob.GetBlobClient($"{blobItem.Name}").DownloadToAsync(meomoryStream);
+
+                            //RecCnt recCnt = Encoding.UTF8.GetString(meomoryStream.ToArray()).ToString().ToObject<RecCnt>();
+                            //string name = stringSuffix.MidStrEx(blobItem.Name, "/", ".");
+                        }
+                    }
+                }
+            }
+            //var (_tmdId, _tmdName, pic, did, dname, dpic) = HttpJwtAnalysis.JwtXAuthBI(HttpContext.GetXAuth("AuthToken"), _option);
+            //await _azureStorage.SaveLog(type: "table-save", msg: "测试保存方法01", dingDing: _dingDing, httpContext: HttpContext); //IES5 日志记录
 
-            await AzureStorageBlobExtensions.SaveBILog(blobClient, tableClient, "Test-test", $"{msg}", _dingDing, httpContext: HttpContext);//BI 日志记录
+            //await AzureStorageBlobExtensions.SaveBILog(blobClient, tableClient, "Test-test", $"{msg}", _dingDing, httpContext: HttpContext);//BI 日志记录
 
             return Ok(new { state = 200 });
         }

+ 58 - 23
TEAMModelOS.SDK/Context/Attributes/Filter/ApiTokenAttribute.cs

@@ -16,10 +16,12 @@ using TEAMModelOS.SDK.Models.Table;
 using TEAMModelOS.SDK.Models.Cosmos.BI.BINormal;
 using System.Text.Json;
 using HTEXLib.COMM.Helpers;
+using TEAMModelOS.SDK.Models.Cosmos.OpenEntity;
 
 namespace TEAMModelOS.Filter
 {
-    public class LimitPolicy {
+    public class LimitPolicy
+    {
         /// <summary>
         /// 颁发给谁的主体
         /// </summary>
@@ -90,7 +92,7 @@ namespace TEAMModelOS.Filter
             var azureRedis = services.GetService<AzureRedisFactory>();
             var azureStorage = services.GetService<AzureStorageFactory>();
             var azureCosmos = services.GetService<AzureCosmosFactory>();
-            return new InternalAuthTokenFilter(azureCosmos ,  option ,azureRedis,  Auth,   Limit);
+            return new InternalAuthTokenFilter(azureCosmos, option, azureRedis, Auth, Limit);
         }
 
         private class InternalAuthTokenFilter : IResourceFilter
@@ -101,35 +103,36 @@ namespace TEAMModelOS.Filter
             private readonly bool _limit;
             private readonly AzureRedisFactory _azureRedis;
             private readonly AzureCosmosFactory _azureCosmos;
-            public InternalAuthTokenFilter(AzureCosmosFactory azureCosmos,IOptions<Option> option, AzureRedisFactory azureRedis,   string auth, bool limit)
+            public InternalAuthTokenFilter(AzureCosmosFactory azureCosmos, IOptions<Option> option, AzureRedisFactory azureRedis, string auth, bool limit)
             {
                 _option = option.Value;
                 _auth = auth;
                 _limit = limit;
                 _azureRedis = azureRedis;
-                _azureCosmos=azureCosmos;
+                _azureCosmos = azureCosmos;
             }
-            public void OnResourceExecuting(ResourceExecutingContext context)
+            public async void OnResourceExecuting(ResourceExecutingContext context)
             {
-                var path =   context.HttpContext.Request.Path;
+                var path = context.HttpContext.Request.Path;
                 string[] paths = path.ToString().Split("/");
                 string scope = "";
-                if (paths.Any()) 
+                if (paths.Any())
                 {
                     if (paths[0].Equals("") && paths.Length > 1)
                     {
                         scope = paths[1];
                     }
-                    else {
+                    else
+                    {
                         scope = paths[0];
                     }
                 }
                 string msg = "";
                 int code = 0;
-                if (scope.Equals("school") ||scope.Equals("business"))
+                if (scope.Equals("school") || scope.Equals("business"))
                 {
                     string id = string.Empty, school = string.Empty, jti = string.Empty;
-                     
+
                     bool pass = false;
                     var authtoken = context.HttpContext.GetXAuth("ApiToken");
                     if (!string.IsNullOrWhiteSpace(authtoken) && JwtAuthExtension.ValidateApiToken(authtoken, _option.JwtSecretKey))
@@ -148,7 +151,7 @@ namespace TEAMModelOS.Filter
 #if !DEBUG
                                 issuer = keys[0];
 #else
-                                issuer= keys[1];
+                                issuer = keys[1];
 #endif
                             }
                             else if (_option.Location.Equals("China-Test"))
@@ -204,7 +207,8 @@ namespace TEAMModelOS.Filter
                                             code = 401002;
                                         }
                                     }
-                                    else {
+                                    else
+                                    {
                                         msg = "学校编码为空!";
                                         code = 401011;
                                     }
@@ -227,28 +231,55 @@ namespace TEAMModelOS.Filter
                                         //如果访问的接口是 business/get-schools
                                         if (!string.IsNullOrWhiteSpace(XAuthSchool))
                                         {
-                                            var  response = _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Normal").ReadItemStreamAsync(id ,new Azure.Cosmos.PartitionKey("BizConfig")).Result ;
+                                            //访问次数记录 开始
+                                            long udate = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                                            var respon = _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Normal").ReadItemStreamAsync(id, new Azure.Cosmos.PartitionKey("BizVisit")).Result;
+                                            if (respon.Status == 200)
+                                            {
+                                                BizVisitCnt bizVisit = JsonDocument.Parse(respon.Content).Deserialize<BizVisitCnt>();
+                                                bizVisit.visit += 1;
+                                                //var tempApi = bizVisit.apis.Find(f => f.name.Equals($"{path}"));
+                                                //if (tempApi != null)
+                                                //{
+                                                //    tempApi.visit += 1;
+                                                //    tempApi.upDate = udate;
+                                                //}
+                                                //else
+                                                bizVisit.apis.Add(new APIInfo() { name = $"{path}", upDate = udate });//记录加一下
+                                                await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Normal").ReplaceItemAsync<BizVisitCnt>(bizVisit, id, new Azure.Cosmos.PartitionKey("BizVisit"));
+                                            }
+                                            else
+                                            {
+                                                BizVisitCnt bizVisit = new() { id = id, visit = 1, apis = new List<APIInfo>() { new APIInfo() { name = $"{path}", upDate = udate } } };
+                                                await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Normal").CreateItemAsync<BizVisitCnt>(bizVisit, new Azure.Cosmos.PartitionKey("BizVisit"));
+                                            }
+                                            //访问次数记录 结束
+
+                                            var response = _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Normal").ReadItemStreamAsync(id, new Azure.Cosmos.PartitionKey("BizConfig")).Result;
                                             if (response.Status == 200)
                                             {
-                                                BizConfig bizConfig = JsonDocument.Parse(response.Content).Deserialize<BizConfig>() ;
-                                                if (bizConfig.schools.IsNotEmpty()  && bizConfig.schools.Select(z=>z.id).Contains(XAuthSchool))
+                                                BizConfig bizConfig = JsonDocument.Parse(response.Content).Deserialize<BizConfig>();
+                                                if (bizConfig.schools.IsNotEmpty() && bizConfig.schools.Select(z => z.id).Contains(XAuthSchool))
                                                 {
                                                     if (bizConfig.jti.Equals(jti))
                                                     {
                                                         school = XAuthSchool;
                                                         pass = true;
                                                     }
-                                                    else {
+                                                    else
+                                                    {
                                                         msg = "当前Token已经失效!"; code = 401003;
                                                         pass = false;
                                                     }
                                                 }
-                                                else {
+                                                else
+                                                {
                                                     msg = "未开通学校数据访问授权!"; code = 401004;
                                                     pass = false;
                                                 }
                                             }
-                                            else {
+                                            else
+                                            {
                                                 msg = "企业信息不存在!"; code = 401005;
                                                 pass = false;
                                             }
@@ -260,7 +291,8 @@ namespace TEAMModelOS.Filter
                                         }
                                     }
                                 }
-                                else {
+                                else
+                                {
                                     msg = "访问的接口不在学校或第三方业务范围内!"; code = 401007;
                                 }
                                 if (!string.IsNullOrEmpty(id) && !string.IsNullOrEmpty(school) && !string.IsNullOrEmpty(jti))
@@ -272,11 +304,13 @@ namespace TEAMModelOS.Filter
                                 }
                             }
                         }
-                        else {
+                        else
+                        {
                             msg = "token的scope与接口的业务类型不匹配!"; code = 401008;
                         }
                     }
-                    else {
+                    else
+                    {
                         msg = "token error!"; code = 401009;
                     }
                     if (pass)
@@ -286,12 +320,13 @@ namespace TEAMModelOS.Filter
                     }
                     else
                     {
-                        JsonResult jsonResult = new JsonResult(new {  msg="未授权",code=401});
+                        JsonResult jsonResult = new JsonResult(new { msg = "未授权", code = 401 });
                         jsonResult.StatusCode = 401;
                         context.Result = jsonResult;
                     }
                 }
-                else {
+                else
+                {
                     msg = "该接口暂未授权访问!";
                     code = 401010;
                     JsonResult jsonResult = new JsonResult(new { msg = "未授权", code = 401 });

+ 17 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/LessonRecord.cs

@@ -67,6 +67,10 @@ namespace TEAMModelOS.SDK.Models
         /// </summary>
         public string courseId { get; set; }
         /// <summary>
+        /// 选填   课程名称  是因支持VR/AR那边课例
+        /// </summary>
+        public string courseName { get; set; }
+        /// <summary>
         ///选填 选用IES5固定名单的id
         /// </summary>
         public List<string> groupIds { get; set; } = new List<string>();
@@ -88,13 +92,22 @@ namespace TEAMModelOS.SDK.Models
         /// </summary>
         public string periodId { get; set; }
         /// <summary>
+        /// 选填 学段名称  是因支持VR/AR那边课例
+        /// </summary>
+        public string periodName { get; set; }
+        /// <summary>
         ///  不填 科目id,由课程id获取
         /// </summary>
         public string subjectId { get; set; }
         /// <summary>
+        /// 选填   科目名称  是因支持VR/AR那边课例
+        /// </summary>
+        public string subjecName { get; set; }
+        /// <summary>
         /// 不填 年级id,由名单id获取
         /// </summary>
         public List<string> grade { get; set; } = new List<string>();
+        public List<string> gradeName { get; set; } = new List<string>();
         /// <summary>
         /// 不填  收藏次数,IES5更新 
         /// </summary>
@@ -211,6 +224,10 @@ namespace TEAMModelOS.SDK.Models
 
         public LearningCategory learningCategory { get; set; } = new LearningCategory();
         public int hitaClientCmpCount { get; set; }
+        /// <summary>
+        /// 课例来源 0 本公司  1 第三方公司    是因支持VR/AR那边课例
+        /// </summary>
+        public int source { get; set; } = 0;
     }
     public class TimeLineData {
       public   List<TimeLineEvent> events { get; set; } = new List<TimeLineEvent>();

+ 39 - 0
TEAMModelOS.SDK/Models/Cosmos/OpenEntity/ONormal.cs

@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace TEAMModelOS.SDK.Models.Cosmos.OpenEntity
+{
+    public class ONormal
+    {
+    }
+
+    /// <summary>
+    /// 接口访问次数
+    /// </summary>
+    public class BizVisitCnt : CosmosEntity
+    {
+        public BizVisitCnt()
+        {
+            code = "BizVisit";
+            pk = "Biz";
+        }
+
+        public int visit { get; set; }
+        public List<APIInfo> apis{ get; set; }
+    }
+
+    /// <summary>
+    /// 接口信息
+    /// </summary>
+    public class APIInfo 
+    {
+        public string name { get; set; }
+        public long upDate { get; set; }
+    }
+
+
+
+}

+ 228 - 0
TEAMModelOS.SDK/Models/Cosmos/OpenEntity/OSchool.cs

@@ -0,0 +1,228 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace TEAMModelOS.SDK.Models.Cosmos.OpenEntity
+{
+    public class OSchool
+    {
+    }
+
+    public class OLessonRecord
+    {
+        public string id { get; set; }
+
+        /// <summary>
+        ///必填 教师醍摩豆id
+        /// </summary>
+        public string tmdid { get; set; }
+        /// <summary>
+        /// 教师醍摩豆id名称
+        /// </summary>
+        public string tmdname { get; set; }
+        /// <summary>
+        /// 教师醍摩豆id名称
+        /// </summary>
+        public string tmdpicture { get; set; }
+        /// <summary>
+        ///必填 课堂名称
+        /// </summary>
+        public string name { get; set; }
+        /// <summary>
+        ///必填 scope==school必填 | string | 学校id
+        /// </summary>
+        public string school { get; set; }
+        /// <summary>
+        ///必填  视频封面地址
+        /// </summary>
+       // public string poster { get; set; }
+        /// <summary>
+        ///必填 开始时间(时间戳) 1606393763434
+        /// </summary>
+        public long startTime { get; set; }
+        /// <summary>
+        ///必填 上课时长,最后更新
+        /// </summary>
+        public double duration { get; set; }
+        /// <summary>
+        ///选填  t分,科技应用 ,最后更新
+        /// </summary>
+        //public int tScore { get; set; }
+        /// <summary>
+        ///选填   p分,教法应用 ,最后更新
+        /// </summary>
+        //public int pScore { get; set; }
+        /// <summary>
+        ///选填  t灯,科技应用 0红灯,1 黄灯,2绿灯
+        /// </summary>
+        //public int tLevel { get; set; } = -1;
+        /// <summary>
+        ///选填   p灯,教法应用 0红灯,1 黄灯,2绿灯
+        /// </summary>
+        //public int pLevel { get; set; } = -1;
+        /// <summary>
+        ///选填  选用IES5的课程id 
+        /// </summary>
+        public string courseId { get; set; }
+        /// <summary>
+        /// 选填   课程名称  是因支持VR/AR那边课例
+        /// </summary>
+        public string courseName { get; set; }
+        /// <summary>
+        ///选填 选用IES5固定名单的id
+        /// </summary>
+        public List<string> groupIds { get; set; } = new List<string>();
+        public List<string> groupNames { get; set; } = new List<string>();
+        /// <summary>
+        ///选填  学生人数 ,最后更新
+        /// </summary>
+        //public int mCount { get; set; }
+        /// <summary>
+        ///选填  议课次数,大于1则是优课,苏格拉底获取
+        /// </summary>
+        //public int discuss { get; set; }
+        /// <summary>
+        ///选填  科技互动次数, 
+        /// </summary>
+        //public int techCount { get; set; }
+        /// <summary>
+        /// 学 不填 段id,由课程或者名单获取 
+        /// </summary>
+        public string periodId { get; set; }
+        /// <summary>
+        /// 选填 学段名称  是因支持VR/AR那边课例
+        /// </summary>
+        public string periodName { get; set; }
+        /// <summary>
+        ///  不填 科目id,由课程id获取
+        /// </summary>
+        public string subjectId { get; set; }
+        /// <summary>
+        /// 选填   科目名称  是因支持VR/AR那边课例
+        /// </summary>
+        public string subjecName { get; set; }
+        /// <summary>
+        /// 不填 年级id,由名单id获取
+        /// </summary>
+        public List<string> grade { get; set; } = new List<string>();
+        public List<string> gradeName { get; set; } = new List<string>();
+        /// <summary>
+        /// 不填  收藏次数,IES5更新 
+        /// </summary>
+        public int favorite { get; set; }
+        /// <summary>
+        /// 不填 点赞数
+        /// </summary>
+        public int like { get; set; }
+        /// <summary>
+        /// 不填 分享转发数
+        /// </summary>
+        public int share { get; set; }
+        /// <summary>
+        /// 不填  ["混合学习","语文教研"]课例类别,tag标签,IES5维护
+        /// </summary>
+        public List<string> category { get; set; } = new List<string>();
+        /// <summary>
+        /// 0 是否包含视频,1包含视频
+        /// </summary>
+        public int hasVideo { get; set; }
+        //public long videoSize { get; set; }
+        /// <summary>
+        /// 
+        /// 科技互动详细次数。[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49]
+        /// </summary>
+        public List<int> tech { get; set; } = new List<int>();
+        public int status { get; set; } = 0;
+        /// <summary>
+        /// 专家好课,默认0, 1 是好课
+        /// </summary>
+        public int excellent { get; set; } = 0;
+        /// <summary>
+        /// 出席人数
+        /// </summary>
+        public int attendCount { get; set; } = 0;
+        /// <summary>
+        /// 总人数
+        /// </summary>
+        public int clientCount { get; set; } = 0;
+        /// <summary>
+        ///出席率
+        /// </summary>
+        public double attendRate { get; set; } = 0;
+        /// <summary>
+        /// 小组数
+        /// </summary>
+        public int groupCount { get; set; } = 0;
+        /// <summary>
+        /// 任务总数,作品收集任务数
+        /// </summary>
+        public int collateTaskCount { get; set; } = 0;
+        /// <summary>
+        /// 作品总数
+        /// </summary>
+        public int collateCount { get; set; } = 0;
+        /// <summary>
+        /// 推送总数(页面,资源,讯息,差异化)
+        /// </summary>
+        public int pushCount { get; set; } = 0;
+        /// <summary>
+        /// 总计分
+        /// </summary>
+        public double totalPoint { get; set; } = 0;
+        /// <summary>
+        /// 测验总题数
+        /// </summary>
+        public int examQuizCount { get; set; } = 0;
+        /// <summary>
+        /// 互动题数
+        /// </summary>
+        public int interactionCount { get; set; } = 0;
+        /// <summary>
+        /// 测验得分率
+        /// </summary>
+        public double examPointRate { get; set; } = 0;
+        /// <summary>
+        /// 学生互动总数
+        /// </summary>
+        public int clientInteractionCount { get; set; } = 0;
+        /// <summary>
+        /// 学生互动率
+        /// </summary>
+        public double clientInteractionAverge { get; set; } = 0;
+
+        public int examCount { get; set; }
+        /// <summary>
+        /// 总互动分
+        /// </summary>
+        public double totalInteractPoint { get; set; } = 0;
+        /// <summary>
+        /// 过期时间,-1永不过期, 1577808000000 2020-01-01
+        /// </summary>
+        public long expire { get; set; } = -1;
+        /// <summary>
+        /// 先使用这种模式,["all","student"], 暂不 开放 school【开放给部分学校查看】,teacher【开放给部分教师查看】   ["all","school","teacher","student"]
+        /// </summary>
+        //public List<string> show { get; set; } = new List<string>();
+        /// <summary>
+        /// 暂不 开放 school【开放给部分学校查看】学校编码
+        /// </summary>
+        //public List<string> showSchs { get; set; } = new List<string>();
+        /// <summary>
+        /// 暂不 开放 teacher【开放给部分教师查看】醍摩豆id 
+        /// </summary>
+        //public List<string> showTchs { get; set; } = new List<string>();
+        /// <summary>
+        /// 设置强制保留的 =1 ,不会被自动清理的。但是可以被手动清理。
+        /// </summary>
+        //public int save { get; set; } = -1;
+        /// <summary>
+        /// 默认未上传
+        /// </summary>
+        public int upload { get; set; }
+
+        public LearningCategory learningCategory { get; set; }
+        public int hitaClientCmpCount { get; set; }
+    }
+}

文件差异内容过多而无法显示
+ 180 - 2
TEAMModelOS/Controllers/OpenApi/Business/BizOverallEducationController.cs