单个半成品入库

This commit is contained in:
caoqianming 2021-11-17 09:56:58 +08:00
parent 43d297881e
commit 7e8ce5d60a
4 changed files with 42 additions and 13 deletions

View File

@ -17,6 +17,7 @@ from rest_framework.exceptions import APIException
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.decorators import action from rest_framework.decorators import action
from django.db.models import F from django.db.models import F
from utils.tools import ranstr
# Create your views here. # Create your views here.
def updateOrderPlanedCount(order): def updateOrderPlanedCount(order):
@ -59,7 +60,7 @@ class ProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, CreateModel
pass pass
else: else:
raise APIException('排产数量错误') 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) updateOrderPlanedCount(instance.order)
return Response() return Response()

View File

@ -13,17 +13,21 @@ from apps.system.serializers import UserSimpleSerializer
from apps.wpm.models import Operation, WMaterial, WProduct, OperationRecord, OperationRecordItem from apps.wpm.models import Operation, WMaterial, WProduct, OperationRecord, OperationRecordItem
from django.db import transaction 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): class PickDetailSerializer(serializers.Serializer):
material = serializers.PrimaryKeyRelatedField(queryset=Material.objects.all(), label="物料ID") material = serializers.PrimaryKeyRelatedField(queryset=Material.objects.all(), label="物料ID")
batch = serializers.CharField(label='物料批次', allow_blank=True) batch = serializers.CharField(label='物料批次', allow_blank=True)
warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID") warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID")
pick_count = serializers.IntegerField(label="领料数量", required=False) 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) required=False)
class PickSerializer(serializers.Serializer): class PickSerializer(serializers.Serializer):
subproduction_plan=serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID") subproduction_plan=serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID")
picks = PickDetailSerializer(many=True) picks = PickDetailSerializer(many=True) # 从库存里拿
def create(self, validated_data): def create(self, validated_data):
picks = validated_data.pop('picks') picks = validated_data.pop('picks')

View File

