feat: 多个app优化事务处理

This commit is contained in:
caoqianming 2025-09-17 12:50:19 +08:00
parent 694dca27cc
commit 94f87df707
10 changed files with 169 additions and 185 deletions

View File

@ -45,7 +45,6 @@ class MIOItemwCreateUpdateSerializer(CustomModelSerializer):
ftest_sr.update(instance=ftest, validated_data=ftest_data)
return mioitemw
@transaction.atomic
def create(self, validated_data):
wpr: Wpr = validated_data.get("wpr", None)
if wpr:
@ -58,7 +57,6 @@ class MIOItemwCreateUpdateSerializer(CustomModelSerializer):
mioitemw = self.save_ftest(mioitemw, ftest_data)
return mioitemw
@transaction.atomic
def update(self, instance, validated_data):
validated_data.pop("mioitem")
ftest_data = validated_data.pop("ftest", None)

View File

@ -246,7 +246,7 @@ class RouteSerializer(CustomModelSerializer):
# material = validated_data.get('material', None)
# if material and process and Route.objects.filter(material=material, process=process).exists():
# raise ValidationError('已选择该工序!!')
with transaction.atomic():
instance:Route = super().create(validated_data)
material_out = instance.material_out
if material_out:
@ -281,7 +281,7 @@ class RouteSerializer(CustomModelSerializer):
material_out_tracking = validated_data.pop("material_out_tracking", Material.MA_TRACKING_BATCH)
if material_out_tracking is None:
material_out_tracking = Material.MA_TRACKING_BATCH
with transaction.atomic():
instance = super().update(instance, validated_data)
material_out = instance.material_out
if material_out:

View File

@ -41,7 +41,6 @@ class MaterialViewSet(CustomModelViewSet):
ordering_fields = ['name', 'model', 'specification',
'type', 'process', 'process__sort', 'sort', 'id', 'number']
@transaction.atomic
def perform_destroy(self, instance):
from apps.inm.models import MaterialBatch
if MaterialBatch.objects.filter(material=instance).exists():
@ -368,9 +367,8 @@ class RouteViewSet(CustomModelViewSet):
select_related_fields = ['material',
'process', 'material_in', 'material_out', 'mgroup', 'routepack']
@transaction.atomic
def perform_update(self, serializer):
ins:Route = self.get_object()
ins:Route = serializer.instance
if ins.from_route is not None:
raise ParseError('该工艺步骤引用其他步骤, 无法编辑')
old_m_in, old_m_out, process = ins.material_in, ins.material_out, ins.process

View File

@ -31,7 +31,6 @@ class UtaskSerializer(CustomModelSerializer):
"priority": {"required": False, "allow_null": True},
}
@transaction.atomic
def create(self, validated_data):
if not validated_data.get('number', None):
validated_data["number"] = Utask.get_a_number()

View File

@ -43,7 +43,6 @@ class PuPlanItemSerializer(CustomModelSerializer):
fields = '__all__'
read_only_fields = EXCLUDE_FIELDS + ['pu_order']
@transaction.atomic
def create(self, validated_data):
pu_plan = validated_data['pu_plan']
if pu_plan.state != PuPlan.PUPLAN_CREATE:
@ -65,7 +64,6 @@ class PuPlanItemSerializer(CustomModelSerializer):
else:
validated_data['belong_dept'] = belong_dept
@transaction.atomic
def update(self, instance, validated_data):
validated_data.pop('pu_plan')
pu_plan = instance.pu_plan
@ -114,7 +112,6 @@ class PuOrderItemSerializer(CustomModelSerializer):
fields = '__all__'
read_only_fields = EXCLUDE_FIELDS_BASE + ['delivered_count']
@transaction.atomic
def create(self, validated_data):
pu_order = validated_data['pu_order']
material = validated_data['material']
@ -126,7 +123,6 @@ class PuOrderItemSerializer(CustomModelSerializer):
PumService.cal_pu_order_total_price(pu_order)
return ins
@transaction.atomic
def update(self, instance, validated_data):
validated_data.pop('material')
validated_data.pop('pu_order')

View File

@ -80,7 +80,6 @@ class PuPlanItemViewSet(CustomModelViewSet):
ordering_fields = ['create_time', 'material', 'need_date', 'need_count']
ordering = ['create_time']
@transaction.atomic
def perform_destroy(self, instance):
user = self.request.user
pu_plan = instance.pu_plan
@ -104,7 +103,6 @@ class PuOrderViewSet(CustomModelViewSet):
search_fields = ['number', 'supplier__name', 'item_puorder__material__name', 'item_puorder__material__specification', 'item_puorder__material__model']
select_related_fields = ['create_by', 'update_by', 'supplier']
@transaction.atomic
def perform_destroy(self, instance):
if instance.state != PuOrder.PUORDER_CREATE:
raise ParseError('采购订单非创建中不可删除')
@ -145,7 +143,6 @@ class PuOrderItemViewSet(CustomModelViewSet):
filterset_fields = ['material', 'pu_order']
ordering = ['create_time']
@transaction.atomic
def perform_destroy(self, instance):
pu_order = instance.pu_order
if pu_order.state != PuOrder.PUORDER_CREATE:

View File

@ -353,7 +353,6 @@ class Ftest(CommonBDModel):
@classmethod
def init_by_qct(cls, qct, test_user, test_date):
with transaction.atomic():
ftest = Ftest.objects.create(qct=qct, test_user=test_user, test_date=test_date)
for testitem in qct.testitems.all():
FtestItem.objects.create(ftest=ftest, testitem=testitem)

