inm 原入库改为其他入库

This commit is contained in:
caoqianming 2022-01-27 17:05:10 +08:00
parent 2b5e54ed03
commit 2d260e694d
5 changed files with 103 additions and 25 deletions

View File

@ -2,7 +2,7 @@ from django.db import models
from django.db.models.base import Model from django.db.models.base import Model
import django.utils.timezone as timezone import django.utils.timezone as timezone
from django.db.models.query import QuerySet 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 apps.system.models import CommonADModel, CommonAModel, CommonBModel, Organization, User, Dict, File
from utils.model import SoftModel, BaseModel from utils.model import SoftModel, BaseModel
from simple_history.models import HistoricalRecords from simple_history.models import HistoricalRecords
@ -79,6 +79,8 @@ class FIFO(CommonADModel):
User, verbose_name='审核人', on_delete=models.CASCADE, null=True, blank=True) User, verbose_name='审核人', on_delete=models.CASCADE, null=True, blank=True)
inout_date = models.DateField('出入库日期', null=True, blank=True) inout_date = models.DateField('出入库日期', null=True, blank=True)
remark = models.CharField('备注', max_length=1000, default='') 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='关联采购订单', pu_order = models.ForeignKey(PuOrder, verbose_name='关联采购订单',
null=True, blank=True, on_delete=models.CASCADE) null=True, blank=True, on_delete=models.CASCADE)

View File

@ -2,6 +2,7 @@ from rest_framework import exceptions
from rest_framework import serializers from rest_framework import serializers
from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, MaterialBatch, WareHouse, Inventory 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.qm.models import TestRecord, TestRecordItem
from apps.sam.serializers import OrderSimpleSerializer from apps.sam.serializers import OrderSimpleSerializer
@ -73,6 +74,15 @@ class FIFOListSerializer(serializers.ModelSerializer):
model = FIFO model = FIFO
fields = '__all__' 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): class FIFOItemSerializer(serializers.ModelSerializer):
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True) warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
@ -101,6 +111,49 @@ class MaterialBatchQuerySerializer(serializers.Serializer):
warehouse = serializers.IntegerField(label="仓库ID", required=False) warehouse = serializers.IntegerField(label="仓库ID", required=False)
materials = serializers.ListField(child=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): class FIFOInPurSerializer(serializers.ModelSerializer):
""" """
@ -118,18 +171,6 @@ class FIFOInPurSerializer(serializers.ModelSerializer):
pass pass
else: else:
raise serializers.ValidationError('没有入库内容') 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(): with transaction.atomic():
validated_data['type'] = FIFO.FIFO_TYPE_PUR_IN validated_data['type'] = FIFO.FIFO_TYPE_PUR_IN
obj = FIFO(**validated_data) obj = FIFO(**validated_data)

View File

@ -1,12 +1,12 @@
from rest_framework import serializers from rest_framework import serializers
from rest_framework import exceptions from rest_framework import exceptions
from rest_framework.exceptions import APIException from rest_framework.exceptions import APIException, ValidationError
from rest_framework.mixins import DestroyModelMixin, ListModelMixin, UpdateModelMixin from rest_framework.mixins import DestroyModelMixin, ListModelMixin, UpdateModelMixin, CreateModelMixin
from rest_framework.viewsets import GenericViewSet, ModelViewSet from rest_framework.viewsets import GenericViewSet, ModelViewSet
from apps.inm.filters import IProductFilterSet, MbFilterSet from apps.inm.filters import IProductFilterSet, MbFilterSet
from apps.inm.models import FIFO, FIFOItem, IProduct, MaterialBatch, WareHouse, Inventory 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, \ InmTestRecordCreateSerializer, MaterialBatchQuerySerializer, MaterialBatchSerializer, WareHouseSerializer, \
WareHouseCreateUpdateSerializer, InventorySerializer WareHouseCreateUpdateSerializer, InventorySerializer
from apps.inm.signals import update_inm from apps.inm.signals import update_inm
@ -77,7 +77,7 @@ class MaterialBatchViewSet(ListModelMixin, GenericViewSet):
return Response(MaterialBatchSerializer(instance=queryset, many=True).data) 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): def get_serializer_class(self):
if self.action == 'update': if self.action == 'update':
return FIFOItemUpdateSerializer return FIFOItemUpdateSerializer
elif self.action == 'create':
return FIFOItemCreateSerializer
return super().get_serializer_class() return super().get_serializer_class()
def perform_destroy(self, instance): def create(self, request, *args, **kwargs):
if instance.fifo.is_audited: obj = self.get_object()
raise APIException('该出入库记录已通过审核, 无法删除') if obj.fifo.is_audited:
return super().perform_destroy(instance) 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) @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=InmTestRecordCreateSerializer)
def test(self, request, pk=None): def test(self, request, pk=None):
@ -161,12 +176,25 @@ class FIFOViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet):
serializer.save(create_by=request.user) serializer.save(create_by=request.user)
return Response() 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) @action(methods=['post'], detail=True, perms_map={'post': '*'}, serializer_class=serializers.Serializer)
def audit(self, request, pk=None): def audit(self, request, pk=None):
""" """
审核通过 审核通过
""" """
obj = self.get_object() 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): for i in FIFOItem.objects.filter(fifo=obj, need_test=True):
if not i.is_testok: if not i.is_testok:
raise APIException('未检验通过, 不可审核') raise APIException('未检验通过, 不可审核')

View File

@ -19,7 +19,12 @@ class PuOrderItemSerializer(ModelSerializer):
model = PuOrderItem model = PuOrderItem
fields = '__all__' fields = '__all__'
class PuOrderItemCreateUpdateSerializer(ModelSerializer): class PuOrderItemCreateSerializer(ModelSerializer):
class Meta:
model = PuOrderItem
fields = ['count', 'delivery_date', 'pu_order', 'material']
class PuOrderItemUpdateSerializer(ModelSerializer):
class Meta: class Meta:
model = PuOrderItem model = PuOrderItem
fields = ['count', 'delivery_date'] fields = ['count', 'delivery_date']

View File

@ -5,7 +5,7 @@ from rest_framework.viewsets import ModelViewSet
from rest_framework.mixins import CreateModelMixin, DestroyModelMixin from rest_framework.mixins import CreateModelMixin, DestroyModelMixin
from rest_framework.viewsets import GenericViewSet from rest_framework.viewsets import GenericViewSet
from apps.pum.models import PuOrder, PuOrderItem, Vendor 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 apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin
from rest_framework.exceptions import APIException, ValidationError from rest_framework.exceptions import APIException, ValidationError
from rest_framework.decorators import action from rest_framework.decorators import action
@ -80,8 +80,10 @@ class PuOrderItemViewSet(CreateModelMixin, DestroyModelMixin, GenericViewSet):
ordering = ['-create_time'] ordering = ['-create_time']
def get_serializer_class(self): def get_serializer_class(self):
if self.action in ['create', 'update']: if self.action == 'create':
return PuOrderItemCreateUpdateSerializer return PuOrderItemCreateSerializer
elif self.action == 'update':
return PuOrderItemUpdateSerializer
return super().get_serializer_class() return super().get_serializer_class()
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):