diff --git a/apps/inm/serializers.py b/apps/inm/serializers.py index 68438ad0..4bf78ddb 100644 --- a/apps/inm/serializers.py +++ b/apps/inm/serializers.py @@ -37,6 +37,7 @@ class MaterialBatchSerializer(CustomModelSerializer): supplier_name = serializers.StringRelatedField( source='supplier', read_only=True) material_ = MaterialSerializer(source='material', read_only=True) + defect_name = serializers.CharField(source="defect.name", read_only=True) class Meta: model = MaterialBatch diff --git a/apps/inm/services.py b/apps/inm/services.py index 8e3771f8..a153d0d2 100644 --- a/apps/inm/services.py +++ b/apps/inm/services.py @@ -9,6 +9,8 @@ from apps.mtm.services import cal_material_count from apps.wpm.models import WMaterial from apps.wpm.services_2 import get_alldata_with_batch_and_store from apps.wpmw.models import Wpr +from apps.qm.models import FtestDefect, Defect +from django.db.models import Count def do_out(item: MIOItem): """ @@ -225,6 +227,7 @@ class InmService: in_or_out = -1 if instance.type == MIO.MIO_TYPE_PUR_IN: # 需要更新订单 + # 这里还需要对入厂检验进行处理 from apps.pum.services import PumService cls.update_mb(instance, in_or_out) PumService.mio_purin(instance, is_reverse) @@ -284,42 +287,66 @@ class InmService: if i.material.type in [Material.MA_TYPE_MAINSO]: ddict["batch_ofrom"] = i.batch ddict["material_ofrom"] = i.material - mb, _ = MaterialBatch.objects.get_or_create( - material=material, - warehouse=warehouse, - batch=i.batch, - defaults=ddict - ) - - if in_or_out == 1: - mb.count = mb.count + getattr(i, field) - mb.save() - if tracking == Material.MA_TRACKING_SINGLE: - mioitemws = MIOItemw.objects.filter(mioitem=i) - if mioitemws.count() != mb.count: - raise ParseError("出入库与明细数量不一致,操作失败") - for mioitemw in mioitemws: - if mioitemw.wpr: - Wpr.change_or_new(wpr=mioitemw.wpr, mb=mb) - else: - wpr = Wpr.change_or_new(number=mioitemw.number, mb=mb) - mioitemw.wpr = wpr - mioitemw.save() - - elif in_or_out == -1: - mb.count = mb.count - getattr(i, field) - if mb.count < 0: - raise ParseError("批次库存不足,操作失败") - else: + + m_list = [(material, warehouse, i.batch, getattr(i, field), None, i)] # getattr主要是兼容原有逻辑 + if tracking == Material.MA_TRACKING_SINGLE: + m_list = [] + # 获取所有主要的不合格项 + mw_qs = MIOItemw.objects.filter(mioitem=i) + defectIds= FtestDefect.objects.filter(ftest_mioitemw_ftest__in=mw_qs, is_main=True, has=True).values_list("defect__id", flat=True).distinct() + defects_map = {d.id: d for d in Defect.objects.filter(id__in=defectIds)} + # 过滤并统计相关数据 + filtered_mw_qs = mw_qs.filter( + ftest__defects_ftest__defect__id__in=defects_map.keys(), + ftest__defects_ftest__has=True, + ftest__defects_ftest__is_main=True + ).values('ftest__defects_ftest__defect__id').annotate(xcount=Count('id')) + for defect_data in filtered_mw_qs: + defect_id = defect_data['ftest__defects_ftest__defect__id'] + xcount = defect_data['xcount'] + if xcount > 0: + defect = defects_map[defect_id] + m_list.append((material, warehouse, i.batch, xcount, defect, i)) + for material, warehouse, batch, change_count, defect, mioitem in m_list: + if change_count <= 0: + continue + mb, _ = MaterialBatch.objects.get_or_create( + material=material, + warehouse=warehouse, + batch=batch, + defect=defect, + defaults=ddict + ) + + if in_or_out == 1: + mb.count = mb.count + change_count mb.save() if tracking == Material.MA_TRACKING_SINGLE: mioitemws = MIOItemw.objects.filter(mioitem=i) if mioitemws.count() != mb.count: raise ParseError("出入库与明细数量不一致,操作失败") for mioitemw in mioitemws: - Wpr.change_or_new(wpr=mioitemw.wpr, old_mb=mb) - else: - raise ParseError("不支持的操作") + if mioitemw.wpr: + Wpr.change_or_new(wpr=mioitemw.wpr, mb=mb) + else: + wpr = Wpr.change_or_new(number=mioitemw.number, mb=mb) + mioitemw.wpr = wpr + mioitemw.save() + + elif in_or_out == -1: + mb.count = mb.count - change_count + if mb.count < 0: + raise ParseError("批次库存不足,操作失败") + else: + mb.save() + if tracking == Material.MA_TRACKING_SINGLE: + mioitemws = MIOItemw.objects.filter(mioitem=i) + if mioitemws.count() != mb.count: + raise ParseError("出入库与明细数量不一致,操作失败") + for mioitemw in mioitemws: + Wpr.change_or_new(wpr=mioitemw.wpr, old_mb=mb) + else: + raise ParseError("不支持的操作") def daoru_mb(path: str): diff --git a/apps/inm/views.py b/apps/inm/views.py index cfc396ae..6f8500dc 100644 --- a/apps/inm/views.py +++ b/apps/inm/views.py @@ -345,11 +345,10 @@ class MIOItemwViewSet(CustomModelViewSet): raise ParseError('请指定所属出入库记录明细') return super().filter_queryset(queryset) - def cal_mioitem_count(self, mioitem): + def cal_mioitem_count(self, mioitem:MIOItem): count = MIOItemw.objects.filter(mioitem=mioitem).count() mioitem.count = count mioitem.count_notok = MIOItemw.objects.filter(mioitem=mioitem, ftest__is_ok=False).count() - mioitem.count_ok = count - mioitem.count_notok mioitem.save() @transaction.atomic