Первая попытка модельки

This commit is contained in:
ack_ik
2026-02-10 13:40:12 +03:00
parent 8c38cb68c4
commit b27c685eb1
10 changed files with 285 additions and 0 deletions

105
.ignore/README.md Normal file
View File

@@ -0,0 +1,105 @@
# ProdManager
Production Management System (Mini-MES)
Django-приложение для оперативного управления и контроля производственными процессами на уровне цеха или участка.
## Описание проекта
Это веб-приложение для управления производственным процессом предприятия, специализирующегося на изготовлении металлоконструкций. Система позволяет управлять изделиями, их сборочными деревьями, технологическими маршрутами и ресурсами.
### Основные функции
- Управление изделиями (деталями и сборочными единицами)
- Создание и управление сборочными деревьями (иерархия изделий)
- Технологические маршруты с указанием операций и трудоемкости
- Учет материалов и ресурсов
- Расчет трудоемкости и необходимых материалов для производства
📋 Ключевая функциональность
Приложение помогает автоматизировать и контролировать ежедневные производственные задачи:
📊 Учёт продукции: Отслеживание выпуска, остатков, брака.
🗺️ Технологические карты: Создание и хранение поэтапных инструкций для изготовления изделий.
📝 Сменные задания: Формирование и выдача задач на смену, контроль их выполнения.
🛒 Планирование закупок: Автоматический расчёт потребности в сырье, материалах и комплектующих на основе производственного плана.
📈 Базовый контроль: Мониторинг выполнения плана и ключевых показателей (KPI) в реальном времени.
🎯 Цель проекта
ProdManager — это облегчённая (Lite) версия полноценной системы MES (Manufacturing Execution System), предназначенная для небольших и средних производств, которые хотят внедрить цифровое управление цехом без сложностей и затрат на крупные корпоративные системы.
🛠️ Технологический стек
Backend: Django (Python)
Frontend: HTML, CSS, JavaScript (шаблоны Django, может быть расширен с помощью React/Vue)
База данных: PostgreSQL (рекомендуется) / SQLite (для разработки)
Контроль версий: Git
🚀 Быстрый старт (для разработки)
Клонируйте репозиторий:
bash
git clone https://github.com/ваш-username/ProdManager.git
cd ProdManager
Создайте и активируйте виртуальное окружение:
bash
python -m venv venv
source venv/bin/activate # Для Linux/Mac
# или
venv\Scripts\activate # Для Windows
Установите зависимости:
bash
pip install -r requirements.txt
Примените миграции:
bash
python manage.py migrate
Создайте суперпользователя:
bash
python manage.py createsuperuser
Запустите сервер разработки:
bash
python manage.py runserver
Откройте браузер и перейдите по адресу: http://127.0.0.1:8000
📁 Структура проекта
(Структура будет обновлена по мере разработки)
text
ProdManager/
├── core/ # Основные настройки проекта
├── production/ # Приложение "Производство" (учёт, карты, задания)
├── materials/ # Приложение "Материалы и закупки"
├── reports/ # Приложение для отчётов и аналитики
├── templates/ # Глобальные шаблоны
└── static/ # Статические файлы
🤝 Вклад в проект
Вклады приветствуются! Если у вас есть предложения по улучшению, пожалуйста:
Сделайте форк репозитория.
Создайте ветку для своей функции (git checkout -b feature/amazing-feature).
Зафиксируйте изменения (git commit -m 'Add some amazing feature').
Отправьте в ветку (git push origin feature/amazing-feature).
Откройте Pull Request.
📄 Лицензия
Распространяется под лицензией MIT. См. файл LICENSE для подробностей.

33
.ignore/filters.py Normal file
View File

