public async Task<ActionResult> SetNextStateAsync(AppUser creator, ProjectViewModel currentState) { try { var entityProcessors = new BaseProcessor[] { new InvoiceProcessor(_invoiceManager), new InvoicesCollectionProcessor(_invoiceManager) }; Company company = GetCompany(currentState.Company.Id); var project = currentState.Project != null ? currentState.Project : new Project { Id = Guid.NewGuid().ToString(), CreatedBy = creator, CreatedOn = DateTime.UtcNow, Company = company, CompanyId = company.Id, AccountingYear = DateTime.Now.Year, ActiveStateId = _workflowDefinition.GetWorkflowDefinition(company.Name).States.Values.First().Id }; var projectWorkflow = new ProjectWorkflow(project, _workflowDefinition, new ProjectStoreWorkflowManager(_dbContext), _userManager); projectWorkflow.ToBePaid = _invoiceManager.GetToBePaid(projectWorkflow.Id, projectWorkflow.GetStateModel<QuoteOfEntry>()?.AmountTTC); projectWorkflow.ToBeInvoiced = _invoiceManager.GetToBeInvoiced(projectWorkflow.Id, projectWorkflow.GetStateModel<QuoteOfEntry>()?.AmountTTC); projectWorkflow.InvoicesPaid = _invoiceManager.GetInvoicesPaid(projectWorkflow.Id); projectWorkflow.InvoicesToPay = _invoiceManager.GetInvoicesToPay(projectWorkflow.Id); projectWorkflow.InvoicesInLate = _invoiceManager.GetInvoicesInLate(projectWorkflow.Id); var nextState = projectWorkflow.NextStep(currentState.State, creator, async (parameters) => { foreach (var processor in entityProcessors) { if (processor.CanProcess(parameters.StateModel.GetType())) { await processor.ProcessAsync(parameters); } } }, async (alertsParameters) => { await _alertsManager.CreateOnSubmitAlertsAsync(alertsParameters.Project, alertsParameters.Transition, (State)alertsParameters.CurrentState, creator); await _alertsManager.CreateOnEnterAlertsAsync(alertsParameters.Project, alertsParameters.Transition, (State)alertsParameters.NextState, creator); }); if (nextState != null) { var result = new ProjectViewModel { Company = company, Project = projectWorkflow, State = nextState, ModelType = nextState.GetModel().GetType().FullName, FinishedStates = GetFinishedStates(project.Id, projectWorkflow.States.Cast<State>()), }; if (currentState != null && currentState.State != null) { _historyManager.LogInfo(projectWorkflow.Id, result.FinishedStates.LastOrDefault()?.Transition?.Id, new { FromState = currentState.State, ToState = nextState, Model = (projectWorkflow.States.FirstOrDefault(s => s.Id == currentState.State.Id)?.Model as BaseStateModel)?.ToDictionary().Select(k => new Tuple<string, object>(k.Key, k.Value)) }, EventType.ProjectStateChanged, creator); } UpdateAggregatedList(project.Id); return ActionResult<ProjectViewModel>.Success(result); } else if (projectWorkflow.States.Last().Id == currentState.State.Id) { project = Query().First(p => p.Id == project.Id); project.IsArchived = true; _dbContext.SaveChanges(); var result = new ProjectViewModel { Project = new ProjectWorkflow(project, _workflowDefinition, new ProjectStoreWorkflowManager(_dbContext), _userManager), }; UpdateAggregatedList(project.Id); return ActionResult<ProjectViewModel>.Success(result); } throw new InvalidOperationException($"Cannot process state {currentState.State.Id}"); } catch (Exception ex) { try { ex.Data.Add("creator", JsonConvert.SerializeObject(creator)); ex.Data.Add("currentState", JsonConvert.SerializeObject(currentState)); } catch { } return ActionResult.Failed(ex); } }
public async Task<ActionResult> UpdateStateAsync(AppUser creator, ProjectViewModel currentState = null) { try { Company company = GetCompany(currentState.Company.Id); if (currentState.Project == null) { return ActionResult.Failed("Project was not created"); } var entityProcessors = new BaseProcessor[] { new InvoiceProcessor(_invoiceManager), new InvoicesCollectionProcessor(_invoiceManager) }; var projectWorkflow = new ProjectWorkflow(currentState.Project, _workflowDefinition, new ProjectStoreWorkflowManager(_dbContext), _userManager); projectWorkflow.UpdateState(currentState.State, creator, async (parameters) => { foreach (var processor in entityProcessors) { if (processor.CanProcess(parameters.StateModel.GetType())) { await processor.ProcessAsync(parameters); } } }); var result = new ProjectViewModel { Company = company, Project = projectWorkflow, State = projectWorkflow.States.OfType<State>().FirstOrDefault(s => s.Id == currentState.State.Id), ModelType = _workflowDefinition.GetWorkflowDefinition(company.Name).States[currentState.State.Id].GetModel().GetType().FullName, FinishedStates = currentState.FinishedStates, }; UpdateAggregatedList(currentState.Project.Id); if (currentState != null && currentState.State != null) { _historyManager.LogInfo(currentState.Project.Id, null, new { FromState = currentState.State, ToState = currentState.State, Model = (projectWorkflow.States.FirstOrDefault(s => s.Id == currentState.State.Id)?.Model as BaseStateModel)?.ToDictionary().Select(k => new Tuple<string, object>(k.Key, k.Value)) }, (EventType)99, creator); } return ActionResult<ProjectViewModel>.Success(result); } catch (Exception ex) { return ActionResult.Failed(ex); } }
static void Main(string[] args) { var config = new Config { Name = "zhanqi", ScanUrls = "http://www.zhanqi.tv/api/static/v2.1/live/list/200/1.json", Fields = new[] { new Field { Name = "title", Selectortype = SelectorType.JsonPath, Selector = "$.title" }, new Field { Name = "username", Selectortype = SelectorType.JsonPath, Selector = "$.nickname" }, new Field { Name = "online", Selectortype = SelectorType.JsonPath, Selector = "$.online", Type = FieldType.Int, }, new Field { ////*[@id="js-room-anchor-info-area"]/div[2]/div[1]/div/span[1] Name = "fanscount", Selectortype = SelectorType.Regex, Selector = "js-room-follow-num\">([0-9]*)<", Type = FieldType.Int, }, new Field { Name = "cate", Selector = "$.newGameName", Selectortype = SelectorType.JsonPath }, new Field { Name = "childcate", Selector = "$.gameName", Selectortype = SelectorType.JsonPath } }, RepeatWhen = RepeatWhenEver.hour, RepeatAt = new TimeSpan(0, 10, 0), }; crawler = new CrawlerDotNet.Core.Crawler(); var curPage = 1; crawler.BeforeCrawl = () => { curPage = 1; }; crawler.Downloader.AfterDownloadPage = p => { //是不是有数据.有数据加入下一个json var rooms = p.GetJson("$.data.rooms"); if (rooms != "[]") { curPage++; crawler.Schduler.AddUrl($"http://www.zhanqi.tv/api/static/v2.1/live/list/200/{curPage}.json"); } }; crawler.Processor.OnCustomExtract = p => { var j = JObject.Parse(p.Html); var jr = JArray.FromObject(j["data"]["rooms"]); for (int i = 0; i < jr.Count; i++) { var exres = new ExtractResults(); var info = jr[i]; foreach (var f in config.Fields) { if (f.Name == "fanscount") { //请求订阅 var fanspage = crawler.Downloader.DownloaderOnly(new Request(crawler.Schduler) { Url = "https://www.zhanqi.tv" + info.SelectToken("$.url").ToString() }); var r = BaseProcessor.DoRegex(fanspage.Html, f); if (r.Value == "") { r.Value = "0"; } exres.Add(r); continue; } var res = new Result(f.Name, info.SelectToken(f.Selector).ToString()); exres.Add(res); } p.Results.Add(exres); } }; crawler.Setup(config); crawler.Start(); Console.WriteLine("end"); Console.ReadKey(); }
/// <summary> /// Adds processor to the provider. /// </summary> /// <param name="tracerProviderBuilder">TracerProviderBuilder instance.</param> /// <param name="processor">Activity processor to add.</param> /// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns> public static TracerProviderBuilder AddProcessor(this TracerProviderBuilder tracerProviderBuilder, BaseProcessor <Activity> processor) { if (tracerProviderBuilder is TracerProviderBuilderSdk tracerProviderBuilderSdk) { tracerProviderBuilderSdk.AddProcessor(processor); } return(tracerProviderBuilder); }
static void Main(string[] args) { #region c var c = new Config { Name = "panda", ScanUrls = "https://www.panda.tv/live_lists?status=2&order=person_num&token=&pageno=1&pagenum=120", ContentUrlRegexes = new Regex("live_lists"), HelperUrlRegexes = new Regex("789987"), Fields = new[] { new Field { Name = "title", Selectortype = SelectorType.JsonPath, Selector = "$.name" }, new Field { Name = "username", Selectortype = SelectorType.JsonPath, Selector = "$.userinfo.nickName" }, new Field { Name = "online", Selectortype = SelectorType.JsonPath, Selector = "$.person_num", Type = FieldType.Int, }, new Field { Name = "fanscount", Selectortype = SelectorType.JsonPath, Selector = "$.data.fans", Type = FieldType.Int, }, new Field { Name = "cate", Selector = "$.classification.cname", Selectortype = SelectorType.JsonPath } }, RepeatAt = new TimeSpan(0, 30, 0), }; #endregion crawler = new Crawler(); ////https://www.panda.tv/room_followinfo?token=&roomid=1042806&_=1509522885105 //https://www.panda.tv/1042806 //https://www.panda.tv/live_lists?status=2&order=person_num&token=&pageno=3&pagenum=120&_=1509525309865 crawler.Processor.OnCustomExtract = p => { var j = JObject.Parse(p.Html); for (int i = 0; i < 120; i++) { var roominfo = j.SelectToken($"$.data.items[{i}]"); if (roominfo == null) { break; } var exres = new ExtractResults(); foreach (var f in c.Fields) { if (f.Name == "fanscount") { //请求订阅 var fanspage = crawler.Downloader.DownloaderOnly(new Request(crawler.Schduler) { Url = "https://www.panda.tv/room_followinfo?token=&roomid=" + roominfo.SelectToken("$.id").ToString() }); var r = BaseProcessor.DoJson(fanspage.Html, f); exres.Add(r); continue; } var res = new Result(f.Name, roominfo.SelectToken(f.Selector).ToString()); exres.Add(res); } p.Results.Add(exres); } }; crawler.Processor.OnProcessScanPage = p => { //*[@id="pages-container"]/div/div/a[7] var total = int.Parse(p.GetJson("$.data.total")); var pageconut = total / 120 + (total % 120 > 0 ? 1 : 0); #if DEBUG pageconut = 1; #endif for (int i = 1; i <= pageconut; i++) { crawler.Schduler.AddUrl($"https://www.panda.tv/live_lists?status=2&order=person_num&token=&pageno={i}&pagenum=120"); } }; crawler.Setup(c); crawler.Start(); Console.ReadLine(); }
public MyFilteringProcessor(BaseProcessor <Activity> processor, Func <Activity, bool> filter) { this.filter = filter ?? throw new ArgumentNullException(nameof(filter)); this.processor = processor ?? throw new ArgumentNullException(nameof(processor)); }
public void SetValue(BaseProcessor obj) { PropertyInfo pi = obj.GetType().GetProperty(this.PropertyName); pi.SetValue(obj, this.ToObject(), null); }