B_TeamStatisticsJob.cs 7.8 KB

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