feat:tkx 计量设备临期预警

This commit is contained in:
zty 2024-12-03 18:02:17 +08:00
parent a08e66a06a
commit 55b8564f0d
5 changed files with 102 additions and 18 deletions

View File

@ -0,0 +1,23 @@
# Generated by Django 3.2.12 on 2024-12-03 07:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('em', '0020_equipment_device_people'),
]
operations = [
migrations.AddField(
model_name='equipment',
name='check_days_number',
field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='临期检验预警(天)'),
),
migrations.AddField(
model_name='equipment',
name='state_measure',
field=models.PositiveIntegerField(choices=[(10, '正常'), (20, '告警'), (30, '过期'), (40, '等待')], default=40, verbose_name='计量设备状态'),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.12 on 2024-12-03 09:35
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('em', '0021_auto_20241203_1531'),
]
operations = [
migrations.AlterField(
model_name='equipment',
name='check_days_number',
field=models.PositiveSmallIntegerField(default=7, verbose_name='临期检验预警(天)'),
),
]

View File

@ -40,6 +40,11 @@ class Equipment(CommonBModel):
state_choices = ((EQUIP_STATE_OK, "完好"), (EQUIP_STATE_LIMIT, "限用"), (EQUIP_STATE_FIX, "在修"), (EQUIP_STATE_DISABLE, "禁用"), (EQUIP_STATE_SCRAP, "报废"))
EQUIP_TYPE_PRO = 10
EQUIP_TYPE_MEA = 20
EQ_NORMAL = 10
EQ_WARNING = 20
EQ_EXPIRED = 30
EQ_WAIT = 40
measure_state_choices = ((EQ_NORMAL, "正常"), (EQ_WARNING, "告警"), (EQ_EXPIRED, "过期"), (EQ_WAIT, "等待"))
# mgmtype_choices = (
# (1, 'A'),
# (2, 'B'),
@ -104,6 +109,8 @@ class Equipment(CommonBModel):
cycle = models.PositiveSmallIntegerField("校准或检定周期(月)", null=True, blank=True)
check_date = models.DateField("最近校准检查日期", blank=True, null=True)
next_check_date = models.DateField("预计下次校准检查日期", blank=True, null=True)
state_measure = models.PositiveIntegerField("计量设备状态", choices=measure_state_choices, default=EQ_WAIT)
check_days_number = models.PositiveSmallIntegerField("临期检验预警(天)", default=7)
power_kw = models.FloatField("功率", null=True, blank=True)
coordinates = models.JSONField("坐标", default=dict, blank=True)

View File

@ -6,7 +6,7 @@ from django.utils.timezone import localtime
from apps.em.models import Equipment
from apps.em.services import set_eq_rs, get_eq_rs, shutdown_or_startup
from apps.mtm.models import Mgroup
from django.utils import timezone
@shared_task(base=CustomTask)
def check_equipment_offline(seconds=30):
@ -35,4 +35,37 @@ def check_mgroup_running():
# if rs['running_state'] == Equipment.OFFLINE: # 如果掉线了不关心
# pass
# else:
# shutdown_or_startup(equip.id, rs["running_state_timex"], rs["running_state"])
# shutdown_or_startup(equip.id, rs["running_state_timex"], rs["running_state"])
@shared_task(base=CustomTask)
def check_equipment_measure_time():
"""
监测设备检定状态
"""
all_equips = Equipment.objects.values('id', 'check_days_number', 'next_check_date', 'state_measure')
for equip in all_equips:
if equip['check_days_number'] and equip['next_check_date']:
# 更新检定状态
now = localtime().date()
if equip['next_check_date'] <= now :
Equipment.objects.filter(id=equip['id']).update(state_measure=Equipment.EQ_EXPIRED)
elif equip['next_check_date'] - now <= timezone.timedelta(days=equip['check_days_number']):
Equipment.objects.filter(id=equip['id']).update(state_measure=Equipment.EQ_WARNING)
else:
Equipment.objects.filter(id=equip['id']).update(state_measure=Equipment.EQ_NORMAL)
else:
Equipment.objects.filter(id=equip['id']).update(state_measure=Equipment.EQ_WAIT)
# if instance.check_days_number and instance.next_check_date:
# # 更新检定状态
# now = timezone.localtime().date()
# if instance.next_check_date <= now :
# instance.state_measure = Equipment.EQ_EXPIRED
# elif instance.next_check_date - now <= timezone.timedelta(days=instance.check_days_number):
# instance.state_measure = Equipment.EQ_WARNING
# else:
# instance.state_measure = Equipment.EQ_NORMAL
# else:
# instance.state_measure = Equipment.EQ_WAIT
# instance.save()

View File

