diff --git a/apps/wpm/migrations/0121_auto_20250723_0912.py b/apps/wpm/migrations/0121_auto_20250723_0912.py new file mode 100644 index 00000000..c86d9531 --- /dev/null +++ b/apps/wpm/migrations/0121_auto_20250723_0912.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.12 on 2025-07-23 01:12 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('wf', '0002_alter_state_filter_dept'), + ('wpm', '0120_alter_batchst_data'), + ] + + operations = [ + migrations.AddField( + model_name='handover', + name='oinfo_json', + field=models.JSONField(blank=True, default=dict, verbose_name='其他信息'), + ), + migrations.AddField( + model_name='handover', + name='ticket', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='handover_ticket', to='wf.ticket', verbose_name='关联工单'), + ), + ] diff --git a/apps/wpm/models.py b/apps/wpm/models.py index 7dba96c7..f6b9349a 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -577,6 +577,9 @@ class Handover(CommonADModel): submit_user = models.ForeignKey( User, verbose_name='提交人', on_delete=models.CASCADE, null=True, blank=True, related_name='handover_submit_user') note = models.TextField('备注', null=True, blank=True) + oinfo_json = models.JSONField('其他信息', default=dict, blank=True) + ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单', + on_delete=models.SET_NULL, related_name='handover_ticket', null=True, blank=True, db_constraint=False) @property def handoverb(self): diff --git a/apps/wpm/services.py b/apps/wpm/services.py index 68b04ba4..678c031e 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -1015,6 +1015,20 @@ def bind_mlog(ticket: Ticket, transition, new_ticket_data: dict): ins.ticket = ticket ins.save() +def bind_handover(ticket: Ticket, transition, new_ticket_data: dict): + ins = Handover.objects.get(id=new_ticket_data['t_id']) + ticket_data = ticket.ticket_data + ticket_data.update({ + 't_model': 'handover', + 't_id': ins.id, + }) + ticket.ticket_data = ticket_data + ticket.create_by = ins.create_by + ticket.save() + if ins.ticket is None: + ins.ticket = ticket + ins.save() + def mlog_audit_end(ticket: Ticket): now = timezone.now() ins = Mlog.objects.get(id=ticket.ticket_data['t_id']) diff --git a/apps/wpm/views.py b/apps/wpm/views.py index c44f41a6..8e3e1d97 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -29,7 +29,7 @@ from .serializers import (SflogExpSerializer, SfLogSerializer, StLogSerializer, MlogbSerializer, MlogUserSerializer, BatchLogSerializer) from .services import mlog_submit, handover_submit, mlog_revert, get_batch_dag, handover_revert from apps.wpm.services import mlog_submit_validate, generate_new_batch -from apps.wf.models import State +from apps.wf.models import State, Ticket from apps.wpmw.models import Wpr from apps.qm.models import Qct, Ftest, TestItem from apps.enm.models import EnStat @@ -387,13 +387,25 @@ class HandoverViewSet(CustomModelViewSet): 'material__number', 'material__specification', 'batch', 'material__model', 'b_handover__batch', "new_batch", "wm__batch"] prefetch_related_fields = ["b_handover"] - def perform_destroy(self, instance): + @transaction.atomic + def perform_destroy(self, instance:Handover): user = self.request.user if instance.submit_time is not None: raise ParseError('日志已提交不可变动') if instance.send_user != user and instance.recive_user != user and instance.create_by != user: raise ParseError('非交送人和接收人不可删除该记录') - return super().perform_destroy(instance) + ticket:Ticket = instance.ticket + if ticket: + ticket.delete() + instance.delete() + + @transaction.atomic + def perform_update(self, serializer): + ins:Handover = self.get_object() + ticket:Ticket = ins.ticket + if ticket and ticket.state.type != State.STATE_TYPE_START: + raise ParseError("该交接记录存在审批,不可修改") + serializer.save() @action(methods=['post'], detail=False, perms_map={'post': 'handover.create'}, serializer_class=HandoverSerializer) @transaction.atomic @@ -425,6 +437,9 @@ class HandoverViewSet(CustomModelViewSet): pass else: raise ParseError('非接收人不可提交') + ticket:Ticket = ins.ticket + if ticket and ticket.state.type != State.STATE_TYPE_END: + raise ParseError('该交接记录审批未完成,不可提交') if ins.submit_time is None: handover_submit(ins, user, None) return Response()