diff --git a/apps/qm/services.py b/apps/qm/services.py index a6bb0577..ac7a45dd 100644 --- a/apps/qm/services.py +++ b/apps/qm/services.py @@ -157,6 +157,43 @@ def ftestwork_submit(ins:FtestWork, user: User): # 触发批次统计分析 ana_batch_thread(xbatchs=[ins.batch]) + +def ftestwork_revert(ins: FtestWork): + wm:WMaterial = ins.wm + if wm and ins.need_update_wm: + fwd_qs = FtestworkDefect.objects.filter(ftestwork=ins) + for item in fwd_qs: + item:FtestworkDefect = item + if item.count > 0: + wm.count = wm.count + item.count + wm.save() + wmstate = WMaterial.WM_OK + if item.defect.okcate == Defect.DEFECT_NOTOK: + wmstate = WMaterial.WM_NOTOK + try: + wmx = WMaterial.objects.get( + material=wm.material, + batch=wm.batch, + mgroup=wm.mgroup, + belong_dept=wm.belong_dept, + state=wmstate, + notok_sign=None, + defect=item.defect, + ) + except Exception as e: + raise ParseError(f'找不到{item.defect.name}的车间库存: {str(e)}') + wmx.count = wmx.count - item.count + if wmx.count < 0: + raise ParseError("数量不足,撤销失败") + wmx.save() + else: + raise ParseError("该检验工作不支持撤销") + ins.submit_user = None + ins.submit_time = None + ins.save() + # 触发批次统计分析 + ana_batch_thread(xbatchs=[ins.batch]) + def bind_ftestwork(ticket: Ticket, transition, new_ticket_data: dict): ins = FtestWork.objects.get(id=new_ticket_data['t_id']) if ins.submit_time is not None: diff --git a/apps/qm/views.py b/apps/qm/views.py index 927fe158..e0f29ea2 100644 --- a/apps/qm/views.py +++ b/apps/qm/views.py @@ -17,7 +17,7 @@ from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.wpm.models import SfLog from apps.qm.filters import QuaStatFilter, TestItemFilter, FtestWorkFilter, QctFilter, FtestFilter from django.db import transaction -from apps.qm.services import ftestwork_submit +from apps.qm.services import ftestwork_submit, ftestwork_revert from apps.wpm.services_2 import ana_batch_thread from apps.wf.models import State # Create your views here. @@ -327,4 +327,18 @@ class FtestWorkViewSet(CustomModelViewSet): ftestwork_submit(ins, request.user) else: raise ParseError('该检验工作已提交') + return Response() + + @action(methods=['post'], detail=True, perms_map={'post': 'ftestwork.submit'}, serializer_class=Serializer) + @transaction.atomic + def revert(self, request, *args, **kwargs): + """撤销检验工作 + + 撤销检验工作 + """ + ins:FtestWork = self.get_object() + if ins.submit_time: + ftestwork_revert(ins) + else: + raise ParseError('该检验工作未提交') return Response() \ No newline at end of file