feat: 返工可选择不合格品/根据工艺路线决定返工后是合格不合格还是返修完成

This commit is contained in:
caoqianming 2025-04-16 19:14:18 +08:00
parent 9179803fda
commit 896be043f5
4 changed files with 16 additions and 14 deletions

View File

@ -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):

View File

@ -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

View File

@ -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

View File

@ -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