diff --git a/hb_server/apps/srm/views.py b/hb_server/apps/srm/views.py index a739725..4551f30 100644 --- a/hb_server/apps/srm/views.py +++ b/hb_server/apps/srm/views.py @@ -15,3 +15,4 @@ class GanttPlan(ListAPIView): queryset = ProductionPlan.objects.filter(is_deleted=False, is_planed=True).prefetch_related('subplan_plan', 'subplan_plan__process') ordering = ['-id'] + diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index 7b615e5..9ccf298 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -219,7 +219,7 @@ class OperationMaterial(BaseModel): 生产操作物料消耗产出表 """ type = models.IntegerField('类型', default=0, choices=SubprodctionMaterial.type_choices) - operation = models.ForeignKey(Operation, verbose_name='关联的生产操作', on_delete=models.CASCADE) + operation = models.ForeignKey(Operation, verbose_name='关联的生产操作', on_delete=models.CASCADE, related_name='om_operation') material = models.ForeignKey(Material, verbose_name='可能产出的产品', on_delete=models.CASCADE, null=True, blank=True, related_name='om_material') diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index fa291a9..92048bd 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -1,3 +1,4 @@ +from django.db.models.query_utils import Q from rest_framework import serializers, exceptions from rest_framework.serializers import ModelSerializer from apps.em.models import Equipment @@ -165,6 +166,53 @@ class WProductListSerializer(serializers.ModelSerializer): return WProductBaseSerializer(instance=wps, many=True).data return [] +class WProductCardBaseSerializer(serializers.ModelSerializer): + """ + 产品流程序列化 + """ + material_ = MaterialSimpleSerializer(source='material', read_only=True) + step_ = StepSimpleSerializer(source='step', read_only=True) + subproduction_plan_ = SubproductionPlanSimpleSerializer(source='subproduction_plan', read_only=True) + warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True) + step_list_full = serializers.SerializerMethodField() + + class Meta: + model = WProduct + fields = '__all__' + + def get_step_list_full(self, obj): + """ + 获取所有步骤信息 + """ + step_list_full = [] + comb_step = Step.objects.filter(type=Step.STEP_TYPE_COMB, is_deleted=False).first() + if obj.material.type == Material.MA_TYPE_GOOD: + # 如果是成品获取可能经过的步骤 + steps = Step.objects.filter(number__gte=comb_step.number).order_by('number') + elif obj.material.type == Material.MA_TYPE_HALFGOOD: + steps = Step.objects.filter(number__lt=comb_step.number).order_by('number') + for i in steps: + actions = [] + ops = Operation.objects.filter(Q(ow_operation__wproduct=obj)|Q(wp_coperation=obj))\ + .filter(step=i, is_submited=True).distinct() + for m in ops: + actions.append({'action_by_name':m.create_by.name, 'action_time':m.update_time.strftime('%Y-%m-%d %H:%M:%S')}) + step_list_full.append({'step_name':i.name, 'actions':actions}) + return step_list_full + +class WProductCardSerializer(WProductCardBaseSerializer): + """ + 产品流程序列化 + """ + parents = serializers.SerializerMethodField() + + def get_parents(self, obj): + parent_wps = WProduct.objects.filter(child=obj) + return WProductCardBaseSerializer(instance=parent_wps, many=True).data + + + + class WProductDetailSerializer(serializers.ModelSerializer): """ diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 68a76ee..a5d9150 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -22,7 +22,7 @@ from apps.wf.serializers import WorkflowSimpleSerializer from apps.wpm.filters import CuttingFilterSet, WMaterialFilterSet, WProductFilterSet from apps.wpm.models import OperationEquip, OperationWproduct, Pick, PickWproduct, WMaterial, WProduct, Operation, OperationMaterial, OperationRecord, OperationRecordItem, WprouctTicket -from apps.wpm.serializers import CuttingListSerializer, OperationEquipListSerializer, OperationEquipUpdateSerializer, OperationMaterialCreate1ListSerailizer, OperationMaterialCreate1Serailizer, OperationMaterialCreate2ListSerailizer, OperationMaterialCreate2Serailizer, OperationMaterialCreate3Serializer, OperationMaterialListSerializer, OperationRecordDetailSerializer, OperationRecordListSerializer, OperationRecordSubmitSerializer, OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickHalfsSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, ScrapSerializer, WMaterialListSerializer, WProductDetailSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestFormInitSerializer, WpmTestRecordCreateSerializer, WproductMtestSerializer, WproductPutInSerializer, WproductPutInsSerializer, WproductTicketListSerializer +from apps.wpm.serializers import CuttingListSerializer, OperationEquipListSerializer, OperationEquipUpdateSerializer, OperationMaterialCreate1ListSerailizer, OperationMaterialCreate1Serailizer, OperationMaterialCreate2ListSerailizer, OperationMaterialCreate2Serailizer, OperationMaterialCreate3Serializer, OperationMaterialListSerializer, OperationRecordDetailSerializer, OperationRecordListSerializer, OperationRecordSubmitSerializer, OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickHalfsSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, ScrapSerializer, WMaterialListSerializer, WProductCardSerializer, WProductDetailSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestFormInitSerializer, WpmTestRecordCreateSerializer, WproductMtestSerializer, WproductPutInSerializer, WproductPutInsSerializer, WproductTicketListSerializer from rest_framework.response import Response from django.db import transaction from rest_framework import exceptions, serializers @@ -454,6 +454,14 @@ class WProductViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet): WpmServies.add_wproduct_flow_log(instance=obj, change_str=change_str) return Response() + @action(methods=['get'], detail=True, perms_map={'get':'*'}) + def card(self, request, pk=None): + """ + 流程卡 + """ + obj = self.get_object() + return Response(WProductCardSerializer(instance=obj).data) + class WproductTicketViewSet(ListModelMixin, GenericViewSet): """ 玻璃审批工单