factory/apps/enm/views.py

118 lines
3.7 KiB
Python

from django.shortcuts import render
from apps.enm.models import Mpoint, Mgroup, Team, MpLog, SfLog, StLog, StSfLog
from apps.utils.viewsets import CustomModelViewSet, GenericViewSet
from rest_framework.mixins import ListModelMixin, UpdateModelMixin
from apps.enm.serializers import MpointSerializer, TeamSerializer, MgroupSerializer, MpLogSerializer, SfLogSerializer, StLogSerializer, StSfLogSerializer
from rest_framework.exceptions import ParseError
from django.db import transaction
from django.db.models import Q
class MgroupViewSet(CustomModelViewSet):
"""
list:测点集
测点集
"""
queryset = Mgroup.objects.all()
serializer_class = MgroupSerializer
select_related_fields = ['create_by', 'belong_dept']
filterset_fields = ['belong_dept']
search_fields = ['number']
class TeamViewSet(CustomModelViewSet):
"""
list:班组
班组
"""
queryset = Team.objects.all()
serializer_class = TeamSerializer
select_related_fields = ['belong_dept', 'leader']
filterset_fields = ['belong_dept']
search_fields = ['name']
class MpointViewSet(CustomModelViewSet):
"""
list:测点
测点
"""
queryset = Mpoint.objects.all()
serializer_class = MpointSerializer
select_related_fields = ['create_by', 'belong_dept', 'ep_monitored', 'ep_belong', 'mgroup']
filterset_fields = ['belong_dept', 'ep_monitored', 'ep_belong', 'mgroup']
search_fields = ['number', 'code']
class MpLogViewSet(ListModelMixin, GenericViewSet):
"""
list:测点原始记录
测点原始记录
"""
queryset = MpLog.objects.all()
serializer_class = MpLogSerializer
select_related_fields = ['mpoint']
filterset_fields = ['mpoint']
class StLogViewSet(ListModelMixin, GenericViewSet):
"""
list:停机记录
停机记录
"""
queryset = StLog.objects.all()
serializer_class = StLogSerializer
select_related_fields = ['mgroup']
filterset_fields = ['mgroup']
ordering = ['-start_time']
class SfLogViewSet(CustomModelViewSet):
"""
list:值班记录
值班记录
"""
queryset = SfLog.objects.all()
serializer_class = SfLogSerializer
select_related_fields = ['mgroup', 'shift', 'team', 'leader']
filterset_fields = ['mgroup', 'shift', 'team', 'leader', 'team__belong_dept']
search_fields = ['note']
@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()
class StSfLogViewSet(ListModelMixin, UpdateModelMixin, GenericViewSet):
"""
list:值班停机关系
值班停机关系
"""
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)