security_info_pds.py 4.98 KB
Newer Older
lcn's avatar
lcn committed
1
from pot_libs.logger import log
lcn's avatar
lcn committed
2
from pot_libs.mysql_util.mysql_util import MysqlUtil
ZZH's avatar
ZZH committed
3
from unify_api.constants import Importance
lcn's avatar
lcn committed
4 5 6 7
from unify_api.modules.common.procedures.common_cps import (
    proxy_safe_run_info,
    alarm_time_distribution,
)
ZZH's avatar
ZZH committed
8
from unify_api.utils.time_format import proxy_power_slots, day_slots
lcn's avatar
lcn committed
9 10 11


async def alarm_count_info(company_ids, start, end, date_type):
lcn's avatar
lcn committed
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
    if date_type == "day":
        date_fmt = "DATE_FORMAT(event_datetime,'%%H')"
        slots = day_slots('hours')
    else:
        # date_type == "month"
        date_fmt = "DATE_FORMAT(event_datetime,'%%m-%%d')"
        slots = proxy_power_slots(start, end, "MM-DD", True)
    alarm_sql = f"""
        select {date_fmt} date,importance,count(*) count from point_1min_event
        where cid in %s and event_datetime between %s and %s
        group by {date_fmt},importance
    """
    cid_sql = f"""
        select cid,count(*) count from point_1min_event
        where cid in %s and event_datetime between %s and %s
        group by cid
    """
    type_sql = f"""
        select event_type,count(*) count from point_1min_event
        where cid in %s and event_datetime between %s and %s
        group by event_type
    """
    async with MysqlUtil() as conn:
        args = (company_ids, start, end)
        alarm_result = await conn.fetchall(sql=alarm_sql, args=args)
        cid_result = await conn.fetchall(sql=cid_sql, args=args)
        type_result = await conn.fetchall(sql=type_sql, args=args)
ZZH's avatar
ZZH committed
39

lcn's avatar
lcn committed
40 41 42
    first_alarm = {"slots": [], "value": [0] * len(slots)}
    second_alarm = {"slots": [], "value": [0] * len(slots)}
    third_alarm = {"slots": [], "value": [0] * len(slots)}
ZZH's avatar
ZZH committed
43

lcn's avatar
lcn committed
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
    cid_alarm_cnt_map = {i["cid"]: i["count"] for i in cid_result}
    type_alarm_cnt_map = {i["event_type"]: i["count"] for i in type_result}
    for index, slot in enumerate(slots):
        show_slot = slot + ":00" if date_type == "day" else slot
        first_alarm["slots"].append(show_slot)
        second_alarm["slots"].append(show_slot)
        third_alarm["slots"].append(show_slot)
        for item in alarm_result:
            if item.get("date") == slot:
                if item["importance"] == Importance.First.value:
                    first_alarm["value"][index] += item["count"]
                elif item["importance"] == Importance.Second.value:
                    second_alarm["value"][index] += item["count"]
                elif item["importance"] == Importance.Third.value:
                    third_alarm["value"][index] += item["count"]
ZZH's avatar
ZZH committed
59

lcn's avatar
lcn committed
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
    log.info(f"first_alarm={first_alarm}")
    log.info(f"second_alarm={second_alarm}")
    log.info(f"third_alarm={third_alarm}")
    return {
        "first_alarm": first_alarm,
        "second_alarm": second_alarm,
        "third_alarm": third_alarm,
        "cid_alarm_cnt_map": cid_alarm_cnt_map,
        "type_alarm_cnt_map": type_alarm_cnt_map,
    }


async def alarm_summary(company_ids, start, end, date_type):
    """
    电参数,温度,漏电流时间分布
    :param company_ids:
    :param start:
    :param end:
    :param date_type:
    :return:
    """
lcn's avatar
lcn committed
81 82 83 84 85 86 87 88 89 90
    sql = f"""
        select cid,count(*) count from point_1min_event
        where cid in %s and event_mode = 'alarm' and  event_datetime >= %s
        and event_datetime <= %s
        group by cid
    """
    log.info("alarm_summary sql={}".format(sql))
    async with MysqlUtil() as conn:
        datas = await conn.fetchall(sql, args=(company_ids, start, end))
        print(f"datas = {datas}")
lcn's avatar
lcn committed
91
    total_alarm_cnt, alarm_company_cnt = sum(
lcn's avatar
lcn committed
92 93
        [i["count"] for i in datas]), len(datas)
    cid_alarmcnt_list = [i["count"] for i in datas]
ZZH's avatar
ZZH committed
94

lcn's avatar
lcn committed
95 96
    safe_run_map = await proxy_safe_run_info(company_ids, start_time_str=start,
                                             end_time_str=end)
lcn's avatar
lcn committed
97
    log.info(f"alarm_summary safe_run_map======{safe_run_map}")
lcn's avatar
lcn committed
98 99
    safe_run_days = sum(
        [safe_run_map[cid]["safe_run_days"] for cid in safe_run_map])
ZZH's avatar
ZZH committed
100

lcn's avatar
lcn committed
101
    # 时间分布: 白天, 黑夜, 凌晨
lcn's avatar
lcn committed
102 103
    time_distribution_map = await alarm_time_distribution(company_ids, start,
                                                          end)
ZZH's avatar
ZZH committed
104

lcn's avatar
lcn committed
105 106 107 108 109 110 111 112
    total_valid_company = 0
    for cid in safe_run_map:
        # 选择的这段时间,客户必须已经接入进来才算
        if safe_run_map[cid]["total_days"] != 0:
            total_valid_company += 1
    summary_map = {
        "total_alarm_cnt": total_alarm_cnt,
        "alarm_company_cnt": alarm_company_cnt,
lcn's avatar
lcn committed
113 114
        "avg_alarm_cnt": round(total_alarm_cnt / alarm_company_cnt,
                               1) if alarm_company_cnt else 0,
lcn's avatar
lcn committed
115 116
        "max_alarm_cnt": max(cid_alarmcnt_list) if cid_alarmcnt_list else 0,
        "safe_run_days": safe_run_days,
lcn's avatar
lcn committed
117 118
        "avg_safe_run_days": round(safe_run_days / total_valid_company,
                                   1) if total_valid_company else 0,
lcn's avatar
lcn committed
119 120 121 122 123
        "day_alarm_cnt": time_distribution_map["day_alarm_cnt"],
        "night_alarm_cnt": time_distribution_map["night_alarm_cnt"],
        "morning_alarm_cnt": time_distribution_map["morning_alarm_cnt"],
    }
    return summary_map