/
LazyCoder
/
Demka
Обзор
Документация
Войти
/
LazyCoder
/
Demka
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
UI/Ui.py
434 строки
17 KB
Andreev A
сделана демка
05 фев 2025, 09:59
05 фев 2025, 09:59
82c9c0c
Код
Авторство
О чём код?
import sys from PySide6.QtWidgets import ( QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QComboBox, QScrollArea, QFrame, QPushButton, QLineEdit, QMessageBox, QStackedWidget ) from PySide6.QtGui import QFont, QIcon, QPixmap from PySide6.QtCore import Qt from sqlalchemy.orm import Session from sqlalchemy import func from Database.connection import engine from Entities.ProductType import ProductType from Entities.Product import Product from Entities.Partner import Partner from Entities.SalesHistory import SalesHistory session = Session(engine) def calculate_discount(partner_id): total_quantity = session.query(func.sum(SalesHistory.quantity)).filter(SalesHistory.partner_id == partner_id).scalar() or 0 if total_quantity > 300000: return 15 elif total_quantity > 50000: return 10 elif total_quantity > 10000: return 5 else: return 0 class PartnerCard(QFrame): def __init__(self, partner, discount, parent_list_widget=None): super().__init__() self.partner = partner self.parent_list_widget = parent_list_widget self.setStyleSheet(""" background-color: #F4E8D3; margin: 10px; border-radius: 8px; border: 1px solid #67BA80; font-size: 18px; """) self.layout = QHBoxLayout(self) left_layout = QVBoxLayout() name_label = QLabel(f"{partner.partner_type} {partner.name}") name_label.setFont(QFont("Arial", 16, QFont.Bold)) name_label.setStyleSheet("color: #000000; background-color: #FFFFFF") director_label = QLabel(f"Директор: {partner.director}") director_label.setStyleSheet("color: #000000; background-color: #FFFFFF") phone_label = QLabel(f"Телефон: {self.format_phone_number(partner.phone)}") phone_label.setStyleSheet("color: #000000; background-color: #FFFFFF") rating_label = QLabel(f"Рейтинг: {partner.rating}") rating_label.setStyleSheet("color: #000000; background-color: #FFFFFF") left_layout.addWidget(name_label) left_layout.addWidget(director_label) left_layout.addWidget(phone_label) left_layout.addWidget(rating_label) right_layout = QVBoxLayout() discount_label = QLabel(f"{discount}%") discount_label.setStyleSheet("color: #000000; background-color: #FFFFFF") edit_partner_button = QPushButton("Изменить") edit_partner_button.setStyleSheet(""" background-color: #67BA80; color: #FFFFFF; border-radius: 5px; padding: 8px 15px; """) edit_partner_button.setCursor(Qt.PointingHandCursor) edit_partner_button.clicked.connect(self.open_edit_partner_form) view_history_button = QPushButton("История продаж") view_history_button.setStyleSheet(""" background-color: #67BA80; color: #FFFFFF; border-radius: 5px; padding: 8px 15px; """) view_history_button.setCursor(Qt.PointingHandCursor) view_history_button.clicked.connect(self.open_sales_history) right_layout.addWidget(edit_partner_button) right_layout.addWidget(view_history_button) right_layout.addWidget(discount_label) self.layout.addLayout(left_layout) self.layout.addLayout(right_layout) def open_edit_partner_form(self): if self.parent_list_widget: self.parent_list_widget.open_edit_partner_form(self.partner) def open_sales_history(self): if self.parent_list_widget: self.parent_list_widget.open_sales_history(self.partner) def format_phone_number(self, phone): return f"+7 {phone[0:3]} {phone[4:7]} {phone[8:10]} {phone[11:13]}" class SalesHistoryWidget(QWidget): def __init__(self, partner, parent=None): super().__init__(parent) self.partner = partner self.setWindowTitle(f"История продаж - {partner.name}") self.setStyleSheet(""" background-color: #F4E8D3; font-size: 18px; color: #000000; """) self.layout = QVBoxLayout(self) self.layout.setSpacing(10) self.layout.setContentsMargins(20, 20, 20, 20) title_label = QLabel(f"История продаж партнёра: {partner.name}") title_label.setFont(QFont("Arial", 20, QFont.Bold)) self.layout.addWidget(title_label) self.scroll_area = QScrollArea() self.scroll_area.setWidgetResizable(True) self.content_widget = QWidget() self.content_layout = QVBoxLayout(self.content_widget) self.scroll_area.setWidget(self.content_widget) self.layout.addWidget(self.scroll_area) back_button = QPushButton("Назад") back_button.setStyleSheet(""" background-color: #67BA80; color: #FFFFFF; border-radius: 8px; padding: 8px 15px; """) back_button.clicked.connect(self.go_back) self.layout.addWidget(back_button) self.load_sales_history() def load_sales_history(self): for i in reversed(range(self.content_layout.count())): widget = self.content_layout.itemAt(i).widget() if widget: widget.deleteLater() sales_history = session.query(SalesHistory).filter(SalesHistory.partner_id == self.partner.id).all() for sale in sales_history: sale_label = QLabel( f"Наименование: {sale.product.name}, " f"Количество: {sale.quantity}, " f"Дата продажи: {sale.sale_date.strftime('%d.%m.%Y')}" ) sale_label.setStyleSheet("padding: 8px; border: 1px solid #67BA80; border-radius: 5px;") self.content_layout.addWidget(sale_label) def go_back(self): self.parent().setCurrentIndex(0) class PartnerList(QWidget): def __init__(self, stack_widget): super().__init__() self.stack_widget = stack_widget self.setWindowTitle("Список партнёров") self.setStyleSheet("background-color: #F8F8F8; color: black;") self.main_layout = QVBoxLayout(self) title_layout = QHBoxLayout() # Логотип logo_label = QLabel() logo_pixmap = QPixmap("icons/Мастер пол.png") # Путь к логотипу logo_label.setPixmap(logo_pixmap.scaled(50, 50, Qt.KeepAspectRatio, Qt.SmoothTransformation)) # Масштабируем логотип title_layout.addWidget(logo_label) # Текст "Мастер пол" title_label = QLabel("Мастер пол") title_label.setFont(QFont("Arial", 20, QFont.Bold)) title_layout.addWidget(title_label) # Выравниваем элементы по левому краю title_layout.setAlignment(Qt.AlignCenter) # Добавляем в основной макет self.main_layout.addLayout(title_layout) self.scroll_area = QScrollArea() self.scroll_area.setWidgetResizable(True) self.content_widget = QWidget() self.content_layout = QVBoxLayout(self.content_widget) self.scroll_area.setWidget(self.content_widget) self.main_layout.addWidget(self.scroll_area) add_partner_button = QPushButton("Добавить партнёра") add_partner_button.setStyleSheet(""" background-color: #67BA80; border: none; padding: 8px 15px; border-radius: 5px; color: #FFFFFF; font-size: 18px """) add_partner_button.clicked.connect(self.open_add_partner_form) self.main_layout.addWidget(add_partner_button) self.load_partners() def load_partners(self): for i in reversed(range(self.content_layout.count())): widget = self.content_layout.itemAt(i).widget() if widget: widget.deleteLater() partners = session.query(Partner).all() for partner in partners: discount = calculate_discount(partner.id) card = PartnerCard(partner, discount=discount, parent_list_widget=self) self.content_layout.addWidget(card) def refresh_partner_list(self): self.load_partners() def open_add_partner_form(self): self.stack_widget.setCurrentIndex(1) def open_edit_partner_form(self, partner): edit_form = self.stack_widget.widget(2) edit_form.populate_fields(partner) self.stack_widget.setCurrentIndex(2) def open_sales_history(self, partner): sales_history_widget = SalesHistoryWidget(partner, parent=self.stack_widget) self.stack_widget.addWidget(sales_history_widget) self.stack_widget.setCurrentWidget(sales_history_widget) class PartnerFormBase(QWidget): def __init__(self, parent=None): super().__init__(parent) self.parent_widget = parent self.setWindowTitle("Мастер пол") self.setStyleSheet(""" background-color: #F4E8D3; color: #000000; font-size: 18px; """) self.layout = QVBoxLayout(self) self.layout.setSpacing(10) self.layout.setContentsMargins(20, 20, 20, 20) self.init_ui() def init_ui(self): self.name_input = self.create_input_field("Наименование") self.type_input = self.create_dropdown_field("Тип партнёра", ["ОАО", "ЗАО", "ООО", "ПАО"]) self.rating_input = self.create_input_field("Рейтинг") self.address_input = self.create_input_field("Адрес") self.director_input = self.create_input_field("ФИО директора") self.phone_input = self.create_input_field("Телефон") self.email_input = self.create_input_field("Email") self.phone_input.setInputMask("+7(999)999-99-99") # Маска для телефона back_button = QPushButton("Назад") back_button.setStyleSheet("background-color: #67BA80; color: #FFFFFF") back_button.clicked.connect(self.go_back) self.layout.addWidget(back_button) def create_label(self, text): label = QLabel(text) label.setStyleSheet("font-weight: bold;") return label def create_input_field(self, placeholder): label = self.create_label(placeholder) input_field = QLineEdit() input_field.setPlaceholderText(placeholder) input_field.setStyleSheet(""" background-color: #FFFFFF; border: 2px solid #67BA80; border-radius: 8px; padding: 4px 8px; """) self.layout.addWidget(label) self.layout.addWidget(input_field) return input_field def create_dropdown_field(self, label_text, options): label = self.create_label(label_text) dropdown = QComboBox() dropdown.addItems(options) dropdown.setStyleSheet(""" background-color: #FFFFFF; border: 2px solid #67BA80; border-radius: 8px; padding: 4px 8px; """) self.layout.addWidget(label) self.layout.addWidget(dropdown) return dropdown def go_back(self): self.parent_widget.setCurrentIndex(0) class AddPartnerForm(PartnerFormBase): def __init__(self, parent=None): super().__init__(parent) save_button = QPushButton("Добавить") save_button.setStyleSheet("background-color: #67BA80; color: #FFFFFF") save_button.clicked.connect(self.add_partner) self.layout.addWidget(save_button) def add_partner(self): try: name = self.name_input.text() partner_type = self.type_input.currentText() rating_text = self.rating_input.text() # Проверка на дробное число и отрицательные значения if '.' in rating_text or ',' in rating_text: QMessageBox.critical(self, "Ошибка", "Рейтинг должен быть целым числом, дробные числа не допускаются.") return if not rating_text.isdigit() or int(rating_text) < 0: QMessageBox.warning(self, "Ошибка", "Рейтинг должен быть целым неотрицательным числом.") return rating = int(rating_text) address = self.address_input.text() director = self.director_input.text() phone = self.phone_input.text() email = self.email_input.text() # Валидация email if '@' not in email: QMessageBox.warning(self, "Ошибка", "Поле Email должно содержать символ '@'.") return new_phone = f"{phone[3:6]} {phone[7:10]} {phone[11:13]} {phone[14:16]}" if len(new_phone) != 13: QMessageBox.warning(self, "Ошибка", "Неверный формат номера") return new_partner = Partner( name=name, partner_type=partner_type, rating=rating, legal_address=address, director=director, phone=new_phone, email=email ) session.add(new_partner) session.commit() QMessageBox.information(self, "Успех", "Партнёр успешно добавлен!") self.go_back() self.parent_widget.partner_list.refresh_partner_list() except Exception as e: QMessageBox.critical(self, "Ошибка", f"Ошибка сохранения: {str(e)}") class EditPartnerForm(PartnerFormBase): def __init__(self, parent=None): super().__init__(parent) save_button = QPushButton("Сохранить изменения") save_button.setStyleSheet("background-color: #67BA80; color: #FFFFFF") save_button.clicked.connect(self.save_partner) self.layout.addWidget(save_button) def populate_fields(self, partner): """Заполняет поля данными партнёра.""" self.partner = partner self.name_input.setText(partner.name) self.type_input.setCurrentText(partner.partner_type) self.rating_input.setText(str(partner.rating)) self.address_input.setText(partner.legal_address) self.director_input.setText(partner.director) self.phone_input.setText(partner.phone) self.email_input.setText(partner.email) def save_partner(self): """Сохраняет изменения в партнёре.""" try: phone = self.phone_input.text() new_phone = f"{phone[3:6]} {phone[7:10]} {phone[11:13]} {phone[14:16]}" rating_text = self.rating_input.text() # Проверка на дробное число и отрицательные значения if '.' in rating_text or ',' in rating_text: QMessageBox.critical(self, "Ошибка", "Рейтинг должен быть целым числом, дробные числа не допускаются.") return if not rating_text.isdigit() or int(rating_text) < 0: QMessageBox.warning(self, "Ошибка", "Рейтинг должен быть целым неотрицательным числом.") return self.partner.name = self.name_input.text() self.partner.partner_type = self.type_input.currentText() self.partner.rating = int(rating_text) self.partner.legal_address = self.address_input.text() self.partner.director = self.director_input.text() self.partner.phone = new_phone self.partner.email = self.email_input.text() # Валидация email if '@' not in self.partner.email: QMessageBox.warning(self, "Ошибка", "Поле Email должно содержать символ '@'.") return if len(self.partner.phone) != 13: QMessageBox.warning(self, "Ошибка", "Неверный формат номера") return session.commit() QMessageBox.information(self, "Успех", "Изменения успешно сохранены!") self.go_back() self.parent_widget.partner_list.refresh_partner_list() except Exception as e: QMessageBox.critical(self, "Ошибка", f"Ошибка сохранения: {str(e)}") class MainApp(QStackedWidget): def __init__(self): super().__init__() self.partner_list = PartnerList(self) self.add_partner_form = AddPartnerForm(self) self.edit_partner_form = EditPartnerForm(self) self.addWidget(self.partner_list) self.addWidget(self.add_partner_form) self.addWidget(self.edit_partner_form) self.setCurrentIndex(0) if __name__ == "__main__": app = QApplication(sys.argv) window = MainApp() window.setWindowIcon(QIcon("icons/Мастер пол.ico")) window.setWindowTitle("Мастер пол") window.show() sys.exit(app.exec())