GenPDFService.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. using StackExchange.Redis;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using TEAMModelOS.SDK.DI;
  8. using TEAMModelOS.SDK.Extension;
  9. namespace TEAMModelOS.SDK.Models.Service
  10. {
  11. public class GenPDFService
  12. {
  13. public async Task<string> AddGenPdfQueue(AzureServiceBusFactory azureServiceBus , AzureRedisFactory azureRedis, GenPDFData data)
  14. {
  15. long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  16. List<PDFGenParam> genParams = new List<PDFGenParam>();
  17. List<PDFGenParam> dbgenParams = new List<PDFGenParam>();
  18. HashEntry[] datas = await azureRedis.GetRedisClient(8).HashGetAllAsync($"PDFGen:{data.sessionId}");
  19. if (datas!= null && datas.Length > 0)
  20. {
  21. foreach (var item in datas)
  22. {
  23. dbgenParams.Add(item.Value.ToString().ToObject<PDFGenParam>());
  24. }
  25. }
  26. int countProcess= 0;
  27. foreach (var item in data.datas)
  28. {
  29. var dbData = dbgenParams.Find(x => x.id.Equals(item.id));
  30. if (dbData!=null)
  31. {
  32. if (dbData.status==0|| dbData.status==1)
  33. {
  34. //不变的
  35. countProcess+=1;
  36. }
  37. else
  38. {
  39. //需要变更的
  40. dbData.status = 0;
  41. dbData.cost=0;
  42. dbData.join= now;
  43. dbData.wait=0;
  44. genParams.Add(dbData);
  45. }
  46. }
  47. else {
  48. genParams.Add(new PDFGenParam { id = item.id, status=0, cost=0, wait=0, join=now });
  49. }
  50. }
  51. //过期时间 当前个数+ reddis的个数
  52. foreach (var item in genParams)
  53. {
  54. countProcess+=1;
  55. await azureRedis.GetRedisClient(8).HashSetAsync($"PDFGen:{data.sessionId}", item.id, item.ToJsonString());
  56. }
  57. long expire = (data.delay+data.timeout) * countProcess ;
  58. var tiemSpan = TimeSpan.FromMilliseconds(expire);
  59. await azureRedis.GetRedisClient(8).KeyExpireAsync($"PDFGen:{data.sessionId}", tiemSpan);
  60. return null;
  61. }
  62. }
  63. public class GenPDFData
  64. {
  65. public string pageUrl { get; set; }
  66. public long timeout { get; set; } = 30000;
  67. public long delay { get; set; } = 2000;
  68. public string orientation { get; set; }
  69. public string pageSize { get; set; }
  70. public string pageWidth { get; set; }
  71. public string pageHeight { get; set; }
  72. /// <summary>
  73. /// 生成会话id, 活动id
  74. /// </summary>
  75. public string sessionId { get; set; }
  76. public List<PDFData> datas { get; set; } = new List<PDFData>();
  77. }
  78. public record PDFData{
  79. /// <summary>
  80. /// 学生id
  81. /// </summary>
  82. public string id { get; set; }
  83. /// <summary>
  84. /// 数据链接
  85. /// </summary>
  86. public string url { get; set; }
  87. }
  88. /// <summary>
  89. /// redis 存储数据,超时时间设置为status=0 的count timeout* count+ delay*count
  90. /// </summary>
  91. public record PDFGenParam
  92. {
  93. /// <summary>
  94. /// 学生id
  95. /// </summary>
  96. public string id { get; set; }
  97. /// <summary>
  98. /// 0 未执行,1 执行中,2 执行成功,3 执行失败,4超时,5 取消
  99. /// </summary>
  100. public int status { get; set; } = 0;
  101. /// <summary>
  102. /// 执行生成 毫秒
  103. /// </summary>
  104. public long cost { get; set;}
  105. /// <summary>
  106. /// 等候时间
  107. /// </summary>
  108. public long wait { get; set;}
  109. /// <summary>
  110. /// 加入时间
  111. /// </summary>
  112. public long join { get; set; }
  113. }
  114. }