Files
MES_Core/shiftflow/models.py
ackFromRedmi f759c2c17e
All checks were successful
Deploy MES Core / deploy (push) Successful in 9s
Обновил модели: добавил Компании и Габариты
2026-03-28 11:49:01 +03:00

97 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class Company(models.Model):
"""
Справочник контрагентов/заказчиков.
Позволяет группировать сделки по компаниям и избегать дублей в названиях.
"""
name = models.CharField("Название компании", max_length=255, unique=True)
description = models.TextField("Краткое описание / Примечание", blank=True)
def __str__(self): return self.name
class Meta:
verbose_name = "Компания"; verbose_name_plural = "Компании"
class Machine(models.Model):
"""
Список производственных участков (станков).
Используется для фильтрации сменных заданий для конкретных операторов.
"""
name = models.CharField("Название станка", max_length=100)
def __str__(self): return self.name
class Meta:
verbose_name = "Станок"; verbose_name_plural = "Станки"
class Deal(models.Model):
"""
Заказ или проект. Номер парсится из пути к файлам.
Служит контейнером для группы деталей (позиций).
"""
number = models.CharField("№ Сделки", max_length=100, unique=True)
company = models.ForeignKey(Company, on_delete=models.PROTECT, verbose_name="Заказчик", null=True, blank=True)
description = models.TextField("Описание сделки", blank=True, help_text="Общая информация по заказу")
def __str__(self): return f"Сделка №{self.number} ({self.company})"
class Meta:
verbose_name = "Сделка"; verbose_name_plural = "Сделки"
class Material(models.Model):
"""
Справочник ТМЦ (Трубы, листы, профили).
Необходим для точного списания остатков и синхронизации с 1С.
"""
name = models.CharField("Наименование", max_length=255, unique=True)
def __str__(self): return self.name
class Meta:
verbose_name = "Материал"; verbose_name_plural = "Материалы"
class Item(models.Model):
"""
Единица сменного задания. Основная рабочая сущность.
Статус по умолчанию 'work' (В работе).
"""
STATUS_CHOICES = [
('work', 'В работе'),
('done', 'Выполнено'),
('partial', 'Частично'),
('leftover', 'Недодел'),
]
# --- База (заполняет начальник) ---
date = models.DateField("Дата задания", default=timezone.now)
machine = models.ForeignKey(Machine, on_delete=models.PROTECT, verbose_name="Станок")
deal = models.ForeignKey(Deal, on_delete=models.CASCADE, verbose_name="Сделка")
drawing_name = models.CharField("Название детали", max_length=255, blank=True, default="Б/ч")
size_value = models.FloatField("Размер детали", help_text="Длина (мм) или Толщина (мм)")
drawing_file = models.FileField("Исходник (DXF/STEP)", upload_to="drawings/%Y/%m/", blank=True, null=True)
extra_drawing = models.FileField("Доп. чертеж (PDF)", upload_to="extra_drawings/%Y/%m/", blank=True, null=True)
material = models.ForeignKey(Material, on_delete=models.PROTECT, verbose_name="Материал")
quantity_plan = models.PositiveIntegerField("План, шт")
is_bend = models.BooleanField("Гибка", default=False)
# --- Исполнение (заполняет оператор/мастер) ---
operator = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="Исполнитель")
quantity_fact = models.PositiveIntegerField("Факт, шт", default=0)
material_taken = models.TextField("Взятый материал", blank=True, help_text="Напр: 3 трубы по 12м")
usable_waste = models.TextField("Деловой отход", blank=True, help_text="Напр: кусок 1500мм")
scrap_weight = models.FloatField("Лом (кг)", default=0.0)
# --- Статусы и учет ---
status = models.CharField("Статус", max_length=10, choices=STATUS_CHOICES, default='work')
is_synced_1c = models.BooleanField("Учтено в 1С", default=False)
class Meta:
verbose_name = "Позиция"; verbose_name_plural = "Сменное задание"
ordering = ['-date', 'deal']
def __str__(self):
return f"{self.drawing_name} ({self.quantity_plan} шт.)"