| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- """Resolve demand_grade.video_list → multi_demand_video_detail."""
- from __future__ import annotations
- import json
- from typing import Any
- from supply_infra.db.repositories.demand_grade_repo import DemandGradeRepository
- from supply_infra.db.repositories.multi_demand_video_detail_repo import (
- MultiDemandVideoDetailRepository,
- )
- from supply_infra.db.session import get_session
- def _parse_json_list(raw: str | None) -> list[Any]:
- if not raw:
- return []
- try:
- parsed = json.loads(raw)
- except json.JSONDecodeError:
- return []
- return parsed if isinstance(parsed, list) else []
- def _parse_video_ids(raw: str | None) -> list[str]:
- return [str(v).strip() for v in _parse_json_list(raw) if v is not None and str(v).strip()]
- def list_videos_for_demand_grade(demand_grade_id: int) -> dict[str, Any] | None:
- """
- 按 demand_grade.id 返回关联视频详情。
- 顺序与 video_list 一致;详情表缺失的 vid 仍返回,title/三点 JSON 为空。
- category_ids 返回该分级需求归属的全部全局树节点 id(可能不止一个)。
- """
- with get_session() as session:
- grade = DemandGradeRepository(session).get_by_id(demand_grade_id)
- if grade is None:
- return None
- vids = _parse_video_ids(grade.video_list)
- details = MultiDemandVideoDetailRepository(session).list_by_vids(vids)
- videos: list[dict[str, Any]] = []
- for vid in vids:
- row = details.get(vid)
- videos.append(
- {
- "vid": vid,
- "title": row.title if row else None,
- "inspiration_points_json": row.inspiration_points_json if row else None,
- "purpose_points_json": row.purpose_points_json if row else None,
- "key_points_json": row.key_points_json if row else None,
- }
- )
- return {
- "demand_grade_id": grade.id,
- "demand_name": grade.demand_name,
- "category_ids": [int(c) for c in _parse_json_list(grade.category_ids)],
- "grade": grade.grade,
- "strategies": _parse_json_list(grade.strategies),
- "videos": videos,
- }
|