diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 9bc864f0..a300ca2e 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -686,6 +686,13 @@ class MlogbInSerializer(CustomModelSerializer): raise ParseError('生产日志已提交不可编辑') with transaction.atomic(): ins:Mlogb = super().create(validated_data) + if mlog.is_fix: + if mlog.material_in is None: + mlog.material_in = ins.material_in + mlog.save(update_fields="material_in") + elif mlog.material_in != ins.material_in: + raise ParseError('返修记录必须使用同一物料') + if mlogbdefect is not None and ins.material_in.tracking == Material.MA_TRACKING_BATCH: mlogb_defect_objects = [ MlogbDefect(**{**item, "mlogb": ins, "id": idWorker.get_id()}) diff --git a/apps/wpm/views.py b/apps/wpm/views.py index fb0711cb..cb08202f 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -565,8 +565,9 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust mlogbin: Mlogb = serializer.save() mlog:Mlog = mlogbin.mlog route:Route = mlog.route - mgroup:Mgroup = mlog.mgroup + mtype = route.process.mtype if route else None is_fix = mlog.is_fix + qct = mlog.qct # 以及mlogbw material_in:Material = mlogbin.material_in # 如果是返修,则输出和输入相同 @@ -583,58 +584,53 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust } m_dict['batch'] = generate_new_batch(mlogbin.batch, mlog) wm_in: WMaterial = mlogbin.wm_in - mlogbout, is_create = Mlogb.objects.get_or_create(**m_dict, defaults= - {"batch_ofrom": wm_in.batch_ofrom, "material_ofrom": wm_in.material_ofrom}) - if is_create: - d_count_real = 0 - d_count_ok = 0 - if route: - if route.process.mtype == Process.PRO_NORMAL: - d_count_real = mlogbin.count_use - d_count_ok = mlogbin.count_use - elif route.process.mtype == Process.PRO_DIV: - xcount = mlogbin.count_use * route.div_number - d_count_real = xcount - d_count_ok = xcount - elif route.process.mtype == Process.PRO_MERGE: - xcount = math.floor( mlogbin.count_use / route.div_number) - d_count_real = xcount - d_count_ok = xcount - elif is_fix: - d_count_real = mlogbin.count_use - d_count_ok = mlogbin.count_use - # 找寻质检表 - if is_fix and mgroup.process.type == Process.PRO_PROD: - # 如果是生产返修,则忽略质检 - pass - elif mlogbout.qct is None: - mlogbout.qct = Qct.get(mlogbout.material_out, "process") if mlog.qct is None else mlog.qct - if mlogbout.qct is not None and mlog.qct is None: - mlog.qct = mlogbout.qct - mlog.save(update_fields=["qct"]) - mlogbout.count_real = d_count_real - mlogbout.count_ok = d_count_ok - mlogbout.save() - mlogbin.mlogb_to = mlogbout - mlogbin.save() + if material_in.tracking == Material.MA_TRACKING_SINGLE: - m_out_t = material_out.tracking if mlogbin.count_use == wm_in.count: # 自动创建mlogbw for wpr in Wpr.objects.filter(wm=wm_in).order_by("number"): - Mlogbw.objects.get_or_create(wpr=wpr, mlogb=mlogbin, defaults={"number": wpr.number}) - if m_out_t == Material.MA_TRACKING_SINGLE: - if route: - if route.process.mtype == Process.PRO_NORMAL: - Mlogbw.objects.get_or_create(wpr=wpr, mlogb=mlogbout, defaults={"number": wpr.number}) - elif route.process.mtype == Process.PRO_DIV: - for i in range(route.div_number): - Mlogbw.objects.get_or_create(mlogb=mlogbout, number=f'{wpr.number}-{i+1}') - else: - raise ParseError("不支持的生产类型") - elif is_fix: - Mlogbw.objects.get_or_create(wpr=wpr, mlogb=mlogbout, defaults={"number": wpr.number}) - else: - raise ParseError("不支持的生产类型1") + Mlogbw.objects.get_or_create(wpr=wpr, mlogb=mlogbin, defaults={"number": wpr.number}) + else: + raise ParseError("请提供消耗物料详细编号") + + if qct is None and not (is_fix and mtype == Process.PRO_PROD): + mlog.qct = Qct.get(material_out, "process") + mlog.save(update_fields = ["qct"]) + + if mtype == Process.PRO_NORMAL: + d_count_real = mlogbin.count_use + d_count_ok = mlogbin.count_use + mlogbout, _ = Mlogb.objects.get_or_create(**m_dict, defaults= + {"batch_ofrom": wm_in.batch_ofrom, "material_ofrom": wm_in.material_ofrom, "count_real": d_count_real, "count_ok": d_count_ok, "qct": qct}) + elif mtype == Process.PRO_DIV: + for mlogbwin in Mlogbw.objects.filter(mlogb=mlogbin).order_by("number"): + mlogbout, _ = Mlogb.objects.get_or_create(**m_dict, defaults= + {"batch_ofrom": wm_in.batch_ofrom, "material_ofrom": wm_in.material_ofrom, "count_real": d_count_real, "count_ok": d_count_ok, "qct": qct}) + elif mtype == Process.PRO_MERGE: + xcount = math.floor( mlogbin.count_use / route.div_number) + d_count_real = xcount + d_count_ok = xcount + mlogbout, _ = Mlogb.objects.get_or_create(**m_dict, defaults= + {"batch_ofrom": wm_in.batch_ofrom, "material_ofrom": wm_in.material_ofrom, "count_real": d_count_real, "count_ok": d_count_ok, "qct": qct}) + elif is_fix: + d_count_real = mlogbin.count_use + d_count_ok = mlogbin.count_use + mlogbout, _ = Mlogb.objects.get_or_create(**m_dict, defaults= + {"batch_ofrom": wm_in.batch_ofrom, "material_ofrom": wm_in.material_ofrom, "count_real": d_count_real, "count_ok": d_count_ok, "qct": qct}) + else: + raise ParseError("不支持生成产出物料!") + + if material_out.tracking == Material.MA_TRACKING_SINGLE: + for mlogbwin in Mlogbw.objects.filter(mlogb=mlogbin).order_by("number"): + wpr = mlogbwin.wpr + if mtype == Process.PRO_NORMAL: + Mlogbw.objects.get_or_create(wpr=wpr, mlogb=mlogbout, defaults={"number": wpr.number}) + elif mtype == Process.PRO_DIV: + for i in range(route.div_number): + Mlogbw.objects.get_or_create(mlogb=mlogbout, number=f'{wpr.number}-{i+1}') + elif is_fix: + Mlogbw.objects.get_or_create(wpr=wpr, mlogb=mlogbout, defaults={"number": wpr.number}) + else: + raise ParseError("不支持的生产类型1") class MlogbOutViewSet(UpdateModelMixin, CustomGenericViewSet):