health_index_service.py 3.04 KB
Newer Older
lcn's avatar
lcn committed
1
import time
wang.wenrong's avatar
wang.wenrong committed
2 3
from unify_api.modules.electric.dao.electric_dao import \
    get_elec_mtid_sid_by_cid
lcn's avatar
lcn committed
4 5 6 7
from unify_api.utils.common_utils import round_2
from pot_libs.logger import log
from unify_api.modules.home_page.procedures.dev_grade import get_dev_grade
from unify_api.utils import time_format
ZZH's avatar
ZZH committed
8
from pot_libs.utils.exc_util import ParamException, BusinessException
lcn's avatar
lcn committed
9 10
from unify_api.modules.home_page.components.health_index import \
    HealthCtlRateRes
ZZH's avatar
ZZH committed
11
from unify_api.modules.zhiwei_u.dao.warning_operations_dao import \
lcn's avatar
lcn committed
12
    select_point_dao
ZZH's avatar
ZZH committed
13 14 15
from unify_api.modules.electric.service.electric_service import (
    batch_load_rt_ele_with_hr
)
lcn's avatar
lcn committed
16 17


ZZH's avatar
ZZH committed
18
async def health_ctl_rate_srv(cid):
lcn's avatar
lcn committed
19 20 21
    if cid <= 0:
        log.error("param error")
        raise ParamException(message="参数错误, cid参数必须是一个正整数!")
ZZH's avatar
ZZH committed
22 23

    if not await select_point_dao(cid):
lcn's avatar
lcn committed
24 25
        log.error("cid:%s no point da;ta" % cid)
        raise BusinessException(message="工厂没有任何监测点!")
ZZH's avatar
ZZH committed
26

lcn's avatar
lcn committed
27 28
    stats = {"lf": 0, "costtl": 0, "freq_dev": 0, "thdu": 0, "v_dev": 0,
             "ubl": 0}
wang.wenrong's avatar
wang.wenrong committed
29

ZZH's avatar
ZZH committed
30 31
    lst_mtid_sid = await get_elec_mtid_sid_by_cid(cid)
    mtids = [mtid_sid["mtid"] for mtid_sid in lst_mtid_sid]
wang.wenrong's avatar
wang.wenrong committed
32

ZZH's avatar
ZZH committed
33 34 35
    d_rt_ele = await batch_load_rt_ele_with_hr(mtids)
    for mtid, rt_ele in d_rt_ele.items():
        ctnum = rt_ele.get("ctnum")
wang.wenrong's avatar
wang.wenrong committed
36
        # 电压偏差
ZZH's avatar
ZZH committed
37
        v_dev = rt_ele.get("ua_dev") if ctnum == 3 else rt_ele.get("uab_dev")
wang.wenrong's avatar
wang.wenrong committed
38 39 40
        grade = get_dev_grade(dev_type="v", cur=v_dev)
        if grade and grade >= 60:
            stats["v_dev"] += 1
ZZH's avatar
ZZH committed
41

wang.wenrong's avatar
wang.wenrong committed
42
        # 频率偏差
ZZH's avatar
ZZH committed
43
        grade = get_dev_grade(dev_type="freq", cur=rt_ele.get("freq_dev"))
wang.wenrong's avatar
wang.wenrong committed
44 45
        if grade and grade >= 60:
            stats["freq_dev"] += 1
ZZH's avatar
ZZH committed
46

wang.wenrong's avatar
wang.wenrong committed
47
        # 三相电压不平衡度
ZZH's avatar
ZZH committed
48
        grade = get_dev_grade(dev_type="ubl", cur=rt_ele.get("ubl"))
wang.wenrong's avatar
wang.wenrong committed
49 50
        if grade and grade >= 60:
            stats["ubl"] += 1
ZZH's avatar
ZZH committed
51

wang.wenrong's avatar
wang.wenrong committed
52
        # 功率因数
ZZH's avatar
ZZH committed
53
        grade = get_dev_grade(dev_type="costtl", cur=rt_ele.get("costtl"))
wang.wenrong's avatar
wang.wenrong committed
54 55
        if grade and grade >= 60:
            stats["costtl"] += 1
ZZH's avatar
ZZH committed
56

wang.wenrong's avatar
wang.wenrong committed
57
        # (电压)谐波畸变率
ZZH's avatar
ZZH committed
58
        thdu = rt_ele.get("thdua") if ctnum == 3 else rt_ele.get("thduab")
wang.wenrong's avatar
wang.wenrong committed
59 60 61
        grade = get_dev_grade(dev_type="thdu", cur=thdu)
        if grade and grade >= 60:
            stats["thdu"] += 1
ZZH's avatar
ZZH committed
62

wang.wenrong's avatar
wang.wenrong committed
63
        # 负载率
ZZH's avatar
ZZH committed
64
        lf = rt_ele.get("lf")
wang.wenrong's avatar
wang.wenrong committed
65 66 67 68 69 70
        if lf is None:
            stats["lf"] += 1
        else:
            grade = get_dev_grade(dev_type="lf", cur=lf)
            if grade and grade >= 60:
                stats["lf"] += 1
ZZH's avatar
ZZH committed
71 72 73

    time_str = time_format.get_datetime_str(int(time.time()))
    total = len(d_rt_ele)
lcn's avatar
lcn committed
74
    if total == 0:
ZZH's avatar
ZZH committed
75 76
        return HealthCtlRateRes(real_time=time_str, lf=1, costtl=1, thdu=1,
                                v_dev=1, freq_dev=1, ubl=1)
lcn's avatar
lcn committed
77 78 79 80 81 82 83 84 85
    return HealthCtlRateRes(
        real_time=time_str,
        lf=round_2(stats["lf"] / total),
        costtl=round_2(stats["costtl"] / total),
        thdu=round_2(stats["thdu"] / total),
        v_dev=round_2(stats["v_dev"] / total),
        freq_dev=round_2(stats["freq_dev"] / total),
        ubl=round_2(stats["ubl"] / total),
    )