Обновил модели: добавил Компании и Габариты
All checks were successful
Deploy MES Core / deploy (push) Successful in 9s

This commit is contained in:
2026-03-28 11:49:01 +03:00
parent fba195db9c
commit f759c2c17e
6 changed files with 337 additions and 38 deletions

View File

@@ -1,40 +1,97 @@
from django.db import models
# Create your models here.
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) # Лентопил, Труборез, Лазер
"""
Список производственных участков (станков).
Используется для фильтрации сменных заданий для конкретных операторов.
"""
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 = [
('new', 'В задании'),
('work', 'В работе'),
('done', 'Выполнено'),
('partial', 'Частично'),
('leftover', 'Недодел'),
]
date = models.DateField("Дата", default=timezone.now)
# --- База (заполняет начальник) ---
date = models.DateField("Дата задания", default=timezone.now)
machine = models.ForeignKey(Machine, on_delete=models.PROTECT, verbose_name="Станок")
deal = models.CharField("№ Сделки", max_length=100) # Твои "Переходники" или заказы
drawing_name = models.CharField("Чертеж / Деталь", max_length=255)
deal = models.ForeignKey(Deal, on_delete=models.CASCADE, verbose_name="Сделка")
# Характеристики из твоих файлов
material = models.CharField("Материал", max_length=255) # Труба 180х32, MS 12.00mm и т.д.
dim_value = models.FloatField("Размер (мм)", help_text="Длина реза или толщина листа")
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)
priority = models.PositiveIntegerField("Приоритет", default=10)
status = models.CharField("Статус", max_length=10, choices=STATUS_CHOICES, default='new')
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', 'priority']
ordering = ['-date', 'deal']
def __str__(self):
return f"{self.drawing_name} ({self.deal})"
return f"{self.drawing_name} ({self.quantity_plan} шт.)"