factory/apps/em/services.py

113 lines
4.9 KiB
Python

from .models import Equipment
from apps.system.models import Dept
from apps.mtm.models import Mgroup
import datetime
from django.core.cache import cache
from django.utils.timezone import localtime
from apps.utils.tasks import ctask_run
def get_eq_rs(equipId: str):
"""获取设备运行状态缓存
"""
return cache.get(f"equipment_{equipId}", {"running_state": Equipment.OFFLINE, "running_state_timex": localtime()})
def set_eq_rs(equipId, last_timex: datetime, last_mrs: int):
"""更新设备运行状态(包括缓存和数据库)
"""
if last_mrs == Equipment.OFFLINE: # 如果是离线直接更新
cache.set(f"equipment_{equipId}", {"running_state": last_mrs, "running_state_timex": last_timex}, timeout=None) # 更新缓存
Equipment.objects.filter(id=equipId).update(running_state=last_mrs) # 更新数据库
else:
eq_rs_cache = get_eq_rs()
eq_rs_change = False
if eq_rs_cache["running_state"] != last_mrs: # 如果状态变动了要调用方法否则只需更新缓存
eq_rs_change = True
cache.set(f"equipment_{equipId}", {"running_state": last_mrs, "running_state_timex": last_timex}, timeout=None) # 更新缓存
if eq_rs_change:
ctask_run.delay("apps.em.services.shutdown_or_startup", equipId, last_timex, last_mrs)
def shutdown_or_startup(equipId: str, last_timex: datetime, last_mrs):
"""
last_mrs 设备运行状态值
"""
from apps.wpm.models import StLog
from apps.wpm.tasks import cal_exp_duration_hour
from apps.wpm.services import get_sflog
equip = Equipment.objects.get(id=equipId)
equip.running_state = last_mrs
equip.save(update_fields=["running_state"])
mgroup: Mgroup = equip.mgroup
indicate = equip.indicate_mgroup_running
if mgroup and indicate:
mrun = None
if last_mrs in [Equipment.STOP, Equipment.FAILURE, Equipment.STANDBY]: # 设备停止信号
if indicate in [Equipment.IM_DANDAN, Equipment.IM_DOUDAN]:
mrun= False
else:
if not Equipment.objects.filter(mgroup=mgroup, indicate_mgroup_running=indicate, running_state=Equipment.RUNING).exists():
mrun = False
elif last_mrs == Equipment.RUNING: # 设备启动信号
if indicate in [Equipment.IM_DANDAN, Equipment.IM_DANDOU]:
mrun= True
else:
if not Equipment.objects.filter(mgroup=mgroup, indicate_mgroup_running=indicate, running_state__in=[Equipment.STOP, Equipment.FAILURE, Equipment.STANDBY]).exists():
mrun = True
if mrun is not None:
mgroup.is_runing = mrun
mgroup.save(update_fields=["is_runing"])
last_stlog = StLog.objects.filter(mgroup=mgroup, is_shutdown=True).order_by("-start_time").first() # 找到最后一次停机记录
if last_stlog:
if last_timex >= last_stlog.start_time: # 认为是有效信号
if last_stlog.end_time is None and mrun: # 从停到开
last_stlog.end_time = last_timex
last_stlog.duration = (last_stlog.end_time - last_stlog.start_time).total_seconds() / 3600
last_stlog.save()
cal_exp_duration_hour(last_stlog.id) # 触发时间分配
elif last_stlog.end_time and mrun is False and last_timex > last_stlog.end_time: # 从开到停
StLog.objects.create(title="停机", is_shutdown=True, mgroup=mgroup, end_time=None, start_time=last_timex, sflog=get_sflog(mgroup, last_timex))
elif mrun is False:
StLog.objects.create(title="停机", is_shutdown=True, mgroup=mgroup, end_time=None, start_time=last_timex, sflog=get_sflog(mgroup, last_timex))
mgroup.is_runing = False
mgroup.save()
def daoru_equipment(path: str):
from apps.utils.snowflake import idWorker
from openpyxl import load_workbook
wb = load_workbook(path)
sheet = wb["em_equipment"]
i = 2
while sheet[f"a{i}"].value:
name = sheet[f"a{i}"].value
number = sheet[f"b{i}"].value
model = sheet[f"c{i}"].value
parameter = sheet[f"d{i}"].value
place = sheet[f"e{i}"].value
power_kw = sheet[f"f{i}"].value
belong_dept_name = sheet[f"g{i}"].value
mgroup_name = sheet[f"h{i}"].value
Equipment.objects.get_or_create(
number=number,
defaults={
"id": idWorker.get_id(),
"name": name,
"model": model,
"parameter": parameter,
"place": place,
"power_kw": power_kw,
"belong_dept": Dept.objects.get(name=belong_dept_name) if belong_dept_name else None,
"mgroup": Mgroup.objects.get(name=mgroup_name) if mgroup_name else None,
},
)
i = i + 1