B_MakeBallRankingJob.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  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 Newtonsoft.Json;
  8. using Quartz;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Diagnostics;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Threading;
  15. using System.Threading.Tasks;
  16. namespace FCS.Crawler.Basketball
  17. {
  18. /// <summary>
  19. /// 篮球让球盘路
  20. /// </summary>
  21. public class B_MakeBallRankingJob : CommonJob, IJob
  22. {
  23. private List<B_MakeBallRanking> MakeBallRankingList = new List<B_MakeBallRanking>();
  24. private List<B_MakeBallRanking> CBAMakeBallRankingList = new List<B_MakeBallRanking>();
  25. private List<DataItemDetail> DateItem = new List<DataItemDetail>();
  26. private List<B_Team> TeamList = new List<B_Team>();
  27. B_MakeBallRanking g;
  28. private string cbaEventId = "";
  29. private string nbaEventId = "";
  30. public B_MakeBallRankingJob()
  31. {
  32. g = new B_MakeBallRanking();
  33. cbaEventId = services.Query<B_Events>("and Name ='CBA赛事'", "").FirstOrDefault().Id;
  34. nbaEventId = services.Query<B_Events>("and Name ='NBA赛事'", "").FirstOrDefault().Id;
  35. }
  36. public void Execute(IJobExecutionContext context)
  37. {
  38. Config = CommonHelper.GetConfigFromDataMap(context.JobDetail.JobDataMap);
  39. }
  40. #region NBA
  41. #region 更新数据
  42. /// <summary>
  43. /// 获取所有数据
  44. /// </summary>
  45. public void GetAll()
  46. {
  47. GetSqlString("");
  48. }
  49. /// <summary>
  50. /// 更新数据
  51. /// </summary>
  52. /// <param name="Year"></param>
  53. public void Click(string Year = "")
  54. {
  55. if (Year == "")
  56. {
  57. Year = DateTime.Now.Year.ToString().Substring(2, 2); ;
  58. }
  59. GetSqlString(Year);
  60. GetAll_CBA();
  61. }
  62. #endregion
  63. /// <summary>
  64. /// 解析数据
  65. /// </summary>
  66. /// <param name="sqlstring"></param>
  67. private void GetSqlString(string Year)
  68. {
  69. var dataItem = services.GetDataItem(DataItemDetailEnum.FootBallMakeBallType);
  70. TeamList = services.Query<B_Team>().ToList();
  71. var ds = services.Query<B_Grouping>(" and EventId='" + nbaEventId + "' and Remark is not null", "", "distinct EventId,Season,Remark").ToList();
  72. if (Year != "")
  73. {
  74. ds = services.Query<B_Grouping>(" and EventId='" + nbaEventId + "' and Remark is not null and Season like '%" + Year + "%'", "", "distinct EventId,Season,Remark").ToList();
  75. }
  76. int max = ds.Count;
  77. int num = 0;
  78. ds.ForEach(async p =>
  79. {
  80. await Task.Run(() =>
  81. {
  82. var eventId = p.EventId;
  83. var season = p.Season;
  84. var url = p.Remark.ToString().Replace("saiAll.do", "1/letPlateBall.do");
  85. GetData(url, eventId, season, dataItem.Where(o => o.ItemValue == "1").First().Id.ToString());
  86. url = p.Remark.ToString().Replace("saiAll.do", "2/letPlateBall.do");
  87. GetData(url, eventId, season, dataItem.Where(o => o.ItemValue == "2").First().Id.ToString());
  88. url = p.Remark.ToString().Replace("saiAll.do", "3/letPlateBall.do");
  89. GetData(url, eventId, season, dataItem.Where(o => o.ItemValue == "3").First().Id.ToString());
  90. });
  91. lock (g)
  92. {
  93. num++;
  94. Monitor.Pulse(g); //完成,通知等待队列,告知已完,执行下一个。
  95. }
  96. });
  97. lock (g)
  98. {
  99. while (num < max)
  100. {
  101. Monitor.Wait(g);//等待
  102. }
  103. }
  104. Trace.WriteLine("获取B_MakeBallRanking 完结");
  105. try
  106. {
  107. if (Year != "")
  108. {
  109. services.Delete<B_MakeBallRanking>("and EventId='" + nbaEventId + "' and Season like '%" + Year + "%'");
  110. }
  111. services.SqlBulkCopyAdd<B_MakeBallRanking>(MakeBallRankingList);
  112. }
  113. catch (Exception ex)
  114. {
  115. throw;
  116. }
  117. }
  118. /// <summary>
  119. /// 解析排行榜数据
  120. /// </summary>
  121. /// <param name="url"></param>
  122. /// <param name="eventId"></param>
  123. /// <param name="season"></param>
  124. private void GetData(string url, string eventId, string season, string makeBallType)
  125. {
  126. HtmlParameterDTO dtomodel = new HtmlParameterDTO();
  127. dtomodel.Url = url;
  128. HtmlDocument doc = CommonHelper.GetHtmlHtmlDocument(dtomodel);
  129. if (doc.DocumentNode.InnerHtml == "Termination" || doc.DocumentNode.InnerHtml == "" || doc.DocumentNode.SelectNodes("//*[@class='paiming']") == null)
  130. {
  131. return;
  132. }
  133. var team = doc.DocumentNode.SelectNodes("//*[@class='paiming']").First();
  134. HtmlDocument itemdoc = new HtmlDocument();
  135. itemdoc.LoadHtml(team.InnerHtml);
  136. var trList = itemdoc.DocumentNode.SelectNodes("//table/tr").ToList();
  137. trList.ForEach(p =>
  138. {
  139. if (!p.InnerHtml.Contains("<th"))
  140. {
  141. HtmlDocument trdoc = new HtmlDocument();
  142. trdoc.LoadHtml(p.InnerHtml);
  143. var tdList = trdoc.DocumentNode.InnerHtml.Contains("td") ? trdoc.DocumentNode.SelectNodes("//td").ToList() : null;
  144. if (tdList != null && tdList.Count() > 1)
  145. {
  146. B_MakeBallRanking making = new B_MakeBallRanking();
  147. making.Id = Guid.NewGuid().ToString();
  148. making.Sort = int.Parse(tdList[0].InnerText.Trim().ToString());
  149. making.MakeBallType = makeBallType;
  150. 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 : "";
  151. making.EventId = eventId;
  152. making.Season = season;
  153. making.Sum = int.Parse(tdList[2].InnerText.Trim().ToString());
  154. making.UpDisc = int.Parse(tdList[3].InnerText.Trim().ToString());
  155. making.DownDisc = int.Parse(tdList[4].InnerText.Trim().ToString());
  156. making.WinDiscNum = int.Parse(tdList[5].InnerText.Trim().ToString());
  157. making.GoDiscNum = int.Parse(tdList[6].InnerText.Trim().ToString());
  158. making.TransportDiscNum = int.Parse(tdList[7].InnerText.Trim().ToString());
  159. making.NetDiscNum = int.Parse(tdList[8].InnerText.Trim().ToString());
  160. making.WinPercentage = tdList[9].InnerText.Trim().ToString();
  161. making.GoPercentage = tdList[10].InnerText.Trim().ToString();
  162. making.NegativePercentage = tdList[11].InnerText.Trim().ToString();
  163. making.Remark = tdList[1].InnerText.Trim().ToString();
  164. MakeBallRankingList.Add(making);
  165. }
  166. }
  167. });
  168. }
  169. #endregion
  170. #region CBA
  171. /// <summary>
  172. /// CBA所有数据
  173. /// </summary>
  174. public void GetAll_CBA()
  175. {
  176. GetCBAMakeBallRanking();
  177. services.Delete<B_MakeBallRanking>("and EventId='" + cbaEventId + "'");
  178. services.SqlBulkCopyAdd<B_MakeBallRanking>(CBAMakeBallRankingList);
  179. }
  180. /// <summary>
  181. /// 解析CBA js数据
  182. /// </summary>
  183. private void GetCBAMakeBallRanking()
  184. {
  185. int startyear = 5;
  186. int endtyear = DateTime.Now.AddYears(1).Year % 100;
  187. List<string> Years = new List<string>();
  188. //组装时间段
  189. while (startyear < endtyear)
  190. {
  191. int temp = startyear + 1;
  192. string Year = (startyear < 10 ? "0" + startyear.ToString() : startyear.ToString()) + "-" + (temp < 10 ? "0" + temp.ToString() : temp.ToString());
  193. Years.Add(Year);
  194. startyear++;
  195. }
  196. var dataItem = services.GetDataItem(DataItemDetailEnum.FootBallMakeBallType);
  197. //获取排行榜
  198. foreach (var item in Years)
  199. {
  200. var url = "http://nba.nowscore.com/jsData/letGoal/" + item + "/l5.js";
  201. var htmlResource = NetHelper.GetUrlResponse(url, Encoding.GetEncoding("utf-8")).Replace("&nbsp;", "");
  202. if (htmlResource.IsEmpty())
  203. return;
  204. var arrs = htmlResource.Split(';');
  205. var arrTeam = arrs[1].Split('=')[1];
  206. var TotalPanLu = arrs[2].Split('=')[1];
  207. var HomePanLu = arrs[3].Split('=')[1];
  208. var GuestPanLu = arrs[4].Split('=')[1];
  209. //球队数据
  210. var arrTeamList = JsonConvert.DeserializeObject<object[][]>(arrTeam).ToList();
  211. //总榜数据
  212. var TotalPanLuList = JsonConvert.DeserializeObject<object[][]>(TotalPanLu).ToList();
  213. //主场数据
  214. var HomePanLuList = JsonConvert.DeserializeObject<object[][]>(HomePanLu).ToList();
  215. //客场数据
  216. var GuestPanLuList = JsonConvert.DeserializeObject<object[][]>(GuestPanLu).ToList();
  217. #region 总榜
  218. var makeType = dataItem.Where(o => o.ItemValue == "1").First().Id.ToString();
  219. for (int i = 0; i < TotalPanLuList.Count(); i++)
  220. {
  221. var teamName = arrTeamList.Where(o => o[0].ToString() == TotalPanLuList[i][1].ToString()).Count() > 0 ? arrTeamList.Where(o => o[0].ToString() == TotalPanLuList[i][1].ToString()).FirstOrDefault()[1] : "";
  222. var teamId = services.Query<B_Team>("and Name ='" + teamName + "'", "").Count() > 0 ? services.Query<B_Team>("and Name ='" + teamName + "'", "").FirstOrDefault().Id : "";
  223. B_MakeBallRanking making = new B_MakeBallRanking();
  224. making.Id = Guid.NewGuid().ToString();
  225. making.Sort = int.Parse( TotalPanLuList[i][0].ToString());
  226. making.MakeBallType = makeType;
  227. making.TeamId = teamId;
  228. making.EventId = cbaEventId;
  229. making.Season = item;
  230. making.Sum = int.Parse(TotalPanLuList[i][2].ToString());
  231. making.UpDisc = int.Parse(TotalPanLuList[i][3].ToString());
  232. making.DownDisc = int.Parse(TotalPanLuList[i][4].ToString());
  233. making.WinDiscNum = int.Parse(TotalPanLuList[i][5].ToString());
  234. making.GoDiscNum = int.Parse(TotalPanLuList[i][6].ToString());
  235. making.TransportDiscNum = int.Parse(TotalPanLuList[i][7].ToString());
  236. making.NetDiscNum = int.Parse(TotalPanLuList[i][8].ToString());
  237. making.WinPercentage = TotalPanLuList[i][9].ToString();
  238. making.GoPercentage = TotalPanLuList[i][10].ToString();
  239. making.NegativePercentage = TotalPanLuList[i][11].ToString();
  240. making.Remark = url;
  241. CBAMakeBallRankingList.Add(making);
  242. }
  243. #endregion
  244. #region 主场
  245. makeType = dataItem.Where(o => o.ItemValue == "2").First().Id.ToString();
  246. for (int i = 0; i < HomePanLuList.Count(); i++)
  247. {
  248. var teamName = arrTeamList.Where(o => o[0].ToString() == HomePanLuList[i][1].ToString()).Count() > 0 ? arrTeamList.Where(o => o[0].ToString() == HomePanLuList[i][1].ToString()).FirstOrDefault()[1] : "";
  249. var teamId = services.Query<B_Team>("and Name ='" + teamName + "'", "").Count() > 0 ? services.Query<B_Team>("and Name ='" + teamName + "'", "").FirstOrDefault().Id : "";
  250. B_MakeBallRanking making = new B_MakeBallRanking();
  251. making.Id = Guid.NewGuid().ToString();
  252. making.Sort = int.Parse(HomePanLuList[i][0].ToString());
  253. making.MakeBallType = makeType;
  254. making.TeamId = teamId;
  255. making.EventId = cbaEventId;
  256. making.Season = item;
  257. making.Sum = int.Parse(HomePanLuList[i][2].ToString());
  258. making.UpDisc = int.Parse(HomePanLuList[i][3].ToString());
  259. making.DownDisc = int.Parse(HomePanLuList[i][4].ToString());
  260. making.WinDiscNum = int.Parse(HomePanLuList[i][5].ToString());
  261. making.GoDiscNum = int.Parse(HomePanLuList[i][6].ToString());
  262. making.TransportDiscNum = int.Parse(HomePanLuList[i][7].ToString());
  263. making.NetDiscNum = int.Parse(HomePanLuList[i][8].ToString());
  264. making.WinPercentage = HomePanLuList[i][9].ToString();
  265. making.GoPercentage = HomePanLuList[i][10].ToString();
  266. making.NegativePercentage = HomePanLuList[i][11].ToString();
  267. making.Remark = url;
  268. CBAMakeBallRankingList.Add(making);
  269. }
  270. #endregion
  271. #region 客场
  272. makeType = dataItem.Where(o => o.ItemValue == "3").First().Id.ToString();
  273. for (int i = 0; i < GuestPanLuList.Count(); i++)
  274. {
  275. var teamName = arrTeamList.Where(o => o[0].ToString() == GuestPanLuList[i][1].ToString()).Count() > 0 ? arrTeamList.Where(o => o[0].ToString() == GuestPanLuList[i][1].ToString()).FirstOrDefault()[1] : "";
  276. var teamId = services.Query<B_Team>("and Name ='" + teamName + "'", "").Count() > 0 ? services.Query<B_Team>("and Name ='" + teamName + "'", "").FirstOrDefault().Id : "";
  277. B_MakeBallRanking making = new B_MakeBallRanking();
  278. making.Id = Guid.NewGuid().ToString();
  279. making.Sort = int.Parse(GuestPanLuList[i][0].ToString());
  280. making.MakeBallType = makeType;
  281. making.TeamId = teamId;
  282. making.EventId = cbaEventId;
  283. making.Season = item;
  284. making.Sum = int.Parse(GuestPanLuList[i][2].ToString());
  285. making.UpDisc = int.Parse(GuestPanLuList[i][3].ToString());
  286. making.DownDisc = int.Parse(GuestPanLuList[i][4].ToString());
  287. making.WinDiscNum = int.Parse(GuestPanLuList[i][5].ToString());
  288. making.GoDiscNum = int.Parse(GuestPanLuList[i][6].ToString());
  289. making.TransportDiscNum = int.Parse(GuestPanLuList[i][7].ToString());
  290. making.NetDiscNum = int.Parse(GuestPanLuList[i][8].ToString());
  291. making.WinPercentage = GuestPanLuList[i][9].ToString();
  292. making.GoPercentage = GuestPanLuList[i][10].ToString();
  293. making.NegativePercentage = GuestPanLuList[i][11].ToString();
  294. making.Remark = url;
  295. CBAMakeBallRankingList.Add(making);
  296. }
  297. #endregion
  298. }
  299. }
  300. #endregion
  301. }
  302. }