fix(ui): 日期维度改用视频录制时间 - 前端事件时间轴/统计/关注事件与后端 db_layer 统一按 event_start_time(文件名解析) 分组排序,空值回退 processed_at;修复全量重分析导致处理时间(8/21)把 8/15-8/20 视频全堆同一天、与文件名对不上的问题
This commit is contained in:
@@ -103,32 +103,35 @@ def upsert_sync_videos(rows: List[Dict]) -> int:
|
||||
def get_sync_videos(limit=15, offset=0, date_filter=None) -> List[Dict]:
|
||||
"""获取视频会话列表(已完成优先),支持日期筛选与分页。
|
||||
|
||||
排序按 COALESCE(processed_at, updated_at, created_at) 降序。
|
||||
date_filter 形如 '2026-08-21',匹配 processed_at 前缀。
|
||||
排序/日期维度按视频实际录制时间(event_start_time,文件名解析),
|
||||
为空回退 processed_at/updated_at/created_at。
|
||||
date_filter 形如 '2026-08-21'。
|
||||
"""
|
||||
conn = get_conn()
|
||||
try:
|
||||
cur = conn.cursor(pymysql.cursors.DictCursor)
|
||||
# 录制时间优先,回退分析时间
|
||||
date_expr = "COALESCE(NULLIF(event_start_time,''), processed_at, updated_at, created_at)"
|
||||
if date_filter:
|
||||
cur.execute(
|
||||
"""SELECT id, filename, camera_name, event_start_time, status,
|
||||
f"""SELECT id, filename, camera_name, event_start_time, status,
|
||||
summary_json, events_json, people_json, compute_provider,
|
||||
processed_at, updated_at,
|
||||
(SELECT COUNT(*) FROM sync_events se WHERE se.video_id = sync_videos.id) AS event_count
|
||||
FROM sync_videos
|
||||
WHERE status='done' AND processed_at LIKE %s
|
||||
ORDER BY COALESCE(processed_at, updated_at, created_at) DESC
|
||||
WHERE status='done' AND {date_expr} LIKE %s
|
||||
ORDER BY {date_expr} DESC
|
||||
LIMIT %s OFFSET %s""",
|
||||
(f'{date_filter}%', limit, offset))
|
||||
else:
|
||||
cur.execute(
|
||||
"""SELECT id, filename, camera_name, event_start_time, status,
|
||||
f"""SELECT id, filename, camera_name, event_start_time, status,
|
||||
summary_json, events_json, people_json, compute_provider,
|
||||
processed_at, updated_at,
|
||||
(SELECT COUNT(*) FROM sync_events se WHERE se.video_id = sync_videos.id) AS event_count
|
||||
FROM sync_videos
|
||||
WHERE status='done'
|
||||
ORDER BY COALESCE(processed_at, updated_at, created_at) DESC
|
||||
ORDER BY {date_expr} DESC
|
||||
LIMIT %s OFFSET %s""",
|
||||
(limit, offset))
|
||||
return cur.fetchall()
|
||||
@@ -201,7 +204,8 @@ def query_sync_events_for_person_date(person: str, date_str: str) -> List[Dict]:
|
||||
"""问答上下文:某人在某天的事件。
|
||||
|
||||
说明: Oracle 事件 ts 为视频内相对时间点(如 00:01:23),不是绝对日期,
|
||||
因此按所属视频的 processed_at 日期过滤,再按 person_list_json 命中人名。
|
||||
因此按所属视频的录制日期(event_start_time,回退 processed_at)过滤,
|
||||
再按 person_list_json 命中人名。
|
||||
person 可为真名或抽象标签(Oracle 回灌上下文用真名,但历史标签也保留)。
|
||||
"""
|
||||
conn = get_conn()
|
||||
@@ -212,10 +216,10 @@ def query_sync_events_for_person_date(person: str, date_str: str) -> List[Dict]:
|
||||
v.camera_name, v.filename, v.event_start_time, v.processed_at
|
||||
FROM sync_events e
|
||||
JOIN sync_videos v ON e.video_id = v.id
|
||||
WHERE v.processed_at LIKE %s
|
||||
WHERE COALESCE(NULLIF(v.event_start_time,''), v.processed_at) LIKE %s
|
||||
AND e.person_list_json IS NOT NULL
|
||||
AND JSON_CONTAINS(e.person_list_json, JSON_QUOTE(%s), '$')
|
||||
ORDER BY v.processed_at ASC, e.ts ASC""",
|
||||
ORDER BY COALESCE(NULLIF(v.event_start_time,''), v.processed_at) ASC, e.ts ASC""",
|
||||
(f'{date_str}%', person))
|
||||
return cur.fetchall()
|
||||
finally:
|
||||
@@ -414,18 +418,19 @@ def get_sync_stats(date_str: str = None) -> Dict:
|
||||
conn = get_conn()
|
||||
try:
|
||||
cur = conn.cursor(pymysql.cursors.DictCursor)
|
||||
# 视频/事件/关注数
|
||||
# 视频/事件/关注数(日期维度=录制时间 event_start_time,回退 processed_at)
|
||||
_D = "COALESCE(NULLIF(sv.event_start_time,''), sv.processed_at)"
|
||||
if date_str:
|
||||
cur.execute(
|
||||
"""SELECT
|
||||
COUNT(*) AS videos,
|
||||
(SELECT COUNT(*) FROM sync_events se
|
||||
JOIN sync_videos sv ON se.video_id=sv.id
|
||||
WHERE sv.processed_at LIKE %s) AS events,
|
||||
WHERE {d} LIKE %s) AS events,
|
||||
(SELECT COALESCE(SUM(se.is_attention_event),0) FROM sync_events se
|
||||
JOIN sync_videos sv ON se.video_id=sv.id
|
||||
WHERE sv.processed_at LIKE %s) AS attention
|
||||
FROM sync_videos sv WHERE sv.processed_at LIKE %s""",
|
||||
WHERE {d} LIKE %s) AS attention
|
||||
FROM sync_videos sv WHERE {d} LIKE %s""".format(d=_D),
|
||||
(f'{date_str}%', f'{date_str}%', f'{date_str}%'))
|
||||
else:
|
||||
cur.execute(
|
||||
|
||||
Reference in New Issue
Block a user