feat: 子任务可为空以及一些查询条件

This commit is contained in:
caoqianming 2025-03-07 13:00:00 +08:00
parent 25d63c0b27
commit cb45e0bab1
5 changed files with 29 additions and 11 deletions

View File

@ -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)
def filter_tag(self, queryset, name, value):
mgroup = self.data.get("mgroupx", None)
mgroup = self.data.get("mgroup", None)
if mgroup:
process = Mgroup.objects.get(id=mgroup).process
if value == "todo":

View File

@ -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='是否启用'),
),
]

View File

@ -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)
fill_way = models.PositiveSmallIntegerField("填写方式", default=10, help_text='10:仅二级;20:二三级;30:一二级')
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)
supplier = models.ForeignKey(Supplier, verbose_name='外协供应商', on_delete=models.SET_NULL, null=True, blank=True)
work_start_time = models.DateTimeField('生产开始时间', null=True, blank=True)
@ -376,7 +376,6 @@ class Mlogb(BaseModel):
def mlogbdefect(self):
return MlogbDefect.objects.filter(mlogb=self)
@property
def cal_count_pn_jgqbl(self):
mqs = MlogbDefect.get_defect_qs_from_mlogb(self, ftype="in")
count_pn_jgqbl = mqs.aggregate(total=Sum("count"))["total"] or 0
@ -386,7 +385,8 @@ class Mlogb(BaseModel):
if mlog:
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_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"])
def cal_count_notok(self):

View File

@ -536,8 +536,8 @@ class MlogSerializer(CustomModelSerializer):
attrs['mtask'] = fmlog.mtask
if attrs['mtask'].route:
attrs['route'] = attrs['mtask'].route
if attrs['mtask'].mtaskb and mtaskb is None:
raise ParseError('子任务不能为空')
# if attrs['mtask'].mtaskb and mtaskb is None:
# raise ParseError('子任务不能为空')
if mtaskb and mtaskb.mtask != fmlog.mtask:
raise ParseError('子任务不一致')
if wm_in.state in [WMaterial.WM_OK]:
@ -560,9 +560,9 @@ class MlogSerializer(CustomModelSerializer):
if mtask.start_date == mtask.end_date:
attrs['handle_date'] = mtask.start_date
else:
if attrs['work_end_time']:
if attrs.get('work_end_time', None):
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'])
mtaskb: Mtaskb = attrs.get('mtaskb', None)
if mtaskb:
@ -646,12 +646,12 @@ class MlogbInSerializer(CustomModelSerializer):
class Meta:
model = Mlogb
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},
'wm_in': {'required': True, "allow_empty": False}}
def validate(self, attrs):
mlog: Mlog = attrs['mlog']
mlog:Mlog = attrs['mlog']
is_fix = mlog.is_fix
mtask: Mtask = attrs.get("mtask", None)
if mtask and mtask.state != Mtask.MTASK_ASSGINED:

View File

@ -649,7 +649,7 @@ class FmlogViewSet(CustomModelViewSet):
serializer_class = FmlogSerializer
update_serializer_class = FmlogUpdateSerializer
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):
ins = self.get_object()