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