@ -5,6 +5,7 @@ from celery import shared_task
from apps.enm.models import MpLogx, Mpoint, MpointStat, EnStat, EnStat2, Xscript
from apps.wpm.models import SfLog
import datetime
from django.db.models import Q
from django.db.models import Sum, Avg
from dateutil import tz
from django.conf import settings
@ -128,12 +129,10 @@ def update_mpoint_val(month, hour):
"""
high:用电高峰时段8小时800--1100 1900--2400 更新val_level high
"""
from datetime import time
from django.db.models import Q
if hour in [8, 9, 10, 19, 20, 21, 22, 23]:
high_time_ranges = [
(time(8, 0), time(11, 0)), # 上午高峰
(time(19, 0), time(23, 59)), # 晚上高峰
(8, 11), # 上午高峰(小时数范围)
(19, 23), # 晚上高峰(小时数范围)
]
# 构建查询条件
time_conditions = Q()
@ -149,9 +148,9 @@ def update_mpoint_val(month, hour):
"""
if hour in [11, 12, 17, 18, 0, 1, 2, 3]:
flat_time_ranges = [
(time(11, 0), time(13, 0)), # 上午平谷
(time(17, 0), time(19, 0)),
(time(0, 0), time(4, 0)), # 晚上平谷
(11, 13), # 上午平谷
(17, 19), # 晚上平谷
(0, 4),
]
# 构建查询条件
time_conditions = Q()
@ -165,8 +164,8 @@ def update_mpoint_val(month, hour):
"""
if hour in [4, 5, 6, 7, 13, 14, 15, 16]:
low_time_ranges = [
(time(4, 0), time(8, 0)), # 上午低谷
(time(13, 0), time(17, 0)), # 晚上低谷
(4, 8), # 上午低谷
(13, 17), # 晚上低谷
]
# 构建查询条件
time_conditions = Q()
@ -181,7 +180,7 @@ def update_mpoint_val(month, hour):
if month in [5, 6, 7, 8] and hour in [14, 15]:
deep_months = [5, 6, 7, 8]
deep_time_ranges = [
(time(14, 0), time(16, 0)), # 1400--1600
(14, 16), # 1400--1600
]
# 构建查询条件
time_conditions = Q()
@ -197,8 +196,10 @@ def update_mpoint_val(month, hour):
peak:用电高峰 11112月份 1900-2100 -- 7 月份 2100-2300 更新val_level peak
"""
if (month in [1, 11, 12] and hour in [19, 20, 21]) or (month == 7 and hour in [21, 22]):
peak_months = {(1, 11, 12): (time(19, 0), time(21, 0)),
(7,): (time(21, 0), time(23, 0)),}
peak_months = {
(1, 11, 12): (19, 21),
(7,): (21, 23)
}
for months, time_range in peak_months.items():
start_time, end_time = time_range
MpointStat.objects.filter(
@ -208,7 +209,7 @@ def update_mpoint_val(month, hour):
hour__gte = start_time,
hour__lt = end_time,
).update(val_level="peak")
return ''
@shared_task(base=CustomTask)
@ -237,7 +238,7 @@ def cal_mpointstat_hour(mpointId: str, year: int, month: int, day: int, hour: in
if mrs0.exists() and mrs.exists():
last_val = getattr(mrs.last(), f'val_{val_type}')
first_val = getattr(mrs0.last(), f'val_{val_type}')
if last_val >= first_val:
if last_val >= first_val or first_val == 0:
val = last_val - first_val
elif first_val - last_val > 0 and (first_val - last_val)/first_val < 0.01:
val = 0
@ -245,6 +246,7 @@ def cal_mpointstat_hour(mpointId: str, year: int, month: int, day: int, hour: in
else:
# 这里判断有可能清零了
max_val = max(mrs.aggregate(max=Max(f'val_{val_type}'))["max"], first_val)
myLogger.info(f'{mpoint.code}--{dt}--{last_val}--{first_val}--清零')
val = max_val - first_val + last_val
# if mpoint.code == 'x水泥+P.O42.5 散装':
@ -255,6 +257,7 @@ def cal_mpointstat_hour(mpointId: str, year: int, month: int, day: int, hour: in
return
ms, _ = MpointStat.objects.get_or_create(**params, defaults=params)
ms.val = ms.val_correct if ms.val_correct is not None else val
update_mpoint_val(month, hour)
# ms.val_level
ms.save()
@ -678,7 +681,7 @@ def cal_enstat(type, sflogId, mgroupId, year, month, day, hour, year_s, month_s,
if "pcoal" in this_cal_attrs:
if type in ["hour_s", "sflog", "day_s"]:
enstat.pcoal_heat = get_pcoal_heat(enstat.year_s, enstat.month_s, enstat.day_s)
enstat.pcoal_coal_consume = enstat.pcoal_consume * enstat.pcoal_heat / 7000
enstat.pcoal_coal_consume = enstat.pcoal_consume * enstat.pcoal_heat / 29307.6
elif type == "month_st":
enstat.pcoal_coal_consume = EnStat.objects.filter(type="sflog", mgroup=enstat.mgroup, year_s=year_s, month_s=month_s, sflog__team=enstat.team).aggregate(
sum=Sum("pcoal_coal_consume")
@ -909,7 +912,7 @@ def cal_enstat_pcoal_change(enstat: EnStat, new_pcoal_heat):
type = enstat.type
if type in ["hour_s", "sflog", "day_s"]:
enstat.pcoal_heat = new_pcoal_heat
enstat.pcoal_coal_consume = enstat.pcoal_consume * enstat.pcoal_heat / 7000
enstat.pcoal_coal_consume = enstat.pcoal_consume * enstat.pcoal_heat / 29307.6
elif type == "month_st":
enstat.pcoal_coal_consume = EnStat.objects.filter(type="sflog", mgroup=enstat.mgroup, year_s=enstat.year_s, month_s=enstat.month_s, sflog__team=enstat.team).aggregate(
sum=Sum("pcoal_coal_consume")