ai_v/services/history_service.py

68 lines
2.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from models import GenerationRecord, to_bj_time
from flask import request
import json
from datetime import datetime, timedelta
def get_user_history_data(user_id, page=1, per_page=10, filter_type='all'):
"""获取用户历史记录业务逻辑"""
# 计算 90 天前的时间
ninety_days_ago = datetime.now() - timedelta(days=90)
query = GenerationRecord.query.filter(
GenerationRecord.user_id == user_id,
GenerationRecord.created_at >= ninety_days_ago,
GenerationRecord.prompt != "解读验光单"
)
if filter_type == 'video':
# 只看视频
query = query.filter(GenerationRecord.image_urls.like('%"type": "video"%'))
elif filter_type == 'image':
# 只看图片 (排除视频)
query = query.filter(~GenerationRecord.image_urls.like('%"type": "video"%'))
pagination = query.order_by(GenerationRecord.created_at.desc())\
.paginate(page=page, per_page=per_page, error_out=False)
# 格式化 URL兼容新旧数据格式
def fix_minio_url(url):
if url and ":9000/images/" in url:
return "/files/" + url.split(":9000/images/")[-1]
return url
history_list = []
for r in pagination.items:
raw_urls = json.loads(r.image_urls)
formatted_urls = []
for u in raw_urls:
if isinstance(u, str):
# 旧数据:直接返回原图作为缩略图
fixed_u = fix_minio_url(u)
formatted_urls.append({"url": fixed_u, "thumb": fixed_u})
else:
# 修复对象格式中的 URL
if 'url' in u:
u['url'] = fix_minio_url(u['url'])
if 'thumb' in u:
u['thumb'] = fix_minio_url(u['thumb'])
# 如果是视频类型,提供默认预览图
if u.get('type') == 'video' and not u.get('thumb'):
u['thumb'] = "https://img.icons8.com/flat-round/64/000000/play--v1.png"
formatted_urls.append(u)
history_list.append({
"id": r.id,
"prompt": r.prompt,
"model": r.model,
"urls": formatted_urls,
"created_at": r.created_at_bj.strftime('%m-%d %H:%M')
})
return {
"history": history_list,
"has_next": pagination.has_next,
"total": pagination.total
}