perf: 优化mlog list速度

This commit is contained in:
caoqianming 2025-02-25 16:33:54 +08:00
parent 571e11cc8c
commit 6653befcdb
2 changed files with 59 additions and 7 deletions

View File

@ -225,6 +225,50 @@ class MlogbDetailSerializer(CustomModelSerializer):
model = Mlogb
fields = '__all__'
class MlogListSerializer(CustomModelSerializer):
mstate_json = serializers.JSONField(source='mgroup.process.mstate_json', read_only=True)
supplier_name = serializers.CharField(source='supplier.name', read_only=True)
routepack_name = serializers.CharField(source='route.routepack.name', read_only=True)
belong_dept = serializers.CharField(
source='mgroup.belong_dept.id', read_only=True)
belong_dept_name = serializers.CharField(
source='mgroup.belong_dept.name', read_only=True)
mgroup_name = serializers.CharField(
source='mgroup.name', read_only=True)
mtask_count = serializers.IntegerField(
source='mtask.count', read_only=True)
create_by_name = serializers.CharField(
source='create_by.name', read_only=True)
update_by_name = serializers.CharField(
source='update_by.name', read_only=True)
material_in_ = MaterialSimpleSerializer(
source='material_in', read_only=True)
material_out_ = MaterialSimpleSerializer(
source='material_out', read_only=True)
material_out_name = serializers.StringRelatedField(
source='material_out', read_only=True)
material_in_name = serializers.StringRelatedField(
source='material_in', read_only=True)
handle_user_name = serializers.CharField(
source='handle_user.name', read_only=True)
handle_user_2_name = serializers.CharField(
source='handle_user_2.name', read_only=True)
handle_leader_name = serializers.CharField(
source='handle_leader.name', read_only=True)
equipment_name = serializers.StringRelatedField(
source='equipment', read_only=True)
equipment_2_name = serializers.StringRelatedField(
source='equipment_2', read_only=True)
shift_name = serializers.CharField(source='shift.name', read_only=True)
ticket_ = TicketSimpleSerializer(source='ticket', read_only=True)
test_user_name = serializers.CharField(source='test_user.name', read_only=True)
handle_users_ = UserSimpleSerializer(
source='handle_users', many=True, read_only=True)
class Meta:
model = Mlog
fields = '__all__'
class MlogSerializer(CustomModelSerializer):
mstate_json = serializers.JSONField(source='mgroup.process.mstate_json', read_only=True)
supplier_name = serializers.CharField(source='supplier.name', read_only=True)

View File

@ -25,7 +25,7 @@ from .serializers import (SflogExpSerializer, SfLogSerializer, StLogSerializer,
AttLogSerializer, OtherLogSerializer, MlogInitSerializer, MlogChangeSerializer,
MlogbDetailSerializer, MlogbInSerializer, MlogbInUpdateSerializer,
MlogbOutUpdateSerializer, FmlogSerializer, FmlogUpdateSerializer, BatchStSerializer,
MlogbwCreateUpdateSerializer, HandoverMgroupSerializer)
MlogbwCreateUpdateSerializer, HandoverMgroupSerializer, MlogListSerializer, MlogbSerializer)
from .services import mlog_submit, handover_submit, mlog_revert
from apps.wpm.services import mlog_submit_validate, generate_new_batch
from apps.wf.models import State
@ -167,6 +167,7 @@ class MlogViewSet(CustomModelViewSet):
"""
queryset = Mlog.objects.all()
serializer_class = MlogSerializer
list_serializer_class = MlogListSerializer
select_related_fields = ['create_by', 'update_by', 'mtask', 'mtaskb',
'handle_user', 'handle_user_2', 'equipment', 'mgroup__belong_dept',
'equipment_2', 'material_in', 'material_out', 'route__routepack',
@ -178,11 +179,18 @@ class MlogViewSet(CustomModelViewSet):
'material_in__number', 'material_in__specification', 'batch', 'material_in__model',
'material_out__name', 'material_out__number', 'material_out__specification', 'material_out__model',]
# @transaction.atomic
# def perform_create(self, serializer):
# ins = serializer.save()
# data = MlogSerializer(ins).data
# create_auditlog('create', ins, data)
def add_info_for_list(self, data):
data_dict = {item['id']: {**item, "mlogb_full": [], "mlogb": []} for item in data}
mlogb_qs = Mlogb.objects.filter(mlog__id__in=data_dict.keys()).select_related("material_in", "material_out").order_by("create_time")
mlogb_data = MlogbSerializer(instance=mlogb_qs, many=True).data
for item in mlogb_data:
item_dict = dict(item)
mlog_id = item_dict.get("mlog")
if mlog_id in data_dict:
data_dict[mlog_id]["mlogb_full"].append(item_dict)
if item.get("material_out"):
data_dict[mlog_id]["mlogb"].append(item_dict)
return list(data_dict.values())
@transaction.atomic
def perform_destroy(self, instance):
@ -653,7 +661,7 @@ class MlogbwViewSet(CustomModelViewSet):
queryset = Mlogbw.objects.all()
serializer_class = MlogbwCreateUpdateSerializer
filterset_fields = ['mlogb']
ordering = ["number"]
ordering = ["number", "create_time"]
ordering_fields = ["number", "create_time"]
def filter_queryset(self, queryset):