View File

@ -215,7 +215,6 @@ class FtestWorkCreateUpdateSerializer(CustomModelSerializer):
def create(self, validated_data):
ftestworkdefect = validated_data.pop("ftestworkdefect", [])
with transaction.atomic():
ins: FtestWork = super().create(validated_data)
for ftestworkdefect in ftestworkdefect:
if ftestworkdefect['count'] > 0:
@ -227,7 +226,7 @@ class FtestWorkCreateUpdateSerializer(CustomModelSerializer):
def update(self, instance, validated_data):
ftestworkdefect = validated_data.pop("ftestworkdefect", [])
ins:FtestWork = super().update(instance, validated_data)
with transaction.atomic():
fd_ids = []
for item in ftestworkdefect:
if item["count"] > 0:
@ -292,7 +291,7 @@ class FtestSerializer(CustomModelSerializer):
def create(self, validated_data):
ftestitems = validated_data.pop('ftestitems', [])
with transaction.atomic():
instance = super().create(validated_data)
for item in ftestitems:
FtestItem.objects.create(ftest=instance, **item)
@ -301,7 +300,7 @@ class FtestSerializer(CustomModelSerializer):
def update(self, instance, validated_data):
validated_data.pop('ftest_work', None)
ftestitems = validated_data.pop('ftestitems', [])
with transaction.atomic():
instance = super().update(instance, validated_data)
for item in ftestitems:
id = item.get('id', None)
@ -364,7 +363,7 @@ class FtestProcessSerializer(CustomModelSerializer):
def create(self, validated_data):
ftestitems = validated_data.pop('ftestitems', [])
ftestdefects = validated_data.pop('ftestdefects', [])
with transaction.atomic():
instance = super().create(validated_data)
for item in ftestitems:
FtestItem.objects.create(ftest=instance, **item)
@ -393,7 +392,7 @@ class FtestProcessSerializer(CustomModelSerializer):
def update(self, instance, validated_data):
ftestitems = validated_data.pop('ftestitems', [])
ftestdefects = validated_data.pop('ftestdefects', [])
with transaction.atomic():
instance = super().update(instance, validated_data)
for item in ftestitems:
try:

View File

@ -33,7 +33,6 @@ class DefectViewSet(CustomModelViewSet):
filterset_fields = ["cate", "okcate"]
search_fields = ["name", "code"]
@transaction.atomic
def perform_destroy(self, instance):
QctDefect.objects.filter(defect=instance).delete()
instance.delete()
@ -93,7 +92,6 @@ class QctDefectViewSet(CustomModelViewSet):
filterset_fields = ["qct", "defect"]
ordering = ["qct", "sort"]
@transaction.atomic
def perform_create(self, serializer):
ins: QctDefect = serializer.save()
if ins.is_default:
@ -151,7 +149,6 @@ class TestItemViewSet(CustomModelViewSet):
item["affects_name"] = ";".join([affects_dict.get(x, '未知') for x in affects])
return data
@transaction.atomic
def perform_destroy(self, instance):
QctTestItem.objects.filter(testitem=instance).delete()
instance.delete()
@ -238,19 +235,16 @@ class FtestViewSet(CustomModelViewSet):
ftest_work.count_notok = all_count - ok_count
ftest_work.save()
@transaction.atomic
def perform_create(self, serializer):
ins: Ftest = serializer.save()
if ins.ftest_work:
self.count_sampling(ins.ftest_work)
@transaction.atomic
def perform_update(self, serializer):
ins: Ftest = serializer.save()
if ins.ftest_work:
self.count_sampling(ins.ftest_work)
@transaction.atomic
def perform_destroy(self, instance):
ftest_work = instance.ftest_work
instance.delete()
@ -284,27 +278,32 @@ class FtestWorkViewSet(CustomModelViewSet):
select_related_fields = ['material', 'mb', 'mb__material']
filterset_class = FtestWorkFilter
@transaction.atomic
def update(self, request, *args, **kwargs):
ins:FtestWork = self.get_object()
partial = kwargs.pop('partial', False)
if ins.submit_time is not None:
raise ParseError('已提交无法修改')
if ins.ticket and ins.ticket.state.type != State.STATE_TYPE_START:
raise ParseError('审批单已进行,无法修改')
x = super().update(request, *args, **kwargs)
serializer = self.get_serializer(ins, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
# 触发批次统计分析
ana_batch_thread(xbatchs=[ins.batch])
return x
return Response(serializer.data)
@transaction.atomic
def destroy(self, request, *args, **kwargs):
ins:FtestWork = self.get_object()
if ins.submit_time is not None:
raise ParseError('已提交无法删除')
if ins.ticket:
raise ParseError('存在审批, 无法删除')
x = super().destroy(request, *args, **kwargs)
self.perform_destroy(ins)
# 触发批次统计分析
ana_batch_thread(xbatchs=[ins.batch])
return x
return Response(status=204)
def perform_create(self, serializer):
ins = serializer.save()

View File

@ -65,7 +65,6 @@ class OrderViewSet(CustomModelViewSet):
"state": ["exact", "in"],
}
@transaction.atomic
def perform_destroy(self, instance):
if instance.state != Order.ORDER_CREATE:
raise ParseError('订单非创建中不可删除')