After Graduate Update
This commit is contained in:
parent
b92a91ab37
commit
c6917dd85e
69 changed files with 7540 additions and 0 deletions
160
ressult/gui/material_calculator.py
Normal file
160
ressult/gui/material_calculator.py
Normal 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue