feat: wmaterial可按mtask进行查询过滤
This commit is contained in:
parent
8859cc01a6
commit
bce4a44408
|
@ -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 = {
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue