From dde5b0a6e83d720fac556451b569e04dfe4f3e81 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 27 Jul 2026 17:36:24 +0800 Subject: [PATCH] Fix mlogbw creation for route-less rework --- apps/wpm/tests.py | 62 +++++++++++++++++++++++++++++++++++++++++++++-- apps/wpm/views.py | 8 +++--- 2 files changed, 65 insertions(+), 5 deletions(-) diff --git a/apps/wpm/tests.py b/apps/wpm/tests.py index 7ce503c2..2cacf716 100644 --- a/apps/wpm/tests.py +++ b/apps/wpm/tests.py @@ -1,3 +1,61 @@ -from django.test import TestCase +from types import SimpleNamespace +from unittest.mock import MagicMock, patch -# Create your tests here. +from django.test import SimpleTestCase + +from apps.mtm.models import Material +from apps.wpm.views import MlogbwViewSet + + +class MlogbwViewSetTests(SimpleTestCase): + @patch("apps.wpm.views.MlogViewSet.lock_and_check_can_update") + @patch("apps.wpm.views.Mlogbw.cal_count_notok") + @patch("apps.wpm.views.Mlogbw.objects.get_or_create") + @patch("apps.wpm.views.Mlogb.objects.filter") + def test_perform_create_syncs_fix_output_without_route( + self, + mlogb_filter, + mlogbw_get_or_create, + cal_count_notok, + lock_and_check_can_update, + ): + wm = object() + wpr = SimpleNamespace(wm=wm) + material = SimpleNamespace(tracking=Material.MA_TRACKING_SINGLE) + mlog = SimpleNamespace( + route=None, + is_fix=True, + cal_mlog_count_from_mlogb=MagicMock(), + ) + mlogb_in = SimpleNamespace( + mlog=mlog, + route=None, + wm_in=wm, + material_in=material, + ) + mlogb_out = object() + mlogb_qs = MagicMock() + mlogb_qs.exists.return_value = True + mlogb_qs.__iter__.return_value = iter([mlogb_out]) + mlogb_filter.return_value = mlogb_qs + ins = SimpleNamespace( + mlogb=mlogb_in, + wpr=wpr, + number="2606P1095-3", + ) + serializer = MagicMock() + serializer.save.return_value = ins + lock_and_check_can_update.return_value = mlog + + MlogbwViewSet().perform_create(serializer) + + mlogbw_get_or_create.assert_called_once_with( + mlogb=mlogb_out, + wpr=wpr, + defaults={ + "number": "2606P1095-3", + "mlogbw_from": ins, + }, + ) + self.assertEqual(cal_count_notok.call_count, 2) + mlog.cal_mlog_count_from_mlogb.assert_called_once_with() diff --git a/apps/wpm/views.py b/apps/wpm/views.py index a9ba977a..f2b4bb0c 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -1199,12 +1199,14 @@ class MlogbwViewSet(CustomModelViewSet): material_out = material_in else: raise ParseError("获取产出物料错误") - mtype = route.process.mtype if route.process else None + process = route.process if route else None + # 返修不依赖工艺路线,按个到个的普通流转同步产出。 + mtype = Process.PRO_NORMAL if mlog.is_fix else process.mtype if process else None if mlogb_qs.exists() and material_out.tracking == Material.MA_TRACKING_SINGLE: for mlogb in mlogb_qs: - if route.process.mtype == Process.PRO_NORMAL: + if mtype == Process.PRO_NORMAL: Mlogbw.objects.get_or_create(mlogb=mlogb, wpr=ins.wpr, defaults={"number": ins.number, "mlogbw_from": ins}) - elif route.process.mtype == Process.PRO_DIV: + elif mtype == Process.PRO_DIV: if route.div_number == 1: Mlogbw.objects.get_or_create(wpr=ins.wpr, mlogb=mlogb, defaults={"number": ins.wpr.number, "mlogbw_from": ins}) else: