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