예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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();
        }
예제 #4
0
        /// <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);
        }
예제 #5
0
        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));
 }
예제 #7
0
        public void SetValue(BaseProcessor obj)
        {
            PropertyInfo pi = obj.GetType().GetProperty(this.PropertyName);

            pi.SetValue(obj, this.ToObject(), null);
        }