from typing import List from django.db.models.expressions import F from apps.pm.models import SubProductionPlan, SubProductionProgress from apps.mtm.models import Material, Step, SubprodctionMaterial from apps.qm.models import TestRecord from apps.system.models import User from apps.wpm.models import WProduct, WprouctTicket from utils.tools import ranstr class WpmServies(object): @classmethod def get_next_step(cls, subproduction_plan:SubProductionPlan, nowstep:Step): """ 获取下一步骤 """ stepIds = [i['id'] for i in subproduction_plan.steps] pindex = stepIds.index(nowstep.id) if pindex + 1 < len(stepIds): return Step.objects.get(pk=stepIds[pindex+1]), True else: return nowstep, False @classmethod def get_subplans_queryset_from_wproducts(cls, wproducts:List): """ 通过半成品列表获取所属子计划 """ splans = SubProductionPlan.objects.filter(is_deleted=False, wproduct_subplan__in=wproducts) return splans @classmethod def get_subplans_queyset_from_step(cls, step:Step): """ 通过当前操作获取所有正在进行的子计划 """ splans = SubProductionPlan.objects.filter(is_deleted=False, subproduction__usedstep_subproduction__step=step, state=SubProductionPlan.SUBPLAN_STATE_WORKING) return splans @classmethod def update_wproduct_by_test(cls, test:TestRecord, user:User): """ 根据检验结果更新玻璃及相关状态 """ is_testok = test.is_testok wproduct = test.wproduct if is_testok: if wproduct.act_state == WProduct.WPR_ACT_STATE_TORETEST: # 复检 wproduct.act_state = WProduct.WPR_ACT_STATE_DOWAIT elif wproduct.act_state == WProduct.WPR_ACT_STATE_TOTEST and wproduct.material.type == Material.MA_TYPE_GOOD: # 成品检验 wproduct.act_state = WProduct.WPR_ACT_STATE_TOFINALTEST else: wproduct.act_state = WProduct.WPR_ACT_STATE_OK if wproduct.number is None: # 产生半成品编号 wproduct.number = 'WP'+ranstr(7) # 去除ng_sign if wproduct.ng_sign: wt = WprouctTicket.objects.order_by('id').last() #取最后的工单 if wt.step.process == test.step.process: wproduct.ng_sign = None # 更新子计划合格进度 ins = SubProductionProgress.objects.get(subproduction_plan=wproduct.subproduction_plan, is_main=True, type=SubprodctionMaterial.SUB_MA_TYPE_OUT) ins.count_ok = ins.count_ok + 1 ins.save() else:# 如果不合格 wproduct.act_state = WProduct.WPR_ACT_STATE_NOTOK # 需要走不合格品审理的工单 wproduct.update_by = user wproduct.test = None wproduct.save() @classmethod def update_subproduction_progress_main(cls, sp:SubProductionPlan, is_workdone:bool=False, is_testok:bool=False): """ 更新生产进度 """ if is_workdone: ins =