feat: 完善 MVP-2 演示和进度体验
This commit is contained in:
@@ -0,0 +1,123 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.db import SessionLocal, init_db
|
||||
from app.models import Comment, ContentItem, Hotspot, Report, Task, utc_now
|
||||
|
||||
|
||||
FIXTURE_PATH = Path(__file__).resolve().parent / "fixtures" / "demo_seed.json"
|
||||
|
||||
|
||||
def seed_demo_data(session: Session, fixture_path: Path = FIXTURE_PATH) -> str:
|
||||
data = json.loads(fixture_path.read_text(encoding="utf-8"))
|
||||
task_data = data["task"]
|
||||
task_id = task_data["id"]
|
||||
existing = session.scalar(select(Task.id).where(Task.id == task_id))
|
||||
if existing:
|
||||
return task_id
|
||||
|
||||
task = Task(
|
||||
id=task_id,
|
||||
platform=task_data["platform"],
|
||||
status="success",
|
||||
current_stage="success",
|
||||
last_progress_at=utc_now(),
|
||||
hotspot_limit=task_data["hotspot_limit"],
|
||||
item_limit_per_hotspot=task_data["item_limit_per_hotspot"],
|
||||
comment_limit_per_item=task_data["comment_limit_per_item"],
|
||||
total_items_count=len(data["items"]),
|
||||
processed_items_count=len(data["items"]),
|
||||
successful_items_count=len(data["items"]),
|
||||
failed_items_count=0,
|
||||
analysis_success_rate=1.0,
|
||||
analysis_status="normal",
|
||||
)
|
||||
session.add(task)
|
||||
|
||||
for hotspot_data in data["hotspots"]:
|
||||
session.add(
|
||||
Hotspot(
|
||||
id=hotspot_data["id"],
|
||||
task_id=task_id,
|
||||
platform=task.platform,
|
||||
rank=hotspot_data["rank"],
|
||||
title=hotspot_data["title"],
|
||||
heat_value=hotspot_data.get("heat_value"),
|
||||
source_hot_id=None,
|
||||
raw_data="{}",
|
||||
)
|
||||
)
|
||||
|
||||
for item_data in data["items"]:
|
||||
session.add(
|
||||
ContentItem(
|
||||
id=item_data["id"],
|
||||
task_id=task_id,
|
||||
hotspot_id=item_data["hotspot_id"],
|
||||
platform=task.platform,
|
||||
source_item_id=f"demo-item-{item_data['id']}",
|
||||
item_type=item_data["item_type"],
|
||||
title=item_data["title"],
|
||||
summary=item_data.get("summary"),
|
||||
url=None,
|
||||
status="success",
|
||||
raw_data="{}",
|
||||
)
|
||||
)
|
||||
|
||||
for comment_data in data["comments"]:
|
||||
session.add(
|
||||
Comment(
|
||||
id=comment_data["id"],
|
||||
task_id=task_id,
|
||||
hotspot_id=comment_data["hotspot_id"],
|
||||
content_item_id=comment_data["content_item_id"],
|
||||
platform=task.platform,
|
||||
source_comment_id=None,
|
||||
content=comment_data["content"],
|
||||
author=None,
|
||||
like_count=comment_data.get("like_count", 0),
|
||||
sentiment=comment_data["sentiment"],
|
||||
labels=json.dumps(comment_data["labels"], ensure_ascii=False),
|
||||
reason=comment_data.get("reason"),
|
||||
ai_analysis_status="success",
|
||||
raw_data="{}",
|
||||
ai_raw_response=None,
|
||||
)
|
||||
)
|
||||
|
||||
for report_data in data["reports"]:
|
||||
session.add(
|
||||
Report(
|
||||
task_id=task_id,
|
||||
hotspot_id=report_data.get("hotspot_id"),
|
||||
content_item_id=report_data.get("content_item_id"),
|
||||
report_type=report_data["report_type"],
|
||||
title=report_data["title"],
|
||||
metrics_json=json.dumps(report_data["metrics"], ensure_ascii=False),
|
||||
typical_comments_json=json.dumps(report_data["typical_comments"], ensure_ascii=False),
|
||||
summary=report_data["summary"],
|
||||
markdown_content=report_data["markdown_content"],
|
||||
data="{}",
|
||||
markdown=report_data["markdown_content"],
|
||||
)
|
||||
)
|
||||
|
||||
session.commit()
|
||||
return task_id
|
||||
|
||||
|
||||
def main() -> None:
|
||||
init_db()
|
||||
with SessionLocal() as session:
|
||||
task_id = seed_demo_data(session)
|
||||
print(f"Seeded demo task: {task_id}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user