GamesDetailsJob.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Configuration;
  4. using System.Diagnostics;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Text.RegularExpressions;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. using FCS.Common;
  11. using FCS.Crawler.ZCLotteryIP;
  12. using FCS.Interface;
  13. using FCS.Models;
  14. using HtmlAgilityPack;
  15. using Quartz;
  16. namespace FCS.Crawler.ZCLotteryGames
  17. {
  18. public class GamesDetailsJob : CommonJob, IJob
  19. {
  20. private Dictionary<string, int> detailDict;//比赛类型关系
  21. private List<DataItemDetail> detailType;//比赛类型
  22. private List<F_Players> playersList;//球员信息
  23. private static object locker = new object();
  24. private static List<F_GamesDetails> result = new List<F_GamesDetails>();
  25. private static string homeTeamName = "zhudui";
  26. public GamesDetailsJob()
  27. {
  28. //new IPJob().GetIP();
  29. playersList = services.Query<F_Players>().ToList();
  30. detailType = services.GetDataItem(DataItemDetailEnum.FootBallDetailType);
  31. // < !--1 : 入球, 2 : 红牌, 3 : 黄牌, 7 : 点球, 8 : 乌龙, 9 : 两黄变红1111111-- >
  32. detailDict = new Dictionary<string, int> {
  33. {"1",1 },{"3",5 },
  34. {"2",6 },{"7",2 },
  35. {"8",3 },{"9",6 },
  36. {"11",9 }
  37. };
  38. }
  39. public void Execute(IJobExecutionContext context)
  40. {
  41. Config = CommonHelper.GetConfigFromDataMap(context.JobDetail.JobDataMap);
  42. Click();
  43. }
  44. public void Click(string mainUrl = "http://fenxi.zgzcw.com")
  45. {
  46. var gamesList = services.Query<F_Games>(@" AND DateName(year,GetDate())=datename(year,StartDateTime)
  47. AND DateName(month, GetDate()) = datename(month, StartDateTime)
  48. AND DateName(day, GetDate()) = datename(day, StartDateTime)").ToList();
  49. var gamesDetailsList = services.Query<F_GamesDetails>(@"
  50. AND DateName(year,GetDate())=datename(year,b.StartDateTime)
  51. AND DateName(month, GetDate()) = datename(month, b.StartDateTime)
  52. AND DateName(day, GetDate()) = datename(day, b.StartDateTime)
  53. ", @"JOIN F_Games b ON a.GameId =b.Id") ?? new List<F_GamesDetails>();
  54. threadCount = gamesList.Count;
  55. gamesList.ForEach(p =>
  56. {
  57. Analysis(p);
  58. });
  59. lock (locker)
  60. {
  61. while (finishcount != threadCount)
  62. {
  63. Thread.Sleep(5000);
  64. Monitor.Wait(locker);//等待
  65. }
  66. }
  67. var data = new List<F_GamesDetails>();
  68. var addList = (from a in result
  69. where !(from b in gamesDetailsList orderby b.GameId select b.GameId).Contains(a.GameId)
  70. orderby a.GameId
  71. select a).ToList();
  72. data = data.Concat(addList).ToList();
  73. addList = (from a in result
  74. where !(from b in gamesDetailsList where a.GameId == b.GameId orderby b.GameId select b.Minutes).Contains(a.Minutes)
  75. && (from b in gamesDetailsList where a.GameId == b.GameId orderby b.GameId select b.GameId).Contains(a.GameId)
  76. orderby a.GameId
  77. select a).ToList();
  78. data = data.Concat(addList).ToList();
  79. services.SqlBulkCopyAdd(data);
  80. }
  81. public void GetALL(string mainUrl = "http://fenxi.zgzcw.com")
  82. {
  83. var gamesList = services.Query<F_Games>("AND (Season LIKE '{0}%' or Season LIKE '%{1}%')".FormatMe(DateTime.Now.Year, DateTime.Now.AddYears(1).Year)).ToList();
  84. var result = new List<F_GamesDetails>();
  85. // var _gamesList = gamesList.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
  86. gamesList.ForEach(p =>
  87. {
  88. Analysis(p);
  89. });
  90. while (true)
  91. {
  92. if (CommonHelper.ThreadsFinsh())
  93. break;
  94. }
  95. services.SqlBulkCopyAdd(result);
  96. }
  97. private async Task Analysis(F_Games p, string mainUrl = "http://fenxi.zgzcw.com")
  98. {
  99. await Task.Run(() =>
  100. {
  101. try
  102. {
  103. var number = p.Remark.Split('/')[p.Remark.Split('/').ToList().Count - 2];
  104. var url = mainUrl + "/" + number + "/zrtj";
  105. Trace.WriteLine("URL:" + url);
  106. var doc = CommonHelper.GetHtml(url, "足彩");
  107. var jstj = doc.DocumentNode.SelectSingleNode(".//div[@class='jstj']");
  108. if (jstj != null)
  109. {
  110. var li = jstj.SelectNodes(".//li");
  111. if (li != null)
  112. foreach (HtmlNode item in li)
  113. {
  114. var liclassList = item.Attributes["data"].Value.Split(',').ToList();
  115. var detail = string.Empty;
  116. if (detailDict.ContainsKey(liclassList[1]))
  117. detail = detailType.Where(q => q.ItemValue == detailDict[liclassList[1]].ToString()).ToList()[0].Id;
  118. else
  119. continue;
  120. lock (locker)
  121. {
  122. result.Add(new F_GamesDetails
  123. {
  124. Id = CommonHelper.GetGuid().ToString(),
  125. CreateDateTime = DateTime.Now,
  126. GameId = p.Id,
  127. Minutes = int.Parse(liclassList[0]),
  128. // PlayerId = playerId,
  129. DetailType = detail,
  130. Describe = liclassList[2],
  131. IsHomeTeam = item.ParentNode.Attributes["class"].Value == homeTeamName ? true : false
  132. });
  133. }
  134. }
  135. }
  136. }
  137. finally
  138. {
  139. lock (locker)
  140. {
  141. finishcount++;
  142. Monitor.Pulse(locker); //完成,通知等待队列,告知已完,执行下一个。
  143. }
  144. }
  145. });
  146. }
  147. }
  148. }