This commit is contained in:
2026-07-09 15:42:52 +08:00
parent a75b863f16
commit 3f1e84f0c9
4 changed files with 97 additions and 64 deletions
@@ -812,22 +812,48 @@ async def list_generation_record_history_grouped_days(
)
day_rows = day_rows_result.all()
if not day_rows:
return {
"total_days": int(total_days or 0),
"page": page,
"page_size": page_size,
"groups": [],
}
day_list = [row[0] for row in day_rows]
day_total_map = {row[0]: row[1] for row in day_rows}
min_day = min(day_list)
max_day = max(day_list)
all_rows_result = await db.execute(
select(GenerationRecord, Project.name.label("project_name"))
.outerjoin(Project, (GenerationRecord.project_id == Project.id) & (Project.deleted_at.is_(None)))
.where(
*filters,
func.date(GenerationRecord.generated_at).between(min_day, max_day),
)
.order_by(GenerationRecord.generated_at.desc(), GenerationRecord.created_at.desc())
)
all_rows = all_rows_result.all()
rows_by_day: dict[str, list[tuple[GenerationRecord, str]]] = {}
for record, project_name in all_rows:
if record.generated_at is None:
continue
day_key = record.generated_at.date()
if day_key not in rows_by_day:
rows_by_day[day_key] = []
rows_by_day[day_key].append((record, project_name))
raw_groups = []
all_record_ids: list[str] = []
for generated_day, day_total in day_rows:
item_result = await db.execute(
select(GenerationRecord, Project.name.label("project_name"))
.outerjoin(Project, (GenerationRecord.project_id == Project.id) & (Project.deleted_at.is_(None)))
.where(
*filters,
func.date(GenerationRecord.generated_at) == generated_day,
)
.order_by(GenerationRecord.generated_at.desc(), GenerationRecord.created_at.desc())
.limit(HISTORY_GROUP_ITEM_LIMIT)
)
rows = item_result.all()
raw_groups.append((generated_day, day_total, rows))
all_record_ids.extend(record.id for record, _project_name in rows)
for generated_day in day_list:
day_rows_list = rows_by_day.get(generated_day, [])
limited_rows = day_rows_list[:HISTORY_GROUP_ITEM_LIMIT]
day_total = day_total_map.get(generated_day, 0)
raw_groups.append((generated_day, day_total, limited_rows))
all_record_ids.extend(record.id for record, _project_name in limited_rows)
resource_info_map = await batch_get_generated_resource_info_map(
db,
@@ -995,21 +1021,47 @@ async def list_generation_history_grouped_days(
)
day_rows = day_rows_result.all()
if not day_rows:
return {
"total_days": int(total_days or 0),
"page": page,
"page_size": page_size,
"groups": [],
}
day_list = [row[0] for row in day_rows]
day_total_map = {row[0]: row[1] for row in day_rows}
min_day = min(day_list)
max_day = max(day_list)
all_tasks_result = await db.execute(
select(ChatGenerationTask)
.where(
*filters,
func.date(ChatGenerationTask.generated_at).between(min_day, max_day),
)
.order_by(ChatGenerationTask.generated_at.desc(), ChatGenerationTask.created_at.desc())
)
all_tasks = list(all_tasks_result.scalars().all())
tasks_by_day: dict[str, list[ChatGenerationTask]] = {}
for task in all_tasks:
if task.generated_at is None:
continue
day_key = task.generated_at.date()
if day_key not in tasks_by_day:
tasks_by_day[day_key] = []
tasks_by_day[day_key].append(task)
raw_groups = []
all_task_ids: list[str] = []
for generated_day, day_total in day_rows:
item_result = await db.execute(
select(ChatGenerationTask)
.where(
*filters,
func.date(ChatGenerationTask.generated_at) == generated_day,
)
.order_by(ChatGenerationTask.generated_at.desc(), ChatGenerationTask.created_at.desc())
.limit(HISTORY_GROUP_ITEM_LIMIT)
)
tasks = list(item_result.scalars().all())
raw_groups.append((generated_day, day_total, tasks))
all_task_ids.extend(task.id for task in tasks)
for generated_day in day_list:
day_tasks = tasks_by_day.get(generated_day, [])
limited_tasks = day_tasks[:HISTORY_GROUP_ITEM_LIMIT]
day_total = day_total_map.get(generated_day, 0)
raw_groups.append((generated_day, day_total, limited_tasks))
all_task_ids.extend(task.id for task in limited_tasks)
resource_info_map = await batch_get_generated_resource_info_map(
db,
@@ -1022,8 +1074,8 @@ async def list_generation_history_grouped_days(
source=source,
chat_task_ids=all_task_ids,
)
all_tasks = [task for _generated_day, _day_total, tasks in raw_groups for task in tasks]
reference_display_map = await _resolve_task_reference_display_map(db, all_tasks, user_id=user_id)
all_tasks_for_refs = [task for _generated_day, _day_total, tasks in raw_groups for task in tasks]
reference_display_map = await _resolve_task_reference_display_map(db, all_tasks_for_refs, user_id=user_id)
groups = [
{
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -28,7 +28,7 @@
}
})();
</script>
<script type="module" crossorigin src="/assets/index-CNAElJYI.js"></script>
<script type="module" crossorigin src="/assets/index-CM_dxMTI.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-JhRVnnL-.css">
</head>
<body>
+14 -33
View File
@@ -176,11 +176,23 @@ const GeneratedRecord: React.FC = () => {
document.body.removeChild(link);
};
// 预览文件
const handlePreview = (item: any) => {
const handlePreview = async (item: any) => {
setPreviewItem(item);
setPreviewVisible(true);
// 触发事件通知布局组件关闭浮动按钮
window.dispatchEvent(new Event('previewOpen'));
// 如果是视频且没有尺寸信息,异步获取视频尺寸
if (item.videoUrl && item.videoUrl.trim() && !item.imagePx) {
try {
const dimensions = await getVideoDimensions(item.videoUrl);
if (dimensions) {
setPreviewItem((prev: any) => prev ? { ...prev, imagePx: dimensions } : prev);
}
} catch (e) {
// 忽略获取尺寸失败
}
}
};
// 关闭预览并暂停视频
const handleClosePreview = () => {
@@ -803,21 +815,6 @@ const GeneratedRecord: React.FC = () => {
} else {
setRecordList([]);
}
if (isPageLoaded) {
data.forEach(async (item: any) => {
if (item.videoUrl && item.videoUrl.trim()) {
const dimensions = await getVideoDimensions(item.videoUrl);
if (dimensions) {
setRecordList(prev => prev.map(group => ({
...group,
items: group.items.map((i: any) =>
i.id === item.id ? { ...i, imagePx: dimensions } : i
),
})));
}
}
});
}
}).catch((err) => {
}).finally(() => {
setLoading(false);
@@ -838,23 +835,6 @@ const GeneratedRecord: React.FC = () => {
setRecordList(prev => [...prev, ...data]);
}
setTotalnumber(res?.totalDays || 0);
if (isPageLoaded) {
data.forEach(group => {
group.items.forEach(async (item: any) => {
if (item.videoUrl && item.videoUrl.trim()) {
const dimensions = await getVideoDimensions(item.videoUrl);
if (dimensions) {
setRecordList(prev => prev.map(g => ({
...g,
items: g.items.map((i: any) =>
i.id === item.id ? { ...i, imagePx: dimensions } : i
),
})));
}
}
});
});
}
}).catch((err) => {
if (Pagebreak.page === 1) {
setRecordList([]);
@@ -1354,6 +1334,7 @@ const GeneratedRecord: React.FC = () => {
<img
src={displayUrl}
alt="预览"
loading="lazy"
style={{
width: '100%',
height: '100%',