public static int Save(Market m)
		{
			var ctx = new AutoNewsEntities();
			if (m.Id == 0)
			{
				if (ctx.Markets.Count(o => (o.Name == m.Name && o.MarketTypeId == m.MarketTypeId) || o.MarketCrmId == m.MarketCrmId) > 0)
				{
					throw new Exception("名称或CRM ID已存在!");
				}
				ctx.Markets.Add(m);
				return 1;
			}
			
			//id != 0
            if (ctx.Markets.Count(o => ((o.Name == m.Name && o.MarketTypeId == m.MarketTypeId) || o.MarketCrmId == m.MarketCrmId) && o.Id != m.Id) > 0)
			{
				throw new Exception("名称或CRM ID已存在!");
			}
			var market = ctx.Markets.Single(o => o.Id == m.Id);
			market.Auto = m.Auto;
			market.EndTime = m.EndTime;
			market.MarketCrmId = m.MarketCrmId;
			market.Name = m.Name;
			market.StartTime = m.StartTime;
			ctx.SaveChanges();
			return 2;
		}
		public void LoadMarkets(int marketTypeId)
		{
			using (var ctx = new AutoNewsEntities())
			{
				Markets = ctx.Markets.Where(o => o.MarketTypeId == marketTypeId).ToList();
			}
		}
		private void RunPlanedCrawler(object sender, EventArgs e)
		{
			//
			try
			{
				using (var ctx = new AutoNewsEntities())
				{
					//get the markets to run crawlers according to the start time
					var nowTime = TimeSpan.Parse(DateTime.Now.ToShortTimeString());
					var crawlers2Run = ctx.Markets.Where(o => o.Auto && o.StartTime <= nowTime && (o.EndTime == null || o.EndTime > nowTime)).ToList();

					//if the market is not in the list, then put it into the list;
					foreach (var market in crawlers2Run)
					{
						if (CrawlTasks.All(o => o.Market.Id != market.Id))
						{
							CrawlTasks.Add(new CrawlTask
							{
								Market = market,
								Status = CrawlTaskStatus.Pending,
								IsContinueing = true,
								TheTask = null
							});
						}
					}

					//Handle the finish and aborted: if now is within end time, then set it to pending
					var finishedTasks = CrawlTasks.Where(o => o.Status == CrawlTaskStatus.Finished || o.Status == CrawlTaskStatus.Aborted);
					foreach (var finishedTask in finishedTasks)
					{
						if ((finishedTask.Market.EndTime == null || finishedTask.Market.EndTime.Value > nowTime) && finishedTask.Market.StartTime <= nowTime)
						{
							finishedTask.Status = CrawlTaskStatus.Pending;
						}
					}

					//run the pending tasks
					var markets2Crawl = CrawlTasks.Where(o => o.Status == CrawlTaskStatus.Pending).ToList();
					foreach (var crawlTask in markets2Crawl)
					{
						CrawlTask ctask = crawlTask;
						ctask.Status = CrawlTaskStatus.Running;
						var t = new Task(() => RunMarketCrawler(ctask));
						ctask.TheTask = t;
						t.Start();
					}

					//remove the timeout task
					var timeoutTasksCount = CrawlTasks.RemoveAll(o => ((o.Market.EndTime != null && o.Market.EndTime < nowTime) || (o.Market.StartTime != null && o.Market.StartTime > nowTime)) && o.Status != CrawlTaskStatus.Pending && o.Status != CrawlTaskStatus.Running);

					//todo ? : restart the failed task the push back the end time by 5 minutes

				}
			}
			catch (Exception)
			{
			}
			
		}
Exemple #4
0
		public static void RegLastUpdated(int id, DateTime updated)
		{
			using (var ctx = new AutoNewsEntities())
			{
				var news = ctx.News.Single(o => o.Id == id);
				news.Updated = updated;
				ctx.SaveChanges();
			}
		}
		public MainWindowVM()
		{
			using (var ctx = new AutoNewsEntities())
			{
				_marketTypes = ctx.MarketTypes.ToList();
				_markets = new List<Market>();
				_newses = new List<News>();
			}
		}
		public List<ICrawler> GetCrawlers(int marketId)
		{
			var result = new List<ICrawler>();
			using (var ctx = new AutoNewsEntities())
			{
				var crawlers = ctx.Crawlers.Where(o => o.MarketId == marketId).ToList();
				foreach (var crawler in crawlers)
				{
					Type t = Type.GetType(crawler.Name);
					if (t != null)
					{
						result.Add((ICrawler) Activator.CreateInstance(t, null));
					}
				}

				return result;
			}
		}
Exemple #7
0
		public static void Save(News n)
		{
			//if id = 0 then add new News; else update existed news according to the id
			using (var ctx = new AutoNewsEntities())
			{
				if (n.Id == 0)
				{
					ctx.News.Add(n);
				}
				else
				{
					var existedNews = ctx.News.Single(o => o.Id == n.Id);
					existedNews.MarketId = n.MarketId;
					existedNews.Name = n.Name;
					existedNews.ProductId = n.ProductId;
				}
				ctx.SaveChanges();
			}
		}
		public static bool SavePrice(Price p)
		{
			//get the news id by price token and market_crm_id
			using (var ctx = new AutoNewsEntities())
			{
				if (ctx.Prices.Count(o => o.Token == p.Token && o.Date == p.Date && o.MarketCrmId == p.MarketCrmId) > 0)
				{
					//existed
					return false;
				}

				var n = ctx.News.Include("Market").SingleOrDefault(o => o.Name == p.Token && o.Market.MarketCrmId == p.MarketCrmId);
				if (n != null)
				{
					p.NewsId = n.Id;
				}
				else
				{
					var m = ctx.Markets.Single(o => o.MarketCrmId == p.MarketCrmId);
					var nn = new News
						{
							Name = p.Token,
							MarketId = m.Id,
							Updated = DateTime.Now
						};
					nn =ctx.News.Add(nn);
					p.NewsId = nn.Id;
				}

				ctx.Prices.Add(p);

				if (n != null && n.ProductId != null)
				{
					LogHelper.AddLog(n.Name + "已更新", n.MarketId, "success");
					n.Updated = DateTime.Now;
				}

				ctx.SaveChanges();
				return true;
			}
		}
		public MarketEditorVM(int marketTypeId, int marketId = 0)
		{
			MarketId = marketId;
			MarketTypeId = marketTypeId;
			var ctx = new AutoNewsEntities();
			var marketType = ctx.MarketTypes.Single(o => o.Id == marketTypeId);

			if (MarketId > 0)
			{
				Title = "编辑市场";
				
				var m = ctx.Markets.Single(o => o.Id == MarketId);
				_name = m.Name;
				_crmId = m.MarketCrmId;
				_auto = m.Auto;
				_startTime = m.StartTime;
				_endTime = m.EndTime;
			}
			else
			{
				Title = "新增市场";
				_auto = false;
			}
			
			Title += "-" + marketType.Name;

		}
		public void LoadNews(int marketId)
		{
			using (var ctx = new AutoNewsEntities())
			{
				Newses = ctx.News.Where(o => o.MarketId == marketId).ToList();
			}
		}