diff --git a/apps/wpm/services.py b/apps/wpm/services.py index 3e800675..ff59693a 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -916,8 +916,39 @@ def handover_submit(handover:Handover, user: User, now: Union[datetime.datetime, def handover_revert(handover:Handover): + if handover.submit_time is None: + raise ParseError('该交接单未提交!') + handover_type = handover.type + handover_mtype = handover.mtype + if handover_type in [Handover.H_NORMAL, Handover.H_REPAIR] and handover_mtype == Handover.H_NORMAL: + raise ParseError('该交接单不支持撤销!') + handoverb_qs = Handoverb.objects.filter(handover=handover) + material = handover.material + for item in handoverb_qs: + wm = item.wm + wm_to = item.wm_to + if wm is None or wm_to is None: + raise ParseError('该交接单不支持撤销2!') + wm.count = wm.count + item.count + wm.save() + wm_to.count = wm_to.count - item.count + if wm_to.count < 0: + raise ParseError('库存不足无法撤回!') + wm_to.save() + if material.tracking == Material.MA_TRACKING_SINGLE: + handoverbws = Handoverbw.objects.filter(handoverb=item) + if handoverbws.count() != item.count: + raise ParseError("交接与明细数量不一致,操作失败") + for item in handoverbws: + wpr:Wpr = item.wpr + Wpr.change_or_new(wpr=wpr, wm=wm, old_wm=wpr.wm, old_mb=wpr.mb, add_version=False) + + handover.submit_time = None + handover.submit_user = None + handover.save() + # 删除追踪链 BatchLog.clear(handover=handover) - pass + def mlog_submit_validate(ins: Mlog): if ins.submit_time: diff --git a/apps/wpm/views.py b/apps/wpm/views.py index c4afe65e..750c0904 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -27,7 +27,7 @@ from .serializers import (SflogExpSerializer, SfLogSerializer, StLogSerializer, MlogbOutUpdateSerializer, FmlogSerializer, FmlogUpdateSerializer, BatchStSerializer, MlogbwCreateUpdateSerializer, HandoverMgroupSerializer, MlogListSerializer, MlogbSerializer, MlogUserSerializer, BatchLogSerializer) -from .services import mlog_submit, handover_submit, mlog_revert, get_batch_dag +from .services import mlog_submit, handover_submit, mlog_revert, get_batch_dag, handover_revert from apps.wpm.services import mlog_submit_validate, generate_new_batch from apps.wf.models import State from apps.wpmw.models import Wpr @@ -427,6 +427,18 @@ class HandoverViewSet(CustomModelViewSet): if ins.submit_time is None: handover_submit(ins, user, None) return Response() + + @action(methods=['post'], detail=True, perms_map={'post': 'handover.submit'}, serializer_class=Serializer) + @transaction.atomic + def revert(self, request, *args, **kwargs): + """交接记录撤回(变动车间库存) + + 交接记录撤回 + """ + ins: Handover = self.get_object() + if ins.submit_time: + handover_revert(ins) + return Response() @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=HandoverMgroupSerializer) @transaction.atomic diff --git a/apps/wpmw/models.py b/apps/wpmw/models.py index 21932de2..99678377 100644 --- a/apps/wpmw/models.py +++ b/apps/wpmw/models.py @@ -29,7 +29,7 @@ class Wpr(BaseModel): wpr_from = models.ForeignKey("self", verbose_name="来源于", on_delete=models.CASCADE, null=True, blank=True) @classmethod - def change_or_new(cls, wpr=None, number=None, mb=None, wm=None, old_mb=None, old_wm=None, ftest=None, wpr_from=None): + def change_or_new(cls, wpr=None, number=None, mb=None, wm=None, old_mb=None, old_wm=None, ftest=None, wpr_from=None, add_version=True): is_create = False if wpr is None and number is None: raise ParseError("id和number不能同时为空") @@ -105,7 +105,8 @@ class Wpr(BaseModel): WprDefect.objects.filter(wpr=ins).delete() if wm.defect: WprDefect.objects.create(wpr=ins, defect=wm.defect, is_main=True) - ins.version = ins.version + 1 + if add_version: + ins.version = ins.version + 1 ins.save() if ftest: # 通过检验变更其缺陷项