from pot_libs.logger import log from pot_libs.mysql_util.mysql_util import MysqlUtil from unify_api.constants import Importance from unify_api.modules.common.procedures.common_cps import ( proxy_safe_run_info, alarm_time_distribution, ) from unify_api.utils.time_format import proxy_power_slots, day_slots async def alarm_count_info(company_ids, start, end, date_type): 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) first_alarm = {"slots": [], "value": [0] * len(slots)} second_alarm = {"slots": [], "value": [0] * len(slots)} third_alarm = {"slots": [], "value": [0] * len(slots)} 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"] 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: """ 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}") total_alarm_cnt, alarm_company_cnt = sum( [i["count"] for i in datas]), len(datas) cid_alarmcnt_list = [i["count"] for i in datas] safe_run_map = await proxy_safe_run_info(company_ids, start_time_str=start, end_time_str=end) log.info(f"alarm_summary safe_run_map======{safe_run_map}") safe_run_days = sum( [safe_run_map[cid]["safe_run_days"] for cid in safe_run_map]) # 时间分布: 白天, 黑夜, 凌晨 time_distribution_map = await alarm_time_distribution(company_ids, start, end) 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, "avg_alarm_cnt": round(total_alarm_cnt / alarm_company_cnt, 1) if alarm_company_cnt else 0, "max_alarm_cnt": max(cid_alarmcnt_list) if cid_alarmcnt_list else 0, "safe_run_days": safe_run_days, "avg_safe_run_days": round(safe_run_days / total_valid_company, 1) if total_valid_company else 0, "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