TeamProfileWindow.xaml.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  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. public TeamProfileWindow(string teamId)
  17. {
  18. InitializeComponent();
  19. DataTable dt = new DataTable();
  20. this.teamId = teamId;
  21. // Адаптация к размеру окна
  22. // Указываем строку подключения для запросов
  23. query = new SQL("DefaultConnection");
  24. // Подгрузка краткой информации
  25. dt = query.SendSelectQuery("SELECT " +
  26. "TeamName," +
  27. "Country," +
  28. "DateOfFoundation," +
  29. "PhoneNumber," +
  30. "Email," +
  31. "AboutTeam," +
  32. "LogoURL " +
  33. "FROM Teams WHERE TeamId = " + this.teamId);
  34. TeamNameTB.Text = dt.Rows[0][0].ToString();
  35. CountryTB.Text = "Страна: " + dt.Rows[0][1].ToString();
  36. FoundationDateTB.Text = "Дата основания: " + Convert.ToDateTime(dt.Rows[0][2]).ToString("D");
  37. PhoneNumberTB.Text = "Номер телефона: " + "+" + dt.Rows[0][3].ToString();
  38. EmailTB.Text = "Email: " + dt.Rows[0][4].ToString();
  39. AboutTeamTB.Text = "О команде: " + dt.Rows[0][5].ToString();
  40. // Подгрузка аватара
  41. if (dt.Rows[0][6] != DBNull.Value)
  42. {
  43. TeamLogoImg.Source = new BitmapImage(new Uri(dt.Rows[0][6].ToString()));
  44. }
  45. // Подгрузка статистики
  46. var (winCount, drawCount, loseCount) = GetWinDrawLoseCount(this.teamId);
  47. int gamesCount = winCount + drawCount + loseCount;
  48. if (gamesCount != 0)
  49. {
  50. LineBarWin.Width = new GridLength(winCount * 100 / gamesCount, GridUnitType.Star);
  51. LineBarDraw.Width = new GridLength(drawCount * 100 / gamesCount, GridUnitType.Star);
  52. LineBarLose.Width = new GridLength(loseCount * 100 / gamesCount, GridUnitType.Star);
  53. WinCountTB.Text = winCount.ToString() + " побед";
  54. DrawCountTB.Text = drawCount.ToString() + " ничьих";
  55. LoseCountTB.Text = loseCount.ToString() + " поражений";
  56. WinPercentTB.Text = Math.Round(Convert.ToDouble(winCount) * 100.0 / Convert.ToDouble(gamesCount), 2).ToString() + "%";
  57. DrawPercentTB.Text = Math.Round(Convert.ToDouble(drawCount) * 100 / Convert.ToDouble(gamesCount), 2).ToString() + "%";
  58. LosePercentTB.Text = Math.Round(Convert.ToDouble(loseCount) * 100 / Convert.ToDouble(gamesCount), 2).ToString() + "%";
  59. }
  60. // Подгрузка состава -- происходит в NowStatusRB_Checked
  61. NowStatusRB.IsChecked = true;
  62. // Подгрузка истории матчей
  63. // Подгрузка достижений
  64. List<Achievement> achievementList = new List<Achievement>(3)
  65. {
  66. new Achievement { Place="1", Tournament="The International 10 (2021)", Venue="Бухарест, Румыния", DateOfVenue="17.10.2021", Prize="18 000 000$", PrizeFond="40 000 000$"},
  67. new Achievement { Place="7", Tournament="ESL One Summer 2021", Venue="Онлайн", DateOfVenue="20.07.2021", Prize="30 000$", PrizeFond="1 000 000$"},
  68. };
  69. AchievementDataGrid.ItemsSource = achievementList;
  70. }
  71. private void NowStatusRB_Checked(object sender, RoutedEventArgs e)
  72. {
  73. TeamListStatusExpander.Header = NowStatusRB.Content;
  74. TeamListStatusExpander.IsExpanded = false;
  75. teamList = new List<PlayerInTeamList>();
  76. List<string> userIds = GetPlayerIdsInTeamPresent(this.teamId);
  77. foreach (string userId in userIds)
  78. {
  79. teamList.Add(GetPlayerInTeamList(userId));
  80. }
  81. TeamLB.ItemsSource = new List<string>();
  82. TeamLB.ItemsSource = teamList;
  83. }
  84. private void PastStatusRB_Checked(object sender, RoutedEventArgs e)
  85. {
  86. TeamListStatusExpander.Header = PastStatusRB.Content;
  87. TeamListStatusExpander.IsExpanded = false;
  88. teamList = new List<PlayerInTeamList>();
  89. List<string> userIds = GetPlayerIdsInTeamPast(this.teamId);
  90. foreach (string userId in userIds)
  91. {
  92. teamList.Add(GetPlayerInTeamList(userId));
  93. }
  94. TeamLB.ItemsSource = new List<string>();
  95. TeamLB.ItemsSource = teamList;
  96. }
  97. // Возвращает список всех игроков команды в настоящий момент
  98. private List<string> GetPlayerIdsInTeamPresent(string teamId)
  99. {
  100. List<string> playerIds = new List<string>();
  101. DataTable dt = query.SendSelectQuery("SELECT UserId, DateOut FROM TeamCompositions WHERE TeamId = " + teamId);
  102. foreach (DataRow dr in dt.Rows)
  103. {
  104. if (dr.IsNull(1))
  105. {
  106. playerIds.Add(dr[0].ToString());
  107. }
  108. }
  109. return playerIds;
  110. }
  111. // Возвращает список всех игроков команды в прошлом
  112. private List<string> GetPlayerIdsInTeamPast(string teamId)
  113. {
  114. if (teamId == null)
  115. {
  116. return new List<string>();
  117. }
  118. List<string> playerIds = new List<string>();
  119. DataTable dt = query.SendSelectQuery("SELECT UserId, DateOut FROM TeamCompositions WHERE TeamId = " + teamId);
  120. foreach (DataRow dr in dt.Rows)
  121. {
  122. if (!dr.IsNull(1))
  123. {
  124. playerIds.Add(dr[0].ToString());
  125. }
  126. }
  127. return playerIds;
  128. }
  129. // Возвращает количество (побед, ничьих, поражений) команды
  130. private (int, int, int) GetWinDrawLoseCount(string teamId)
  131. {
  132. // инициализация счетчиков
  133. int winCounter = 0;
  134. int loseCounter = 0;
  135. int drawCounter = 0;
  136. // получаем список матчей в игрока в команде
  137. DataTable dt = query.SendSelectQuery("SELECT TeamIdFrst, TeamIdScnd, IsFrstWin FROM Matches WHERE TeamIdFrst = " + teamId + " OR TeamIdScnd = " + teamId);
  138. // для каждого матча узнать (победа, ничья, поражение)
  139. foreach (DataRow dtRow in dt.Rows)
  140. {
  141. if (dtRow[0].ToString() == teamId)
  142. {
  143. if (!dtRow.IsNull(2))
  144. {
  145. if (Convert.ToBoolean(dtRow[2]))
  146. {
  147. winCounter++;
  148. }
  149. else
  150. {
  151. loseCounter++;
  152. }
  153. }
  154. else
  155. {
  156. drawCounter++;
  157. }
  158. }
  159. else
  160. {
  161. if (!dtRow.IsNull(2))
  162. {
  163. if (!Convert.ToBoolean(dtRow[2]))
  164. {
  165. winCounter++;
  166. }
  167. else
  168. {
  169. loseCounter++;
  170. }
  171. }
  172. else
  173. {
  174. drawCounter++;
  175. }
  176. }
  177. } // foreach
  178. return (winCounter, drawCounter, loseCounter);
  179. }
  180. // Возвращает количество (побед, ничьих, поражений) игрока в ОДНОЙ команде
  181. private (int, int, int) GetWinDrawLoseCount(string userId, string teamId)
  182. {
  183. // инициализация счетчиков
  184. int winCounter = 0;
  185. int loseCounter = 0;
  186. int drawCounter = 0;
  187. // получаем список матчей в игрока в команде
  188. DataTable dt = GetMatchesUserInTeam(userId, teamId);
  189. // для каждого матча узнать (победа, ничья, поражение)
  190. foreach (DataRow dtRow in dt.Rows)
  191. {
  192. if (dtRow[0].ToString() == teamId)
  193. {
  194. if (!dtRow.IsNull(2))
  195. {
  196. if (Convert.ToBoolean(dtRow[2]))
  197. {
  198. winCounter++;
  199. }
  200. else
  201. {
  202. loseCounter++;
  203. }
  204. }
  205. else
  206. {
  207. drawCounter++;
  208. }
  209. }
  210. else
  211. {
  212. if (!dtRow.IsNull(2))
  213. {
  214. if (!Convert.ToBoolean(dtRow[2]))
  215. {
  216. winCounter++;
  217. }
  218. else
  219. {
  220. loseCounter++;
  221. }
  222. }
  223. else
  224. {
  225. drawCounter++;
  226. }
  227. }
  228. } // foreach
  229. return (winCounter, drawCounter, loseCounter);
  230. }
  231. // Возвращает все матчи игрока в команде
  232. private DataTable GetMatchesUserInTeam(string userId, string teamId)
  233. {
  234. // Получаем даты нахождения в команде
  235. string queryText = "SELECT DateIn, DateOut FROM TeamCompositions WHERE UserId = " + userId + " AND TeamId = " + teamId;
  236. DataTable dt = query.SendSelectQuery(queryText);
  237. string dateIn = dt.Rows[0][0].ToString();
  238. string dateOut = DateTime.Now.ToString("u");
  239. if (!dt.Rows[0].IsNull(1))
  240. {
  241. dateOut = dt.Rows[0][1].ToString();
  242. }
  243. // Получаем все матчи игрока в одной команде
  244. queryText = "SELECT TeamIdFrst, TeamIdScnd, IsFrstWin, GameDate, TournamentID, FrstScores, ScndScores FROM Matches WHERE (TeamIdFrst = " + teamId + " OR TeamIDScnd = " + teamId + " ) AND GameDate BETWEEN '" + dateIn + "' AND '" + dateOut + "'"
  245. + "\n ORDER BY GameDate DESC" + ";";
  246. dt = query.SendSelectQuery(queryText);
  247. return dt;
  248. }
  249. // Возвращает дату вступления игрока в команду
  250. private string GetDateInTeam(string userId, string teamId)
  251. {
  252. string queryText = "SELECT DateIn FROM TeamCompositions WHERE UserId = " + userId + " AND TeamId = " + teamId;
  253. DataTable dt = query.SendSelectQuery(queryText);
  254. return Convert.ToDateTime(dt.Rows[0][0]).ToString("D");
  255. }
  256. // Возвращает дату выхода игрока из команды
  257. private string GetDateOutTeam(string userId, string teamId)
  258. {
  259. string queryText = "SELECT DateOut FROM TeamCompositions WHERE UserId = " + userId + " AND TeamId = " + teamId;
  260. DataTable dt = query.SendSelectQuery(queryText);
  261. if (!dt.Rows[0].IsNull(0))
  262. {
  263. return Convert.ToDateTime(dt.Rows[0][0]).ToString("D");
  264. }
  265. else
  266. {
  267. return "настоящее время";
  268. }
  269. }
  270. // Возвращает объект класса PlayerInTeamList
  271. private PlayerInTeamList GetPlayerInTeamList(string userId)
  272. {
  273. PlayerInTeamList player = new PlayerInTeamList();
  274. DataTable dt = query.SendSelectQuery("SELECT "+
  275. "CONCAT(LName, ' ', FName, ' ', MName), " +
  276. "Nickname, " +
  277. "TeamId, " +
  278. "CountryId, " +
  279. "PhotoURL " +
  280. "FROM Users WHERE UserId = " + userId);
  281. // имя
  282. player.RealName = dt.Rows[0][0].ToString();
  283. player.Nickname = dt.Rows[0][1].ToString();
  284. // фото игрока
  285. if (!dt.Rows[0].IsNull(4))
  286. {
  287. player.UserPhotoPath = dt.Rows[0][4].ToString();
  288. }
  289. else
  290. {
  291. player.UserPhotoPath = "C:/Users/nikich4523/source/repos/Курсовой проект 3.1/Images/WithoutPhoto.png";
  292. }
  293. // иконка страны
  294. if (dt.Rows[0][3].ToString() != "0")
  295. {
  296. DataTable dtCountry = query.SendSelectQuery("SELECT ImgPath FROM Country WHERE CountryId = " + dt.Rows[0][3].ToString());
  297. player.UserPhotoPath = dtCountry.Rows[0][0].ToString();
  298. }
  299. else
  300. {
  301. player.CountryIconPath = "C:/Users/nikich4523/source/repos/Курсовой проект 3.1/Images/Cup.png";
  302. }
  303. // даты в команде
  304. player.Dates = GetDateInTeam(userId, this.teamId) + " - " + GetDateOutTeam(userId, this.teamId);
  305. // статистика в команде
  306. int winCount, drawCount, loseCount;
  307. (winCount, drawCount, loseCount) = GetWinDrawLoseCount(userId, this.teamId);
  308. player.Statistick = winCount.ToString() + " побед, " + drawCount.ToString() + " ничьих, " + loseCount.ToString() + " поражений";
  309. return player;
  310. }
  311. }
  312. }
  313. // Класс, описывающий объект/элемент ListBox - TeamListGroupBox
  314. public class PlayerInTeamList
  315. {
  316. public string UserPhotoPath { get; set; }
  317. public string CountryIconPath { get; set; }
  318. public string Nickname { get; set; }
  319. public string RealName { get; set; }
  320. public string Dates { get; set; }
  321. public string Statistick { get; set; }
  322. }
  323. // Класс, описывающий объект/элемент DataGrid - AchievementListGroupBox
  324. public class Achievement
  325. {
  326. public string Place { get; set; }
  327. public string Tournament { get; set; }
  328. public string Venue { get; set; }
  329. public string DateOfVenue { get; set; }
  330. public string Prize { get; set; }
  331. public string PrizeFond { get; set; }
  332. }