Commit 61200aa0 authored by wang.wenrong's avatar wang.wenrong

Merge branch 'develop' into wwr

parents 9fc31e09 8663e19b
...@@ -19,7 +19,7 @@ async def point_day_power_dao(cid, start, end): ...@@ -19,7 +19,7 @@ async def point_day_power_dao(cid, start, end):
ORDER BY pp.create_time ORDER BY pp.create_time
""" """
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
data = await conn.fetchall(sql, args=(cid, )) data = await conn.fetchall(sql, args=(cid,))
return data return data
...@@ -31,7 +31,7 @@ async def get_total_kwh_dao(cid, start, end): ...@@ -31,7 +31,7 @@ async def get_total_kwh_dao(cid, start, end):
and pp.create_time<='{end}' and m.demolished=0 and pp.create_time<='{end}' and m.demolished=0
""" """
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
total_kwh = await conn.fetchone(sql, args=(cid, )) total_kwh = await conn.fetchone(sql, args=(cid,))
return total_kwh return total_kwh
...@@ -40,7 +40,7 @@ async def get_kwh_charge(table_name, name, value, start, end): ...@@ -40,7 +40,7 @@ async def get_kwh_charge(table_name, name, value, start, end):
f"FROM {table_name} where create_time>='{start}' and " \ f"FROM {table_name} where create_time>='{start}' and " \
f"create_time<='{end}' and {name} = %s" f"create_time<='{end}' and {name} = %s"
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
datas = await conn.fetchone(sql, args=(value, )) datas = await conn.fetchone(sql, args=(value,))
return datas return datas
...@@ -73,7 +73,7 @@ async def query_charge_aggs(date_start, date_end, cid_list): ...@@ -73,7 +73,7 @@ async def query_charge_aggs(date_start, date_end, cid_list):
""" """
start_es = convert_es_str(date_start) start_es = convert_es_str(date_start)
end_es = convert_es_str(date_end) end_es = convert_es_str(date_end)
query_body = { query_body = {
"size": 0, "size": 0,
"query": { "query": {
...@@ -138,132 +138,46 @@ async def power_charge_p_aggs(date_start, date_end, cid_list, interval): ...@@ -138,132 +138,46 @@ async def power_charge_p_aggs(date_start, date_end, cid_list, interval):
""" """
date_histogram, date_histogram,
""" """
start_es = convert_es_str(date_start) if interval == "hour":
end_es = convert_es_str(date_end) time_fmt = "%%Y-%%m-%%d %%H"
elif interval == "day":
query_body = { time_fmt = "%%Y-%%m-%%d"
"size": 0, else:
"query": { time_fmt = "%%Y-%%m-%%d %%H:%%i"
"bool": { sql = f"""
"must": [ select date_format(create_time,"{time_fmt}") as create_time,sum(kwh)
{ kwh,sum(charge) charge,sum(p) p
"terms": { from company_15min_power
"cid": cid_list where cid in %s and create_time >= %s and create_time <= %s
} group by date_format(create_time,"{time_fmt}")
}, """
{ async with MysqlUtil() as conn:
"range": { results = await conn.fetchall(sql,
"quarter_time": { args=(cid_list, date_start, date_end))
"gte": start_es, return results or []
"lte": end_es
}
}
}
]
}
},
"aggs": {
"quarter_time": {
"date_histogram": {
"field": "quarter_time",
"interval": interval,
"time_zone": "+08:00",
"format": "yyyy-MM-dd HH:mm:ss"
},
"aggs": {
"kwh": {
"sum": {
"field": "kwh"
}
},
"charge": {
"sum": {
"field": "charge"
}
},
"p": {
"sum": {
"field": "p"
}
}
}
}
}
}
log.info(query_body)
async with EsUtil() as es:
es_re = await es.search_origin(body=query_body, index=index)
return es_re["aggregations"]["quarter_time"]["buckets"]
async def power_charge_p_cid_aggs(date_start, date_end, cid_list, interval): async def power_charge_p_cid_aggs(date_start, date_end, cid_list, interval):
""" """
excel下载, 按照cid,date_histogram两次聚合,求电量电费 excel下载, 按照cid,date_histogram两次聚合,求电量电费
""" """
start_es = convert_es_str(date_start) if interval == "hour":
end_es = convert_es_str(date_end) time_fmt = "%%Y-%%m-%%d %%H"
elif interval == "day":
query_body = { time_fmt = "%%Y-%%m-%%d"
"size": 0, else:
"query": { time_fmt = "%%Y-%%m-%%d %%H:%%i"
"bool": { sql = f"""
"must": [ select cid,date_format(create_time,"{time_fmt}") as create_time,
{ sum(kwh) kwh,sum(charge) charge,sum(p) p
"terms": { from company_15min_power
"cid": cid_list where cid in %s and create_time >= %s and create_time <= %s
} group by cid,date_format(create_time,"{time_fmt}")
}, """
{ async with MysqlUtil() as conn:
"range": { results = await conn.fetchall(sql,
"quarter_time": { args=(cid_list, date_start, date_end))
"gte": start_es, return results or []
"lte": end_es
}
}
}
]
}
},
"aggs": {
"cids": {
"terms": {
"field": "cid",
"size": 1000
},
"aggs": {
"quarter_time": {
"date_histogram": {
"field": "quarter_time",
"interval": interval,
"time_zone": "+08:00",
"format": "yyyy-MM-dd HH:mm:ss"
},
"aggs": {
"kwh": {
"sum": {
"field": "kwh"
}
},
"charge": {
"sum": {
"field": "charge"
}
},
"p": {
"sum": {
"field": "p"
}
}
}
}
}
}
}
}
log.info(query_body)
async with EsUtil() as es:
es_re = await es.search_origin(body=query_body, index=index)
return es_re["aggregations"]["cids"]["buckets"]
async def query_charge_aggs_points(date_start, date_end, point_list): async def query_charge_aggs_points(date_start, date_end, point_list):
...@@ -293,7 +207,7 @@ async def query_charge_aggs_points(date_start, date_end, point_list): ...@@ -293,7 +207,7 @@ async def query_charge_aggs_points(date_start, date_end, point_list):
""" """
start_es = convert_es_str(date_start) start_es = convert_es_str(date_start)
end_es = convert_es_str(date_end) end_es = convert_es_str(date_end)
query_body = { query_body = {
"size": 0, "size": 0,
"query": { "query": {
...@@ -348,7 +262,7 @@ async def query_charge_aggs_points_new15(start, end, point_list): ...@@ -348,7 +262,7 @@ async def query_charge_aggs_points_new15(start, end, point_list):
f"where pid in %s and create_time BETWEEN '{start}' and '{end}' " \ f"where pid in %s and create_time BETWEEN '{start}' and '{end}' " \
f"GROUP BY pid" f"GROUP BY pid"
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
datas = await conn.fetchall(sql, args=(point_list, )) datas = await conn.fetchall(sql, args=(point_list,))
return datas return datas
...@@ -356,7 +270,7 @@ async def histogram_aggs_points(date_start, date_end, point_list, interval): ...@@ -356,7 +270,7 @@ async def histogram_aggs_points(date_start, date_end, point_list, interval):
"""date_histogram""" """date_histogram"""
start_es = convert_es_str(date_start) start_es = convert_es_str(date_start)
end_es = convert_es_str(date_end) end_es = convert_es_str(date_end)
query_body = { query_body = {
"size": 0, "size": 0,
"query": { "query": {
...@@ -418,7 +332,7 @@ async def power_charge_p_point_aggs(date_start, date_end, pid_list, interval): ...@@ -418,7 +332,7 @@ async def power_charge_p_point_aggs(date_start, date_end, pid_list, interval):
""" """
start_es = convert_es_str(date_start) start_es = convert_es_str(date_start)
end_es = convert_es_str(date_end) end_es = convert_es_str(date_end)
query_body = { query_body = {
"size": 0, "size": 0,
"query": { "query": {
...@@ -495,7 +409,6 @@ async def point_aggs_kwh(point_list, start=None, end=None): ...@@ -495,7 +409,6 @@ async def point_aggs_kwh(point_list, start=None, end=None):
return data return data
async def point_aggs_kwh_new15(point_list, start=None, end=None): async def point_aggs_kwh_new15(point_list, start=None, end=None):
"""1.5版本根据pid,求电量电费""" """1.5版本根据pid,求电量电费"""
if start and end: if start and end:
...@@ -506,7 +419,7 @@ async def point_aggs_kwh_new15(point_list, start=None, end=None): ...@@ -506,7 +419,7 @@ async def point_aggs_kwh_new15(point_list, start=None, end=None):
sql = "SELECT sum(kwh) kwh,sum(charge) charge FROM point_15min_power" \ sql = "SELECT sum(kwh) kwh,sum(charge) charge FROM point_15min_power" \
" where pid in %s" " where pid in %s"
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
data = await conn.fetchone(sql, args=(point_list, )) data = await conn.fetchone(sql, args=(point_list,))
return data return data
...@@ -516,7 +429,7 @@ async def extended_bounds_agg(date_start, date_end, cid_list, interval): ...@@ -516,7 +429,7 @@ async def extended_bounds_agg(date_start, date_end, cid_list, interval):
""" """
start_es = convert_es_str(date_start) start_es = convert_es_str(date_start)
end_es = convert_es_str(date_end) end_es = convert_es_str(date_end)
query_body = { query_body = {
"size": 0, "size": 0,
"query": { "query": {
......
...@@ -217,7 +217,7 @@ async def power_aggs_cid_proxy(start, end, cid_list, date_type): ...@@ -217,7 +217,7 @@ async def power_aggs_cid_proxy(start, end, cid_list, date_type):
for info in es_re_this: for info in es_re_this:
cid = info.get("key") cid = info.get("key")
cid_name = com_dic[cid]["shortname"] cid_name = com_dic[cid]["shortname"]
kwh = round_2(info.get("kwh")["value"]) kwh = round_2(info.get("kwh")["value"])
if kwh == 0: if kwh == 0:
continue continue
...@@ -229,9 +229,10 @@ async def power_aggs_cid_proxy(start, end, cid_list, date_type): ...@@ -229,9 +229,10 @@ async def power_aggs_cid_proxy(start, end, cid_list, date_type):
continue continue
except Exception as e: except Exception as e:
log.error(e) log.error(e)
log.info(f"本次有电量数据, 上周期没有电量数据, cid:{cid}, start:{start}, end:{end}") log.info(
f"本次有电量数据, 上周期没有电量数据, cid:{cid}, start:{start}, end:{end}")
continue continue
charge = round_2(info.get("charge")["value"]) charge = round_2(info.get("charge")["value"])
try: try:
charge_last = es_re_last_dic[cid]["charge"]["value"] charge_last = es_re_last_dic[cid]["charge"]["value"]
...@@ -241,7 +242,8 @@ async def power_aggs_cid_proxy(start, end, cid_list, date_type): ...@@ -241,7 +242,8 @@ async def power_aggs_cid_proxy(start, end, cid_list, date_type):
except Exception as e: except Exception as e:
log.error(e) log.error(e)
log.info("本次有数据, 上周期没有数据") log.info("本次有数据, 上周期没有数据")
log.info(f"本次有电费数据, 上周期没有电费数据, cid:{cid}, start:{start}, end:{end}") log.info(
f"本次有电费数据, 上周期没有电费数据, cid:{cid}, start:{start}, end:{end}")
continue continue
price = round_2(charge / kwh) price = round_2(charge / kwh)
price_last = round_2(charge_last / kwh_last) price_last = round_2(charge_last / kwh_last)
......
...@@ -113,11 +113,11 @@ def by_slots(slots, es_re_dic): ...@@ -113,11 +113,11 @@ def by_slots(slots, es_re_dic):
for slot in slots: for slot in slots:
if slot in es_re_dic: if slot in es_re_dic:
# 1.每个时间点,电量信息 # 1.每个时间点,电量信息
kwh_value = round_2(es_re_dic[slot].get("kwh").get("value")) kwh_value = round_2(es_re_dic[slot].get("kwh"))
# 2.每个时间点,电费信息 # 2.每个时间点,电费信息
charge_value = round_2(es_re_dic[slot].get("charge").get("value")) charge_value = round_2(es_re_dic[slot].get("charge"))
# 3. 功率 # 3. 功率
p_value = round_2(es_re_dic[slot].get("p").get("value")) p_value = round_2(es_re_dic[slot].get("p"))
# 4. 电价 # 4. 电价
try: try:
price_value = round_2(charge_value / kwh_value) price_value = round_2(charge_value / kwh_value)
...@@ -141,16 +141,18 @@ async def power_charge_p_proxy(cid_list, start, end, date_type, interval): ...@@ -141,16 +141,18 @@ async def power_charge_p_proxy(cid_list, start, end, date_type, interval):
# 1. 96个点数据 # 1. 96个点数据
slots_96 = SLOTS_15MIN slots_96 = SLOTS_15MIN
es_re_96 = await power_charge_p_aggs(start, end, cid_list, "15m") es_re_96 = await power_charge_p_aggs(start, end, cid_list, "15m")
es_re_96_dic = es_process(es_re_96, fmat="HH:mm") # 为了es结果和slots对应 es_re_96_dic = es_process(es_re_96, fmat="HH:mm",
time_key="create_time") # 为了es结果和slots对应
kwh_24, charge_24, p_24, price_24 = by_slots(slots_96, es_re_96_dic) kwh_24, charge_24, p_24, price_24 = by_slots(slots_96, es_re_96_dic)
# 96个点,工厂电量电费 # 96个点,工厂电量电费
# 2. 24个点数据 # 2. 24个点数据
slots_24 = SLOTS[date_type] slots_24 = SLOTS[date_type]
es_re_24 = await power_charge_p_aggs(start, end, cid_list, "hour") es_re_24 = await power_charge_p_aggs(start, end, cid_list, "hour")
es_re_24_dic = es_process(es_re_24, fmat="HH:mm") # 为了es结果和slots对应 es_re_24_dic = es_process(es_re_24, fmat="HH:mm",
time_key="create_time") # 为了es结果和slots对应
kwh_24, charge_24, p_24, price_24 = by_slots(slots_24, es_re_24_dic) kwh_24, charge_24, p_24, price_24 = by_slots(slots_24, es_re_24_dic)
# elif date_type == "month": # elif date_type == "month":
# intervel, slots = time_pick_transf(start, end) # intervel, slots = time_pick_transf(start, end)
# es_re = es_process(es_re, fmat="MM-DD") # 为了es结果和slots对应 # es_re = es_process(es_re, fmat="MM-DD") # 为了es结果和slots对应
import pendulum
from unify_api.constants import POINT_LEVEL_MAP from unify_api.constants import POINT_LEVEL_MAP
from unify_api.modules.common.components.common_cps import LevelResp from unify_api.modules.common.components.common_cps import LevelResp
from unify_api.modules.common.procedures.points import points_by_storeys from unify_api.modules.common.procedures.points import points_by_storeys
...@@ -6,6 +8,8 @@ from unify_api.modules.elec_charge.dao.elec_charge_dao import \ ...@@ -6,6 +8,8 @@ from unify_api.modules.elec_charge.dao.elec_charge_dao import \
query_charge_aggs_points, query_charge_aggs_points_new15 query_charge_aggs_points, query_charge_aggs_points_new15
from unify_api.modules.electric.dao.electric_dao import \ from unify_api.modules.electric.dao.electric_dao import \
monitor_point_join_by_points monitor_point_join_by_points
from unify_api.modules.home_page.procedures.count_info_pds import current_load, \
current_load_new15
from unify_api.utils.common_utils import round_2, division_two from unify_api.utils.common_utils import round_2, division_two
...@@ -86,11 +90,11 @@ async def kwh_card_level_service(cid, point_list, start, end): ...@@ -86,11 +90,11 @@ async def kwh_card_level_service(cid, point_list, start, end):
kwh = round_2(es_res[point_id]["kwh"]) kwh = round_2(es_res[point_id]["kwh"])
charge = round_2(es_res[point_id]["charge"]) charge = round_2(es_res[point_id]["charge"])
price = round_2(division_two(charge, kwh)) price = round_2(division_two(charge, kwh))
res_dic["kwh"] = kwh res_dic["kwh"] = kwh
res_dic["charge"] = charge res_dic["charge"] = charge
res_dic["price"] = price res_dic["price"] = price
ret_data[m_type].append(res_dic) ret_data[m_type].append(res_dic)
return LevelResp( return LevelResp(
inline=ret_data["inline"], inline=ret_data["inline"],
...@@ -101,4 +105,11 @@ async def kwh_card_level_service(cid, point_list, start, end): ...@@ -101,4 +105,11 @@ async def kwh_card_level_service(cid, point_list, start, end):
) )
async def load_info_service(cid_list):
# 实时负荷
cur_load = await current_load_new15(cid_list)
yesterday_dt = pendulum.now(tz="Asia/Shanghai").subtract(days=1)
yes_load = await current_load_new15(cid_list, yesterday_dt)
load_percent = round((cur_load - yes_load) / yes_load,
2) if cur_load and yes_load else ""
return cur_load, yes_load, load_percent
...@@ -16,14 +16,16 @@ from unify_api.modules.elec_charge.components.elec_charge_cps import \ ...@@ -16,14 +16,16 @@ from unify_api.modules.elec_charge.components.elec_charge_cps import \
power_overview_example, PricePolicyReq, PricePolicyResp, \ power_overview_example, PricePolicyReq, PricePolicyResp, \
PricePolicy, AverPriceReq, PowerViewRes, Spvf, AverPriceResp, ChargeKwh, \ PricePolicy, AverPriceReq, PowerViewRes, Spvf, AverPriceResp, ChargeKwh, \
IndexChargeReq, IndexChargeResp, PopReq, PopResp, MtpResp, PspResp, \ IndexChargeReq, IndexChargeResp, PopReq, PopResp, MtpResp, PspResp, \
IpspResp, KpReq, KpResp, KclReq, ProductProxyReq IpspResp, KpReq, KpResp, KclReq, ProductProxyReq, LoadInfoReq, LoadInfoResp
from unify_api.modules.elec_charge.dao.elec_charge_dao import \ from unify_api.modules.elec_charge.dao.elec_charge_dao import \
query_charge_aggs_points, get_kwh_charge, query_charge_aggs_points_new15 query_charge_aggs_points, get_kwh_charge, query_charge_aggs_points_new15
from unify_api.modules.elec_charge.procedures.elec_charge_pds import \ from unify_api.modules.elec_charge.procedures.elec_charge_pds import \
quarters_trans, power_overview_proxy, total_value, power_aggs_cid_proxy_new15, \ quarters_trans, power_overview_proxy, total_value, \
power_aggs_cid_proxy_new15, \
power_index_cid_proxy_new15, power_overview_proxy15 power_index_cid_proxy_new15, power_overview_proxy15
from unify_api.modules.elec_charge.service.elec_charge_service import \ from unify_api.modules.elec_charge.service.elec_charge_service import \
kwh_points_service, kwh_card_level_service kwh_points_service, kwh_card_level_service, load_info_service
from unify_api.modules.users.procedures.jwt_user import jwt_user
from unify_api.utils.common_utils import round_2, round_4, NumListHelper from unify_api.utils.common_utils import round_2, round_4, NumListHelper
from unify_api.utils.es_query_body import agg_statistics from unify_api.utils.es_query_body import agg_statistics
from unify_api.utils.request_util import filed_value_from_list from unify_api.utils.request_util import filed_value_from_list
...@@ -289,7 +291,7 @@ async def post_power_overview_proxy(req, body: PopReq) -> PopResp: ...@@ -289,7 +291,7 @@ async def post_power_overview_proxy(req, body: PopReq) -> PopResp:
proxy_id = body.proxy_id proxy_id = body.proxy_id
host = req.host host = req.host
product = PRODUCT.get(host) product = PRODUCT.get(host)
user_id = req.ctx.user_id user_id = jwt_user(req)
# 全部工厂 # 全部工厂
if not cid_list: if not cid_list:
log.info(f"power_overview_proxy根据用户userId:{user_id} " log.info(f"power_overview_proxy根据用户userId:{user_id} "
...@@ -314,13 +316,14 @@ async def post_power_overview_proxy(req, body: PopReq) -> PopResp: ...@@ -314,13 +316,14 @@ async def post_power_overview_proxy(req, body: PopReq) -> PopResp:
# 获取上一周期开始结束时间 # 获取上一周期开始结束时间
start_last, end_last = last_time_str(start, end, date_type) start_last, end_last = last_time_str(start, end, date_type)
power, charge = await power_overview_proxy15(start, end, cid_list) power, charge = await power_overview_proxy15(start, end, cid_list)
power_last, charge_last = await power_overview_proxy15(start_last, end_last, power_last, charge_last = await power_overview_proxy15(start_last,
cid_list) end_last,
cid_list)
if not all([power, charge, power_last, charge_last]): if not all([power, charge, power_last, charge_last]):
return PopResp(power=Spvf(), charge=Spvf()) return PopResp(power=Spvf(), charge=Spvf())
total_power = total_value(power) total_power = total_value(power)
total_charge = total_value(charge) total_charge = total_value(charge)
total_power_last = total_value(power_last) total_power_last = total_value(power_last)
total_charge_last = total_value(charge_last) total_charge_last = total_value(charge_last)
# 增长率 # 增长率
...@@ -351,7 +354,7 @@ async def post_month_today_proxy(req, body: ProductProxyReq) -> MtpResp: ...@@ -351,7 +354,7 @@ async def post_month_today_proxy(req, body: ProductProxyReq) -> MtpResp:
# 1. 获取参数 # 1. 获取参数
host = req.host host = req.host
product = PRODUCT.get(host) product = PRODUCT.get(host)
user_id = req.ctx.user_id user_id = jwt_user(req)
# cid_list = await get_cids(user_id, product) # cid_list = await get_cids(user_id, product)
proxy_id = body.proxy_id proxy_id = body.proxy_id
cid_list = await get_proxy_cids(user_id, product, proxy_id) \ cid_list = await get_proxy_cids(user_id, product, proxy_id) \
...@@ -364,7 +367,7 @@ async def post_month_today_proxy(req, body: ProductProxyReq) -> MtpResp: ...@@ -364,7 +367,7 @@ async def post_month_today_proxy(req, body: ProductProxyReq) -> MtpResp:
today_start, today_end, month_start, month_end = today_month_date() today_start, today_end, month_start, month_end = today_month_date()
# 2. 本月/上月数据 # 2. 本月/上月数据
last_month_start, last_month_end = last_time_str(month_start, month_end, last_month_start, last_month_end = last_time_str(month_start, month_end,
"month") "month", True)
this_month_p, this_month_charge = await power_overview_proxy15( this_month_p, this_month_charge = await power_overview_proxy15(
month_start, month_end, cid_list) month_start, month_end, cid_list)
last_month_p, last_month_charge = await power_overview_proxy15( last_month_p, last_month_charge = await power_overview_proxy15(
...@@ -541,3 +544,31 @@ async def post_kwh_card_level(req, body: KclReq) -> LevelResp: ...@@ -541,3 +544,31 @@ async def post_kwh_card_level(req, body: KclReq) -> LevelResp:
start = body.start start = body.start
end = body.end end = body.end
return await kwh_card_level_service(cid, point_list, start, end) return await kwh_card_level_service(cid, point_list, start, end)
@summary("获取知电管理版首页负荷信息")
async def post_load_info(request, body: LoadInfoReq) -> LoadInfoResp:
# 1. 获取company_id
# 1. 获取参数
product = PRODUCT.get(request.host)
user_id = jwt_user(request)
proxy_id = body.proxy_id
cid_list = await get_proxy_cids(user_id, product, proxy_id) \
if proxy_id else None
# 全部工厂
if not cid_list:
log.info(f"未查询到工厂, userId:{user_id} product:{product}")
return LoadInfoResp()
try:
# 实时负荷,昨日同时负荷,对比昨日
current_load, yesterday_load, load_percent = await load_info_service(
cid_list)
except Exception as e:
log.exception(e)
return LoadInfoResp().server_error()
return LoadInfoResp(
current_load=current_load,
yesterday_load=yesterday_load,
load_percent=load_percent
)
import copy import copy
import json import json
from itertools import groupby
from operator import itemgetter
from pot_libs.logger import log from pot_libs.logger import log
from pot_libs.mysql_util.mysql_util import MysqlUtil from pot_libs.mysql_util.mysql_util import MysqlUtil
from pot_libs.sanic_api import summary from pot_libs.sanic_api import summary
...@@ -50,37 +53,41 @@ async def post_power_statis_proxy(req, ...@@ -50,37 +53,41 @@ async def post_power_statis_proxy(req,
# 2. 如果是日统计,则需要增加今日/昨日负荷曲线, 15min一个点 # 2. 如果是日统计,则需要增加今日/昨日负荷曲线, 15min一个点
if date_type == "day": if date_type == "day":
# 电量电费 # 电量电费
kwh_sv, charge_sv = await power_charge_new15(cid_list, point_id, start, end, kwh_sv, charge_sv = await power_charge_new15(cid_list, point_id, start,
date_type) end,
date_type)
# 需要增加15min电量电费, 渠道版首页不需要下载,暂时去掉 # 需要增加15min电量电费, 渠道版首页不需要下载,暂时去掉
# 今日/昨日负荷曲线 # 今日/昨日负荷曲线
today_p = await proxy_today_yesterday_p_new15(cid_list, start, end) today_p = await proxy_today_yesterday_p_new15(cid_list, start, end)
ysd_start, ysd_end = last_time_str(start, end, "day") ysd_start, ysd_end = last_time_str(start, end, "day")
yesterday_p = await proxy_today_yesterday_p_new15(cid_list, yesterday_p = await proxy_today_yesterday_p_new15(cid_list,
ysd_start, ysd_start,
ysd_end) ysd_end)
return PcStatiResp(kwh=kwh_sv, charge=charge_sv, today_p=today_p, return PcStatiResp(kwh=kwh_sv, charge=charge_sv, today_p=today_p,
yesterday_p=yesterday_p) yesterday_p=yesterday_p)
elif date_type == "month": elif date_type == "month":
# 本月电量电费, 平均电价 # 本月电量电费, 平均电价
kwh_sv, charge_sv = await power_charge_new15(cid_list, point_id, start, end, kwh_sv, charge_sv = await power_charge_new15(cid_list, point_id, start,
date_type) end,
date_type)
this_aver_price = aver_price(kwh_sv, charge_sv) this_aver_price = aver_price(kwh_sv, charge_sv)
# 上月电量电费, 平均电价 # 上月电量电费, 平均电价
last_start, last_end = last_time_str(start, end, "month") last_start, last_end = last_time_str(start, end, "month")
# 需要增加15min电量电费 # 需要增加15min电量电费
last_kwh_sv, last_charge_sv = await power_charge_new15(cid_list, point_id, last_kwh_sv, last_charge_sv = await power_charge_new15(cid_list,
last_start, point_id,
last_end, last_start,
date_type) last_end,
date_type)
last_aver_price = aver_price(last_kwh_sv, last_charge_sv) last_aver_price = aver_price(last_kwh_sv, last_charge_sv)
return PcStatiResp(kwh=kwh_sv, charge=charge_sv, return PcStatiResp(kwh=kwh_sv, charge=charge_sv,
this_aver_price=this_aver_price, this_aver_price=this_aver_price,
last_aver_price=last_aver_price) last_aver_price=last_aver_price)
elif date_type == "year": elif date_type == "year":
# 本月电量电费 # 本月电量电费
kwh_sv, charge_sv = await power_charge_new15(cid_list, point_id, start, end, kwh_sv, charge_sv = await power_charge_new15(cid_list, point_id, start,
date_type) end,
date_type)
this_aver_price = aver_price(kwh_sv, charge_sv) this_aver_price = aver_price(kwh_sv, charge_sv)
return PcStatiResp(kwh=kwh_sv, charge=charge_sv, return PcStatiResp(kwh=kwh_sv, charge=charge_sv,
this_aver_price=this_aver_price) this_aver_price=this_aver_price)
...@@ -92,18 +99,20 @@ async def post_power_statis_proxy(req, ...@@ -92,18 +99,20 @@ async def post_power_statis_proxy(req,
# 自定义选时范围,不需要最后时间的数据,解决bug # 自定义选时范围,不需要最后时间的数据,解决bug
end = end_f.subtract(minutes=1).format("YYYY-MM-DD HH:mm:ss") end = end_f.subtract(minutes=1).format("YYYY-MM-DD HH:mm:ss")
# 电量电费 # 电量电费
kwh_sv, charge_sv = await power_charge_new15(cid_list, point_id, start, kwh_sv, charge_sv = await power_charge_new15(cid_list, point_id,
end, start,
date_type) end,
date_type)
# 负荷曲线 # 负荷曲线
this_p = await proxy_today_yesterday_p_new15(cid_list, start, this_p = await proxy_today_yesterday_p_new15(cid_list, start,
end) end)
# 需要增加15min电量电费, 渠道版首页不需要下载,暂时去掉 # 需要增加15min电量电费, 渠道版首页不需要下载,暂时去掉
return PcStatiResp(kwh=kwh_sv, charge=charge_sv, today_p=this_p) return PcStatiResp(kwh=kwh_sv, charge=charge_sv, today_p=this_p)
else: else:
# 电量电费 # 电量电费
kwh_sv, charge_sv = await power_charge_new15(cid_list, point_id, start, kwh_sv, charge_sv = await power_charge_new15(cid_list, point_id,
end, date_type) start,
end, date_type)
# 平均电价 # 平均电价
this_aver_price = aver_price(kwh_sv, charge_sv) this_aver_price = aver_price(kwh_sv, charge_sv)
return PcStatiResp(kwh=kwh_sv, charge=charge_sv, return PcStatiResp(kwh=kwh_sv, charge=charge_sv,
...@@ -361,28 +370,28 @@ async def post_power_statist_opt(req, body: PopReq) -> PcStatiResp: ...@@ -361,28 +370,28 @@ async def post_power_statist_opt(req, body: PopReq) -> PcStatiResp:
if date_type == "day": if date_type == "day":
# 电量电费 # 电量电费
kwh_sv, charge_sv = await power_charge_new15(cid_list, -1, start, end, kwh_sv, charge_sv = await power_charge_new15(cid_list, -1, start, end,
date_type) date_type)
# 需要增加15min电量电费, 渠道版首页不需要下载,暂时去掉 # 需要增加15min电量电费, 渠道版首页不需要下载,暂时去掉
# 今日/昨日负荷曲线 # 今日/昨日负荷曲线
today_p = await proxy_today_yesterday_p_new15(cid_list, start, end) today_p = await proxy_today_yesterday_p_new15(cid_list, start, end)
ysd_start, ysd_end = last_time_str(start, end, "day") ysd_start, ysd_end = last_time_str(start, end, "day")
yesterday_p = await proxy_today_yesterday_p_new15(cid_list, yesterday_p = await proxy_today_yesterday_p_new15(cid_list,
ysd_start, ysd_start,
ysd_end) ysd_end)
return PcStatiResp(kwh=kwh_sv, charge=charge_sv, today_p=today_p, return PcStatiResp(kwh=kwh_sv, charge=charge_sv, today_p=today_p,
yesterday_p=yesterday_p) yesterday_p=yesterday_p)
elif date_type == "month": elif date_type == "month":
# 本月电量电费, 平均电价 # 本月电量电费, 平均电价
kwh_sv, charge_sv = await power_charge_new15(cid_list, -1, start, end, kwh_sv, charge_sv = await power_charge_new15(cid_list, -1, start, end,
date_type) date_type)
this_aver_price = aver_price(kwh_sv, charge_sv) this_aver_price = aver_price(kwh_sv, charge_sv)
# 上月电量电费, 平均电价 # 上月电量电费, 平均电价
last_start, last_end = last_time_str(start, end, "month") last_start, last_end = last_time_str(start, end, "month")
# 需要增加15min电量电费 # 需要增加15min电量电费
last_kwh_sv, last_charge_sv = await power_charge_new15(cid_list, -1, last_kwh_sv, last_charge_sv = await power_charge_new15(cid_list, -1,
last_start, last_start,
last_end, last_end,
date_type) date_type)
last_aver_price = aver_price(last_kwh_sv, last_charge_sv) last_aver_price = aver_price(last_kwh_sv, last_charge_sv)
return PcStatiResp(kwh=kwh_sv, charge=charge_sv, return PcStatiResp(kwh=kwh_sv, charge=charge_sv,
this_aver_price=this_aver_price, this_aver_price=this_aver_price,
...@@ -427,7 +436,8 @@ async def get_power_statist_download(req): ...@@ -427,7 +436,8 @@ async def get_power_statist_download(req):
slots_24 = SLOTS[date_type] slots_24 = SLOTS[date_type]
# 1. 96个点, 电量\电费\平均功率\电价 # 1. 96个点, 电量\电费\平均功率\电价
es_re_96 = await power_charge_p_aggs(start, end, cid_list, "15m") es_re_96 = await power_charge_p_aggs(start, end, cid_list, "15m")
es_re_96_dic = es_process(es_re_96, fmat="HH:mm") # 为了es结果和slots对应 es_re_96_dic = es_process(es_re_96, "HH:mm", time_key="create_time")
# 为了es结果和slots对应
kwh_96, charge_96, p_96, price_96 = by_slots(slots_96, es_re_96_dic) kwh_96, charge_96, p_96, price_96 = by_slots(slots_96, es_re_96_dic)
p_96.append("") p_96.append("")
price_96.append("") price_96.append("")
...@@ -445,32 +455,33 @@ async def get_power_statist_download(req): ...@@ -445,32 +455,33 @@ async def get_power_statist_download(req):
power_96_dic = {"电量(万kWh)": slots_96_zj} power_96_dic = {"电量(万kWh)": slots_96_zj}
charge_96_dic = {"电费(万元)": slots_96_zj} charge_96_dic = {"电费(万元)": slots_96_zj}
has_power_cids = [] # es查询有数据的工厂 has_power_cids = [] # es查询有数据的工厂
for info in res_cid_96: for cid, cid_info in groupby(res_cid_96, key=itemgetter("cid")):
cid = info.get("key") cid_one = [one for one in cid_info]
has_power_cids.append(cid) has_power_cids.append(cid)
cid_name = com_dic[cid]["shortname"] cid_name = com_dic[cid]["shortname"]
# 把slots作为key提出来 # 把slots作为key提出来
info_dic = es_process(info["quarter_time"]["buckets"], info_dic = es_process(cid_one, fmat="HH:mm",
fmat="HH:mm") time_key="create_time")
kwh_96, charge_96, p_96, price_96 = by_slots(slots_96, kwh_96, charge_96, p_96, price_96 = by_slots(slots_96,
info_dic) info_dic)
power_96_dic[cid_name] = division_down(kwh_96) power_96_dic[cid_name] = division_down(kwh_96)
charge_96_dic[cid_name] = division_down(charge_96) charge_96_dic[cid_name] = division_down(charge_96)
# 没有电量数据的工厂, 设为空字符串 # 没有电量数据的工厂, 设为空字符串
for cid in cid_list: for cid in cid_list:
if cid not in has_power_cids: if cid not in has_power_cids:
cid_name = com_dic[cid]["shortname"] cid_name = com_dic[cid]["shortname"]
power_96_dic[cid_name] = list(str(' ') * 97) power_96_dic[cid_name] = list(str(' ') * 97)
charge_96_dic[cid_name] = list(str(' ') * 97) charge_96_dic[cid_name] = list(str(' ') * 97)
df1 = pd.DataFrame(power_96_dic) df1 = pd.DataFrame(power_96_dic)
df1.to_excel(writer, sheet_name="96个点电量", index=False) df1.to_excel(writer, sheet_name="96个点电量", index=False)
df2 = pd.DataFrame(charge_96_dic) df2 = pd.DataFrame(charge_96_dic)
df2.to_excel(writer, sheet_name="96个点电费", index=False) df2.to_excel(writer, sheet_name="96个点电费", index=False)
# 3. 24个点, 电量\电费\平均功率\电价 # 3. 24个点, 电量\电费\平均功率\电价
es_re_24 = await power_charge_p_aggs(start, end, cid_list, "hour") es_re_24 = await power_charge_p_aggs(start, end, cid_list, "hour")
es_re_24_dic = es_process(es_re_24, fmat="HH:mm") # 为了es结果和slots对应 es_re_24_dic = es_process(es_re_24, fmat="HH:mm",
time_key="create_time") # 为了es结果和slots对应
kwh_24, charge_24, p_24, price_24 = by_slots(slots_24, es_re_24_dic) kwh_24, charge_24, p_24, price_24 = by_slots(slots_24, es_re_24_dic)
slots_24_zj = copy.deepcopy(slots_24) slots_24_zj = copy.deepcopy(slots_24)
slots_24_zj.append("总计") slots_24_zj.append("总计")
...@@ -491,25 +502,25 @@ async def get_power_statist_download(req): ...@@ -491,25 +502,25 @@ async def get_power_statist_download(req):
power_24_dic = {"电量(万kWh)": slots_24_zj} power_24_dic = {"电量(万kWh)": slots_24_zj}
charge_24_dic = {"电费(万元)": slots_24_zj} charge_24_dic = {"电费(万元)": slots_24_zj}
has_power_cids_24 = [] # es查询有数据的工厂 has_power_cids_24 = [] # es查询有数据的工厂
for info in res_cid_24: for cid, cid_info in groupby(res_cid_24, key=itemgetter("cid")):
cid = info.get("key") cid_one = [one for one in cid_info]
has_power_cids_24.append(cid) has_power_cids_24.append(cid)
cid_name = com_dic[cid]["shortname"] cid_name = com_dic[cid]["shortname"]
# 把slots作为key提出来 # 把slots作为key提出来
info_dic_24 = es_process(info["quarter_time"]["buckets"], info_dic_24 = es_process(cid_one, fmat="HH:mm",
fmat="HH:mm") time_key="create_time")
kwh_24, charge_24, p_24, price_24 = by_slots(slots_24, kwh_24, charge_24, p_24, price_24 = by_slots(slots_24,
info_dic_24) info_dic_24)
power_24_dic[cid_name] = division_down(kwh_24) power_24_dic[cid_name] = division_down(kwh_24)
charge_24_dic[cid_name] = division_down(charge_24) charge_24_dic[cid_name] = division_down(charge_24)
# 没有电量数据的工厂, 设为空字符串 # 没有电量数据的工厂, 设为空字符串
for cid in cid_list: for cid in cid_list:
if cid not in has_power_cids_24: if cid not in has_power_cids_24:
cid_name = com_dic[cid]["shortname"] cid_name = com_dic[cid]["shortname"]
power_24_dic[cid_name] = list(str(' ') * 25) power_24_dic[cid_name] = list(str(' ') * 25)
charge_24_dic[cid_name] = list(str(' ') * 25) charge_24_dic[cid_name] = list(str(' ') * 25)
df3 = pd.DataFrame(power_24_dic) df3 = pd.DataFrame(power_24_dic)
df3.to_excel(writer, sheet_name="24个点电量", index=False) df3.to_excel(writer, sheet_name="24个点电量", index=False)
df4 = pd.DataFrame(charge_24_dic) df4 = pd.DataFrame(charge_24_dic)
...@@ -521,7 +532,8 @@ async def get_power_statist_download(req): ...@@ -521,7 +532,8 @@ async def get_power_statist_download(req):
slots_m_p = copy.deepcopy(slots_m) slots_m_p = copy.deepcopy(slots_m)
slots_m_p.append("总计") slots_m_p.append("总计")
es_re_m = await power_charge_p_aggs(start, end, cid_list, "day") es_re_m = await power_charge_p_aggs(start, end, cid_list, "day")
es_re_m_dic = es_process(es_re_m, fmat="MM-DD") # 为了es结果和slots对应 es_re_m_dic = es_process(es_re_m, fmat="MM-DD",
time_key="create_time") # 为了es结果和slots对应
kwh_m, charge_m, p_m, price_m = by_slots(slots_m, es_re_m_dic) kwh_m, charge_m, p_m, price_m = by_slots(slots_m, es_re_m_dic)
price_m.append("") price_m.append("")
dict_m = { dict_m = {
...@@ -537,24 +549,24 @@ async def get_power_statist_download(req): ...@@ -537,24 +549,24 @@ async def get_power_statist_download(req):
power_m_dic = {"电量(万kWh)": slots_m_p} power_m_dic = {"电量(万kWh)": slots_m_p}
charge_m_dic = {"电费(万元)": slots_m_p} charge_m_dic = {"电费(万元)": slots_m_p}
has_power_cids = [] # es查询有数据的工厂 has_power_cids = [] # es查询有数据的工厂
for info in res_cid_m: for cid, cid_info in groupby(res_cid_m, key=itemgetter("cid")):
cid = info.get("key") cid_one = [one for one in cid_info]
has_power_cids.append(cid) has_power_cids.append(cid)
cid_name = com_dic[cid]["shortname"] cid_name = com_dic[cid]["shortname"]
# 把slots作为key提出来 # 把slots作为key提出来
info_dic = es_process(info["quarter_time"]["buckets"], info_dic = es_process(cid_one, fmat="MM-DD",
fmat="MM-DD") time_key="create_time")
kwh_m, charge_m, p_m, price_m = by_slots(slots_m, info_dic) kwh_m, charge_m, p_m, price_m = by_slots(slots_m, info_dic)
power_m_dic[cid_name] = division_down(kwh_m) power_m_dic[cid_name] = division_down(kwh_m)
charge_m_dic[cid_name] = division_down(charge_m) charge_m_dic[cid_name] = division_down(charge_m)
# 没有电量数据的工厂, 设为空字符串 # 没有电量数据的工厂, 设为空字符串
for cid in cid_list: for cid in cid_list:
if cid not in has_power_cids: if cid not in has_power_cids:
cid_name = com_dic[cid]["shortname"] cid_name = com_dic[cid]["shortname"]
power_m_dic[cid_name] = list(str(' ') * (len(slots_m) + 1)) power_m_dic[cid_name] = list(str(' ') * (len(slots_m) + 1))
charge_m_dic[cid_name] = list(str(' ') * (len(slots_m) + 1)) charge_m_dic[cid_name] = list(str(' ') * (len(slots_m) + 1))
df1 = pd.DataFrame(power_m_dic) df1 = pd.DataFrame(power_m_dic)
df1.to_excel(writer, sheet_name="电量", index=False) df1.to_excel(writer, sheet_name="电量", index=False)
df2 = pd.DataFrame(charge_m_dic) df2 = pd.DataFrame(charge_m_dic)
...@@ -583,7 +595,7 @@ async def get_power_company_download(req): ...@@ -583,7 +595,7 @@ async def get_power_company_download(req):
start = args.get("start") start = args.get("start")
end = args.get("end") end = args.get("end")
date_type = args.get("date_type") date_type = args.get("date_type")
# 参数为point_id, 转换为point_list # 参数为point_id, 转换为point_list
if point_id == -1: # 选的全部 if point_id == -1: # 选的全部
# 1.找出工厂所有pid,point表add_to_company字段为1 # 1.找出工厂所有pid,point表add_to_company字段为1
...@@ -593,7 +605,7 @@ async def get_power_company_download(req): ...@@ -593,7 +605,7 @@ async def get_power_company_download(req):
point_list = [point.get("pid") for point in point_info] point_list = [point.get("pid") for point in point_info]
else: else:
point_list = [point_id] point_list = [point_id]
# 查询point # 查询point
point_info_list = await point_by_points(point_list) point_info_list = await point_by_points(point_list)
pid_dic = {i["pid"]: i for i in point_info_list} pid_dic = {i["pid"]: i for i in point_info_list}
...@@ -637,14 +649,14 @@ async def get_power_company_download(req): ...@@ -637,14 +649,14 @@ async def get_power_company_download(req):
info_dic) info_dic)
power_96_dic[pid_name] = division_down(kwh_96) power_96_dic[pid_name] = division_down(kwh_96)
charge_96_dic[pid_name] = division_down(charge_96) charge_96_dic[pid_name] = division_down(charge_96)
# 没有电量数据的监测点, 设为空字符串 # 没有电量数据的监测点, 设为空字符串
for pid in point_list: for pid in point_list:
if pid not in has_power_pids: if pid not in has_power_pids:
pid_name = pid_dic[pid]["name"] pid_name = pid_dic[pid]["name"]
power_96_dic[pid_name] = list(str(' ') * 97) power_96_dic[pid_name] = list(str(' ') * 97)
charge_96_dic[pid_name] = list(str(' ') * 97) charge_96_dic[pid_name] = list(str(' ') * 97)
df1 = pd.DataFrame(power_96_dic) df1 = pd.DataFrame(power_96_dic)
df1.to_excel(writer, sheet_name="96个点电量", index=False) df1.to_excel(writer, sheet_name="96个点电量", index=False)
df2 = pd.DataFrame(charge_96_dic) df2 = pd.DataFrame(charge_96_dic)
...@@ -683,14 +695,14 @@ async def get_power_company_download(req): ...@@ -683,14 +695,14 @@ async def get_power_company_download(req):
info_dic_24) info_dic_24)
power_24_dic[pid_name] = division_down(kwh_24) power_24_dic[pid_name] = division_down(kwh_24)
charge_24_dic[pid_name] = division_down(charge_24) charge_24_dic[pid_name] = division_down(charge_24)
# 没有电量数据的工厂, 设为空字符串 # 没有电量数据的工厂, 设为空字符串
for pid in point_list: for pid in point_list:
if pid not in has_power_pids_24: if pid not in has_power_pids_24:
pid_name = pid_dic[pid]["name"] pid_name = pid_dic[pid]["name"]
power_24_dic[pid_name] = list(str(' ') * 25) power_24_dic[pid_name] = list(str(' ') * 25)
charge_24_dic[pid_name] = list(str(' ') * 25) charge_24_dic[pid_name] = list(str(' ') * 25)
df3 = pd.DataFrame(power_24_dic) df3 = pd.DataFrame(power_24_dic)
df3.to_excel(writer, sheet_name="24个点电量", index=False) df3.to_excel(writer, sheet_name="24个点电量", index=False)
df4 = pd.DataFrame(charge_24_dic) df4 = pd.DataFrame(charge_24_dic)
...@@ -728,14 +740,14 @@ async def get_power_company_download(req): ...@@ -728,14 +740,14 @@ async def get_power_company_download(req):
kwh_m, charge_m, p_m, price_m = by_slots(slots_m, info_dic) kwh_m, charge_m, p_m, price_m = by_slots(slots_m, info_dic)
power_m_dic[pid_name] = division_down(kwh_m) power_m_dic[pid_name] = division_down(kwh_m)
charge_m_dic[pid_name] = division_down(charge_m) charge_m_dic[pid_name] = division_down(charge_m)
# 没有电量数据的工厂, 设为空字符串 # 没有电量数据的工厂, 设为空字符串
for pid in point_list: for pid in point_list:
if pid not in has_power_pids: if pid not in has_power_pids:
pid_name = pid_dic[pid]["name"] pid_name = pid_dic[pid]["name"]
power_m_dic[pid_name] = list(str(' ') * (len(slots_m) + 1)) power_m_dic[pid_name] = list(str(' ') * (len(slots_m) + 1))
charge_m_dic[pid_name] = list(str(' ') * (len(slots_m) + 1)) charge_m_dic[pid_name] = list(str(' ') * (len(slots_m) + 1))
df1 = pd.DataFrame(power_m_dic) df1 = pd.DataFrame(power_m_dic)
df1.to_excel(writer, sheet_name="电量", index=False) df1.to_excel(writer, sheet_name="电量", index=False)
df2 = pd.DataFrame(charge_m_dic) df2 = pd.DataFrame(charge_m_dic)
...@@ -774,14 +786,14 @@ async def get_power_company_download(req): ...@@ -774,14 +786,14 @@ async def get_power_company_download(req):
kwh_m, charge_m, p_m, price_m = by_slots(slots_m, info_dic) kwh_m, charge_m, p_m, price_m = by_slots(slots_m, info_dic)
power_m_dic[pid_name] = division_down(kwh_m) power_m_dic[pid_name] = division_down(kwh_m)
charge_m_dic[pid_name] = division_down(charge_m) charge_m_dic[pid_name] = division_down(charge_m)
# 没有电量数据的point, 设为空字符串 # 没有电量数据的point, 设为空字符串
for pid in point_list: for pid in point_list:
if pid not in has_power_pids: if pid not in has_power_pids:
pid_name = pid_dic[pid]["name"] pid_name = pid_dic[pid]["name"]
power_m_dic[pid_name] = list(str(' ') * (len(slots_m) + 1)) power_m_dic[pid_name] = list(str(' ') * (len(slots_m) + 1))
charge_m_dic[pid_name] = list(str(' ') * (len(slots_m) + 1)) charge_m_dic[pid_name] = list(str(' ') * (len(slots_m) + 1))
df1 = pd.DataFrame(power_m_dic) df1 = pd.DataFrame(power_m_dic)
df1.to_excel(writer, sheet_name="电量", index=False) df1.to_excel(writer, sheet_name="电量", index=False)
df2 = pd.DataFrame(charge_m_dic) df2 = pd.DataFrame(charge_m_dic)
......
...@@ -5,7 +5,7 @@ async def monitor_point_join_by_points(points): ...@@ -5,7 +5,7 @@ async def monitor_point_join_by_points(points):
"""monitor和point关联""" """monitor和point关联"""
sql = "SELECT m.mtid,p.ctnum,m.name, m.m_type, p.pid,p.cid " \ sql = "SELECT m.mtid,p.ctnum,m.name, m.m_type, p.pid,p.cid " \
"FROM monitor m inner join point p on m.mtid = p.mtid " \ "FROM monitor m inner join point p on m.mtid = p.mtid " \
"WHERE p.pid in %s and m.demolished = 0 order by field(p.pid,{})".\ "WHERE p.pid in %s and m.demolished = 0 order by field(p.pid,{})". \
format(str(points).replace("[", "").replace("]", "")) format(str(points).replace("[", "").replace("]", ""))
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
monitor_point_list = await conn.fetchall(sql, args=(tuple(points),)) monitor_point_list = await conn.fetchall(sql, args=(tuple(points),))
...@@ -26,7 +26,7 @@ async def get_electric_datas_dao(table_name, pid, start, end): ...@@ -26,7 +26,7 @@ async def get_electric_datas_dao(table_name, pid, start, end):
sql = f"SELECT * FROM {table_name} where pid=%s and create_time " \ sql = f"SELECT * FROM {table_name} where pid=%s and create_time " \
f"BETWEEN '{start}' and '{end}' ORDER BY create_time desc" f"BETWEEN '{start}' and '{end}' ORDER BY create_time desc"
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
electric_datas = await conn.fetchall(sql, args=(pid, )) electric_datas = await conn.fetchall(sql, args=(pid,))
return electric_datas return electric_datas
...@@ -35,7 +35,7 @@ async def get_qual_history_dao(table_name, pid, start, end, date_format): ...@@ -35,7 +35,7 @@ async def get_qual_history_dao(table_name, pid, start, end, date_format):
f"p.* FROM {table_name} p where p.pid=%s and p.create_time " \ f"p.* FROM {table_name} p where p.pid=%s and p.create_time " \
f"BETWEEN '{start}' and '{end}' order by p.create_time" f"BETWEEN '{start}' and '{end}' order by p.create_time"
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
datas = await conn.fetchall(sql, args=(pid, )) datas = await conn.fetchall(sql, args=(pid,))
return datas return datas
...@@ -51,6 +51,12 @@ async def get_elec_history_dao(table_name, pid, start, end, date_format): ...@@ -51,6 +51,12 @@ async def get_elec_history_dao(table_name, pid, start, end, date_format):
async def get_elec_mtid_sid_by_cid(cid): async def get_elec_mtid_sid_by_cid(cid):
if isinstance(cid, tuple):
cid_tuple = cid
elif isinstance(cid, list):
cid_tuple = tuple(cid)
else:
cid_tuple = (cid,)
sql = ( sql = (
f""" f"""
SELECT SELECT
...@@ -59,9 +65,9 @@ async def get_elec_mtid_sid_by_cid(cid): ...@@ -59,9 +65,9 @@ async def get_elec_mtid_sid_by_cid(cid):
FROM FROM
monitor monitor
WHERE WHERE
cid = {cid}; cid in %s;
""" """
) )
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
datas = await conn.fetchall(sql) datas = await conn.fetchall(sql, args=(cid_tuple,))
return datas if datas else [] return datas if datas else []
...@@ -212,7 +212,8 @@ async def elec_card_level_service(point_list): ...@@ -212,7 +212,8 @@ async def elec_card_level_service(point_list):
# point_mid = await batch_get_wiring_type(point_list) # point_mid = await batch_get_wiring_type(point_list)
# # 3. 获取redis数据 # # 3. 获取redis数据
# res_redis = await elec_current_data(point_mid) # res_redis = await elec_current_data(point_mid)
mtids = [monitor["mtid"] for monitor in monitor_point_list if monitor["mtid"]] mtids = [monitor["mtid"] for monitor in monitor_point_list if
monitor["mtid"]]
cid = monitor_point_list[0]['cid'] if len(monitor_point_list) > 0 else 0 cid = monitor_point_list[0]['cid'] if len(monitor_point_list) > 0 else 0
results = await elec_current_data_new15(mtids, cid) results = await elec_current_data_new15(mtids, cid)
# 4. 返回数据 # 4. 返回数据
...@@ -286,7 +287,7 @@ async def elec_card_level_service(point_list): ...@@ -286,7 +287,7 @@ async def elec_card_level_service(point_list):
"ub_dev": "", "ub_dev": "",
"uc_dev": "", "uc_dev": "",
} }
ret_data[m_type].append(res_dic) ret_data[m_type].append(res_dic)
return EclResp( return EclResp(
inline=ret_data["inline"], inline=ret_data["inline"],
...@@ -326,15 +327,15 @@ async def qual_current_level_service(point_list): ...@@ -326,15 +327,15 @@ async def qual_current_level_service(point_list):
# 初始化返回dic # 初始化返回dic
if res.get(mtid): if res.get(mtid):
time_str = res[mtid]["ts"][:-4] time_str = res[mtid]["ts"][:-4]
fdia = round_2(res[mtid].get("fdia")) fdia = round_2(res[mtid].get("fdia"))
fdib = round_2(res[mtid].get("fdib")) fdib = round_2(res[mtid].get("fdib"))
fdic = round_2(res[mtid].get("fdic")) fdic = round_2(res[mtid].get("fdic"))
thdia = round_4(res[mtid].get("thdia")) thdia = round_4(res[mtid].get("thdia"))
thdib = round_4(res[mtid].get("thdib")) thdib = round_4(res[mtid].get("thdib"))
thdic = round_4(res[mtid].get("thdic")) thdic = round_4(res[mtid].get("thdic"))
res_dic = { res_dic = {
"name": m_name, "name": m_name,
"point_id": point_id, "point_id": point_id,
...@@ -344,7 +345,7 @@ async def qual_current_level_service(point_list): ...@@ -344,7 +345,7 @@ async def qual_current_level_service(point_list):
"thdia": thdia, "thdia": thdia,
"thdib": thdib, "thdib": thdib,
"thdic": thdic, "thdic": thdic,
"thdua": round_4(res[mtid].get("thdua")), "thdua": round_4(res[mtid].get("thdua")),
"thdub": round_4(res[mtid].get("thdub")), "thdub": round_4(res[mtid].get("thdub")),
"thduc": round_4(res[mtid].get("thduc")), "thduc": round_4(res[mtid].get("thduc")),
...@@ -385,7 +386,7 @@ async def qual_current_level_service(point_list): ...@@ -385,7 +386,7 @@ async def qual_current_level_service(point_list):
"thdia": "", "thdia": "",
"thdib": "", "thdib": "",
"thdic": "", "thdic": "",
"thdua": "", "thdua": "",
"thdub": "", "thdub": "",
"thduc": "", "thduc": "",
...@@ -409,7 +410,7 @@ async def qual_current_level_service(point_list): ...@@ -409,7 +410,7 @@ async def qual_current_level_service(point_list):
"thdib_virtual": "", "thdib_virtual": "",
"thdic_virtual": "", "thdic_virtual": "",
} }
ret_data[m_type].append(res_dic) ret_data[m_type].append(res_dic)
return QclResp( return QclResp(
inline=ret_data["inline"], inline=ret_data["inline"],
...@@ -562,14 +563,14 @@ async def elec_index_service(cid, point_id, date_start, date_end): ...@@ -562,14 +563,14 @@ async def elec_index_service(cid, point_id, date_start, date_end):
"freq_dev_min", "freq_dev_min",
"freq_dev_max", "freq_dev_max",
] ]
query_body = EsQuery.aggr_index(page_request, query_body = EsQuery.aggr_index(page_request,
stats_items=common_items + elec_qual_items) stats_items=common_items + elec_qual_items)
async with EsUtil() as es: async with EsUtil() as es:
es_results = await es.search_origin(body=query_body, es_results = await es.search_origin(body=query_body,
index=constants.POINT_15MIN_INDEX) index=constants.POINT_15MIN_INDEX)
aggregations = es_results.get("aggregations", {}) aggregations = es_results.get("aggregations", {})
# 常规参数统计 # 常规参数统计
common_indexes = [] common_indexes = []
...@@ -593,7 +594,7 @@ async def elec_index_service(cid, point_id, date_start, date_end): ...@@ -593,7 +594,7 @@ async def elec_index_service(cid, point_id, date_start, date_end):
else: else:
max_value = "" max_value = ""
max_value_time = "" max_value_time = ""
# 最小值 # 最小值
min_info = aggregations.get(f"{item}_min_min", {}) min_info = aggregations.get(f"{item}_min_min", {})
hits = min_info.get("hits", {}).get("hits") hits = min_info.get("hits", {}).get("hits")
...@@ -609,10 +610,10 @@ async def elec_index_service(cid, point_id, date_start, date_end): ...@@ -609,10 +610,10 @@ async def elec_index_service(cid, point_id, date_start, date_end):
else: else:
min_value = "" min_value = ""
min_value_time = "" min_value_time = ""
avg = aggregations.get(f"{item}_mean_avg", {}).get("value") avg = aggregations.get(f"{item}_mean_avg", {}).get("value")
avg = round(avg, 2) if avg is not None else "" avg = round(avg, 2) if avg is not None else ""
elec_index = ElecIndex( elec_index = ElecIndex(
stats_index=item, stats_index=item,
max=max_value, max=max_value,
...@@ -622,7 +623,7 @@ async def elec_index_service(cid, point_id, date_start, date_end): ...@@ -622,7 +623,7 @@ async def elec_index_service(cid, point_id, date_start, date_end):
avg=avg, avg=avg,
) )
common_indexes.append(elec_index) common_indexes.append(elec_index)
# 电能质量统计 # 电能质量统计
elec_qual_indexes = [] elec_qual_indexes = []
_elec_qual_items = {i.rsplit("_", 1)[0] for i in elec_qual_items} _elec_qual_items = {i.rsplit("_", 1)[0] for i in elec_qual_items}
...@@ -641,7 +642,7 @@ async def elec_index_service(cid, point_id, date_start, date_end): ...@@ -641,7 +642,7 @@ async def elec_index_service(cid, point_id, date_start, date_end):
else: else:
max_value = "" max_value = ""
max_value_time = "" max_value_time = ""
# 最小值 # 最小值
min_info = aggregations.get(f"{item}_min_min", {}) min_info = aggregations.get(f"{item}_min_min", {})
hits = min_info.get("hits", {}).get("hits") hits = min_info.get("hits", {}).get("hits")
...@@ -656,10 +657,10 @@ async def elec_index_service(cid, point_id, date_start, date_end): ...@@ -656,10 +657,10 @@ async def elec_index_service(cid, point_id, date_start, date_end):
else: else:
min_value = "" min_value = ""
min_value_time = "" min_value_time = ""
avg = aggregations.get(f"{item}_mean_avg", {}).get("value") avg = aggregations.get(f"{item}_mean_avg", {}).get("value")
avg = avg if avg is not None else "" avg = avg if avg is not None else ""
elec_index = ElecIndex( elec_index = ElecIndex(
stats_index=item, stats_index=item,
max=max_value, max=max_value,
...@@ -669,7 +670,7 @@ async def elec_index_service(cid, point_id, date_start, date_end): ...@@ -669,7 +670,7 @@ async def elec_index_service(cid, point_id, date_start, date_end):
avg=avg, avg=avg,
) )
elec_qual_indexes.append(elec_index) elec_qual_indexes.append(elec_index)
if cid: if cid:
# 小程序需要这漏电流和温度 # 小程序需要这漏电流和温度
residual_current_map = await location_stats_statics( residual_current_map = await location_stats_statics(
...@@ -698,7 +699,7 @@ async def elec_index_service(cid, point_id, date_start, date_end): ...@@ -698,7 +699,7 @@ async def elec_index_service(cid, point_id, date_start, date_end):
else None, else None,
) )
) )
temp_map = await location_stats_statics( temp_map = await location_stats_statics(
cid, point_id, start_tt, end_tt, _type="temperature" cid, point_id, start_tt, end_tt, _type="temperature"
) )
...@@ -773,83 +774,101 @@ async def elec_index_service_new15(cid, point_id, start, end): ...@@ -773,83 +774,101 @@ async def elec_index_service_new15(cid, point_id, start, end):
"ua_dev_mean", "ua_dev_min", "ua_dev_max", "ua_dev_mean", "ua_dev_min", "ua_dev_max",
"freq_dev_mean", "freq_dev_min", "freq_dev_max"] "freq_dev_mean", "freq_dev_min", "freq_dev_max"]
datas = await get_electric_datas_dao(table_name, point_id, start, end) datas = await get_electric_datas_dao(table_name, point_id, start, end)
if not datas: # if not datas:
return ElecIndexResponse( # return ElecIndexResponse(
ctnum=ctnum, common_indexes=[], # ctnum=ctnum, common_indexes=[],
elec_qual_indexes=[] # elec_qual_indexes=[]
) # )
df = pd.DataFrame(list(datas)) df = pd.DataFrame(list(datas))
# 常规参数统计 # 常规参数统计
common_indexes = [] common_indexes = []
_common_items = {i.rsplit("_", 1)[0] for i in common_items} _common_items = {i.rsplit("_", 1)[0] for i in common_items}
for item in _common_items: for item in _common_items:
item_name = item.rsplit("_", 1)[0] if datas:
max_item_name = f"{item}_max" max_item_name = f"{item}_max"
max_value = df[max_item_name].max() max_value = df[max_item_name].max()
if not pd.isna(max_value): if not pd.isna(max_value):
max_datas = df.loc[df[max_item_name].idxmax()].to_dict() max_datas = df.loc[df[max_item_name].idxmax()].to_dict()
max_time = max_datas.get(f"{item_name}_max_time") max_time = max_datas.get(f"{item}_max_time")
max_time = '' if pd.isnull(max_time) else str(max_time) max_time = '' if pd.isnull(max_time) else str(max_time)
else: else:
max_value, max_time = "", "" max_value, max_time = "", ""
min_item_name = f"{item}_min" min_item_name = f"{item}_min"
min_value = df[min_item_name].min() min_value = df[min_item_name].min()
if not pd.isna(min_value): if not pd.isna(min_value):
min_datas = df.loc[df[min_item_name].idxmin()].to_dict() min_datas = df.loc[df[min_item_name].idxmin()].to_dict()
min_time = min_datas.get(f"{item_name}_min_time") min_time = min_datas.get(f"{item}_min_time")
min_time = '' if pd.isnull(min_time) else str(min_time) min_time = '' if pd.isnull(min_time) else str(min_time)
else: else:
min_value, min_time = "", "" min_value, min_time = "", ""
mean_item_name = f"{item}_mean" mean_item_name = f"{item}_mean"
avg_value = df[mean_item_name].mean() avg_value = df[mean_item_name].mean()
if not pd.isna(avg_value): if not pd.isna(avg_value):
avg_value = round(avg_value, 2) if avg_value else "" avg_value = round(avg_value, 2) if avg_value else ""
else:
avg_value = ""
elec_index = ElecIndex(
stats_index=item,
max=max_value,
max_time=max_time or "",
min=min_value,
min_time=min_time or "",
avg=avg_value,
)
else: else:
avg_value = "" elec_index = ElecIndex(
elec_index = ElecIndex( stats_index=item,
stats_index=item_name, max="",
max=max_value, max_time="",
max_time=max_time or "", min="",
min=min_value, min_time="",
min_time=min_time or "", avg="",
avg=avg_value, )
)
common_indexes.append(elec_index) common_indexes.append(elec_index)
# 电能质量统计 # 电能质量统计
elec_qual_indexes = [] elec_qual_indexes = []
_elec_qual_items = {i.rsplit("_", 1)[0] for i in elec_qual_items} _elec_qual_items = {i.rsplit("_", 1)[0] for i in elec_qual_items}
for item in _elec_qual_items: for item in _elec_qual_items:
item_name = item.rsplit("_", 1)[0] if datas:
max_item_name = f"{item}_max" max_item_name = f"{item}_max"
max_value = df[max_item_name].max() max_value = df[max_item_name].max()
if not pd.isna(max_value): if not pd.isna(max_value):
max_datas = df.loc[df[max_item_name].idxmax()].to_dict() max_datas = df.loc[df[max_item_name].idxmax()].to_dict()
max_time = max_datas.get(f"{item_name}_max_time") max_time = max_datas.get(f"{item}_max_time")
max_time = '' if pd.isnull(max_time) else str(max_time) max_time = '' if pd.isnull(max_time) else str(max_time)
else: else:
max_value, max_time = "", "" max_value, max_time = "", ""
min_item_name = f"{item}_min" min_item_name = f"{item}_min"
min_value = df[min_item_name].min() min_value = df[min_item_name].min()
if not pd.isna(min_value): if not pd.isna(min_value):
min_datas = df.loc[df[min_item_name].idxmin()].to_dict() min_datas = df.loc[df[min_item_name].idxmin()].to_dict()
min_time = min_datas.get(f"{item_name}_min_time") min_time = min_datas.get(f"{item}_min_time")
min_time = '' if pd.isnull(min_time) else str(min_time) min_time = '' if pd.isnull(min_time) else str(min_time)
else: else:
min_value, min_time = "", "" min_value, min_time = "", ""
mean_item_name = f"{item}_mean" mean_item_name = f"{item}_mean"
avg_value = df[mean_item_name].mean() avg_value = df[mean_item_name].mean()
if not pd.isna(avg_value): if not pd.isna(avg_value):
avg_value = round(avg_value, 2) if avg_value else "" avg_value = round(avg_value, 2) if avg_value else ""
else:
avg_value = ""
elec_index = ElecIndex(
stats_index=item,
max=max_value,
max_time=max_time,
min=min_value,
min_time=min_time,
avg=avg_value,
)
else: else:
avg_value = "" elec_index = ElecIndex(
elec_index = ElecIndex( stats_index=item,
stats_index=item_name, max="",
max=max_value, max_time="",
max_time=max_time, min="",
min=min_value, min_time="",
min_time=min_time, avg="",
avg=avg_value, )
)
elec_qual_indexes.append(elec_index) elec_qual_indexes.append(elec_index)
# 小程序需要这漏电流和温度 # 小程序需要这漏电流和温度
if cid: if cid:
...@@ -877,6 +896,7 @@ async def elec_index_service_new15(cid, point_id, start, end): ...@@ -877,6 +896,7 @@ async def elec_index_service_new15(cid, point_id, start, end):
elec_qual_indexes=elec_qual_indexes elec_qual_indexes=elec_qual_indexes
) )
async def elec_current_service_new15(point_id): async def elec_current_service_new15(point_id):
# 获取mtid # 获取mtid
meter_info = await get_meter_by_point_new15(point_id) meter_info = await get_meter_by_point_new15(point_id)
...@@ -903,7 +923,7 @@ async def elec_current_service_new15(point_id): ...@@ -903,7 +923,7 @@ async def elec_current_service_new15(point_id):
time_str = str(res["ts"])[0:19] time_str = str(res["ts"])[0:19]
else: else:
time_str = time_format.get_datetime_str(0) time_str = time_format.get_datetime_str(0)
return time_str,res return time_str, res
def get_sdu_i_and_u(res, ctnum): def get_sdu_i_and_u(res, ctnum):
......
...@@ -3,6 +3,10 @@ import time ...@@ -3,6 +3,10 @@ import time
from datetime import datetime, timedelta from datetime import datetime, timedelta
from math import sqrt from math import sqrt
import pendulum import pendulum
from pot_libs.settings import SETTING
from unify_api.modules.electric.dao.electric_dao import \
get_elec_mtid_sid_by_cid
from unify_api.utils.common_utils import round_2 from unify_api.utils.common_utils import round_2
from pot_libs.aredis_util.aredis_utils import RedisUtils from pot_libs.aredis_util.aredis_utils import RedisUtils
from pot_libs.common.components.query import Range, Equal, Filter, PageRequest from pot_libs.common.components.query import Range, Equal, Filter, PageRequest
...@@ -35,7 +39,9 @@ from unify_api.modules.home_page.dao.count_info_dao import ( ...@@ -35,7 +39,9 @@ from unify_api.modules.home_page.dao.count_info_dao import (
from unify_api.modules.electric_optimization.dao.power_index import ( from unify_api.modules.electric_optimization.dao.power_index import (
price_policy_by_cid price_policy_by_cid
) )
from unify_api.utils.taos_new import parse_td_columns from unify_api.utils.taos_new import parse_td_columns, get_td_table_name, \
td3_tbl_compate, get_td_engine_data
async def other_info(company_id): async def other_info(company_id):
""" """
...@@ -52,7 +58,7 @@ async def other_info(company_id): ...@@ -52,7 +58,7 @@ async def other_info(company_id):
GROUP BY GROUP BY
DATE(pevent.event_datetime) DATE(pevent.event_datetime)
""" """
now_time = datetime.now() now_time = datetime.now()
# 获取到工厂安装时间create_time # 获取到工厂安装时间create_time
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
...@@ -61,7 +67,7 @@ async def other_info(company_id): ...@@ -61,7 +67,7 @@ async def other_info(company_id):
company = await conn.fetchone(company_sql, (company_id,)) company = await conn.fetchone(company_sql, (company_id,))
create_time_timestamp = company["create_time"] create_time_timestamp = company["create_time"]
create_time = datetime.fromtimestamp(create_time_timestamp) create_time = datetime.fromtimestamp(create_time_timestamp)
today_alarm_count = 0 today_alarm_count = 0
alarm_count = 0 alarm_count = 0
if not alarm_data: if not alarm_data:
...@@ -72,7 +78,7 @@ async def other_info(company_id): ...@@ -72,7 +78,7 @@ async def other_info(company_id):
# 系统安全运行天数: 当前时间 - 工厂安装时间 + 1 # 系统安全运行天数: 当前时间 - 工厂安装时间 + 1
safe_run_days = (now_time - create_time).days + 1 safe_run_days = (now_time - create_time).days + 1
return today_alarm_count, safe_run_days, alarm_count return today_alarm_count, safe_run_days, alarm_count
# 5. 构造返回 # 5. 构造返回
# 如果每天都有报警, 防止安全运行天数-1天, 所以total_days +2 # 如果每天都有报警, 防止安全运行天数-1天, 所以total_days +2
total_days = (now_time - create_time).days + 2 total_days = (now_time - create_time).days + 2
...@@ -119,20 +125,20 @@ async def other_info_old(company_id): ...@@ -119,20 +125,20 @@ async def other_info_old(company_id):
} }
}, },
} }
async with EsUtil() as es: async with EsUtil() as es:
es_result = await es.search_origin(body=query_body, es_result = await es.search_origin(body=query_body,
index=constants.POINT_1MIN_EVENT) index=constants.POINT_1MIN_EVENT)
now_time = datetime.now() now_time = datetime.now()
# 获取到工厂安装时间create_time # 获取到工厂安装时间create_time
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
company_sql = "select create_time from company where cid = %s" company_sql = "select create_time from company where cid = %s"
company = await conn.fetchone(company_sql, (company_id,)) company = await conn.fetchone(company_sql, (company_id,))
create_time_timestamp = company["create_time"] create_time_timestamp = company["create_time"]
create_time = datetime.fromtimestamp(create_time_timestamp) create_time = datetime.fromtimestamp(create_time_timestamp)
today_alarm_count = 0 today_alarm_count = 0
alarm_count = 0 alarm_count = 0
date_buckets = es_result.get("aggregations", {}).get("date_alarms", date_buckets = es_result.get("aggregations", {}).get("date_alarms",
...@@ -146,7 +152,7 @@ async def other_info_old(company_id): ...@@ -146,7 +152,7 @@ async def other_info_old(company_id):
# 系统安全运行天数: 当前时间 - 工厂安装时间 + 1 # 系统安全运行天数: 当前时间 - 工厂安装时间 + 1
safe_run_days = (now_time - create_time).days + 1 safe_run_days = (now_time - create_time).days + 1
return today_alarm_count, safe_run_days, alarm_count return today_alarm_count, safe_run_days, alarm_count
# 5. 构造返回 # 5. 构造返回
# 如果每天都有报警, 防止安全运行天数-1天, 所以total_days +2 # 如果每天都有报警, 防止安全运行天数-1天, 所以total_days +2
total_days = (now_time - create_time).days + 2 total_days = (now_time - create_time).days + 2
...@@ -214,7 +220,7 @@ async def electric_use_info(company_id): ...@@ -214,7 +220,7 @@ async def electric_use_info(company_id):
end_timestamp = datetime_to_timestamp(now) end_timestamp = datetime_to_timestamp(now)
start_timestamp = datetime_to_timestamp( start_timestamp = datetime_to_timestamp(
datetime(now.year, now.month, now.day) - timedelta(30)) datetime(now.year, now.month, now.day) - timedelta(30))
score_events = [ score_events = [
i i
for i in EVENT_TYPE_MAP.keys() for i in EVENT_TYPE_MAP.keys()
...@@ -256,12 +262,12 @@ async def electric_use_info(company_id): ...@@ -256,12 +262,12 @@ async def electric_use_info(company_id):
}, },
}, },
} }
log.info("cal_score_safe_electric query_body={}".format(query_body)) log.info("cal_score_safe_electric query_body={}".format(query_body))
async with EsUtil() as es: async with EsUtil() as es:
es_result = await es.search_origin(body=query_body, es_result = await es.search_origin(body=query_body,
index=constants.POINT_1MIN_EVENT) index=constants.POINT_1MIN_EVENT)
score_buckets = ( score_buckets = (
es_result.get("aggregations", {}).get("score_aggs", {}).get("types", es_result.get("aggregations", {}).get("score_aggs", {}).get("types",
{}).get( {}).get(
...@@ -277,7 +283,7 @@ async def electric_use_info(company_id): ...@@ -277,7 +283,7 @@ async def electric_use_info(company_id):
second_alarm_cnt += bucket["doc_count"] second_alarm_cnt += bucket["doc_count"]
elif bucket["key"] == Importance.Third.value: elif bucket["key"] == Importance.Third.value:
third_alarm_cnt += bucket["doc_count"] third_alarm_cnt += bucket["doc_count"]
company_point_map = await get_points([company_id]) company_point_map = await get_points([company_id])
point_len = len(company_point_map.get(company_id) or {}) point_len = len(company_point_map.get(company_id) or {})
alarm_score = ( alarm_score = (
...@@ -290,15 +296,15 @@ async def electric_use_info(company_id): ...@@ -290,15 +296,15 @@ async def electric_use_info(company_id):
f"alarm_score:{alarm_score}") f"alarm_score:{alarm_score}")
if alarm_score >= 15: if alarm_score >= 15:
alarm_score = 15 alarm_score = 15
electric_use_score = get_electric_index(alarm_score) electric_use_score = get_electric_index(alarm_score)
log.info( log.info(
"point_len={} alarm_score={} electric_use_score={}".format( "point_len={} alarm_score={} electric_use_score={}".format(
point_len, alarm_score, electric_use_score point_len, alarm_score, electric_use_score
) )
) )
alarm_buckets = ( alarm_buckets = (
es_result.get("aggregations", {}).get("alarm_aggs", {}).get("types", es_result.get("aggregations", {}).get("alarm_aggs", {}).get("types",
{}).get( {}).get(
...@@ -337,7 +343,7 @@ async def electric_use_info_new15(cid): ...@@ -337,7 +343,7 @@ async def electric_use_info_new15(cid):
f"GROUP BY importance" f"GROUP BY importance"
first_score, second_score, third_score = 0, 0, 0 first_score, second_score, third_score = 0, 0, 0
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
score_datas = await conn.fetchall(score_sql, args=(cid, )) score_datas = await conn.fetchall(score_sql, args=(cid,))
alarm_datas = await conn.fetchall(alarm_sql, args=(cid, score_events)) alarm_datas = await conn.fetchall(alarm_sql, args=(cid, score_events))
for data in score_datas: for data in score_datas:
if data["importance"] == Importance.First.value: if data["importance"] == Importance.First.value:
...@@ -389,27 +395,27 @@ async def normal_rate_of_location(company_id): ...@@ -389,27 +395,27 @@ async def normal_rate_of_location(company_id):
) )
for location in locations: for location in locations:
location_map[location["id"]] = location location_map[location["id"]] = location
# todo批量hmget # todo批量hmget
count_info_map = { count_info_map = {
"residual_current": {"total": 0, "normal": 0}, "residual_current": {"total": 0, "normal": 0},
"temperature": {"total": 0, "normal": 0}, "temperature": {"total": 0, "normal": 0},
} }
print(f"len(location_map)={len(location_map)}") print(f"len(location_map)={len(location_map)}")
location_ids = list(location_map.keys()) location_ids = list(location_map.keys())
adio_currents = [] adio_currents = []
if location_ids: if location_ids:
adio_currents = await RedisUtils().hmget("adio_current", adio_currents = await RedisUtils().hmget("adio_current",
*location_ids) *location_ids)
adio_info_map = {} adio_info_map = {}
for index, item_byte in enumerate(adio_currents): for index, item_byte in enumerate(adio_currents):
if item_byte: if item_byte:
item = json.loads(item_byte.decode()) item = json.loads(item_byte.decode())
adio_info_map[location_ids[index]] = item adio_info_map[location_ids[index]] = item
for location_id, location_info in location_map.items(): for location_id, location_info in location_map.items():
audio_info = adio_info_map.get(location_id) audio_info = adio_info_map.get(location_id)
count_info_map[location_info["type"]]["total"] += 1 count_info_map[location_info["type"]]["total"] += 1
...@@ -420,7 +426,7 @@ async def normal_rate_of_location(company_id): ...@@ -420,7 +426,7 @@ async def normal_rate_of_location(company_id):
# 超过4小时的值不统计在normal里 # 超过4小时的值不统计在normal里
log.warn(f"adio_current location_id={location_id} has expire!") log.warn(f"adio_current location_id={location_id} has expire!")
continue continue
print( print(
"threshold={} location_info['type'] = {} audio_info['value']={}".format( "threshold={} location_info['type'] = {} audio_info['value']={}".format(
location_info["threshold"], location_info["type"], location_info["threshold"], location_info["type"],
...@@ -447,7 +453,7 @@ async def normal_rate_of_location(company_id): ...@@ -447,7 +453,7 @@ async def normal_rate_of_location(company_id):
) )
+ "%" + "%"
) )
if count_info_map["residual_current"]["total"] == 0: if count_info_map["residual_current"]["total"] == 0:
residual_current_qr = "100%" residual_current_qr = "100%"
else: else:
...@@ -463,7 +469,7 @@ async def normal_rate_of_location(company_id): ...@@ -463,7 +469,7 @@ async def normal_rate_of_location(company_id):
) )
+ "%" + "%"
) )
return temperature_qr, residual_current_qr return temperature_qr, residual_current_qr
...@@ -488,13 +494,13 @@ async def normal_rate_of_location_new15(cid): ...@@ -488,13 +494,13 @@ async def normal_rate_of_location_new15(cid):
adio_currents = [] adio_currents = []
if location_ids: if location_ids:
adio_currents = await RedisUtils().hmget("adio_current", adio_currents = await RedisUtils().hmget("adio_current",
*location_ids) *location_ids)
adio_info_map = {} adio_info_map = {}
for index, item_byte in enumerate(adio_currents): for index, item_byte in enumerate(adio_currents):
if item_byte: if item_byte:
item = json.loads(item_byte.decode()) item = json.loads(item_byte.decode())
adio_info_map[location_ids[index]] = item adio_info_map[location_ids[index]] = item
for location_id, location_info in location_map.items(): for location_id, location_info in location_map.items():
audio_info = adio_info_map.get(location_id) audio_info = adio_info_map.get(location_id)
count_info_map[location_info["type"]]["total"] += 1 count_info_map[location_info["type"]]["total"] += 1
...@@ -525,7 +531,7 @@ async def normal_rate_of_location_new15(cid): ...@@ -525,7 +531,7 @@ async def normal_rate_of_location_new15(cid):
) )
+ "%" + "%"
) )
if count_info_map["residual_current"]["total"] == 0: if count_info_map["residual_current"]["total"] == 0:
residual_current_qr = "100%" residual_current_qr = "100%"
else: else:
...@@ -541,7 +547,7 @@ async def normal_rate_of_location_new15(cid): ...@@ -541,7 +547,7 @@ async def normal_rate_of_location_new15(cid):
) )
+ "%" + "%"
) )
return temperature_qr, residual_current_qr return temperature_qr, residual_current_qr
...@@ -556,10 +562,10 @@ async def current_load(company_id): ...@@ -556,10 +562,10 @@ async def current_load(company_id):
"and add_to_company = 1" "and add_to_company = 1"
points = await conn.fetchall(point_sql, args=(company_id,)) points = await conn.fetchall(point_sql, args=(company_id,))
point_ids = [p["pid"] for p in points] point_ids = [p["pid"] for p in points]
if not point_ids: if not point_ids:
return "" return ""
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
meter_sql = ( meter_sql = (
"SELECT pid, mid FROM change_meter_record WHERE pid in %s ORDER BY pid, start_time" "SELECT pid, mid FROM change_meter_record WHERE pid in %s ORDER BY pid, start_time"
...@@ -569,15 +575,15 @@ async def current_load(company_id): ...@@ -569,15 +575,15 @@ async def current_load(company_id):
# 正序排序,最后这个map存储的是按照start_time是最近的mid # 正序排序,最后这个map存储的是按照start_time是最近的mid
change_meter_map = {m["pid"]: m["mid"] for m in change_meters if change_meter_map = {m["pid"]: m["mid"] for m in change_meters if
m["mid"] is not None} m["mid"] is not None}
newest_mids = list(change_meter_map.values()) newest_mids = list(change_meter_map.values())
meterdata_currents = [] meterdata_currents = []
if newest_mids: if newest_mids:
meterdata_currents = await RedisUtils().hmget(METERDATA_CURRENT_KEY, meterdata_currents = await RedisUtils().hmget(METERDATA_CURRENT_KEY,
*newest_mids) *newest_mids)
now_tt = int(time.time()) now_tt = int(time.time())
if meterdata_currents: if meterdata_currents:
total = 0 total = 0
for item in meterdata_currents: for item in meterdata_currents:
...@@ -598,39 +604,46 @@ async def current_load(company_id): ...@@ -598,39 +604,46 @@ async def current_load(company_id):
return "" return ""
async def current_load_new15(cid): async def current_load_new15(cid, end_dt=None):
"""实时负荷""" """实时负荷"""
import re datas = await get_elec_mtid_sid_by_cid(cid)
from pot_libs.settings import SETTING td_mt_tables = tuple(
from unify_api.modules.common.service.td_engine_service import \ (get_td_table_name("electric", data["mtid"]) for data in datas if
get_td_engine_data data["mtid"]))
td_mt_tables = td3_tbl_compate(td_mt_tables)
if not end_dt:
end_dt = pendulum.now(tz="Asia/Shanghai")
start_dt = end_dt.subtract(minutes=2)
sql = f"select last_row(mdptime, pttl) from electric_stb " \
f"where TBNAME IN {td_mt_tables} and ts>='{str(start_dt)}' and ts " \
f"<='{str(end_dt)}' group by tbname"
url = f"{SETTING.stb_url}db_electric?tz=Asia/Shanghai" url = f"{SETTING.stb_url}db_electric?tz=Asia/Shanghai"
sql = f"""
select last_row(*) from electric_stb
where cpyid={cid}
group by tbname
"""
is_succ, results = await get_td_engine_data(url, sql) is_succ, results = await get_td_engine_data(url, sql)
now_tt = int(time.time()) if not is_succ:
if is_succ: return ""
head = parse_td_columns(results)
datas = [] if not results["data"]: # 兼容:mt表(2.0架构)里面拿不到数据再从sid表(1.0架构)里面拿
for res in results["data"]: td_s_tables = tuple(
datas.append(dict(zip(head, res))) (f"s{data['sid'].lower()}_e" for data in datas if data["sid"]))
total = 0 td_s_tables = td3_tbl_compate(td_s_tables)
for item in datas: sql = f"select last_row(mdptime, pttl) from electric_stb " \
# 这里是有可能item为None的 f"where TBNAME IN {td_s_tables} group by tbname"
if item: is_succ, results = await get_td_engine_data(url, sql)
mdptime_tt = None if not is_succ:
if "mdptime" in item: return ""
mdptime_dt = pendulum.parse(item["mdptime"])
item_tt = item.get("timestamp") or mdptime_dt.int_timestamp head = parse_td_columns(results)
if item_tt: datas = []
# 小于2分钟内的数据相加为实时负荷 for res in results["data"]:
if now_tt - item_tt <= 2 * 60: datas.append(dict(zip(head, res)))
total += item["pttl"] total = 0
return total for item in datas:
return "" if not item:
continue
total += item["pttl"]
return total
async def power_count_info(company_id): async def power_count_info(company_id):
...@@ -644,7 +657,7 @@ async def power_count_info(company_id): ...@@ -644,7 +657,7 @@ async def power_count_info(company_id):
now = datetime.now() now = datetime.now()
start_time = (now - timedelta(30)).strftime("%Y-%m-%d %H:%M:%S") start_time = (now - timedelta(30)).strftime("%Y-%m-%d %H:%M:%S")
end_time = now.strftime("%Y-%m-%d %H:%M:%S") end_time = now.strftime("%Y-%m-%d %H:%M:%S")
max_30d_load, _time = await pttl_max(company_id, start_time, end_time, -1) max_30d_load, _time = await pttl_max(company_id, start_time, end_time, -1)
cur_load = await current_load(company_id) cur_load = await current_load(company_id)
return cur_load, max_30d_load return cur_load, max_30d_load
...@@ -655,7 +668,7 @@ async def power_count_info_new15(cid): ...@@ -655,7 +668,7 @@ async def power_count_info_new15(cid):
now = datetime.now() now = datetime.now()
start_time = (now - timedelta(30)).strftime("%Y-%m-%d 00:00:00") start_time = (now - timedelta(30)).strftime("%Y-%m-%d 00:00:00")
end_time = now.strftime("%Y-%m-%d %H:%M:%S") end_time = now.strftime("%Y-%m-%d %H:%M:%S")
max_30d_load, _time = await pttl_max_new15(cid, start_time, end_time, -1) max_30d_load, _time = await pttl_max_new15(cid, start_time, end_time, -1)
cur_load = await current_load_new15(cid) cur_load = await current_load_new15(cid)
return round_2(cur_load), round_2(max_30d_load) return round_2(cur_load), round_2(max_30d_load)
...@@ -691,7 +704,7 @@ async def get_max_aiao_of_filed(company_id, start_time, end_time, ...@@ -691,7 +704,7 @@ async def get_max_aiao_of_filed(company_id, start_time, end_time,
index=constants.LOCATION_15MIN_AIAO) index=constants.LOCATION_15MIN_AIAO)
value_max = es_results.get("aggregations", {}).get("value_max_max", {}) value_max = es_results.get("aggregations", {}).get("value_max_max", {})
rc_max_hits = value_max.get("hits", {}).get("hits") rc_max_hits = value_max.get("hits", {}).get("hits")
max_info, location_map = {}, {} max_info, location_map = {}, {}
if rc_max_hits: if rc_max_hits:
max_info = rc_max_hits[0]["_source"] max_info = rc_max_hits[0]["_source"]
...@@ -706,7 +719,7 @@ async def get_max_aiao_of_filed(company_id, start_time, end_time, ...@@ -706,7 +719,7 @@ async def get_max_aiao_of_filed(company_id, start_time, end_time,
if max_info if max_info
else None else None
) )
return MaxResidualCurrent( return MaxResidualCurrent(
max=round(max_info["value_max"], 2) if max_info else None, max=round(max_info["value_max"], 2) if max_info else None,
location_name=f"{location_map['group']}_{'漏电流' if location_map['item'] == 'default' else location_map['item']}" location_name=f"{location_map['group']}_{'漏电流' if location_map['item'] == 'default' else location_map['item']}"
...@@ -769,8 +782,9 @@ async def company_power_use_info_new15(company_id, start, end): ...@@ -769,8 +782,9 @@ async def company_power_use_info_new15(company_id, start, end):
async def get_company_charge_price(company_id, es_time_start, es_time_end): async def get_company_charge_price(company_id, es_time_start, es_time_end):
power_use_info = await company_power_use_info_new15(company_id, es_time_start, power_use_info = await company_power_use_info_new15(company_id,
es_time_end) es_time_start,
es_time_end)
if power_use_info["kwh"]: if power_use_info["kwh"]:
unit_price = power_use_info["charge"] / power_use_info["kwh"] unit_price = power_use_info["charge"] / power_use_info["kwh"]
else: else:
...@@ -790,7 +804,7 @@ async def power_charge_price(company_id): ...@@ -790,7 +804,7 @@ async def power_charge_price(company_id):
yestoday_start = datetime(yestoday.year, yestoday.month, yestoday.day, 0, yestoday_start = datetime(yestoday.year, yestoday.month, yestoday.day, 0,
0, 0) 0, 0)
yestoday_end = yestoday_start + timedelta(1) yestoday_end = yestoday_start + timedelta(1)
es_yestoday_start = datetime.strftime(yestoday_start, es_yestoday_start = datetime.strftime(yestoday_start,
"%Y-%m-%dT%H:%M:%S+08:00") "%Y-%m-%dT%H:%M:%S+08:00")
es_yestoday_end = datetime.strftime(yestoday_end, es_yestoday_end = datetime.strftime(yestoday_end,
...@@ -798,7 +812,7 @@ async def power_charge_price(company_id): ...@@ -798,7 +812,7 @@ async def power_charge_price(company_id):
yestoday_price = await get_company_charge_price(company_id, yestoday_price = await get_company_charge_price(company_id,
es_yestoday_start, es_yestoday_start,
es_yestoday_end) es_yestoday_end)
if now.month == 1: if now.month == 1:
last_month = 12 last_month = 12
year = now.year - 1 year = now.year - 1
...@@ -813,7 +827,7 @@ async def power_charge_price(company_id): ...@@ -813,7 +827,7 @@ async def power_charge_price(company_id):
last_month_price = await get_company_charge_price( last_month_price = await get_company_charge_price(
company_id, es_last_month_start, es_last_month_end company_id, es_last_month_start, es_last_month_end
) )
return yestoday_price, last_month_price return yestoday_price, last_month_price
...@@ -835,7 +849,7 @@ async def power_charge_price_new15(cid): ...@@ -835,7 +849,7 @@ async def power_charge_price_new15(cid):
year = now.year - 1 year = now.year - 1
last_month_start = datetime(year=year, month=last_month, day=1) last_month_start = datetime(year=year, month=last_month, day=1)
else: else:
last_month_start = datetime(year=now.year, month=now.month-1, day=1) last_month_start = datetime(year=now.year, month=now.month - 1, day=1)
last_month_end = datetime(year=now.year, month=now.month, day=1) last_month_end = datetime(year=now.year, month=now.month, day=1)
last_month_datas = await company_power_use_info_new15( last_month_datas = await company_power_use_info_new15(
cid, str(last_month_start), str(last_month_end) cid, str(last_month_start), str(last_month_end)
...@@ -859,19 +873,19 @@ async def power_factor(company_id): ...@@ -859,19 +873,19 @@ async def power_factor(company_id):
) )
points = await conn.fetchall(point_sql, args=(company_id, 1)) points = await conn.fetchall(point_sql, args=(company_id, 1))
point_ids = [i["pid"] for i in points] point_ids = [i["pid"] for i in points]
now = datetime.now() now = datetime.now()
if now.month == 1: if now.month == 1:
last_month_dt = datetime(year=now.year - 1, month=12, day=1) last_month_dt = datetime(year=now.year - 1, month=12, day=1)
else: else:
last_month_dt = datetime(year=now.year, month=now.month - 1, day=1) last_month_dt = datetime(year=now.year, month=now.month - 1, day=1)
# 首页功率因数取所有进线中最小的 # 首页功率因数取所有进线中最小的
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
sql = "SELECT inlid, `name` FROM inline WHERE cid=%s" sql = "SELECT inlid, `name` FROM inline WHERE cid=%s"
inlines = await conn.fetchall(sql, args=(company_id,)) inlines = await conn.fetchall(sql, args=(company_id,))
inline_ids = [inline["inlid"] for inline in inlines] inline_ids = [inline["inlid"] for inline in inlines]
power_factor_results = [] power_factor_results = []
sql = "SELECT inlid, save_charge pf_cost, `kpi_x`, `save_charge` " \ sql = "SELECT inlid, save_charge pf_cost, `kpi_x`, `save_charge` " \
"FROM algo_power_factor_result WHERE inlid in %s and month=%s" "FROM algo_power_factor_result WHERE inlid in %s and month=%s"
...@@ -883,7 +897,7 @@ async def power_factor(company_id): ...@@ -883,7 +897,7 @@ async def power_factor(company_id):
type(i["kpi_x"]) in [int, float] type(i["kpi_x"]) in [int, float]
] ]
last_month_cos = min(pf_kpi_x_list) if len(pf_kpi_x_list) else "" last_month_cos = min(pf_kpi_x_list) if len(pf_kpi_x_list) else ""
async with EsUtil() as es: async with EsUtil() as es:
dt = pendulum.now(tz="Asia/Shanghai") dt = pendulum.now(tz="Asia/Shanghai")
tstamp = dt.int_timestamp // (15 * 60) * (15 * 60) tstamp = dt.int_timestamp // (15 * 60) * (15 * 60)
...@@ -913,18 +927,18 @@ async def power_factor(company_id): ...@@ -913,18 +927,18 @@ async def power_factor(company_id):
"qttl_mean": item["qttl_mean"], "qttl_mean": item["qttl_mean"],
} }
) )
total_pttl, total_qttl = 0, 0 total_pttl, total_qttl = 0, 0
for point_id, records in point_map.items(): for point_id, records in point_map.items():
total_pttl += records[0]["pttl_mean"] total_pttl += records[0]["pttl_mean"]
total_qttl += records[0]["qttl_mean"] total_qttl += records[0]["qttl_mean"]
# 计算实时功率的公式 # 计算实时功率的公式
cos_ttl = "" cos_ttl = ""
l = sqrt(total_pttl * total_pttl + total_qttl * total_qttl) l = sqrt(total_pttl * total_pttl + total_qttl * total_qttl)
if l: if l:
cos_ttl = round(total_pttl / l, 2) cos_ttl = round(total_pttl / l, 2)
if type(last_month_cos) in [int, float]: if type(last_month_cos) in [int, float]:
last_month_cos = round(last_month_cos, 2) last_month_cos = round(last_month_cos, 2)
return cos_ttl, last_month_cos return cos_ttl, last_month_cos
...@@ -934,7 +948,7 @@ async def power_factor_new15(cid): ...@@ -934,7 +948,7 @@ async def power_factor_new15(cid):
"""首页获取实时功率因数, 上月功率因数""" """首页获取实时功率因数, 上月功率因数"""
point_sql = "select pid,inlid from point where cid=%s and add_to_company=1" point_sql = "select pid,inlid from point where cid=%s and add_to_company=1"
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
points = await conn.fetchall(point_sql, args=(cid, )) points = await conn.fetchall(point_sql, args=(cid,))
point_ids = [i["pid"] for i in points] point_ids = [i["pid"] for i in points]
now = datetime.now() now = datetime.now()
if now.month == 1: if now.month == 1:
...@@ -957,11 +971,11 @@ async def power_factor_new15(cid): ...@@ -957,11 +971,11 @@ async def power_factor_new15(cid):
type(i["kpi_x"]) in [int, float] type(i["kpi_x"]) in [int, float]
] ]
last_month_cos = min(pf_kpi_x_list) if len(pf_kpi_x_list) else "" last_month_cos = min(pf_kpi_x_list) if len(pf_kpi_x_list) else ""
dt = pendulum.now(tz="Asia/Shanghai") dt = pendulum.now(tz="Asia/Shanghai")
tstamp = dt.int_timestamp // (15 * 60) * (15 * 60) tstamp = dt.int_timestamp // (15 * 60) * (15 * 60)
dt = pendulum.from_timestamp(tstamp, tz="Asia/Shanghai") dt = pendulum.from_timestamp(tstamp, tz="Asia/Shanghai")
end_dt = (dt-timedelta(minutes=15)).strftime("%Y-%m-%d %H:%M:%S") end_dt = (dt - timedelta(minutes=15)).strftime("%Y-%m-%d %H:%M:%S")
str_dt = dt.strftime("%Y-%m-%d %H:%M:%S") str_dt = dt.strftime("%Y-%m-%d %H:%M:%S")
electric_sql = f"SELECT pid,create_time,pttl_mean,qttl_mean FROM " \ electric_sql = f"SELECT pid,create_time,pttl_mean,qttl_mean FROM " \
f"`point_15min_electric` where create_time in " \ f"`point_15min_electric` where create_time in " \
...@@ -985,7 +999,7 @@ async def power_factor_new15(cid): ...@@ -985,7 +999,7 @@ async def power_factor_new15(cid):
l = sqrt(total_pttl * total_pttl + total_qttl * total_qttl) l = sqrt(total_pttl * total_pttl + total_qttl * total_qttl)
if l: if l:
cos_ttl = round(total_pttl / l, 2) cos_ttl = round(total_pttl / l, 2)
if type(last_month_cos) in [int, float]: if type(last_month_cos) in [int, float]:
last_month_cos = round(last_month_cos, 2) last_month_cos = round(last_month_cos, 2)
return cos_ttl, last_month_cos return cos_ttl, last_month_cos
...@@ -997,12 +1011,12 @@ async def optimization_count_info(company_id: int): ...@@ -997,12 +1011,12 @@ async def optimization_count_info(company_id: int):
:param company_id: :param company_id:
:return: :return:
""" """
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
sql = "SELECT inlid, `name` FROM inline WHERE cid=%s" sql = "SELECT inlid, `name` FROM inline WHERE cid=%s"
inlines = await conn.fetchall(sql, args=(company_id,)) inlines = await conn.fetchall(sql, args=(company_id,))
inline_ids = [inline["inlid"] for inline in inlines] inline_ids = [inline["inlid"] for inline in inlines]
# 获取公司上月用电 # 获取公司上月用电
# now = datetime.now() # now = datetime.now()
# es_start_time = ( # es_start_time = (
...@@ -1014,12 +1028,12 @@ async def optimization_count_info(company_id: int): ...@@ -1014,12 +1028,12 @@ async def optimization_count_info(company_id: int):
# "%Y-%m-%dT%H:%M:%S+08:00") # "%Y-%m-%dT%H:%M:%S+08:00")
# power_use_info = await company_power_use_info(company_id, es_start_time, # power_use_info = await company_power_use_info(company_id, es_start_time,
# es_end_time) # es_end_time)
now = datetime.now() now = datetime.now()
start_time = ( start_time = (
pendulum.datetime(now.year, now.month, 1) pendulum.datetime(now.year, now.month, 1)
.subtract(months=1) .subtract(months=1)
.strftime("%Y-%m-%d %H:%M:%S") .strftime("%Y-%m-%d %H:%M:%S")
) )
end_time = pendulum.datetime(now.year, now.month, 1).strftime( end_time = pendulum.datetime(now.year, now.month, 1).strftime(
"%Y-%m-%d %H:%M:%S") "%Y-%m-%d %H:%M:%S")
...@@ -1043,13 +1057,13 @@ async def optimization_count_info(company_id: int): ...@@ -1043,13 +1057,13 @@ async def optimization_count_info(company_id: int):
} }
) )
return count_info_map return count_info_map
now = datetime.now() now = datetime.now()
if now.month == 1: if now.month == 1:
last_month_dt = datetime(year=now.year - 1, month=12, day=1) last_month_dt = datetime(year=now.year - 1, month=12, day=1)
else: else:
last_month_dt = datetime(year=now.year, month=now.month - 1, day=1) last_month_dt = datetime(year=now.year, month=now.month - 1, day=1)
# 功率因数 # 功率因数
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
sql = "SELECT inlid, `cos`, save_charge pf_cost, kpi_x, save_charge " \ sql = "SELECT inlid, `cos`, save_charge pf_cost, kpi_x, save_charge " \
...@@ -1063,7 +1077,7 @@ async def optimization_count_info(company_id: int): ...@@ -1063,7 +1077,7 @@ async def optimization_count_info(company_id: int):
2, 2,
) )
total_pf_save = 0 if total_pf_save <= 0 else total_pf_save total_pf_save = 0 if total_pf_save <= 0 else total_pf_save
pf_kpi_x_list = [ pf_kpi_x_list = [
i["kpi_x"] for i in power_factor_results if i["kpi_x"] for i in power_factor_results if
type(i["kpi_x"]) in [int, float] type(i["kpi_x"]) in [int, float]
...@@ -1079,20 +1093,20 @@ async def optimization_count_info(company_id: int): ...@@ -1079,20 +1093,20 @@ async def optimization_count_info(company_id: int):
pf_desc = "空间适中" pf_desc = "空间适中"
else: else:
pf_desc = "空间较大" pf_desc = "空间较大"
count_info_map["power_factor"] = { count_info_map["power_factor"] = {
"save_charge": total_pf_save if pf_kpi_x != "" else "", "save_charge": total_pf_save if pf_kpi_x != "" else "",
"kpi_x": pf_kpi_x, "kpi_x": pf_kpi_x,
"desc": pf_desc, "desc": pf_desc,
} }
# 移峰填谷指数 # 移峰填谷指数
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
sql = "select `score`, `cost_save` from `algo_plsi_result` " \ sql = "select `score`, `cost_save` from `algo_plsi_result` " \
"where `inlid` in %s and `month` = %s" "where `inlid` in %s and `month` = %s"
last_month_str = datetime.strftime(last_month_dt, "%Y-%m") last_month_str = datetime.strftime(last_month_dt, "%Y-%m")
pcvfs = await conn.fetchall(sql, args=(inline_ids, last_month_str)) pcvfs = await conn.fetchall(sql, args=(inline_ids, last_month_str))
pcvf_kpi_x_list = [i["score"] for i in pcvfs if pcvf_kpi_x_list = [i["score"] for i in pcvfs if
type(i["score"]) in [int, float]] type(i["score"]) in [int, float]]
pcvf_kpi_x = min(pcvf_kpi_x_list) if len(pcvf_kpi_x_list) else "" pcvf_kpi_x = min(pcvf_kpi_x_list) if len(pcvf_kpi_x_list) else ""
...@@ -1100,7 +1114,7 @@ async def optimization_count_info(company_id: int): ...@@ -1100,7 +1114,7 @@ async def optimization_count_info(company_id: int):
sum([i["cost_save"] for i in pcvfs if sum([i["cost_save"] for i in pcvfs if
i["cost_save"] and i["cost_save"] >= 0]), 2 i["cost_save"] and i["cost_save"] >= 0]), 2
) )
if pcvf_kpi_x == "": if pcvf_kpi_x == "":
pcvf_desc = "" pcvf_desc = ""
elif pcvf_kpi_x >= 90: elif pcvf_kpi_x >= 90:
...@@ -1111,14 +1125,14 @@ async def optimization_count_info(company_id: int): ...@@ -1111,14 +1125,14 @@ async def optimization_count_info(company_id: int):
pcvf_desc = "空间适中" pcvf_desc = "空间适中"
else: else:
pcvf_desc = "空间较大" pcvf_desc = "空间较大"
total_pcvf_save = 0 if total_pcvf_save <= 0 else total_pcvf_save total_pcvf_save = 0 if total_pcvf_save <= 0 else total_pcvf_save
count_info_map["pcvf"] = { count_info_map["pcvf"] = {
"save_charge": total_pcvf_save if pcvf_kpi_x != "" else "", "save_charge": total_pcvf_save if pcvf_kpi_x != "" else "",
"kpi_x": pcvf_kpi_x, "kpi_x": pcvf_kpi_x,
"desc": pcvf_desc, "desc": pcvf_desc,
} }
# 经济运行 # 经济运行
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
sql = "select `kpi_x`, `save_charge`, `mean_load_factor` " \ sql = "select `kpi_x`, `save_charge`, `mean_load_factor` " \
...@@ -1155,13 +1169,13 @@ async def optimization_count_info(company_id: int): ...@@ -1155,13 +1169,13 @@ async def optimization_count_info(company_id: int):
economic_desc = "空间适中" economic_desc = "空间适中"
else: else:
economic_desc = "空间较大" economic_desc = "空间较大"
count_info_map["power_save"] = { count_info_map["power_save"] = {
"save_charge": total_economic_save if economic_kpi_x != "" else "", "save_charge": total_economic_save if economic_kpi_x != "" else "",
"kpi_x": economic_kpi_x, "kpi_x": economic_kpi_x,
"desc": economic_desc, "desc": economic_desc,
} }
# 最大需量 # 最大需量
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
sql = ( sql = (
...@@ -1173,7 +1187,7 @@ async def optimization_count_info(company_id: int): ...@@ -1173,7 +1187,7 @@ async def optimization_count_info(company_id: int):
) )
last_month_str = datetime.strftime(last_month_dt, "%Y-%m") last_month_str = datetime.strftime(last_month_dt, "%Y-%m")
md_spaces = await conn.fetchall(sql, args=(inline_ids, last_month_str)) md_spaces = await conn.fetchall(sql, args=(inline_ids, last_month_str))
md_space_kpi_x_list = [i["kpi_x"] for i in md_spaces if md_space_kpi_x_list = [i["kpi_x"] for i in md_spaces if
type(i["kpi_x"]) in [int, float]] type(i["kpi_x"]) in [int, float]]
md_space_kpi_x = max(md_space_kpi_x_list) if len( md_space_kpi_x = max(md_space_kpi_x_list) if len(
...@@ -1202,7 +1216,7 @@ async def optimization_count_info(company_id: int): ...@@ -1202,7 +1216,7 @@ async def optimization_count_info(company_id: int):
"kpi_x": md_space_kpi_x, "kpi_x": md_space_kpi_x,
"desc": md_space_desc, "desc": md_space_desc,
} }
total_save_cost = 0 total_save_cost = 0
for _, item in count_info_map.items(): for _, item in count_info_map.items():
total_save_cost += ( total_save_cost += (
...@@ -1211,12 +1225,12 @@ async def optimization_count_info(company_id: int): ...@@ -1211,12 +1225,12 @@ async def optimization_count_info(company_id: int):
) )
save_percent = total_save_cost / month_charge if month_charge else "" save_percent = total_save_cost / month_charge if month_charge else ""
count_info_map["save_percent"] = save_percent count_info_map["save_percent"] = save_percent
# 计算最大需量 # 计算最大需量
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
sql = "select `price_md`,`price_tc` from `price_policy` where `cid`=%s" sql = "select `price_md`,`price_tc` from `price_policy` where `cid`=%s"
price_policy = await conn.fetchone(sql, args=(company_id,)) price_policy = await conn.fetchone(sql, args=(company_id,))
total_md_space_charge = sum( total_md_space_charge = sum(
[i["inline_md_charge"] for i in md_spaces if i["inline_md_charge"]]) [i["inline_md_charge"] for i in md_spaces if i["inline_md_charge"]])
total_md_space_p = ( total_md_space_p = (
...@@ -1225,7 +1239,7 @@ async def optimization_count_info(company_id: int): ...@@ -1225,7 +1239,7 @@ async def optimization_count_info(company_id: int):
else "" else ""
) )
count_info_map["md_space_p"] = total_md_space_p count_info_map["md_space_p"] = total_md_space_p
# 经济运行最低负载率 # 经济运行最低负载率
mean_load_factors = [ mean_load_factors = [
i["mean_load_factor"] for i in economic_operations if i["mean_load_factor"] for i in economic_operations if
...@@ -1260,12 +1274,12 @@ async def electric_use_info_sdu(cid): ...@@ -1260,12 +1274,12 @@ async def electric_use_info_sdu(cid):
} }
} }
} }
log.info("cal_score_safe_electric query_body={}".format(query_body)) log.info("cal_score_safe_electric query_body={}".format(query_body))
async with EsUtil() as es: async with EsUtil() as es:
es_result = await es.search_origin(body=query_body, es_result = await es.search_origin(body=query_body,
index=constants.POINT_1MIN_EVENT) index=constants.POINT_1MIN_EVENT)
score_buckets = ( score_buckets = (
es_result.get("aggregations", {}).get("alarm_aggs", {}).get("buckets", es_result.get("aggregations", {}).get("alarm_aggs", {}).get("buckets",
[]) [])
...@@ -1280,7 +1294,7 @@ async def electric_use_info_sdu(cid): ...@@ -1280,7 +1294,7 @@ async def electric_use_info_sdu(cid):
second_alarm_cnt += bucket["doc_count"] second_alarm_cnt += bucket["doc_count"]
elif bucket["key"] == Importance.Third.value: elif bucket["key"] == Importance.Third.value:
third_alarm_cnt += bucket["doc_count"] third_alarm_cnt += bucket["doc_count"]
company_point_map = await get_points([cid]) company_point_map = await get_points([cid])
point_len = len(company_point_map.get(cid) or {}) point_len = len(company_point_map.get(cid) or {})
alarm_score = ( alarm_score = (
...@@ -1291,9 +1305,9 @@ async def electric_use_info_sdu(cid): ...@@ -1291,9 +1305,9 @@ async def electric_use_info_sdu(cid):
) )
if alarm_score >= 15: if alarm_score >= 15:
alarm_score = 15 alarm_score = 15
electric_use_score = get_electric_index(alarm_score) electric_use_score = get_electric_index(alarm_score)
log.info( log.info(
"point_len={} alarm_score={} electric_use_score={}".format( "point_len={} alarm_score={} electric_use_score={}".format(
point_len, alarm_score, electric_use_score point_len, alarm_score, electric_use_score
...@@ -1366,12 +1380,12 @@ async def electric_use_info_points_sdu(start, end, points): ...@@ -1366,12 +1380,12 @@ async def electric_use_info_points_sdu(start, end, points):
} }
} }
} }
log.info("electric_use_info_points query_body={}".format(query_body)) log.info("electric_use_info_points query_body={}".format(query_body))
async with EsUtil() as es: async with EsUtil() as es:
es_result = await es.search_origin(body=query_body, es_result = await es.search_origin(body=query_body,
index=constants.POINT_1MIN_EVENT) index=constants.POINT_1MIN_EVENT)
score_buckets = ( score_buckets = (
es_result.get("aggregations", {}).get("alarm_aggs", {}).get("buckets", es_result.get("aggregations", {}).get("alarm_aggs", {}).get("buckets",
[]) [])
...@@ -1386,15 +1400,15 @@ async def electric_use_info_points_sdu(start, end, points): ...@@ -1386,15 +1400,15 @@ async def electric_use_info_points_sdu(start, end, points):
second_alarm_cnt += bucket["doc_count"] second_alarm_cnt += bucket["doc_count"]
elif bucket["key"] == Importance.Third.value: elif bucket["key"] == Importance.Third.value:
third_alarm_cnt += bucket["doc_count"] third_alarm_cnt += bucket["doc_count"]
alarm_score = (first_alarm_cnt * 2 + second_alarm_cnt * 1 + alarm_score = (first_alarm_cnt * 2 + second_alarm_cnt * 1 +
third_alarm_cnt * 0.5) / len(points) third_alarm_cnt * 0.5) / len(points)
if alarm_score >= 15: if alarm_score >= 15:
alarm_score = 15 alarm_score = 15
electric_use_score = get_electric_index(alarm_score) electric_use_score = get_electric_index(alarm_score)
log.info( log.info(
"point_len={} alarm_score={} electric_use_score={}".format( "point_len={} alarm_score={} electric_use_score={}".format(
len(points), alarm_score, electric_use_score len(points), alarm_score, electric_use_score
...@@ -1415,9 +1429,9 @@ async def electric_use_info_points_sdu_new15(start, end, points): ...@@ -1415,9 +1429,9 @@ async def electric_use_info_points_sdu_new15(start, end, points):
f"where pid in %s and event_datetime BETWEEN %s and %s " \ f"where pid in %s and event_datetime BETWEEN %s and %s " \
f"and event_type in %s group by importance" f"and event_type in %s group by importance"
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
results = await conn.fetchall(sql,args=(points,start,end, results = await conn.fetchall(sql, args=(points, start, end,
SDU_ALARM_LIST)) SDU_ALARM_LIST))
first_alarm_cnt = 0 first_alarm_cnt = 0
second_alarm_cnt = 0 second_alarm_cnt = 0
third_alarm_cnt = 0 third_alarm_cnt = 0
...@@ -1428,15 +1442,15 @@ async def electric_use_info_points_sdu_new15(start, end, points): ...@@ -1428,15 +1442,15 @@ async def electric_use_info_points_sdu_new15(start, end, points):
second_alarm_cnt += result["doc_count"] second_alarm_cnt += result["doc_count"]
elif result["importance"] == Importance.Third.value: elif result["importance"] == Importance.Third.value:
third_alarm_cnt += result["doc_count"] third_alarm_cnt += result["doc_count"]
alarm_score = (first_alarm_cnt * 2 + second_alarm_cnt * 1 + alarm_score = (first_alarm_cnt * 2 + second_alarm_cnt * 1 +
third_alarm_cnt * 0.5) / len(points) third_alarm_cnt * 0.5) / len(points)
if alarm_score >= 15: if alarm_score >= 15:
alarm_score = 15 alarm_score = 15
electric_use_score = get_electric_index(alarm_score) electric_use_score = get_electric_index(alarm_score)
log.info( log.info(
"point_len={} alarm_score={} electric_use_score={}".format( "point_len={} alarm_score={} electric_use_score={}".format(
len(points), alarm_score, electric_use_score len(points), alarm_score, electric_use_score
...@@ -1457,21 +1471,22 @@ async def optimization_count_info_new(company_id: int): ...@@ -1457,21 +1471,22 @@ async def optimization_count_info_new(company_id: int):
:param company_id: :param company_id:
:return: :return:
""" """
inlines = await get_inline_by_cid(company_id) inlines = await get_inline_by_cid(company_id)
inline_ids = [inline["inlid"] for inline in inlines] inline_ids = [inline["inlid"] for inline in inlines]
# 获取公司上月用电 # 获取公司上月用电
now = datetime.now() now = datetime.now()
es_start_time = ( es_start_time = (
pendulum.datetime(now.year, now.month, 1) pendulum.datetime(now.year, now.month, 1)
.subtract(months=1) .subtract(months=1)
.strftime("%Y-%m-%dT%H:%M:%S+08:00") .strftime("%Y-%m-%dT%H:%M:%S+08:00")
) )
es_end_time = pendulum.datetime(now.year, now.month, 1).strftime( es_end_time = pendulum.datetime(now.year, now.month, 1).strftime(
"%Y-%m-%dT%H:%M:%S+08:00") "%Y-%m-%dT%H:%M:%S+08:00")
power_use_info = await company_power_use_info_new15(company_id, es_start_time, power_use_info = await company_power_use_info_new15(company_id,
es_end_time) es_start_time,
es_end_time)
month_charge = power_use_info["charge"] month_charge = power_use_info["charge"]
count_info_map = { count_info_map = {
"avg_price": power_use_info["charge"] / power_use_info["kwh"] "avg_price": power_use_info["charge"] / power_use_info["kwh"]
...@@ -1497,7 +1512,7 @@ async def optimization_count_info_new(company_id: int): ...@@ -1497,7 +1512,7 @@ async def optimization_count_info_new(company_id: int):
last_month_dt = datetime(year=now.year, month=now.month - 1, day=1) last_month_dt = datetime(year=now.year, month=now.month - 1, day=1)
last_month_str = datetime.strftime(last_month_dt, "%Y-%m") last_month_str = datetime.strftime(last_month_dt, "%Y-%m")
# 功率因数 # 功率因数
power_factor_results = await get_power_factor_kpi(inline_ids, power_factor_results = await get_power_factor_kpi(inline_ids,
last_month_dt) last_month_dt)
total_pf_save = round( total_pf_save = round(
...@@ -1510,7 +1525,7 @@ async def optimization_count_info_new(company_id: int): ...@@ -1510,7 +1525,7 @@ async def optimization_count_info_new(company_id: int):
(i["name"], i["kpi_x"]) for i in power_factor_results if (i["name"], i["kpi_x"]) for i in power_factor_results if
type(i["kpi_x"]) in [int, float] type(i["kpi_x"]) in [int, float]
] ]
if len(pf_kpi_x_list): if len(pf_kpi_x_list):
pf_kpi_x_num = [pf_kpi[1] for pf_kpi in pf_kpi_x_list] pf_kpi_x_num = [pf_kpi[1] for pf_kpi in pf_kpi_x_list]
pf_kpi_x = min(pf_kpi_x_num) pf_kpi_x = min(pf_kpi_x_num)
...@@ -1545,12 +1560,12 @@ async def optimization_count_info_new(company_id: int): ...@@ -1545,12 +1560,12 @@ async def optimization_count_info_new(company_id: int):
pcvfs = await get_pcvf_kpi(inline_ids, last_month_str) pcvfs = await get_pcvf_kpi(inline_ids, last_month_str)
pcvf_kpi_x_list = [(i["name"], i["score"]) for i in pcvfs if pcvf_kpi_x_list = [(i["name"], i["score"]) for i in pcvfs if
type(i["score"]) in [int, float]] type(i["score"]) in [int, float]]
if len(pcvf_kpi_x_list): if len(pcvf_kpi_x_list):
pcvf_kpi_x_num = [pcvf_kpi[1] for pcvf_kpi in pcvf_kpi_x_list] pcvf_kpi_x_num = [pcvf_kpi[1] for pcvf_kpi in pcvf_kpi_x_list]
pcvf_kpi_x = min(pcvf_kpi_x_num) pcvf_kpi_x = min(pcvf_kpi_x_num)
pcvf_kpi_x_name = [] pcvf_kpi_x_name = []
if pcvf_kpi_x < 70: if pcvf_kpi_x < 70:
for index, kpi_num in enumerate(pcvf_kpi_x_num): for index, kpi_num in enumerate(pcvf_kpi_x_num):
if kpi_num < 70: if kpi_num < 70:
...@@ -1564,7 +1579,7 @@ async def optimization_count_info_new(company_id: int): ...@@ -1564,7 +1579,7 @@ async def optimization_count_info_new(company_id: int):
f"引入新能源,转移高峰电量至低谷" f"引入新能源,转移高峰电量至低谷"
else: else:
pcvf_desc = "平均电价处于较低水平,请继续保持" pcvf_desc = "平均电价处于较低水平,请继续保持"
else: else:
pcvf_kpi_x = "" pcvf_kpi_x = ""
pcvf_desc = "" pcvf_desc = ""
...@@ -1582,7 +1597,7 @@ async def optimization_count_info_new(company_id: int): ...@@ -1582,7 +1597,7 @@ async def optimization_count_info_new(company_id: int):
sum([i["cost_save"] for i in pcvfs if sum([i["cost_save"] for i in pcvfs if
i["cost_save"] and i["cost_save"] >= 0]), 2 i["cost_save"] and i["cost_save"] >= 0]), 2
) )
total_pcvf_save = 0 if total_pcvf_save <= 0 else total_pcvf_save total_pcvf_save = 0 if total_pcvf_save <= 0 else total_pcvf_save
count_info_map["pcvf"] = { count_info_map["pcvf"] = {
"save_charge": total_pcvf_save if pcvf_kpi_x != "" else "", "save_charge": total_pcvf_save if pcvf_kpi_x != "" else "",
...@@ -1590,7 +1605,7 @@ async def optimization_count_info_new(company_id: int): ...@@ -1590,7 +1605,7 @@ async def optimization_count_info_new(company_id: int):
"desc": pcvf_desc, "desc": pcvf_desc,
"space": pcvf_space "space": pcvf_space
} }
# 经济运行 # 经济运行
economic_operations = await get_economic_kpi(inline_ids, last_month_str) economic_operations = await get_economic_kpi(inline_ids, last_month_str)
economic_kpi_x_list = [ economic_kpi_x_list = [
...@@ -1651,14 +1666,14 @@ async def optimization_count_info_new(company_id: int): ...@@ -1651,14 +1666,14 @@ async def optimization_count_info_new(company_id: int):
"desc": economic_desc, "desc": economic_desc,
"space": econ_space "space": econ_space
} }
# 容量、需量价格 # 容量、需量价格
price_policy = await price_policy_by_cid(company_id) price_policy = await price_policy_by_cid(company_id)
price_md = price_policy["price_md"] if price_policy["price_md"] else 0 price_md = price_policy["price_md"] if price_policy["price_md"] else 0
price_tc = price_policy["price_tc"] if price_policy["price_tc"] else 0 price_tc = price_policy["price_tc"] if price_policy["price_tc"] else 0
# 最大需量 # 最大需量
md_spaces = await get_md_space(inline_ids, last_month_dt) md_spaces = await get_md_space(inline_ids, last_month_dt)
md_space_kpi_x_list = [i["kpi_x"] for i in md_spaces if md_space_kpi_x_list = [i["kpi_x"] for i in md_spaces if
type(i["kpi_x"]) in [int, float]] type(i["kpi_x"]) in [int, float]]
md_space_kpi_x = max(md_space_kpi_x_list) if len( md_space_kpi_x = max(md_space_kpi_x_list) if len(
...@@ -1688,13 +1703,13 @@ async def optimization_count_info_new(company_id: int): ...@@ -1688,13 +1703,13 @@ async def optimization_count_info_new(company_id: int):
md_space_tc_runtimes[index]["tc_runtime"] * price_tc >= \ md_space_tc_runtimes[index]["tc_runtime"] * price_tc >= \
price_md * item["inline_md_predict"]: price_md * item["inline_md_predict"]:
md_space_name.append(md_space_tc_runtimes[index]["name"]) md_space_name.append(md_space_tc_runtimes[index]["name"])
if len(md_space_name): if len(md_space_name):
md_space_desc = f"若次月负荷无较大变动,建议{'、'.join(md_space_name)}" \ md_space_desc = f"若次月负荷无较大变动,建议{'、'.join(md_space_name)}" \
f"选择按最大需量计费" f"选择按最大需量计费"
else: else:
md_space_desc = "不存在容改需空间" md_space_desc = "不存在容改需空间"
count_info_map["md_space"] = { count_info_map["md_space"] = {
"save_charge": total_md_space_save if md_space_kpi_x != "" else "", "save_charge": total_md_space_save if md_space_kpi_x != "" else "",
"kpi_x": md_space_kpi_x, "kpi_x": md_space_kpi_x,
...@@ -1736,7 +1751,7 @@ async def cid_alarm_importance_count(cid, start, end): ...@@ -1736,7 +1751,7 @@ async def cid_alarm_importance_count(cid, start, end):
point_list = [i["pid"] for i in monitor_point_list] point_list = [i["pid"] for i in monitor_point_list]
es_res = await sdu_alarm_importance_dao_new15(start, end, point_list) es_res = await sdu_alarm_importance_dao_new15(start, end, point_list)
es_res_key = {i["key"]: i for i in es_res} es_res_key = {i["key"]: i for i in es_res}
res_list = [] res_list = []
for info in monitor_point_list: for info in monitor_point_list:
name = info.get("name") name = info.get("name")
...@@ -1752,7 +1767,7 @@ async def cid_alarm_importance_count(cid, start, end): ...@@ -1752,7 +1767,7 @@ async def cid_alarm_importance_count(cid, start, end):
tmp_dic["second"] += b["doc_count"] tmp_dic["second"] += b["doc_count"]
elif b["key"] == Importance.Third.value: elif b["key"] == Importance.Third.value:
tmp_dic["third"] += b["doc_count"] tmp_dic["third"] += b["doc_count"]
tmp_dic["alarm_count"] = tmp_dic["first"] + tmp_dic["second"] + \ tmp_dic["alarm_count"] = tmp_dic["first"] + tmp_dic["second"] + \
tmp_dic[ tmp_dic[
"third"] "third"]
......
from pot_libs.mysql_util.mysql_util import MysqlUtil from pot_libs.mysql_util.mysql_util import MysqlUtil
async def get_kwh_p_dao(table_name, terms, start, end): async def get_kwh_p_dao(terms, start_time, end_time,
sql = f"SELECT create_time,kwh,p FROM {table_name} WHERE cid in %s " \ table_name="company_15min_power",
f"and create_time BETWEEN '{start}' and '{end}'" time_fmt="%%Y-%%m-%%d"):
"""
负荷实际数据
:param terms:
:param start_time:
:param end_time:
:param table_name:
:param time_fmt:
:return:
"""
sql = f"""
select p,kwh,DATE_FORMAT(create_time,"{time_fmt}") as cal_time
from {table_name} where cid in %s and create_time >= %s
and create_time <= %s
"""
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
datas = await conn.fetchall(sql, args=(terms, )) result = await conn.fetchall(sql, args=(terms, start_time, end_time))
return datas return result or []
async def get_pred_p_dao(terms, start, end): async def get_pred_p_dao(terms, start_time, end_time,
sql = f"SELECT create_time,p FROM company_day_ahead_predict " \ time_fmt="%%Y-%%m-%%d"):
f"WHERE cid in %s and create_time BETWEEN '{start}' and '{end}'" """
负荷预测数据
:param terms:
:param start_time:
:param end_time:
:param time_fmt:
:return:
"""
sql = f"""
select avg(p) p ,count(*) p_count,DATE_FORMAT(create_time,
"{time_fmt}") as cal_time
from company_day_ahead_predict
where cid in %s and create_time >= %s and create_time <= %s
group by cal_time
"""
async with MysqlUtil() as conn: async with MysqlUtil() as conn:
datas = await conn.fetchall(sql, args=(terms,)) result = await conn.fetchall(sql, args=(terms, start_time, end_time))
return datas return result or []
\ No newline at end of file
from datetime import datetime from datetime import datetime
import pendulum
from pot_libs.es_util.es_utils import EsUtil from pot_libs.es_util.es_utils import EsUtil
from pot_libs.logger import log from pot_libs.logger import log
from unify_api.constants import COMPANY_15MIN_POWER, COMPANY_DAY_AHEAD_PRE from unify_api.constants import COMPANY_15MIN_POWER, COMPANY_DAY_AHEAD_PRE
...@@ -30,7 +33,7 @@ async def load_forecast_service(cid, cids, start, end): ...@@ -30,7 +33,7 @@ async def load_forecast_service(cid, cids, start, end):
trans_type = "15m" trans_type = "15m"
interval = trans_type interval = trans_type
format = "yyyy-MM-dd HH:mm:ss" format = "yyyy-MM-dd HH:mm:ss"
real_query["aggs"] = { real_query["aggs"] = {
"quarter_time": { "quarter_time": {
"date_histogram": { "date_histogram": {
...@@ -39,7 +42,8 @@ async def load_forecast_service(cid, cids, start, end): ...@@ -39,7 +42,8 @@ async def load_forecast_service(cid, cids, start, end):
"time_zone": "+08:00", "time_zone": "+08:00",
"format": format, "format": format,
}, },
"aggs": {"p": {"stats": {"field": "p"}}, "kwh": {"stats": {"field": "kwh"}}}, "aggs": {"p": {"stats": {"field": "p"}},
"kwh": {"stats": {"field": "kwh"}}},
} }
} }
real_index = COMPANY_15MIN_POWER real_index = COMPANY_15MIN_POWER
...@@ -70,14 +74,16 @@ async def load_forecast_service(cid, cids, start, end): ...@@ -70,14 +74,16 @@ async def load_forecast_service(cid, cids, start, end):
real_value = real_re[slot].get("p").get("sum") real_value = real_re[slot].get("p").get("sum")
real_power_val = ( real_power_val = (
real_re[slot].get("kwh").get("sum") real_re[slot].get("kwh").get("sum")
if type(real_re[slot].get("kwh").get("sum")) in [int, float] if type(real_re[slot].get("kwh").get("sum")) in [int,
float]
else "" else ""
) )
else: else:
real_value = real_re[slot].get("p").get("sum") real_value = real_re[slot].get("p").get("sum")
real_power_val = ( real_power_val = (
real_re[slot].get("kwh").get("sum") real_re[slot].get("kwh").get("sum")
if type(real_re[slot].get("kwh").get("sum")) in [int, float] if type(real_re[slot].get("kwh").get("sum")) in [int,
float]
else "" else ""
) )
real_power_list.append(real_power_val) real_power_list.append(real_power_val)
...@@ -160,8 +166,9 @@ async def load_forecast_service(cid, cids, start, end): ...@@ -160,8 +166,9 @@ async def load_forecast_service(cid, cids, start, end):
pred_power_list=LoadValue(slots=slots, value=pred_power_list), pred_power_list=LoadValue(slots=slots, value=pred_power_list),
deviation_power_list=[], deviation_power_list=[],
) )
count, maxnum, minnum, average, max_index, min_index = choose_list(deviation_list_tmp, 4) count, maxnum, minnum, average, max_index, min_index = choose_list(
deviation_list_tmp, 4)
# 求最大偏差和最小偏差时间 # 求最大偏差和最小偏差时间
max_t = slots[max_index] max_t = slots[max_index]
min_t = slots[min_index] min_t = slots[min_index]
...@@ -183,7 +190,7 @@ async def load_forecast_service(cid, cids, start, end): ...@@ -183,7 +190,7 @@ async def load_forecast_service(cid, cids, start, end):
pred_tmp = [i for i in pred_tmp if i != ""] pred_tmp = [i for i in pred_tmp if i != ""]
total_deviation = abs((sum(pred_tmp) - sum(real_tmp)) / sum(real_tmp)) total_deviation = abs((sum(pred_tmp) - sum(real_tmp)) / sum(real_tmp))
total_deviation = round(total_deviation, 4) total_deviation = round(total_deviation, 4)
deviation_power_list = [] deviation_power_list = []
for index, real_power in enumerate(real_power_list): for index, real_power in enumerate(real_power_list):
if real_power == "" or pred_power_list[index] == "" or real_power == 0: if real_power == "" or pred_power_list[index] == "" or real_power == 0:
...@@ -192,16 +199,17 @@ async def load_forecast_service(cid, cids, start, end): ...@@ -192,16 +199,17 @@ async def load_forecast_service(cid, cids, start, end):
# (预测-实际)/实际 * 100% # (预测-实际)/实际 * 100%
deviation = (pred_power_list[index] - real_power) / real_power deviation = (pred_power_list[index] - real_power) / real_power
deviation_power_list.append(abs(round(deviation, 4))) deviation_power_list.append(abs(round(deviation, 4)))
if ( if (
start.split(" ")[0].rsplit("-", 1)[0] == str(datetime.now().date()).rsplit("-", 1)[0] start.split(" ")[0].rsplit("-", 1)[0] ==
and trans_type == "day" str(datetime.now().date()).rsplit("-", 1)[0]
and trans_type == "day"
): ):
# 如果是本月的,那么当天的电量偏差没有意义, 置为空 # 如果是本月的,那么当天的电量偏差没有意义, 置为空
today_str = str(datetime.now().date()).split("-", 1)[1] today_str = str(datetime.now().date()).split("-", 1)[1]
index = slots.index(today_str) index = slots.index(today_str)
deviation_power_list[index] = "" deviation_power_list[index] = ""
return ForecastResp( return ForecastResp(
pred_data=lv_pred, pred_data=lv_pred,
real_data=lv_real, real_data=lv_real,
...@@ -216,150 +224,139 @@ async def load_forecast_service(cid, cids, start, end): ...@@ -216,150 +224,139 @@ async def load_forecast_service(cid, cids, start, end):
) )
async def load_forecast_service_new15(cid, cids, start, end): async def load_forecast_service_new15(cids, start_time, end_time, interval,
terms = cids if cids else [cid] slots):
time_type = interval_type("range", start, end) if interval == 15 * 60:
if time_type == "day": # 按日
table_name = "company_1day_power" time_fmt = "%%Y-%%m-%%d %%H:%%i"
fmt = "%m-%d" now_time_fmt = "YYYY-MM-DD HH:mm"
to_fmt = "HH:mm"
real_table_name = "company_15min_power"
elif interval == 86400:
# 按月
time_fmt = "%%Y-%%m-%%d"
now_time_fmt = "YYYY-MM-DD"
to_fmt = now_time_fmt
real_table_name = "company_1day_power"
else: else:
table_name = "company_15min_power" # 按年
fmt = "%H:%M" time_fmt = "%%Y-%%m"
datas = await get_kwh_p_dao(table_name, terms, start, end) now_time_fmt = "YYYY-MM"
if not datas: to_fmt = now_time_fmt
return ForecastResp() real_table_name = "company_1day_power"
# 获取slots
intervel, slots = time_pick_transf(start, end) now_time = pendulum.now().format(now_time_fmt)
real_re = sql_time_process(datas, "create_time", fmt) now_month = pendulum.now().format("YYYY-MM")
lv_real = LoadValue()
lv_real.slots = slots # 1,获取实际数据
real_list = [] real_result = await get_kwh_p_dao(cids, start_time, end_time,
real_power_list, pred_power_list = [], [] real_table_name, time_fmt)
# if not real_result:
# return [], [], [], [], [], [], [], 0, "", 0, "", 0, 0
real_data = {i["cal_time"]: i for i in real_result}
real_list, real_power_list = [], []
for slot in slots: for slot in slots:
if slot in real_re: if slot in real_data:
real_value = real_re[slot].get("p") p = real_data[slot]["p"]
real_power_val = ( kwh = real_data[slot]["kwh"]
real_re[slot].get("kwh") if slot > now_time:
if type(real_re[slot].get("kwh")) in [int, float] else "" value, kwh = "", ""
) elif p in [0, 0.0]:
real_power_list.append(real_power_val) value, kwh = 0.0, 0.0
# 值为0是正常数据 elif p:
if real_value in [0, 0.0]: value = round(p, 2)
real_list.append(0.0) kwh = round(kwh, 2)
else: else:
real_list.append(round(real_value, 2) if real_value else "") value, kwh = "", ""
else: else:
real_list.append("") value, kwh = "", ""
real_power_list.append("") real_list.append(value)
lv_real.value = real_list real_power_list.append(kwh)
# 3. 预测数据 # 2,获取预测数据
pred_re = await get_pred_p_dao(terms, start, end) forecast_result = await get_pred_p_dao(cids, start_time, end_time,
if not pred_re: time_fmt)
return ForecastResp() # if not forecast_result:
pred_re = sql_time_process(pred_re, "create_time", fmt) # return [], [], [], [], [], [], [], 0, "", 0, "", 0, 0
lv_pred = LoadValue() forecast_data = {i["cal_time"]: i for i in forecast_result}
lv_pred.slots = slots forecast_list, forecast_power_list = [], []
pred_list = []
for slot in slots: for slot in slots:
if slot in pred_re: if slot in forecast_data:
pred_value = pred_re[slot].get("p") p = forecast_data[slot]["p"]
pred_power_val = ( if p in [0, 0.0]:
round(pred_re[slot].get("p") * 0.25, 2) value = 0.0
if type(pred_re[slot].get("p")) in [int, float] else "" elif p:
) value = round(p, 2)
pred_power_list.append(pred_power_val)
# 值为0是正常数据
if pred_value in [0, 0.0]:
pred_list.append(0.0)
else: else:
pred_list.append(round(pred_value, 2) if pred_value else "") value = ""
else: else:
pred_list.append("") value = ""
pred_power_list.append("") forecast_list.append(value)
lv_pred.value = pred_list if value or value == 0.0:
# 4.求偏差数据 p_count = forecast_data[slot]["p_count"]
deviation_list = [] # 偏差 power_value = round(value * 0.25 * p_count, 2)
deviation_list_abs = [] # 偏差取绝对值, 最大/最小/平均偏差都是绝对值后数据 else:
power_value = ""
forecast_power_list.append(power_value)
# 3.求偏差数据
deviation_list, deviation_power_list = [], [] # 偏差取绝对值, 最大/最小/平均偏差都是绝对值后数据
for num, value in enumerate(real_list): for num, value in enumerate(real_list):
if not value or not pred_list[num]: if not value or not forecast_list[num]:
deviation_list.append("") deviation_list.append("")
else: else:
# (预测-实际)/实际 * 100% # (预测-实际)/实际 * 100%
deviation = (pred_list[num] - value) / value deviation = (forecast_list[num] - value) / value
deviation_list.append(round(deviation, 4)) deviation_list.append(abs(round(deviation, 4)))
deviation_list_abs.append(abs(round(deviation, 4)))
# 取绝对值,并保留 for num, value in enumerate(real_power_list):
deviation_list_tmp = [i for i in deviation_list_abs if i != ""] if not value or not forecast_power_list[num]:
log.info(f"deviation_list_tmp:{deviation_list_tmp}, " deviation_power = ""
f"deviation_list_abs:{deviation_list_abs}")
if not deviation_list_tmp:
return ForecastResp(
pred_data=lv_pred,
real_data=lv_real,
deviation_list=deviation_list_abs,
max_deviation=[],
min_deviation=[],
avg_deviation="",
total_deviation="",
real_power_list=LoadValue(slots=slots, value=real_power_list),
pred_power_list=LoadValue(slots=slots, value=pred_power_list),
deviation_power_list=[],
)
count, maxnum, minnum, average, max_index, min_index = choose_list(
deviation_list_tmp, 4)
# 求最大偏差和最小偏差时间
max_t = slots[max_index]
min_t = slots[min_index]
if time_type == "day":
max_time = start[:4] + "-" + max_t
min_time = start[:4] + "-" + min_t
else:
max_time = start.split(" ")[0] + " " + max_t
min_time = start.split(" ")[0] + " " + min_t
# 最大偏差
max_deviation = [maxnum, max_time]
# 最小偏差
min_deviation = [minnum, min_time]
# 平均偏差
avg_deviation = average
# 总量偏差 = | (预测(总) - 实际(总)) / 实际(总) | * 100%
real_tmp = [i for i in real_list if i != ""]
pred_tmp = pred_list[: len(real_tmp)]
pred_tmp = [i for i in pred_tmp if i != ""]
total_deviation = abs((sum(pred_tmp) - sum(real_tmp)) / sum(real_tmp))
total_deviation = round(total_deviation, 4)
deviation_power_list = []
for index, real_power in enumerate(real_power_list):
if real_power == "" or pred_power_list[index] == "" or real_power == 0:
deviation_power_list.append("")
else: else:
# (预测-实际)/实际 * 100% # (预测-实际)/实际 * 100%
deviation = (pred_power_list[index] - real_power) / real_power deviation_power = (forecast_power_list[num] - value) / value
deviation_power_list.append(abs(round(deviation, 4))) deviation_power = abs(round(deviation_power, 4))
if (
start.split(" ")[0].rsplit("-", 1)[0] ==
str(datetime.now().date()).rsplit("-", 1)[0]
and time_type == "day"
):
# 如果是本月的,那么当天的电量偏差没有意义, 置为空 # 如果是本月的,那么当天的电量偏差没有意义, 置为空
today_str = str(datetime.now().date()).split("-", 1)[1] if interval == 86400 and now_month == start_time[:7] and \
index = slots.index(today_str) num == slots.index(now_time):
deviation_power_list[index] = "" deviation_power = ""
deviation_power_list.append(deviation_power)
# 4,求偏差统计值
deviation_list_tmp = [i for i in deviation_list if i != ""]
if deviation_list_tmp:
count, max_deviation, min_deviation, average, max_index, min_index = \
choose_list(deviation_list_tmp, 4)
# 求最大偏差和最小偏差时间
max_time = slots[max_index]
min_time = slots[min_index]
# 平均偏差
avg_deviation = average
# 总量偏差 = | (预测(总) - 实际(总)) / 实际(总) | * 100%
real_tmp = [i for i in real_list if i != ""]
pred_tmp = forecast_list[: len(real_tmp)]
pred_tmp = [i for i in pred_tmp if i != ""]
total_deviation = abs((sum(pred_tmp) - sum(real_tmp)) / sum(real_tmp))
total_deviation = round(total_deviation, 4)
else:
max_deviation, max_time, min_deviation, min_time = 0, "", 0, ""
avg_deviation, total_deviation = 0, 0
# 重置 slots
if interval == 15 * 60:
for num, slot in enumerate(slots):
slot = pendulum.parse(slot).format("HH:mm")
slots[num] = slot
return ForecastResp( return ForecastResp(
pred_data=lv_pred, pred_data=LoadValue(slots=slots, value=forecast_list),
real_data=lv_real, real_data=LoadValue(slots=slots, value=real_list),
deviation_list=deviation_list_abs, deviation_list=deviation_list,
max_deviation=max_deviation, max_deviation=max_deviation,
min_deviation=min_deviation, min_deviation=min_deviation,
avg_deviation=avg_deviation, avg_deviation=avg_deviation,
total_deviation=total_deviation, total_deviation=total_deviation,
real_power_list=LoadValue(slots=slots, value=real_power_list), real_power_list=LoadValue(slots=slots, value=real_power_list),
pred_power_list=LoadValue(slots=slots, value=pred_power_list), pred_power_list=LoadValue(slots=slots, value=forecast_power_list),
deviation_power_list=deviation_power_list, deviation_power_list=deviation_power_list,
) )
...@@ -5,6 +5,7 @@ from unify_api.modules.load_analysis.components.load_forecast_cps import ( ...@@ -5,6 +5,7 @@ from unify_api.modules.load_analysis.components.load_forecast_cps import (
) )
from unify_api.modules.load_analysis.service.load_forecast_service import \ from unify_api.modules.load_analysis.service.load_forecast_service import \
load_forecast_service, load_forecast_service_new15 load_forecast_service, load_forecast_service_new15
from unify_api.utils.time_format import time_pick_transf_new
@summary("负荷预测") @summary("负荷预测")
...@@ -17,4 +18,8 @@ async def post_load_forecast(req, body: ForecastReq) -> ForecastResp: ...@@ -17,4 +18,8 @@ async def post_load_forecast(req, body: ForecastReq) -> ForecastResp:
# 管理版本多个工厂的情况, 兼容能力最强的参数cids, 保留旧有的cid: # 管理版本多个工厂的情况, 兼容能力最强的参数cids, 保留旧有的cid:
cids = body.cids cids = body.cids
# return await load_forecast_service(cid, cids, start, end) # return await load_forecast_service(cid, cids, start, end)
return await load_forecast_service_new15(cid, cids, start, end) terms = cids if cids else [cid]
# 获取时间差
interval, slots = time_pick_transf_new(start, end)
return await load_forecast_service_new15(terms, start, end,
interval, slots)
...@@ -60,6 +60,41 @@ def time_pick_transf(start, end, is_range=0): ...@@ -60,6 +60,41 @@ def time_pick_transf(start, end, is_range=0):
return intervel, slots return intervel, slots
def time_pick_transf_new(start, end):
"""获取intervel和slots, 详细显示时间轴信息,新接口都使用这个来获取时间"""
start_f = my_pendulum.from_format(start, 'YYYY-MM-DD HH:mm:ss')
end_f = my_pendulum.from_format(end, 'YYYY-MM-DD HH:mm:ss')
diff = end_f.int_timestamp - start_f.int_timestamp
# 1. 计算intervel
# 1.1 区间48小时之内, 返回15min
if diff <= 48 * 3600:
intervel = 15 * 60
# 1.2 区间在60天以内, 返回1day
elif 48 * 3600 < diff <= 60 * 86400:
intervel = 86400
# 1.3 选择年, 返回1个月
else:
intervel = 30 * 86400
# 2. 计算slots
# 2.1 取到点的个数, 比如15min的96个点
slots = []
slot_num = round((end_f.int_timestamp - start_f.int_timestamp) / intervel)
for i in range(slot_num):
# 区间48小时之内
if diff <= 48 * 3600:
dt = start_f.add(minutes=15 * i).format("YYYY-MM-DD HH:mm")
dt_str = str(dt)
# 区间在60天以内
elif 48 * 3600 < diff <= 60 * 86400:
dt = start_f.add(days=1 * i).format("YYYY-MM-DD")
dt_str = str(dt)
else:
dt = start_f.add(months=1 * i).format("YYYY-MM")
dt_str = str(dt)
slots.append(dt_str)
return intervel, slots
def power_slots(start, end): def power_slots(start, end):
"""电量电费,用电统计,time=range slots计算""" """电量电费,用电统计,time=range slots计算"""
start_f = my_pendulum.from_format(start, 'YYYY-MM-DD HH:mm:ss') start_f = my_pendulum.from_format(start, 'YYYY-MM-DD HH:mm:ss')
...@@ -115,6 +150,7 @@ def proxy_power_slots(start, end, date_format="MM-DD", is_duration=False): ...@@ -115,6 +150,7 @@ def proxy_power_slots(start, end, date_format="MM-DD", is_duration=False):
slots.append(dt) slots.append(dt)
return slots return slots
def day_of_month(start): def day_of_month(start):
"""这个月有几天""" """这个月有几天"""
start_f = my_pendulum.from_format(start, 'YYYY-MM-DD HH:mm:ss') start_f = my_pendulum.from_format(start, 'YYYY-MM-DD HH:mm:ss')
...@@ -269,7 +305,7 @@ def start_end_date(): ...@@ -269,7 +305,7 @@ def start_end_date():
def time_str_to_str(date_str, format="HH:mm"): def time_str_to_str(date_str, format="HH:mm"):
"""YYYY-MM-DD HH:mm:ss格式转换为format格式""" """YYYY-MM-DD HH:mm:ss格式转换为format格式"""
start_f = my_pendulum.from_format(date_str, 'YYYY-MM-DD HH:mm:ss') start_f = my_pendulum.parse(date_str)
start_f = start_f.format(format) start_f = start_f.format(format)
return start_f return start_f
...@@ -311,7 +347,7 @@ def convert_to_es_str(str1, format="YYYY-MM-DD HH:mm:ss"): ...@@ -311,7 +347,7 @@ def convert_to_es_str(str1, format="YYYY-MM-DD HH:mm:ss"):
return str(es_date) return str(es_date)
def last_time_str(start, end, date_type): def last_time_str(start, end, date_type, date_end=False):
"""年月日, 获取上一周期时间""" """年月日, 获取上一周期时间"""
if date_type not in ("day", "month", "year"): if date_type not in ("day", "month", "year"):
return None return None
...@@ -319,13 +355,22 @@ def last_time_str(start, end, date_type): ...@@ -319,13 +355,22 @@ def last_time_str(start, end, date_type):
end_f = my_pendulum.from_format(end, 'YYYY-MM-DD HH:mm:ss') end_f = my_pendulum.from_format(end, 'YYYY-MM-DD HH:mm:ss')
if date_type == "day": if date_type == "day":
start_last = start_f.subtract(days=1) start_last = start_f.subtract(days=1)
end_last = end_f.subtract(days=1) if date_end:
end_last = start_last.end_of(unit=date_type)
else:
end_last = end_f.subtract(days=1)
elif date_type == "month": elif date_type == "month":
start_last = start_f.subtract(months=1) start_last = start_f.subtract(months=1)
end_last = end_f.subtract(months=1) if date_end:
end_last = start_last.end_of(unit=date_type)
else:
end_last = end_f.subtract(months=1)
else: else:
start_last = start_f.subtract(years=1) start_last = start_f.subtract(years=1)
end_last = end_f.subtract(years=1) if date_end:
end_last = start_last.end_of(unit=date_type)
else:
end_last = end_f.subtract(years=1)
return start_last.format("YYYY-MM-DD HH:mm:ss"), end_last.format( return start_last.format("YYYY-MM-DD HH:mm:ss"), end_last.format(
"YYYY-MM-DD HH:mm:ss") "YYYY-MM-DD HH:mm:ss")
...@@ -356,7 +401,7 @@ def get_datetime_str(timestamp): ...@@ -356,7 +401,7 @@ def get_datetime_str(timestamp):
''' '''
if not timestamp: if not timestamp:
timestamp = time.time() timestamp = time.time()
time_array = time.localtime(timestamp) time_array = time.localtime(timestamp)
return time.strftime("%Y-%m-%d %H:%M:%S", time_array) return time.strftime("%Y-%m-%d %H:%M:%S", time_array)
...@@ -671,7 +716,7 @@ def get_last_3month_start_end(date=None): ...@@ -671,7 +716,7 @@ def get_last_3month_start_end(date=None):
:param dt: datetime obj :param dt: datetime obj
:return: :return:
""" """
if not date: if not date:
dt = get_current_date_time() dt = get_current_date_time()
else: else:
...@@ -733,7 +778,7 @@ def get_this_year_start_end(date=None): ...@@ -733,7 +778,7 @@ def get_this_year_start_end(date=None):
:param dt: datetime obj :param dt: datetime obj
:return: :return:
""" """
if not date: if not date:
dt = get_current_date_time() dt = get_current_date_time()
else: else:
...@@ -749,7 +794,7 @@ def get_last_year_start_end(date=None): ...@@ -749,7 +794,7 @@ def get_last_year_start_end(date=None):
:param dt: datetime obj :param dt: datetime obj
:return: :return:
""" """
if not date: if not date:
dt = get_current_date_time() dt = get_current_date_time()
else: else:
...@@ -765,7 +810,7 @@ def get_last_month_start_end(date=None): ...@@ -765,7 +810,7 @@ def get_last_month_start_end(date=None):
:param dt: datetime obj :param dt: datetime obj
:return: :return:
""" """
if not date: if not date:
dt = get_current_date_time() dt = get_current_date_time()
else: else:
...@@ -873,7 +918,7 @@ def get_current_start_n_end_dt(date_type, include_end_day=False): ...@@ -873,7 +918,7 @@ def get_current_start_n_end_dt(date_type, include_end_day=False):
start_year += 1 start_year += 1
start_month = start_month - 12 start_month = start_month - 12
start = datetime.datetime(start_year, start_month, 1) start = datetime.datetime(start_year, start_month, 1)
elif date_type == "season": elif date_type == "season":
season_number = int((current_dt.month - 1) / 3) season_number = int((current_dt.month - 1) / 3)
start = datetime.datetime(current_dt.year, season_number * 3 + 1, 1) start = datetime.datetime(current_dt.year, season_number * 3 + 1, 1)
...@@ -984,7 +1029,7 @@ def get_previous_slot(slots, date_type, compare_type=None): ...@@ -984,7 +1029,7 @@ def get_previous_slot(slots, date_type, compare_type=None):
return get_slots_between_date( return get_slots_between_date(
start - datetime.timedelta(days=days), start - datetime.timedelta(days=days),
end - datetime.timedelta(days=days), date_type) end - datetime.timedelta(days=days), date_type)
elif date_type == "hour": elif date_type == "hour":
hours = int((end - start).total_seconds() / 3600) + 1 hours = int((end - start).total_seconds() / 3600) + 1
return get_slots_between_date(start - datetime.timedelta(hours=hours), return get_slots_between_date(start - datetime.timedelta(hours=hours),
...@@ -1032,8 +1077,8 @@ def get_slots_between_date(start, end, interval_type, growth_type=None): ...@@ -1032,8 +1077,8 @@ def get_slots_between_date(start, end, interval_type, growth_type=None):
while start <= end: while start <= end:
date_dts.append([start, start + datetime.timedelta(days=1)]) date_dts.append([start, start + datetime.timedelta(days=1)])
start += datetime.timedelta(days=1) start += datetime.timedelta(days=1)
elif interval_type == "month": elif interval_type == "month":
start_months = start.year * 12 + start.month start_months = start.year * 12 + start.month
end_months = end.year * 12 + end.month end_months = end.year * 12 + end.month
...@@ -1145,7 +1190,7 @@ def deco_convert_date_to_dt(f): ...@@ -1145,7 +1190,7 @@ def deco_convert_date_to_dt(f):
if kwarg in kwargs and kwargs[kwarg]: if kwarg in kwargs and kwargs[kwarg]:
kwargs[kwarg] = convert_to_dt(kwargs[kwarg]) kwargs[kwarg] = convert_to_dt(kwargs[kwarg])
return f(*args, **kwargs) return f(*args, **kwargs)
return deco return deco
...@@ -1432,7 +1477,7 @@ def get_time_duration_by_str(duration_str): ...@@ -1432,7 +1477,7 @@ def get_time_duration_by_str(duration_str):
days = int(duration_str / (60 * 60 * 24)) days = int(duration_str / (60 * 60 * 24))
if days > 0: if days > 0:
return_str += "%s天" % str(days) return_str += "%s天" % str(days)
hours = int(duration_str % (60 * 60 * 24) / (60 * 60)) hours = int(duration_str % (60 * 60 * 24) / (60 * 60))
if hours > 0: if hours > 0:
return_str += "%s时" % str(hours) return_str += "%s时" % str(hours)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment