diff --git a/apps/wpm/datax.py b/apps/wpm/datax.py index 11c0628e..c6d546ce 100644 --- a/apps/wpm/datax.py +++ b/apps/wpm/datax.py @@ -1,19 +1,75 @@ from apps.utils.viewsets import GenericViewSet from rest_framework.decorators import action from apps.em.models import Equipment -from apps.wpm.modes import Mlog +from apps.wpm.models import Mlog, Mlogb +from apps.mtm.models import Mgroup from django.utils import timezone +from django.db.models import Sum +from datetime import datetime, timedelta +from rest_framework.response import Response +from rest_framework.serializers import Serializer + +def tran_time_to_mstate(mstate_json, reminder_interval_list, work_start_time: datetime, now: datetime): + if len(reminder_interval_list) != len(mstate_json): + return '未运行' + for ind, val in enumerate(reminder_interval_list): + if work_start_time + timedelta(minutes=val) > now: + return mstate_json[ind] + return '未运行' class AnaViewSet(GenericViewSet): perms_map = {} - @action(methods=['post'], detail=False, perms_map={'post': '*'}) - def 设备最后生产日志(self, request): + @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=Serializer) + def equip_last_mlog(self, request): + """设备最后生产日志 + + 设备最后生产日志 + """ data = request.data now = timezone.now() - mgroup_name = data["mgroup_name"] + mgroup: Mgroup = Mgroup.objects.get(name=data['mgroup_name']) + # 子状态 + mstate_json = mgroup.process.mstate_json # 生产设备 - equip_qs = Equipment.objects.filter(mgroup__name=mgroup_name, type = 10) + equip_qs = Equipment.objects.filter(mgroup=mgroup, type = 10) + equip_qs_v = equip_qs.values('id', 'name', 'number', 'state').order_by('number') + equip_qs_l = list(equip_qs_v) # 设备最后生产日志 - mlog_qs = Mlog.objects.filter(equip__in=equip_qs) + mlog_qs = Mlog.objects.filter(equipment__in=equip_qs) mlog_qs = mlog_qs | Mlog.objects.filter(work_start_time__lte=now, work_end_time__isnull=True) - mlog_qs = mlog_qs | Mlog.objects.filter(work_start_time__lte=now, work_end_time__gte=now) \ No newline at end of file + mlog_qs = mlog_qs | Mlog.objects.filter(work_start_time__lte=now, work_end_time__gte=now) + mlog_qs = mlog_qs.annotate(t_count_use=Sum('b_mlog__count_use')) + mlog_qs = mlog_qs.order_by('work_start_time') + mlog_qs_v = mlog_qs.values('id', 'equipment__id', 't_count_use', 'reminder_interval_list', 'work_start_time') + mlog_qs_l = list(mlog_qs_v) + mlog_dict = {item['equipment__id']: item for item in mlog_qs_l} + + # 统计数据 + 保温 = 0 + 冷却 = 0 + 未运行 = 0 + 故障 = 0 + now = timezone.now() + for item in equip_qs_l: + item['mstate'] = '未运行' + if item['id'] in mlog_dict: + item['t_count_use'] = mlog_dict[item['id']]['t_count_use'] + mlog_dict_v = mlog_dict[item['id']] + item['reminder_interval_list'] = mlog_dict_v['reminder_interval_list'] + item['mstate'] = tran_time_to_mstate(mstate_json, mlog_dict_v['reminder_interval_list'], mlog_dict_v['work_start_time'], now) + + if item['state'] in [Equipment.EQUIP_STATE_SCRAP, Equipment.EQUIP_STATE_FIX]: + item['mstate'] = '故障' + + if item['mstate'] == '保温': + 保温 += 1 + elif item['mstate'] == '冷却': + 冷却 += 1 + elif item['mstate'] == '未运行': + 未运行 += 1 + elif item['mstate'] == '故障': + 故障 += 1 + ret = {"保温": 保温, "冷却": 冷却, "未运行": 未运行, "故障": 故障} + ret["rows"] = equip_qs_l + return Response(ret) + diff --git a/apps/wpm/urls.py b/apps/wpm/urls.py index 3de12711..ec342726 100644 --- a/apps/wpm/urls.py +++ b/apps/wpm/urls.py @@ -5,6 +5,7 @@ from apps.wpm.views import (SfLogViewSet, StLogViewSet, SfLogExpViewSet, WMaterialViewSet, MlogViewSet, HandoverViewSet, AttlogViewSet, OtherLogViewSet, MlogbViewSet, MlogbInViewSet, MlogbOutViewSet, FmlogViewSet) +from apps.wpm.datax import AnaViewSet API_BASE_URL = 'api/wpm/' @@ -23,6 +24,8 @@ router.register('mlogb/out', MlogbOutViewSet) router.register('handover', HandoverViewSet, basename='handover') router.register('attlog', AttlogViewSet, basename='attlog') router.register('otherlog', OtherLogViewSet, basename='otherlog') +router.register('ana', AnaViewSet, basename='ana') + urlpatterns = [ path(API_BASE_URL, include(router.urls)), ]