OrderRepository.cs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using Npgsql;
  5. using RestaurantApp.Models;
  6. namespace RestaurantApp.DAL
  7. {
  8. public class OrderRepository
  9. {
  10. public List<Order> GetAll(string statusFilter = "", string search = "")
  11. {
  12. var list = new List<Order>();
  13. using (var conn = Database.GetConnection())
  14. {
  15. var sql = @"SELECT o.order_id, o.table_id,
  16. h.name||' стол №'||dt.table_number as table_info,
  17. o.employee_id,
  18. e.last_name||' '||e.first_name as emp_name,
  19. o.client_id,
  20. COALESCE(c.last_name||' '||c.first_name, '') as client_name,
  21. o.opened_at, o.closed_at, o.status,
  22. o.discount_pct, o.total_amount
  23. FROM ""order"" o
  24. JOIN dining_table dt ON dt.table_id = o.table_id
  25. JOIN hall h ON h.hall_id = dt.hall_id
  26. JOIN employee e ON e.employee_id = o.employee_id
  27. LEFT JOIN client c ON c.client_id = o.client_id
  28. WHERE 1=1 ";
  29. if (!string.IsNullOrWhiteSpace(statusFilter) && statusFilter != "Все")
  30. sql += " AND o.status = @st";
  31. if (!string.IsNullOrWhiteSpace(search))
  32. sql += " AND (CAST(o.order_id AS TEXT) LIKE @s OR LOWER(e.last_name) LIKE LOWER(@s) OR LOWER(c.last_name) LIKE LOWER(@s))";
  33. sql += " ORDER BY o.opened_at DESC LIMIT 500";
  34. using (var cmd = new NpgsqlCommand(sql, conn))
  35. {
  36. if (!string.IsNullOrWhiteSpace(statusFilter) && statusFilter != "Все")
  37. cmd.Parameters.AddWithValue("st", statusFilter);
  38. if (!string.IsNullOrWhiteSpace(search))
  39. cmd.Parameters.AddWithValue("s", $"%{search}%");
  40. using (var r = cmd.ExecuteReader())
  41. while (r.Read()) list.Add(MapOrder(r));
  42. }
  43. }
  44. return list;
  45. }
  46. public List<OrderItem> GetItems(int orderId)
  47. {
  48. var list = new List<OrderItem>();
  49. using (var conn = Database.GetConnection())
  50. using (var cmd = new NpgsqlCommand(
  51. @"SELECT oi.order_item_id,oi.order_id,oi.dish_id,d.name,
  52. oi.quantity,oi.unit_price,oi.notes,oi.status
  53. FROM order_item oi JOIN dish d ON d.dish_id=oi.dish_id
  54. WHERE oi.order_id=@id ORDER BY oi.order_item_id", conn))
  55. {
  56. cmd.Parameters.AddWithValue("id", orderId);
  57. using (var r = cmd.ExecuteReader())
  58. while (r.Read())
  59. list.Add(new OrderItem
  60. {
  61. OrderItemId = r.GetInt32(0),
  62. OrderId = r.GetInt32(1),
  63. DishId = r.GetInt32(2),
  64. DishName = r.GetString(3),
  65. Quantity = r.GetInt32(4),
  66. UnitPrice = r.GetDecimal(5),
  67. Notes = r.IsDBNull(6) ? "" : r.GetString(6),
  68. Status = r.GetString(7)
  69. });
  70. }
  71. return list;
  72. }
  73. public int InsertOrder(Order o)
  74. {
  75. using (var conn = Database.GetConnection())
  76. using (var cmd = new NpgsqlCommand(
  77. @"INSERT INTO ""order""(table_id,employee_id,client_id,status,discount_pct,total_amount)
  78. VALUES(@t,@e,@c,'open',@d,0) RETURNING order_id", conn))
  79. {
  80. cmd.Parameters.AddWithValue("t", o.TableId);
  81. cmd.Parameters.AddWithValue("e", o.EmployeeId);
  82. cmd.Parameters.AddWithValue("c", o.ClientId.HasValue ? (object)o.ClientId.Value : DBNull.Value);
  83. cmd.Parameters.AddWithValue("d", o.DiscountPct);
  84. return (int)cmd.ExecuteScalar();
  85. }
  86. }
  87. public void AddItem(OrderItem item)
  88. {
  89. using (var conn = Database.GetConnection())
  90. using (var cmd = new NpgsqlCommand(
  91. @"INSERT INTO order_item(order_id,dish_id,quantity,unit_price,notes,status)
  92. VALUES(@o,@d,@q,@p,@n,'ordered')", conn))
  93. {
  94. cmd.Parameters.AddWithValue("o", item.OrderId);
  95. cmd.Parameters.AddWithValue("d", item.DishId);
  96. cmd.Parameters.AddWithValue("q", item.Quantity);
  97. cmd.Parameters.AddWithValue("p", item.UnitPrice);
  98. cmd.Parameters.AddWithValue("n", string.IsNullOrEmpty(item.Notes) ? (object)DBNull.Value : item.Notes);
  99. cmd.ExecuteNonQuery();
  100. }
  101. }
  102. public void UpdateOrderStatus(int orderId, string status)
  103. {
  104. using (var conn = Database.GetConnection())
  105. using (var cmd = new NpgsqlCommand(
  106. @"UPDATE ""order"" SET status=@s, closed_at=CASE WHEN @s IN ('closed','cancelled') THEN NOW() ELSE closed_at END
  107. WHERE order_id=@id", conn))
  108. {
  109. cmd.Parameters.AddWithValue("s", status);
  110. cmd.Parameters.AddWithValue("id", orderId);
  111. cmd.ExecuteNonQuery();
  112. }
  113. }
  114. public void UpdateItemStatus(int itemId, string status)
  115. {
  116. using (var conn = Database.GetConnection())
  117. using (var cmd = new NpgsqlCommand(
  118. "UPDATE order_item SET status=@s WHERE order_item_id=@id", conn))
  119. {
  120. cmd.Parameters.AddWithValue("s", status);
  121. cmd.Parameters.AddWithValue("id", itemId);
  122. cmd.ExecuteNonQuery();
  123. }
  124. }
  125. public void DeleteItem(int itemId)
  126. {
  127. using (var conn = Database.GetConnection())
  128. using (var cmd = new NpgsqlCommand(
  129. "UPDATE order_item SET status='cancelled' WHERE order_item_id=@id", conn))
  130. {
  131. cmd.Parameters.AddWithValue("id", itemId);
  132. cmd.ExecuteNonQuery();
  133. }
  134. }
  135. public void AddPayment(int orderId, decimal amount, string method)
  136. {
  137. using (var conn = Database.GetConnection())
  138. using (var cmd = new NpgsqlCommand(
  139. "INSERT INTO payment(order_id,amount,method) VALUES(@o,@a,@m)", conn))
  140. {
  141. cmd.Parameters.AddWithValue("o", orderId);
  142. cmd.Parameters.AddWithValue("a", amount);
  143. cmd.Parameters.AddWithValue("m", method);
  144. cmd.ExecuteNonQuery();
  145. }
  146. }
  147. public DataTable GetTables()
  148. {
  149. var dt = new DataTable();
  150. using (var conn = Database.GetConnection())
  151. using (var cmd = new NpgsqlCommand(
  152. @"SELECT dt.table_id, h.name||' — стол №'||dt.table_number||' ('||dt.seats||' мест)' as info
  153. FROM dining_table dt JOIN hall h ON h.hall_id=dt.hall_id
  154. WHERE dt.is_active=true ORDER BY h.name, dt.table_number", conn))
  155. using (var da = new NpgsqlDataAdapter(cmd))
  156. da.Fill(dt);
  157. return dt;
  158. }
  159. private Order MapOrder(NpgsqlDataReader r) => new Order
  160. {
  161. OrderId = r.GetInt32(0),
  162. TableId = r.GetInt32(1),
  163. TableInfo = r.GetString(2),
  164. EmployeeId = r.GetInt32(3),
  165. EmployeeName = r.GetString(4),
  166. ClientId = r.IsDBNull(5) ? (int?)null : r.GetInt32(5),
  167. ClientName = r.GetString(6),
  168. OpenedAt = r.GetDateTime(7),
  169. ClosedAt = r.IsDBNull(8) ? (DateTime?)null : r.GetDateTime(8),
  170. Status = r.GetString(9),
  171. DiscountPct = r.GetDecimal(10),
  172. TotalAmount = r.IsDBNull(11) ? 0 : r.GetDecimal(11)
  173. };
  174. }
  175. }