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 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):
|
class SfLogFilter(filters.FilterSet):
|
||||||
|
@ -31,9 +31,13 @@ class StLogFilter(filters.FilterSet):
|
||||||
|
|
||||||
class WMaterialFilter(filters.FilterSet):
|
class WMaterialFilter(filters.FilterSet):
|
||||||
mgroupx = filters.CharFilter(label='MgroupId', method='filter_mgroupx')
|
mgroupx = filters.CharFilter(label='MgroupId', method='filter_mgroupx')
|
||||||
|
mtaskx = filters.CharFilter(label='MtaskId', method='filter_mtaskx')
|
||||||
|
|
||||||
def filter_mgroupx(self, queryset, name, value):
|
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)
|
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:
|
class Meta:
|
||||||
model = WMaterial
|
model = WMaterial
|
||||||
fields = {
|
fields = {
|
||||||
|
|
|
@ -6,9 +6,8 @@ from apps.system.models import User
|
||||||
from django.utils.timezone import localtime
|
from django.utils.timezone import localtime
|
||||||
from apps.em.models import Equipment
|
from apps.em.models import Equipment
|
||||||
from apps.system.models import Dept
|
from apps.system.models import Dept
|
||||||
from datetime import timedelta
|
|
||||||
from apps.pum.models import Supplier
|
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 _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
# Create your models here.
|
# Create your models here.
|
||||||
|
@ -118,6 +117,26 @@ class WMaterial(CommonBDModel):
|
||||||
def count_working(self):
|
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
|
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):
|
class Fmlog(CommonADModel):
|
||||||
route = models.ForeignKey(Route, verbose_name='生产路线', on_delete=models.SET_NULL, null=True, blank=True)
|
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')
|
mtask = models.ForeignKey(Mtask, verbose_name='任务', on_delete=models.CASCADE, related_name='fmlog_mtask')
|
||||||
|
|
|
@ -403,6 +403,8 @@ class MlogSerializer(CustomModelSerializer):
|
||||||
raise ParseError('子任务不能为空')
|
raise ParseError('子任务不能为空')
|
||||||
if mtaskb and mtaskb.mtask != fmlog.mtask:
|
if mtaskb and mtaskb.mtask != fmlog.mtask:
|
||||||
raise ParseError('子任务不一致')
|
raise ParseError('子任务不一致')
|
||||||
|
if wm_in.state in [WMaterial.WM_OK, WMaterial.WM_REPAIR]:
|
||||||
|
raise ValidationError('非合格/返修品不可使用')
|
||||||
if wm_in.material != attrs['mtask'].material_in:
|
if wm_in.material != attrs['mtask'].material_in:
|
||||||
raise ParseError('消耗物料与任务不一致')
|
raise ParseError('消耗物料与任务不一致')
|
||||||
mtask = attrs.get('mtask', None)
|
mtask = attrs.get('mtask', None)
|
||||||
|
@ -506,16 +508,16 @@ class MlogbInSerializer(CustomModelSerializer):
|
||||||
if mtask.state != Mtask.MTASK_ASSGINED:
|
if mtask.state != Mtask.MTASK_ASSGINED:
|
||||||
raise ValidationError('该任务非下达中不可选择')
|
raise ValidationError('该任务非下达中不可选择')
|
||||||
wm_in: WMaterial = attrs['wm_in']
|
wm_in: WMaterial = attrs['wm_in']
|
||||||
if wm_in.state != WMaterial.WM_OK:
|
if wm_in.state in [WMaterial.WM_OK, WMaterial.WM_REPAIR]:
|
||||||
raise ValidationError('非合格品不可使用')
|
raise ValidationError('非合格/返修品不可使用')
|
||||||
if mlog.route != mtask.route:
|
if mlog.route != mtask.route:
|
||||||
raise ValidationError('工序不匹配')
|
raise ValidationError('工序不匹配')
|
||||||
route = mlog.route
|
route = mlog.route
|
||||||
attrs['material_in'] = wm_in.material
|
attrs['material_in'] = wm_in.material
|
||||||
attrs['batch'] = wm_in.batch
|
attrs['batch'] = wm_in.batch
|
||||||
if route.batch_bind:
|
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():
|
if not WMaterial.mat_in_qs(mtask).filter(id=wm_in.id).exists():
|
||||||
raise ValidationError('批次号不匹配')
|
raise ValidationError('该车间库存非本任务使用')
|
||||||
return attrs
|
return attrs
|
||||||
|
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
|
|
Loading…
Reference in New Issue