feat: 子任务可为空以及一些查询条件
This commit is contained in:
parent
25d63c0b27
commit
cb45e0bab1
|
@ -45,7 +45,7 @@ class WMaterialFilter(filters.FilterSet):
|
||||||
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_tag(self, queryset, name, value):
|
def filter_tag(self, queryset, name, value):
|
||||||
mgroup = self.data.get("mgroupx", None)
|
mgroup = self.data.get("mgroup", None)
|
||||||
if mgroup:
|
if mgroup:
|
||||||
process = Mgroup.objects.get(id=mgroup).process
|
process = Mgroup.objects.get(id=mgroup).process
|
||||||
if value == "todo":
|
if value == "todo":
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 3.2.12 on 2025-03-07 03:03
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('wpm', '0095_alter_mlogbdefect_defect'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='fmlog',
|
||||||
|
name='enabled',
|
||||||
|
field=models.BooleanField(default=True, verbose_name='是否启用'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -172,7 +172,7 @@ class Mlog(CommonADModel):
|
||||||
mtaskb = models.ForeignKey(Mtaskb, verbose_name='关联个人任务', on_delete=models.CASCADE, related_name='mlog_mtaskb', null=True, blank=True)
|
mtaskb = models.ForeignKey(Mtaskb, verbose_name='关联个人任务', on_delete=models.CASCADE, related_name='mlog_mtaskb', null=True, blank=True)
|
||||||
fill_way = models.PositiveSmallIntegerField("填写方式", default=10, help_text='10:仅二级;20:二三级;30:一二级')
|
fill_way = models.PositiveSmallIntegerField("填写方式", default=10, help_text='10:仅二级;20:二三级;30:一二级')
|
||||||
mtype = models.PositiveSmallIntegerField('生产类型', default=10, help_text='10:自生产;20:外协生产', choices=((10, '自生产'), (20, '外协生产')))
|
mtype = models.PositiveSmallIntegerField('生产类型', default=10, help_text='10:自生产;20:外协生产', choices=((10, '自生产'), (20, '外协生产')))
|
||||||
is_fix = models.BooleanField('是否用于返修', default=False)
|
is_fix = models.BooleanField('是否用于返修', default=False) # 返工/复检
|
||||||
qct = models.ForeignKey("qm.qct", verbose_name='所用质检表', on_delete=models.SET_NULL, null=True, blank=True)
|
qct = models.ForeignKey("qm.qct", verbose_name='所用质检表', on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
supplier = models.ForeignKey(Supplier, verbose_name='外协供应商', on_delete=models.SET_NULL, null=True, blank=True)
|
supplier = models.ForeignKey(Supplier, verbose_name='外协供应商', on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
work_start_time = models.DateTimeField('生产开始时间', null=True, blank=True)
|
work_start_time = models.DateTimeField('生产开始时间', null=True, blank=True)
|
||||||
|
@ -376,7 +376,6 @@ class Mlogb(BaseModel):
|
||||||
def mlogbdefect(self):
|
def mlogbdefect(self):
|
||||||
return MlogbDefect.objects.filter(mlogb=self)
|
return MlogbDefect.objects.filter(mlogb=self)
|
||||||
|
|
||||||
@property
|
|
||||||
def cal_count_pn_jgqbl(self):
|
def cal_count_pn_jgqbl(self):
|
||||||
mqs = MlogbDefect.get_defect_qs_from_mlogb(self, ftype="in")
|
mqs = MlogbDefect.get_defect_qs_from_mlogb(self, ftype="in")
|
||||||
count_pn_jgqbl = mqs.aggregate(total=Sum("count"))["total"] or 0
|
count_pn_jgqbl = mqs.aggregate(total=Sum("count"))["total"] or 0
|
||||||
|
@ -386,7 +385,8 @@ class Mlogb(BaseModel):
|
||||||
if mlog:
|
if mlog:
|
||||||
count_pn_jgqbl = MlogbDefect.get_defect_qs_from_mlog(mlog, ftype="in").aggregate(total=Sum("count"))["total"] or 0
|
count_pn_jgqbl = MlogbDefect.get_defect_qs_from_mlog(mlog, ftype="in").aggregate(total=Sum("count"))["total"] or 0
|
||||||
mlog.count_pn_jgqbl = count_pn_jgqbl
|
mlog.count_pn_jgqbl = count_pn_jgqbl
|
||||||
mlog.count_real = self.count_use - count_pn_jgqbl
|
if mlog.count_real == mlog.count_use:
|
||||||
|
mlog.count_real = mlog.count_use - count_pn_jgqbl
|
||||||
mlog.save(update_fields=["count_pn_jgqbl", "count_real"])
|
mlog.save(update_fields=["count_pn_jgqbl", "count_real"])
|
||||||
|
|
||||||
def cal_count_notok(self):
|
def cal_count_notok(self):
|
||||||
|
|
|
@ -536,8 +536,8 @@ class MlogSerializer(CustomModelSerializer):
|
||||||
attrs['mtask'] = fmlog.mtask
|
attrs['mtask'] = fmlog.mtask
|
||||||
if attrs['mtask'].route:
|
if attrs['mtask'].route:
|
||||||
attrs['route'] = attrs['mtask'].route
|
attrs['route'] = attrs['mtask'].route
|
||||||
if attrs['mtask'].mtaskb and mtaskb is None:
|
# if attrs['mtask'].mtaskb and mtaskb is None:
|
||||||
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]:
|
if wm_in.state in [WMaterial.WM_OK]:
|
||||||
|
@ -560,9 +560,9 @@ class MlogSerializer(CustomModelSerializer):
|
||||||
if mtask.start_date == mtask.end_date:
|
if mtask.start_date == mtask.end_date:
|
||||||
attrs['handle_date'] = mtask.start_date
|
attrs['handle_date'] = mtask.start_date
|
||||||
else:
|
else:
|
||||||
if attrs['work_end_time']:
|
if attrs.get('work_end_time', None):
|
||||||
attrs['handle_date'] = localdate(attrs['work_end_time'])
|
attrs['handle_date'] = localdate(attrs['work_end_time'])
|
||||||
elif attrs['work_start_time']:
|
elif attrs.get('work_start_time', None):
|
||||||
attrs['handle_date'] = localdate(attrs['work_start_time'])
|
attrs['handle_date'] = localdate(attrs['work_start_time'])
|
||||||
mtaskb: Mtaskb = attrs.get('mtaskb', None)
|
mtaskb: Mtaskb = attrs.get('mtaskb', None)
|
||||||
if mtaskb:
|
if mtaskb:
|
||||||
|
@ -646,12 +646,12 @@ class MlogbInSerializer(CustomModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Mlogb
|
model = Mlogb
|
||||||
fields = ['id', 'mlog', 'mtask', 'wm_in', 'count_use', 'count_pn_jgqbl',
|
fields = ['id', 'mlog', 'mtask', 'wm_in', 'count_use', 'count_pn_jgqbl',
|
||||||
'count_break', 'note', "parent"]
|
'count_break', 'note', "parent", "mlogbdefect"]
|
||||||
extra_kwargs = {'count_use': {'required': True}, 'mtask': {'required': False},
|
extra_kwargs = {'count_use': {'required': True}, 'mtask': {'required': False},
|
||||||
'wm_in': {'required': True, "allow_empty": False}}
|
'wm_in': {'required': True, "allow_empty": False}}
|
||||||
|
|
||||||
def validate(self, attrs):
|
def validate(self, attrs):
|
||||||
mlog: Mlog = attrs['mlog']
|
mlog:Mlog = attrs['mlog']
|
||||||
is_fix = mlog.is_fix
|
is_fix = mlog.is_fix
|
||||||
mtask: Mtask = attrs.get("mtask", None)
|
mtask: Mtask = attrs.get("mtask", None)
|
||||||
if mtask and mtask.state != Mtask.MTASK_ASSGINED:
|
if mtask and mtask.state != Mtask.MTASK_ASSGINED:
|
||||||
|
|
|
@ -649,7 +649,7 @@ class FmlogViewSet(CustomModelViewSet):
|
||||||
serializer_class = FmlogSerializer
|
serializer_class = FmlogSerializer
|
||||||
update_serializer_class = FmlogUpdateSerializer
|
update_serializer_class = FmlogUpdateSerializer
|
||||||
filterset_fields = ['mtask', 'mgroup', 'mtask__route', 'enabled']
|
filterset_fields = ['mtask', 'mgroup', 'mtask__route', 'enabled']
|
||||||
select_related_fields = ['mtask', 'mgroup', 'mtask__route', 'mtask__route__routepack']
|
select_related_fields = ['mtask', 'mgroup', 'mtask__route', 'mtask__route__routepack', "mtask__route__material_out"]
|
||||||
|
|
||||||
def destroy(self, request, *args, **kwargs):
|
def destroy(self, request, *args, **kwargs):
|
||||||
ins = self.get_object()
|
ins = self.get_object()
|
||||||
|
|
Loading…
Reference in New Issue