from django.shortcuts import render from rest_framework.mixins import ListModelMixin, UpdateModelMixin from rest_framework.decorators import action from django.db import transaction from rest_framework.response import Response from rest_framework.exceptions import ParseError from rest_framework.mixins import DestroyModelMixin, UpdateModelMixin, ListModelMixin from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.wpm.models import SfLog, StLog, StSfLog from apps.wpm.serializers import SfLogSerializer, StLogSerializer, StSfLogSerializer from apps.wpm.filters import SfLogFilter from apps.mtm.models import Material from django.utils.timezone import localtime # Create your views here. class StLogViewSet(ListModelMixin, CustomGenericViewSet): """ list:停机记录 停机记录 """ perms_map = {'get': '*'} queryset = StLog.objects.all() serializer_class = StLogSerializer select_related_fields = ['mgroup'] filterset_fields = ['mgroup'] ordering = ['-start_time'] class SfLogViewSet(UpdateModelMixin, ListModelMixin, DestroyModelMixin, CustomGenericViewSet): """ list:值班记录 值班记录 """ perms_map = {'get': '*', 'put': 'sflog.update', 'delete': 'sflog.delete'} queryset = SfLog.objects.all() serializer_class = SfLogSerializer select_related_fields = ['mgroup', 'shift', 'team', 'leader'] filterset_class = SfLogFilter search_fields = ['note'] ordering = ['-start_time'] # 此处需要进行修改 # @transaction.atomic # def perform_create(self, serializer): # ins = serializer.save() # # 查看并比对停机记录 # stls = StLog.objects.filter(mroup=ins.mgroup) # stls_ = (stls.filter(start_time__gte=ins.start_time, start_time__lt=ins.end_time)| # stls.exclude(end_time=None).filter(start_time__lte=ins.start_time, end_time__gt=ins.end_time)| # stls.exclude(end_time=None).filter(end_time__gte=ins.start_time, end_time__lt=ins.end_time)) # for i in stls_: # StSfLog.objects.get_or_create(stlog=i, sflog=ins, defaults={'stlog': i, 'sflog': ins}) # stsflog = StSfLog.objects.filter(stlog=i).order_by('-sflog__start_time').first() # if stsflog: # stsflog.is_current_down = True # stsflog.save() # # 计算能耗 # from apps.enm.tasks import cal_sflog_en_val # cal_sflog_en_val.delay(ins.id) @action(methods=['get'], detail=True, perms_map={'get': '*'}) def init_test(self, request, pk=None): """ 初始化检测录入 初始化检测录入 """ from apps.qm.models import QuaStat, TestItem from apps.qm.serializers import QuaStatSerializer obj = self.get_object() test_materials = Material.objects.filter(id__in=obj.mgroup.test_materials).order_by('sort', '-create_time') for material in test_materials: testitems = TestItem.objects.filter(id__in=material.testitems).order_by('sort', '-create_time') for testitem in testitems: end_time_local = localtime(obj.end_time) params = {'type': 'sflog', 'material': material, 'testitem': testitem, 'sflog': obj} params_default = params.update({'year_s': end_time_local.year, 'month_s': end_time_local.month, 'day_s': end_time_local.day}) ins, _ = QuaStat.objects.get_or_create(**params, defaults=params_default) if ins.create_by is None: ins.create_by = request.user ins.belong_dept = obj.mgroup.belong_dept ins.save() qs = QuaStat.objects.filter(type='sflog', sflog=obj).order_by('material_sort', 'material__create_time', 'testitem__sort', 'testitem__create_time') sr = QuaStatSerializer(instance=qs, many=True) return Response(sr.data) class StSfLogViewSet(ListModelMixin, UpdateModelMixin, CustomGenericViewSet): """ list:值班停机关系 值班停机关系 """ perms_map = {'get': '*', 'put': 'sflog.update'} queryset = StSfLog.objects.all() serializer_class = StSfLogSerializer select_related_fields = ['stlog', 'sflog'] filterset_fields = ['stlog', 'sflog'] search_fields = ['reason'] def filter_queryset(self, queryset): params = self.request.query_params if 'stlog' not in params or 'sflog' not in params: raise ParseError('请指定所属停机或值班记录') return super().filter_queryset(queryset)