@ -5,7 +5,7 @@ from rest_framework.utils import serializer_helpers
from rest_framework.utils.field_mapping import get_relation_kwargs from rest_framework.utils.field_mapping import get_relation_kwargs
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework.viewsets import GenericViewSet, ModelViewSet 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.inm.signals import update_inm
from apps.mtm.models import Material, RecordForm, Step, SubprodctionMaterial from apps.mtm.models import Material, RecordForm, Step, SubprodctionMaterial
from apps.mtm.serializers import RecordFormDetailSerializer from apps.mtm.serializers import RecordFormDetailSerializer
@ -17,14 +17,14 @@ from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin
from rest_framework.decorators import action from rest_framework.decorators import action
from apps.wpm.models import WMaterial, WProduct, Operation, OperationMaterial, OperationRecord, OperationRecordItem 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 rest_framework.response import Response
from django.db import transaction from django.db import transaction
from rest_framework import exceptions, serializers from rest_framework import exceptions, serializers
from apps.wpm.services import WpmServies from apps.wpm.services import WpmServies
from django.utils import timezone from django.utils import timezone
import uuid from utils.tools import ranstr
# Create your views here. # Create your views here.
class WPlanViewSet(ListModelMixin, GenericViewSet): class WPlanViewSet(ListModelMixin, GenericViewSet):
""" """
@ -38,6 +38,21 @@ class WPlanViewSet(ListModelMixin, GenericViewSet):
ordering_fields = [] ordering_fields = []
ordering = ['-id'] 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) @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=WplanPutInSerializer)
@transaction.atomic @transaction.atomic
def putin(self, request, pk=None): def putin(self, request, pk=None):
@ -50,6 +65,7 @@ class WPlanViewSet(ListModelMixin, GenericViewSet):
subplan = self.get_object() subplan = self.get_object()
material = subplan.main_product material = subplan.main_product
batch = subplan.production_plan.number batch = subplan.production_plan.number
warehouse = WareHouse.objects.get(id=vdata['warehouse'])
wproducts = WProduct.objects.filter(subproduction_plan=subplan, wproducts = WProduct.objects.filter(subproduction_plan=subplan,
act_state=WProduct.WPR_ACT_STATE_OK, m_state=material, is_deleted=False) act_state=WProduct.WPR_ACT_STATE_OK, m_state=material, is_deleted=False)
if wproducts.exists(): if wproducts.exists():
@ -61,7 +77,7 @@ class WPlanViewSet(ListModelMixin, GenericViewSet):
fifoitem = FIFOItem() fifoitem = FIFOItem()
fifoitem.is_tested = True fifoitem.is_tested = True
fifoitem.is_testok = True fifoitem.is_testok = True
fifoitem.warehouse = vdata['warehouse'] fifoitem.warehouse = warehouse
fifoitem.material = material fifoitem.material = material
fifoitem.count = wproducts.count() fifoitem.count = wproducts.count()
fifoitem.batch = batch fifoitem.batch = batch
@ -82,7 +98,7 @@ class WPlanViewSet(ListModelMixin, GenericViewSet):
ips2 = [] ips2 = []
for i in wproducts: for i in wproducts:
ip = {} ip = {}
ip['warehouse'] = vdata['warehouse'] ip['warehouse'] = warehouse
ip['batch'] = batch ip['batch'] = batch
ip['wproduct'] = i ip['wproduct'] = i
ip['number'] = i.number ip['number'] = i.number
@ -91,7 +107,7 @@ class WPlanViewSet(ListModelMixin, GenericViewSet):
IProduct.objects.bulk_create(ips2) IProduct.objects.bulk_create(ips2)
# 更新库存并修改半成品进行状态 # 更新库存并修改半成品进行状态
update_inm(fifo) 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() return Response()
@ -165,7 +181,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet):
if obj.is_testok: if obj.is_testok:
wproduct.act_state = WProduct.WPR_ACT_STATE_OK wproduct.act_state = WProduct.WPR_ACT_STATE_OK
if wproduct.number is None: # 产生半成品编号 if wproduct.number is None: # 产生半成品编号
wproduct.number = uuid.uuid4() wproduct.number = 'WP-'+ranstr(7)
wproduct.save() wproduct.save()
# 更新子计划状态 # 更新子计划状态
# 获取该子计划主产品数, 更新进度 # 获取该子计划主产品数, 更新进度
@ -189,6 +205,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet):
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
vdata = serializer.data vdata = serializer.data
wproduct = self.get_object() wproduct = self.get_object()
warehouse = WareHouse.objects.get(id=vdata['warehouse'])
if wproduct.act_state != WProduct.WPR_ACT_STATE_OK: if wproduct.act_state != WProduct.WPR_ACT_STATE_OK:
raise exceptions.APIException('半成品不可入库') raise exceptions.APIException('半成品不可入库')
material = wproduct.m_state material = wproduct.m_state
@ -201,7 +218,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet):
fifoitem = FIFOItem() fifoitem = FIFOItem()
fifoitem.is_tested = True fifoitem.is_tested = True
fifoitem.is_testok = True fifoitem.is_testok = True
fifoitem.warehouse = vdata['warehouse'] fifoitem.warehouse = warehouse
fifoitem.material = material fifoitem.material = material
fifoitem.count = 1 # 单个半成品入库 fifoitem.count = 1 # 单个半成品入库
fifoitem.batch = batch fifoitem.batch = batch
@ -222,7 +239,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet):
ips2 = [] ips2 = []
for i in [wproduct]: for i in [wproduct]:
ip = {} ip = {}
ip['warehouse'] = vdata['warehouse'] ip['warehouse'] = warehouse
ip['batch'] = batch ip['batch'] = batch
ip['wproduct'] = i ip['wproduct'] = i
ip['number'] = i.number ip['number'] = i.number
@ -232,7 +249,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet):
# 更新库存并修改半成品进行状态 # 更新库存并修改半成品进行状态
update_inm(fifo) update_inm(fifo)
wproduct.act_state=WProduct.WPR_ACT_STATE_INM wproduct.act_state=WProduct.WPR_ACT_STATE_INM
wproduct.warehouse=vdata['warehouse'] wproduct.warehouse=warehouse
wproduct.save() wproduct.save()
return Response() return Response()

7
hb_server/utils/tools.py Normal file
View File

@ -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)