from django.shortcuts import render from django.conf import settings from apps.enm.models import Mpoint, MpointStat, EnStat, EnStat2, MpLogx from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin, CustomListModelMixin from apps.enm.serializers import MpointSerializer, MpLogxSerializer, MpointStatSerializer, EnStatSerializer, EnStat2Serializer, ReCalSerializer, MpointStatCorrectSerializer from apps.enm.filters import MpointStatFilter, EnStatFilter, EnStat2Filter from apps.enm.tasks import cal_mpointstat_manual from rest_framework.response import Response from rest_framework.serializers import Serializer from rest_framework.decorators import action from apps.enm.tasks import cal_mpointstats_duration from apps.enm.services import king_sync, MpointCache from django.db import transaction 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": ["exact"], "ep_monitored": ["exact"], "ep_belong": ["exact"], "mgroup": ["exact"], "type": ["exact"], "mgroup__name": ["exact"], "val_type": ["exact"], "enabled": ["exact"], "need_display": ["exact"], "formula": ["exact", "contains"], "material": ["exact"], "material__code": ["exact", "in"] } search_fields = ["name", "code"] ordering = ["create_time", "name", "code"] @transaction.atomic def perform_create(self, serializer): instance = serializer.save() if instance.code: MpointCache(instance.code).get(True) @transaction.atomic def perform_update(self, serializer): instance = serializer.save() if instance.code: MpointCache(instance.code).get(True) @action(methods=["post"], detail=False, perms_map={"post": "mpoint.create"}, serializer_class=Serializer) def king_sync(self, request, *args, **kwargs): """同步亚控采集点 同步亚控采集点 """ king_sync(getattr(settings, "KING_PROJECTNAME", "")) return Response() # class MpLogViewSet(ListModelMixin, CustomGenericViewSet): # """ # list:测点原始记录 # 测点原始记录 # """ # perms_map = {'get': '*'} # queryset = MpLog.objects.all() # serializer_class = MpLogSerializer # select_related_fields = ['mpoint'] # filterset_fields = ['mpoint', 'mpoint__mgroup', 'mpoint__mgroup__belong_dept'] class MpLogxViewSet(CustomListModelMixin, CustomGenericViewSet): """ list: 测点采集数据 测点采集数据 """ perms_map = {"get": "*"} queryset = MpLogx.objects.all() serializer_class = MpLogxSerializer filterset_fields = { "timex": ["exact", "gte", "lte", "year", "month", "day"], "mpoint": ["exact"], } ordering_fields = ["timex"] ordering = ["-timex"] class MpointStatViewSet(BulkCreateModelMixin, BulkDestroyModelMixin, CustomListModelMixin, CustomGenericViewSet): """ list:测点统计记录 测点统计记录 """ perms_map = {"get": "*", "post": "mpointstat.create", "delete": "mpointstat.delete"} queryset = MpointStat.objects.all() serializer_class = MpointStatSerializer select_related_fields = ["mpoint", "mpoint__ep_monitored", "mpoint__ep_belong", "mgroup", "mgroup__belong_dept"] filterset_class = MpointStatFilter ordering_fields = ['mpoint__report_sortstr', 'year', 'month', 'day', 'hour', 'year_s', 'month_s', 'day_s', 'mgroup__sort', 'create_time'] def perform_create(self, serializer): ins = serializer.save() cal_mpointstat_manual.delay(ins.mpoint.id, ins.sflog.id, ins.mgroup.id, None, None, None, None, ins.year_s, ins.month_s, ins.day_s, next_cal=1) def perform_destroy(self, instance): mpoint, sflog, mgroup, year_s, month_s, day_s = instance.mpoint, instance.sflog, instance.mgroup, instance.year_s, instance.month_s, instance.day_s instance.delete() cal_mpointstat_manual.delay(mpoint.id, sflog.id, mgroup.id, None, None, None, None, year_s, month_s, day_s, next_cal=1) @action(methods=["post"], detail=False, perms_map={"post": "mpointstat.correct"}, serializer_class=MpointStatCorrectSerializer) def correct(self, request, *args, **kwargs): """修正测点统计记录及统计值 修正测点统计记录及统计值 """ instance = self.get_object() sr = MpointStatCorrectSerializer(data=request.data) sr.is_valid(raise_exception=True) vdata = sr.validated_data val_correct = vdata["val_correct"] if val_correct: instance.val = val_correct instance.save() mpoint, sflog, mgroup, year_s, month_s, day_s = instance.mpoint, instance.sflog, instance.mgroup, instance.year_s, instance.month_s, instance.day_s # sflog 可能为None if sflog is None: sflogId = None else: sflogId = sflog.id cal_mpointstat_manual.delay(mpoint.id, sflogId, mgroup.id, None, None, None, None, year_s, month_s, day_s, next_cal=1) return Response() @action(methods=["post"], detail=False, perms_map={"post": "mpointstat.create"}, serializer_class=ReCalSerializer) def recal(self, request, *args, **kwargs): """重新运行某段时间的enm计算 重新运行某段时间的enm计算 """ data = request.data sr = ReCalSerializer(data=data) sr.is_valid(raise_exception=True) task = cal_mpointstats_duration.delay(data["start_time"], data["end_time"]) return Response({"task_id": task.task_id}) class EnStatViewSet(CustomListModelMixin, CustomGenericViewSet): """ list:能耗统计记录 能耗统计记录 """ perms_map = {"get": "*"} queryset = EnStat.objects.all() serializer_class = EnStatSerializer select_related_fields = ["mgroup", "team", "mgroup__belong_dept"] filterset_class = EnStatFilter ordering = ["mgroup__sort", "year_s", "month_s", "day_s", "hour"] class EnStat2ViewSet(CustomListModelMixin, CustomGenericViewSet): """ list:全厂统计记录 全厂统计记录 """ perms_map = {"get": "*"} queryset = EnStat2.objects.all() serializer_class = EnStat2Serializer filterset_class = EnStat2Filter