From d65f117303565e21c893e0430ed936375a860432 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 19 Nov 2021 13:42:24 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BD=A6=E9=97=B4=E6=93=8D=E4=BD=9C=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wpm/migrations/0018_auto_20211119_1340.py | 29 ++++++++++ hb_server/apps/wpm/models.py | 6 +- hb_server/apps/wpm/serializers.py | 40 ++++++++++++- hb_server/apps/wpm/views.py | 58 +++++++++++++++++-- 4 files changed, 122 insertions(+), 11 deletions(-) create mode 100644 hb_server/apps/wpm/migrations/0018_auto_20211119_1340.py diff --git a/hb_server/apps/wpm/migrations/0018_auto_20211119_1340.py b/hb_server/apps/wpm/migrations/0018_auto_20211119_1340.py new file mode 100644 index 0000000..07b428c --- /dev/null +++ b/hb_server/apps/wpm/migrations/0018_auto_20211119_1340.py @@ -0,0 +1,29 @@ +# Generated by Django 3.2.9 on 2021-11-19 05:40 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('wpm', '0017_auto_20211119_1034'), + ] + + operations = [ + migrations.AlterField( + model_name='operationequip', + name='operation', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='oe_operation', to='wpm.operation', verbose_name='关联操作'), + ), + migrations.AlterField( + model_name='operationrecord', + name='operation', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='or_operation', to='wpm.operation', verbose_name='关联的生产操作'), + ), + migrations.AlterField( + model_name='operationwproduct', + name='operation', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ow_operation', to='wpm.operation', verbose_name='关联操作'), + ), + ] diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index a00724e..b15585d 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -61,7 +61,7 @@ class OperationWproduct(BaseModel): """ 生产操作半成品关联表 """ - operation = models.ForeignKey(Operation, verbose_name='关联操作', on_delete=models.CASCADE) + operation = models.ForeignKey(Operation, verbose_name='关联操作', on_delete=models.CASCADE, related_name='ow_operation') wproduct = models.ForeignKey(WProduct, verbose_name='关联半成品', on_delete=models.CASCADE) number = models.CharField('物品编号', null=True, blank=True, max_length=50) material = models.ForeignKey(Material, verbose_name='操作时的物料状态', on_delete=models.CASCADE) @@ -88,7 +88,7 @@ class OperationRecord(BaseModel): 记录表格 """ form = models.ForeignKey(RecordForm, verbose_name='所用的生产记录表格', on_delete=models.CASCADE) - operation = models.ForeignKey(Operation, verbose_name='关联的生产操作', on_delete=models.CASCADE) + operation = models.ForeignKey(Operation, verbose_name='关联的生产操作', on_delete=models.CASCADE, related_name='or_operation') is_filled = models.BooleanField('是否填写', default=True) class OperationRecordItem(BaseModel): @@ -104,6 +104,6 @@ class OperationRecordItem(BaseModel): operation_record = models.ForeignKey(OperationRecord, verbose_name='关联的生产记录', on_delete=models.CASCADE) class OperationEquip(BaseModel): - operation = models.ForeignKey(Operation, verbose_name='关联操作', on_delete=models.CASCADE) + operation = models.ForeignKey(Operation, verbose_name='关联操作', on_delete=models.CASCADE, related_name='oe_operation') equip = models.ForeignKey(Equipment, verbose_name='生产设备', on_delete=models.CASCADE) remark = models.TextField('备注', null=True, blank=True) \ No newline at end of file diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index a79a118..56ba324 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -1,9 +1,10 @@ from rest_framework import serializers, exceptions from rest_framework.serializers import ModelSerializer +from apps.em.serializers import EquipmentSimpleSerializer from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, MaterialBatch, WareHouse from apps.inm.signals import update_inm from apps.mtm.models import Material, RecordForm, Step, SubprodctionMaterial -from apps.mtm.serializers import MaterialSimpleSerializer, StepSimpleSerializer +from apps.mtm.serializers import MaterialSimpleSerializer, RecordFormSimpleSerializer, StepSimpleSerializer from apps.pm.models import SubProductionPlan, SubProductionProgress from django.utils import timezone @@ -11,7 +12,7 @@ from django.utils.translation import gettext_lazy as _ from apps.pm.serializers import SubproductionPlanSimpleSerializer from apps.qm.models import TestRecord, TestRecordItem from apps.system.serializers import UserSimpleSerializer -from apps.wpm.models import Operation, OperationWproduct, WMaterial, WProduct, OperationRecord, OperationRecordItem +from apps.wpm.models import Operation, OperationEquip, OperationWproduct, WMaterial, WProduct, OperationRecord, OperationRecordItem from django.db import transaction class PickHalfSerializer(serializers.Serializer): @@ -140,10 +141,22 @@ class OperationDetailSerializer(serializers.ModelSerializer): class OperationListSerializer(serializers.ModelSerializer): create_by_ = UserSimpleSerializer(source='create_by', read_only=True) step_ = StepSimpleSerializer(source='step', read_only=True) + wproduct_count = serializers.SerializerMethodField() + equip_count = serializers.SerializerMethodField() + form_count = serializers.SerializerMethodField() class Meta: model = Operation fields = '__all__' + def get_wproduct_count(self, obj): + return obj.ow_operation.count() + + def get_equip_count(self, obj): + return obj.oe_operation.count() + + def get_form_count(self, obj): + return obj.or_operation.count() + class OperationCreateSerializer(serializers.Serializer): """ 操作创建 @@ -176,6 +189,12 @@ class OperationCreateSerializer(serializers.Serializer): raise exceptions.ValidationError(_('请选择半成品进行操作')) return data + +class OperationUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = OperationRecord + fields =['use_scrap', 'remark'] + class OperationInitSerializer(serializers.Serializer): step = serializers.PrimaryKeyRelatedField(queryset=Step.objects.all(), label="子工序ID") subproduction_plan = serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID", required=False) @@ -270,6 +289,23 @@ class WplanPutInSerializer(serializers.Serializer): class WproductPutInSerializer(serializers.Serializer): warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID") remark = serializers.CharField(label="入库备注", required =False) + +class OperationEquipListSerializer(serializers.Serializer): + equip_ = EquipmentSimpleSerializer(source='equip', read_only=True) + class Meta: + model = OperationEquip + fields = '__all__' + +class OperationEquipUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = OperationEquip + fields = ['remark'] + +class OperationRecordListSerializer(serializers.ModelSerializer): + form_ = RecordFormSimpleSerializer(source='form', read_only=True) + class Meta: + model = OperationRecord + fields = '__all__' \ No newline at end of file diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index df7aa0d..1113caa 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -1,6 +1,6 @@ from django.shortcuts import render from rest_framework.generics import CreateAPIView, GenericAPIView -from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin +from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin from rest_framework.utils import serializer_helpers from rest_framework.utils.field_mapping import get_relation_kwargs from rest_framework.views import APIView @@ -17,7 +17,7 @@ from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from rest_framework.decorators import action from apps.wpm.models import OperationEquip, OperationWproduct, WMaterial, WProduct, Operation, OperationMaterial, OperationRecord, OperationRecordItem -from apps.wpm.serializers import OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestRecordCreateSerializer, WproductPutInSerializer +from apps.wpm.serializers import OperationEquipListSerializer, OperationEquipUpdateSerializer, OperationRecordListSerializer, OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestRecordCreateSerializer, WproductPutInSerializer from rest_framework.response import Response from django.db import transaction from rest_framework import exceptions, serializers @@ -259,12 +259,12 @@ class WProductViewSet(ListModelMixin, GenericViewSet): wproduct.save() return Response() -class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, GenericViewSet): +class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, GenericViewSet): """ 生产操作记录 """ perms_map={'*':'*'} - queryset = Operation.objects.select_related('step').all() + queryset = Operation.objects.select_related('step').prefetch_related('ow_operation', 'oe_operation', 'or_operation').all() serializer_class = OperationListSerializer filterset_fields = ['step', 'step__process', 'is_submited'] ordering_fields = ['id'] @@ -278,6 +278,8 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Gen return OperationDetailSerializer elif self.action == 'create': return OperationCreateSerializer + elif self.action == 'update': + return OperationUpdateSerializer return super().get_serializer_class() @transaction.atomic @@ -325,7 +327,7 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Gen -class OperationWproductViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet): +class OperationWproductViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet): """ 操作使用的半成品 """ @@ -346,7 +348,51 @@ class OperationWproductViewSet(ListModelMixin, DestroyModelMixin, GenericViewSe wp.operation = None wp.save() return Response() - + +class OperationEquipViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin, GenericViewSet): + """ + 操作使用的设备 + """ + perms_map={'*':'*'} + queryset = OperationEquip.objects.select_related('operation', 'equip').all() + serializer_class = OperationEquipListSerializer + filterset_fields = ['operation', 'equip'] + ordering_fields = ['id'] + ordering = ['-id'] + + def get_serializer_class(self): + if self.action == 'update': + return OperationEquipUpdateSerializer + return super().get_serializer_class() + @transaction.atomic() + def destroy(self, request, *args, **kwargs): + instance = self.get_object() + if instance.operation.is_submited: + raise exceptions.APIException('该操作已提交') + instance.delete() + return Response() + +class OperationRecordViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet): + """ + 操作使用的自定义表格 + """ + perms_map={'*':'*'} + queryset = OperationRecord.objects.select_related('operation', 'form').all() + serializer_class = OperationRecordListSerializer + filterset_fields = ['operation', 'form'] + ordering_fields = ['id'] + ordering = ['-id'] + + @transaction.atomic() + def destroy(self, request, *args, **kwargs): + instance = self.get_object() + if instance.operation.is_submited: + raise exceptions.APIException('该操作已提交') + instance.delete() + return Response() + + + class DoFormInit(CreateAPIView, GenericAPIView): perms_map={'*':'*'}