TeamProfileWindow.xaml.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Windows;
  5. using System.Windows.Media.Imaging;
  6. namespace Курсовой_проект_3._1
  7. {
  8. /// <summary>
  9. /// Логика взаимодействия для TeamProfileWindow.xaml
  10. /// </summary>
  11. public partial class TeamProfileWindow : Window
  12. {
  13. SQL query;
  14. string teamId;
  15. List<PlayerInTeamList> teamList = new List<PlayerInTeamList>();
  16. List<Achievement> achievementList = new List<Achievement>();
  17. List<string> tournamentIds = new List<string>();
  18. int offsetAchievment = 0;
  19. public TeamProfileWindow(string teamId)
  20. {
  21. InitializeComponent();
  22. DataTable dt = new DataTable();
  23. this.teamId = teamId;
  24. // Адаптация к размеру окна
  25. // Указываем строку подключения для запросов
  26. query = new SQL("DefaultConnection");
  27. // Подгрузка краткой информации
  28. dt = query.SendSelectQuery("SELECT " +
  29. "TeamName," +
  30. "Country," +
  31. "DateOfFoundation," +
  32. "PhoneNumber," +
  33. "Email," +
  34. "AboutTeam," +
  35. "LogoURL " +
  36. "FROM Teams WHERE TeamId = " + this.teamId);
  37. TeamNameTB.Text = dt.Rows[0][0].ToString();
  38. CountryTB.Text = "Страна: " + dt.Rows[0][1].ToString();
  39. FoundationDateTB.Text = "Дата основания: " + Convert.ToDateTime(dt.Rows[0][2]).ToString("D");
  40. PhoneNumberTB.Text = "Номер телефона: " + "+" + dt.Rows[0][3].ToString();
  41. EmailTB.Text = "Email: " + dt.Rows[0][4].ToString();
  42. AboutTeamTB.Text = "О команде: " + dt.Rows[0][5].ToString();
  43. // Подгрузка аватара
  44. if (dt.Rows[0][6] != DBNull.Value)
  45. {
  46. TeamLogoImg.Source = new BitmapImage(new Uri(dt.Rows[0][6].ToString()));
  47. }
  48. // Подгрузка статистики
  49. var (winCount, drawCount, loseCount) = GetWinDrawLoseCount(this.teamId);
  50. int gamesCount = winCount + drawCount + loseCount;
  51. if (gamesCount != 0)
  52. {
  53. LineBarWin.Width = new GridLength(winCount * 100 / gamesCount, GridUnitType.Star);
  54. LineBarDraw.Width = new GridLength(drawCount * 100 / gamesCount, GridUnitType.Star);
  55. LineBarLose.Width = new GridLength(loseCount * 100 / gamesCount, GridUnitType.Star);
  56. WinCountTB.Text = winCount.ToString() + " побед";
  57. DrawCountTB.Text = drawCount.ToString() + " ничьих";
  58. LoseCountTB.Text = loseCount.ToString() + " поражений";
  59. WinPercentTB.Text = Math.Round(Convert.ToDouble(winCount) * 100.0 / Convert.ToDouble(gamesCount), 2).ToString() + "%";
  60. DrawPercentTB.Text = Math.Round(Convert.ToDouble(drawCount) * 100.0 / Convert.ToDouble(gamesCount), 2).ToString() + "%";
  61. LosePercentTB.Text = Math.Round(Convert.ToDouble(loseCount) * 100.0 / Convert.ToDouble(gamesCount), 2).ToString() + "%";
  62. }
  63. // Подгрузка состава -- происходит в NowStatusRB_Checked
  64. NowStatusRB.IsChecked = true;
  65. // Подгрузка истории матчей
  66. // Подгрузка достижений
  67. tournamentIds = GetTournamentIds(this.teamId);
  68. int offsetInc = 0;
  69. if (tournamentIds.Count > 5)
  70. {
  71. for (int i = 0; i < 5; i++)
  72. {
  73. achievementList.Add(GetAchievement(this.teamId, tournamentIds[i]));
  74. offsetInc++;
  75. }
  76. }
  77. else
  78. {
  79. for (int i = 0; i < tournamentIds.Count; i++)
  80. {
  81. achievementList.Add(GetAchievement(this.teamId, tournamentIds[i]));
  82. offsetInc++;
  83. }
  84. }
  85. offsetAchievment += offsetInc;
  86. AchievementDataGrid.ItemsSource = achievementList;
  87. }
  88. private void NowStatusRB_Checked(object sender, RoutedEventArgs e)
  89. {
  90. TeamListStatusExpander.Header = NowStatusRB.Content;
  91. TeamListStatusExpander.IsExpanded = false;
  92. teamList = new List<PlayerInTeamList>();
  93. List<string> userIds = GetPlayerIdsInTeamPresent(this.teamId);
  94. foreach (string userId in userIds)
  95. {
  96. teamList.Add(GetPlayerInTeamList(userId));
  97. }
  98. TeamLB.ItemsSource = new List<string>();
  99. TeamLB.ItemsSource = teamList;
  100. }
  101. private void PastStatusRB_Checked(object sender, RoutedEventArgs e)
  102. {
  103. TeamListStatusExpander.Header = PastStatusRB.Content;
  104. TeamListStatusExpander.IsExpanded = false;
  105. teamList = new List<PlayerInTeamList>();
  106. List<string> userIds = GetPlayerIdsInTeamPast(this.teamId);
  107. foreach (string userId in userIds)
  108. {
  109. teamList.Add(GetPlayerInTeamList(userId));
  110. }
  111. TeamLB.ItemsSource = new List<string>();
  112. TeamLB.ItemsSource = teamList;
  113. }
  114. private void MoreAchievementBtn_Click(object sender, RoutedEventArgs e)
  115. {
  116. if (tournamentIds.Count <= achievementList.Count)
  117. {
  118. MessageBox.Show("Больше достижений нет!");
  119. return;
  120. }
  121. int offsetInc = 0;
  122. if (tournamentIds.Count - achievementList.Count > 5)
  123. {
  124. for (int i = offsetAchievment; i < offsetAchievment + 5; i++)
  125. {
  126. achievementList.Add(GetAchievement(this.teamId, tournamentIds[i]));
  127. offsetInc++;
  128. }
  129. }
  130. else
  131. {
  132. for (int i = offsetAchievment; i < tournamentIds.Count - achievementList.Count + offsetAchievment; i++)
  133. {
  134. achievementList.Add(GetAchievement(this.teamId, tournamentIds[i]));
  135. offsetInc++;
  136. }
  137. }
  138. AchievementDataGrid.ItemsSource = new List<Achievement>();
  139. AchievementDataGrid.ItemsSource = achievementList;
  140. offsetAchievment += offsetInc;
  141. }
  142. // Возвращает список турниров, в котором участвовала команда
  143. private List<string> GetTournamentIds(string teamId)
  144. {
  145. List<string> tournamentIds = new List<string>();
  146. DataTable dt = query.SendSelectQuery("SELECT TournamentId FROM TournamentPlaces WHERE TeamId = " + teamId);
  147. foreach (DataRow dr in dt.Rows)
  148. {
  149. tournamentIds.Add(dr[0].ToString());
  150. }
  151. return tournamentIds;
  152. }
  153. // Возвращает информацию (DataTable) о турнире
  154. private DataTable GetTournamentInfo(string tournamentId)
  155. {
  156. return query.SendSelectQuery("SELECT * FROM Tournaments WHERE TournamentId = " + tournamentId);
  157. }
  158. // Возвращает место команды в турнире
  159. private string GetPlaceInTournament(string tournamentId, string teamId)
  160. {
  161. DataTable dt = query.SendSelectQuery("SELECT Place FROM TournamentPlaces WHERE TournamentId = " + tournamentId + " AND TeamId = " + teamId);
  162. if (dt.Rows.Count > 0)
  163. {
  164. if (dt.Rows[0].IsNull(0))
  165. {
  166. return null;
  167. }
  168. return dt.Rows[0][0].ToString();
  169. }
  170. return null;
  171. }
  172. // Возвращает список всех игроков команды в настоящий момент
  173. private List<string> GetPlayerIdsInTeamPresent(string teamId)
  174. {
  175. List<string> playerIds = new List<string>();
  176. DataTable dt = query.SendSelectQuery("SELECT UserId, DateOut FROM TeamCompositions WHERE TeamId = " + teamId);
  177. foreach (DataRow dr in dt.Rows)
  178. {
  179. if (dr.IsNull(1))
  180. {
  181. playerIds.Add(dr[0].ToString());
  182. }
  183. }
  184. return playerIds;
  185. }
  186. // Возвращает список всех игроков команды в прошлом
  187. private List<string> GetPlayerIdsInTeamPast(string teamId)
  188. {
  189. if (teamId == null)
  190. {
  191. return new List<string>();
  192. }
  193. List<string> playerIds = new List<string>();
  194. DataTable dt = query.SendSelectQuery("SELECT UserId, DateOut FROM TeamCompositions WHERE TeamId = " + teamId);
  195. foreach (DataRow dr in dt.Rows)
  196. {
  197. if (!dr.IsNull(1))
  198. {
  199. playerIds.Add(dr[0].ToString());
  200. }
  201. }
  202. return playerIds;
  203. }
  204. // Возвращает количество (побед, ничьих, поражений) команды
  205. private (int, int, int) GetWinDrawLoseCount(string teamId)
  206. {
  207. // инициализация счетчиков
  208. int winCounter = 0;
  209. int loseCounter = 0;
  210. int drawCounter = 0;
  211. // получаем список матчей в игрока в команде
  212. DataTable dt = query.SendSelectQuery("SELECT TeamIdFrst, TeamIdScnd, IsFrstWin FROM Matches WHERE TeamIdFrst = " + teamId + " OR TeamIdScnd = " + teamId);
  213. // для каждого матча узнать (победа, ничья, поражение)
  214. foreach (DataRow dtRow in dt.Rows)
  215. {
  216. if (dtRow[0].ToString() == teamId)
  217. {
  218. if (!dtRow.IsNull(2))
  219. {
  220. if (Convert.ToBoolean(dtRow[2]))
  221. {
  222. winCounter++;
  223. }
  224. else
  225. {
  226. loseCounter++;
  227. }
  228. }
  229. else
  230. {
  231. drawCounter++;
  232. }
  233. }
  234. else
  235. {
  236. if (!dtRow.IsNull(2))
  237. {
  238. if (!Convert.ToBoolean(dtRow[2]))
  239. {
  240. winCounter++;
  241. }
  242. else
  243. {
  244. loseCounter++;
  245. }
  246. }
  247. else
  248. {
  249. drawCounter++;
  250. }
  251. }
  252. } // foreach
  253. return (winCounter, drawCounter, loseCounter);
  254. }
  255. // Возвращает количество (побед, ничьих, поражений) игрока в ОДНОЙ команде
  256. private (int, int, int) GetWinDrawLoseCount(string userId, string teamId)
  257. {
  258. // инициализация счетчиков
  259. int winCounter = 0;
  260. int loseCounter = 0;
  261. int drawCounter = 0;
  262. // получаем список матчей в игрока в команде
  263. DataTable dt = GetMatchesUserInTeam(userId, teamId);
  264. // для каждого матча узнать (победа, ничья, поражение)
  265. foreach (DataRow dtRow in dt.Rows)
  266. {
  267. if (dtRow[0].ToString() == teamId)
  268. {
  269. if (!dtRow.IsNull(2))
  270. {
  271. if (Convert.ToBoolean(dtRow[2]))
  272. {
  273. winCounter++;
  274. }
  275. else
  276. {
  277. loseCounter++;
  278. }
  279. }
  280. else
  281. {
  282. drawCounter++;
  283. }
  284. }
  285. else
  286. {
  287. if (!dtRow.IsNull(2))
  288. {
  289. if (!Convert.ToBoolean(dtRow[2]))
  290. {
  291. winCounter++;
  292. }
  293. else
  294. {
  295. loseCounter++;
  296. }
  297. }
  298. else
  299. {
  300. drawCounter++;
  301. }
  302. }
  303. } // foreach
  304. return (winCounter, drawCounter, loseCounter);
  305. }
  306. // Возвращает все матчи игрока в команде
  307. private DataTable GetMatchesUserInTeam(string userId, string teamId)
  308. {
  309. // Получаем даты нахождения в команде
  310. string queryText = "SELECT DateIn, DateOut FROM TeamCompositions WHERE UserId = " + userId + " AND TeamId = " + teamId;
  311. DataTable dt = query.SendSelectQuery(queryText);
  312. string dateIn = dt.Rows[0][0].ToString();
  313. string dateOut = DateTime.Now.ToString("u");
  314. if (!dt.Rows[0].IsNull(1))
  315. {
  316. dateOut = dt.Rows[0][1].ToString();
  317. }
  318. // Получаем все матчи игрока в одной команде
  319. queryText = "SELECT TeamIdFrst, TeamIdScnd, IsFrstWin, GameDate, TournamentID, FrstScores, ScndScores FROM Matches WHERE (TeamIdFrst = " + teamId + " OR TeamIDScnd = " + teamId + " ) AND GameDate BETWEEN '" + dateIn + "' AND '" + dateOut + "'"
  320. + "\n ORDER BY GameDate DESC" + ";";
  321. dt = query.SendSelectQuery(queryText);
  322. return dt;
  323. }
  324. // Возвращает дату вступления игрока в команду
  325. private string GetDateInTeam(string userId, string teamId)
  326. {
  327. string queryText = "SELECT DateIn FROM TeamCompositions WHERE UserId = " + userId + " AND TeamId = " + teamId;
  328. DataTable dt = query.SendSelectQuery(queryText);
  329. return Convert.ToDateTime(dt.Rows[0][0]).ToString("D");
  330. }
  331. // Возвращает дату выхода игрока из команды
  332. private string GetDateOutTeam(string userId, string teamId)
  333. {
  334. string queryText = "SELECT DateOut FROM TeamCompositions WHERE UserId = " + userId + " AND TeamId = " + teamId;
  335. DataTable dt = query.SendSelectQuery(queryText);
  336. if (!dt.Rows[0].IsNull(0))
  337. {
  338. return Convert.ToDateTime(dt.Rows[0][0]).ToString("D");
  339. }
  340. else
  341. {
  342. return "настоящее время";
  343. }
  344. }
  345. // Возвращает объект класса PlayerInTeamList
  346. private PlayerInTeamList GetPlayerInTeamList(string userId)
  347. {
  348. PlayerInTeamList player = new PlayerInTeamList();
  349. DataTable dt = query.SendSelectQuery("SELECT "+
  350. "CONCAT(LName, ' ', FName, ' ', MName), " +
  351. "Nickname, " +
  352. "TeamId, " +
  353. "CountryId, " +
  354. "PhotoURL " +
  355. "FROM Users WHERE UserId = " + userId);
  356. // имя
  357. player.RealName = dt.Rows[0][0].ToString();
  358. player.Nickname = dt.Rows[0][1].ToString();
  359. // фото игрока
  360. if (!dt.Rows[0].IsNull(4))
  361. {
  362. player.UserPhotoPath = dt.Rows[0][4].ToString();
  363. }
  364. else
  365. {
  366. player.UserPhotoPath = "C:/Users/nikich4523/source/repos/Курсовой проект 3.1/Images/WithoutPhoto.png";
  367. }
  368. // иконка страны
  369. if (dt.Rows[0][3].ToString() != "0")
  370. {
  371. DataTable dtCountry = query.SendSelectQuery("SELECT ImgPath FROM Country WHERE CountryId = " + dt.Rows[0][3].ToString());
  372. player.UserPhotoPath = dtCountry.Rows[0][0].ToString();
  373. }
  374. else
  375. {
  376. player.CountryIconPath = "C:/Users/nikich4523/source/repos/Курсовой проект 3.1/Images/Cup.png";
  377. }
  378. // даты в команде
  379. player.Dates = GetDateInTeam(userId, this.teamId) + " - " + GetDateOutTeam(userId, this.teamId);
  380. // статистика в команде
  381. int winCount, drawCount, loseCount;
  382. (winCount, drawCount, loseCount) = GetWinDrawLoseCount(userId, this.teamId);
  383. player.Statistick = winCount.ToString() + " побед, " + drawCount.ToString() + " ничьих, " + loseCount.ToString() + " поражений";
  384. return player;
  385. }
  386. // Возвращает объект класса Achievment
  387. private Achievement GetAchievement(string teamId, string tournamentId)
  388. {
  389. Achievement achievement = new Achievement();
  390. DataTable dt = GetTournamentInfo(tournamentId);
  391. string place = GetPlaceInTournament(tournamentId, teamId);
  392. if (place != "")
  393. {
  394. achievement.Place = GetPlaceInTournament(tournamentId, teamId);
  395. achievement.Tournament = dt.Rows[0][1].ToString();
  396. achievement.Venue = dt.Rows[0][4].ToString() + ",";
  397. achievement.DateOfVenue = dt.Rows[0][2].ToString() + " - " + dt.Rows[0][3].ToString();
  398. achievement.Place = place;
  399. achievement.PrizeFond = dt.Rows[0][5].ToString();
  400. return achievement;
  401. }
  402. else
  403. {
  404. return null;
  405. }
  406. }
  407. }
  408. // Класс, описывающий объект/элемент ListBox - TeamListGroupBox
  409. public class PlayerInTeamList
  410. {
  411. public string UserPhotoPath { get; set; }
  412. public string CountryIconPath { get; set; }
  413. public string Nickname { get; set; }
  414. public string RealName { get; set; }
  415. public string Dates { get; set; }
  416. public string Statistick { get; set; }
  417. }
  418. // Класс, описывающий объект/элемент DataGrid - AchievementListGroupBox
  419. public class Achievement
  420. {
  421. public string Place { get; set; }
  422. public string Tournament { get; set; }
  423. public string Venue { get; set; }
  424. public string DateOfVenue { get; set; }
  425. public string Prize { get; set; }
  426. public string PrizeFond { get; set; }
  427. }
  428. // Класс, описывающий объект/элемент DataGrid - MatchesGrid
  429. public class Match
  430. {
  431. public string FrstTeamName { get; set; }
  432. public string ScndTeamName { get; set; }
  433. public string Scores { get; set; }
  434. public string GameDate { get; set; }
  435. public string Tournament { get; set; }
  436. public string WinTeam { get; set; }
  437. }
  438. }