From cbc43fdb65d8c98de7c1d0ff7f750dd82061855b Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 26 Oct 2023 18:20:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0is=5Fcount=5Futask?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E4=BB=A5=E7=A1=AE=E8=AE=A4=E5=90=8C=E6=AD=A5?= =?UTF-8?q?utask?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0019_route_is_count_utask.py | 18 +++++++++++ apps/mtm/models.py | 7 +++-- apps/mtm/serializers.py | 30 +++++++++++-------- .../migrations/0013_mtask_is_count_utask.py | 18 +++++++++++ apps/pm/models.py | 1 + apps/pm/services.py | 3 +- apps/wpm/services.py | 4 +-- 7 files changed, 64 insertions(+), 17 deletions(-) create mode 100644 apps/mtm/migrations/0019_route_is_count_utask.py create mode 100644 apps/pm/migrations/0013_mtask_is_count_utask.py diff --git a/apps/mtm/migrations/0019_route_is_count_utask.py b/apps/mtm/migrations/0019_route_is_count_utask.py new file mode 100644 index 00000000..13d33545 --- /dev/null +++ b/apps/mtm/migrations/0019_route_is_count_utask.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2023-10-26 10:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0018_material_need_route'), + ] + + operations = [ + migrations.AddField( + model_name='route', + name='is_count_utask', + field=models.BooleanField(default=False, verbose_name='是否主任务统计'), + ), + ] diff --git a/apps/mtm/models.py b/apps/mtm/models.py index 0d84c2de..0f38008d 100644 --- a/apps/mtm/models.py +++ b/apps/mtm/models.py @@ -1,7 +1,7 @@ from django.db import models from apps.system.models import CommonAModel, Dictionary, CommonBModel, CommonADModel, File, BaseModel from django.db.models import Subquery, OuterRef -from rest_framework.exceptions import ValidationError +from rest_framework.exceptions import ValidationError, ParseError class Process(CommonBModel): @@ -154,6 +154,7 @@ class Route(CommonADModel): Material, verbose_name='主要输入物料', on_delete=models.CASCADE, related_name='route_material_in', null=True, blank=True) material_out = models.ForeignKey( Material, verbose_name='主要输出物料', on_delete=models.CASCADE, related_name='route_material_out', null=True, blank=True) + is_count_utask = models.BooleanField('是否主任务统计', default=False) out_rate = models.FloatField('出材率', default=100, null=True, blank=True) @staticmethod @@ -166,7 +167,9 @@ class Route(CommonADModel): rq = Route.objects.filter( **kwargs).order_by('sort', 'process__sort', 'create_time') if rq.first().material_in is None or rq.last().material_out is None or rq.last().material_out != rq.last().material: - raise ValidationError('首步缺少输入/最后一步缺少输出') + raise ParseError('首步缺少输入/最后一步缺少输出') + if not rq.filter(is_count_utask=True).exists(): + raise ParseError('未指定统计步骤') if autotask: kwargs['is_autotask'] = True return rq diff --git a/apps/mtm/serializers.py b/apps/mtm/serializers.py index 806ba718..b26dfc7f 100644 --- a/apps/mtm/serializers.py +++ b/apps/mtm/serializers.py @@ -4,6 +4,7 @@ from apps.utils.constants import EXCLUDE_FIELDS from rest_framework import serializers from rest_framework.exceptions import ValidationError from apps.system.models import Dept +from django.db import transaction class ShiftSerializer(CustomModelSerializer): @@ -113,19 +114,24 @@ class RouteSerializer(CustomModelSerializer): instance.save() def create(self, validated_data): - instance = super().create(validated_data) - if 'material_out' in validated_data and validated_data['material_out']: - pass - else: - self.gen_material_out(instance) - return instance + process = validated_data['process'] + if Route.objects.filter(material=validated_data['material'], process=process).exists(): + raise ValidationError('已选择该工序') + with transaction.atomic(): + instance = super().create(validated_data) + if 'material_out' in validated_data and validated_data['material_out']: + pass + else: + self.gen_material_out(instance) + return instance def update(self, instance, validated_data): validated_data.pop('material', None) validated_data.pop('process', None) - instance = super().update(instance, validated_data) - if 'material_out' in validated_data and validated_data['material_out']: - pass - else: - self.gen_material_out(instance) - return instance + with transaction.atomic(): + instance = super().update(instance, validated_data) + if 'material_out' in validated_data and validated_data['material_out']: + pass + else: + self.gen_material_out(instance) + return instance diff --git a/apps/pm/migrations/0013_mtask_is_count_utask.py b/apps/pm/migrations/0013_mtask_is_count_utask.py new file mode 100644 index 00000000..d83d21bc --- /dev/null +++ b/apps/pm/migrations/0013_mtask_is_count_utask.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2023-10-26 10:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pm', '0012_auto_20231026_1624'), + ] + + operations = [ + migrations.AddField( + model_name='mtask', + name='is_count_utask', + field=models.BooleanField(default=False, verbose_name='是否主任务统计'), + ), + ] diff --git a/apps/pm/models.py b/apps/pm/models.py index e8986287..b1b899d5 100644 --- a/apps/pm/models.py +++ b/apps/pm/models.py @@ -63,6 +63,7 @@ class Mtask(CommonADModel): Material, verbose_name='领用物', on_delete=models.CASCADE, related_name='mtask_material_in', null=True, blank=True) material_out = models.ForeignKey( Material, verbose_name='产物', on_delete=models.CASCADE, related_name='mtask_material_out') + is_count_utask = models.BooleanField('是否主任务统计', default=False) count = models.PositiveIntegerField('任务数', default=1) count_real = models.PositiveIntegerField('实际生产数', default=0) count_ok = models.PositiveIntegerField('合格数', default=0) diff --git a/apps/pm/services.py b/apps/pm/services.py index f0123196..32e88617 100644 --- a/apps/pm/services.py +++ b/apps/pm/services.py @@ -126,7 +126,8 @@ class PmService: 'end_date': task_date, 'utask': utask, 'create_by': user, - 'update_by': user + 'update_by': user, + 'is_count_utask': val.is_count_utask }) @classmethod diff --git a/apps/wpm/services.py b/apps/wpm/services.py index 0d78ef98..64479694 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -157,8 +157,8 @@ def update_mtask(mtask: Mtask): mtask.count_notok = res['sum_count_notok'] if res['sum_count_notok'] else 0 mtask.save() utask = mtask.utask - if utask and mtask.material_out == utask.material: - res2 = Mtask.objects.filter(utask=utask, material_out=utask.material).aggregate(sum_count_real=Sum( + if utask and mtask.is_count_utask: + res2 = Mtask.objects.filter(utask=utask, mgroup=mtask.mgroup).aggregate(sum_count_real=Sum( 'count_real'), sum_count_ok=Sum('count_ok'), sum_count_notok=Sum('count_notok')) utask.count_real = res2['sum_count_real'] if res2['sum_count_real'] else 0 utask.count_ok = res2['sum_count_ok'] if res2['sum_count_ok'] else 0