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

View File

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

View File

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