单个半成品入库
This commit is contained in:
parent
43d297881e
commit
7e8ce5d60a
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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)
|
Loading…
Reference in New Issue