From 2d260e694dea2efc247253146cdfb3922063909e Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 27 Jan 2022 17:05:10 +0800 Subject: [PATCH] =?UTF-8?q?inm=20=E5=8E=9F=E5=85=A5=E5=BA=93=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E5=85=B6=E4=BB=96=E5=85=A5=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/models.py | 4 +- hb_server/apps/inm/serializers.py | 65 +++++++++++++++++++++++++------ hb_server/apps/inm/views.py | 44 +++++++++++++++++---- hb_server/apps/pum/serializers.py | 7 +++- hb_server/apps/pum/views.py | 8 ++-- 5 files changed, 103 insertions(+), 25 deletions(-) diff --git a/hb_server/apps/inm/models.py b/hb_server/apps/inm/models.py index 4042844..7616193 100644 --- a/hb_server/apps/inm/models.py +++ b/hb_server/apps/inm/models.py @@ -2,7 +2,7 @@ from django.db import models from django.db.models.base import Model import django.utils.timezone as timezone from django.db.models.query import QuerySet -from apps.pum.models import PuOrder +from apps.pum.models import PuOrder, Vendor from apps.system.models import CommonADModel, CommonAModel, CommonBModel, Organization, User, Dict, File from utils.model import SoftModel, BaseModel from simple_history.models import HistoricalRecords @@ -79,6 +79,8 @@ class FIFO(CommonADModel): User, verbose_name='审核人', on_delete=models.CASCADE, null=True, blank=True) inout_date = models.DateField('出入库日期', null=True, blank=True) remark = models.CharField('备注', max_length=1000, default='') + vendor = models.ForeignKey(Vendor, verbose_name='供应商', + on_delete=models.CASCADE, null=True, blank=True) pu_order = models.ForeignKey(PuOrder, verbose_name='关联采购订单', null=True, blank=True, on_delete=models.CASCADE) diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py index 858c06d..a9aa480 100644 --- a/hb_server/apps/inm/serializers.py +++ b/hb_server/apps/inm/serializers.py @@ -2,6 +2,7 @@ from rest_framework import exceptions from rest_framework import serializers from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, MaterialBatch, WareHouse, Inventory +from apps.pum.models import Vendor from apps.qm.models import TestRecord, TestRecordItem from apps.sam.serializers import OrderSimpleSerializer @@ -73,6 +74,15 @@ class FIFOListSerializer(serializers.ModelSerializer): model = FIFO fields = '__all__' +class FIFOItemCreateSerializer(serializers.ModelSerializer): + class Meta: + model = FIFOItem + fields = ['warehouse', 'material', 'batch', 'fifo', 'files'] + +class FIFOItemUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = FIFOItem + fields = ['warehouse', 'batch', 'files'] class FIFOItemSerializer(serializers.ModelSerializer): warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True) @@ -101,6 +111,49 @@ class MaterialBatchQuerySerializer(serializers.Serializer): warehouse = serializers.IntegerField(label="仓库ID", required=False) materials = serializers.ListField(child=serializers.IntegerField(label="物料ID"), required=False) +class FIFOInOtherSerializer(serializers.ModelSerializer): + """ + 其他入库序列化 + """ + details = FIFODetailInPurSerializer(many=True, required=False) + vendor = serializers.PrimaryKeyRelatedField(label='供应商ID', + queryset=Vendor.objects.all()) + class Meta: + model = FIFO + fields = ['details', 'vendor'] + + def create(self, validated_data): + details = validated_data.pop('details') + with transaction.atomic(): + validated_data['type'] = FIFO.FIFO_TYPE_PUR_IN + obj = FIFO(**validated_data) + obj.save() + for i in details: + if 'details' in i: + p_details = i.pop('details') + if len(p_details) != i['count']: + raise serializers.ValidationError('数目对不上') + else: + i['fifo'] = obj + fifoitem = FIFOItem.objects.create(**i) + p_list0 = [] + for x in p_details: + x['material'] = i['material'] + x['fifoitem'] = fifoitem + p_list0.append(FIFOItemProduct(**x)) + FIFOItemProduct.objects.bulk_create(p_list0) + + p_list = [] + for x in p_details: + x['material'] = i['material'] + x['warehouse'] = validated_data['warehouse'] + x['batch'] = i['batch'] + p_list.append(IProduct(**x)) + IProduct.objects.bulk_create(p_list) + else: + i['fifo'] = obj + FIFOItem.objects.create(**i) + return obj class FIFOInPurSerializer(serializers.ModelSerializer): """ @@ -118,18 +171,6 @@ class FIFOInPurSerializer(serializers.ModelSerializer): pass else: raise serializers.ValidationError('没有入库内容') - - # for i in details: - # # 校验批次 - # try: - # if i['batch']: - # obj = MaterialBatch.objects.get(batch=i['batch'], material=i['material']) - # if obj.warehouse != validated_data['warehouse']: - # raise serializers.ValidationError('批次号{}在其他仓库已存在'.format(i['batch'])) - # except: - # pass - - # 创建采购入库 with transaction.atomic(): validated_data['type'] = FIFO.FIFO_TYPE_PUR_IN obj = FIFO(**validated_data) diff --git a/hb_server/apps/inm/views.py b/hb_server/apps/inm/views.py index 26823cb..f3d76eb 100644 --- a/hb_server/apps/inm/views.py +++ b/hb_server/apps/inm/views.py @@ -1,12 +1,12 @@ from rest_framework import serializers from rest_framework import exceptions -from rest_framework.exceptions import APIException -from rest_framework.mixins import DestroyModelMixin, ListModelMixin, UpdateModelMixin +from rest_framework.exceptions import APIException, ValidationError +from rest_framework.mixins import DestroyModelMixin, ListModelMixin, UpdateModelMixin, CreateModelMixin from rest_framework.viewsets import GenericViewSet, ModelViewSet from apps.inm.filters import IProductFilterSet, MbFilterSet from apps.inm.models import FIFO, FIFOItem, IProduct, MaterialBatch, WareHouse, Inventory -from apps.inm.serializers import FIFOItemSerializer, FIFOInPurSerializer, FIFOItemUpdateSerializer, FIFOListSerializer, IProductListSerializer, \ +from apps.inm.serializers import FIFOInOtherSerializer, FIFOItemCreateSerializer, FIFOItemSerializer, FIFOInPurSerializer, FIFOItemUpdateSerializer, FIFOListSerializer, IProductListSerializer, \ InmTestRecordCreateSerializer, MaterialBatchQuerySerializer, MaterialBatchSerializer, WareHouseSerializer, \ WareHouseCreateUpdateSerializer, InventorySerializer from apps.inm.signals import update_inm @@ -77,7 +77,7 @@ class MaterialBatchViewSet(ListModelMixin, GenericViewSet): return Response(MaterialBatchSerializer(instance=queryset, many=True).data) -class FIFOItemViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin, GenericViewSet): +class FIFOItemViewSet(ListModelMixin, CreateModelMixin, DestroyModelMixin, UpdateModelMixin, GenericViewSet): """ 出入库记录详情表 """ @@ -93,12 +93,27 @@ class FIFOItemViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin, Gener def get_serializer_class(self): if self.action == 'update': return FIFOItemUpdateSerializer + elif self.action == 'create': + return FIFOItemCreateSerializer return super().get_serializer_class() - def perform_destroy(self, instance): - if instance.fifo.is_audited: - raise APIException('该出入库记录已通过审核, 无法删除') - return super().perform_destroy(instance) + def create(self, request, *args, **kwargs): + obj = self.get_object() + if obj.fifo.is_audited: + raise ValidationError('该出入库记录已审核') + return super().create(request, *args, **kwargs) + + def update(self, request, *args, **kwargs): + obj = self.get_object() + if obj.fifo.is_audited: + raise ValidationError('该出入库记录已审核') + return super().update(request, *args, **kwargs) + + def destroy(self, request, *args, **kwargs): + obj = self.get_object() + if obj.fifo.is_audited: + raise ValidationError('该出入库记录已审核') + return super().destroy(request, *args, **kwargs) @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=InmTestRecordCreateSerializer) def test(self, request, pk=None): @@ -160,6 +175,17 @@ class FIFOViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet): serializer.is_valid(raise_exception=True) serializer.save(create_by=request.user) return Response() + + @action(methods=['post'], detail=False, perms_map={'post': '*'}, + serializer_class=FIFOInOtherSerializer) + def in_other(self, request, pk=None): + """ + 其他入库 + """ + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + serializer.save(create_by=request.user) + return Response() @action(methods=['post'], detail=True, perms_map={'post': '*'}, serializer_class=serializers.Serializer) def audit(self, request, pk=None): @@ -167,6 +193,8 @@ class FIFOViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet): 审核通过 """ obj = self.get_object() + if not FIFOItem.objects.filter(fifo=obj).exists(): + raise ValidationError('出入库条目为空') for i in FIFOItem.objects.filter(fifo=obj, need_test=True): if not i.is_testok: raise APIException('未检验通过, 不可审核') diff --git a/hb_server/apps/pum/serializers.py b/hb_server/apps/pum/serializers.py index a3957a6..9194882 100644 --- a/hb_server/apps/pum/serializers.py +++ b/hb_server/apps/pum/serializers.py @@ -19,7 +19,12 @@ class PuOrderItemSerializer(ModelSerializer): model = PuOrderItem fields = '__all__' -class PuOrderItemCreateUpdateSerializer(ModelSerializer): +class PuOrderItemCreateSerializer(ModelSerializer): + class Meta: + model = PuOrderItem + fields = ['count', 'delivery_date', 'pu_order', 'material'] + +class PuOrderItemUpdateSerializer(ModelSerializer): class Meta: model = PuOrderItem fields = ['count', 'delivery_date'] diff --git a/hb_server/apps/pum/views.py b/hb_server/apps/pum/views.py index 378362a..2ae32da 100644 --- a/hb_server/apps/pum/views.py +++ b/hb_server/apps/pum/views.py @@ -5,7 +5,7 @@ from rest_framework.viewsets import ModelViewSet from rest_framework.mixins import CreateModelMixin, DestroyModelMixin from rest_framework.viewsets import GenericViewSet from apps.pum.models import PuOrder, PuOrderItem, Vendor -from apps.pum.serializers import PuOrderCreateUpdateSerializer, PuOrderItemCreateUpdateSerializer, PuOrderItemSerializer, PuOrderSerializer, VendorSerializer +from apps.pum.serializers import PuOrderCreateUpdateSerializer, PuOrderItemCreateSerializer, PuOrderItemSerializer, PuOrderItemUpdateSerializer, PuOrderSerializer, VendorSerializer from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from rest_framework.exceptions import APIException, ValidationError from rest_framework.decorators import action @@ -80,8 +80,10 @@ class PuOrderItemViewSet(CreateModelMixin, DestroyModelMixin, GenericViewSet): ordering = ['-create_time'] def get_serializer_class(self): - if self.action in ['create', 'update']: - return PuOrderItemCreateUpdateSerializer + if self.action == 'create': + return PuOrderItemCreateSerializer + elif self.action == 'update': + return PuOrderItemUpdateSerializer return super().get_serializer_class() def create(self, request, *args, **kwargs):