Загрузка данных
from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QStandardItemModel, QStandardItem
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(800, 500)
palette = QtGui.QPalette()
brush = QtGui.QBrush(QtGui.QColor(255, 201, 6))
brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern)
palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.WindowText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern)
palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(37, 150, 37))
brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern)
palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Window, brush)
Form.setPalette(palette)
font = QtGui.QFont()
font.setPointSize(12)
Form.setFont(font)
self.tableView = QtWidgets.QTableView(parent=Form)
self.tableView.setGeometry(QtCore.QRect(30, 80, 740, 380))
self.tableView.setObjectName("tableView")
self.label = QtWidgets.QLabel(parent=Form)
self.label.setGeometry(QtCore.QRect(30, 30, 740, 41))
font = QtGui.QFont()
font.setPointSize(14)
font.setBold(True)
self.label.setFont(font)
self.label.setObjectName("label")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Топливо, проданное вам"))
self.label.setText(_translate("Form", "ТОПЛИВО ПРОДАННОЕ ВАМ"))
class ToplivoWindow(QtWidgets.QWidget):
def __init__(self, user_data, db_connection):
super().__init__()
self.user_data = user_data # (user_id, login, client_card)
self.db = db_connection
self.ui = Ui_Form()
self.ui.setupUi(self)
self.resize(850, 550)
# Получаем ФИО клиента и обновляем заголовок
client_fio = self.get_client_fio()
if client_fio:
self.setWindowTitle(f"История покупок топлива - {client_fio}")
else:
self.setWindowTitle("История покупок топлива")
self.setup_table()
self.load_data()
def setup_table(self):
self.model = QStandardItemModel()
self.ui.tableView.setModel(self.model)
self.ui.tableView.setAlternatingRowColors(True)
self.ui.tableView.setStyleSheet("""
QTableView {
gridline-color: #ccc;
font-size: 12px;
}
QTableView::item:selected {
background-color: #4CAF50;
color: white;
}
QHeaderView::section {
background-color: #2c3e50;
color: white;
padding: 8px;
font-weight: bold;
font-size: 12px;
}
""")
self.ui.tableView.horizontalHeader().setStretchLastSection(True)
def get_client_fio(self):
"""Получить ФИО клиента"""
try:
_, _, client_card = self.user_data
if not client_card or not self.db:
return None
# Запрашиваем ФИО из базы данных
query = "SELECT name, lastname, otchestvo FROM client WHERE client_card = %s"
self.db.cur.execute(query, (client_card,))
result = self.db.cur.fetchone()
if result:
name, lastname, otchestvo = result
# Формируем ФИО: Иванов Иван Иванович
fio = f"{lastname} {name} {otchestvo}".strip()
return fio
return None
except Exception as e:
print(f"Ошибка при получении ФИО: {e}")
return None
def load_data(self):
try:
_, _, client_card = self.user_data
if not client_card:
self.show_error("У вас нет привязанной клиентской карты")
return
if not self.db or not self.db.con:
self.show_error("Нет подключения к базе данных")
return
# Получаем ФИО клиента
client_fio = self.get_client_fio()
fio_text = f" {client_fio}" if client_fio else ""
query = """
SELECT
TO_CHAR(p.data_p, 'DD.MM.YYYY') as "Дата",
t.vid as "Вид топлива",
p.kolvo::text as "Количество",
t.ed_izmer as "Ед. изм.",
(p.kolvo * t.cena)::text as "Сумма",
f.name as "Компания",
z.adres as "Адрес АЗС"
FROM prodaja p
JOIN toplivo t ON p.id_t = t.id_toplivo
JOIN zapravka z ON p.id_a = z.id
JOIN firm f ON z.name_firm = f.id_firm
WHERE p.id_c = %s
ORDER BY p.data_p DESC
"""
self.db.cur.execute(query, (client_card,))
data = self.db.cur.fetchall()
if not data:
self.show_error(f"У{fio_text} пока нет покупок топлива")
return
headers = ["Дата", "Вид топлива", "Количество", "Ед. изм.", "Сумма (руб)", "Компания", "Адрес АЗС"]
self.model.setHorizontalHeaderLabels(headers)
total_sum = 0
for row, record in enumerate(data):
for col, value in enumerate(record):
item = QStandardItem(str(value))
item.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
self.model.setItem(row, col, item)
if col == 4: # Столбец суммы
try:
total_sum += float(value)
except:
pass
self.ui.tableView.resizeColumnsToContents()
# Обновляем заголовок с ФИО
self.ui.label.setText(f"ТОПЛИВО, ПРОДАННОЕ{fio_text} | Общая сумма: {total_sum:.2f} руб")
except Exception as e:
print(f"Ошибка загрузки данных: {e}")
import traceback
traceback.print_exc()
self.show_error(f"Ошибка загрузки: {str(e)}")
def show_error(self, message):
"""Показывает сообщение об ошибке в таблице"""
self.model.clear()
self.model.setHorizontalHeaderLabels(["Сообщение"])
item = QStandardItem(message)
item.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
self.model.setItem(0, 0, item)
self.ui.label.setText("ОШИБКА")