Огромная замена логики
All checks were successful
Deploy MES Core / deploy (push) Successful in 11s

This commit is contained in:
2026-04-06 08:06:37 +03:00
parent 0e8497ab1f
commit e88b861f68
48 changed files with 3833 additions and 175 deletions

View File

@@ -0,0 +1,88 @@
# Generated by Django 6.0.3 on 2026-04-04 15:14
import django.db.models.deletion
import django.utils.timezone
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('manufacturing', '0001_initial'),
('shiftflow', '0014_dxfpreviewjob_cancel_requested_dxfpreviewjob_pid_and_more'),
('warehouse', '0004_location_stockitem_transferrecord'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='machine',
name='location',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='warehouse.location', verbose_name='Склад участка'),
),
migrations.AddField(
model_name='productiontask',
name='entity',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='manufacturing.productentity', verbose_name='КД (изделие/деталь)'),
),
migrations.CreateModel(
name='CuttingSession',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('date', models.DateField(default=django.utils.timezone.localdate, verbose_name='Дата')),
('created_at', models.DateTimeField(auto_now_add=True)),
('is_closed', models.BooleanField(default=False, verbose_name='Сессия закрыта')),
('machine', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='shiftflow.machine', verbose_name='Станок')),
('operator', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='Оператор')),
('used_stock_item', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='warehouse.stockitem', verbose_name='Взятый материал')),
],
options={
'verbose_name': 'Сессия раскроя',
'verbose_name_plural': 'Сессии раскроя',
},
),
migrations.CreateModel(
name='MaterialRequirement',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('required_qty', models.FloatField(verbose_name='Нужно докупить')),
('unit', models.CharField(choices=[('m2', 'м²'), ('mm', 'мм'), ('pcs', 'шт')], default='pcs', max_length=8, verbose_name='Ед. изм.')),
('status', models.CharField(choices=[('needed', 'К закупке'), ('ordered', 'В пути'), ('fulfilled', 'Обеспечено')], default='needed', max_length=20, verbose_name='Статус')),
('deal', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shiftflow.deal', verbose_name='Сделка')),
('material', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='warehouse.material', verbose_name='Материал')),
],
options={
'verbose_name': 'Потребность',
'verbose_name_plural': 'Потребности',
},
),
migrations.CreateModel(
name='ShiftItem',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('quantity_fact', models.PositiveIntegerField(default=0, verbose_name='Изготовлено (факт), шт')),
('material_substitution', models.BooleanField(default=False, verbose_name='Замена материала по факту')),
('session', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tasks', to='shiftflow.cuttingsession')),
('task', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='shiftflow.productiontask', verbose_name='Плановое задание')),
],
options={
'verbose_name': 'Пункт сессии',
'verbose_name_plural': 'Пункты сессий',
},
),
migrations.CreateModel(
name='DealItem',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('quantity', models.PositiveIntegerField(verbose_name='Заказано, шт')),
('deal', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='shiftflow.deal', verbose_name='Сделка')),
('entity', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='manufacturing.productentity', verbose_name='Изделие/деталь')),
],
options={
'verbose_name': 'Позиция сделки',
'verbose_name_plural': 'Позиции сделки',
'unique_together': {('deal', 'entity')},
},
),
]

View File

