factory/apps/wpm/views.py

101 lines
4.2 KiB
Python

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
# 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:
params = {'material': material, 'testitem': testitem, 'sflog': obj}
params_default = params.update({'create_by': request.user, 'belong_dept': obj.mgroup.belong_dept})
QuaStat.objects.get_or_create(**params, defaults=params_default)
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)