fine_monitor_serv.py 9.48 KB
Newer Older
wang.wenrong's avatar
wang.wenrong committed
1
from unify_api.modules.common.dao.common_dao import get_fields_by_mtid
wang.wenrong's avatar
wang.wenrong committed
2
from pot_libs.logger import log
wang.wenrong's avatar
wang.wenrong committed
3 4
from unify_api.modules.anshiu.dao.fine_monitor_dao import get_aiao_1min_dao, \
    get_aiao_1day_dao, get_aiao_15min_dao, get_point_15min_chart_dao, \
wang.wenrong's avatar
wang.wenrong committed
5 6
    get_point_1day_chart_dao, get_point_1min_chart_dao, get_point_monitor_dao, \
    electric_index_list_dao, electric_index_location_dao
wang.wenrong's avatar
wang.wenrong committed
7 8 9 10
from unify_api.modules.electric.procedures.electric_util import (
    get_wiring_type
)
from unify_api.modules.anshiu.components.fine_monitor_cps import (
lcn's avatar
lcn committed
11
    ElectricIndexParam
wang.wenrong's avatar
wang.wenrong committed
12 13
)
from unify_api.modules.anshiu.procedures.fine_monitor_pds import (
wang.wenrong's avatar
wang.wenrong committed
14
    get_threshold_by_location, get_aiao_1min_pds,
wang.wenrong's avatar
wang.wenrong committed
15 16 17 18
    get_aiao_data_pds, get_point_1min_chart_pds, get_point_data_chart_pds,
    GENERAL_PARAM_FIELD_2, ELECTRIC_QUALITY_FIELD_2,
    GENERAL_PARAM_FIELD_3, ELECTRIC_QUALITY_FIELD_3, cal_electic_value,
    cal_aiao_value, cal_pt_value
wang.wenrong's avatar
wang.wenrong committed
19

wang.wenrong's avatar
wang.wenrong committed
20
)
wang.wenrong's avatar
wang.wenrong committed
21
from unify_api.utils.time_format import get_time_diff
wang.wenrong's avatar
wang.wenrong committed
22 23


wang.wenrong's avatar
wang.wenrong committed
24 25
async def get_adio_chart_data(location_group, location_info, date_start,
                              date_end, intervel, slots):
wang.wenrong's avatar
wang.wenrong committed
26
    '''
wang.wenrong's avatar
wang.wenrong committed
27
    获取环境(温度与漏电流)的曲线数据
wang.wenrong's avatar
wang.wenrong committed
28
    '''
wang.wenrong's avatar
wang.wenrong committed
29
    temp, res = [], []
wang.wenrong's avatar
wang.wenrong committed
30
    # 工况标准,取其中一个漏电流阈值
wang.wenrong's avatar
wang.wenrong committed
31
    res_curr_th = await get_threshold_by_location(
wang.wenrong's avatar
wang.wenrong committed
32
        location_group)
wang.wenrong's avatar
wang.wenrong committed
33 34
    mtid = location_info[0]['mtid']
    if 15 * 60 >= intervel > 60:
wang.wenrong's avatar
wang.wenrong committed
35
        # 取时间间隔为15min的数据
wang.wenrong's avatar
wang.wenrong committed
36 37 38 39 40 41
        temp_res_data = await get_aiao_15min_dao(mtid, date_start, date_end)
        temp, res = await get_aiao_data_pds(slots, temp_res_data, res_curr_th)
    elif intervel == 86400:
        # 取时间间隔为1day的数据
        temp_res_data = await get_aiao_1day_dao(mtid, date_start, date_end)
        temp, res = await get_aiao_data_pds(slots, temp_res_data, res_curr_th)
wang.wenrong's avatar
wang.wenrong committed
42 43
    else:
        # 取时间间隔为1min的数据
wang.wenrong's avatar
wang.wenrong committed
44 45
        temp_res_data = await get_aiao_1min_dao(mtid, date_start, date_end)
        temp, res = await get_aiao_1min_pds(slots, temp_res_data, res_curr_th)
lcn's avatar
lcn committed
46
    
wang.wenrong's avatar
wang.wenrong committed
47
    return temp, res
wang.wenrong's avatar
wang.wenrong committed
48 49


wang.wenrong's avatar
wang.wenrong committed
50 51
async def get_point_chart_data(point_id, date_start, date_end, intervel,
                               slots):
wang.wenrong's avatar
wang.wenrong committed
52 53 54
    '''
        获取电气量
    '''
