From a3ec039c0087e7ed9443d1495636400a3a3c4ff1 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 3 Dec 2021 10:11:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=8A=E6=88=90=E5=93=81=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E5=85=A5=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wpm/serializers.py | 21 +++---- hb_server/apps/wpm/views.py | 94 +++++++++++++++++-------------- 2 files changed, 62 insertions(+), 53 deletions(-) diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index f7591de..091ed4f 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -18,16 +18,14 @@ from django.db import transaction class PickHalfSerializer(serializers.Serializer): id = serializers.PrimaryKeyRelatedField(queryset=SubProductionProgress.objects.all(), label='子计划进度ID') - wproducts = serializers.ListField(child=serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), label='半成品ID'), - required=False) # 从半成品表里直接修改状态 + wproducts = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), label='半成品ID', many=True, required=False) # 从半成品表里直接修改状态 class PickDetailSerializer(serializers.Serializer): material = serializers.PrimaryKeyRelatedField(queryset=Material.objects.all(), label="物料ID") batch = serializers.CharField(label='物料批次', allow_blank=True) warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID") pick_count = serializers.IntegerField(label="领料数量", required=False) - iproducts = serializers.ListField(child=serializers.PrimaryKeyRelatedField(queryset=IProduct.objects.all(), label='库存半成品ID'), - required=False) + iproducts = serializers.PrimaryKeyRelatedField(queryset=IProduct.objects.all(), label='库存半成品ID',required=False, many=True) class PickSerializer(serializers.Serializer): subproduction_plan=serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID") @@ -172,8 +170,7 @@ class OperationCreateSerializer(serializers.Serializer): """ step = serializers.PrimaryKeyRelatedField(queryset=Step.objects.all(), label="子工序ID") # subproduction_plan = serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID", required=False) - wproducts = serializers.ListField(child= - serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all()), label="半成品ID列表", required=False) + wproducts = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), label="半成品ID列表", required=False, many=True) def validate(self, data): # subproduction_plan = data['subproduction_plan'] @@ -209,8 +206,7 @@ class OperationUpdateSerializer(serializers.ModelSerializer): class OperationInitSerializer(serializers.Serializer): step = serializers.PrimaryKeyRelatedField(queryset=Step.objects.all(), label="子工序ID") subproduction_plan = serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID", required=False) - wproducts = serializers.ListField(child= - serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all()), label="半成品ID列表", required=False) + wproducts = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), label="半成品ID列表", required=False, many=True) def validate(self, data): # subproduction_plan = data['subproduction_plan'] @@ -273,8 +269,7 @@ class OperationWproductListSerializer(serializers.ModelSerializer): class OperationSubmitSerializer(serializers.Serializer): step = serializers.PrimaryKeyRelatedField(queryset=Step.objects.all(), label="子工序ID") subproduction_plan = serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID", required=False) - wproducts = serializers.ListField(child= - serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all()), label="半成品ID列表", required=False) + wproducts = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), label="半成品ID列表", required=False, many=True) input = DoInputSerializer(many=True, required=False) output = DoOutputSerializer(many=True, required=False) forms = OperationRecordSerializer(many=True, required=False) @@ -307,6 +302,12 @@ class WproductPutInSerializer(serializers.Serializer): warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID") remark = serializers.CharField(label="入库备注", required =False) +class WproductPutInsSerializer(serializers.Serializer): + warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID") + wproducts = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), label='半成品ID', many=True) + remark = serializers.CharField(label="入库备注", required =False) + + class OperationEquipListSerializer(serializers.Serializer): equip_ = EquipmentSimpleSerializer(source='equip', read_only=True) class Meta: diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 39a7b08..2a9d3ad 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -18,7 +18,7 @@ from rest_framework.decorators import action from apps.wpm.filters import WMaterialFilterSet from apps.wpm.models import OperationEquip, OperationWproduct, Pick, PickWproduct, WMaterial, WProduct, Operation, OperationMaterial, OperationRecord, OperationRecordItem -from apps.wpm.serializers import OperationEquipListSerializer, OperationEquipUpdateSerializer, OperationMaterialCreate1Serailizer, OperationMaterialCreate2Serailizer, OperationMaterialCreate3Serializer, OperationMaterialListSerializer, OperationRecordListSerializer, OperationRecordSubmitSerializer, OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestRecordCreateSerializer, WproductPutInSerializer +from apps.wpm.serializers import OperationEquipListSerializer, OperationEquipUpdateSerializer, OperationMaterialCreate1Serailizer, OperationMaterialCreate2Serailizer, OperationMaterialCreate3Serializer, OperationMaterialListSerializer, OperationRecordListSerializer, OperationRecordSubmitSerializer, OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestRecordCreateSerializer, WproductPutInSerializer, WproductPutInsSerializer from rest_framework.response import Response from django.db import transaction from rest_framework import exceptions, serializers @@ -27,6 +27,7 @@ from apps.wpm.services import WpmServies from django.utils import timezone from utils.tools import ranstr from rest_framework import status +from django.db.models import Count # Create your views here. class WPlanViewSet(ListModelMixin, GenericViewSet): """ @@ -245,49 +246,56 @@ class WProductViewSet(ListModelMixin, GenericViewSet): wproduct.save() return Response() + + @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=WproductPutInsSerializer) + @transaction.atomic + def putins(self, request, pk=None): + """ + 半成品批量入库 + """ + serializer= WproductPutInsSerializer(data=request.data) + serializer.is_valid(raise_exception=True) + vdata = serializer.data + wproducts = WProduct.objects.filter(pk__in=[x for x in vdata['wproducts']]) + warehouse = WareHouse.objects.get(id=vdata['warehouse']) + for i in wproducts: + if i.act_state is not WProduct.WPR_ACT_STATE_OK: + raise exceptions.APIException('存在不可入库产品') + # 聚合一下 + wproducts_a = wproducts.values('subproduction_plan', 'material', 'subproduction_plan__number').annotate(total=Count('id')) + # 创建入库记录 + remark = vdata.get('remark', '') + fifo = FIFO.objects.create(type=FIFO.FIFO_TYPE_DO_IN, + is_audited=True, auditor=request.user, inout_date=timezone.now(), create_by=request.user, remark=remark) + # 创建入库明细 + for i in wproducts_a: + fifoitem = FIFOItem() + fifoitem.is_tested = True + fifoitem.is_testok = True + fifoitem.warehouse = warehouse + fifoitem.material = i['material'] + fifoitem.count = i['total'] + fifoitem.batch = i['subproduction_plan__number'] + fifoitem.fifo = fifo + fifoitem.subproduction_plan = i['subproduction_plan'] + fifoitem.save() + + wproducts_items = wproducts.filter(subproduction_plan=i['subproduction_plan'], material=i['material']) + ips = [] + for i in wproducts_items: + # 创建入库明细半成品 + ip = {} + ip['fifoitem'] = fifoitem + ip['wproduct'] = i + ip['number'] = i.number + ip['material'] = i.material + ips.append(FIFOItemProduct(**ip)) + FIFOItemProduct.objects.bulk_create(ips) + # 更新库存并修改半成品进行状态 + update_inm(fifo) + wproducts.update(act_state=WProduct.WPR_ACT_STATE_INM, warehouse=warehouse, update_by=request.user) + return Response() - # @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=WpmTestRecordCreateSerializer) - # @transaction.atomic - # def retest(self, request, pk=None): - # """ - # 复检 - # """ - # serializer = WpmTestRecordCreateSerializer(data=request.data) - # serializer.is_valid(raise_exception=True) - # vdata = serializer.validated_data - # record_data = vdata.pop('record_data') - # wproduct = vdata['wproduct'] - # if wproduct.act_state != WProduct.WPR_ACT_STATE_TORETEST: - # raise exceptions.APIException('该产品当前状态不可检验') - # if 'is_testok' not in vdata: - # raise exceptions.APIException('未填写检测结论') - - # obj = serializer.save(create_by = self.request.user, - # material=wproduct.material, number=wproduct.number, subproduction_plan=wproduct.subproduction_plan) - # tris = [] - # for m in record_data: # 保存记录详情 - # form_field = m['form_field'] - # m['field_name'] = form_field.field_name - # m['field_key'] = form_field.field_key - # m['field_type'] = form_field.field_type - # m['field_value'] = m['field_value'] - # m['sort'] = form_field.sort - # m['need_judge'] = form_field.need_judge - # m['is_testok'] = m['is_testok'] if 'is_testok' in m else None - # m['test_record'] = obj - # tris.append(TestRecordItem(**m)) - # TestRecordItem.objects.bulk_create(tris) - - # # 如果检测合格, 变更动态产品进行状态 - - # if obj.is_testok: - # wproduct.act_state = WProduct.WProduct.WPR_ACT_STATE_DOWAIT - # wproduct.save() - # else:# 如果不合格 - # wproduct.act_state = WProduct.WPR_ACT_STATE_NOTOK - # wproduct.save() - # return Response() - @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=WproductPutInSerializer) @transaction.atomic def putin(self, request, pk=None):