Update .gitignore and add files
This commit is contained in:
85
back/blueprints/wendu.py
Normal file
85
back/blueprints/wendu.py
Normal file
@ -0,0 +1,85 @@
|
||||
import sqlite3
|
||||
from flask import Blueprint, current_app, jsonify, g, Flask, request
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
|
||||
|
||||
# 初始化蓝图对象
|
||||
bp = Blueprint('wendu', __name__, url_prefix='/api')
|
||||
|
||||
|
||||
@bp.route('/temperature/daily/average', methods=['GET'])
|
||||
def get_daily_average_by_device():
|
||||
"""按设备分组获取近30天的每日温度平均值"""
|
||||
try:
|
||||
db = current_app.get_db()
|
||||
|
||||
# 计算查询日期范围(近30天)
|
||||
days = request.args.get('days', default=30, type=int)
|
||||
end_date = datetime.now().date()
|
||||
start_date = end_date - timedelta(days=days - 1)
|
||||
|
||||
current_app.logger.info(f"查询最近{days}天温度数据: {start_date} 至 {end_date}")
|
||||
|
||||
# 执行SQL查询
|
||||
cursor = db.execute('''
|
||||
SELECT
|
||||
d.id AS device_id,
|
||||
d.device_name,
|
||||
date(t.timestamp) AS date_day,
|
||||
ROUND(AVG(t.temperature), 1) AS avg_temp
|
||||
FROM temperature_data t
|
||||
JOIN device d ON t.device_id = d.id
|
||||
WHERE date(t.timestamp) BETWEEN ? AND ?
|
||||
GROUP BY d.id, d.device_name, date_day
|
||||
ORDER BY d.id, date_day ASC
|
||||
''', (start_date, end_date))
|
||||
|
||||
rows = cursor.fetchall()
|
||||
current_app.logger.info(f"查询结果行数: {len(rows)}")
|
||||
|
||||
if not rows:
|
||||
current_app.logger.warning(f"在{start_date}至{end_date}范围内未找到温度数据")
|
||||
return jsonify({
|
||||
"code": 404,
|
||||
"message": f"最近{days}天内无温度数据",
|
||||
"data": {}
|
||||
})
|
||||
|
||||
# 处理查询结果
|
||||
device_data = {}
|
||||
for row in rows:
|
||||
device_id = str(row['device_id'])
|
||||
if device_id not in device_data:
|
||||
device_data[device_id] = {
|
||||
'device_name': row['device_name'],
|
||||
'dates': [],
|
||||
'temperatures': []
|
||||
}
|
||||
|
||||
device_data[device_id]['dates'].append(row['date_day'])
|
||||
device_data[device_id]['temperatures'].append(float(row['avg_temp']))
|
||||
|
||||
# 确保数据按日期排序
|
||||
for device in device_data.values():
|
||||
if len(device['dates']) > 1:
|
||||
combined = sorted(zip(device['dates'], device['temperatures']), key=lambda x: x[0])
|
||||
device['dates'], device['temperatures'] = zip(*combined)
|
||||
device['dates'] = list(device['dates'])
|
||||
device['temperatures'] = list(device['temperatures'])
|
||||
|
||||
return jsonify({
|
||||
"code": 200,
|
||||
"message": "Success",
|
||||
"data": device_data
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
current_app.logger.error(f"获取温度数据失败: {str(e)}", exc_info=True)
|
||||
return jsonify({
|
||||
"code": 500,
|
||||
"message": f"服务器错误: {str(e)}"
|
||||
}), 500
|
||||
|
||||
# 注册蓝图
|
||||
|
||||
Reference in New Issue
Block a user