From b5c21b74720d7659e7babef5652e78c4939e9063 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 16 Apr 2025 17:59:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20fmlog=E6=B7=BB=E5=8A=A0=E5=B7=A5?= =?UTF-8?q?=E8=89=BA=E6=AD=A5=E9=AA=A4=E5=AD=97=E6=AE=B5=E5=8F=8A=E7=9B=B8?= =?UTF-8?q?=E5=BA=94=E8=BF=94=E5=9B=9E=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/mtm/models.py | 8 ++++++++ apps/wpm/migrations/0110_fmlog_route.py | 20 ++++++++++++++++++++ apps/wpm/models.py | 2 ++ apps/wpm/serializers.py | 21 ++++++++++++--------- 4 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 apps/wpm/migrations/0110_fmlog_route.py diff --git a/apps/mtm/models.py b/apps/mtm/models.py index 4e5495d0..12637ccb 100644 --- a/apps/mtm/models.py +++ b/apps/mtm/models.py @@ -373,6 +373,14 @@ class Route(CommonADModel): through="mtm.routemat", blank=True) parent = models.ForeignKey('self', verbose_name='上级路线', on_delete=models.CASCADE, null=True, blank=True) + def __str__(self): + x = "" + if self.material_in: + x = x + str(self.material_in) + ">" + if self.material_out: + x = x + str(self.material_out) + return x + @staticmethod def get_routes(material: Material=None, routepack:RoutePack=None, routeIds=None): """ diff --git a/apps/wpm/migrations/0110_fmlog_route.py b/apps/wpm/migrations/0110_fmlog_route.py new file mode 100644 index 00000000..b353579c --- /dev/null +++ b/apps/wpm/migrations/0110_fmlog_route.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.12 on 2025-04-16 09:58 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0055_auto_20250327_1239'), + ('wpm', '0109_auto_20250416_1130'), + ] + + operations = [ + migrations.AddField( + model_name='fmlog', + name='route', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='fmlog_route', to='mtm.route', verbose_name='所用步骤'), + ), + ] diff --git a/apps/wpm/models.py b/apps/wpm/models.py index 9a6bcd2d..22578641 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -147,6 +147,8 @@ class Fmlog(CommonADModel): """ mtask = models.ForeignKey(Mtask, verbose_name='任务', on_delete=models.CASCADE, related_name='fmlog_mtask', null=True, blank=True) + route = models.ForeignKey(Route, verbose_name="所用步骤", + on_delete=models.SET_NULL, related_name="fmlog_route", null=True, blank=True) mgroup = models.ForeignKey(Mgroup, verbose_name='工段', on_delete=models.CASCADE, related_name='fmlog_mgroup') note = models.TextField('备注', default='', blank=True) is_fix = models.BooleanField('是否用于返修', default=False) # 返工/复检 diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index e885a388..3633e80f 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -231,7 +231,7 @@ class MlogbSerializer(CustomModelSerializer): class MlogListSerializer(CustomModelSerializer): mstate_json = serializers.JSONField(source='mgroup.process.mstate_json', read_only=True) supplier_name = serializers.CharField(source='supplier.name', read_only=True) - routepack_name = serializers.CharField(source='route.routepack.name', read_only=True) + # routepack_name = serializers.CharField(source='route.routepack.name', read_only=True) belong_dept = serializers.CharField( source='mgroup.belong_dept.id', read_only=True) belong_dept_name = serializers.CharField( @@ -287,7 +287,7 @@ class MlogbDetailSerializer(CustomModelSerializer): class MlogSerializer(CustomModelSerializer): mstate_json = serializers.JSONField(source='mgroup.process.mstate_json', read_only=True) supplier_name = serializers.CharField(source='supplier.name', read_only=True) - routepack_name = serializers.CharField(source='route.routepack.name', read_only=True) + # routepack_name = serializers.CharField(source='route.routepack.name', read_only=True) belong_dept = serializers.CharField( source='mgroup.belong_dept.id', read_only=True) belong_dept_name = serializers.CharField( @@ -1021,8 +1021,8 @@ class HandoverSerializer(CustomModelSerializer): # raise ParseError(f'第{ind+1}物料与交接部门不一致') if attrs["material"] != wm.material: raise ParseError(f'第{ind+1}物料与交接物料不一致') - if wm.state != WMaterial.WM_OK and attrs['type'] in [Handover.H_NORMAL, Handover.H_TEST]: - raise ParseError(f'第{ind+1}物料不合格,不能进行正常/检验交接') + # if wm.state != WMaterial.WM_OK and attrs['type'] in [Handover.H_NORMAL, Handover.H_TEST]: + # raise ParseError(f'第{ind+1}物料不合格,不能进行正常/检验交接') if wm.count_xtest is not None: raise ParseError(f'第{ind+1}物料检验中,不能进行交接') attrs["count"] = t_count @@ -1177,8 +1177,9 @@ class AttLogSerializer(CustomModelSerializer): class FmlogSerializer(CustomModelSerializer): - routepack_name = serializers.CharField( - source='mtask.route.routepack.name', read_only=True) + # routepack_name = serializers.CharField( + # source='mtask.route.routepack.name', read_only=True) + route_name = serializers.StringRelatedField(source="route", read_only=True) mgroup_name = serializers.CharField(source='mgroup.name', read_only=True) mtask_number = serializers.CharField(source='mtask.number', read_only=True) class Meta: @@ -1190,11 +1191,13 @@ class FmlogSerializer(CustomModelSerializer): is_fix = attrs.get("is_fix", False) if is_fix: attrs["mtask"] = None - elif not attrs.get("mtask", None): - raise ParseError("请选择任务") + elif not attrs.get("mtask", None) or not attrs.get("route", None): + raise ParseError("请选择任务或工艺步骤") mtask: Mtask = attrs['mtask'] - if mtask.state != Mtask.MTASK_ASSGINED: + if mtask and mtask.state != Mtask.MTASK_ASSGINED: raise ParseError('该任务非下达中不可选择') + if mtask: + attrs["route"] = mtask.route return attrs class FmlogUpdateSerializer(CustomModelSerializer):