不合格品审理工单列表接口

This commit is contained in:
caoqianming 2021-12-30 16:35:19 +08:00
parent 42fa7022de
commit 2ad60626e5
7 changed files with 56 additions and 15 deletions

View File

@ -131,6 +131,7 @@ class WfService(object):
if eval(expression, {'__builtins__':None}, {'datetime':datetime, 'time':time}): if eval(expression, {'__builtins__':None}, {'datetime':datetime, 'time':time}):
destination_state = State.objects.get(pk=i['target_state']) destination_state = State.objects.get(pk=i['target_state'])
return destination_state return destination_state
return destination_state
@classmethod @classmethod
def get_ticket_state_participant_info(cls, state:State, ticket:Ticket, new_ticket_data:dict={}, handler:User=None): def get_ticket_state_participant_info(cls, state:State, ticket:Ticket, new_ticket_data:dict={}, handler:User=None):
@ -321,6 +322,7 @@ class WfService(object):
if not created: if not created:
for key, value in source_state.state_fields.items(): for key, value in source_state.state_fields.items():
if value in (State.STATE_FIELD_REQUIRED, State.STATE_FIELD_OPTIONAL): if value in (State.STATE_FIELD_REQUIRED, State.STATE_FIELD_OPTIONAL):
if key in new_ticket_data:
source_ticket_data[key] = new_ticket_data[key] source_ticket_data[key] = new_ticket_data[key]
ticket.ticket_data = source_ticket_data ticket.ticket_data = source_ticket_data
ticket.save() ticket.save()

View File

@ -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='责任工序'),
),
]

View File

@ -120,6 +120,7 @@ class WprouctTicket(CommonAModel):
step = models.ForeignKey(Step, verbose_name='所在步骤/发现步骤', on_delete=models.CASCADE) step = models.ForeignKey(Step, verbose_name='所在步骤/发现步骤', on_delete=models.CASCADE)
subproduction_plan = models.ForeignKey(SubProductionPlan, 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') 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) decision = models.PositiveSmallIntegerField('最终决定', choices=WProduct.ng_choices, null=True, blank=True)

View File

@ -5,7 +5,7 @@ from apps.em.serializers import EquipmentSimpleSerializer
from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, MaterialBatch, WareHouse from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, MaterialBatch, WareHouse
from apps.inm.signals import update_inm from apps.inm.signals import update_inm
from apps.mtm.models import Material, RecordForm, RecordFormField, Step, SubprodctionMaterial 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 apps.pm.models import SubProductionPlan, SubProductionProgress
from django.utils import timezone 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.pm.serializers import SubproductionPlanSimpleSerializer
from apps.qm.models import TestRecord, TestRecordItem from apps.qm.models import TestRecord, TestRecordItem
from apps.system.serializers import UserSimpleSerializer 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 from django.db import transaction
class PickHalfSerializer(serializers.Serializer): class PickHalfSerializer(serializers.Serializer):
@ -430,3 +430,14 @@ class OperationRecordDetailSerializer(serializers.ModelSerializer):
class ScrapSerializer(serializers.Serializer): class ScrapSerializer(serializers.Serializer):
scrap_reason = serializers.ChoiceField(choices=WProduct.scrap_reason_choices, required=False) scrap_reason = serializers.ChoiceField(choices=WProduct.scrap_reason_choices, required=False)
# wproducts = serializers.ListField(child=serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all()), label='半成品ID列表') # 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__'

View File

@ -28,7 +28,7 @@ def handleTicket(sender, instance, created, **kwargs):
obj.subproduction_plan = wproduct.subproduction_plan obj.subproduction_plan = wproduct.subproduction_plan
obj.ticket = instance 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() obj.save()
# 工单绑定半成品 # 工单绑定半成品
@ -36,11 +36,6 @@ def handleTicket(sender, instance, created, **kwargs):
wproduct.save() wproduct.save()
WpmServies.add_wproduct_flow_log(wproduct, 'ticket_create') 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: elif instance.act_state == Ticket.TICKET_ACT_STATE_FINISH:
""" """
@ -58,6 +53,7 @@ def handleTicket(sender, instance, created, **kwargs):
wp.ng_sign = decision wp.ng_sign = decision
wt.decision = decision
if decision in [WProduct.NG_BACK_WORK, WProduct.NG_BACK_FIX]: if decision in [WProduct.NG_BACK_WORK, WProduct.NG_BACK_FIX]:
step = Step.objects.get(id=ticket_data['back_step']) step = Step.objects.get(id=ticket_data['back_step'])
wp.step = step wp.step = step

View File

@ -3,11 +3,12 @@ from rest_framework import urlpatterns
from django.urls import path, include from django.urls import path, include
from rest_framework.routers import DefaultRouter 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 = DefaultRouter()
router.register('wmaterial', WMaterialViewSet, basename='wmaterial') router.register('wmaterial', WMaterialViewSet, basename='wmaterial')
router.register('wproduct', WProductViewSet, basename='wproduct') router.register('wproduct', WProductViewSet, basename='wproduct')
router.register('wproduct_ticket', WproductTicketViewSet, basename='wproduct_ticket')
router.register('operation', OperationViewSet, basename='operation') router.register('operation', OperationViewSet, basename='operation')
router.register('operation_wproduct', OperationWproductViewSet, basename='operation_wproduct') router.register('operation_wproduct', OperationWproductViewSet, basename='operation_wproduct')
router.register('operation_equip', OperationEquipViewSet, basename='operation_equip') router.register('operation_equip', OperationEquipViewSet, basename='operation_equip')

View File

@ -20,9 +20,9 @@ from rest_framework.decorators import action
from apps.wf.models import Workflow from apps.wf.models import Workflow
from apps.wf.serializers import WorkflowSimpleSerializer from apps.wf.serializers import WorkflowSimpleSerializer
from apps.wpm.filters import WMaterialFilterSet, WProductFilterSet 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 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
@ -406,6 +406,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet):
raise exceptions.APIException('该产品不可发起不合格审理') raise exceptions.APIException('该产品不可发起不合格审理')
workflow = Workflow.objects.filter(name='不合格品审理单', is_deleted=False).first() workflow = Workflow.objects.filter(name='不合格品审理单', is_deleted=False).first()
if workflow: if workflow:
test_record = TestRecord.objects.filter(wproduct=obj, is_deleted=False, is_testok=False).order_by('-id').first()
exist_data = { exist_data = {
'wproduct':obj.id, 'wproduct':obj.id,
'wproduct_number':obj.number, 'wproduct_number':obj.number,
@ -413,6 +414,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet):
'wproduct_specification':obj.material.specification, 'wproduct_specification':obj.material.specification,
'finder':request.user.id, 'finder':request.user.id,
'find_process':obj.step.process.id, 'find_process':obj.step.process.id,
'tester':test_record.create_by.id
} }
ret = {'workflow':workflow.id} ret = {'workflow':workflow.id}
ret['exist_data'] = exist_data 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): class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):