打包装箱接口
This commit is contained in:
parent
3528e18192
commit
a1df3434d7
|
@ -24,6 +24,8 @@ class MaterialDetailSerializer(serializers.ModelSerializer):
|
|||
objs = Process.objects.filter(subproduction_process__product=obj, subproduction_process__is_deleted=False, is_deleted=False).distinct().order_by('number')
|
||||
return ProcessSimpleSerializer(instance=objs, many=True).data
|
||||
|
||||
|
||||
|
||||
class PackItemSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = PackItem
|
||||
|
@ -44,6 +46,12 @@ class MaterialSimpleSerializer(serializers.ModelSerializer):
|
|||
model = Material
|
||||
fields = ['id', 'name', 'number', 'unit','specification', 'type']
|
||||
|
||||
class PackItemDetailSerializer(serializers.ModelSerializer):
|
||||
material_ = MaterialSimpleSerializer(source='material', read_only=True)
|
||||
class Meta:
|
||||
model = PackItem
|
||||
fields = '__all__'
|
||||
|
||||
class ProcessSerializer(serializers.ModelSerializer):
|
||||
instruction_ = FileSimpleSerializer(source='instruction', read_only=True)
|
||||
workshop_ = OrganizationSimpleSerializer(source='workshop', read_only=True)
|
||||
|
|
|
@ -272,6 +272,9 @@ class SubProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, UpdateMo
|
|||
@action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=FirstTestAuditSerializer)
|
||||
@transaction.atomic
|
||||
def first_audit(self, request, pk=None):
|
||||
"""
|
||||
首件审核
|
||||
"""
|
||||
obj = self.get_object()
|
||||
if obj.leader_1 and obj.leader_2 and obj.leader_3:
|
||||
raise ValidationError('首件确认已完成')
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
# Generated by Django 3.2.9 on 2022-02-22 07:30
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import django.utils.timezone
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('mtm', '0049_auto_20220222_0944'),
|
||||
('sam', '0013_auto_20220222_0941'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='saleproduct',
|
||||
name='packnum',
|
||||
field=models.CharField(blank=True, max_length=100, null=True, verbose_name='装箱单号'),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='SalePack',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
|
||||
('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')),
|
||||
('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
|
||||
('count', models.PositiveSmallIntegerField(verbose_name='打包数量')),
|
||||
('packitem', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.packitem', verbose_name='打包项目')),
|
||||
('sale_product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sam.saleproduct', verbose_name='关联销售产品')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
),
|
||||
]
|
|
@ -94,7 +94,6 @@ class Sale(CommonADModel):
|
|||
receiver_address = models.CharField('收获地址', null=True, blank=True, max_length=200)
|
||||
remark = models.CharField('备注', null=True, blank=True, max_length=200)
|
||||
|
||||
|
||||
class SaleProduct(BaseModel):
|
||||
"""
|
||||
具体产品
|
||||
|
@ -117,6 +116,7 @@ class SalePack(BaseModel):
|
|||
on_delete=models.CASCADE)
|
||||
packitem = models.ForeignKey(PackItem, verbose_name='打包项目',
|
||||
on_delete=models.CASCADE)
|
||||
count = models.PositiveSmallIntegerField('打包数量')
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -2,8 +2,9 @@ from rest_framework import serializers
|
|||
from rest_framework import exceptions
|
||||
from apps.inm.models import IProduct
|
||||
from apps.inm.serializers import IProductListSerializer
|
||||
from apps.mtm.serializers import MaterialSimpleSerializer
|
||||
from apps.sam.models import Sale, SaleProduct
|
||||
from apps.mtm.models import Material, PackItem
|
||||
from apps.mtm.serializers import MaterialSimpleSerializer, PackItemDetailSerializer
|
||||
from apps.sam.models import Sale, SalePack, SaleProduct
|
||||
from apps.sam.serializers import CustomerSimpleSerializer, OrderSimpleSerializer
|
||||
from django.db import transaction
|
||||
from rest_framework.exceptions import ValidationError
|
||||
|
@ -60,4 +61,33 @@ class SaleProductCreateSerializer(serializers.ModelSerializer):
|
|||
if order:
|
||||
if sale.count+order.delivered_count>order.count:
|
||||
raise exceptions.APIException('超过订单所需数量')
|
||||
return instance
|
||||
return instance
|
||||
|
||||
class SPackItemSerializer(serializers.ModelSerializer):
|
||||
name = serializers.CharField(source='packitem.name', read_only=True)
|
||||
specification = serializers.CharField(source='packitem.specification', read_only=True)
|
||||
unit = serializers.CharField(source='packitem.unit', read_only=True)
|
||||
material_ = MaterialSimpleSerializer(source='packitem.material', read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = SalePack
|
||||
fields = '__all__'
|
||||
|
||||
class SaleProductPackDetailSerializer(serializers.ModelSerializer):
|
||||
detail = serializers.SerializerMethodField()
|
||||
class Meta:
|
||||
model = ['packnum', 'detail']
|
||||
|
||||
def get_detail(self, obj):
|
||||
return SPackItemSerializer(instance=SalePack.objects.filter(sale_product=obj)
|
||||
, many=True).data
|
||||
|
||||
class SPackItemCreateSerializer(serializers.Serializer):
|
||||
id = serializers.PrimaryKeyRelatedField(queryset=PackItem.objects.all())
|
||||
count = serializers.IntegerField()
|
||||
|
||||
class SaleProductPackSerializer(serializers.ModelSerializer):
|
||||
detail = SPackItemCreateSerializer(many=True)
|
||||
class Meta:
|
||||
model = SaleProduct
|
||||
fields = ['packnum', 'detail']
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
|
||||
from rest_framework.mixins import ListModelMixin, DestroyModelMixin, CreateModelMixin, RetrieveModelMixin
|
||||
from rest_framework.viewsets import GenericViewSet
|
||||
from rest_framework.response import Response
|
||||
from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, WareHouse
|
||||
from apps.inm.services import InmService
|
||||
from apps.mtm.models import Material
|
||||
from apps.sam.models import Sale, SaleProduct
|
||||
from apps.sam.serializers_sale import SaleCreateSerializer, SaleListSerializer, SaleProductCreateSerializer, SaleProductListSerializer
|
||||
from apps.mtm.models import Material, PackItem
|
||||
from apps.sam.models import Sale, SalePack, SaleProduct
|
||||
from apps.sam.serializers_sale import SaleCreateSerializer, SaleListSerializer, SaleProductCreateSerializer, SaleProductListSerializer, SaleProductPackDetailSerializer, SaleProductPackSerializer
|
||||
from rest_framework import exceptions
|
||||
from django.db import transaction
|
||||
from rest_framework.decorators import action
|
||||
|
@ -157,4 +158,32 @@ class SaleProductViewSet(ListModelMixin, DestroyModelMixin, CreateModelMixin, Ge
|
|||
obj.delete()
|
||||
sale.count = SaleProduct.objects.filter(sale=obj.sale).count()
|
||||
sale.save()
|
||||
return Response()
|
||||
return Response()
|
||||
|
||||
|
||||
@action(methods=['get', 'post'], detail=True, perms_map={'post':'sale_pack'}, serializer_class=serializers.Serializer)
|
||||
@transaction.atomic
|
||||
def pack(self, request, pk=None):
|
||||
"""
|
||||
打包装箱
|
||||
"""
|
||||
obj = self.get_object()
|
||||
if request.method == 'GET':
|
||||
for i in PackItem.objects.filter(product=obj.product.material, is_deleted=False):
|
||||
SalePack.objects.get_or_create(sale_product=obj, packitem=i,
|
||||
defaults={
|
||||
"sale_product":obj,
|
||||
"packitem":i,
|
||||
"count":i.count
|
||||
})
|
||||
return Response(SaleProductPackDetailSerializer(instance=obj).data)
|
||||
elif request.method == 'POST':
|
||||
serializer = SaleProductPackSerializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
vdata = serializer.validated_data
|
||||
obj.packnum = vdata['packnum']
|
||||
for i in vdata['detail']:
|
||||
pi = i['id']
|
||||
pi.count = i['count']
|
||||
pi.save()
|
||||
return Response()
|
Loading…
Reference in New Issue