factory/apps/wpm/datax.py

78 lines
3.6 KiB
Python

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]['name']
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', 'work_end_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:
mlog_dict_v = mlog_dict[item['id']]
item['t_count_use'] = mlog_dict_v['t_count_use']
item['reminder_interval_list'] = mlog_dict_v['reminder_interval_list']
item['work_start_time'] = mlog_dict_v['work_start_time'].strftime('%Y-%m-%d %H:%M:%S') if mlog_dict_v['work_start_time'] else None
item['work_end_time'] = mlog_dict_v['work_end_time'].strftime('%Y-%m-%d %H:%M:%S') if mlog_dict_v['work_end_time'] else None
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)