|
@@ -10,93 +10,147 @@ using System.Xml.Linq;
|
|
|
namespace StationProbe
|
|
|
{
|
|
|
|
|
|
- internal class LoginTask
|
|
|
+ internal enum ElementType
|
|
|
+ {
|
|
|
+ Page,
|
|
|
+ Frame
|
|
|
+ }
|
|
|
+
|
|
|
+ internal static class ElementConverter
|
|
|
+ {
|
|
|
+ public static T? As<T>(this object obj) where T: class
|
|
|
+ {
|
|
|
+ return obj as T;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ internal class ElementCollection
|
|
|
+ {
|
|
|
+ private readonly Dictionary<ElementType, object> _objects = new();
|
|
|
+
|
|
|
+ public object this[ElementType type] => _objects[type];
|
|
|
+
|
|
|
+ public void AddObject(ElementType element, object obj)
|
|
|
+ {
|
|
|
+ _objects.Add(element, obj);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ internal abstract class ProbeTask
|
|
|
+ {
|
|
|
+ protected readonly Database _db;
|
|
|
+ public ProbeTask(Database db)
|
|
|
+ {
|
|
|
+ _db = db;
|
|
|
+ }
|
|
|
+ public abstract Task<ElementCollection> ExecuteAsync(ElementCollection inputs);
|
|
|
+ }
|
|
|
+
|
|
|
+ internal class LoginTask: ProbeTask
|
|
|
{
|
|
|
private readonly string _loginUrl;
|
|
|
- public LoginTask(string loginUrl)
|
|
|
+
|
|
|
+ public LoginTask(Database db, string loginUrl) :base(db)
|
|
|
{
|
|
|
_loginUrl = loginUrl;
|
|
|
}
|
|
|
|
|
|
- public async Task<IPage> ExecuteAsync(IPage input, Database db)
|
|
|
+ public override async Task<ElementCollection> ExecuteAsync(ElementCollection inputs)
|
|
|
{
|
|
|
- await input.GoToAsync(_loginUrl);
|
|
|
- //username
|
|
|
- await input.WaitForSelectorAsync("input[_bl_13]");
|
|
|
- await input.FocusAsync("input[_bl_13]");
|
|
|
- await input.Keyboard.TypeAsync("justin.xing");
|
|
|
- //password
|
|
|
- await input.WaitForSelectorAsync("input[_bl_14]");
|
|
|
- await input.FocusAsync("input[_bl_14]");
|
|
|
- await input.Keyboard.TypeAsync("123456");
|
|
|
- //login
|
|
|
- var button = await input.WaitForSelectorAsync("button[_bl_15]");
|
|
|
- await button.ClickAsync();
|
|
|
-
|
|
|
- await input.WaitForNavigationAsync();
|
|
|
- await input.WaitForNetworkIdleAsync();
|
|
|
-
|
|
|
- return input;
|
|
|
+ var input = inputs[ElementType.Page].As<IPage>();
|
|
|
+ if (input != null)
|
|
|
+ {
|
|
|
+ await input.GoToAsync(_loginUrl);
|
|
|
+ //username
|
|
|
+ await input.WaitForSelectorAsync("input[_bl_13]");
|
|
|
+ await input.FocusAsync("input[_bl_13]");
|
|
|
+ await input.Keyboard.TypeAsync("justin.xing");
|
|
|
+ //password
|
|
|
+ await input.WaitForSelectorAsync("input[_bl_14]");
|
|
|
+ await input.FocusAsync("input[_bl_14]");
|
|
|
+ await input.Keyboard.TypeAsync("123456");
|
|
|
+ //login
|
|
|
+ var button = await input.WaitForSelectorAsync("button[_bl_15]");
|
|
|
+ await button.ClickAsync();
|
|
|
+
|
|
|
+ await input.WaitForNavigationAsync();
|
|
|
+ await input.WaitForNetworkIdleAsync();
|
|
|
+ }
|
|
|
+ return inputs;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- internal class MenuTask
|
|
|
+ internal class MenuTask:ProbeTask
|
|
|
{
|
|
|
- public async Task<IFrame> ExecuteAsync(IPage input, Database db)
|
|
|
+ public MenuTask(Database db) : base(db)
|
|
|
{
|
|
|
- var frame = await input.WaitForFrameAsync("");
|
|
|
- return frame;
|
|
|
+ }
|
|
|
+
|
|
|
+ public override async Task<ElementCollection> ExecuteAsync(ElementCollection inputs)
|
|
|
+ {
|
|
|
+ Logger.WriteLine("Finding menu...");
|
|
|
+ var input = inputs[ElementType.Page].As<IPage>();
|
|
|
+ if (input != null)
|
|
|
+ {
|
|
|
+ var frame = await input.WaitForFrameAsync("");
|
|
|
+ inputs.AddObject(ElementType.Frame, frame);
|
|
|
+ }
|
|
|
+ return inputs;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- internal class FilterTask
|
|
|
+ internal class FilterTask : ProbeTask
|
|
|
{
|
|
|
- private DateTime _start;
|
|
|
- private DateTime _end;
|
|
|
+ private readonly DateTime _start;
|
|
|
+ private readonly DateTime _end;
|
|
|
|
|
|
public int PageCount { get; private set; }
|
|
|
|
|
|
public int ExamCount { get; private set; }
|
|
|
|
|
|
- public FilterTask(DateTime start, DateTime end)
|
|
|
+ public FilterTask(Database db, DateTime start, DateTime end):base(db)
|
|
|
{
|
|
|
_start = start;
|
|
|
_end = end;
|
|
|
}
|
|
|
|
|
|
- public async Task<IFrame> ExecuteAsync(IPage page, IFrame frame, Database db)
|
|
|
+ public override async Task<ElementCollection> ExecuteAsync(ElementCollection inputs)
|
|
|
{
|
|
|
- await frame.WaitForSelectorAsync("input[_bl_13]");
|
|
|
- await frame.FocusAsync("input[_bl_13]");
|
|
|
- await page.Keyboard.TypeAsync("justin.xing");
|
|
|
- return frame;
|
|
|
+ var page = inputs[ElementType.Page].As<IPage>();
|
|
|
+ var frame = inputs[ElementType.Frame].As<IFrame>();
|
|
|
+ if(page!= null && frame != null)
|
|
|
+ {
|
|
|
+ await frame.WaitForSelectorAsync("input[_bl_13]");
|
|
|
+ await frame.FocusAsync("input[_bl_13]");
|
|
|
+ await page.Keyboard.TypeAsync("justin.xing");
|
|
|
+ }
|
|
|
+ return inputs;
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
- internal class PageTask
|
|
|
+ internal class PageTask:ProbeTask
|
|
|
{
|
|
|
private readonly int _page;
|
|
|
- public PageTask(int page)
|
|
|
+ public PageTask(Database db, int page):base(db)
|
|
|
{
|
|
|
_page = page;
|
|
|
}
|
|
|
|
|
|
- public async Task<IFrame> ExecuteAsync(IFrame input, Database db)
|
|
|
+ public override async Task<ElementCollection> ExecuteAsync(ElementCollection inputs)
|
|
|
{
|
|
|
|
|
|
- return input;
|
|
|
+ return inputs;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- internal class ExamTask
|
|
|
+ internal class ExamTask:ProbeTask
|
|
|
{
|
|
|
private readonly int _batchTaskId;
|
|
|
private readonly int _pageIndex;
|
|
|
private readonly int _examIndex;
|
|
|
private readonly int _examIndexInPage;
|
|
|
|
|
|
- public ExamTask(int batchTaskId, int pageIndex, int examIndex, int examIndexInPage)
|
|
|
+ public ExamTask(Database db, int batchTaskId, int pageIndex, int examIndex, int examIndexInPage): base(db)
|
|
|
{
|
|
|
_batchTaskId = batchTaskId;
|
|
|
_pageIndex = pageIndex;
|
|
@@ -104,55 +158,60 @@ namespace StationProbe
|
|
|
_examIndexInPage = examIndexInPage;
|
|
|
}
|
|
|
|
|
|
- public async Task<IFrame> ExecuteAsync(IFrame input, Database db)
|
|
|
+ public override async Task<ElementCollection> ExecuteAsync(ElementCollection inputs)
|
|
|
{
|
|
|
- var exmaId = Guid.NewGuid().ToString("N");
|
|
|
- //Enter exam
|
|
|
- //Get patient info
|
|
|
- var patientName = "";
|
|
|
- var patientSex = "";
|
|
|
- var patientAge = 0;
|
|
|
- var examDate = DateTime.Now;
|
|
|
-
|
|
|
- //Get report
|
|
|
- var report = "";
|
|
|
-
|
|
|
- //Save images.
|
|
|
- var imageUrls = new List<string>();
|
|
|
- for(var i= 0;i< imageUrls.Count;i++)
|
|
|
+ var page = inputs[ElementType.Page].As<IPage>();
|
|
|
+ var frame = inputs[ElementType.Frame].As<IFrame>();
|
|
|
+ if (page != null && frame != null)
|
|
|
{
|
|
|
- var response = await input.WaitForResponseAsync(imageUrls[i]);
|
|
|
- var buffer = await response.BufferAsync();
|
|
|
- var image = new Image()
|
|
|
+ var exmaId = Guid.NewGuid().ToString("N");
|
|
|
+ //Enter exam
|
|
|
+ //Get patient info
|
|
|
+ var patientName = "";
|
|
|
+ var patientSex = "";
|
|
|
+ var patientAge = 0;
|
|
|
+ var examDate = DateTime.Now;
|
|
|
+
|
|
|
+ //Get report
|
|
|
+ var report = "";
|
|
|
+
|
|
|
+ //Save images.
|
|
|
+ var imageUrls = new List<string>();
|
|
|
+ for (var i = 0; i < imageUrls.Count; i++)
|
|
|
+ {
|
|
|
+ var response = await page.WaitForResponseAsync(imageUrls[i]);
|
|
|
+ var buffer = await response.BufferAsync();
|
|
|
+ var image = new Image()
|
|
|
+ {
|
|
|
+ Id = Guid.NewGuid().ToString("N"),
|
|
|
+ ExamId = exmaId,
|
|
|
+ ImageIndex = i,
|
|
|
+ Data = buffer,
|
|
|
+ CreateTime = DateTime.Now,
|
|
|
+ };
|
|
|
+ _db.AddImage(image);
|
|
|
+ }
|
|
|
+
|
|
|
+ //Save exam.
|
|
|
+ var exam = new Exam()
|
|
|
{
|
|
|
- Id = Guid.NewGuid().ToString("N"),
|
|
|
- ExamId = exmaId,
|
|
|
- ImageIndex = i,
|
|
|
- Data = buffer,
|
|
|
- CreateTime = DateTime.Now,
|
|
|
+ Id = exmaId,
|
|
|
+ PatientName = patientName,
|
|
|
+ PatientSex = patientSex,
|
|
|
+ PatientAge = patientAge,
|
|
|
+ ExamDate = examDate,
|
|
|
+ Report = report,
|
|
|
+ BatchTaskId = _batchTaskId,
|
|
|
+ ExamIndex = _examIndex,
|
|
|
+ PageIndex = _pageIndex,
|
|
|
+ ExamIndexInPage = _examIndexInPage,
|
|
|
+ CreateTime = DateTime.Now
|
|
|
};
|
|
|
- db.AddImage(image);
|
|
|
+ _db.AddExam(exam);
|
|
|
+ //Back to page.
|
|
|
+ await page.GoBackAsync();
|
|
|
}
|
|
|
-
|
|
|
- //Save exam.
|
|
|
- var exam = new Exam()
|
|
|
- {
|
|
|
- Id = exmaId,
|
|
|
- PatientName = patientName,
|
|
|
- PatientSex = patientSex,
|
|
|
- PatientAge = patientAge,
|
|
|
- ExamDate = examDate,
|
|
|
- Report = report,
|
|
|
- BatchTaskId = _batchTaskId,
|
|
|
- ExamIndex = _examIndex,
|
|
|
- PageIndex = _pageIndex,
|
|
|
- ExamIndexInPage = _examIndexInPage,
|
|
|
- CreateTime = DateTime.Now
|
|
|
- };
|
|
|
- db.AddExam(exam);
|
|
|
- //Back to page.
|
|
|
- await input.GoBackAsync();
|
|
|
- return input;
|
|
|
+ return inputs;
|
|
|
}
|
|
|
}
|
|
|
}
|