|
@@ -140,16 +140,15 @@ class DeviceReportView(View):
|
|
raise ValueError("时区偏移超出范围")
|
|
raise ValueError("时区偏移超出范围")
|
|
tz = pytz.FixedOffset(int(tz_offset * 60))
|
|
tz = pytz.FixedOffset(int(tz_offset * 60))
|
|
|
|
|
|
- # 计算日期范围:查询的是客户端时区下的历史数据
|
|
|
|
|
|
+ # 计算日期范围
|
|
query_days = int(request_dict.get('days', 7))
|
|
query_days = int(request_dict.get('days', 7))
|
|
client_now = datetime.now(tz)
|
|
client_now = datetime.now(tz)
|
|
|
|
|
|
- # 关键修改:数据日期范围 = [今天 - query_days, 昨天]
|
|
|
|
- # 因为设备上报的是前一天的数据
|
|
|
|
|
|
+ # 数据日期范围 = [今天 - query_days, 昨天]
|
|
end_date = (client_now - timedelta(days=1)).date() # 昨天
|
|
end_date = (client_now - timedelta(days=1)).date() # 昨天
|
|
start_date = end_date - timedelta(days=query_days - 1) # 起始日期
|
|
start_date = end_date - timedelta(days=query_days - 1) # 起始日期
|
|
|
|
|
|
- # 转换查询范围到UTC时间戳 (包含整个日期范围)
|
|
|
|
|
|
+ # 转换查询范围到UTC时间戳
|
|
start_utc = int(tz.localize(
|
|
start_utc = int(tz.localize(
|
|
datetime.combine(start_date, datetime.min.time())
|
|
datetime.combine(start_date, datetime.min.time())
|
|
).astimezone(pytz.utc).timestamp())
|
|
).astimezone(pytz.utc).timestamp())
|
|
@@ -163,21 +162,20 @@ class DeviceReportView(View):
|
|
device_id=device_id,
|
|
device_id=device_id,
|
|
type=1,
|
|
type=1,
|
|
report_time__gte=start_utc,
|
|
report_time__gte=start_utc,
|
|
- report_time__lt=end_utc # 不包含结束时间戳
|
|
|
|
|
|
+ report_time__lt=end_utc
|
|
).order_by('report_time')
|
|
).order_by('report_time')
|
|
|
|
|
|
- # 构建日期-电量映射 (按数据实际归属的日期)
|
|
|
|
|
|
+ # 构建日期-电量映射(直接使用上报日期)
|
|
date_battery_map = {}
|
|
date_battery_map = {}
|
|
for record in records:
|
|
for record in records:
|
|
- # 关键修改:上报时间转客户端时区后减去1天 = 数据实际归属日期
|
|
|
|
|
|
+ # 关键变更:直接使用上报日期作为数据日期
|
|
record_date = datetime.fromtimestamp(record.report_time, tz).date()
|
|
record_date = datetime.fromtimestamp(record.report_time, tz).date()
|
|
- data_date = record_date - timedelta(days=1) # 数据属于前一天
|
|
|
|
|
|
|
|
# 只记录查询范围内的数据
|
|
# 只记录查询范围内的数据
|
|
- if start_date <= data_date <= end_date:
|
|
|
|
- date_battery_map[data_date.isoformat()] = record.battery_level
|
|
|
|
|
|
+ if start_date <= record_date <= end_date:
|
|
|
|
+ date_battery_map[record_date.isoformat()] = record.battery_level
|
|
|
|
|
|
- # 生成完整日期序列 (按客户端时区)
|
|
|
|
|
|
+ # 生成完整日期序列
|
|
report_data = []
|
|
report_data = []
|
|
for day_offset in range(query_days):
|
|
for day_offset in range(query_days):
|
|
current_date = start_date + timedelta(days=day_offset)
|
|
current_date = start_date + timedelta(days=day_offset)
|