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.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

View File

@ -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()

View File

@ -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

View File

@ -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):
"""