diff --git a/hb_server/apps/em/models.py b/hb_server/apps/em/models.py index 8083e89..b55b489 100644 --- a/hb_server/apps/em/models.py +++ b/hb_server/apps/em/models.py @@ -18,6 +18,11 @@ class Equipment(CommonBModel): (0, '停用'), (2, '报废') ) + type_choices = ( + (1, '生产设备'), + (2, '检验工具') + ) + type = models.IntegerField('类型', choices=type_choices, default=1) name = models.CharField('设备名称', max_length=50) number = models.CharField('设备编号', max_length=50, unique=True) model = models.CharField('规格型号', max_length=60, null=True, blank=True) diff --git a/hb_server/apps/em/serializers.py b/hb_server/apps/em/serializers.py index d78ebb8..dcf4262 100644 --- a/hb_server/apps/em/serializers.py +++ b/hb_server/apps/em/serializers.py @@ -16,3 +16,8 @@ class EquipmentSerializer(ModelSerializer): """ Perform necessary eager loading of data. """ queryset = queryset.select_related('belong_dept','keeper') return queryset + +class EquipmentSimpleSerializer(ModelSerializer): + class Meta: + model = Equipment + fields = ['id', 'number', 'name'] \ No newline at end of file diff --git a/hb_server/apps/mtm/models.py b/hb_server/apps/mtm/models.py index 680e770..9223d29 100644 --- a/hb_server/apps/mtm/models.py +++ b/hb_server/apps/mtm/models.py @@ -5,6 +5,8 @@ from django.db.models.query import QuerySet from apps.system.models import CommonAModel, CommonBModel, Organization, User, Dict, File from utils.model import SoftModel, BaseModel from simple_history.models import HistoricalRecords +from apps.system.models import Organization +from apps.em.models import Equipment class Material(CommonAModel): """ @@ -41,6 +43,7 @@ class Process(CommonAModel): number = models.CharField('编号', max_length=100, unique=True) instruction = models.ForeignKey(File, verbose_name='指导书', on_delete=models.SET_NULL, null=True, blank=True) instruction_content = models.TextField('指导书内容', null=True, blank=True) + workshop = models.ForeignKey(Organization, verbose_name='生产车间', on_delete=models.CASCADE, null=True, blank=True) class Meta: verbose_name = '工序' @@ -58,6 +61,7 @@ class Step(CommonAModel): number = models.CharField('步骤编号', max_length=100, null=True, blank=True) instruction_content = models.TextField('相应操作指导', null=True, blank=True) sort = models.IntegerField('排序号', default=1) + equipments = models.ManyToManyField(Equipment, verbose_name='使用设备') class Meta: verbose_name = '工序步骤' @@ -66,6 +70,12 @@ class Step(CommonAModel): def __str__(self): return self.name +# class StepTable(CommonAModel): +# """ +# 过程记录表格 +# """ + + class StepOperationItem(CommonAModel): """ 操作记录条目 @@ -126,6 +136,7 @@ class InputMaterial(CommonAModel): verbose_name_plural = verbose_name + class OutputMaterial(CommonAModel): """ 输出物料 @@ -138,4 +149,16 @@ class OutputMaterial(CommonAModel): class Meta: verbose_name = '输出物料' - verbose_name_plural = verbose_name \ No newline at end of file + verbose_name_plural = verbose_name + +class UsedStep(CommonAModel): + """ + 产品生产子工序 + """ + step = models.ForeignKey(Step, verbose_name='子工序', on_delete=models.CASCADE, related_name='usedsteps') + product = models.ForeignKey(Material, verbose_name='关联产品', on_delete=models.CASCADE) + process = models.ForeignKey(Process, verbose_name='关联工序', on_delete=models.CASCADE) + + class Meta: + verbose_name = '产品生产子工序' + verbose_name_plural = verbose_name diff --git a/hb_server/apps/mtm/serializers.py b/hb_server/apps/mtm/serializers.py index 1b3009b..19145f3 100644 --- a/hb_server/apps/mtm/serializers.py +++ b/hb_server/apps/mtm/serializers.py @@ -1,6 +1,7 @@ +from apps.em.serializers import EquipmentSerializer, EquipmentSimpleSerializer from rest_framework import serializers from rest_framework.exceptions import ValidationError -from .models import InputMaterial, Material, OutputMaterial, Process, ProductProcess, Step +from .models import InputMaterial, Material, OutputMaterial, Process, ProductProcess, Step, UsedStep from apps.system.serializers import FileSimpleSerializer @@ -42,6 +43,22 @@ class StepSerializer(serializers.ModelSerializer): model = Step fields = '__all__' +class StepSimpleSerializer(serializers.ModelSerializer): + class Meta: + model = Step + fields = ['id', 'name', 'sort'] + +class StepDetailSerializer(serializers.ModelSerializer): + equipments_ = EquipmentSimpleSerializer(source='equipments_', many=True) + class Meta: + model = Step + fields = '__all__' + + @staticmethod + def setup_eager_loading(queryset): + queryset = queryset.prefetch_related('equipments') + return queryset + class ProductProcessListSerializer(serializers.ModelSerializer): process_ = ProcessSimpleSerializer(source='process', read_only=True) product_ = MaterialSimpleSerializer(source='product', read_only=True) @@ -95,4 +112,27 @@ class OutputMaterialSerializer(serializers.ModelSerializer): class OutputMaterialUpdateSerializer(serializers.ModelSerializer): class Meta: model = OutputMaterial - fields = ['count', 'sort'] \ No newline at end of file + fields = ['count', 'sort'] + +class UsedStepCreateSerializer(serializers.ModelSerializer): + """ + 产品生产子工序创建 + """ + class Meta: + model = UsedStep + fields = ['step', 'product', 'process'] + +class UsedStepListSerializer(serializers.ModelSerializer): + """ + 产品生产子工序序列化 + """ + step_ = StepSimpleSerializer(source='step', read_only=True) + class Meta: + model = UsedStep + fields = '__all__' + + @staticmethod + def setup_eager_loading(queryset): + """ Perform necessary eager loading of data. """ + queryset = queryset.select_related('step') + return queryset diff --git a/hb_server/apps/mtm/urls.py b/hb_server/apps/mtm/urls.py index 9c9b812..8ac7cf2 100644 --- a/hb_server/apps/mtm/urls.py +++ b/hb_server/apps/mtm/urls.py @@ -1,6 +1,6 @@ from django.db.models import base from rest_framework import urlpatterns -from apps.mtm.views import InputMaterialViewSet, MaterialViewSet, OutputMaterialViewSet, ProcessViewSet, StepViewSet +from apps.mtm.views import InputMaterialViewSet, MaterialViewSet, OutputMaterialViewSet, ProcessViewSet, StepViewSet, UsedStepViewSet from django.urls import path, include from rest_framework.routers import DefaultRouter @@ -11,6 +11,7 @@ router.register('process', ProcessViewSet, basename='process') router.register('step', StepViewSet, basename='step') router.register('inputmaterial', InputMaterialViewSet, basename='inputmaterial') router.register('outputmaterial', OutputMaterialViewSet, basename='outputmaterial') +router.register('usedstep', UsedStepViewSet, basename='usedstep') urlpatterns = [ path('', include(router.urls)), ] diff --git a/hb_server/apps/mtm/views.py b/hb_server/apps/mtm/views.py index de76da1..d52f1c6 100644 --- a/hb_server/apps/mtm/views.py +++ b/hb_server/apps/mtm/views.py @@ -2,8 +2,8 @@ from django.shortcuts import render from rest_framework.viewsets import ModelViewSet, GenericViewSet from rest_framework.mixins import CreateModelMixin, ListModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin -from apps.mtm.models import InputMaterial, Material, OutputMaterial, Process, ProductProcess, Step -from apps.mtm.serializers import InputMaterialListSerializer, InputMaterialSerializer, InputMaterialUpdateSerializer, MaterialDetailSerializer, MaterialSerializer, MaterialSimpleSerializer, OutputMaterialListSerializer, OutputMaterialSerializer, OutputMaterialUpdateSerializer, ProductProcessListSerializer, ProductProcessUpdateSerializer, ProcessSerializer, StepSerializer +from apps.mtm.models import InputMaterial, Material, OutputMaterial, Process, ProductProcess, Step, UsedStep +from apps.mtm.serializers import InputMaterialListSerializer, InputMaterialSerializer, InputMaterialUpdateSerializer, MaterialDetailSerializer, MaterialSerializer, MaterialSimpleSerializer, OutputMaterialListSerializer, OutputMaterialSerializer, OutputMaterialUpdateSerializer, ProductProcessListSerializer, ProductProcessUpdateSerializer, ProcessSerializer, StepSerializer, UsedStepCreateSerializer, UsedStepListSerializer from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from rest_framework.decorators import action from rest_framework.response import Response @@ -122,3 +122,17 @@ class OutputMaterialViewSet(CreateUpdateModelAMixin, ModelViewSet): elif self.action == 'update': return OutputMaterialUpdateSerializer return OutputMaterialSerializer + +class UsedStepViewSet(OptimizationMixin, CreateModelMixin, DestroyModelMixin, ListModelMixin, GenericViewSet): + """ + 产品生产子工序表 + """ + perms_map = {'*':'*'} + queryset = UsedStep.objects.all() + filterset_fields = ['process', 'product', 'step'] + ordering = ['step__sort', '-step__create_time'] + + def get_serializer_class(self): + if self.action =='create': + return UsedStepCreateSerializer + return UsedStepListSerializer \ No newline at end of file diff --git a/hb_server/utils/response.py b/hb_server/utils/response.py index 2923188..1b11f4b 100644 --- a/hb_server/utils/response.py +++ b/hb_server/utils/response.py @@ -51,7 +51,8 @@ class FitJSONRenderer(JSONRenderer): if response_body.code >= 400: # 响应异常 response_body.data = data # data里是详细异常信息 if isinstance(data, dict): - data = data[list(data.keys())[0]] + key = list(data.keys())[0] + data = key + data[key] elif isinstance(data, list): data = data[0] response_body.msg = data # 取一部分放入msg,方便前端alert