diff --git a/backend/database/models.py b/backend/database/models.py index 761f9fd..c8bbb61 100644 --- a/backend/database/models.py +++ b/backend/database/models.py @@ -1104,7 +1104,7 @@ class Trade: query += " AND (entry_reason IS NULL OR entry_reason != 'sync_recovered')" query += " AND (exit_reason IS NULL OR exit_reason != 'sync')" - # 按创建时间筛选时若表无 created_at 则回退为 entry_time + # 按创建时间筛选:有 created_at 列则用 COALESCE(created_at, entry_time);无则回退为 entry_time,保证「按创建时间」有结果 use_created = (time_filter == "created" and _table_has_column("trades", "created_at")) time_col = "COALESCE(created_at, entry_time)" if use_created else None @@ -1118,6 +1118,9 @@ class Trade: elif use_created: query += " AND " + time_col + " >= %s AND " + time_col + " <= %s" params.extend([start_timestamp, end_timestamp]) + elif time_filter == "created": + query += " AND entry_time >= %s AND entry_time <= %s" + params.extend([start_timestamp, end_timestamp]) else: query += " AND COALESCE(exit_time, entry_time) >= %s AND COALESCE(exit_time, entry_time) <= %s" params.extend([start_timestamp, end_timestamp]) @@ -1125,12 +1128,12 @@ class Trade: if time_filter == "exit": query += " AND ((status = 'closed' AND exit_time >= %s) OR (status != 'closed' AND entry_time >= %s))" params.extend([start_timestamp, start_timestamp]) - elif time_filter == "entry": - query += " AND entry_time >= %s" - params.append(start_timestamp) elif use_created: query += " AND " + time_col + " >= %s" params.append(start_timestamp) + elif time_filter == "entry" or time_filter == "created": + query += " AND entry_time >= %s" + params.append(start_timestamp) else: query += " AND COALESCE(exit_time, entry_time) >= %s" params.append(start_timestamp) @@ -1138,12 +1141,12 @@ class Trade: if time_filter == "exit": query += " AND ((status = 'closed' AND exit_time <= %s) OR (status != 'closed' AND entry_time <= %s))" params.extend([end_timestamp, end_timestamp]) - elif time_filter == "entry": - query += " AND entry_time <= %s" - params.append(end_timestamp) elif use_created: query += " AND " + time_col + " <= %s" params.append(end_timestamp) + elif time_filter == "entry" or time_filter == "created": + query += " AND entry_time <= %s" + params.append(end_timestamp) else: query += " AND COALESCE(exit_time, entry_time) <= %s" params.append(end_timestamp) @@ -1163,6 +1166,8 @@ class Trade: if use_created: query += " ORDER BY " + time_col + " DESC, id DESC" + elif time_filter == "created": + query += " ORDER BY entry_time DESC, id DESC" else: query += " ORDER BY COALESCE(exit_time, entry_time) DESC, id DESC" # 未传 limit 时使用默认上限,防止全表加载导致内存暴增(2 CPU 4G 场景) diff --git a/frontend/src/components/StatsDashboard.css b/frontend/src/components/StatsDashboard.css index b0cad95..939b4d9 100644 --- a/frontend/src/components/StatsDashboard.css +++ b/frontend/src/components/StatsDashboard.css @@ -339,6 +339,14 @@ border-radius: 6px; } +.position-time-row { + font-size: 0.85rem; + color: #212529; + margin-bottom: 0.5rem; + font-weight: 500; +} +.position-time-row:empty { display: none; } + .entry-time { color: #999; font-size: 0.8rem; diff --git a/frontend/src/components/StatsDashboard.jsx b/frontend/src/components/StatsDashboard.jsx index 8f84a6c..60771e8 100644 --- a/frontend/src/components/StatsDashboard.jsx +++ b/frontend/src/components/StatsDashboard.jsx @@ -696,6 +696,11 @@ const StatsDashboard = () => { {trade.side}