MainWindow.xaml.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Globalization;
  5. using System.Windows;
  6. using System.Windows.Data;
  7. using System.Windows.Media;
  8. namespace Курсовой_проект_3._1
  9. {
  10. /// <summary>
  11. /// Логика взаимодействия для MainWindow.xaml
  12. /// </summary>
  13. public partial class MainWindow : Window
  14. {
  15. int userId; // id открытого профиля
  16. SQL query;
  17. // TeamsGrid
  18. List<PartInTeams> teams = new List<PartInTeams>(5);
  19. int offsetTeams = 0;
  20. int offsetNextFetchTeams = 5;
  21. // MatchesGrid
  22. List<Match> matches = new List<Match>(5);
  23. int offsetMatches = 0;
  24. int offsetNextFetchMatches = 5;
  25. public MainWindow(int userId)
  26. {
  27. InitializeComponent();
  28. DataTable dt = new DataTable();
  29. this.userId = userId;
  30. // адаптация к размеру окна
  31. SizeChanged += MainWindow_SizeChanged;
  32. // указываем строку подключения для запросов
  33. query = new SQL("DefaultConnection");
  34. // Подгрузка краткой информации
  35. dt = query.SendSelectQuery("SELECT " +
  36. "CONCAT(LName, ' ', FName, ' ', MName)," +
  37. "Nickname," +
  38. "Birthday," +
  39. "(0 + Convert(Char(8), GETDATE(), 112) - Convert(Char(8), Birthday, 112)) / 10000," +
  40. "Country," +
  41. "PhoneNumber," +
  42. "Email," +
  43. "AboutShort," +
  44. "PhotoURL," + //
  45. "TeamId " +
  46. "FROM Users WHERE UserId = " + Convert.ToString(this.userId));
  47. RealNameTB.Text += Convert.ToString(dt.Rows[0][0]);
  48. NicknameTB.Text += Convert.ToString(dt.Rows[0][1]);
  49. BirthDateTB.Text += Convert.ToDateTime(dt.Rows[0][2]).ToString("D") + " (" + Convert.ToString(dt.Rows[0][3]) + " лет)";
  50. CountryTB.Text += Convert.ToString(dt.Rows[0][4]);
  51. PhoneNumberTB.Text += Convert.ToString(dt.Rows[0][5]);
  52. EmailTB.Text += Convert.ToString(dt.Rows[0][6]);
  53. AboutMeTB.Text += Convert.ToString(dt.Rows[0][7]);
  54. // Подгрузка статистики
  55. var (winCount, drawCount, loseCount) = GetWinDrawLoseCount(Convert.ToString(this.userId));
  56. int gamesCount = winCount + drawCount + loseCount;
  57. if (gamesCount != 0)
  58. {
  59. LineBarWin.Width = new GridLength(winCount * 100 / gamesCount, GridUnitType.Star);
  60. LineBarDraw.Width = new GridLength(drawCount * 100 / gamesCount, GridUnitType.Star);
  61. LineBarLose.Width = new GridLength(loseCount * 100 / gamesCount, GridUnitType.Star);
  62. WinCountTB.Text = winCount.ToString() + " побед";
  63. DrawCountTB.Text = drawCount.ToString() + " ничьих";
  64. LoseCountTB.Text = loseCount.ToString() + " поражений";
  65. WinPercentTB.Text = Math.Round(Convert.ToDouble(winCount) * 100.0 / Convert.ToDouble(gamesCount), 2).ToString() + "%";
  66. DrawPercentTB.Text = Math.Round(Convert.ToDouble(drawCount) * 100 / Convert.ToDouble(gamesCount), 2).ToString() + "%";
  67. LosePercentTB.Text = Math.Round(Convert.ToDouble(loseCount) * 100 / Convert.ToDouble(gamesCount), 2).ToString() + "%";
  68. }
  69. // Подгрузка команд
  70. int offsetTeamsInc = 0;
  71. foreach (string teamId in GetTeamIds(Convert.ToString(this.userId), Convert.ToString(offsetTeams), Convert.ToString(offsetNextFetchTeams)))
  72. {
  73. teams.Add(GetPartInTeams(Convert.ToString(this.userId), teamId));
  74. offsetTeamsInc++;
  75. }
  76. offsetTeams += offsetTeamsInc;
  77. TeamsGrid.ItemsSource = teams;
  78. // Подгрузка матчей
  79. int offsetMatchesInc = 0;
  80. foreach (DataRow dr in GetAllMatchesUser(Convert.ToString(this.userId), Convert.ToString(offsetMatches), Convert.ToString(offsetNextFetchMatches)).Rows)
  81. {
  82. matches.Add(GetMatch(dr));
  83. offsetMatchesInc++;
  84. }
  85. offsetMatches += offsetMatchesInc;
  86. MatchesGrid.ItemsSource = matches;
  87. // Если зашел главные пользователь, то добавить кнопку настроек
  88. }
  89. private void MainWindow_SizeChanged(object sender, SizeChangedEventArgs e)
  90. {
  91. ProfileDockPanel.MinHeight = MyWindow.Height * 4 / 10;
  92. ProfileDockPanel.MaxHeight = ProfileDockPanel.MinHeight + 100;
  93. }
  94. private void MoreGamesButton_Click(object sender, RoutedEventArgs e)
  95. {
  96. int offsetMatchesInc = 0;
  97. DataTable dt = GetAllMatchesUser(Convert.ToString(this.userId), Convert.ToString(offsetMatches), Convert.ToString(offsetNextFetchMatches));
  98. if (dt != null)
  99. {
  100. foreach (DataRow dr in dt.Rows)
  101. {
  102. matches.Add(GetMatch(dr));
  103. offsetMatchesInc++;
  104. }
  105. offsetMatches += offsetMatchesInc;
  106. MatchesGrid.ItemsSource = new List<Match>(1);
  107. MatchesGrid.ItemsSource = matches;
  108. }
  109. else
  110. {
  111. MessageBox.Show("Больше матчей нет");
  112. return;
  113. }
  114. }
  115. private void MoreTeamsBtn_Click(object sender, RoutedEventArgs e)
  116. {
  117. int offsetTeamsInc = 0;
  118. List<string> teamIds = GetTeamIds(Convert.ToString(this.userId), Convert.ToString(offsetTeams), Convert.ToString(offsetNextFetchTeams));
  119. try
  120. {
  121. string check = teamIds[0];
  122. foreach (string teamId in teamIds)
  123. {
  124. teams.Add(GetPartInTeams(Convert.ToString(this.userId), teamId));
  125. offsetTeamsInc++;
  126. }
  127. offsetTeams += offsetTeamsInc;
  128. TeamsGrid.ItemsSource = teams;
  129. }
  130. catch
  131. {
  132. MessageBox.Show("Больше матчей нет");
  133. return;
  134. }
  135. }
  136. // МАТЧИ ///
  137. // Возвращает все матчи игрока в команде
  138. private DataTable GetMatchesUserInTeam(string userId, string teamId)
  139. {
  140. // Получаем даты нахождения в команде
  141. string queryText = "SELECT DateIn, DateOut FROM TeamCompositions WHERE UserId = " + userId + " AND TeamId = " + teamId;
  142. DataTable dt = query.SendSelectQuery(queryText);
  143. string dateIn = dt.Rows[0][0].ToString();
  144. string dateOut = dt.Rows[0][1].ToString();
  145. // Получаем все матчи игрока в одной команде
  146. queryText = "SELECT TeamIdFrst, TeamIdScnd, IsFrstWin, GameDate, TournamentID, FrstScores, ScndScores FROM Matches WHERE (TeamIdFrst = " + teamId + " OR TeamIDScnd = " + teamId + " ) AND GameDate BETWEEN '" + dateIn + "' AND '" + dateOut + "'"
  147. + "\n ORDER BY GameDate DESC" + ";";
  148. dt = query.SendSelectQuery(queryText);
  149. return dt;
  150. }
  151. // Возвращает все матчи игрока (order by game date desc)
  152. private DataTable GetAllMatchesUser(string userId)
  153. {
  154. // получаем список команд
  155. List<string> teamIds = GetTeamIds(userId);
  156. // для каждой команды получаем матчи
  157. DataTable dt = new DataTable();
  158. foreach (string teamId in teamIds)
  159. {
  160. dt.Merge(GetMatchesUserInTeam(userId, teamId));
  161. }
  162. return dt;
  163. }
  164. // Возвращает все матчи игрока со сдвигом
  165. private DataTable GetAllMatchesUser(string userId, string offset, string fetchNext)
  166. {
  167. // получаем список всех матчей (order by game date desc)
  168. DataTable dt = GetAllMatchesUser(userId);
  169. // проверяем количество оставшихся матчей
  170. if (dt.Rows.Count < Convert.ToInt32(offset) + Convert.ToInt32(fetchNext))
  171. {
  172. fetchNext = Convert.ToString(Convert.ToInt32(fetchNext) - (Convert.ToInt32(offset) + Convert.ToInt32(fetchNext) - dt.Rows.Count));
  173. }
  174. // создаем подмассив для datarow
  175. DataRow[] subDr = new DataRow[Convert.ToInt32(fetchNext)];
  176. int drCounter = 0;
  177. // заполняем подмассив строками из списка матчей со сдвигом
  178. for (int i = Convert.ToInt32(offset) + 1; i <= Convert.ToInt32(offset) + Convert.ToInt32(fetchNext); i++)
  179. {
  180. subDr[drCounter] = dt.Rows[i - 1];
  181. drCounter++;
  182. }
  183. DataTable subDt;
  184. try
  185. {
  186. subDt = subDr.CopyToDataTable();
  187. }
  188. catch
  189. {
  190. return null;
  191. }
  192. return subDt;
  193. }
  194. // ОБЪЕКТЫ ///
  195. // Возвращает объект класса PartInTeams
  196. private PartInTeams GetPartInTeams(string userId, string teamId)
  197. {
  198. PartInTeams player = new PartInTeams();
  199. player.TeamName = GetTeamName(teamId);
  200. player.DateOfStart = GetDateInTeam(userId, teamId);
  201. player.DateOfEnd = GetDateOutTeam(userId, teamId);
  202. int winCount, drawCount, loseCount;
  203. (winCount, drawCount, loseCount) = GetWinDrawLoseCount(userId, teamId);
  204. player.Stat = winCount.ToString() + " побед, " + drawCount.ToString() + " ничьих, " + loseCount.ToString() + " поражений";
  205. return player;
  206. }
  207. // Возвращает объект класса Match
  208. private Match GetMatch(DataRow dr)
  209. {
  210. Match match = new Match();
  211. match.FrstTeamName = GetTeamName(dr[0].ToString());
  212. match.ScndTeamName = GetTeamName(dr[1].ToString());
  213. match.Scores = dr[5].ToString() + " : " + dr[6].ToString();
  214. match.Tournament = dr[4].ToString();
  215. match.GameDate = Convert.ToDateTime(dr[3]).ToString("D");
  216. if (dr[2] != null)
  217. {
  218. if (Convert.ToBoolean(dr[2]))
  219. {
  220. match.WinTeam = match.FrstTeamName;
  221. }
  222. else
  223. {
  224. match.WinTeam = match.ScndTeamName;
  225. }
  226. }
  227. return match;
  228. }
  229. // КОМАНДЫ ///
  230. // Возвращает название команды
  231. private string GetTeamName(string teamId)
  232. {
  233. string queryText = "SELECT TeamName FROM Teams WHERE TeamId = " + teamId;
  234. DataTable dt = query.SendSelectQuery(queryText);
  235. return dt.Rows[0][0].ToString();
  236. }
  237. // Возвращает дату вступления игрока в команду
  238. private string GetDateInTeam(string userId, string teamId)
  239. {
  240. string queryText = "SELECT DateIn FROM TeamCompositions WHERE UserId = " + userId + " AND TeamId = " + teamId;
  241. DataTable dt = query.SendSelectQuery(queryText);
  242. return Convert.ToDateTime(dt.Rows[0][0]).ToString("D");
  243. }
  244. // Возвращает дату выхода игрока из команды
  245. private string GetDateOutTeam(string userId, string teamId)
  246. {
  247. string queryText = "SELECT DateOut FROM TeamCompositions WHERE UserId = " + userId + " AND TeamId = " + teamId;
  248. DataTable dt = query.SendSelectQuery(queryText);
  249. return Convert.ToDateTime(dt.Rows[0][0]).ToString("D");
  250. }
  251. // Возвращает список всех команд игрока
  252. private List<string> GetTeamIds(string userId)
  253. {
  254. string queryText = "SELECT TeamId FROM TeamCompositions WHERE UserId = " + userId;
  255. DataTable dt = query.SendSelectQuery(queryText);
  256. List<string> teamIds = new List<string>();
  257. foreach (DataRow dtRow in dt.Rows)
  258. {
  259. teamIds.Add(dtRow[0].ToString());
  260. }
  261. return teamIds;
  262. }
  263. // Возвращает список команд игрока со сдвигом
  264. private List<string> GetTeamIds(string userId, string offset, string fetchNext)
  265. {
  266. string queryText = "SELECT TeamId FROM TeamCompositions WHERE UserId = " + userId + "\n" +
  267. "ORDER BY DateIn DESC, TeamId" + "\n" +
  268. "OFFSET " + offset + " ROWS FETCH NEXT " + fetchNext + " ROWS ONLY";
  269. DataTable dt = query.SendSelectQuery(queryText);
  270. List<string> teamIds = new List<string>();
  271. foreach (DataRow dtRow in dt.Rows)
  272. {
  273. teamIds.Add(dtRow[0].ToString());
  274. }
  275. return teamIds;
  276. }
  277. // КОЛИЧЕСТВО ПОБЕД ///
  278. // Возвращает количество (побед, ничьих, поражений) игрока во ВСЕХ командах
  279. private (int, int, int) GetWinDrawLoseCount(string userId)
  280. {
  281. int winCounter = 0;
  282. int loseCounter = 0;
  283. int drawCounter = 0;
  284. // Получаем список всех команд
  285. List<string> teamIds = GetTeamIds(userId);
  286. // Считаем количество побед, ничьих, поражений
  287. for (int i = 0; i < teamIds.Count; i++)
  288. {
  289. string teamId = teamIds[i];
  290. int winIncrement, drawIncrement, loseIncrement;
  291. (winIncrement, drawIncrement, loseIncrement) = GetWinDrawLoseCount(userId, teamId);
  292. winCounter += winIncrement;
  293. drawCounter += drawIncrement;
  294. loseCounter += loseIncrement;
  295. }
  296. return (winCounter, drawCounter, loseCounter);
  297. }
  298. // Возвращает количество (побед, ничьих, поражений) игрока в ОДНОЙ команде
  299. private (int, int, int) GetWinDrawLoseCount(string userId, string teamId)
  300. {
  301. // инициализация счетчиков
  302. int winCounter = 0;
  303. int loseCounter = 0;
  304. int drawCounter = 0;
  305. // получаем список матчей в игрока в команде
  306. DataTable dt = GetMatchesUserInTeam(userId, teamId);
  307. // для каждого матча узнать (победа, ничья, поражение)
  308. foreach (DataRow dtRow in dt.Rows)
  309. {
  310. if (dtRow[0].ToString() == teamId)
  311. {
  312. if (dtRow[2] != null)
  313. {
  314. if (Convert.ToBoolean(dtRow[2]))
  315. {
  316. winCounter++;
  317. }
  318. else
  319. {
  320. loseCounter++;
  321. }
  322. }
  323. else
  324. {
  325. drawCounter++;
  326. }
  327. }
  328. else
  329. {
  330. if (dtRow[2] != null)
  331. {
  332. if (!Convert.ToBoolean(dtRow[2]))
  333. {
  334. winCounter++;
  335. }
  336. else
  337. {
  338. loseCounter++;
  339. }
  340. }
  341. else
  342. {
  343. drawCounter++;
  344. }
  345. }
  346. } // foreach
  347. return (winCounter, drawCounter, loseCounter);
  348. }
  349. } // class MainWindow
  350. public class MyConverter : IMultiValueConverter
  351. {
  352. public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture)
  353. {
  354. string team = value[0] as string;
  355. string winTeam = value[1] as string;
  356. if (team == winTeam)
  357. {
  358. return Brushes.LightGreen;
  359. }
  360. else
  361. {
  362. return DependencyProperty.UnsetValue;
  363. }
  364. }
  365. public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture)
  366. {
  367. throw new NotSupportedException();
  368. }
  369. }
  370. public class PartInTeams
  371. {
  372. public string TeamName { get; set; }
  373. public string Stat { get; set; }
  374. public string DateOfStart { get; set; }
  375. public string DateOfEnd { get; set; }
  376. }
  377. public class Match
  378. {
  379. public string FrstTeamName { get; set; }
  380. public string ScndTeamName { get; set; }
  381. public string Scores { get; set; }
  382. public string GameDate { get; set; }
  383. public string Tournament { get; set; }
  384. public string WinTeam { get; set; }
  385. }
  386. } // namespace