feat: cal_material_count 重构

This commit is contained in:
caoqianming 2024-07-04 16:23:28 +08:00
parent 511b149290
commit 92903e7014
4 changed files with 49 additions and 36 deletions

View File

@ -7,29 +7,19 @@ from apps.mtm.models import Material, Process
from apps.utils.tools import ranstr from apps.utils.tools import ranstr
from apps.system.models import Dept from apps.system.models import Dept
from apps.utils.thread import MyThread 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: 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 @classmethod
def update_inm(cls, instance: MIO, is_reverse: bool = False): def update_inm(cls, instance: MIO, is_reverse: bool = False):
""" """
@ -65,10 +55,6 @@ class InmService:
do_out(instance) do_out(instance)
else: else:
raise ParseError('不支持该出入库操作') 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 @classmethod

View File

@ -169,7 +169,6 @@ class MIOViewSet(CustomModelViewSet):
return super().perform_destroy(instance) return super().perform_destroy(instance)
@action(methods=['post'], detail=True, perms_map={'post': 'mio.submit'}, serializer_class=serializers.Serializer) @action(methods=['post'], detail=True, perms_map={'post': 'mio.submit'}, serializer_class=serializers.Serializer)
@transaction.atomic
def submit(self, request, *args, **kwargs): def submit(self, request, *args, **kwargs):
"""提交 """提交
@ -180,15 +179,17 @@ class MIOViewSet(CustomModelViewSet):
raise ParseError('出入库日期未填写') raise ParseError('出入库日期未填写')
if ins.state != MIO.MIO_CREATE: if ins.state != MIO.MIO_CREATE:
raise ParseError('记录状态异常') raise ParseError('记录状态异常')
ins.submit_time = timezone.now() with transaction.atomic():
ins.state = MIO.MIO_SUBMITED ins.submit_time = timezone.now()
ins.submit_user = request.user ins.state = MIO.MIO_SUBMITED
ins.save() ins.submit_user = request.user
InmService.update_inm(ins) ins.update_by = request.user
ins.save()
InmService.update_inm(ins)
InmService.update_material_count(ins)
return Response(MIOListSerializer(instance=ins).data) return Response(MIOListSerializer(instance=ins).data)
@action(methods=['post'], detail=True, perms_map={'post': 'mio.submit'}, serializer_class=serializers.Serializer) @action(methods=['post'], detail=True, perms_map={'post': 'mio.submit'}, serializer_class=serializers.Serializer)
@transaction.atomic
def revert(self, request, *args, **kwargs): def revert(self, request, *args, **kwargs):
"""撤回 """撤回
@ -200,10 +201,13 @@ class MIOViewSet(CustomModelViewSet):
raise ParseError('记录状态异常') raise ParseError('记录状态异常')
if ins.submit_user != user: if ins.submit_user != user:
raise ParseError('非提交人不可撤回') raise ParseError('非提交人不可撤回')
ins.submit_time = None with transaction.atomic():
ins.state = MIO.MIO_CREATE ins.submit_time = None
ins.save() ins.state = MIO.MIO_CREATE
InmService.update_inm(ins, is_reverse=True) ins.update_by = user
ins.save()
InmService.update_inm(ins, is_reverse=True)
InmService.update_material_count(ins)
return Response() return Response()

View File

@ -132,6 +132,7 @@ class ProcessSerializer(CustomModelSerializer):
class RoutePackSerializer(CustomModelSerializer): class RoutePackSerializer(CustomModelSerializer):
material_name = serializers.StringRelatedField( material_name = serializers.StringRelatedField(
source='material', read_only=True) source='material', read_only=True)
create_by_name = serializers.CharField(source='create_by.name', read_only=True)
ticket_ = TicketSimpleSerializer(source='ticket', read_only=True) ticket_ = TicketSimpleSerializer(source='ticket', read_only=True)
class Meta: class Meta:
model = RoutePack model = RoutePack

View File

@ -9,7 +9,29 @@ from apps.wpm.models import StLog
from apps.wpm.services import get_sflog from apps.wpm.services import get_sflog
from apps.wpm.tasks import cal_exp_duration_sec from apps.wpm.tasks import cal_exp_duration_sec
from apps.wf.models import Ticket 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): def get_mgroup_goals(mgroupId, year, reload=False):
""" """