@@ -0,0 +1,33 @@
from django_filters import FilterSet, CharFilter, ModelChoiceFilter
from .models import Part
class PartFilter(FilterSet):
type = ModelChoiceFilter(
field_name='type',
choices=Part.TYPE_CHOICES,
label='Тип заготовки'
)
thickness_min = CharFilter(
field_name='thickness',
label='Минимальная толщина',
widget=forms.NumberInput(attrs={'placeholder': 'От'})
)
thickness_max = CharFilter(
field_name='thickness',
label='Максимальная толщина',
widget=forms.NumberInput(attrs={'placeholder': 'До'})
)
search = CharFilter(
field_name='name',
label='Поиск по наименованию',
widget=forms.TextInput(attrs={'placeholder': 'Введите текст'})
)
decimal_number = CharFilter(
field_name='decimal_number',
label='Поиск по децимальному номеру',
widget=forms.TextInput(attrs={'placeholder': 'Введите номер'})
)
class Meta:
model = Part
fields = ['type', 'thickness_min', 'thickness_max', 'search', 'decimal_number']

39
.ignore/models.py Normal file
View File

@@ -0,0 +1,39 @@
from django.db import models
from mptt.models import MPTTModel, TreeForeignKey
from django.utils.text import slugify
TYPE_CHOICES = (
('Лист', 'Лист'),
('Труба', 'Труба'),
('Круг', 'Круг'),
('Уголок', 'Уголок'),
('Профиль', 'Профиль'),
('Плита', 'Плита'),
('Швеллер', 'Швеллер'),
('Ребро', 'Ребро'),
('Тонкий', 'Тонкий'),
('Толстый', 'Толстый'),
)
class Part(models.Model):
name = models.CharField(max_length=255)
decimal_number = models.CharField(max_length=50, unique=True)
type = models.CharField(max_length=50, choices=TYPE_CHOICES)
thickness = models.FloatField(null=True, blank=True)
length = models.FloatField(null=True, blank=True)
weight = models.FloatField(null=True, blank=True)
cut_length = models.FloatField(null=True, blank=True)
number_of_punches = models.IntegerField(null=True, blank=True)
slug = models.SlugField(unique=True, max_length=255)
def save(self, *args, **kwargs):
self.slug = slugify(f"{self.name}-{self.decimal_number}")
super().save(*args, **kwargs)
def __str__(self):
return f"{self.name} ({self.decimal_number})"
class ProductStructure(MPTTModel):
item = models.ForeignKey(Part, on_delete=models.CASCADE, related_name='structures')
quantity = models.FloatField()
parent = TreeForeignKey('self', on_delete=models.CASCADE)

8
.ignore/urls.py Normal file
View File

@@ -0,0 +1,8 @@
from django.contrib import admin
from django.urls import path
from .views import PartList
urlpatterns = [
path('admin/', admin.site.urls),
path('api/parts/', PartList.as_view(), name='part-list'),
]

58
.ignore/views.py Normal file
View File

@@ -0,0 +1,58 @@
from django.shortcuts import render
from django.views import View
from django.http import JsonResponse
from .models import Part, ProductStructure
from .filters import PartFilter
from django.contrib import admin
from django.db import models
from django.forms import ModelForm
from django.utils.html import format_html
class PartList(View):
def get(self, request):
filter = PartFilter(request.GET, queryset=Part.objects.all())
return JsonResponse({
'results': [self.part_to_json(part) for part in filter.qs],
'filters': filter.filters.items()
})
def part_to_json(self, part):
return {
'id': part.id,
'name': part.name,
'decimal_number': part.decimal_number,
'type': part.get_type_display(),
'thickness': part.thickness,
'length': part.length,
'weight': part.weight,
'cut_length': part.cut_length,
'number_of_punches': part.number_of_punches,
'slug': part.slug
}
class PartAdmin(admin.ModelAdmin):
list_display = ('name', 'decimal_number', 'type', 'thickness', 'weight')
search_fields = ('name', 'decimal_number')
list_filter = ('type',)
inlines = [
ProductionOperationInline
]
class ProductionOperationInline(admin.TabularInline):
model = ProductionOperation
extra = 1
class ProductionOperation(models.Model):
part = models.ForeignKey(Part, on_delete=models.CASCADE, related_name='operations')
operation_type = models.CharField(max_length=50, choices=[
('Лазер', 'Лазер'),
('Сварка', 'Сварка'),
('Покраска', 'Покраска'),
('Обработка', 'Обработка'),
])
time = models.FloatField()
description = models.TextField(blank=True)
def __str__(self):
return f"{self.part.name} - {self.operation_type}"