| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030 |
- from rest_framework import viewsets
- from utils.page import MyPageNumberPagination
- from utils.md5 import Md5
- from rest_framework.filters import OrderingFilter
- from django_filters.rest_framework import DjangoFilterBackend
- from rest_framework.response import Response
- from rest_framework.exceptions import APIException
- from django.http import StreamingHttpResponse
- from rest_framework.settings import api_settings
- from django.db import transaction
- from rest_framework import status
- from reportcenter.models import flowModel as flowlist
- from .models import bigScreenModel
- from bound.models import BoundBatchModel
- from . import serializers
- from .filter import FlowFilter, MaterialChangeHistoryFilter, batchLogFilter, ContainerDetailLogFilter,bigScreenFilter,batchfilter
- from .files import FileFlowListRenderCN, MaterialChangeHistoryRenderCN, batchLogRenderCN, ContainerDetailLogRenderCN,FileBatchListRenderCN
- from container.models import MaterialChangeHistory,batchLogModel,ContainerDetailLogModel
- """
- path(r'MaterialChangeHistory/', views.MaterialChangeHistoryViewSet.as_view({"get": "list", }), name="management"),
- path(r'MaterialChangeHistory/file/', views.MaterialChangeHistoryDownloadView.as_view({"get": "list"}), name="flowfile"),
- path(r'batchLog/', views.batchLogViewSet.as_view({"get": "list", }), name="management"),
- path(r'batchLog/file/', views.batchLogDownloadView.as_view({"get": "list"}), name="flowfile"),
- path(r'ContainerDetailLog/', views.ContainerDetailLogViewSet.as_view({"get": "list", }), name="management"),
- path(r'ContainerDetailLog/file/', views.ContainerDetailLogDownloadView.as_view({"get": "list"}), name="flowfile"),
- """
- from django.utils import timezone
- from datetime import datetime, timedelta
- from rest_framework.decorators import action
- from rest_framework.response import Response
- from django.db.models import Q, Max, Min
- from decimal import Decimal
- from django.db.models import Sum
- from django.db.models import OuterRef, Subquery
- from operation_log.views import log_success_operation, log_failure_operation
-
- def format_decimal(value):
- """格式化Decimal值为字符串,避免科学计数法"""
- if isinstance(value, Decimal):
- # 格式化为字符串,保留小数点后6位,但去除尾部多余的0
- return format(value.normalize(), 'f')
- return str(value)
- class MaterialChangeHistoryViewSet(viewsets.ModelViewSet):
- filter_backends = [DjangoFilterBackend, OrderingFilter, ]
- ordering_fields = ['id', "change_time", "create_time", "update_time", ]
- filter_class = MaterialChangeHistoryFilter
- pagination_class = MyPageNumberPagination
- def get_queryset(self):
- return MaterialChangeHistory.objects.all()
- def get_serializer_class(self):
- if self.action in ['list', 'create']:
- return serializers.MaterialChangeHistorySerializer
- else:
- return self.http_method_not_allowed(request=self.request)
-
-
- def summary_complex(self, request):
- """
- 获取物料库存变动汇总数据(支持分页)
- 请求参数路由上提供:
- - start_time: 开始时间(可选)
- - end_time: 结束时间(可选)
- - material_ids: 物料ID列表(可选)
- - page: 页码(可选)
- - page_size: 每页数量(可选)
- """
- # 获取请求参数 "POST /reportcenter/MaterialChangeHistory/?page=1&page_size=11&goods_code__icontains=UZ
- start_time = request.query_params.get('start_time') if request.query_params.get('start_time') else None
- end_time = request.quary_params.get('end_time') if request.query_params.get('end_time') else None
- material_ids_code = request.query_params.get('goods_code__icontains') if request.query_params.get('goods_code__icontains') else None
-
- # 记录查询时间范围
- query_time_range = {}
-
- # 如果没有提供时间段,使用当前月份
- if not start_time or not end_time:
- today = timezone.now().date()
- start_time = datetime(today.year, today.month, 1)
- end_time = start_time + timedelta(days=32)
- end_time = datetime(end_time.year, end_time.month, 1) - timedelta(days=1)
- end_time = datetime.combine(end_time, datetime.max.time())
- query_time_range['default_time_range'] = True
- else:
- query_time_range['default_time_range'] = False
-
- # 转换为datetime对象
- if isinstance(start_time, str):
- start_time = datetime.fromisoformat(start_time)
- if isinstance(end_time, str):
- end_time = datetime.fromisoformat(end_time)
-
- # 存储查询时间范围用于返回
- query_time_range['start_time'] = start_time.isoformat()
- query_time_range['end_time'] = end_time.isoformat()
-
- # 创建基础查询集
- queryset = MaterialChangeHistory.objects.filter(
- change_time__gte=start_time,
- change_time__lte=end_time
- )
-
- # 如果有物料ID过滤
- if material_ids_code:
- queryset = queryset.filter(goods_code__icontains=material_ids_code)
- print(f"过滤物料编码包含: {material_ids_code},剩余条目数: {queryset.count()}")
-
- # 获取期初数量(时间段开始时的库存)
- opening_subquery = MaterialChangeHistory.objects.filter(
- goods_code=OuterRef('goods_code'),
- change_time__lt=start_time
- ).order_by('-change_time').values('closing_quantity')[:1]
-
- opening_data = MaterialChangeHistory.objects.filter(
- change_time__lt=start_time
- )
- if material_ids_code:
- opening_data = opening_data.filter(goods_code__icontains=material_ids_code)
-
- opening_data = opening_data.values('goods_code').annotate(
- opening_quantity=Subquery(opening_subquery)
- )
-
- # 获取期末数量(时间段结束时的库存)
- closing_subquery = MaterialChangeHistory.objects.filter(
- goods_code=OuterRef('goods_code'),
- change_time__lte=end_time
- ).order_by('-change_time').values('closing_quantity')[:1]
-
- closing_data = MaterialChangeHistory.objects.filter(
- change_time__lte=end_time
- )
- if material_ids_code:
- closing_data = closing_data.filter(goods_code__icontains=material_ids_code)
-
- closing_data = closing_data.values('goods_code').annotate(
- closing_quantity=Subquery(closing_subquery)
- )
-
- # 计算期间出入库总量
- period_data = queryset.values('goods_code').annotate(
- total_in=Sum('in_quantity'),
- total_out=Sum('out_quantity')
- )
-
- # 构建结果字典
- result = {}
- for item in opening_data:
- material_code = item['goods_code']
- goods=MaterialChangeHistory.objects.filter(goods_code=material_code).first()
- result.setdefault(material_code, {
- 'material_code': material_code,
- 'goods_code': goods.goods_code if goods else 'N/A',
- 'goods_desc': goods.goods_desc if goods else 'N/A',
- 'goods_unit': goods.goods_unit if goods else 'N/A',
- 'opening_quantity': item['opening_quantity'] or Decimal('0'),
- 'closing_quantity': Decimal('0'),
- 'total_in': Decimal('0'),
- 'total_out': Decimal('0'),
- 'net_change': Decimal('0'), # 新增:净含量变化
- 'theoretical_change': Decimal('0'), # 新增:理论变化量
- 'is_consistent': True # 新增:一致性校验
- })
-
- for item in closing_data:
- material_code = item['goods_code']
- goods=MaterialChangeHistory.objects.filter(goods_code=material_code).first()
- if material_code in result:
- result[material_code]['closing_quantity'] = item['closing_quantity'] or Decimal('0')
- else:
- result[material_code] = {
- 'material_code': material_code,
- 'goods_code': goods.goods_code if goods else 'N/A',
- 'goods_desc': goods.goods_desc if goods else 'N/A',
- 'goods_unit': goods.goods_unit if goods else 'N/A',
- 'opening_quantity': Decimal('0'),
- 'closing_quantity': item['closing_quantity'] or Decimal('0'),
- 'total_in': Decimal('0'),
- 'total_out': Decimal('0'),
- 'net_change': Decimal('0'),
- 'theoretical_change': Decimal('0'),
- 'is_consistent': True
- }
-
- for item in period_data:
- material_code = item['goods_code']
- goods=MaterialChangeHistory.objects.filter(goods_code=material_code).first()
- if material_code in result:
- result[material_code]['total_in'] = item['total_in'] or Decimal('0')
- result[material_code]['total_out'] = item['total_out'] or Decimal('0')
- else:
- result[material_code] = {
- 'material_code': material_code,
- 'goods_code': goods.goods_code if goods else 'N/A',
- 'goods_desc': goods.goods_desc if goods else 'N/A',
- 'goods_unit': goods.goods_unit if goods else 'N/A',
- 'opening_quantity': Decimal('0'),
- 'closing_quantity': Decimal('0'),
- 'total_in': item['total_in'] or Decimal('0'),
- 'total_out': item['total_out'] or Decimal('0'),
- 'net_change': Decimal('0'),
- 'theoretical_change': Decimal('0'),
- 'is_consistent': True
- }
-
- # 计算净含量变化和理论变化量,并进行一致性校验
- for material_code, data in result.items():
- # 计算净含量变化(期末 - 期初)
- net_change = data['closing_quantity'] - data['opening_quantity']
- data['net_change'] = net_change
-
- # 计算理论变化量(入库 - 出库)
- theoretical_change = data['total_in'] - data['total_out']
- data['theoretical_change'] = theoretical_change
-
- # 检查是否一致(允许小数点后3位的差异)
- tolerance = Decimal('0.001')
- is_consistent = abs(net_change - theoretical_change) <= tolerance
- data['is_consistent'] = is_consistent
-
- # 转换为列表格式
- result_list = list(result.values())
-
- # 应用分页
- paginator = MyPageNumberPagination()
- page = paginator.paginate_queryset(result_list, request)
-
- # 构建响应数据
- response_data = {
- 'query_time_range': query_time_range,
- 'count': len(result_list),
- 'next': paginator.get_next_link(),
- 'previous': paginator.get_previous_link(),
- 'results': page
- }
-
- return Response(response_data)
- def export_summary(self, request):
- """
- 导出物料库存变动汇总数据为CSV
- """
- # 重用summary方法获取数据
- start_time = request.query_params.get('start_time') or None
- end_time = request.query_params.get('end_time') or None
- material_ids_code = request.query_params.get('goods_code__icontains') or None
- response = self.summary_all( start_time=start_time, end_time=end_time, material_ids_code=material_ids_code)
- data = response.data
- query_time_range = data['query_time_range']
- # 创建CSV响应
- from django.http import HttpResponse
- import csv
- response = HttpResponse(content_type='text/csv')
- response['Content-Disposition'] = 'attachment; filename="material_change_summary.csv"'
-
- try:
- log_success_operation(
- request=request,
- operation_content="下载物料库存变动汇总文件",
- operation_level="download",
- operator=request.auth.name if hasattr(request, 'auth') and request.auth else None,
- module_name="报表中心"
- )
- except Exception as e:
- pass
-
- # 创建CSV写入器
- csv_writer = csv.writer(response)
-
- # 写入表头
- headers = [
- '开始时间','结束时间',
- '存货编码', '存货名称', '计量单位',
- '期初数量', '期末数量', '期间变化',
- '入库数量', '出库数量', '出入库差异',
- '对比结果'
- ]
- csv_writer.writerow(headers)
-
- # 写入数据行
- for item in data['results']:
- # 处理对比结果的显示
- is_consistent = "一致" if item['is_consistent'] else "不一致"
-
- row = [
- query_time_range.get('start_time', ''),
- query_time_range.get('end_time', ''),
- item['goods_code'],
- item['goods_desc'],
- item['goods_unit'],
- # 数量字段格式化为字符串,避免科学计数法
- format_decimal(item['opening_quantity']),
- format_decimal(item['closing_quantity']),
- format_decimal(item['net_change']),
- format_decimal(item['total_in']),
- format_decimal(item['total_out']),
- format_decimal(item['theoretical_change']),
- is_consistent
- ]
- csv_writer.writerow(row)
-
- return response
- def summary_all(self, start_time=None, end_time=None, material_ids_code=None):
- """
- 获取物料库存变动汇总数据(支持分页)
- """
- # 获取请求参数
-
- # 记录查询时间范围
- query_time_range = {}
-
- # 如果没有提供时间段,使用当前月份
- if not start_time or not end_time:
- today = timezone.now().date()
- start_time = datetime(today.year, today.month, 1)
- end_time = start_time + timedelta(days=32)
- end_time = datetime(end_time.year, end_time.month, 1) - timedelta(days=1)
- end_time = datetime.combine(end_time, datetime.max.time())
- query_time_range['default_time_range'] = True
- else:
- query_time_range['default_time_range'] = False
-
- # 转换为datetime对象
- if isinstance(start_time, str):
- start_time = datetime.fromisoformat(start_time)
- if isinstance(end_time, str):
- end_time = datetime.fromisoformat(end_time)
-
- # 存储查询时间范围用于返回
- query_time_range['start_time'] = start_time.isoformat()
- query_time_range['end_time'] = end_time.isoformat()
-
- # 创建基础查询集
- queryset = MaterialChangeHistory.objects.filter(
- change_time__gte=start_time,
- change_time__lte=end_time
- )
-
- # 如果有物料ID过滤
- if material_ids_code:
- queryset = queryset.filter(goods_code__icontains=material_ids_code)
-
- # 获取每个物料的期初和期末数量(直接从过滤集中获取)
- material_codes = queryset.values_list('goods_code', flat=True).distinct()
- opening_closing_data = {}
-
- for code in material_codes:
- # 获取该物料在时间段内的第一条记录(最早记录)
- first_record = queryset.filter(goods_code=code).order_by('change_time').first()
- # 获取该物料在时间段内的最后一条记录(最晚记录)
- last_record = queryset.filter(goods_code=code).order_by('-change_time').first()
-
- # 期初数量 = 第一条记录的期初数量
- # 期末数量 = 最后一条记录的期末数量
- opening_closing_data[code] = {
- 'opening_quantity': first_record.opening_quantity,
- 'closing_quantity': last_record.closing_quantity
- }
-
- # 计算期间出入库总量
- period_data = queryset.values('goods_code').annotate(
- total_in=Sum('in_quantity'),
- total_out=Sum('out_quantity')
- )
-
- # 构建结果字典
- result = {}
- for item in period_data:
- material_code = item['goods_code']
- goods = MaterialChangeHistory.objects.filter(goods_code=material_code).first()
-
- # 获取该物料的期初和期末数量
- oc_data = opening_closing_data.get(material_code, {
- 'opening_quantity': Decimal('0'),
- 'closing_quantity': Decimal('0')
- })
-
- result[material_code] = {
- 'material_code': material_code,
- 'goods_code': goods.goods_code if goods else 'N/A',
- 'goods_desc': goods.goods_desc if goods else 'N/A',
- 'goods_unit': goods.goods_unit if goods else 'N/A',
- 'opening_quantity': oc_data['opening_quantity'],
- 'closing_quantity': oc_data['closing_quantity'],
- 'total_in': item['total_in'] or Decimal('0'),
- 'total_out': item['total_out'] or Decimal('0'),
- 'net_change': Decimal('0'), # 后面计算
- 'theoretical_change': Decimal('0'), # 后面计算
- 'is_consistent': True
- }
-
- # 计算净含量变化和理论变化量,并进行一致性校验
- for material_code, data in result.items():
- # 净含量变化 = 期末 - 期初
- net_change = data['closing_quantity'] - data['opening_quantity']
- data['net_change'] = net_change
-
- # 理论变化量 = 入库 - 出库
- theoretical_change = data['total_in'] - data['total_out']
- data['theoretical_change'] = theoretical_change
-
- # 检查是否一致(允许小数点后3位的差异)
- tolerance = Decimal('0.001')
- data['is_consistent'] = abs(net_change - theoretical_change) <= tolerance
-
- # 转换为列表格式
- result_list = list(result.values())
-
- # 应用分页
- response_data = {
- 'query_time_range': query_time_range,
- 'count': len(result_list),
- 'results': result_list # 返回所有结果,不分页
- }
- return Response(response_data)
- def summary(self, request):
- """
- 获取物料库存变动汇总数据(支持分页)
- """
- # 获取请求参数
- start_time = request.query_params.get('start_time') or None
- end_time = request.query_params.get('end_time') or None
- material_ids_code = request.query_params.get('goods_code__icontains') or None
-
- # 记录查询时间范围
- query_time_range = {}
-
- # 如果没有提供时间段,使用当前月份
- if not start_time or not end_time:
- today = timezone.now().date()
- start_time = datetime(today.year, today.month, 1)
- end_time = start_time + timedelta(days=32)
- end_time = datetime(end_time.year, end_time.month, 1) - timedelta(days=1)
- end_time = datetime.combine(end_time, datetime.max.time())
- query_time_range['default_time_range'] = True
- else:
- query_time_range['default_time_range'] = False
-
- # 转换为datetime对象
- if isinstance(start_time, str):
- start_time = datetime.fromisoformat(start_time)
- if isinstance(end_time, str):
- end_time = datetime.fromisoformat(end_time)
-
- # 存储查询时间范围用于返回
- query_time_range['start_time'] = start_time.isoformat()
- query_time_range['end_time'] = end_time.isoformat()
-
- # 创建基础查询集
- queryset = MaterialChangeHistory.objects.filter(
- change_time__gte=start_time,
- change_time__lte=end_time
- )
-
- # 如果有物料ID过滤
- if material_ids_code:
- queryset = queryset.filter(goods_code__icontains=material_ids_code)
-
- # 获取每个物料的期初和期末数量(直接从过滤集中获取)
- material_codes = queryset.values_list('goods_code', flat=True).distinct()
- opening_closing_data = {}
-
- for code in material_codes:
- # 获取该物料在时间段内的第一条记录(最早记录)
- first_record = queryset.filter(goods_code=code).order_by('change_time').first()
- # 获取该物料在时间段内的最后一条记录(最晚记录)
- last_record = queryset.filter(goods_code=code).order_by('-change_time').first()
-
- # 期初数量 = 第一条记录的期初数量
- # 期末数量 = 最后一条记录的期末数量
- opening_closing_data[code] = {
- 'opening_quantity': first_record.opening_quantity,
- 'closing_quantity': last_record.closing_quantity
- }
-
- # 计算期间出入库总量
- period_data = queryset.values('goods_code').annotate(
- total_in=Sum('in_quantity'),
- total_out=Sum('out_quantity')
- )
-
- # 构建结果字典
- result = {}
- for item in period_data:
- material_code = item['goods_code']
- goods = MaterialChangeHistory.objects.filter(goods_code=material_code).first()
-
- # 获取该物料的期初和期末数量
- oc_data = opening_closing_data.get(material_code, {
- 'opening_quantity': Decimal('0'),
- 'closing_quantity': Decimal('0')
- })
-
- result[material_code] = {
- 'material_code': material_code,
- 'goods_code': goods.goods_code if goods else 'N/A',
- 'goods_desc': goods.goods_desc if goods else 'N/A',
- 'goods_unit': goods.goods_unit if goods else 'N/A',
- 'opening_quantity': oc_data['opening_quantity'],
- 'closing_quantity': oc_data['closing_quantity'],
- 'total_in': item['total_in'] or Decimal('0'),
- 'total_out': item['total_out'] or Decimal('0'),
- 'net_change': Decimal('0'), # 后面计算
- 'theoretical_change': Decimal('0'), # 后面计算
- 'is_consistent': True
- }
-
- # 计算净含量变化和理论变化量,并进行一致性校验
- for material_code, data in result.items():
- # 净含量变化 = 期末 - 期初
- net_change = data['closing_quantity'] - data['opening_quantity']
- data['net_change'] = net_change
-
- # 理论变化量 = 入库 - 出库
- theoretical_change = data['total_in'] - data['total_out']
- data['theoretical_change'] = theoretical_change
-
- # 检查是否一致(允许小数点后3位的差异)
- tolerance = Decimal('0.001')
- data['is_consistent'] = abs(net_change - theoretical_change) <= tolerance
-
- # 转换为列表格式
- result_list = list(result.values())
-
- # 应用分页
- paginator = MyPageNumberPagination()
- page = paginator.paginate_queryset(result_list, request)
-
- # 构建响应数据
- response_data = {
- 'query_time_range': query_time_range,
- 'count': len(result_list),
- 'next': paginator.get_next_link(),
- 'previous': paginator.get_previous_link(),
- 'results': page
- }
-
- return Response(response_data)
-
- class MaterialChangeHistoryDownloadView(viewsets.ModelViewSet):
- renderer_classes = (MaterialChangeHistoryRenderCN, ) + tuple(api_settings.DEFAULT_RENDERER_CLASSES)
- filter_backends = [DjangoFilterBackend, OrderingFilter, ]
- ordering_fields = ['id', "change_time", "create_time", "update_time", ]
- filter_class = MaterialChangeHistoryFilter
- def get_project(self):
- try:
- id = self.kwargs.get('pk')
- return id
- except:
- return None
- def get_queryset(self):
- id = self.get_project()
- if self.request.user:
- if id is None:
- return MaterialChangeHistory.objects.filter()
- else:
- return MaterialChangeHistory.objects.filter(id=id)
- else:
- return MaterialChangeHistory.objects.none()
- def get_serializer_class(self):
- if self.action in ['list']:
- return serializers.MaterialChangeHistorySerializer
- else:
- return self.http_method_not_allowed(request=self.request)
- def get_render(self, data):
- # lang = self.request.META.get('HTTP_LANGUAGE')
- # if lang:
- # if lang == 'zh-hans':
- # return FileListRenderCN().render(data)
- # else:
- # return FileListRenderEN().render(data)
- # else:
- # return FileListRenderEN().render(data)
- return MaterialChangeHistoryRenderCN().render(data)
- def list(self, request, *args, **kwargs):
- from datetime import datetime
- dt = datetime.now()
- data = (
- serializers.MaterialChangeHistorySerializer(instance).data
- for instance in self.filter_queryset(self.get_queryset())
- )
- renderer = self.get_render(data)
- response = StreamingHttpResponse(
- renderer,
- content_type="text/csv"
- )
- response['Content-Disposition'] = "attachment; filename='MaterialChangeHistory_{}.csv'".format(str(dt.strftime('%Y%m%d%H%M%S%f')))
- try:
- log_success_operation(
- request=request,
- operation_content="下载物料变动历史文件",
- operation_level="download",
- operator=request.auth.name if hasattr(request, 'auth') and request.auth else None,
- module_name="报表中心"
- )
- except Exception as e:
- pass
- return response
-
- class batchLogViewSet(viewsets.ModelViewSet):
- filter_backends = [DjangoFilterBackend, OrderingFilter, ]
- ordering_fields = ['id', "create_time", "update_time", ]
- filter_class = batchLogFilter
- pagination_class = MyPageNumberPagination
- def get_queryset(self):
- return batchLogModel.objects.all()
- def get_serializer_class(self):
- if self.action in ['list', 'create']:
- return serializers.batchLogSerializer
- else:
- return self.http_method_not_allowed(request=self.request)
- class batchLogDownloadView(viewsets.ModelViewSet):
- renderer_classes = (batchLogRenderCN, ) + tuple(api_settings.DEFAULT_RENDERER_CLASSES)
- filter_backends = [DjangoFilterBackend, OrderingFilter, ]
- ordering_fields = ['id', "create_time", "update_time", ]
- filter_class = batchLogFilter
- def get_project(self):
- try:
- id = self.kwargs.get('pk')
- return id
- except:
- return None
- def get_queryset(self):
- id = self.get_project()
- if self.request.user:
- if id is None:
- return batchLogModel.objects.filter()
- else:
- return batchLogModel.objects.filter(id=id)
- else:
- return batchLogModel.objects.none()
- def get_serializer_class(self):
- if self.action in ['list']:
- return serializers.batchLogSerializer
- else:
- return self.http_method_not_allowed(request=self.request)
- def get_render(self, data):
- # lang = self.request.META.get('HTTP_LANGUAGE')
- # if lang:
- # if lang == 'zh-hans':
- # return FileListRenderCN().render(data)
- # else:
- # return FileListRenderEN().render(data)
- # else:
- # return FileListRenderEN().render(data)
- return batchLogRenderCN().render(data)
- def list(self, request, *args, **kwargs):
- from datetime import datetime
- dt = datetime.now()
- data = (
- serializers.batchLogSerializer(instance).data
- for instance in self.filter_queryset(self.get_queryset()))
- renderer = self.get_render(data)
- response = StreamingHttpResponse(
- renderer,
- content_type="text/csv"
- )
- response['Content-Disposition'] = "attachment; filename='batchLog_{}.csv'".format(str(dt.strftime('%Y%m%d%H%M%S%f')))
- try:
- log_success_operation(
- request=request,
- operation_content="下载批次日志文件",
- operation_level="download",
- operator=request.auth.name if hasattr(request, 'auth') and request.auth else None,
- module_name="报表中心"
- )
- except Exception as e:
- pass
- return response
- class ContainerDetailLogViewSet(viewsets.ModelViewSet):
- filter_backends = [DjangoFilterBackend, OrderingFilter, ]
- ordering_fields = ['id', "create_time", "update_time", ]
- filter_class = ContainerDetailLogFilter
- pagination_class = MyPageNumberPagination
- def get_queryset(self):
- return ContainerDetailLogModel.objects.all()
- def get_serializer_class(self):
- if self.action in ['list', 'create']:
- return serializers.ContainerDetailLogSerializer
- else:
- return self.http_method_not_allowed(request=self.request)
- class ContainerDetailLogDownloadView(viewsets.ModelViewSet):
- renderer_classes = (ContainerDetailLogRenderCN, ) + tuple(api_settings.DEFAULT_RENDERER_CLASSES)
- filter_backends = [DjangoFilterBackend, OrderingFilter, ]
- ordering_fields = ['id', "create_time", "update_time", ]
- filter_class = ContainerDetailLogFilter
- def get_project(self):
- try:
- id = self.kwargs.get('pk')
- return id
- except:
- return None
- def get_queryset(self):
- id = self.get_project()
- if self.request.user:
- if id is None:
- return ContainerDetailLogModel.objects.filter()
- else:
- return ContainerDetailLogModel.objects.filter(id=id)
- else:
- return ContainerDetailLogModel.objects.none()
- def get_serializer_class(self):
- if self.action in ['list']:
- return serializers.ContainerDetailLogSerializer
- else:
- return self.http_method_not_allowed(request=self.request)
- def get_render(self, data):
- # lang = self.request.META.get('HTTP_LANGUAGE')
- # if lang:
- # if lang == 'zh-hans':
- # return FileListRenderCN().render(data)
- # else:
- # return FileListRenderEN().render(data)
- # else:
- # return FileListRenderEN().render(data)
- return ContainerDetailLogRenderCN().render(data)
- def list(self, request, *args, **kwargs):
- from datetime import datetime
- dt = datetime.now()
- data = (
- serializers.ContainerDetailLogSerializer(instance).data
- for instance in self.filter_queryset(self.get_queryset()))
- renderer = self.get_render(data)
- response = StreamingHttpResponse(
- renderer,
- content_type="text/csv"
- )
- response['Content-Disposition'] = "attachment; filename='ContainerDetailLog_{}.csv'".format(str(dt.strftime('%Y%m%d%H%M%S%f')))
- try:
- log_success_operation(
- request=request,
- operation_content="下载托盘详情日志文件",
- operation_level="download",
- operator=request.auth.name if hasattr(request, 'auth') and request.auth else None,
- module_name="报表中心"
- )
- except Exception as e:
- pass
- return response
- class FileListDownloadView(viewsets.ModelViewSet):
- renderer_classes = (FileFlowListRenderCN, ) + tuple(api_settings.DEFAULT_RENDERER_CLASSES)
- filter_backends = [DjangoFilterBackend, OrderingFilter, ]
- ordering_fields = ['id', "document_date" ]
- filter_class = FlowFilter
- def get_project(self):
- try:
- id = self.kwargs.get('pk')
- return id
- except:
- return None
- def get_queryset(self):
- id = self.get_project()
- if self.request.user:
- if id is None:
- return flowlist.objects.filter()
- else:
- return flowlist.objects.filter(id=id)
- else:
- return flowlist.objects.none()
- def get_serializer_class(self):
- if self.action in ['list']:
- return serializers.flowSerializer
- else:
- return self.http_method_not_allowed(request=self.request)
- def get_render(self, data):
- # lang = self.request.META.get('HTTP_LANGUAGE')
- # if lang:
- # if lang == 'zh-hans':
- # return FileListRenderCN().render(data)
- # else:
- # return FileListRenderEN().render(data)
- # else:
- # return FileListRenderEN().render(data)
- return FileFlowListRenderCN().render(data)
- def list(self, request, *args, **kwargs):
- from datetime import datetime
- dt = datetime.now()
- data = (
- serializers.flowSerializer(instance).data
- for instance in self.filter_queryset(self.get_queryset())
- )
- renderer = self.get_render(data)
- response = StreamingHttpResponse(
- renderer,
- content_type="text/csv"
- )
- response['Content-Disposition'] = "attachment; filename='stocklist_{}.csv'".format(str(dt.strftime('%Y%m%d%H%M%S%f')))
- try:
- log_success_operation(
- request=request,
- operation_content="下载库存流水文件",
- operation_level="download",
- operator=request.auth.name if hasattr(request, 'auth') and request.auth else None,
- module_name="报表中心"
- )
- except Exception as e:
- pass
- return response
- class FlowsStatsViewSet(viewsets.ModelViewSet):
- filter_backends = [DjangoFilterBackend, OrderingFilter, ]
- ordering_fields = ['id', "create_time", "update_time", ]
- filter_class = FlowFilter
- pagination_class = MyPageNumberPagination
-
- """
- list:
- Response a data list(all)
- post:
- Create a new data(create)
- """
-
- def get_project(self):
- try:
- id = self.kwargs.get('pk')
- return id
- except:
- return None
-
- def get_queryset(self):
- id = self.get_project()
- if self.request.user:
- if id is None:
- return flowlist.objects.filter()
- else:
- return flowlist.objects.filter(id=id)
- else:
- return flowlist.objects.none()
- def get_serializer_class(self):
- if self.action in ['list', 'create', ]:
- return serializers.flowSerializer
- # elif self.action in ['retrieve','update',]:
- # return serializers.stocklistpartialSerializer
- else:
- return self.http_method_not_allowed(request=self.request)
- class BatchListViewSet(viewsets.ModelViewSet):
- filter_backends = [DjangoFilterBackend, OrderingFilter, ]
- ordering_fields = ['id', "create_time", "update_time", ]
- filter_class = batchfilter
- pagination_class = MyPageNumberPagination
-
- """
- list:
- Response a data list(all)
- post:
- Create a new data(create)
- """
-
- def get_project(self):
- try:
- id = self.kwargs.get('pk')
- return id
- except:
- return None
-
- def get_queryset(self):
- id = self.get_project()
- if self.request.user:
- if id is None:
- return BoundBatchModel.objects.filter()
- else:
- return BoundBatchModel.objects.filter(id=id)
- else:
- return BoundBatchModel.objects.none()
- def get_serializer_class(self):
- if self.action in ['list']:
- return serializers.batchlistSerializer
- # elif self.action in ['retrieve','update',]:
- # return serializers.stocklistpartialSerializer
- else:
- return self.http_method_not_allowed(request=self.request)
- class BatchFileViewSet(viewsets.ModelViewSet):
- renderer_classes = (FileBatchListRenderCN, ) + tuple(api_settings.DEFAULT_RENDERER_CLASSES)
- filter_backends = [DjangoFilterBackend, OrderingFilter, ]
- ordering_fields = [ "bound_month" ,"bound_batch_order", "update_time", ]
- filter_class = batchfilter
- def get_project(self):
- try:
- id = self.kwargs.get('pk')
- return id
- except:
- return None
- def get_queryset(self):
- id = self.get_project()
- if self.request.user:
- if id is None:
- return BoundBatchModel.objects.filter()
- else:
- return BoundBatchModel.objects.filter(id=id)
- else:
- return BoundBatchModel.objects.none()
- def get_serializer_class(self):
- if self.action in ['list']:
- return serializers.batchlistSerializer
- else:
- return self.http_method_not_allowed(request=self.request)
- def get_render(self, data):
- return FileBatchListRenderCN().render(data)
- def list(self, request, *args, **kwargs):
- from datetime import datetime
- dt = datetime.now()
- data = (
- serializers.batchlistSerializer(instance).data
- for instance in self.filter_queryset(self.get_queryset())
- )
- renderer = self.get_render(data)
- response = StreamingHttpResponse(
- renderer,
- content_type="text/csv"
- )
- response['Content-Disposition'] = "attachment; filename='批次报表_{}.csv'".format(str(dt.strftime('%Y%m%d%H%M%S%f')))
- try:
- log_success_operation(
- request=request,
- operation_content="下载批次列表文件",
- operation_level="download",
- operator=request.auth.name if hasattr(request, 'auth') and request.auth else None,
- module_name="报表中心"
- )
- except Exception as e:
- pass
- return response
- class bigScreenModelViewSet(viewsets.ModelViewSet):
- filter_backends = [DjangoFilterBackend, OrderingFilter, ]
- ordering_fields = ['id', "create_time", "update_time", ]
- filter_class = bigScreenFilter
- pagination_class = MyPageNumberPagination
- def get_project(self):
- try:
- id = self.kwargs.get('pk')
- return id
- except:
- return None
- def get_queryset(self):
- id = self.get_project()
- if self.request.user:
- if id is None:
- return bigScreenModel.objects.filter()
- else:
- return bigScreenModel.objects.filter(id=id)
- else:
- return bigScreenModel.objects.none()
- def get_serializer_class(self):
- if self.action in ['list', 'create', ]:
- return serializers.bigScreenSerializer
- # elif self.action in ['retrieve','update',]:
- # return serializers.stocklistpartialSerializer
- else:
- return self.http_method_not_allowed(request=self.request)
-
|