ДОбавил изделия и заполнение спецификции изделия
All checks were successful
Deploy MES Core / deploy (push) Successful in 3m27s
All checks were successful
Deploy MES Core / deploy (push) Successful in 3m27s
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
# Generated by Django 6.0.3 on 2026-04-07 04:39
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('manufacturing', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='productentity',
|
||||
name='passport_filled',
|
||||
field=models.BooleanField(default=False, verbose_name='Паспорт заполнен'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='productentity',
|
||||
name='entity_type',
|
||||
field=models.CharField(choices=[('product', 'Готовое изделие'), ('assembly', 'Сборочная единица'), ('part', 'Деталь'), ('purchased', 'Покупное'), ('casting', 'Литьё'), ('outsourced', 'Аутсорс')], default='part', max_length=15, verbose_name='Тип'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,45 @@
|
||||
# Generated by Django 6.0.3 on 2026-04-07 08:56
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('manufacturing', '0002_productentity_passport_filled_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='AssemblyPassport',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('weight_kg', models.FloatField(blank=True, null=True, verbose_name='Масса, кг')),
|
||||
('coating', models.CharField(blank=True, default='', max_length=200, verbose_name='Покрытие')),
|
||||
('coating_color', models.CharField(blank=True, default='', max_length=100, verbose_name='Цвет')),
|
||||
('coating_area_m2', models.FloatField(blank=True, null=True, verbose_name='Площадь покрытия, м²')),
|
||||
('technical_requirements', models.TextField(blank=True, default='', verbose_name='Технические требования')),
|
||||
('entity', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='assembly_passport', to='manufacturing.productentity')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Паспорт сборки/изделия',
|
||||
'verbose_name_plural': 'Паспорта сборок/изделий',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='WeldingSeam',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=255, verbose_name='Наименование')),
|
||||
('leg_mm', models.FloatField(verbose_name='Катет, мм')),
|
||||
('length_mm', models.FloatField(verbose_name='Длина, мм')),
|
||||
('quantity', models.PositiveIntegerField(default=1, verbose_name='Кол-во')),
|
||||
('passport', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='welding_seams', to='manufacturing.assemblypassport')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Сварной шов',
|
||||
'verbose_name_plural': 'Сварные швы',
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,70 @@
|
||||
# Generated by Django 6.0.3 on 2026-04-07 09:07
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('manufacturing', '0003_assemblypassport_weldingseam'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='CastingPassport',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('casting_material', models.CharField(blank=True, default='', max_length=200, verbose_name='Материал литья')),
|
||||
('mass_kg', models.FloatField(blank=True, null=True, verbose_name='Масса, кг')),
|
||||
('entity', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='casting_passport', to='manufacturing.productentity')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Паспорт литья',
|
||||
'verbose_name_plural': 'Паспорта литья',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='OutsourcedPassport',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('technical_requirements', models.TextField(blank=True, default='', verbose_name='Технические требования')),
|
||||
('notes', models.TextField(blank=True, default='', verbose_name='Пояснения')),
|
||||
('entity', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='outsourced_passport', to='manufacturing.productentity')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Паспорт аутсорса',
|
||||
'verbose_name_plural': 'Паспорта аутсорса',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='PartPassport',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('thickness_mm', models.FloatField(blank=True, null=True, verbose_name='Толщина, мм')),
|
||||
('length_mm', models.FloatField(blank=True, null=True, verbose_name='Длина, мм')),
|
||||
('mass_kg', models.FloatField(blank=True, null=True, verbose_name='Масса, кг')),
|
||||
('cut_length_mm', models.FloatField(blank=True, null=True, verbose_name='Длина реза, мм')),
|
||||
('pierce_count', models.PositiveIntegerField(blank=True, null=True, verbose_name='Кол-во врезок')),
|
||||
('engraving', models.TextField(blank=True, default='', verbose_name='Гравировка')),
|
||||
('technical_requirements', models.TextField(blank=True, default='', verbose_name='Технические требования')),
|
||||
('entity', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='part_passport', to='manufacturing.productentity')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Паспорт детали',
|
||||
'verbose_name_plural': 'Паспорта деталей',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='PurchasedPassport',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('gost', models.CharField(blank=True, default='', max_length=255, verbose_name='ГОСТ/ТУ')),
|
||||
('entity', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='purchased_passport', to='manufacturing.productentity')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Паспорт покупного',
|
||||
'verbose_name_plural': 'Паспорта покупного',
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -32,6 +32,9 @@ class ProductEntity(models.Model):
|
||||
('product', 'Готовое изделие'),
|
||||
('assembly', 'Сборочная единица'),
|
||||
('part', 'Деталь'),
|
||||
('purchased', 'Покупное'),
|
||||
('casting', 'Литьё'),
|
||||
('outsourced', 'Аутсорс'),
|
||||
]
|
||||
|
||||
name = models.CharField("Наименование", max_length=255)
|
||||
@@ -60,6 +63,8 @@ class ProductEntity(models.Model):
|
||||
pdf_main = models.FileField("Чертёж (PDF)", upload_to="drawings_pdf/%Y/%m/", blank=True, null=True)
|
||||
preview = models.ImageField("Превью", upload_to="previews/%Y/%m/", blank=True, null=True)
|
||||
|
||||
passport_filled = models.BooleanField('Паспорт заполнен', default=False)
|
||||
|
||||
class Meta:
|
||||
verbose_name = "КД (изделие/деталь)"
|
||||
verbose_name_plural = "КД (изделия/детали)"
|
||||
@@ -94,4 +99,98 @@ class BOM(models.Model):
|
||||
def __str__(self):
|
||||
return f"{self.parent} -> {self.child} x{self.quantity}"
|
||||
|
||||
# Create your models here.
|
||||
|
||||
class AssemblyPassport(models.Model):
|
||||
entity = models.OneToOneField(ProductEntity, on_delete=models.CASCADE, related_name='assembly_passport')
|
||||
|
||||
weight_kg = models.FloatField('Масса, кг', null=True, blank=True)
|
||||
coating = models.CharField('Покрытие', max_length=200, blank=True, default='')
|
||||
coating_color = models.CharField('Цвет', max_length=100, blank=True, default='')
|
||||
coating_area_m2 = models.FloatField('Площадь покрытия, м²', null=True, blank=True)
|
||||
|
||||
technical_requirements = models.TextField('Технические требования', blank=True, default='')
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Паспорт сборки/изделия'
|
||||
verbose_name_plural = 'Паспорта сборок/изделий'
|
||||
|
||||
def __str__(self):
|
||||
return str(self.entity)
|
||||
|
||||
|
||||
class WeldingSeam(models.Model):
|
||||
passport = models.ForeignKey(AssemblyPassport, related_name='welding_seams', on_delete=models.CASCADE)
|
||||
|
||||
name = models.CharField('Наименование', max_length=255)
|
||||
leg_mm = models.FloatField('Катет, мм')
|
||||
length_mm = models.FloatField('Длина, мм')
|
||||
quantity = models.PositiveIntegerField('Кол-во', default=1)
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Сварной шов'
|
||||
verbose_name_plural = 'Сварные швы'
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.name}"
|
||||
|
||||
|
||||
class PartPassport(models.Model):
|
||||
entity = models.OneToOneField(ProductEntity, on_delete=models.CASCADE, related_name='part_passport')
|
||||
|
||||
thickness_mm = models.FloatField('Толщина, мм', null=True, blank=True)
|
||||
length_mm = models.FloatField('Длина, мм', null=True, blank=True)
|
||||
mass_kg = models.FloatField('Масса, кг', null=True, blank=True)
|
||||
|
||||
cut_length_mm = models.FloatField('Длина реза, мм', null=True, blank=True)
|
||||
pierce_count = models.PositiveIntegerField('Кол-во врезок', null=True, blank=True)
|
||||
engraving = models.TextField('Гравировка', blank=True, default='')
|
||||
|
||||
technical_requirements = models.TextField('Технические требования', blank=True, default='')
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Паспорт детали'
|
||||
verbose_name_plural = 'Паспорта деталей'
|
||||
|
||||
def __str__(self):
|
||||
return str(self.entity)
|
||||
|
||||
|
||||
class PurchasedPassport(models.Model):
|
||||
entity = models.OneToOneField(ProductEntity, on_delete=models.CASCADE, related_name='purchased_passport')
|
||||
|
||||
gost = models.CharField('ГОСТ/ТУ', max_length=255, blank=True, default='')
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Паспорт покупного'
|
||||
verbose_name_plural = 'Паспорта покупного'
|
||||
|
||||
def __str__(self):
|
||||
return str(self.entity)
|
||||
|
||||
|
||||
class CastingPassport(models.Model):
|
||||
entity = models.OneToOneField(ProductEntity, on_delete=models.CASCADE, related_name='casting_passport')
|
||||
|
||||
casting_material = models.CharField('Материал литья', max_length=200, blank=True, default='')
|
||||
mass_kg = models.FloatField('Масса, кг', null=True, blank=True)
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Паспорт литья'
|
||||
verbose_name_plural = 'Паспорта литья'
|
||||
|
||||
def __str__(self):
|
||||
return str(self.entity)
|
||||
|
||||
|
||||
class OutsourcedPassport(models.Model):
|
||||
entity = models.OneToOneField(ProductEntity, on_delete=models.CASCADE, related_name='outsourced_passport')
|
||||
|
||||
technical_requirements = models.TextField('Технические требования', blank=True, default='')
|
||||
notes = models.TextField('Пояснения', blank=True, default='')
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Паспорт аутсорса'
|
||||
verbose_name_plural = 'Паспорта аутсорса'
|
||||
|
||||
def __str__(self):
|
||||
return str(self.entity)
|
||||
|
||||
Reference in New Issue
Block a user