From bce4a44408105a1de82ecc693829450671f7ee5f Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 5 Nov 2024 17:43:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20wmaterial=E5=8F=AF=E6=8C=89mtask?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E6=9F=A5=E8=AF=A2=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/filters.py | 6 +++++- apps/wpm/models.py | 23 +++++++++++++++++++++-- apps/wpm/serializers.py | 10 ++++++---- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/apps/wpm/filters.py b/apps/wpm/filters.py index cd296143..59d70620 100644 --- a/apps/wpm/filters.py +++ b/apps/wpm/filters.py @@ -1,5 +1,5 @@ from django_filters import rest_framework as filters -from apps.wpm.models import SfLog, StLog, WMaterial, Mlog, Handover, Mgroup, Mlogb +from apps.wpm.models import SfLog, StLog, WMaterial, Mlog, Handover, Mgroup, Mlogb, Mtask class SfLogFilter(filters.FilterSet): @@ -31,9 +31,13 @@ class StLogFilter(filters.FilterSet): class WMaterialFilter(filters.FilterSet): mgroupx = filters.CharFilter(label='MgroupId', method='filter_mgroupx') + mtaskx = filters.CharFilter(label='MtaskId', method='filter_mtaskx') def filter_mgroupx(self, queryset, name, value): return queryset.filter(mgroup__id=value)|queryset.filter(belong_dept=Mgroup.objects.get(id=value).belong_dept, mgroup=None) + + def filter_mtaskx(self, queryset, name, value): + return WMaterial.mat_in_qs(mtask=Mtask.objects.get(id=value), qs=queryset) class Meta: model = WMaterial fields = { diff --git a/apps/wpm/models.py b/apps/wpm/models.py index f5bf9c5b..3fab7403 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -6,9 +6,8 @@ from apps.system.models import User from django.utils.timezone import localtime from apps.em.models import Equipment from apps.system.models import Dept -from datetime import timedelta from apps.pum.models import Supplier -from django.db.models import Sum +from django.db.models import Sum, Subquery from django.utils.translation import gettext_lazy as _ # Create your models here. @@ -118,6 +117,26 @@ class WMaterial(CommonBDModel): def count_working(self): return Mlogb.objects.filter(wm_in=self, mlog__work_end_time__isnull=True).aggregate(count=Sum('count_use'))['count'] or 0 + @classmethod + def mat_in_qs(cls, mtask: Mtask, qs=None): + """ + 可用于该子任务的queryset + """ + if qs is None: + qs = cls.objects + return qs.filter( + mgroup=mtask.mgroup, + material=mtask.material_in, + batch__in=Subquery( + Mlogb.objects.filter( + mtask__utask=mtask.utask, + mlog__submit_time__isnull=False, + material_out=mtask.material_in + ).values_list('batch', flat=True) + ), + state__in=[WMaterial.WM_OK, WMaterial.WM_REPAIR] + ) + class Fmlog(CommonADModel): route = models.ForeignKey(Route, verbose_name='生产路线', on_delete=models.SET_NULL, null=True, blank=True) mtask = models.ForeignKey(Mtask, verbose_name='任务', on_delete=models.CASCADE, related_name='fmlog_mtask') diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 1f54b89a..6a7f95e2 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -403,6 +403,8 @@ class MlogSerializer(CustomModelSerializer): raise ParseError('子任务不能为空') if mtaskb and mtaskb.mtask != fmlog.mtask: raise ParseError('子任务不一致') + if wm_in.state in [WMaterial.WM_OK, WMaterial.WM_REPAIR]: + raise ValidationError('非合格/返修品不可使用') if wm_in.material != attrs['mtask'].material_in: raise ParseError('消耗物料与任务不一致') mtask = attrs.get('mtask', None) @@ -506,16 +508,16 @@ class MlogbInSerializer(CustomModelSerializer): if mtask.state != Mtask.MTASK_ASSGINED: raise ValidationError('该任务非下达中不可选择') wm_in: WMaterial = attrs['wm_in'] - if wm_in.state != WMaterial.WM_OK: - raise ValidationError('非合格品不可使用') + if wm_in.state in [WMaterial.WM_OK, WMaterial.WM_REPAIR]: + raise ValidationError('非合格/返修品不可使用') if mlog.route != mtask.route: raise ValidationError('工序不匹配') route = mlog.route attrs['material_in'] = wm_in.material attrs['batch'] = wm_in.batch if route.batch_bind: - if not Mlogb.objects.filter(mtask__utask=mtask.utask, mlog__submit_time__isnull=False, material_out__isnull=False, batch=attrs['batch']).exists(): - raise ValidationError('批次号不匹配') + if not WMaterial.mat_in_qs(mtask).filter(id=wm_in.id).exists(): + raise ValidationError('该车间库存非本任务使用') return attrs def create(self, validated_data):