Загрузка данных


import sys
import psycopg2
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, 
                             QHBoxLayout, QLabel, QTableWidget, QTableWidgetItem, 
                             QScrollArea, QPushButton, QHeaderView, QGroupBox)
from PyQt5.QtCore import Qt

DB_CONFIG = {
    "dbname": "publishing_center",
    "user": "postgres",
    "password": "123456",
    "host": "localhost",
    "port": 5432,
    "client_encoding": "UTF8"
}

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Издательский центр - Заказы")
        self.setGeometry(100, 100, 1100, 600)
        
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        main_layout = QVBoxLayout()
        central_widget.setLayout(main_layout)
        
        title = QLabel("ВСЕ ЗАКАЗЫ В СИСТЕМЕ")
        title.setStyleSheet("font-size: 20px; font-weight: bold; padding: 10px; background-color: #2c3e50; color: white;")
        title.setAlignment(Qt.AlignCenter)
        main_layout.addWidget(title)
        
        btn_layout = QHBoxLayout()
        self.btn_refresh = QPushButton("Обновить")
        self.btn_refresh.setStyleSheet("font-size: 14px; padding: 8px; background-color: #3498db; color: white;")
        self.btn_refresh.clicked.connect(self.load_orders)
        btn_layout.addWidget(self.btn_refresh)
        btn_layout.addStretch()
        main_layout.addLayout(btn_layout)
        
        group = QGroupBox("Список заказов")
        group.setStyleSheet("font-size: 14px; font-weight: bold;")
        group_layout = QVBoxLayout()
        group.setLayout(group_layout)
        
        scroll = QScrollArea()
        scroll.setWidgetResizable(True)
        scroll.setStyleSheet("border: 1px solid #bdc3c7;")
        
        self.table = QTableWidget()
        self.table.setColumnCount(7)
        self.table.setHorizontalHeaderLabels(["Номер заказа", "Заказчик", "Книга", "Количество", "Цена", "Дата заказа", "Выполнен"])
        self.table.setAlternatingRowColors(True)
        self.table.setStyleSheet("""
            QTableWidget {
                font-size: 13px;
                gridline-color: #bdc3c7;
            }
            QTableWidget::item {
                padding: 8px;
            }
            QHeaderView::section {
                background-color: #34495e;
                color: white;
                font-weight: bold;
                padding: 8px;
            }
        """)
        self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.table.verticalHeader().setVisible(False)
        
        scroll.setWidget(self.table)
        group_layout.addWidget(scroll)
        main_layout.addWidget(group)
        
        self.status_label = QLabel("Готово")
        self.status_label.setStyleSheet("padding: 5px; color: #7f8c8d;")
        main_layout.addWidget(self.status_label)
        
        self.load_orders()
    
    def load_orders(self):
        try:
            conn = psycopg2.connect(**DB_CONFIG)
            cur = conn.cursor()
            
            cur.execute("""
                SELECT 
                    o.order_id,
                    c.name as customer_name,
                    b.title as book_title,
                    o.quantity,
                    b.sale_price,
                    o.order_date,
                    o.execute_date
                FROM orders o
                JOIN book b ON o.book_code = b.book_code
                JOIN customer c ON o.customer_id = c.customer_id
                ORDER BY o.order_date DESC;
            """)
            
            rows = cur.fetchall()
            cur.close()
            conn.close()
            
            self.table.setRowCount(len(rows))
            
            for i, row in enumerate(rows):
                order_id, customer, book, qty, price, order_date, execute_date = row
                
                self.table.setItem(i, 0, QTableWidgetItem(str(order_id)))
                self.table.setItem(i, 1, QTableWidgetItem(str(customer)))
                self.table.setItem(i, 2, QTableWidgetItem(str(book)))
                self.table.setItem(i, 3, QTableWidgetItem(str(qty)))
                self.table.setItem(i, 4, QTableWidgetItem(str(float(price))))
                self.table.setItem(i, 5, QTableWidgetItem(str(order_date)))
                
                if execute_date:
                    self.table.setItem(i, 6, QTableWidgetItem(str(execute_date)))
                else:
                    item = QTableWidgetItem("НЕ ВЫПОЛНЕН")
                    item.setBackground(Qt.red)
                    item.setForeground(Qt.white)
                    self.table.setItem(i, 6, item)
            
            self.status_label.setText("Загружено " + str(len(rows)) + " заказов")
            
        except Exception as e:
            self.status_label.setText("Ошибка: " + str(e))
            self.table.setRowCount(0)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())