@@ -0,0 +1,77 @@
# Generated by Django 6.0.3 on 2026-04-05 07:29
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shiftflow', '0015_machine_location_productiontask_entity_and_more'),
('warehouse', '0004_location_stockitem_transferrecord'),
]
operations = [
migrations.AlterModelOptions(
name='cuttingsession',
options={'verbose_name': 'Производственный отчет', 'verbose_name_plural': 'Производственные отчеты'},
),
migrations.AlterModelOptions(
name='shiftitem',
options={'verbose_name': 'Фиксация выработки', 'verbose_name_plural': 'Фиксации выработки'},
),
migrations.AlterField(
model_name='cuttingsession',
name='is_closed',
field=models.BooleanField(default=False, verbose_name='Отчет закрыт'),
),
migrations.AlterField(
model_name='cuttingsession',
name='used_stock_item',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='warehouse.stockitem', verbose_name='Взятый материал (legacy)'),
),
migrations.CreateModel(
name='ProductionReportRemnant',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('quantity', models.FloatField(default=1.0, verbose_name='Количество (ед.)')),
('current_length', models.FloatField(blank=True, null=True, verbose_name='Текущая длина, мм')),
('current_width', models.FloatField(blank=True, null=True, verbose_name='Текущая ширина, мм')),
('unique_id', models.CharField(blank=True, max_length=50, null=True, verbose_name='ID/Маркировка')),
('material', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='warehouse.material', verbose_name='Материал')),
('report', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='remnants', to='shiftflow.cuttingsession', verbose_name='Производственный отчет')),
],
options={
'verbose_name': 'Деловой остаток',
'verbose_name_plural': 'Деловые остатки',
},
),
migrations.CreateModel(
name='ProductionReportConsumption',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('quantity', models.FloatField(verbose_name='Списано (ед.)')),
('report', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='consumptions', to='shiftflow.cuttingsession', verbose_name='Производственный отчет')),
('stock_item', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='warehouse.stockitem', verbose_name='Сырье (позиция склада)')),
],
options={
'verbose_name': 'Списание сырья',
'verbose_name_plural': 'Списание сырья',
'unique_together': {('report', 'stock_item')},
},
),
migrations.CreateModel(
name='ProductionReportStockResult',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('kind', models.CharField(choices=[('finished', 'Готовая деталь'), ('remnant', 'Деловой остаток')], max_length=16, verbose_name='Тип')),
('report', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='results', to='shiftflow.cuttingsession', verbose_name='Производственный отчет')),
('stock_item', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='warehouse.stockitem', verbose_name='Созданная позиция склада')),
],
options={
'verbose_name': 'Результат отчета',
'verbose_name_plural': 'Результаты отчета',
'unique_together': {('report', 'stock_item')},
},
),
]

View File

@@ -0,0 +1,37 @@
# Generated by Django 6.0.3 on 2026-04-05 08:35
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shiftflow', '0016_alter_cuttingsession_options_alter_shiftitem_options_and_more'),
('warehouse', '0005_alter_stockitem_options'),
]
operations = [
migrations.AlterField(
model_name='machine',
name='location',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='warehouse.location', verbose_name='Склад участка (устаревает)'),
),
migrations.CreateModel(
name='Workshop',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=120, unique=True, verbose_name='Цех')),
('location', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='warehouse.location', verbose_name='Склад цеха')),
],
options={
'verbose_name': 'Цех',
'verbose_name_plural': 'Цеха',
},
),
migrations.AddField(
model_name='machine',
name='workshop',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='shiftflow.workshop', verbose_name='Цех'),
),
]

View File

@@ -0,0 +1,33 @@
# Generated by Django 6.0.3 on 2026-04-05 09:19
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shiftflow', '0017_alter_machine_location_workshop_machine_workshop'),
('warehouse', '0006_alter_stockitem_options'),
]
operations = [
migrations.AlterUniqueTogether(
name='productionreportconsumption',
unique_together=set(),
),
migrations.AddField(
model_name='productionreportconsumption',
name='material',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='warehouse.material', verbose_name='Материал'),
),
migrations.AlterField(
model_name='productionreportconsumption',
name='stock_item',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='warehouse.stockitem', verbose_name='Сырье (позиция склада, legacy)'),
),
migrations.AlterUniqueTogether(
name='productionreportconsumption',
unique_together={('report', 'material')},
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 6.0.3 on 2026-04-06 04:28
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shiftflow', '0018_alter_productionreportconsumption_unique_together_and_more'),
]
operations = [
migrations.AlterField(
model_name='employeeprofile',
name='role',
field=models.CharField(choices=[('admin', 'Администратор'), ('technologist', 'Технолог'), ('master', 'Мастер'), ('operator', 'Оператор'), ('clerk', 'Учетчик'), ('observer', 'Наблюдатель')], default='operator', max_length=20, verbose_name='Должность'),
),
]