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 model = Mlogb
fields = '__all__' 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): class MlogSerializer(CustomModelSerializer):
mstate_json = serializers.JSONField(source='mgroup.process.mstate_json', read_only=True) mstate_json = serializers.JSONField(source='mgroup.process.mstate_json', read_only=True)
supplier_name = serializers.CharField(source='supplier.name', 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, AttLogSerializer, OtherLogSerializer, MlogInitSerializer, MlogChangeSerializer,
MlogbDetailSerializer, MlogbInSerializer, MlogbInUpdateSerializer, MlogbDetailSerializer, MlogbInSerializer, MlogbInUpdateSerializer,
MlogbOutUpdateSerializer, FmlogSerializer, FmlogUpdateSerializer, BatchStSerializer, MlogbOutUpdateSerializer, FmlogSerializer, FmlogUpdateSerializer, BatchStSerializer,
MlogbwCreateUpdateSerializer, HandoverMgroupSerializer) MlogbwCreateUpdateSerializer, HandoverMgroupSerializer, MlogListSerializer, MlogbSerializer)
from .services import mlog_submit, handover_submit, mlog_revert from .services import mlog_submit, handover_submit, mlog_revert
from apps.wpm.services import mlog_submit_validate, generate_new_batch from apps.wpm.services import mlog_submit_validate, generate_new_batch
from apps.wf.models import State from apps.wf.models import State
@ -167,6 +167,7 @@ class MlogViewSet(CustomModelViewSet):
""" """
queryset = Mlog.objects.all() queryset = Mlog.objects.all()
serializer_class = MlogSerializer serializer_class = MlogSerializer
list_serializer_class = MlogListSerializer
select_related_fields = ['create_by', 'update_by', 'mtask', 'mtaskb', select_related_fields = ['create_by', 'update_by', 'mtask', 'mtaskb',
'handle_user', 'handle_user_2', 'equipment', 'mgroup__belong_dept', 'handle_user', 'handle_user_2', 'equipment', 'mgroup__belong_dept',
'equipment_2', 'material_in', 'material_out', 'route__routepack', '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_in__number', 'material_in__specification', 'batch', 'material_in__model',
'material_out__name', 'material_out__number', 'material_out__specification', 'material_out__model',] 'material_out__name', 'material_out__number', 'material_out__specification', 'material_out__model',]
# @transaction.atomic def add_info_for_list(self, data):
# def perform_create(self, serializer): data_dict = {item['id']: {**item, "mlogb_full": [], "mlogb": []} for item in data}
# ins = serializer.save() mlogb_qs = Mlogb.objects.filter(mlog__id__in=data_dict.keys()).select_related("material_in", "material_out").order_by("create_time")
# data = MlogSerializer(ins).data mlogb_data = MlogbSerializer(instance=mlogb_qs, many=True).data
# create_auditlog('create', ins, 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 @transaction.atomic
def perform_destroy(self, instance): def perform_destroy(self, instance):
@ -653,7 +661,7 @@ class MlogbwViewSet(CustomModelViewSet):
queryset = Mlogbw.objects.all() queryset = Mlogbw.objects.all()
serializer_class = MlogbwCreateUpdateSerializer serializer_class = MlogbwCreateUpdateSerializer
filterset_fields = ['mlogb'] filterset_fields = ['mlogb']
ordering = ["number"] ordering = ["number", "create_time"]
ordering_fields = ["number", "create_time"] ordering_fields = ["number", "create_time"]
def filter_queryset(self, queryset): def filter_queryset(self, queryset):