CrazyIter_Bin 10 ماه پیش
والد
کامیت
0300a17ece

+ 66 - 9
TEAMModelOS.SDK/Models/Service/GenPDFService.cs

@@ -11,23 +11,30 @@ namespace TEAMModelOS.SDK.Models.Service
 {
 {
     public class GenPDFService
     public class GenPDFService
     {
     {
+        /// <summary>
+        /// https://github.com/wuxue107/bookjs-eazy  https://github.com/wuxue107/screenshot-api-server
+        /// </summary>
+        /// <param name="azureServiceBus"></param>
+        /// <param name="azureRedis"></param>
+        /// <param name="data"></param>
+        /// <returns></returns>
         public async Task<string> AddGenPdfQueue(AzureServiceBusFactory azureServiceBus , AzureRedisFactory azureRedis, GenPDFData data) 
         public async Task<string> AddGenPdfQueue(AzureServiceBusFactory azureServiceBus , AzureRedisFactory azureRedis, GenPDFData data) 
         {
         {
             long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
             long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-            List<PDFGenParam> genParams = new List<PDFGenParam>();
-            List<PDFGenParam> dbgenParams = new List<PDFGenParam>();
+            List<PDFGenRedis> genRedis = new List<PDFGenRedis>();
+            List<PDFGenRedis> dbgenRedis = new List<PDFGenRedis>();
             HashEntry[] datas = await azureRedis.GetRedisClient(8).HashGetAllAsync($"PDFGen:{data.sessionId}");
             HashEntry[] datas = await azureRedis.GetRedisClient(8).HashGetAllAsync($"PDFGen:{data.sessionId}");
             if (datas!= null  && datas.Length > 0)
             if (datas!= null  && datas.Length > 0)
             { 
             { 
                 foreach (var item in datas)
                 foreach (var item in datas)
                 {
                 {
-                    dbgenParams.Add(item.Value.ToString().ToObject<PDFGenParam>());
+                    dbgenRedis.Add(item.Value.ToString().ToObject<PDFGenRedis>());
                 }
                 }
             }
             }
             int countProcess= 0;
             int countProcess= 0;
             foreach (var item in data.datas)
             foreach (var item in data.datas)
             {
             {
-                var dbData = dbgenParams.Find(x => x.id.Equals(item.id));
+                var dbData = dbgenRedis.Find(x => x.id.Equals(item.id));
                 if (dbData!=null)
                 if (dbData!=null)
                 {
                 {
                     
                     
@@ -43,15 +50,15 @@ namespace TEAMModelOS.SDK.Models.Service
                         dbData.cost=0;
                         dbData.cost=0;
                         dbData.join= now;
                         dbData.join= now;
                         dbData.wait=0;
                         dbData.wait=0;
-                        genParams.Add(dbData);
+                        genRedis.Add(dbData);
                     }
                     }
                 }
                 }
                 else {
                 else {
-                    genParams.Add(new PDFGenParam { id = item.id, status=0, cost=0, wait=0, join=now });
+                    genRedis.Add(new PDFGenRedis { id = item.id, status=0, cost=0, wait=0, join=now });
                 }
                 }
             }
             }
             //过期时间 当前个数+ reddis的个数
             //过期时间 当前个数+ reddis的个数
-            foreach (var item in genParams) 
+            foreach (var item in genRedis) 
             {
             {
                 countProcess+=1;
                 countProcess+=1;
                 await azureRedis.GetRedisClient(8).HashSetAsync($"PDFGen:{data.sessionId}", item.id, item.ToJsonString());
                 await azureRedis.GetRedisClient(8).HashSetAsync($"PDFGen:{data.sessionId}", item.id, item.ToJsonString());
@@ -59,6 +66,8 @@ namespace TEAMModelOS.SDK.Models.Service
             long expire = (data.delay+data.timeout) * countProcess ;
             long expire = (data.delay+data.timeout) * countProcess ;
             var tiemSpan = TimeSpan.FromMilliseconds(expire);
             var tiemSpan = TimeSpan.FromMilliseconds(expire);
             await azureRedis.GetRedisClient(8).KeyExpireAsync($"PDFGen:{data.sessionId}", tiemSpan);
             await azureRedis.GetRedisClient(8).KeyExpireAsync($"PDFGen:{data.sessionId}", tiemSpan);
+
+
             return null; 
             return null; 
         }
         }
 
 
@@ -89,12 +98,13 @@ namespace TEAMModelOS.SDK.Models.Service
         /// 数据链接
         /// 数据链接
         /// </summary>
         /// </summary>
         public string url { get; set; }
         public string url { get; set; }
-       
     }
     }
+
+
     /// <summary>
     /// <summary>
     /// redis 存储数据,超时时间设置为status=0 的count   timeout* count+ delay*count
     /// redis 存储数据,超时时间设置为status=0 的count   timeout* count+ delay*count
     /// </summary>
     /// </summary>
-    public record PDFGenParam 
+    public record PDFGenRedis 
     {
     {
         /// <summary>
         /// <summary>
         /// 学生id
         /// 学生id
@@ -117,4 +127,51 @@ namespace TEAMModelOS.SDK.Models.Service
         /// </summary>
         /// </summary>
         public long join     { get; set; }
         public long join     { get; set; }
     }
     }
+
+
+    /// <summary>
+    /// // 拼接上接口的前缀 http://localhost:3000/ 就是完整PDF地址 
+    // http://localhost:3000/pdf/1614458263411-glduu.pdf
+    // 拼接上接口的前缀 http://localhost:3000/download/可以就可生成在浏览器上的下载链接
+    // http://localhost:3000/download/pdf/1614458263411-glduu.pdf
+    // 拼接上http://localhost:3000/static/js/pdfjs/web/viewer.html?file=/pdf/1614458263411-glduu.pdf
+    // 可使用pdfjs库进行预览
+    //
+//## -e MAX_BROWSER=[num] 环境变量可选,最大的puppeteer实例数,忽略选项则默认值:1 , 值auto:[可用内存]/200M
+//##  -e PDF_KEEP_DAY=[num] 自动删除num天之前产生的文件目录,默认0: 不删除文件
+    //docker run -p 13000:3000 -td --rm -e MAX_BROWSER=2 -e PDF_KEEP_DAY=1 -v ${PWD}:/screenshot-api-server/public --name=screenshot-api-server wuxue107/screenshot-api-server
+    /// </summary>
+    public record PDFGenQueue 
+    {
+        /// <summary>
+        /// 学生id
+        /// </summary>
+        public string id { get; set; }
+        /// <summary>
+        /// 数据装载后的页面  要制作为PDF的网页 (pageUrl 、html 参数二选一)
+        /// </summary>
+        public string pageUrl { get; set; }
+
+        /// <summary>
+        ///  要截图的网页HTML (pageUrl 、html 参数二选一)  "html" : "<div>bookjs-eazy</div>",
+        /// </summary>
+      public string html { get; set; }
+        /// <summary>
+        /// 超时时间
+        /// </summary>
+        public long timeout { get; set; } = 30000;
+        /// <summary>
+        /// 页面完成后(checkPageCompleteJs返回为true后)延迟的时间,可选,默认:0
+        /// </summary>
+        public long delay { get; set; } = 2000;
+
+        /// <summary>
+        ///  // 检查页面是否渲染完成的js表达式,可选,默认: "true"
+        /// </summary>
+        public bool checkPageCompleteJs { get; set; }
+        /// <summary>
+        /// 生成会话id, 活动id
+        /// </summary>
+        public string sessionId { get; set; }
+    }
 }
 }