lcn's avatar
lcn committed
55
    
wang.wenrong's avatar
wang.wenrong committed
56
    # 获取当前监测点的接表法
wang.wenrong's avatar
wang.wenrong committed
57
    ctnum, mtid = await get_wiring_type(point_id)
lcn's avatar
lcn committed
58
    
wang.wenrong's avatar
wang.wenrong committed
59 60 61 62 63
    if ctnum not in [2, 3]:
        log.error(
            f"elec_index point_id={point_id} ctnum={ctnum} 找不到ctnum , 监测点已经拆除")
        # 返回的数值不在2,3中的,一般是装置点已经拆除。默认先给一个默认值3
        ctnum = 3
lcn's avatar
lcn committed
64
    
wang.wenrong's avatar
wang.wenrong committed
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
    if ctnum == 2:
        stats_items = [
            "pttl_mean",
            "qttl_mean",
            "uab_mean",
            "ucb_mean",
            "ia_mean",
            "ic_mean",
        ]
    else:
        stats_items = [
            "pttl_mean",
            "qttl_mean",
            "ua_mean",
            "ub_mean",
            "uc_mean",
            "ia_mean",
            "ib_mean",
            "ic_mean",
        ]
lcn's avatar
lcn committed
85
    
wang.wenrong's avatar
wang.wenrong committed
86
    if 15 * 60 >= intervel > 60:
wang.wenrong's avatar
wang.wenrong committed
87 88
        elec_data = await get_point_15min_chart_dao(mtid, stats_items,
                                                    date_start,
wang.wenrong's avatar
wang.wenrong committed
89
                                                    date_end)
lcn's avatar
lcn committed
90 91
        i, v, power = await get_point_data_chart_pds(ctnum, slots, elec_data)
    
wang.wenrong's avatar
wang.wenrong committed
92
    elif intervel == 86400:
wang.wenrong's avatar
wang.wenrong committed
93 94
        elec_data = await get_point_1day_chart_dao(mtid, stats_items,
                                                   date_start,
wang.wenrong's avatar
wang.wenrong committed
95
                                                   date_end)
lcn's avatar
lcn committed
96
        i, v, power = await get_point_data_chart_pds(ctnum, slots, elec_data)
wang.wenrong's avatar
wang.wenrong committed
97
    else:
wang.wenrong's avatar
wang.wenrong committed
98 99
        elec_data = await get_point_1min_chart_dao(mtid, ctnum, date_start,
                                                   date_end)
lcn's avatar
lcn committed
100 101 102
        i, v, power = await get_point_1min_chart_pds(ctnum, slots, elec_data)
    
    return power, i, v, ctnum
wang.wenrong's avatar
wang.wenrong committed
103 104


wang.wenrong's avatar
wang.wenrong committed
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
async def electric_index_list_service(mtid, start_time, end_time,
                                      param_types=None):
    """
    用电指标数据列表
    :param mtid:
    :param start_time:
    :param end_time:
    :param param_types:
    :return:
    """
    general_param, electric_quality, safe_param = [], [], []
    # 1,获取信息
    monitor = await get_fields_by_mtid(mtid)
    if not monitor:
        return -1, general_param, electric_quality, safe_param
lcn's avatar
lcn committed
120
    
wang.wenrong's avatar
wang.wenrong committed
121 122 123 124
    time_diff = get_time_diff(start_time, end_time)
    if time_diff <= 24 * 3600:
        table_name = "point_15min_electric"
        aiao_table_name = "location_15min_aiao"
lcn's avatar
lcn committed
125
    
wang.wenrong's avatar
wang.wenrong committed
126 127 128
    else:
        table_name = "point_1day_electric"
        aiao_table_name = "location_1day_aiao"
lcn's avatar
lcn committed
129
    
wang.wenrong's avatar
wang.wenrong committed
130 131
    # 字段是否需要组装mtid(前端下载要求的)
    is_merge_mtid = mtid if param_types else None
lcn's avatar
lcn committed
132
    
wang.wenrong's avatar
wang.wenrong committed
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
    if monitor.get("m_type") == 126:
        pt_info = await get_fields_by_mtid(mtid, "pt_info", "pt_id")
        if not pt_info:
            return -1, general_param, electric_quality, safe_param
        pt_id = pt_info.get("pt_id")
        # 电容
        ctnum, pt_datas = 0, []
        # 安全参数
        if not param_types or 'safe_param' in param_types:
            safe_param = cal_pt_value(pt_datas, is_merge_mtid)
            if not param_types:
                safe_param = electric_index_list_return_data(safe_param)
    else:
        monitor_info = await get_point_monitor_dao(mtid)
        if not monitor_info:
            return -1, general_param, electric_quality, safe_param
        ctnum = monitor_info.get("ctnum") or 3
