feat: wpm 取消 transaction

This commit is contained in:
caoqianming 2025-09-12 12:16:47 +08:00
parent 90b7e2087b
commit 527e6c0fc2
4 changed files with 21 additions and 63 deletions

View File

@ -738,7 +738,6 @@ class BatchSt(BaseModel):
# return ins, True # return ins, True
@classmethod @classmethod
@transaction.atomic
def init_dag(cls, batch:str): def init_dag(cls, batch:str):
""" """
更新批次数据关系链(初步) 更新批次数据关系链(初步)

View File

@ -885,7 +885,6 @@ class MlogbwCreateUpdateSerializer(CustomModelSerializer):
ftest_sr.update(instance=ftest, validated_data=ftest_data) ftest_sr.update(instance=ftest, validated_data=ftest_data)
return mlogbw return mlogbw
@transaction.atomic
def create(self, validated_data): def create(self, validated_data):
wpr: Wpr = validated_data.get("wpr", None) wpr: Wpr = validated_data.get("wpr", None)
if wpr: if wpr:
@ -898,7 +897,6 @@ class MlogbwCreateUpdateSerializer(CustomModelSerializer):
mlogbw = self.save_ftest(mlogbw, ftest_data) mlogbw = self.save_ftest(mlogbw, ftest_data)
return mlogbw return mlogbw
@transaction.atomic
def update(self, instance, validated_data): def update(self, instance, validated_data):
validated_data.pop("mlogb") validated_data.pop("mlogb")
ftest_data = validated_data.pop("ftest", None) ftest_data = validated_data.pop("ftest", None)
@ -1078,7 +1076,6 @@ class MlogbOutUpdateSerializer(CustomModelSerializer):
# else: # else:
# raise ParseError("mlogbdefect仅支持批次件") # raise ParseError("mlogbdefect仅支持批次件")
# return ins # return ins
@transaction.atomic
def update(self, instance, validated_data): def update(self, instance, validated_data):
mlogbdefect = validated_data.pop("mlogbdefect", None) mlogbdefect = validated_data.pop("mlogbdefect", None)
with transaction.atomic(): with transaction.atomic():

View File

