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
{
///
/// https://github.com/wuxue107/bookjs-eazy https://github.com/wuxue107/screenshot-api-server
///
///
///
///
///
public async Task AddGenPdfQueue(AzureServiceBusFactory azureServiceBus , AzureRedisFactory azureRedis, GenPDFData data)
{
long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
List genRedis = new List();
List dbgenRedis = new List();
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());
}
}
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; }
///
/// 生成会话id, 活动id
///
public string sessionId { get; set; }
public List datas { get; set; } = new List();
}
public record PDFData{
///
/// 学生id
///
public string id { get; set; }
///
/// 数据链接
///
public string url { get; set; }
}
///
/// redis 存储数据,超时时间设置为status=0 的count timeout* count+ delay*count
///
public record PDFGenRedis
{
///
/// 学生id
///
public string id { get; set; }
///
/// 0 未执行,1 执行中,2 执行成功,3 执行失败,4超时,5 取消
///
public int status { get; set; } = 0;
///
/// 执行生成 毫秒
///
public long cost { get; set;}
///
/// 等候时间
///
public long wait { get; set;}
///
/// 加入时间
///
public long join { get; set; }
}
///
/// // 拼接上接口的前缀 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
///
public record PDFGenQueue
{
///
/// 学生id
///
public string id { get; set; }
///
/// 数据装载后的页面 要制作为PDF的网页 (pageUrl 、html 参数二选一)
///
public string pageUrl { get; set; }
///
/// 要截图的网页HTML (pageUrl 、html 参数二选一) "html" : "bookjs-eazy
",
///
public string html { get; set; }
///
/// 超时时间
///
public long timeout { get; set; } = 30000;
///
/// 页面完成后(checkPageCompleteJs返回为true后)延迟的时间,可选,默认:0
///
public long delay { get; set; } = 2000;
///
/// // 检查页面是否渲染完成的js表达式,可选,默认: "true"
///
public bool checkPageCompleteJs { get; set; }
///
/// 生成会话id, 活动id
///
public string sessionId { get; set; }
}
}