tsp_map_service.py 6.55 KB
Newer Older
lcn's avatar
lcn committed
1 2 3 4 5 6 7 8 9 10 11 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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
import logging
import math
import datetime
from unify_api.utils import time_format
from unify_api.modules.tsp_water.dao.tsp_map_dao import get_index_data_dao, \
    get_position_dao, get_tsp_id_list_dao, get_month_rank_dao
from unify_api.modules.tsp_water.dao.tsp_dao import meterdata_tsp_current
from unify_api.modules.tsp_water.components.tsp_map_cps import \
    IndexDataResp, IndexTopDataResp
from unify_api.modules.common.procedures.cids import get_cids
from unify_api.constants import Product
from unify_api.modules.tsp_water.script.stateweath import downscal
from pot_libs.common.components.responses import success_res
from unify_api.utils.response_code import RET


async def tsp_map_service(user_id):
    datas = await get_index_data_dao()
    companys = {data["cid"]: data for data in datas}
    all_cids = await get_cids(user_id, Product.YangChen.value)
    myself_company = list(set(companys.keys()) & set(all_cids))
    if not myself_company:
        return success_res(code=RET.permissions_no_enough, msg="权限不足")
    # 地图数据
    try:
        res = downscal()
        # res[(res["lon"]==113.944396) & (res["lat"]==22.512695)] linux获取不到数据
        # windows可以获取  所以采取直接用行数获取数据
        # downscal如果换了文件 这个数值需要换
        corsp_val = res.iloc[2223].values
        corsp_val_2 = round(corsp_val[2])
        corsp_val_3 = round(corsp_val[3])
    except Exception as e:
        corsp_val, corsp_val_2, corsp_val_3 = 0, "", ""
    # 经纬度
    positions = await get_position_dao(myself_company)
    company_data = []
    tsp_ids = await get_tsp_id_list_dao(myself_company)
    tsp_id_dict = {data["cid"]: data["tsp_ids"] for data in tsp_ids}
    for position in positions:
        if tsp_id_dict.get(position["cid"]).find(",") != -1:
            tsp_id_list = tsp_id_dict.get(position["cid"]).split(",")
        else:
            tsp_id_list = [tsp_id_dict.get(position["cid"])]
        tsp_data = []
        for tsp_id in tsp_id_list:
            tsp_id_data = await meterdata_tsp_current(tsp_id)
            tsp_data.append(tsp_id_data)
        max_pm25 = max([tsp["pm25"] for tsp in tsp_data])
        max_pm10 = max([tsp["pm10"] for tsp in tsp_data])
        # max_tsp = max([tsp["tsp"] for tsp in tsp_data])
        logging.info(f"cid:{position['cid']}, tsp_data:{tsp_data}")
        if not isinstance(corsp_val, int):
            pm25_deviation = round(math.fabs((corsp_val_2-max_pm25)/max_pm25), 2)
            pm10_deviation = round(math.fabs((corsp_val_3-max_pm10)/max_pm10), 2)
        else:
            pm25_deviation, pm10_deviation = "", ""
        company_dict = {
            "company_info": {
                "cid": position["cid"],
                "ext_modules": [],
                "shortname": companys.get(position["cid"]).get("shortname"),
                "fullname": companys.get(position["cid"]).get("fullname"),
                "industry": companys.get(position["cid"]).get("industry"),
                "province": companys.get(position["cid"]).get("province"),
            },
            "position": position["value"],
            "pm25": {"actual": max_pm25, "theory": corsp_val_2,
                      "deviation": pm25_deviation},
            "pm10": {"actual": max_pm10, "theory": corsp_val_3,
                     "deviation": pm10_deviation},
            # "tsp": {"actual": max_tsp, "theory": "", "deviation": ""}
        }
        company_data.append(company_dict)
    return IndexDataResp(company_data=company_data)


async def index_top_data_service(user_id):
    datas = await get_index_data_dao()
    companys = {data["cid"]: data["shortname"] for data in datas}
    all_cids = await get_cids(user_id, Product.YangChen.value)
    myself_company = list(set(companys.keys()) & set(all_cids))
    if not myself_company:
        return success_res(code=RET.permissions_no_enough, msg="权限不足")
    # 经纬度
    positions = await get_position_dao(myself_company)
    tsp_ids = await get_tsp_id_list_dao(myself_company)
    tsp_id_dict = {data["cid"]: data["tsp_ids"] for data in tsp_ids}
    pm25_unusual, pm10_unusual, tsp_unusual, project_unusual = 0, 0, 0, 0
    for position in positions:
        if tsp_id_dict.get(position["cid"]).find(",") != -1:
            tsp_id_list = tsp_id_dict.get(position["cid"]).split(",")
        else:
            tsp_id_list = [tsp_id_dict.get(position["cid"])]
        tsp_data = []
        for tsp_id in tsp_id_list:
            tsp_id_data = await meterdata_tsp_current(tsp_id)
            tsp_data.append(tsp_id_data)
        max_pm25 = max([tsp["pm25"] for tsp in tsp_data])
        max_pm10 = max([tsp["pm10"] for tsp in tsp_data])
        max_tsp = max([tsp["tsp"] for tsp in tsp_data])
        # PM2.5异常:PM2.5超过75、PM10异常(PM10超过150)、TSP异常(TSP超过300)
        old_unusual = [pm25_unusual, pm10_unusual, tsp_unusual]
        logging.info(f"index-map old_unusual:{old_unusual}")
        pm25_unusual = pm25_unusual + 1 if max_pm25 > 75 else pm25_unusual
        pm10_unusual = pm10_unusual + 1 if max_pm10 > 150 else pm10_unusual
        tsp_unusual = tsp_unusual + 1 if max_tsp > 300 else tsp_unusual
        logging.info(f"index-map max_pm25:{max_pm25}, "
                     f"max_pm10:{max_pm10}, max_tsp:{max_tsp}")
        new_unusual = [pm25_unusual, pm10_unusual, tsp_unusual]
        logging.info(f"index-map new_unusual:{new_unusual}")
        # 空气达标率(项目总数减去存在异常的项目)
        project_unusual = project_unusual + 1 if \
            set(new_unusual) - set(old_unusual) else project_unusual
    count_project = len(myself_company)
    air_standard = round((count_project - project_unusual)/count_project) * 100
    # 月度统计排名
    rank_data = await get_month_rank(myself_company)
    rank_list = []
    for rank in rank_data:
        if not rank['measures']:
            ef_rate = 0
        else:
            ef_rate = f"{int(round(rank['effect']/rank['measures'], 2)*100)}%"
        rank_list.append({
            "cid": rank["cid"],
            "company": companys.get(rank["cid"]),
            "measures": rank["measures"] or 0,
            "effective_rate": ef_rate
        })
    return IndexTopDataResp(
        rank=rank_list, count_project=count_project, pm25_unusual=pm25_unusual,
        pm10_unusual=pm10_unusual, tsp_unusual=tsp_unusual,
        air_standard=f"{air_standard}%"
    )


# 首页获取月度排名
async def get_month_rank(cids):
    this_month = datetime.date.today()
    start, end = time_format.get_month_start_end(this_month)
    rank_data = await get_month_rank_dao(cids, start, end)
    return rank_data