123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- using StackExchange.Redis;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using TEAMModelOS.SDK.DI;
- using TEAMModelOS.SDK.Extension;
- namespace TEAMModelOS.SDK.Models.Service
- {
- 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)
- {
- long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- List<PDFGenRedis> genRedis = new List<PDFGenRedis>();
- List<PDFGenRedis> dbgenRedis = new List<PDFGenRedis>();
- HashEntry[] datas = await azureRedis.GetRedisClient(8).HashGetAllAsync($"PDFGen:{data.sessionId}");
- if (datas!= null && datas.Length > 0)
- {
- foreach (var item in datas)
- {
- dbgenRedis.Add(item.Value.ToString().ToObject<PDFGenRedis>());
- }
- }
- int countProcess= 0;
- foreach (var item in data.datas)
- {
- var dbData = dbgenRedis.Find(x => x.id.Equals(item.id));
- if (dbData!=null)
- {
-
- if (dbData.status==0|| dbData.status==1)
- {
- //不变的
- countProcess+=1;
- }
- else
- {
- //需要变更的
- dbData.status = 0;
- dbData.cost=0;
- dbData.join= now;
- dbData.wait=0;
- genRedis.Add(dbData);
- }
- }
- else {
- genRedis.Add(new PDFGenRedis { id = item.id, status=0, cost=0, wait=0, join=now });
- }
- }
- //过期时间 当前个数+ reddis的个数
- foreach (var item in genRedis)
- {
- countProcess+=1;
- await azureRedis.GetRedisClient(8).HashSetAsync($"PDFGen:{data.sessionId}", item.id, item.ToJsonString());
- }
- long expire = (data.delay+data.timeout) * countProcess ;
- var tiemSpan = TimeSpan.FromMilliseconds(expire);
- await azureRedis.GetRedisClient(8).KeyExpireAsync($"PDFGen:{data.sessionId}", tiemSpan);
- return null;
- }
- }
- public class GenPDFData
- {
- public string pageUrl { get; set; }
- public long timeout { get; set; } = 30000;
- public long delay { get; set; } = 2000;
- public string orientation { get; set; }
- public string pageSize { get; set; }
- public string pageWidth { get; set; }
- public string pageHeight { get; set; }
- /// <summary>
- /// 生成会话id, 活动id
- /// </summary>
- public string sessionId { get; set; }
- public List<PDFData> datas { get; set; } = new List<PDFData>();
- }
- public record PDFData{
- /// <summary>
- /// 学生id
- /// </summary>
- public string id { get; set; }
- /// <summary>
- /// 数据链接
- /// </summary>
- public string url { get; set; }
- }
- /// <summary>
- /// redis 存储数据,超时时间设置为status=0 的count timeout* count+ delay*count
- /// </summary>
- public record PDFGenRedis
- {
- /// <summary>
- /// 学生id
- /// </summary>
- public string id { get; set; }
- /// <summary>
- /// 0 未执行,1 执行中,2 执行成功,3 执行失败,4超时,5 取消
- /// </summary>
- public int status { get; set; } = 0;
- /// <summary>
- /// 执行生成 毫秒
- /// </summary>
- public long cost { get; set;}
- /// <summary>
- /// 等候时间
- /// </summary>
- public long wait { get; set;}
- /// <summary>
- /// 加入时间
- /// </summary>
- 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; }
- }
- }
|