ReturnBookForm .cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. using Npgsql;
  2. using System;
  3. using System.Configuration;
  4. using System.Data;
  5. using System.Windows.Forms;
  6. namespace WindowsFormsApp4
  7. {
  8. public partial class ReturnBookForm : Form
  9. {
  10. private readonly string connStr = ConfigurationManager.ConnectionStrings["PostgreSQL"].ConnectionString;
  11. private int selectedOrderId = 0;
  12. private bool isLoading = false;
  13. public ReturnBookForm()
  14. {
  15. InitializeComponent();
  16. this.dataGridViewReaders.SelectionChanged += dataGridViewReaders_SelectionChanged;
  17. this.dataGridViewLoans.SelectionChanged += dataGridViewLoans_SelectionChanged;
  18. }
  19. private void ReturnBookForm_Load(object sender, EventArgs e)
  20. {
  21. LoadLibraryName();
  22. }
  23. private void LoadLibraryName()
  24. {
  25. string query = "SELECT name FROM libraries WHERE id = @libId";
  26. using (var conn = new NpgsqlConnection(connStr))
  27. using (var cmd = new NpgsqlCommand(query, conn))
  28. {
  29. cmd.Parameters.AddWithValue("libId", Session.LibraryId);
  30. conn.Open();
  31. var result = cmd.ExecuteScalar();
  32. labelLibraryName.Text = result != null ? "Библиотека: " + result.ToString() : "Библиотека: Неизвестно";
  33. }
  34. }
  35. private void btnSearch_Click(object sender, EventArgs e)
  36. {
  37. string searchText = txtReaderSearch.Text.Trim();
  38. if (string.IsNullOrEmpty(searchText) || searchText == "Введите фамилию или телефон")
  39. {
  40. MessageBox.Show("Введите фамилию, имя или телефон читателя");
  41. return;
  42. }
  43. string query = @"
  44. SELECT id, name, lastname, phone, email,
  45. (SELECT COUNT(*) FROM orders WHERE user_id = u.id AND fact_return_date IS NULL) AS active_loans
  46. FROM users u
  47. WHERE role_name = 'reader'
  48. AND (name ILIKE @search OR lastname ILIKE @search OR phone ILIKE @search OR email ILIKE @search)
  49. ORDER BY lastname, name";
  50. DataTable dt = new DataTable();
  51. using (var conn = new NpgsqlConnection(connStr))
  52. using (var cmd = new NpgsqlCommand(query, conn))
  53. {
  54. cmd.Parameters.AddWithValue("search", $"%{searchText}%");
  55. conn.Open();
  56. using (var adapter = new NpgsqlDataAdapter(cmd))
  57. {
  58. adapter.Fill(dt);
  59. }
  60. }
  61. dataGridViewReaders.DataSource = dt;
  62. if (dataGridViewReaders.Columns["id"] != null)
  63. dataGridViewReaders.Columns["id"].Visible = false;
  64. dataGridViewLoans.DataSource = null;
  65. selectedOrderId = 0;
  66. }
  67. private void dataGridViewReaders_SelectionChanged(object sender, EventArgs e)
  68. {
  69. if (isLoading) return;
  70. if (dataGridViewReaders.CurrentRow == null) return;
  71. int readerId = Convert.ToInt32(dataGridViewReaders.CurrentRow.Cells["id"].Value);
  72. LoadActiveLoans(readerId);
  73. }
  74. private void LoadActiveLoans(int readerId)
  75. {
  76. isLoading = true;
  77. string query = @"
  78. SELECT
  79. o.d AS order_id,
  80. b.title || ' (инв. ' || be.isbn || ')' AS book_display,
  81. o.give_date,
  82. o.return_date
  83. FROM orders o
  84. JOIN book_exemplar be ON o.book_exemplar = be.isbn
  85. JOIN book b ON be.book_id = b.id
  86. WHERE o.user_id = @readerId
  87. AND o.fact_return_date IS NULL
  88. AND be.library_id = @libId -- фильтр по библиотеке экземпляра
  89. ORDER BY o.return_date";
  90. DataTable dt = new DataTable();
  91. using (var conn = new NpgsqlConnection(connStr))
  92. using (var cmd = new NpgsqlCommand(query, conn))
  93. {
  94. cmd.Parameters.AddWithValue("readerId", readerId);
  95. cmd.Parameters.AddWithValue("libId", Session.LibraryId);
  96. conn.Open();
  97. using (var adapter = new NpgsqlDataAdapter(cmd))
  98. {
  99. adapter.Fill(dt);
  100. }
  101. }
  102. dataGridViewLoans.DataSource = dt;
  103. if (dataGridViewLoans.Columns["order_id"] != null)
  104. dataGridViewLoans.Columns["order_id"].Visible = false;
  105. isLoading = false;
  106. }
  107. private void dataGridViewLoans_SelectionChanged(object sender, EventArgs e)
  108. {
  109. if (dataGridViewLoans.CurrentRow == null)
  110. {
  111. selectedOrderId = 0;
  112. return;
  113. }
  114. selectedOrderId = Convert.ToInt32(dataGridViewLoans.CurrentRow.Cells["order_id"].Value);
  115. }
  116. private void buttonReturn_Click(object sender, EventArgs e)
  117. {
  118. if (selectedOrderId == 0)
  119. {
  120. MessageBox.Show("Выберите книгу для возврата", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  121. return;
  122. }
  123. try
  124. {
  125. using (var conn = new NpgsqlConnection(connStr))
  126. {
  127. conn.Open();
  128. string sql = "SELECT return_book(@orderId, @condition)";
  129. using (var cmd = new NpgsqlCommand(sql, conn))
  130. {
  131. cmd.Parameters.AddWithValue("orderId", selectedOrderId);
  132. cmd.Parameters.AddWithValue("condition", "good");
  133. cmd.ExecuteNonQuery();
  134. MessageBox.Show("Книга успешно возвращена", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
  135. txtReaderSearch.Text = "Введите фамилию или телефон";
  136. txtReaderSearch.ForeColor = System.Drawing.Color.Gray;
  137. dataGridViewReaders.DataSource = null;
  138. dataGridViewLoans.DataSource = null;
  139. selectedOrderId = 0;
  140. }
  141. }
  142. }
  143. catch (PostgresException ex)
  144. {
  145. MessageBox.Show($"Ошибка БД: {ex.MessageText}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
  146. }
  147. catch (Exception ex)
  148. {
  149. MessageBox.Show($"Ошибка: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
  150. }
  151. }
  152. private void txtReaderSearch_Enter(object sender, EventArgs e)
  153. {
  154. if (txtReaderSearch.Text == "Введите фамилию или телефон")
  155. {
  156. txtReaderSearch.Text = "";
  157. txtReaderSearch.ForeColor = System.Drawing.Color.Black;
  158. }
  159. }
  160. private void txtReaderSearch_Leave(object sender, EventArgs e)
  161. {
  162. if (string.IsNullOrWhiteSpace(txtReaderSearch.Text))
  163. {
  164. txtReaderSearch.Text = "Введите фамилию или телефон";
  165. txtReaderSearch.ForeColor = System.Drawing.Color.Gray;
  166. }
  167. }
  168. }
  169. }