from django.shortcuts import render from rest_framework.generics import CreateAPIView, GenericAPIView from rest_framework.mixins import ListModelMixin 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.mtm.models import Material, RecordForm, Step from apps.mtm.serializers import RecordFormDetailSerializer from apps.pm.models import SubProductionPlan, SubProductionProgress from apps.pm.serializers import SubProductionPlanListSerializer, SubProductionPlanUpdateSerializer from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from rest_framework.decorators import action from apps.wpm.models import WMaterial, WProduct, WProductAction, WProductMaterial, WProductRecord, WProductRecordDetail from apps.wpm.serializers import PickSerializer, WActionInitSerializer, WActionSubmitSerializer, WMaterialListSerializer from rest_framework.response import Response # Create your views here. class WPlanViewSet(ListModelMixin, GenericViewSet): """ 车间生产计划 """ perms_map = {'*': '*'} queryset = SubProductionPlan.objects.select_related('process', 'workshop', 'subproduction', 'main_product').exclude(state=0) search_fields = [] serializer_class = SubProductionPlanListSerializer filterset_fields = ['production_plan', 'process', 'state', 'main_product', 'workshop'] ordering_fields = ['process__number'] ordering = ['process__number'] class WMaterialViewSet(CreateUpdateModelAMixin, ListModelMixin, GenericViewSet): """ 车间物料表 """ perms_map={'*':'*'} queryset = WMaterial.objects.select_related('material').all() serializer_class = WMaterialListSerializer filterset_fields = ['material', 'subproduction_plan', 'subproduction_plan__process', 'subproduction_plan__workshop'] ordering_fields = ['material__number'] ordering = ['material__number'] @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=PickSerializer) def pick(self, request, pk=None): """ 领料 """ serializer= PickSerializer(data=request.data, context={'request': request}) serializer.is_valid(raise_exception=True) serializer.save() return Response() class DoFormInit(CreateAPIView, GenericAPIView): perms_map={'*':'*'} serializer_class=WActionInitSerializer def post(self, request, format=None): """ 调用操作表单 """ data = request.data serializer = WActionInitSerializer(data=data) serializer.is_valid(raise_exception=True) vdata = serializer.validated_data ret = {} ret['step'] = data['step'] ret['subproduction_plan'] = data['subproduction_plan'] if 'wproducts' in data and data['wproducts']: ret['wproducts'] = data['wproducts'] else: ret['wproducts'] = [] # 调出该子计划现有物料 ret['input'] = list(WMaterial.objects.filter(subproduction_plan=vdata['subproduction_plan'])\ .values('id', 'material', 'material__name', 'count', 'material__number', 'batch')) for i in ret['input']: i['count_input'] = 0 # 需要输出的物料 # 如果传入半成品列表就不需要 if ret['wproducts']: # 排除wproduct列表 # mids = WProduct.objects.filter(pk__in=data['wproducts']).values_list('m_state', flat=True) o_objs = SubProductionProgress.objects.filter( subproduction_plan=vdata['subproduction_plan'], type=2).exclude(is_main=True) else: o_objs = SubProductionProgress.objects.filter( subproduction_plan=vdata['subproduction_plan'], type=2) ret['output'] = list(o_objs.values('material', 'material__name', 'material__number')) for i in ret['output']: i['count_output']=0 ret['forms'] = [] forms = RecordForm.objects.filter(step=vdata['step'], type=1) if forms.exists(): ret['forms'] = RecordFormDetailSerializer(instance=forms, many=True).data return Response(ret) class DoFormSubmit(CreateAPIView, GenericAPIView): perms_map={'*':'*'} serializer_class = WActionSubmitSerializer def post(self, request, format=None): """ 提交操作表单 """ data = request.data serializer = WActionInitSerializer(data=data) serializer.is_valid(raise_exception=True) vdata = serializer.validated_data #校验之后的数据 # 创建一个生产操作记录 action_obj = WProductAction() action_obj.p_state = vdata['step'] if 'wproducts' in data and data['wproducts']: action_obj.wproducts = data['wproducts'] action_obj.m_state = vdata[0].m_state action_obj.remark = data['remark'] # 操作备注 action_obj.create_by = request.user action_obj.save() # 保存物料消耗 for i in vdata['input']: if i['count_input']: #如果有消耗 i_wmat = i['id'] WProductMaterial.objects.create(type=1, wproduct_action=action_obj, wmaterial= i_wmat, count=i['count_input']) # 更新车间物料 i_wmat.count = i_wmat.count- i['count_input'] i_wmat.save() # 更新子计划物料消耗情况 sp = SubProductionProgress.objects.get(subproduction_plan=i_wmat.subproduction_plan, material=i_wmat.material) sp.count_real = sp.count_real + i['count_input'] sp.save() # 物料产出 if 'output' in data and data['output']: for i in vdata['output']: # 已经序列化好的数据 ma = i['material'] if ma.is_main: # 计划开始, 第一步切割创建动态产品 wpr = dict(m_state=ma, p_state=vdata['step'], act_state=1, is_executed=True, remark='', subproduction_plan=vdata['subproduction_plan'], production_plan=vdata['subproduction_plan'].production_plan) for x in range(i['count_output']): WProduct.objects.create(**wpr) else: # 更新操作消耗物料表 WProductMaterial.objects.create(type=2, wproduct_action=action_obj, material= ma, count=i['count_output']) # 更新车间物料表 ins, _ = WMaterial.objects.get_or_create(subproduction_plan=vdata['subproduction_plan'], material=ma) ins.count = ins.count + i['count_output'] ins.save() # 更新子计划进度表 sp = SubProductionProgress.objects.get(subproduction_plan=vdata['subproduction_plan'], material=ma) sp.count_real = sp.count_real + i['count_input'] sp.save() # 更新主产出 if 'wproducts' in data and data['wproducts']: wproducts = WProduct.objects.filter(pk__in=data['wproducts']) wproducts.update(p_state=vdata['step'], is_executed=True) # 保存自定义表单结果 for i in vdata['forms']: wr = WProductRecord() wr.form = i['form'] wr.create_by = request.user wr.wproduct_action = action_obj wr.save() wrds = [] for m in i['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'] = form_field.field_value m['sort'] = form_field.sort m['wproduct_record'] = wr wrds.append(WProductRecordDetail(**m)) WProductRecordDetail.objects.bulk_create(wrds) return Response()