"""董事会路由:CRUD + 决议追踪。""" from fastapi import APIRouter, Depends, HTTPException, Query, status from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.core.database import get_db from app.core.dependencies import get_current_user from app.models.board import BoardMeeting from app.models.company import Company from app.models.user import User from app.schemas.common import ApiResponse, success from app.services.board_agent import generate_meeting_summary, generate_questions router = APIRouter(prefix="/board", tags=["board"]) @router.get("", response_model=ApiResponse[list]) async def list_board_meetings( company_id: str | None = Query(default=None), db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user), ): """获取董事会会议列表。""" query = ( select(BoardMeeting) .join(Company, BoardMeeting.company_id == Company.id) .where(Company.tenant_id == user.tenant_id) ) if company_id: query = query.where(BoardMeeting.company_id == company_id) result = await db.execute(query.order_by(BoardMeeting.meeting_at.desc())) items = result.scalars().all() return success(data=[ { "id": str(i.id), "company_id": str(i.company_id), "title": i.title, "meeting_at": i.meeting_at.isoformat() if i.meeting_at else None, "status": i.status, "agenda": i.agenda, "materials_summary": i.materials_summary, "minutes": i.minutes, "resolutions": i.resolutions, "questions": i.questions, } for i in items ]) @router.post("", response_model=ApiResponse[dict], status_code=status.HTTP_201_CREATED) async def create_board_meeting( req: dict, db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user), ): """创建董事会会议。""" company_result = await db.execute( select(Company).where(Company.id == req.get("company_id"), Company.tenant_id == user.tenant_id) ) if not company_result.scalar_one_or_none(): raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="企业不存在") meeting = BoardMeeting( company_id=req.get("company_id"), title=req.get("title"), meeting_at=req.get("meeting_at"), agenda=req.get("agenda"), ) db.add(meeting) await db.flush() return success(data={"id": str(meeting.id)}, message="创建成功") @router.post("/{meeting_id}/generate-summary", response_model=ApiResponse[str]) async def generate_meeting_summary_endpoint( meeting_id: str, req: dict, db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user), ): """AI 生成会前材料摘要。""" summary = await generate_meeting_summary(req.get("materials_text", "")) return success(data=summary) @router.post("/{meeting_id}/generate-questions", response_model=ApiResponse[list]) async def generate_questions_endpoint( meeting_id: str, req: dict, db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user), ): """AI 生成提问清单。""" questions = await generate_questions(req.get("materials_text", "")) return success(data=questions)