diff --git a/apps/wpm/models.py b/apps/wpm/models.py index 7baf2930..1840d37c 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -738,7 +738,6 @@ class BatchSt(BaseModel): # return ins, True @classmethod - @transaction.atomic def init_dag(cls, batch:str): """ 更新批次数据关系链(初步) diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 09e4c6f1..b24c0ffc 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -885,7 +885,6 @@ class MlogbwCreateUpdateSerializer(CustomModelSerializer): ftest_sr.update(instance=ftest, validated_data=ftest_data) return mlogbw - @transaction.atomic def create(self, validated_data): wpr: Wpr = validated_data.get("wpr", None) if wpr: @@ -898,7 +897,6 @@ class MlogbwCreateUpdateSerializer(CustomModelSerializer): mlogbw = self.save_ftest(mlogbw, ftest_data) return mlogbw - @transaction.atomic def update(self, instance, validated_data): validated_data.pop("mlogb") ftest_data = validated_data.pop("ftest", None) @@ -1078,7 +1076,6 @@ class MlogbOutUpdateSerializer(CustomModelSerializer): # else: # raise ParseError("mlogbdefect仅支持批次件") # return ins - @transaction.atomic def update(self, instance, validated_data): mlogbdefect = validated_data.pop("mlogbdefect", None) with transaction.atomic(): diff --git a/apps/wpm/views.py b/apps/wpm/views.py index 97c49e67..2b2aefbe 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -37,7 +37,6 @@ from django.db.models import Q from apps.utils.tools import convert_ordereddict, update_dict from django.db.models import Count from datetime import datetime, timedelta -from apps.utils.lock import lock_model_record_d_method from apps.em.models import Equipment from django.db.models import Prefetch from drf_yasg.utils import swagger_auto_schema @@ -155,7 +154,6 @@ class WMaterialViewSet(ListModelMixin, CustomGenericViewSet): return queryset.exclude(state=WMaterial.WM_SCRAP) @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=DeptBatchSerializer) - @transaction.atomic def batchs(self, request): """获取车间的批次号(废弃) @@ -282,7 +280,6 @@ class MlogViewSet(CustomModelViewSet): item["mlogbw_number_list"] = wpr_dict.get(item["id"], None) return data - @lock_model_record_d_method(Mlog) def perform_destroy(self, instance): if instance.submit_time is not None: raise ParseError('日志已提交不可变动') @@ -295,7 +292,6 @@ class MlogViewSet(CustomModelViewSet): instance.delete() Ftest.objects.filter(id__in=ftestIds).delete() - @transaction.atomic def perform_update(self, serializer): ins = serializer.instance if ins.ticket and ins.ticket.state != State.STATE_TYPE_START: @@ -318,7 +314,9 @@ class MlogViewSet(CustomModelViewSet): ins = sr.save() return Response(MlogSerializer(ins).data) - @action(methods=['post'], detail=True, perms_map={'post': 'mlog.update'}, serializer_class=MlogChangeSerializer) + @action(methods=['post'], detail=True, + perms_map={'post': 'mlog.update'}, + serializer_class=MlogChangeSerializer, requires_transaction=True) def change(self, request, *args, **kwargs): """修改日志 @@ -334,7 +332,8 @@ class MlogViewSet(CustomModelViewSet): sr.save() return Response(MlogSerializer(ins).data) - @action(methods=['post'], detail=True, perms_map={'post': 'mlog.submit'}, serializer_class=Serializer) + @action(methods=['post'], detail=True, perms_map={'post': 'mlog.submit'}, + serializer_class=Serializer, requires_transaction=True) def submit(self, request, *args, **kwargs): """日志提交(变动车间库存) @@ -349,20 +348,11 @@ class MlogViewSet(CustomModelViewSet): if p.mlog_need_ticket: raise ParseError('该日志需要审批!') mlog_submit_validate(ins) - with transaction.atomic(): - updated_count = Mlog.objects.filter(id=ins.id, submit_time__isnull=True).update( - submit_time=now, submit_user=request.user, update_by=request.user) - if updated_count == 1: - mlog_submit(ins, self.request.user, now) - else: - raise ParseError('记录正在处理中,请稍后再试') - - vdata_new = MlogSerializer(ins).data - # create_auditlog('submit', ins, vdata_new, - # vdata_old, now, self.request.user) + mlog_submit(ins, self.request.user, now) + vdata_new = MlogSerializer(ins).data return Response(vdata_new) - @action(methods=['post'], detail=True, perms_map={'post': 'mlog.submit'}, serializer_class=MlogRevertSerializer) + @action(methods=['post'], detail=True, perms_map={'post': 'mlog.submit'}, serializer_class=MlogRevertSerializer, requires_transaction=True) def revert(self, request, *args, **kwargs): """撤回日志提交 @@ -377,20 +367,10 @@ class MlogViewSet(CustomModelViewSet): if user != ins.submit_user: raise ParseError('非提交人不可撤销!') now = timezone.now() - with transaction.atomic(): - updated_count = Mlog.objects.filter(id=ins.id, submit_time__isnull=False).update( - submit_time=None, update_time=now, submit_user=None, update_by=request.user) - if updated_count == 1: - mlog_revert(ins, user, now) - else: - raise ParseError('记录正在处理中,请稍后再试') - - # create_auditlog('revert', ins, {}, {}, now, user, - # request.data.get('change_reason', '')) + mlog_revert(ins, user, now) return Response(MlogSerializer(instance=ins).data) @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=MlogRelatedSerializer) - @transaction.atomic def related_first(self, request, *args, **kwargs): """获取相关任务的第一道工序日志 @@ -453,8 +433,7 @@ class MlogViewSet(CustomModelViewSet): res[i] = 0 return Response(res) - @action(methods=['post'], detail=False, perms_map={'post': 'mlog.create'}, serializer_class=MlogQuickSerializer) - @transaction.atomic + @action(methods=['post'], detail=False, perms_map={'post': 'mlog.create'}, serializer_class=MlogQuickSerializer, requires_transaction=True) def quick(self, request, *args, **kwargs): """快速创建日志 @@ -508,8 +487,7 @@ class HandoverViewSet(CustomModelViewSet): 'material__number', 'material__specification', 'batch', 'material__model', 'b_handover__batch', "new_batch", "wm__batch"] prefetch_related_fields = ["b_handover"] - @lock_model_record_d_method(Handover) - def perform_destroy(self, instance:Handover): + def perform_destroy(self, instance): user = self.request.user if instance.submit_time is not None: raise ParseError('该交接记录已提交不可删除') @@ -520,9 +498,8 @@ class HandoverViewSet(CustomModelViewSet): ticket.delete() instance.delete() - @transaction.atomic def perform_update(self, serializer): - ins:Handover = self.get_object() + ins:Handover = serializer.instance if ins.submit_time is not None: raise ParseError('该交接记录已提交!') ticket:Ticket = ins.ticket @@ -530,8 +507,7 @@ class HandoverViewSet(CustomModelViewSet): raise ParseError("该交接记录存在审批,不可修改") serializer.save() - @action(methods=['post'], detail=False, perms_map={'post': 'handover.create'}, serializer_class=HandoverSerializer) - @transaction.atomic + @action(methods=['post'], detail=False, perms_map={'post': 'handover.create'}, serializer_class=HandoverSerializer, requires_transaction=True) def create_and_submit(self, request, *args, **kwargs): user = request.user sr = HandoverSerializer(data=request.data, context={'request': request}) @@ -546,8 +522,7 @@ class HandoverViewSet(CustomModelViewSet): handover_submit(ins, user, None) return Response({"id": ins.id}) - @action(methods=['post'], detail=True, perms_map={'post': 'handover.submit'}, serializer_class=Serializer) - @transaction.atomic + @action(methods=['post'], detail=True, perms_map={'post': 'handover.submit'}, serializer_class=Serializer, requires_transaction=True) def submit(self, request, *args, **kwargs): """交接记录提交(变动车间库存) @@ -567,8 +542,7 @@ class HandoverViewSet(CustomModelViewSet): handover_submit(ins, user, None) return Response() - @action(methods=['post'], detail=True, perms_map={'post': 'handover.submit'}, serializer_class=Serializer) - @transaction.atomic + @action(methods=['post'], detail=True, perms_map={'post': 'handover.submit'}, serializer_class=Serializer, requires_transaction=True) def revert(self, request, *args, **kwargs): """交接记录撤回(变动车间库存) @@ -580,7 +554,6 @@ class HandoverViewSet(CustomModelViewSet): return Response() @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=HandoverMgroupSerializer) - @transaction.atomic def mgroups(self, request, *args, **kwargs): """获取可交接到的工段 @@ -602,8 +575,7 @@ class HandoverViewSet(CustomModelViewSet): m_qs = m_qs.filter(process=None) return Response(list(m_qs.values('id', 'name').distinct())) - @action(methods=['post'], detail=False, perms_map={'post': 'handover.create'}, serializer_class=GenHandoverWmSerializer) - @transaction.atomic + @action(methods=['post'], detail=False, perms_map={'post': 'handover.create'}, serializer_class=GenHandoverWmSerializer, requires_transaction=True) def gen_by_wm(self, request): """从车间库存生成交接记录(废弃) @@ -632,8 +604,7 @@ class HandoverViewSet(CustomModelViewSet): ) return Response({'handover': handover.id}) - @action(methods=['post'], detail=False, perms_map={'post': 'handover.create'}, serializer_class=GenHandoverSerializer) - @transaction.atomic + @action(methods=['post'], detail=False, perms_map={'post': 'handover.create'}, serializer_class=GenHandoverSerializer, requires_transaction=True) def gen_by_mlog(self, request): """从生产日志生成交接记录(废弃) @@ -708,7 +679,6 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust serializer_class = MlogbInSerializer update_serializer_class = MlogbInUpdateSerializer - @transaction.atomic def perform_destroy(self, instance): ins: Mlogb = instance if ins.mlog.submit_time is not None: @@ -716,7 +686,6 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust ins.delete() ins.mlog.cal_mlog_count_from_mlogb() - @transaction.atomic def perform_update(self, serializer): ins:Mlogb = serializer.save() ins.mlog.cal_mlog_count_from_mlogb() @@ -883,7 +852,7 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust raise ParseError("不支持生成产出物料!") mlog.cal_mlog_count_from_mlogb() - @transaction.atomic + def perform_create(self, serializer): mlogbin: Mlogb = serializer.save() MlogbInViewSet.p_create_after(mlogbin) @@ -925,7 +894,6 @@ class MlogbOutViewSet(UpdateModelMixin, CustomGenericViewSet): queryset = Mlogb.objects.filter(material_out__isnull=False) serializer_class = MlogbOutUpdateSerializer - @transaction.atomic def perform_update(self, serializer): material_out = serializer.validated_data.get('material_out') if material_out and material_out.tracking == Material.MA_TRACKING_SINGLE: @@ -985,7 +953,6 @@ class MlogbwViewSet(CustomModelViewSet): # raise ParseError('请指定所属消耗/产出明细') # return super().filter_queryset(queryset) - @transaction.atomic def perform_create(self, serializer): ins:Mlogbw = serializer.save() mlog:Mlog = None @@ -1061,7 +1028,6 @@ class MlogbwViewSet(CustomModelViewSet): raise ParseError("该个号不可产生该批") mlog.cal_mlog_count_from_mlogb() - @transaction.atomic def perform_update(self, serializer): mlogbw = serializer.save() if isinstance(mlogbw, list): @@ -1079,7 +1045,6 @@ class MlogbwViewSet(CustomModelViewSet): mlog = mlogb.mlog mlog.cal_mlog_count_from_mlogb() - @transaction.atomic def perform_destroy(self, instance:Mlogbw): mlogb:Mlogb = instance.mlogb if mlogb.material_out is not None and instance.wpr is not None: @@ -1109,8 +1074,7 @@ class MlogbwViewSet(CustomModelViewSet): mlog = mlogb.mlog mlog.cal_mlog_count_from_mlogb() - @action(methods=['post'], detail=False, perms_map={'post': 'mlog.update'}, serializer_class=MlogbwStartTestSerializer) - @transaction.atomic + @action(methods=['post'], detail=False, perms_map={'post': 'mlog.update'}, serializer_class=MlogbwStartTestSerializer, requires_transaction=True) def start_test(self, request, *args, **kwargs): sr = MlogbwStartTestSerializer(data=request.data) sr.is_valid(raise_exception=True) @@ -1143,8 +1107,7 @@ class BatchLogViewSet(ListModelMixin, CustomGenericViewSet): serializer_class = BatchLogSerializer select_related_fields = ["source", "target"] - @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=Serializer) - @transaction.atomic + @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=Serializer, requires_transaction=True) def dag(self, request): """ 获取该批次的DAG图数据 diff --git a/apps/wpmw/views.py b/apps/wpmw/views.py index 149d1759..6a7256b3 100644 --- a/apps/wpmw/views.py +++ b/apps/wpmw/views.py @@ -97,8 +97,7 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu return Response({"number_out_last": None}) - @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=WproutListSerializer) - @transaction.atomic + @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=WproutListSerializer, requires_transaction=True) def assgin_number_out(self, request, *args, **kwargs): """分配出库对外编号