using System;
using FCS.Common;
using FCS.Interface;
using FCS.Models;
using FCS.Models.Entity;
using HtmlAgilityPack;
using Quartz;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using FCS.Crawler.ZCLotteryMatchs;
using System.Configuration;
using FCS.Models.DTO;
namespace FCS.Crawler.Basketball
{
///
/// 篮球球员统计
///
public class B_PlayersStatisticsJob : CommonJob
{
private Dictionary groupDict_NBA;//分组配置
private Dictionary typeDict_NBA; //类型配置
private string groupType_NBA = "_groupType";//用以得分替换字段
private string season_NBA = "_season";//用以得分替换字段
private string eventId;//获取赛事编码
private List groupList;//分组
private List teamList;//球队
private List playerList;//球员
private List result = new List();
public B_PlayersStatisticsJob()
{
#region 篮球的页面与服务器的数据关联
var zUrl_NBA = "http://lanqiu.zgzcw.com";//主域名
var hUrl_NBA = "?source_league_id=1&season={0}&type={1}".FormatMe(season_NBA, groupType_NBA);//公共域名参数配置
groupDict_NBA = new Dictionary
{
{"季前赛","1" }, {"常规赛","2" }, {"季后赛","3" },
};
typeDict_NBA = new Dictionary
{
{ "得分",zUrl_NBA+"/1/17-18/{0}/playerStatistics.do".FormatMe(groupType_NBA)},
{ "投篮",zUrl_NBA+"/nba/playerShoot.action"+hUrl_NBA},
{ "三分",zUrl_NBA+"/nba/playerThreeShoot.action"+hUrl_NBA},
{ "罚球",zUrl_NBA+"/nba/playerPenaltyShoot.action"+hUrl_NBA},
{ "篮板",zUrl_NBA+"/nba/playerBackboard.action"+hUrl_NBA},
{ "助攻",zUrl_NBA+"/nba/playerHelp.action"+hUrl_NBA},
{ "盖帽",zUrl_NBA+"/nba/playerCover.action"+hUrl_NBA},
{ "抢断",zUrl_NBA+"/nba/playerRob.action"+hUrl_NBA},
{ "失误",zUrl_NBA+"/nba/playerMiss.action"+hUrl_NBA},
{ "犯规",zUrl_NBA+"/nba/playerFoul.action"+hUrl_NBA},
{ "两双",zUrl_NBA+"/nba/playerDouble.action"+hUrl_NBA},
{ "三双",zUrl_NBA+"/nba/playerThree.action"+hUrl_NBA}
};
#endregion
}
public void Click()
{
Click_NBA();
}
///
/// 获取所有数据
///
public void GetAll_NBA()
{
GetSqlData_NBA();
//获取NBA的分组
groupList = services.Query(" AND ParentId IS NULL AND EventId='{0}'".FormatMe(eventId), "", "distinct Id,Season,Name").ToList();
groupList.ForEach(p =>
{
Analysis_NBA(p);
});
while (true)
{
if (CommonHelper.ThreadsFinsh())
break;
}
services.SqlBulkCopyAdd(result);
}
///
/// 更新数据
///
///
public void Click_NBA(string Year = "")
{
GetSqlData_NBA();
//获取NBA的分组
groupList = services.Query(
" AND ParentId IS NULL AND EventId='{0}' AND Season LIKE '%{1}%' ".FormatMe(eventId, DateTime.Now.Year.ToString().Substring(2)), "", "distinct Id,Season,Name").ToList();
groupList.ForEach(p =>
{
Analysis_NBA(p);
});
Thread.Sleep(3000);
Task.WaitAll(taskList.ToArray());
var deleteWhere = "";
groupList.ForEach(p =>
{
deleteWhere += "'" + p.Id + "',";
});
deleteWhere = deleteWhere.ToString().Substring(0, deleteWhere.ToString().Length - 1);
services.Delete(" AND GroupingId IN ({0})".FormatMe(deleteWhere));
services.SqlBulkCopyAdd(result);
}
///
/// 得到数据库相关的数据——NBA
///
private void GetSqlData_NBA()
{
//获取NBA的赛事编码
eventId = new B_EventsJob().GetEventList().Where(p => p.Name == ConfigurationManager.AppSettings["NBAEventName"]).ToList()[0].Id;
//获取NBA的球队
teamList = services.Query(" AND EventId='{0}'".FormatMe(eventId), "", "Id,Name").ToList();
//获取NBA的球员
playerList = services.Query(" AND b.EventId='{0}'".FormatMe(eventId), " JOIN B_Team b ON a.TeamId =b.Id", "a.Id,a.ChineseName").ToList();
}
private async Task Analysis_NBA(B_Grouping p)
{
foreach (var item in typeDict_NBA)
{
taskList.Add(Task.Run(() =>
{
try
{
var url = item.Value.Replace(groupType_NBA, groupDict_NBA[p.Name]).Replace(season_NBA, p.Season);
var doc = CommonHelper.GetHtmlHtmlDocument(new HtmlParameterDTO { Url = url, Title = "排名" });
var trList = doc.DocumentNode.SelectNodes(".//tr");
foreach (var tr in trList)
{
var td = tr.SelectNodes(".//td");
if (td == null || td.Count <= 0)
continue;
string playerName = td[1].SelectNodes("./a")[0].InnerText.Trim();
var teamName = td[2].SelectNodes("./a")[0].InnerText.Trim();
result.Add(new B_PlayersStatistics
{
Id = CommonHelper.GetGuid().ToString(),
CreateDateTime = DateTime.Now,
EventId = eventId,
GroupingId = p.Id,
PlayerId = (from a in playerList
where a.ChineseName == playerName
select a.Id).Take(1).ToJoin(),
PlayerName = td[1].SelectNodes("./a")[0].InnerText.Trim(),
TeamId = (from a in teamList
where a.Name == teamName
select a.Id).Take(1).ToJoin(),
TeamName = teamName,
Season = p.Season,
Sort = td[0].SelectNodes("./em")[0].InnerText.Trim().TryToInt32(),
Sum = td[3].InnerText.Trim().TryToInt32(),
Remark = td[1].SelectNodes("./a")[0].Attributes["href"].Value + "|" + td[2].SelectNodes("./a")[0].Attributes["href"].Value,
TotalShooting = td[4].InnerText,
HitNumber = td[5].InnerText,
TotalScore = item.Key == "得分" ? td[6].InnerText : string.Empty,
AvgScore = td.Count >= 8 ? td[7].InnerText : string.Empty,
HitRate = td.Count >= 8 ? td[6].InnerText : string.Empty,
StatisticTypeName = item.Key
});
}
}
finally
{
lock (locker)
{
finishcount++;
Monitor.Pulse(locker); //完成,通知等待队列,告知已完,执行下一个。
}
}
}));
}
}
}
}