This commit is contained in:
HuangHai
2026-01-20 08:09:13 +08:00
parent b0b4533f57
commit 34501faafb
20 changed files with 2360 additions and 859 deletions

View File

@@ -92,13 +92,21 @@ class Db:
Args:
db_url: 数据库连接URL优先级高于初始化时提供的URL
"""
if self.engine:
return
# 确定使用的数据库连接URL
final_url = db_url or self.db_url
if not final_url:
# 如果没有提供URL使用配置文件中的参数构建连接URL
from Config import POSTGRES_HOST, POSTGRES_PORT, POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DATABASE
# 转换为异步连接URL
final_url = f"postgresql+asyncpg://{POSTGRES_USER}:{POSTGRES_PASSWORD}@{POSTGRES_HOST}:{POSTGRES_PORT}/{POSTGRES_DATABASE}"
try:
from Config.Config import DB_URL
final_url = DB_URL
except ImportError:
# 兼容旧配置或Postgres配置
from Config.Config import POSTGRES_HOST, POSTGRES_PORT, POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DATABASE
# 转换为异步连接URL
final_url = f"postgresql+asyncpg://{POSTGRES_USER}:{POSTGRES_PASSWORD}@{POSTGRES_HOST}:{POSTGRES_PORT}/{POSTGRES_DATABASE}"
else:
# 如果是同步URL转换为异步URL
if final_url.startswith("postgresql://"):

149
DbKit/Sql/Degree.sql Normal file
View File

@@ -0,0 +1,149 @@
#namespace("Degree")
-- 指定时间范围内,指定场站的充电度数,有峰平谷和总量
#sql("getDegree")
WITH station_list AS (
SELECT id AS station_id, station_name
FROM t_station
WHERE 1=1
#if(station_names)
AND station_name IN (#para(station_names))
#end
),
charge_data AS (
-- 12月指定场站的充电信息计算每条记录的充电量和时段
SELECT
teco.station_id,
sl.station_name,
teco.charge_end_degree - teco.charge_begin_degree AS charge_amount,
HOUR(teco.charge_begin_time) AS hour_of_day
FROM t_equipment_charge_order teco
INNER JOIN station_list sl ON teco.station_id = sl.station_id
WHERE 1=1
#if(start_time)
AND teco.charge_begin_time >= #para(start_time)
#end
#if(end_time)
AND teco.charge_begin_time <= #para(end_time)
#end
)
-- 统计各场站峰、平、谷时段的充电量保留3位小数
SELECT
station_id,
station_name,
-- 峰时段8:00-11:0018:00-21:00
ROUND(SUM(CASE
WHEN (hour_of_day >= 8 AND hour_of_day < 11)
OR (hour_of_day >= 18 AND hour_of_day < 21)
THEN charge_amount ELSE 0
END), 3) AS peak_charging_amount,
-- 平时段11:00-18:0021:00-22:00
ROUND(SUM(CASE
WHEN (hour_of_day >= 11 AND hour_of_day < 18)
OR (hour_of_day >= 21 AND hour_of_day < 22)
THEN charge_amount ELSE 0
END), 3) AS flat_charging_amount,
-- 谷时段22:00-次日8:00跨天处理
ROUND(SUM(CASE
WHEN hour_of_day >= 22 OR hour_of_day < 8
THEN charge_amount ELSE 0
END), 3) AS valley_charging_amount,
-- 充电量总量
ROUND(SUM(charge_amount), 3) AS total_charging_amount
FROM charge_data
GROUP BY station_id, station_name
ORDER BY total_charging_amount DESC
#if(!station_names)
LIMIT 10
#end
;
#end
#sql("getStationList")
select id,station_name from t_station
#end
-- 查询近3个月的充电趋势及变化
#sql("getTrendChange")
WITH monthly_data AS (
SELECT
ts.station_name,
DATE_FORMAT(teco.charge_begin_time, '%Y-%m') as month_str,
SUM(teco.charge_end_degree - teco.charge_begin_degree) as monthly_total
FROM t_equipment_charge_order teco
JOIN t_station ts ON teco.station_id = ts.id
WHERE teco.charge_begin_time >= #para(start_time)
AND teco.charge_begin_time <= #para(end_time)
GROUP BY ts.station_name, month_str
),
pivoted_data AS (
SELECT
station_name,
MAX(CASE WHEN month_str = #para(month1) THEN monthly_total ELSE 0 END) as m1_total,
MAX(CASE WHEN month_str = #para(month2) THEN monthly_total ELSE 0 END) as m2_total,
MAX(CASE WHEN month_str = #para(month3) THEN monthly_total ELSE 0 END) as m3_total
FROM monthly_data
GROUP BY station_name
)
SELECT
station_name,
ROUND(m1_total, 2) as month1_total,
ROUND(m2_total, 2) as month2_total,
ROUND(m3_total, 2) as month3_total,
ROUND(m3_total - m1_total, 2) as net_change,
ROUND(ABS(m3_total - m1_total), 2) as abs_change
FROM pivoted_data
ORDER BY abs_change DESC
LIMIT 10
#end
-- 获取指定时间内按企业充电量由大到小TOP 10
#sql("getCompanyTop10")
WITH charge_data AS (
SELECT
tc.company_name,
teco.charge_degree as charge_amount,
HOUR(teco.charge_begin_time) AS hour_of_day
FROM t_equipment_charge_order teco
INNER JOIN t_user as tu ON teco.user_id = tu.id
INNER JOIN t_company tc ON tc.id = tu.user_owner_id
WHERE 1=1
#if(start_time)
AND teco.charge_begin_time >= #para(start_time)
#end
#if(end_time)
AND teco.charge_begin_time <= #para(end_time)
#end
)
SELECT
company_name,
-- 峰时段8:00-11:0018:00-21:00
ROUND(SUM(CASE
WHEN (hour_of_day >= 8 AND hour_of_day < 11)
OR (hour_of_day >= 18 AND hour_of_day < 21)
THEN charge_amount ELSE 0
END), 2) AS peak_charging_amount,
-- 平时段11:00-18:0021:00-22:00
ROUND(SUM(CASE
WHEN (hour_of_day >= 11 AND hour_of_day < 18)
OR (hour_of_day >= 21 AND hour_of_day < 22)
THEN charge_amount ELSE 0
END), 2) AS flat_charging_amount,
-- 谷时段22:00-次日8:00跨天处理
ROUND(SUM(CASE
WHEN hour_of_day >= 22 OR hour_of_day < 8
THEN charge_amount ELSE 0
END), 2) AS valley_charging_amount,
-- 总量
ROUND(SUM(charge_amount), 2) as total_charging_amount
FROM charge_data
GROUP BY company_name
ORDER BY total_charging_amount DESC
LIMIT 10
#end
#end

Binary file not shown.