From 92903e7014a6f156c9fe7e671fea4820afeb017f Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 4 Jul 2024 16:23:28 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20cal=5Fmaterial=5Fcount=20=E9=87=8D?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/inm/services.py | 36 +++++++++++------------------------- apps/inm/views.py | 26 +++++++++++++++----------- apps/mtm/serializers.py | 1 + apps/mtm/services.py | 22 ++++++++++++++++++++++ 4 files changed, 49 insertions(+), 36 deletions(-) diff --git a/apps/inm/services.py b/apps/inm/services.py index b5b643c5..d2dcd554 100644 --- a/apps/inm/services.py +++ b/apps/inm/services.py @@ -7,29 +7,19 @@ from apps.mtm.models import Material, Process from apps.utils.tools import ranstr from apps.system.models import Dept from apps.utils.thread import MyThread +from apps.mtm.services import cal_material_count -def cal_material_count(materialId_list: list = []): - """ - 计算物料总数量 - """ - from apps.inm.models import MaterialBatch - from apps.wpm.models import WMaterial - if materialId_list: - objs = Material.objects.filter(id__in=set(materialId_list)) - else: - objs = Material.objects.all() - for material in objs: - mb_count = MaterialBatch.objects.filter(material=material).aggregate(total=Sum("count"))["total"] - wm_count = WMaterial.objects.filter(material=material).aggregate(total=Sum("count"))["total"] - if mb_count is None: - mb_count = 0 - if wm_count is None: - wm_count = 0 - Material.objects.filter(id=material.id).update( - count_wm=wm_count, - count_mb=mb_count, - count=mb_count + wm_count) class InmService: + + @classmethod + def update_material_count(cls, instance: MIO): + """ + 更新物料数量 + """ + # 统计物料数量 + m_ids = MIOItem.objects.filter(mio=instance).values_list('material_id', flat=True) + MyThread(target=cal_material_count, args=(m_ids, ), daemon=True, log_err=True).start() + @classmethod def update_inm(cls, instance: MIO, is_reverse: bool = False): """ @@ -65,10 +55,6 @@ class InmService: do_out(instance) else: raise ParseError('不支持该出入库操作') - - # 统计物料数量 - m_ids = MIOItem.objects.filter(mio=instance).values_list('material_id', flat=True) - MyThread(target=cal_material_count, args=(m_ids, ), daemon=True, log_err=True).start() @classmethod diff --git a/apps/inm/views.py b/apps/inm/views.py index e9a210b4..cd350753 100644 --- a/apps/inm/views.py +++ b/apps/inm/views.py @@ -169,7 +169,6 @@ class MIOViewSet(CustomModelViewSet): return super().perform_destroy(instance) @action(methods=['post'], detail=True, perms_map={'post': 'mio.submit'}, serializer_class=serializers.Serializer) - @transaction.atomic def submit(self, request, *args, **kwargs): """提交 @@ -180,15 +179,17 @@ class MIOViewSet(CustomModelViewSet): raise ParseError('出入库日期未填写') if ins.state != MIO.MIO_CREATE: raise ParseError('记录状态异常') - ins.submit_time = timezone.now() - ins.state = MIO.MIO_SUBMITED - ins.submit_user = request.user - ins.save() - InmService.update_inm(ins) + with transaction.atomic(): + ins.submit_time = timezone.now() + ins.state = MIO.MIO_SUBMITED + ins.submit_user = request.user + ins.update_by = request.user + ins.save() + InmService.update_inm(ins) + InmService.update_material_count(ins) return Response(MIOListSerializer(instance=ins).data) @action(methods=['post'], detail=True, perms_map={'post': 'mio.submit'}, serializer_class=serializers.Serializer) - @transaction.atomic def revert(self, request, *args, **kwargs): """撤回 @@ -200,10 +201,13 @@ class MIOViewSet(CustomModelViewSet): raise ParseError('记录状态异常') if ins.submit_user != user: raise ParseError('非提交人不可撤回') - ins.submit_time = None - ins.state = MIO.MIO_CREATE - ins.save() - InmService.update_inm(ins, is_reverse=True) + with transaction.atomic(): + ins.submit_time = None + ins.state = MIO.MIO_CREATE + ins.update_by = user + ins.save() + InmService.update_inm(ins, is_reverse=True) + InmService.update_material_count(ins) return Response() diff --git a/apps/mtm/serializers.py b/apps/mtm/serializers.py index 3c4df543..3807d4f2 100644 --- a/apps/mtm/serializers.py +++ b/apps/mtm/serializers.py @@ -132,6 +132,7 @@ class ProcessSerializer(CustomModelSerializer): class RoutePackSerializer(CustomModelSerializer): material_name = serializers.StringRelatedField( source='material', read_only=True) + create_by_name = serializers.CharField(source='create_by.name', read_only=True) ticket_ = TicketSimpleSerializer(source='ticket', read_only=True) class Meta: model = RoutePack diff --git a/apps/mtm/services.py b/apps/mtm/services.py index 74d812a6..ac1da91c 100644 --- a/apps/mtm/services.py +++ b/apps/mtm/services.py @@ -9,7 +9,29 @@ from apps.wpm.models import StLog from apps.wpm.services import get_sflog from apps.wpm.tasks import cal_exp_duration_sec from apps.wf.models import Ticket +from django.db.models import Sum +def cal_material_count(materialId_list: list = []): + """ + 计算物料总数量 + """ + from apps.inm.models import MaterialBatch + from apps.wpm.models import WMaterial + if materialId_list: + objs = Material.objects.filter(id__in=set(materialId_list)) + else: + objs = Material.objects.all() + for material in objs: + mb_count = MaterialBatch.objects.filter(material=material).aggregate(total=Sum("count"))["total"] + wm_count = WMaterial.objects.filter(material=material).aggregate(total=Sum("count"))["total"] + if mb_count is None: + mb_count = 0 + if wm_count is None: + wm_count = 0 + Material.objects.filter(id=material.id).update( + count_wm=wm_count, + count_mb=mb_count, + count=mb_count + wm_count) def get_mgroup_goals(mgroupId, year, reload=False): """