From a1df3434d796e676db3d3a866fe052832a20f7a6 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 22 Feb 2022 16:28:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=93=E5=8C=85=E8=A3=85=E7=AE=B1=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/mtm/serializers.py | 8 ++++ hb_server/apps/pm/views.py | 3 ++ .../sam/migrations/0014_auto_20220222_1530.py | 36 ++++++++++++++++++ hb_server/apps/sam/models.py | 2 +- hb_server/apps/sam/serializers_sale.py | 36 ++++++++++++++++-- hb_server/apps/sam/views_sale.py | 37 +++++++++++++++++-- 6 files changed, 114 insertions(+), 8 deletions(-) create mode 100644 hb_server/apps/sam/migrations/0014_auto_20220222_1530.py diff --git a/hb_server/apps/mtm/serializers.py b/hb_server/apps/mtm/serializers.py index 1398888..b3e3b71 100644 --- a/hb_server/apps/mtm/serializers.py +++ b/hb_server/apps/mtm/serializers.py @@ -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) diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py index fd10382..cb02d67 100644 --- a/hb_server/apps/pm/views.py +++ b/hb_server/apps/pm/views.py @@ -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('首件确认已完成') diff --git a/hb_server/apps/sam/migrations/0014_auto_20220222_1530.py b/hb_server/apps/sam/migrations/0014_auto_20220222_1530.py new file mode 100644 index 0000000..8f72513 --- /dev/null +++ b/hb_server/apps/sam/migrations/0014_auto_20220222_1530.py @@ -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, + }, + ), + ] diff --git a/hb_server/apps/sam/models.py b/hb_server/apps/sam/models.py index 65d230f..0477da0 100644 --- a/hb_server/apps/sam/models.py +++ b/hb_server/apps/sam/models.py @@ -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('打包数量') diff --git a/hb_server/apps/sam/serializers_sale.py b/hb_server/apps/sam/serializers_sale.py index 4acdbf2..1dda868 100644 --- a/hb_server/apps/sam/serializers_sale.py +++ b/hb_server/apps/sam/serializers_sale.py @@ -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 \ No newline at end of file + 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'] diff --git a/hb_server/apps/sam/views_sale.py b/hb_server/apps/sam/views_sale.py index 9997346..dad03e2 100644 --- a/hb_server/apps/sam/views_sale.py +++ b/hb_server/apps/sam/views_sale.py @@ -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() \ No newline at end of file + 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() \ No newline at end of file