diff --git a/apps/mtm/serializers.py b/apps/mtm/serializers.py index 049c0fa3..fed32f54 100644 --- a/apps/mtm/serializers.py +++ b/apps/mtm/serializers.py @@ -329,4 +329,10 @@ class RouteMatSerializer(CustomModelSerializer): class Meta: model = RouteMat fields = "__all__" - read_only_fields = EXCLUDE_FIELDS_BASE \ No newline at end of file + read_only_fields = EXCLUDE_FIELDS_BASE + + +class MaterialExportSerializer(CustomModelSerializer): + class Meta: + model = Material + fields = ["id", "number", "name", "specfication", "unit", "bin_number_main", "cate", "count_safe", "unit_price"] \ No newline at end of file diff --git a/apps/mtm/views.py b/apps/mtm/views.py index f942419a..803a1a05 100644 --- a/apps/mtm/views.py +++ b/apps/mtm/views.py @@ -11,7 +11,7 @@ from apps.mtm.serializers import (GoalSerializer, MaterialSerializer, MgroupGoalYearSerializer, MgroupSerializer, MgroupDaysSerializer, ShiftSerializer, TeamSerializer, ProcessSerializer, RouteSerializer, TeamMemberSerializer, RoutePackSerializer, - SruleSerializer, RouteMatSerializer, RoutePackCopySerializer) + SruleSerializer, RouteMatSerializer, RoutePackCopySerializer, MaterialExportSerializer) from apps.mtm.services import get_mgroup_goals, daoru_material, get_mgroup_days from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin, CustomListModelMixin @@ -21,6 +21,8 @@ from django.db.models import Q from apps.wf.models import Ticket from django.utils import timezone from rest_framework.permissions import IsAdminUser +from apps.utils.export import export_excel +from operator import itemgetter # Create your views here. class MaterialViewSet(CustomModelViewSet): @@ -32,7 +34,7 @@ class MaterialViewSet(CustomModelViewSet): queryset = Material.objects.all() serializer_class = MaterialSerializer filterset_class = MaterialFilter - search_fields = ['name', 'code', 'number', 'specification', 'model'] + search_fields = ['name', 'code', 'number', 'specification', 'model', 'bin_number_main'] select_related_fields = ['process'] ordering = ['name', 'model', 'specification', 'type', 'process', 'process__sort', 'sort', 'id', 'number'] @@ -88,6 +90,23 @@ class MaterialViewSet(CustomModelViewSet): def cates(self, request, *args, **kwargs): res = Material.objects.exclude(cate='').exclude(cate=None).values_list('cate', flat=True).distinct() return Response(set(res)) + + @action(methods=['get'], detail=False, perms_map={'get': '*'}) + def export_excel(self, request, pk=None): + """导出excel + 导出excel + """ + field_data = ['大类', '物料编号', '名称', '规格', '型号', '计量单位', '仓库位号', "安全库存", "单价"] + queryset = self.filter_queryset(self.get_queryset()) + if queryset.count() > 1000: + raise ParseError('数据量超过1000,请筛选后导出') + odata = MaterialExportSerializer(queryset, many=True).data + # 处理数据 + field_keys = ['cate', 'number', 'name', 'specification', 'model', 'unit', + 'bin_number_main', 'count_safe', 'unit_price'] + getter = itemgetter(*field_keys) + data = [list(getter(item)) for item in odata] + return Response({'path': export_excel(field_data, data, '物料清单')}) class ShiftViewSet(ListModelMixin, CustomGenericViewSet): """