+ 27 - 0
TEAMModelOS/Controllers/Both/KnowledgeController.cs

@@ -293,8 +293,35 @@ namespace TEAMModelOS.Controllers.Both
             }
             }
             return Ok(new {code =404});
             return Ok(new {code =404});
         }
         }
+        [ProducesDefaultResponseType]
+        [HttpPost("clear-old")]
+#if !DEBUG
 
 
+        [Authorize(Roles = "IES")]
+        [AuthToken(Roles = "admin", Permissions = "knowledge-upd")]
+#endif
+        public async Task<IActionResult> ClearOld(JsonElement json) 
+        {
 
 
+            string id = $"{json.GetProperty("id")}";
+            string code = $"{json.GetProperty("code")}";
+            string scope = $"{json.GetProperty("scope")}";
+            string tbname = scope.Equals("school") ? Constant.School : Constant.Teacher;
+            var client = _azureCosmos.GetCosmosClient();
+            Knowledge knowledge = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<Knowledge>(id, new PartitionKey(code));
+            List<Block> blocks = new List<Block>();
+            foreach (var block in knowledge.blocks)
+            {
+                if (block.source == 1)
+                {
+                    blocks.Add(block);
+                }
+            }
+            knowledge.blocks = blocks;
+            knowledge.points= new List<string>();
+            var dto = KnowledgeService.KnowledgeTranslate(knowledge);
+            return Ok(new { knowledgeTree = dto });
+        }
         [ProducesDefaultResponseType]
         [ProducesDefaultResponseType]
         [HttpPost("upsert")]
         [HttpPost("upsert")]
 #if !DEBUG
 #if !DEBUG

+ 7 - 2
TEAMModelOS/Controllers/Both/LessonRecordController.cs

@@ -793,9 +793,14 @@ namespace TEAMModelOS.Controllers
                 {
                 {
                     cosmosDbQuery.QueryText = cosmosDbQuery.QueryText.Replace("where", $" where  ((c.tLevel=2 and c.pLevel<2 )or(c.tLevel<2 and c.pLevel=2 )) and   ");
                     cosmosDbQuery.QueryText = cosmosDbQuery.QueryText.Replace("where", $" where  ((c.tLevel=2 and c.pLevel<2 )or(c.tLevel<2 and c.pLevel=2 )) and   ");
                 }
                 }
+                //if (request.TryGetProperty("name", out JsonElement _name) && !string.IsNullOrWhiteSpace($"{_name}"))
+                //{
+
+                //}
+
                 await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname)
                 await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname)
-                   .GetItemQueryStreamIteratorQuery(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, continuationToken: continuationToken,
-                   requestOptions: new QueryRequestOptions() { MaxItemCount = pageCount, PartitionKey = new PartitionKey(code) }))
+                .GetItemQueryStreamIteratorQuery(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, continuationToken: continuationToken,
+                requestOptions: new QueryRequestOptions() { MaxItemCount = pageCount, PartitionKey = new PartitionKey(code) }))
                 {
                 {
                     using var json = await JsonDocument.ParseAsync(item.Content);
                     using var json = await JsonDocument.ParseAsync(item.Content);
                     if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                     if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)