lcn's avatar
lcn committed
150
        
wang.wenrong's avatar
wang.wenrong committed
151 152 153 154 155 156 157 158 159 160
        datas, locations_datas, aiao_datas = [], [], []
        if (not param_types or 'general_param' in param_types or
                'electric_quality' in param_types):
            datas = await electric_index_list_dao(table_name,
                                                  monitor_info.get("pid"),
                                                  start_time,
                                                  end_time)
        if not param_types or 'safe_param' in param_types:
            locations_datas, aiao_datas = await electric_index_location_dao(
                aiao_table_name, mtid, start_time, end_time)
lcn's avatar
lcn committed
161
        
wang.wenrong's avatar
wang.wenrong committed
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
        # 2,封装信息
        if ctnum == 2:
            general_param_field = GENERAL_PARAM_FIELD_2
            electric_quality_field = ELECTRIC_QUALITY_FIELD_2
        else:
            general_param_field = GENERAL_PARAM_FIELD_3
            electric_quality_field = ELECTRIC_QUALITY_FIELD_3
        # 常规参数统计
        if not param_types or 'general_param' in param_types:
            general_param = cal_electic_value(datas, general_param_field,
                                              is_merge_mtid)
            if not param_types:
                general_param = electric_index_list_return_data(general_param)
        # 电能质量统计
        if not param_types or 'electric_quality' in param_types:
            electric_quality = cal_electic_value(datas, electric_quality_field,
                                                 is_merge_mtid)
            if not param_types:
                electric_quality = electric_index_list_return_data(
                    electric_quality)
        # 安全参数
        if not param_types or 'safe_param' in param_types:
            safe_param = cal_aiao_value(locations_datas, aiao_datas,
                                        is_merge_mtid)
            if not param_types:
                safe_param = electric_index_list_return_data(safe_param)
lcn's avatar
lcn committed
188
    
wang.wenrong's avatar
wang.wenrong committed
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
    # 3,返回信息
    return ctnum, general_param, electric_quality, safe_param


async def electric_index_export_service(cid, mtids, start_time, end_time,
                                        param_types=None):
    """
    用电指标数据导出
    :param cid:
    :param mtids:
    :param start_time:
    :param end_time:
    :param param_types:
    :return:
    """
    general_param_list = []
    electric_quality_list = []
    safe_param_list = []
    ctnums = []
    for mtid in mtids:
        ctnum, general_one, electric_one, safe_one = await \
            electric_index_list_service(mtid, start_time, end_time,
                                        param_types)
        if ctnum == 0:
            return 0, [], [], []
        general_param_list.extend(general_one)
        electric_quality_list.extend(electric_one)
        safe_param_list.extend(safe_one)
        ctnums.append(ctnum)
    if len(set(ctnums)) > 1:
        return -1, [], [], []
lcn's avatar
lcn committed
220
    
wang.wenrong's avatar
wang.wenrong committed
221 222 223 224
    general_param, electric_quality, safe_param = [], [], []
    # 常规参数
    if 'general_param' in param_types:
        general_param = electric_index_export_return_data(general_param_list)
lcn's avatar
lcn committed
225
    
wang.wenrong's avatar
wang.wenrong committed
226 227 228 229 230 231 232
    # 用电质量
    if 'electric_quality' in param_types:
        electric_quality = electric_index_export_return_data(
            electric_quality_list)
    # 安全参数
    if 'safe_param' in param_types:
        safe_param = electric_index_export_return_data(safe_param_list)
lcn's avatar
lcn committed
233
    
wang.wenrong's avatar
wang.wenrong committed
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
    # 2,返回信息
    return 1, general_param, electric_quality, safe_param


def electric_index_list_return_data(datas):
    """
    用电指标列表数据打包
    :param datas:
    :return:
    """
    index_list = []
    for data in datas:
        electric_index = ElectricIndexParam(**data)
        index_list.append(electric_index)
    return index_list


def electric_index_export_return_data(datas):
    """
    用电指标导出数据打包
    :param datas:
    :return:
    """
    export_dict = dict()
    for data in datas:
        if data["index"] not in export_dict:
            export_dict[data["index"]] = data
        else:
            export_dict[data["index"]].update(data)
    return list(export_dict.values())