@ -37,7 +37,6 @@ from django.db.models import Q
from apps.utils.tools import convert_ordereddict, update_dict from apps.utils.tools import convert_ordereddict, update_dict
from django.db.models import Count from django.db.models import Count
from datetime import datetime, timedelta from datetime import datetime, timedelta
from apps.utils.lock import lock_model_record_d_method
from apps.em.models import Equipment from apps.em.models import Equipment
from django.db.models import Prefetch from django.db.models import Prefetch
from drf_yasg.utils import swagger_auto_schema from drf_yasg.utils import swagger_auto_schema
@ -155,7 +154,6 @@ class WMaterialViewSet(ListModelMixin, CustomGenericViewSet):
return queryset.exclude(state=WMaterial.WM_SCRAP) return queryset.exclude(state=WMaterial.WM_SCRAP)
@action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=DeptBatchSerializer) @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=DeptBatchSerializer)
@transaction.atomic
def batchs(self, request): def batchs(self, request):
"""获取车间的批次号(废弃) """获取车间的批次号(废弃)
@ -282,7 +280,6 @@ class MlogViewSet(CustomModelViewSet):
item["mlogbw_number_list"] = wpr_dict.get(item["id"], None) item["mlogbw_number_list"] = wpr_dict.get(item["id"], None)
return data return data
@lock_model_record_d_method(Mlog)
def perform_destroy(self, instance): def perform_destroy(self, instance):
if instance.submit_time is not None: if instance.submit_time is not None:
raise ParseError('日志已提交不可变动') raise ParseError('日志已提交不可变动')
@ -295,7 +292,6 @@ class MlogViewSet(CustomModelViewSet):
instance.delete() instance.delete()
Ftest.objects.filter(id__in=ftestIds).delete() Ftest.objects.filter(id__in=ftestIds).delete()
@transaction.atomic
def perform_update(self, serializer): def perform_update(self, serializer):
ins = serializer.instance ins = serializer.instance
if ins.ticket and ins.ticket.state != State.STATE_TYPE_START: if ins.ticket and ins.ticket.state != State.STATE_TYPE_START:
@ -318,7 +314,9 @@ class MlogViewSet(CustomModelViewSet):
ins = sr.save() ins = sr.save()
return Response(MlogSerializer(ins).data) 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): def change(self, request, *args, **kwargs):
"""修改日志 """修改日志
@ -334,7 +332,8 @@ class MlogViewSet(CustomModelViewSet):
sr.save() sr.save()
return Response(MlogSerializer(ins).data) 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): def submit(self, request, *args, **kwargs):
"""日志提交(变动车间库存) """日志提交(变动车间库存)
@ -349,20 +348,11 @@ class MlogViewSet(CustomModelViewSet):
if p.mlog_need_ticket: if p.mlog_need_ticket:
raise ParseError('该日志需要审批!') raise ParseError('该日志需要审批!')
mlog_submit_validate(ins) mlog_submit_validate(ins)
with transaction.atomic(): mlog_submit(ins, self.request.user, now)
updated_count = Mlog.objects.filter(id=ins.id, submit_time__isnull=True).update( vdata_new = MlogSerializer(ins).data
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)
return Response(vdata_new) 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): def revert(self, request, *args, **kwargs):
"""撤回日志提交 """撤回日志提交
@ -377,20 +367,10 @@ class MlogViewSet(CustomModelViewSet):
if user != ins.submit_user: if user != ins.submit_user:
raise ParseError('非提交人不可撤销!') raise ParseError('非提交人不可撤销!')
now = timezone.now() now = timezone.now()
with transaction.atomic(): mlog_revert(ins, user, now)
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', ''))
return Response(MlogSerializer(instance=ins).data) return Response(MlogSerializer(instance=ins).data)
@action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=MlogRelatedSerializer) @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=MlogRelatedSerializer)
@transaction.atomic
def related_first(self, request, *args, **kwargs): def related_first(self, request, *args, **kwargs):
"""获取相关任务的第一道工序日志 """获取相关任务的第一道工序日志
@ -453,8 +433,7 @@ class MlogViewSet(CustomModelViewSet):
res[i] = 0 res[i] = 0
return Response(res) return Response(res)
@action(methods=['post'], detail=False, perms_map={'post': 'mlog.create'}, serializer_class=MlogQuickSerializer) @action(methods=['post'], detail=False, perms_map={'post': 'mlog.create'}, serializer_class=MlogQuickSerializer, requires_transaction=True)
@transaction.atomic
def quick(self, request, *args, **kwargs): 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"] 'material__number', 'material__specification', 'batch', 'material__model', 'b_handover__batch', "new_batch", "wm__batch"]
prefetch_related_fields = ["b_handover"] prefetch_related_fields = ["b_handover"]
@lock_model_record_d_method(Handover) def perform_destroy(self, instance):
def perform_destroy(self, instance:Handover):
user = self.request.user user = self.request.user
if instance.submit_time is not None: if instance.submit_time is not None:
raise ParseError('该交接记录已提交不可删除') raise ParseError('该交接记录已提交不可删除')
@ -520,9 +498,8 @@ class HandoverViewSet(CustomModelViewSet):
ticket.delete() ticket.delete()
instance.delete() instance.delete()
@transaction.atomic
def perform_update(self, serializer): def perform_update(self, serializer):
ins:Handover = self.get_object() ins:Handover = serializer.instance
if ins.submit_time is not None: if ins.submit_time is not None:
raise ParseError('该交接记录已提交!') raise ParseError('该交接记录已提交!')
ticket:Ticket = ins.ticket ticket:Ticket = ins.ticket
@ -530,8 +507,7 @@ class HandoverViewSet(CustomModelViewSet):
raise ParseError("该交接记录存在审批,不可修改") raise ParseError("该交接记录存在审批,不可修改")
serializer.save() serializer.save()
@action(methods=['post'], detail=False, perms_map={'post': 'handover.create'}, serializer_class=HandoverSerializer) @action(methods=['post'], detail=False, perms_map={'post': 'handover.create'}, serializer_class=HandoverSerializer, requires_transaction=True)
@transaction.atomic
def create_and_submit(self, request, *args, **kwargs): def create_and_submit(self, request, *args, **kwargs):
user = request.user user = request.user
sr = HandoverSerializer(data=request.data, context={'request': request}) sr = HandoverSerializer(data=request.data, context={'request': request})
@ -546,8 +522,7 @@ class HandoverViewSet(CustomModelViewSet):
handover_submit(ins, user, None) handover_submit(ins, user, None)
return Response({"id": ins.id}) return Response({"id": ins.id})
@action(methods=['post'], detail=True, perms_map={'post': 'handover.submit'}, serializer_class=Serializer) @action(methods=['post'], detail=True, perms_map={'post': 'handover.submit'}, serializer_class=Serializer, requires_transaction=True)
@transaction.atomic
def submit(self, request, *args, **kwargs): def submit(self, request, *args, **kwargs):
"""交接记录提交(变动车间库存) """交接记录提交(变动车间库存)
@ -567,8 +542,7 @@ class HandoverViewSet(CustomModelViewSet):
handover_submit(ins, user, None) handover_submit(ins, user, None)
return Response() return Response()
@action(methods=['post'], detail=True, perms_map={'post': 'handover.submit'}, serializer_class=Serializer) @action(methods=['post'], detail=True, perms_map={'post': 'handover.submit'}, serializer_class=Serializer, requires_transaction=True)
@transaction.atomic
def revert(self, request, *args, **kwargs): def revert(self, request, *args, **kwargs):
"""交接记录撤回(变动车间库存) """交接记录撤回(变动车间库存)
@ -580,7 +554,6 @@ class HandoverViewSet(CustomModelViewSet):
return Response() return Response()
@action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=HandoverMgroupSerializer) @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=HandoverMgroupSerializer)
@transaction.atomic
def mgroups(self, request, *args, **kwargs): def mgroups(self, request, *args, **kwargs):
"""获取可交接到的工段 """获取可交接到的工段
@ -602,8 +575,7 @@ class HandoverViewSet(CustomModelViewSet):
m_qs = m_qs.filter(process=None) m_qs = m_qs.filter(process=None)
return Response(list(m_qs.values('id', 'name').distinct())) return Response(list(m_qs.values('id', 'name').distinct()))
@action(methods=['post'], detail=False, perms_map={'post': 'handover.create'}, serializer_class=GenHandoverWmSerializer) @action(methods=['post'], detail=False, perms_map={'post': 'handover.create'}, serializer_class=GenHandoverWmSerializer, requires_transaction=True)
@transaction.atomic
def gen_by_wm(self, request): def gen_by_wm(self, request):
"""从车间库存生成交接记录(废弃) """从车间库存生成交接记录(废弃)
@ -632,8 +604,7 @@ class HandoverViewSet(CustomModelViewSet):
) )
return Response({'handover': handover.id}) return Response({'handover': handover.id})
@action(methods=['post'], detail=False, perms_map={'post': 'handover.create'}, serializer_class=GenHandoverSerializer) @action(methods=['post'], detail=False, perms_map={'post': 'handover.create'}, serializer_class=GenHandoverSerializer, requires_transaction=True)
@transaction.atomic
def gen_by_mlog(self, request): def gen_by_mlog(self, request):
"""从生产日志生成交接记录(废弃) """从生产日志生成交接记录(废弃)
@ -708,7 +679,6 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust
serializer_class = MlogbInSerializer serializer_class = MlogbInSerializer
update_serializer_class = MlogbInUpdateSerializer update_serializer_class = MlogbInUpdateSerializer
@transaction.atomic
def perform_destroy(self, instance): def perform_destroy(self, instance):
ins: Mlogb = instance ins: Mlogb = instance
if ins.mlog.submit_time is not None: if ins.mlog.submit_time is not None:
@ -716,7 +686,6 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust
ins.delete() ins.delete()
ins.mlog.cal_mlog_count_from_mlogb() ins.mlog.cal_mlog_count_from_mlogb()
@transaction.atomic
def perform_update(self, serializer): def perform_update(self, serializer):
ins:Mlogb = serializer.save() ins:Mlogb = serializer.save()
ins.mlog.cal_mlog_count_from_mlogb() ins.mlog.cal_mlog_count_from_mlogb()
@ -883,7 +852,7 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust
raise ParseError("不支持生成产出物料!") raise ParseError("不支持生成产出物料!")
mlog.cal_mlog_count_from_mlogb() mlog.cal_mlog_count_from_mlogb()
@transaction.atomic
def perform_create(self, serializer): def perform_create(self, serializer):
mlogbin: Mlogb = serializer.save() mlogbin: Mlogb = serializer.save()
MlogbInViewSet.p_create_after(mlogbin) MlogbInViewSet.p_create_after(mlogbin)
@ -925,7 +894,6 @@ class MlogbOutViewSet(UpdateModelMixin, CustomGenericViewSet):
queryset = Mlogb.objects.filter(material_out__isnull=False) queryset = Mlogb.objects.filter(material_out__isnull=False)
serializer_class = MlogbOutUpdateSerializer serializer_class = MlogbOutUpdateSerializer
@transaction.atomic
def perform_update(self, serializer): def perform_update(self, serializer):
material_out = serializer.validated_data.get('material_out') material_out = serializer.validated_data.get('material_out')
if material_out and material_out.tracking == Material.MA_TRACKING_SINGLE: if material_out and material_out.tracking == Material.MA_TRACKING_SINGLE:
@ -985,7 +953,6 @@ class MlogbwViewSet(CustomModelViewSet):
# raise ParseError('请指定所属消耗/产出明细') # raise ParseError('请指定所属消耗/产出明细')
# return super().filter_queryset(queryset) # return super().filter_queryset(queryset)
@transaction.atomic
def perform_create(self, serializer): def perform_create(self, serializer):
ins:Mlogbw = serializer.save() ins:Mlogbw = serializer.save()
mlog:Mlog = None mlog:Mlog = None
@ -1061,7 +1028,6 @@ class MlogbwViewSet(CustomModelViewSet):
raise ParseError("该个号不可产生该批") raise ParseError("该个号不可产生该批")
mlog.cal_mlog_count_from_mlogb() mlog.cal_mlog_count_from_mlogb()
@transaction.atomic
def perform_update(self, serializer): def perform_update(self, serializer):
mlogbw = serializer.save() mlogbw = serializer.save()
if isinstance(mlogbw, list): if isinstance(mlogbw, list):
@ -1079,7 +1045,6 @@ class MlogbwViewSet(CustomModelViewSet):
mlog = mlogb.mlog mlog = mlogb.mlog
mlog.cal_mlog_count_from_mlogb() mlog.cal_mlog_count_from_mlogb()
@transaction.atomic
def perform_destroy(self, instance:Mlogbw): def perform_destroy(self, instance:Mlogbw):
mlogb:Mlogb = instance.mlogb mlogb:Mlogb = instance.mlogb
if mlogb.material_out is not None and instance.wpr is not None: if mlogb.material_out is not None and instance.wpr is not None:
@ -1109,8 +1074,7 @@ class MlogbwViewSet(CustomModelViewSet):
mlog = mlogb.mlog mlog = mlogb.mlog
mlog.cal_mlog_count_from_mlogb() mlog.cal_mlog_count_from_mlogb()
@action(methods=['post'], detail=False, perms_map={'post': 'mlog.update'}, serializer_class=MlogbwStartTestSerializer) @action(methods=['post'], detail=False, perms_map={'post': 'mlog.update'}, serializer_class=MlogbwStartTestSerializer, requires_transaction=True)
@transaction.atomic
def start_test(self, request, *args, **kwargs): def start_test(self, request, *args, **kwargs):
sr = MlogbwStartTestSerializer(data=request.data) sr = MlogbwStartTestSerializer(data=request.data)
sr.is_valid(raise_exception=True) sr.is_valid(raise_exception=True)
@ -1143,8 +1107,7 @@ class BatchLogViewSet(ListModelMixin, CustomGenericViewSet):
serializer_class = BatchLogSerializer serializer_class = BatchLogSerializer
select_related_fields = ["source", "target"] select_related_fields = ["source", "target"]
@action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=Serializer) @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=Serializer, requires_transaction=True)
@transaction.atomic
def dag(self, request): def dag(self, request):
""" """
获取该批次的DAG图数据 获取该批次的DAG图数据

View File

@ -97,8 +97,7 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu
return Response({"number_out_last": None}) return Response({"number_out_last": None})
@action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=WproutListSerializer) @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=WproutListSerializer, requires_transaction=True)
@transaction.atomic
def assgin_number_out(self, request, *args, **kwargs): def assgin_number_out(self, request, *args, **kwargs):
"""分配出库对外编号 """分配出库对外编号