After Graduate Update

This commit is contained in:
Daniel 2025-11-26 19:31:33 +03:00
parent b92a91ab37
commit c6917dd85e
69 changed files with 7540 additions and 0 deletions

View file

@ -0,0 +1,160 @@
# gui/material_calculator.py
"""
Калькулятор материалов для производства
Соответствует модулю 4 ТЗ
"""
from PyQt6.QtWidgets import (QDialog, QVBoxLayout, QHBoxLayout, QLabel,
QLineEdit, QPushButton, QMessageBox, QFormLayout,
QDoubleSpinBox, QSpinBox)
from PyQt6.QtCore import Qt
import requests
import math
class MaterialCalculatorWindow(QDialog):
def __init__(self, parent=None, auth=None):
super().__init__(parent)
self.auth = auth # Сохраняем auth, даже если не используется
self.setup_ui()
def setup_ui(self):
self.setWindowTitle("Калькулятор материалов для производства")
self.setModal(True)
self.resize(400, 300)
layout = QVBoxLayout()
# Заголовок
title = QLabel("Расчет количества материала")
title.setAlignment(Qt.AlignmentFlag.AlignCenter)
title.setStyleSheet("font-size: 16px; font-weight: bold; margin: 10px;")
layout.addWidget(title)
# Форма ввода параметров
form_layout = QFormLayout()
self.product_type_id = QSpinBox()
self.product_type_id.setRange(1, 100)
form_layout.addRow("ID типа продукции:", self.product_type_id)
self.material_type_id = QSpinBox()
self.material_type_id.setRange(1, 100)
form_layout.addRow("ID типа материала:", self.material_type_id)
self.quantity = QSpinBox()
self.quantity.setRange(1, 1000000)
form_layout.addRow("Количество продукции:", self.quantity)
self.param1 = QDoubleSpinBox()
self.param1.setRange(0.1, 1000.0)
self.param1.setDecimals(2)
form_layout.addRow("Параметр продукции 1:", self.param1)
self.param2 = QDoubleSpinBox()
self.param2.setRange(0.1, 1000.0)
self.param2.setDecimals(2)
form_layout.addRow("Параметр продукции 2:", self.param2)
self.product_coeff = QDoubleSpinBox()
self.product_coeff.setRange(0.1, 10.0)
self.product_coeff.setDecimals(3)
self.product_coeff.setValue(1.0)
form_layout.addRow("Коэффициент типа продукции:", self.product_coeff)
self.defect_percent = QDoubleSpinBox()
self.defect_percent.setRange(0.0, 50.0)
self.defect_percent.setDecimals(1)
self.defect_percent.setSuffix("%")
form_layout.addRow("Процент брака материала:", self.defect_percent)
layout.addLayout(form_layout)
# Результат
self.result_label = QLabel()
self.result_label.setStyleSheet("font-weight: bold; color: #007acc; margin: 10px;")
self.result_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
layout.addWidget(self.result_label)
# Кнопки
buttons_layout = QHBoxLayout()
self.calculate_button = QPushButton("Рассчитать")
self.calculate_button.clicked.connect(self.calculate_material)
self.calculate_button.setStyleSheet("""
QPushButton {
background-color: #007acc;
color: white;
border: none;
padding: 8px 16px;
border-radius: 4px;
font-weight: bold;
}
QPushButton:hover {
background-color: #005a9e;
}
""")
self.close_button = QPushButton("Закрыть")
self.close_button.clicked.connect(self.accept)
buttons_layout.addWidget(self.calculate_button)
buttons_layout.addStretch()
buttons_layout.addWidget(self.close_button)
layout.addLayout(buttons_layout)
self.setLayout(layout)
def calculate_material(self):
"""Расчет количества материала с обработкой ошибок"""
try:
# Проверяем валидность входных данных
if (self.param1.value() <= 0 or self.param2.value() <= 0 or
self.product_coeff.value() <= 0 or self.defect_percent.value() < 0):
self.result_label.setText("Ошибка: неверные параметры")
self.result_label.setStyleSheet("color: red; font-weight: bold;")
return
# Создаем данные для расчета
calculation_data = {
'product_type_id': self.product_type_id.value(),
'material_type_id': self.material_type_id.value(),
'quantity': self.quantity.value(),
'param1': self.param1.value(),
'param2': self.param2.value(),
'product_coeff': self.product_coeff.value(),
'defect_percent': self.defect_percent.value()
}
# Локальный расчет (без API)
material_quantity = self.calculate_locally(calculation_data)
if material_quantity >= 0:
self.result_label.setText(
f"Необходимое количество материала: {material_quantity} единиц"
)
self.result_label.setStyleSheet("color: #007acc; font-weight: bold;")
else:
self.result_label.setText("Ошибка: неверные параметры расчета")
self.result_label.setStyleSheet("color: red; font-weight: bold;")
except Exception as e:
self.result_label.setText(f"Ошибка расчета: {str(e)}")
self.result_label.setStyleSheet("color: red; font-weight: bold;")
def calculate_locally(self, data):
"""Локальный расчет материалов"""
try:
import math
# Расчет количества материала на одну единицу продукции
material_per_unit = data['param1'] * data['param2'] * data['product_coeff']
# Расчет общего количества материала с учетом брака
total_material = material_per_unit * data['quantity']
total_material_with_defect = total_material * (1 + data['defect_percent'] / 100)
# Округление до целого числа в большую сторону
return math.ceil(total_material_with_defect)
except:
return -1