from apps.utils.viewsets import GenericViewSet from rest_framework.decorators import action from apps.em.models import Equipment 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': '*'}, serializer_class=Serializer) def equip_last_mlog(self, request): """设备最后生产日志 设备最后生产日志 """ data = request.data now = timezone.now() mgroup: Mgroup = Mgroup.objects.get(name=data['mgroup_name']) # 子状态 mstate_json = mgroup.process.mstate_json # 生产设备 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(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) 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)