diff --git a/apps/mtm/models.py b/apps/mtm/models.py index 12637ccb..d911e2a1 100644 --- a/apps/mtm/models.py +++ b/apps/mtm/models.py @@ -35,6 +35,10 @@ class Process(CommonBModel): verbose_name = '工序' ordering = ['sort', 'create_time'] + def get_canout_mat_ids(self): + """获取可产出的materialIds + """ + return list(Route.objects.filter(process=self).values_list("material_out__id", flat=True).distinct()) # Create your models here. class Material(CommonAModel): diff --git a/apps/wpm/filters.py b/apps/wpm/filters.py index 947e5f3b..bd0d04bf 100644 --- a/apps/wpm/filters.py +++ b/apps/wpm/filters.py @@ -48,7 +48,7 @@ class WMaterialFilter(filters.FilterSet): mgroup = self.data.get("mgroup", None) if mgroup: process = Mgroup.objects.get(id=mgroup).process - matoutIds = list(Route.objects.filter(process=process).values_list("material_out__id", flat=True).distinct()) + matoutIds = process.get_canout_mat_ids() if value == "todo": qs = queryset.exclude(material__id__in=matoutIds)|queryset.filter(state=WMaterial.WM_REPAIR) return qs diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 3633e80f..1045945e 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -687,15 +687,10 @@ class MlogbInSerializer(CustomModelSerializer): if wm_in is None: raise ParseError("请选择相应车间库存!") if is_fix: # 返修或复检 - if wm_in.state in [WMaterial.WM_NOTOK, WMaterial.WM_REPAIR, WMaterial.WM_REPAIRED]: - pass - else: - raise ParseError('返修或复检不可使用该物料') + if wm_in.state in [WMaterial.WM_REPAIR, WMaterial.WM_NOTOK]: + raise ParseError('返修或复检需使用返修品/不合格品') elif wm_in.state != WMaterial.WM_OK: raise ParseError('非合格品不可使用') - if wm_in.state in [WMaterial.WM_OK, WMaterial.WM_REPAIR, WMaterial.WM_REPAIRED]: - if is_fix and wm_in.state not in [WMaterial.WM_REPAIR, WMaterial.WM_REPAIRED]: - raise ParseError('需要使用返修品') if mtask and mlog.route != mtask.route: raise ParseError('工序不匹配') route = mlog.route diff --git a/apps/wpm/services.py b/apps/wpm/services.py index 1389eb42..24256706 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -167,6 +167,8 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): m_ins_list = [] m_ins_bl_list = [] + if is_fix: + can_matoutIds = process.get_canout_mat_ids() # 建立关系链 m_outs = Mlogb.objects.filter(mlog=mlog, material_out__isnull=False) for item in m_outs: @@ -291,9 +293,8 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): if mo_count <= 0: continue if is_fix: - if process.type == Process.PRO_PROD: - wm_state = WMaterial.WM_REPAIRED # 返修只有返修完成品 - elif process.type == Process.PRO_TEST: + wm_state = WMaterial.WM_REPAIRED + if mo_ma.id in can_matoutIds: wm_state = WMaterial.WM_OK if notok_sign_or_defect is None or ( isinstance(notok_sign_or_defect, Defect) and notok_sign_or_defect.okcate in [Defect.DEFECT_OK, Defect.DEFECT_OK_B] ) else WMaterial.WM_NOTOK @@ -382,6 +383,9 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): stored_notok = mlog.stored_notok stored_mgroup = mlog.stored_mgroup is_fix = mlog.is_fix + + if is_fix: + can_matoutIds = process.get_canout_mat_ids() # 先回退产物 if material_out or is_fix: # 产物退回 # 有多个产物的情况 @@ -430,9 +434,8 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): if mo_count == 0: continue if is_fix: - if process.type == Process.PRO_PROD: - wm_state = WMaterial.WM_REPAIRED - else: # 检验工序正常生成 + wm_state = WMaterial.WM_REPAIRED + if mo_ma.id in can_matoutIds: wm_state = WMaterial.WM_OK if notok_sign_or_defect is None or ( isinstance(notok_sign_or_defect, Defect) and notok_sign_or_defect.okcate in [Defect.DEFECT_OK, Defect.DEFECT_OK_B] ) else WMaterial.WM_NOTOK