feat: wmaterial可按mtask进行查询过滤

This commit is contained in:
caoqianming 2024-11-05 17:43:34 +08:00
parent 8859cc01a6
commit bce4a44408
3 changed files with 32 additions and 7 deletions

View File

@ -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 = {

View File

@ -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')

View File

@ -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):