diff --git a/hb_server/apps/wf/services.py b/hb_server/apps/wf/services.py index 5d486c1..fa32197 100644 --- a/hb_server/apps/wf/services.py +++ b/hb_server/apps/wf/services.py @@ -130,6 +130,7 @@ class WfService(object): import datetime, time # 用于支持条件表达式中对时间的操作 if eval(expression, {'__builtins__':None}, {'datetime':datetime, 'time':time}): destination_state = State.objects.get(pk=i['target_state']) + return destination_state return destination_state @classmethod @@ -321,7 +322,8 @@ class WfService(object): if not created: for key, value in source_state.state_fields.items(): if value in (State.STATE_FIELD_REQUIRED, State.STATE_FIELD_OPTIONAL): - source_ticket_data[key] = new_ticket_data[key] + if key in new_ticket_data: + source_ticket_data[key] = new_ticket_data[key] ticket.ticket_data = source_ticket_data ticket.save() diff --git a/hb_server/apps/wpm/migrations/0042_wprouctticket_resp_process.py b/hb_server/apps/wpm/migrations/0042_wprouctticket_resp_process.py new file mode 100644 index 0000000..3f10a57 --- /dev/null +++ b/hb_server/apps/wpm/migrations/0042_wprouctticket_resp_process.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.9 on 2021-12-30 08:31 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0042_alter_recordformfield_field_type'), + ('wpm', '0041_wproductflow_change_str'), + ] + + operations = [ + migrations.AddField( + model_name='wprouctticket', + name='resp_process', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mtm.process', verbose_name='责任工序'), + ), + ] diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index 92caa8a..dd55ceb 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -120,6 +120,7 @@ class WprouctTicket(CommonAModel): step = models.ForeignKey(Step, verbose_name='所在步骤/发现步骤', on_delete=models.CASCADE) subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='所在子生产计划', on_delete=models.CASCADE) + resp_process = models.ForeignKey(Process, verbose_name='责任工序', on_delete=models.CASCADE, null=True, blank=True) ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单', on_delete=models.CASCADE, related_name='wt_ticket') decision = models.PositiveSmallIntegerField('最终决定', choices=WProduct.ng_choices, null=True, blank=True) diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index ec15acd..18503a4 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -5,7 +5,7 @@ from apps.em.serializers import EquipmentSimpleSerializer from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, MaterialBatch, WareHouse from apps.inm.signals import update_inm from apps.mtm.models import Material, RecordForm, RecordFormField, Step, SubprodctionMaterial -from apps.mtm.serializers import MaterialSimpleSerializer, RecordFormSimpleSerializer, StepSimpleSerializer +from apps.mtm.serializers import MaterialSimpleSerializer, ProcessSimpleSerializer, RecordFormSimpleSerializer, StepSimpleSerializer from apps.pm.models import SubProductionPlan, SubProductionProgress from django.utils import timezone @@ -13,7 +13,7 @@ from django.utils.translation import gettext_lazy as _ from apps.pm.serializers import SubproductionPlanSimpleSerializer from apps.qm.models import TestRecord, TestRecordItem from apps.system.serializers import UserSimpleSerializer -from apps.wpm.models import Operation, OperationEquip, OperationMaterial, OperationWproduct, Pick, WMaterial, WProduct, OperationRecord, OperationRecordItem +from apps.wpm.models import Operation, OperationEquip, OperationMaterial, OperationWproduct, Pick, WMaterial, WProduct, OperationRecord, OperationRecordItem, WprouctTicket from django.db import transaction class PickHalfSerializer(serializers.Serializer): @@ -429,4 +429,15 @@ class OperationRecordDetailSerializer(serializers.ModelSerializer): class ScrapSerializer(serializers.Serializer): scrap_reason = serializers.ChoiceField(choices=WProduct.scrap_reason_choices, required=False) - # wproducts = serializers.ListField(child=serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all()), label='半成品ID列表') \ No newline at end of file + # wproducts = serializers.ListField(child=serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all()), label='半成品ID列表') + + +class WproductTicketListSerializer(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) + resp_process_ = ProcessSimpleSerializer(source='resp_process', read_only=True) + + class Meta: + model = WprouctTicket + fields = '__all__' diff --git a/hb_server/apps/wpm/signals.py b/hb_server/apps/wpm/signals.py index 91a4dcf..670f9c7 100644 --- a/hb_server/apps/wpm/signals.py +++ b/hb_server/apps/wpm/signals.py @@ -28,7 +28,7 @@ def handleTicket(sender, instance, created, **kwargs): obj.subproduction_plan = wproduct.subproduction_plan obj.ticket = instance - test_record = TestRecord.objects.filter(wproduct=wproduct, is_deleted=False, is_testok=False).order_by('-id').first() + # test_record = TestRecord.objects.filter(wproduct=wproduct, is_deleted=False, is_testok=False).order_by('-id').first() obj.save() # 工单绑定半成品 @@ -36,11 +36,6 @@ def handleTicket(sender, instance, created, **kwargs): wproduct.save() WpmServies.add_wproduct_flow_log(wproduct, 'ticket_create') - # 检验员 - if not ticket_data.get('tester', None): - ticket_data['tester'] = test_record.create_by.id - instance.ticket_data = ticket_data - instance.save() elif instance.act_state == Ticket.TICKET_ACT_STATE_FINISH: """ @@ -58,6 +53,7 @@ def handleTicket(sender, instance, created, **kwargs): wp.ng_sign = decision + wt.decision = decision if decision in [WProduct.NG_BACK_WORK, WProduct.NG_BACK_FIX]: step = Step.objects.get(id=ticket_data['back_step']) wp.step = step diff --git a/hb_server/apps/wpm/urls.py b/hb_server/apps/wpm/urls.py index 57db6b9..77d91f7 100644 --- a/hb_server/apps/wpm/urls.py +++ b/hb_server/apps/wpm/urls.py @@ -3,11 +3,12 @@ from rest_framework import urlpatterns from django.urls import path, include from rest_framework.routers import DefaultRouter -from apps.wpm.views import DoFormInit, DoFormSubmit, OperationEquipViewSet, OperationMaterialInputViewSet, OperationMaterialOutputViewSet, OperationMaterialToolViewSet, OperationRecordViewSet, OperationViewSet, OperationWproductViewSet, WMaterialViewSet, WPlanViewSet, WProductViewSet +from apps.wpm.views import DoFormInit, DoFormSubmit, OperationEquipViewSet, OperationMaterialInputViewSet, OperationMaterialOutputViewSet, OperationMaterialToolViewSet, OperationRecordViewSet, OperationViewSet, OperationWproductViewSet, WMaterialViewSet, WPlanViewSet, WProductViewSet, WproductTicketViewSet router = DefaultRouter() router.register('wmaterial', WMaterialViewSet, basename='wmaterial') router.register('wproduct', WProductViewSet, basename='wproduct') +router.register('wproduct_ticket', WproductTicketViewSet, basename='wproduct_ticket') router.register('operation', OperationViewSet, basename='operation') router.register('operation_wproduct', OperationWproductViewSet, basename='operation_wproduct') router.register('operation_equip', OperationEquipViewSet, basename='operation_equip') diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 9a743f8..c446a47 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -20,9 +20,9 @@ from rest_framework.decorators import action from apps.wf.models import Workflow from apps.wf.serializers import WorkflowSimpleSerializer from apps.wpm.filters import WMaterialFilterSet, WProductFilterSet -from apps.wpm.models import OperationEquip, OperationWproduct, Pick, PickWproduct, WMaterial, WProduct, Operation, OperationMaterial, OperationRecord, OperationRecordItem +from apps.wpm.models import OperationEquip, OperationWproduct, Pick, PickWproduct, WMaterial, WProduct, Operation, OperationMaterial, OperationRecord, OperationRecordItem, WprouctTicket -from apps.wpm.serializers import OperationEquipListSerializer, OperationEquipUpdateSerializer, OperationMaterialCreate1ListSerailizer, OperationMaterialCreate1Serailizer, OperationMaterialCreate2ListSerailizer, OperationMaterialCreate2Serailizer, OperationMaterialCreate3Serializer, OperationMaterialListSerializer, OperationRecordDetailSerializer, OperationRecordListSerializer, OperationRecordSubmitSerializer, OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickHalfsSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, ScrapSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestFormInitSerializer, WpmTestRecordCreateSerializer, WproductPutInSerializer, WproductPutInsSerializer +from apps.wpm.serializers import OperationEquipListSerializer, OperationEquipUpdateSerializer, OperationMaterialCreate1ListSerailizer, OperationMaterialCreate1Serailizer, OperationMaterialCreate2ListSerailizer, OperationMaterialCreate2Serailizer, OperationMaterialCreate3Serializer, OperationMaterialListSerializer, OperationRecordDetailSerializer, OperationRecordListSerializer, OperationRecordSubmitSerializer, OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickHalfsSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, ScrapSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestFormInitSerializer, WpmTestRecordCreateSerializer, WproductPutInSerializer, WproductPutInsSerializer, WproductTicketListSerializer from rest_framework.response import Response from django.db import transaction from rest_framework import exceptions, serializers @@ -406,6 +406,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet): raise exceptions.APIException('该产品不可发起不合格审理') workflow = Workflow.objects.filter(name='不合格品审理单', is_deleted=False).first() if workflow: + test_record = TestRecord.objects.filter(wproduct=obj, is_deleted=False, is_testok=False).order_by('-id').first() exist_data = { 'wproduct':obj.id, 'wproduct_number':obj.number, @@ -413,6 +414,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet): 'wproduct_specification':obj.material.specification, 'finder':request.user.id, 'find_process':obj.step.process.id, + 'tester':test_record.create_by.id } ret = {'workflow':workflow.id} ret['exist_data'] = exist_data @@ -422,8 +424,16 @@ class WProductViewSet(ListModelMixin, GenericViewSet): - - +class WproductTicketViewSet(ListModelMixin, GenericViewSet): + """ + 玻璃审批工单 + """ + perms_map={'*':'*'} + queryset = WprouctTicket.objects.select_related('step', 'material', 'subproduction_plan', 'resp_process') + serializer_class = WproductTicketListSerializer + filterset_fields = ['step', 'material', 'subproduction_plan', 'resp_process'] + ordering_fields = ['id'] + ordering = ['-id'] class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):