diff --git a/hb_server/apps/inm/signals.py b/hb_server/apps/inm/signals.py index 83c28f5..d62ba49 100644 --- a/hb_server/apps/inm/signals.py +++ b/hb_server/apps/inm/signals.py @@ -8,7 +8,7 @@ def update_inm(instance:FIFO, type:int=1): """ 更新库存(正反) """ - if instance.type in [FIFO.FIFO_TYPE_PUR_IN]: # 采购入库 + if instance.type in [FIFO.FIFO_TYPE_PUR_IN, FIFO.FIFO_TYPE_DO_IN]: # 采购入库, 生产入库 # 更新相关表 for i in FIFOItem.objects.filter(fifo=instance): material = i.material diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index d8194e1..7f3555c 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -187,10 +187,15 @@ class WpmTestRecordCreateSerializer(serializers.ModelSerializer): model = TestRecord fields = ['form', 'record_data', 'is_testok', 'wproduct'] -class WproductPutin(serializers.Serializer): +class WproductPutInSerializer(serializers.Serializer): """ 半成品入库序列化 """ + +class WplanPutInSerializer(serializers.Serializer): + warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID") + remark = serializers.CharField(label="入库备注", required =False) + \ No newline at end of file diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 414669c..fec4feb 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -5,6 +5,8 @@ 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 +from apps.inm.signals import update_inm from apps.mtm.models import Material, RecordForm, Step, SubprodctionMaterial from apps.mtm.serializers import RecordFormDetailSerializer from apps.pm.models import SubProductionPlan, SubProductionProgress @@ -15,12 +17,13 @@ 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, WpmTestRecordCreateSerializer +from apps.wpm.serializers import OperationDetailSerializer, OperationListSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestRecordCreateSerializer from rest_framework.response import Response from django.db import transaction -from rest_framework import exceptions +from rest_framework import exceptions, serializers from apps.wpm.services import WpmServies +from django.utils import timezone # Create your views here. class WPlanViewSet(ListModelMixin, GenericViewSet): """ @@ -34,6 +37,51 @@ class WPlanViewSet(ListModelMixin, GenericViewSet): ordering_fields = ['process__number'] ordering = ['process__number'] + @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=WplanPutInSerializer) + @transaction.atomic + def putin(self, request, pk=None): + """ + 半成品入库 + """ + serializer= WplanPutInSerializer(data=request.data) + serializer.is_valid(raise_exception=True) + vdata = serializer.data + subplan = self.get_object() + material = subplan.main_product + batch = subplan.production_plan.number + wproducts = WProduct.objects.filter(subproduction_plan=subplan, + act_state=WProduct.WPR_ACT_STATE_OK, m_state=material, is_deleted=False) + if wproducts.exists(): + # 创建入库记录 + fifo = FIFO.objects.create(type=FIFO.FIFO_TYPE_DO_IN, + is_audited=True, auditor=request.user, inout_date=timezone.now(), create_by=request.user) + # 创建入库明细 + fifoitem = FIFOItem() + fifoitem.is_tested = True + fifoitem.is_testok = True + fifoitem.warehouse = vdata['warehouse'] + fifoitem.material = material + fifoitem.count = wproducts.count() + fifoitem.batch = batch + fifoitem.fifo = fifo + fifoitem.subproduction_plan = subplan + fifoitem.save() + # 创建入库明细半成品 + ips = [] + for i in wproducts: + ip = {} + ip['fifoitem'] = fifoitem + ip['wproduct'] = i + ip['number'] = i.number + ip['material'] = material + ips.append(FIFOItemProduct(**ip)) + FIFOItemProduct.objects.bulk_create(ips) + # 更新库存隐藏半成品 + update_inm(fifo) + wproducts.update(is_hidden=True) + return Response() + + class WMaterialViewSet(CreateUpdateModelAMixin, ListModelMixin, GenericViewSet): """ 车间物料表 @@ -68,13 +116,6 @@ class WProductViewSet(ListModelMixin, GenericViewSet): ordering_fields = ['id'] ordering = ['id'] - @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=WpmTestRecordCreateSerializer) - @transaction.atomic - def putin(): - """ - 半成品入库 - """ - @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=WpmTestRecordCreateSerializer) @transaction.atomic def test(self, request, pk=None):