From 6a573dd4ddcc92651228daf210001605c11ce0af Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 3 Sep 2024 09:10:28 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20mlog=E7=BB=8F=E5=AE=A1=E6=89=B9?= =?UTF-8?q?=E5=90=8E=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wpm/migrations/0065_auto_20240903_0904.py | 25 +++++++++++ apps/wpm/models.py | 6 ++- apps/wpm/serializers.py | 2 +- apps/wpm/services.py | 42 +++++++++++++++++-- apps/wpm/views.py | 19 ++++----- 5 files changed, 77 insertions(+), 17 deletions(-) create mode 100644 apps/wpm/migrations/0065_auto_20240903_0904.py diff --git a/apps/wpm/migrations/0065_auto_20240903_0904.py b/apps/wpm/migrations/0065_auto_20240903_0904.py new file mode 100644 index 00000000..ab6836dc --- /dev/null +++ b/apps/wpm/migrations/0065_auto_20240903_0904.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.12 on 2024-09-03 01:04 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('wf', '0002_alter_state_filter_dept'), + ('wpm', '0064_auto_20240902_1411'), + ] + + operations = [ + migrations.AddField( + model_name='mlog', + name='oinfo_json', + field=models.JSONField(blank=True, default=dict, verbose_name='其他信息'), + ), + migrations.AddField( + model_name='mlog', + name='ticket', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mlog_ticket', to='wf.ticket', verbose_name='关联工单'), + ), + ] diff --git a/apps/wpm/models.py b/apps/wpm/models.py index 7bb66431..7085bdcb 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -193,8 +193,6 @@ class Mlog(CommonADModel): count_n_yd = models.PositiveIntegerField('圆度', default=0) count_n_txd = models.PositiveIntegerField('同心度', default=0) count_n_hd = models.PositiveIntegerField('厚度', default=0) - - count_n_qt = models.PositiveIntegerField('其他', default=0) handle_date = models.DateField('操作日期', null=True, blank=True) @@ -214,6 +212,10 @@ class Mlog(CommonADModel): submit_user = models.ForeignKey( User, verbose_name='提交人', on_delete=models.CASCADE, null=True, blank=True, related_name='mlog_submit_user') + oinfo_json = models.JSONField('其他信息', default=dict, blank=True) + ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单', + on_delete=models.SET_NULL, related_name='mlog_ticket', null=True, blank=True, db_constraint=False) + @property def mlogb(self): return Mlogb.objects.filter(mlog=self).exclude(material_out=None) diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 0e79a595..d2c815ff 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -368,7 +368,7 @@ class MlogInitSerializer(CustomModelSerializer): class MlogChangeSerializer(CustomModelSerializer): class Meta: model = Mlog - fields = ['id', 'work_end_time', 'handle_user', 'note'] + fields = ['id', 'work_end_time', 'handle_user', 'note', 'oinfo_json'] def validate(self, attrs): if attrs.get('work_end_time', None): diff --git a/apps/wpm/services.py b/apps/wpm/services.py index d8f9ada3..1f016479 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -4,7 +4,6 @@ from django.core.cache import cache from django.db.models import Sum from django.utils import timezone from typing import Union -from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned from rest_framework.exceptions import ParseError @@ -13,9 +12,11 @@ from apps.inm.models import MIO, MIOItem, MIOItemA from apps.pm.models import Mtask from apps.mtm.models import Mgroup, Shift, Material, Route, RoutePack -from .models import SfLog, SfLogExp, WMaterial, Mlog, Mlogb, Handover -from apps.mtm.models import Process +from .models import SfLog, WMaterial, Mlog, Mlogb, Handover from apps.mtm.services import cal_material_count +from apps.wf.models import Ticket +from django.db import transaction +from apps.utils.thread import MyThread def find_material_can_change(material: Material, mgroup_to: Mgroup): """ @@ -633,3 +634,38 @@ def handover_submit(handover: Handover, user: User, now: Union[datetime.datetime handover.submit_user = user handover.submit_time = now handover.save() + +def mlog_submit_validate(ins: Mlog): + if ins.submit_time: + raise ParseError('该日志已提交!') + if ins.mtask and ins.mtask.state == Mtask.MTASK_STOP: + raise ParseError('该任务已停止!') + if ins.fill_way == Mlog.MLOG_STEP: + if not Mlogb.objects.filter(material_out__isnull=False, mlog=ins).exists(): + raise ParseError('该日志未指定产出!') + if not Mlogb.objects.filter(material_in__isnull=False, mlog=ins).exists(): + raise ParseError('该日志未指定消耗!') + if Mlogb.objects.filter(material_out__isnull=False, count_real=0, mlog=ins).exists(): + raise ParseError('产出数量不能为0!') + +def bind_mlog(ticket: Ticket, transition, new_ticket_data: dict): + ins = Mlog.objects.get(id=new_ticket_data['t_id']) + mlog_submit_validate(ins) # 校验是否可submit + ticket_data = ticket.ticket_data + ticket_data.update({ + 't_model': 'mlog', + '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']) + mlog_submit(ins, ticket.create_by, now) + MyThread(target=cal_mtask_progress_from_mlog,args=(ins,)).start() + MyThread(target=cal_material_count_from_mlog,args=(ins,)).start() diff --git a/apps/wpm/views.py b/apps/wpm/views.py index 7e0ccd07..4ed5031c 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -25,6 +25,7 @@ from .serializers import (SflogExpSerializer, SfLogSerializer, StLogSerializer, from .services import mlog_submit, update_mtask, handover_submit, mlog_revert, cal_material_count_from_mlog, cal_mtask_progress_from_mlog from apps.utils.thread import MyThread from apps.monitor.services import create_auditlog, delete_auditlog +from apps.wpm.services import mlog_submit_validate # Create your views here. @@ -204,17 +205,13 @@ class MlogViewSet(CustomModelViewSet): ins: Mlog = self.get_object() vdata_old = MlogSerializer(ins).data now = timezone.now() - if ins.submit_time: - raise ParseError('该日志已提交!') - if ins.mtask and ins.mtask.state == Mtask.MTASK_STOP: - raise ParseError('该任务已停止!') - if ins.fill_way == Mlog.MLOG_STEP: - if not Mlogb.objects.filter(material_out__isnull=False, mlog=ins).exists(): - raise ParseError('该日志未指定产出!') - if not Mlogb.objects.filter(material_in__isnull=False, mlog=ins).exists(): - raise ParseError('该日志未指定消耗!') - if Mlogb.objects.filter(material_out__isnull=False, count_real=0, mlog=ins).exists(): - raise ParseError('产出数量不能为0!') + if ins.ticket: + raise ParseError('该日志存在审批!') + else: + p: Process = ins.mgroup.process + if p.mlog_need_ticket: + raise ParseError('该日志需要审批!') + mlog_submit_validate(ins) with transaction.atomic(): mlog_submit(ins, self.request.user, now) vdata_new = MlogSerializer(ins).data