SuperImageTask.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. using PuppeteerSharp;
  2. using static StationProbe.FilterTask;
  3. namespace StationProbe
  4. {
  5. internal class DefaultExamStore : IExamStore
  6. {
  7. private readonly Database _db = new Database();
  8. public void AddExam(Exam exam)
  9. {
  10. _db.AddExam(exam);
  11. }
  12. public void AddImage(Image image)
  13. {
  14. _db.AddImage(image);
  15. }
  16. public void Dispose()
  17. {
  18. _db.Dispose();
  19. }
  20. public Exam? GetLastExam(int batchTaskId)
  21. {
  22. return _db.GetLastExam(batchTaskId, DateTime.MinValue, DateTime.MaxValue);
  23. }
  24. public void UpdateBatchTask(BatchTask batchTask)
  25. {
  26. _db.UpdateBatchTask(batchTask);
  27. }
  28. }
  29. internal class SuperImageTask : IDisposable
  30. {
  31. private readonly IExamStore _examStore;
  32. private readonly BatchTask _batchTask;
  33. private readonly int _examCountInPage;
  34. private int _pageIndex = 0;
  35. private int _examIndex = 0;
  36. private int _examIndexInPage = 0;
  37. public SuperImageTask(BatchTask batchTask, int examCountInPage)
  38. {
  39. _batchTask = batchTask;
  40. _examCountInPage = examCountInPage;
  41. _examStore = new DefaultExamStore();
  42. }
  43. public async Task RunAsync(IPage page)
  44. {
  45. var outputs = new ElementCollection();
  46. outputs.AddObject(ElementType.Page, page);
  47. var url = "http://192.168.200.85:8080/superimage/login.jsp";
  48. Logger.WriteLine($"Start login task (url:{url})...");
  49. try
  50. {
  51. outputs = await new LoginTask(_examStore, url).ExecuteAsync(outputs);
  52. }
  53. catch (Exception ex)
  54. {
  55. Logger.WriteLine($"Run LoginTask failed:{ex}");
  56. throw;
  57. }
  58. await Task.Delay(DelayConfig.TaskDelay);
  59. Logger.WriteLine("Start menu task...");
  60. try
  61. {
  62. outputs = await new MenuTask(_examStore).ExecuteAsync(outputs);
  63. }
  64. catch (Exception ex)
  65. {
  66. Logger.WriteLine($"Run MenuTask failed:{ex}");
  67. throw;
  68. }
  69. await Task.Delay(DelayConfig.TaskDelay);
  70. Logger.WriteLine($"Start filter task(start:{_batchTask.Start:yyyy-MM-dd}, end:{_batchTask.End:yyyy-MM-dd})...");
  71. try
  72. {
  73. var filterTask = new FilterTask(_examStore, _batchTask.Start, _batchTask.End);
  74. outputs = await filterTask.ExecuteAsync(outputs);
  75. if (filterTask.PageCount != _batchTask.PageCount || filterTask.ExamCount != _batchTask.ExamCount)
  76. {
  77. //Update the batchTask
  78. _batchTask.ExamCount = filterTask.ExamCount;
  79. _batchTask.PageCount = filterTask.PageCount;
  80. _examStore.UpdateBatchTask(_batchTask);
  81. }
  82. Logger.WriteLine($"Get page count:{filterTask.PageCount}, exam count:{filterTask.ExamCount}");
  83. }
  84. catch (Exception ex)
  85. {
  86. Logger.WriteLine($"Run FilterTask failed:{ex}");
  87. throw;
  88. }
  89. await Task.Delay(DelayConfig.TaskDelay);
  90. var lastExam = _examStore.GetLastExam(_batchTask.Id);
  91. if (lastExam != null)
  92. {
  93. _pageIndex = lastExam.PageIndex;
  94. _examIndex = lastExam.ExamIndex + 1;
  95. _examIndexInPage = lastExam.ExamIndexInPage + 1;
  96. if (_examIndexInPage + 1 == _examCountInPage)
  97. {
  98. _pageIndex++;
  99. _examIndexInPage = 0;
  100. }
  101. }
  102. Logger.WriteLine($"Start from page: {_pageIndex}, exam index: {_examIndexInPage}");
  103. while (_pageIndex < _batchTask.PageCount)
  104. {
  105. Logger.WriteLine($"Start page task (page:{_pageIndex})");
  106. try
  107. {
  108. var pageTask = new PageTask(_examStore, _pageIndex);
  109. outputs = await pageTask.ExecuteAsync(outputs);
  110. var currentExamCountinPage = _pageIndex < (_batchTask.PageCount - 1) ? _examCountInPage : (_batchTask.ExamCount - _pageIndex * _examCountInPage);
  111. while (_examIndexInPage < currentExamCountinPage)
  112. {
  113. Logger.WriteLine($"Start exam task (exam index: {_examIndexInPage}, page index:{_pageIndex})...");
  114. try
  115. {
  116. outputs = await new ExamTask(_examStore, _batchTask.Id, _pageIndex, _examIndex ,_examIndexInPage).ExecuteAsync(outputs);
  117. }
  118. catch (Exception ex)
  119. {
  120. Logger.WriteLine($"Run ExamTask failed:{ex}");
  121. throw;
  122. }
  123. _examIndex++;
  124. _examIndexInPage++;
  125. Counter.IncreaseExamCount();
  126. await Task.Delay(DelayConfig.TaskDelay);
  127. }
  128. _examIndexInPage = 0;
  129. }
  130. catch (Exception ex)
  131. {
  132. Logger.WriteLine($"Run PageTask failed:{ex}");
  133. throw;
  134. }
  135. _pageIndex++;
  136. await Task.Delay(DelayConfig.TaskDelay);
  137. }
  138. }
  139. public void Dispose()
  140. {
  141. _examStore.Dispose();
  142. }
  143. }
  144. }