B_MakeBallRankingJob.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. using FCS.Common;
  2. using FCS.Interface;
  3. using FCS.Models;
  4. using FCS.Models.DTO;
  5. using FCS.Models.Entity;
  6. using HtmlAgilityPack;
  7. using Quartz;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Diagnostics;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Threading;
  14. using System.Threading.Tasks;
  15. namespace FCS.Crawler.Basketball
  16. {
  17. /// <summary>
  18. /// 篮球让球盘路
  19. /// </summary>
  20. public class B_MakeBallRankingJob : CommonJob, IJob
  21. {
  22. private static List<B_MakeBallRanking> MakeBallRankingList = new List<B_MakeBallRanking>();
  23. private static List<DataItemDetail> DateItem = new List<DataItemDetail>();
  24. private static List<B_Team> TeamList = new List<B_Team>();
  25. public B_MakeBallRankingJob()
  26. {
  27. }
  28. public void Execute(IJobExecutionContext context)
  29. {
  30. Config = CommonHelper.GetConfigFromDataMap(context.JobDetail.JobDataMap);
  31. }
  32. #region 更新数据
  33. /// <summary>
  34. /// 获取所有数据
  35. /// </summary>
  36. public void GetAll()
  37. {
  38. GetSqlString("");
  39. }
  40. /// <summary>
  41. /// 更新数据
  42. /// </summary>
  43. /// <param name="Year"></param>
  44. public void Click(string Year = "")
  45. {
  46. if (Year == "")
  47. {
  48. Year = DateTime.Now.Year.ToString();
  49. }
  50. GetSqlString(Year);
  51. }
  52. #endregion
  53. /// <summary>
  54. /// 解析数据
  55. /// </summary>
  56. /// <param name="sqlstring"></param>
  57. private void GetSqlString(string Year)
  58. {
  59. ThreadPool.SetMinThreads(10, 10);
  60. ThreadPool.SetMaxThreads(500, 500);
  61. TeamList = services.Query<B_Team>().ToList();
  62. var dataItem = services.GetDataItem(DataItemDetailEnum.FootBallMakeBallType);
  63. var ds = services.Query<B_Grouping>("and Remark is not null", "", "distinct EventId,Season,Remark").ToList();
  64. if (Year != "")
  65. {
  66. ds = services.Query<B_Grouping>("and Remark is not null and Season like '%" + Year + "%'", "", "distinct EventId,Season,Remark").ToList();
  67. }
  68. Task.Run(() =>
  69. {
  70. foreach (var item in ds)
  71. {
  72. Task.Run(() =>
  73. {
  74. var eventId = item.EventId;
  75. var season = item.Season;
  76. var url = item.Remark.ToString().Replace("saiAll.do", "1/letPlateBall.do");
  77. GetData(url, eventId, season, dataItem.Where(o => o.ItemValue == "1").First().Id.ToString());
  78. url = item.Remark.ToString().Replace("saiAll.do", "2/letPlateBall.do");
  79. GetData(url, eventId, season, dataItem.Where(o => o.ItemValue == "2").First().Id.ToString());
  80. url = item.Remark.ToString().Replace("saiAll.do", "3/letPlateBall.do");
  81. GetData(url, eventId, season, dataItem.Where(o => o.ItemValue == "3").First().Id.ToString());
  82. });
  83. }
  84. });
  85. int maxWorkerThreads, workerThreads;
  86. int maxportThreads, portThreads;
  87. while (true)
  88. {
  89. /*
  90. GetAvailableThreads():检索由 GetMaxThreads 返回的线程池线程的最大数目和当前活动数目之间的差值。
  91. 而GetMaxThreads 检索可以同时处于活动状态的线程池请求的数目。
  92. 通过最大数目减可用数目就可以得到当前活动线程的数目,如果为零,那就说明没有活动线程,说明所有线程运行完毕。
  93. */
  94. ThreadPool.GetMaxThreads(out maxWorkerThreads, out maxportThreads);
  95. ThreadPool.GetAvailableThreads(out workerThreads, out portThreads);
  96. Thread.Sleep(1000);
  97. Trace.WriteLine("正在执行任务的线程数" + (maxWorkerThreads - workerThreads));
  98. if (maxWorkerThreads - workerThreads == 0)
  99. {
  100. Console.WriteLine("Thread Finished!");
  101. break;
  102. }
  103. }
  104. try
  105. {
  106. if (Year != "")
  107. {
  108. services.Delete<B_MakeBallRanking>(" and Season like '" + Year + "%'");
  109. }
  110. services.SqlBulkCopyAdd<B_MakeBallRanking>(MakeBallRankingList);
  111. }
  112. catch (Exception ex)
  113. {
  114. throw;
  115. }
  116. }
  117. /// <summary>
  118. /// 解析排行榜数据
  119. /// </summary>
  120. /// <param name="url"></param>
  121. /// <param name="eventId"></param>
  122. /// <param name="season"></param>
  123. private void GetData(string url, string eventId, string season, string makeBallType)
  124. {
  125. HtmlParameterDTO dtomodel = new HtmlParameterDTO();
  126. dtomodel.Url = url;
  127. HtmlDocument doc = CommonHelper.GetHtmlHtmlDocument(dtomodel);
  128. if (doc.DocumentNode.InnerHtml == "Termination" || doc.DocumentNode.InnerHtml == "" || doc.DocumentNode.SelectNodes("//*[@class='paiming']") == null)
  129. {
  130. return;
  131. }
  132. var team = doc.DocumentNode.SelectNodes("//*[@class='paiming']").First();
  133. HtmlDocument itemdoc = new HtmlDocument();
  134. itemdoc.LoadHtml(team.InnerHtml);
  135. var trList = doc.DocumentNode.SelectNodes("//*[@class='paiming']/table/tr").ToList();
  136. trList.ForEach(p =>
  137. {
  138. if (!p.InnerHtml.Contains("<th"))
  139. {
  140. HtmlDocument trdoc = new HtmlDocument();
  141. trdoc.LoadHtml(p.InnerHtml);
  142. var tdList = trdoc.DocumentNode.SelectNodes("//td").ToList();
  143. if (tdList.Count() > 1)
  144. {
  145. B_MakeBallRanking making = new B_MakeBallRanking();
  146. making.Id = Guid.NewGuid().ToString();
  147. making.Sort = int.Parse(tdList[0].InnerText.Trim().ToString());
  148. making.MakeBallType = makeBallType;
  149. making.TeamId = TeamList.Where(o => o.Name == tdList[1].InnerText.Trim().ToString()).Count() > 0 ? TeamList.Where(o => o.Name == tdList[1].InnerText.Trim().ToString()).FirstOrDefault().Id : "";
  150. making.EventId = eventId;
  151. making.Season = season;
  152. making.Sum = int.Parse(tdList[2].InnerText.Trim().ToString());
  153. making.UpDisc = int.Parse(tdList[3].InnerText.Trim().ToString());
  154. making.DownDisc = int.Parse(tdList[4].InnerText.Trim().ToString());
  155. making.WinDiscNum = int.Parse(tdList[5].InnerText.Trim().ToString());
  156. making.GoDiscNum = int.Parse(tdList[6].InnerText.Trim().ToString());
  157. making.TransportDiscNum = int.Parse(tdList[7].InnerText.Trim().ToString());
  158. making.NetDiscNum = int.Parse(tdList[8].InnerText.Trim().ToString());
  159. making.WinPercentage = tdList[9].InnerText.Trim().ToString();
  160. making.GoPercentage = tdList[10].InnerText.Trim().ToString();
  161. making.NegativePercentage = tdList[11].InnerText.Trim().ToString();
  162. making.Remark = tdList[1].InnerText.Trim().ToString();
  163. MakeBallRankingList.Add(making);
  164. }
  165. }
  166. });
  167. }
  168. }
  169. }