inm 原入库改为其他入库
This commit is contained in:
parent
2b5e54ed03
commit
2d260e694d
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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('未检验通过, 不可审核')
|
||||||
|
|
|
@ -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']
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Loading…
Reference in New Issue