From 7e8ce5d60ac65ce51d26ab172e37b5aeec00fae0 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 17 Nov 2021 09:56:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=95=E4=B8=AA=E5=8D=8A=E6=88=90=E5=93=81?= =?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/pm/views.py | 3 ++- hb_server/apps/wpm/serializers.py | 8 +++++-- hb_server/apps/wpm/views.py | 37 ++++++++++++++++++++++--------- hb_server/utils/tools.py | 7 ++++++ 4 files changed, 42 insertions(+), 13 deletions(-) create mode 100644 hb_server/utils/tools.py diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py index a718880..2128aab 100644 --- a/hb_server/apps/pm/views.py +++ b/hb_server/apps/pm/views.py @@ -17,6 +17,7 @@ from rest_framework.exceptions import APIException from rest_framework.response import Response from rest_framework.decorators import action from django.db.models import F +from utils.tools import ranstr # Create your views here. def updateOrderPlanedCount(order): @@ -59,7 +60,7 @@ class ProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, CreateModel pass else: raise APIException('排产数量错误') - instance = serializer.save(create_by=request.user, product=order.product) + instance = serializer.save(create_by=request.user, product=order.product, number='JH-'+ranstr(7)) updateOrderPlanedCount(instance.order) return Response() diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 8653bde..c5bae06 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -13,17 +13,21 @@ from apps.system.serializers import UserSimpleSerializer from apps.wpm.models import Operation, WMaterial, WProduct, OperationRecord, OperationRecordItem from django.db import transaction +class PickHalfSerializer(serializers.Serializer): + wproducts = serializers.ListField(child=serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), label='半成品ID'), + 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', + iproducts = serializers.ListField(child=serializers.PrimaryKeyRelatedField(queryset=IProduct.objects.all(), label='库存半成品ID'), required=False) class PickSerializer(serializers.Serializer): subproduction_plan=serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID") - picks = PickDetailSerializer(many=True) + picks = PickDetailSerializer(many=True) # 从库存里拿 + def create(self, validated_data): picks = validated_data.pop('picks') diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 8652c4b..d81c071 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -5,7 +5,7 @@ from rest_framework.utils import serializer_helpers from rest_framework.utils.field_mapping import get_relation_kwargs from rest_framework.views import APIView from rest_framework.viewsets import GenericViewSet, ModelViewSet -from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct +from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, WareHouse from apps.inm.signals import update_inm from apps.mtm.models import Material, RecordForm, Step, SubprodctionMaterial from apps.mtm.serializers import RecordFormDetailSerializer @@ -17,14 +17,14 @@ from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from rest_framework.decorators import action from apps.wpm.models import WMaterial, WProduct, Operation, OperationMaterial, OperationRecord, OperationRecordItem -from apps.wpm.serializers import OperationDetailSerializer, OperationListSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestRecordCreateSerializer, WproductPutInSerializer +from apps.wpm.serializers import OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestRecordCreateSerializer, WproductPutInSerializer from rest_framework.response import Response from django.db import transaction from rest_framework import exceptions, serializers from apps.wpm.services import WpmServies from django.utils import timezone -import uuid +from utils.tools import ranstr # Create your views here. class WPlanViewSet(ListModelMixin, GenericViewSet): """ @@ -38,6 +38,21 @@ class WPlanViewSet(ListModelMixin, GenericViewSet): ordering_fields = [] ordering = ['-id'] + @action(methods=['post', 'get'], detail=True, perms_map={'post':'*', 'get':'*'}, serializer_class=PickHalfSerializer) + @transaction.atomic + def pick_half(self, request, pk=None): + """ + 领半成品 + """ + # if request.method=='GET' + # subplan = self.get_object() + # serializer= PickHalfSerializer(data=request.data) + # serializer.is_valid(raise_exception=True) + # vdata = serializer.data + # wps = WProduct.objects.filter(pk__in=[x for x in vdata['wproducts']]) + # pass + + @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=WplanPutInSerializer) @transaction.atomic def putin(self, request, pk=None): @@ -50,6 +65,7 @@ class WPlanViewSet(ListModelMixin, GenericViewSet): subplan = self.get_object() material = subplan.main_product batch = subplan.production_plan.number + warehouse = WareHouse.objects.get(id=vdata['warehouse']) wproducts = WProduct.objects.filter(subproduction_plan=subplan, act_state=WProduct.WPR_ACT_STATE_OK, m_state=material, is_deleted=False) if wproducts.exists(): @@ -61,7 +77,7 @@ class WPlanViewSet(ListModelMixin, GenericViewSet): fifoitem = FIFOItem() fifoitem.is_tested = True fifoitem.is_testok = True - fifoitem.warehouse = vdata['warehouse'] + fifoitem.warehouse = warehouse fifoitem.material = material fifoitem.count = wproducts.count() fifoitem.batch = batch @@ -82,7 +98,7 @@ class WPlanViewSet(ListModelMixin, GenericViewSet): ips2 = [] for i in wproducts: ip = {} - ip['warehouse'] = vdata['warehouse'] + ip['warehouse'] = warehouse ip['batch'] = batch ip['wproduct'] = i ip['number'] = i.number @@ -91,7 +107,7 @@ class WPlanViewSet(ListModelMixin, GenericViewSet): IProduct.objects.bulk_create(ips2) # 更新库存并修改半成品进行状态 update_inm(fifo) - wproducts.update(act_sate=WProduct.WPR_ACT_STATE_INM, warehouse=vdata['warehouse']) + wproducts.update(act_sate=WProduct.WPR_ACT_STATE_INM, warehouse=warehouse) return Response() @@ -165,7 +181,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet): if obj.is_testok: wproduct.act_state = WProduct.WPR_ACT_STATE_OK if wproduct.number is None: # 产生半成品编号 - wproduct.number = uuid.uuid4() + wproduct.number = 'WP-'+ranstr(7) wproduct.save() # 更新子计划状态 # 获取该子计划主产品数, 更新进度 @@ -189,6 +205,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet): serializer.is_valid(raise_exception=True) vdata = serializer.data wproduct = self.get_object() + warehouse = WareHouse.objects.get(id=vdata['warehouse']) if wproduct.act_state != WProduct.WPR_ACT_STATE_OK: raise exceptions.APIException('半成品不可入库') material = wproduct.m_state @@ -201,7 +218,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet): fifoitem = FIFOItem() fifoitem.is_tested = True fifoitem.is_testok = True - fifoitem.warehouse = vdata['warehouse'] + fifoitem.warehouse = warehouse fifoitem.material = material fifoitem.count = 1 # 单个半成品入库 fifoitem.batch = batch @@ -222,7 +239,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet): ips2 = [] for i in [wproduct]: ip = {} - ip['warehouse'] = vdata['warehouse'] + ip['warehouse'] = warehouse ip['batch'] = batch ip['wproduct'] = i ip['number'] = i.number @@ -232,7 +249,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet): # 更新库存并修改半成品进行状态 update_inm(fifo) wproduct.act_state=WProduct.WPR_ACT_STATE_INM - wproduct.warehouse=vdata['warehouse'] + wproduct.warehouse=warehouse wproduct.save() return Response() diff --git a/hb_server/utils/tools.py b/hb_server/utils/tools.py new file mode 100644 index 0000000..786b8f2 --- /dev/null +++ b/hb_server/utils/tools.py @@ -0,0 +1,7 @@ +import random +import string + +def ranstr(num): + salt = ''.join(random.sample(string.ascii_letters + string.digits, num)) + return salt +ranstr(10) \ No newline at end of file