"""草稿/调仓/发送路由(业务在 service/advisor/drafts.py,路由只做编排 + 透传 JWT/trace_id)。""" from fastapi import APIRouter, Depends, Query, Request from sqlalchemy.ext.asyncio import AsyncSession from api.advisor._auth import extract_auth from api.deps import require_advisor from config.deps import get_db from model.sys_user import SysUser from schemas.advisor import DraftSaveReq, RebalanceRunReq, TalkScriptReq from service.advisor import drafts as drafts_service from utils.response import success router = APIRouter() @router.get("/drafts", summary="草稿列表(代理 Agent draft/list)") async def list_drafts( request: Request, customer_id: int | None = Query(None), status: str | None = Query(None, max_length=16), page: int = Query(1, ge=1), page_size: int = Query(10, ge=1, le=100), user: SysUser = Depends(require_advisor), db: AsyncSession = Depends(get_db), ): auth, trace_id = extract_auth(request) return success( await drafts_service.list_drafts( db, user, auth_header=auth, trace_id=trace_id, customer_id=customer_id, status=status, page=page, page_size=page_size, ) ) @router.get("/drafts/{draft_id}", summary="草稿详情(代理 Agent draft/{id})") async def get_draft( draft_id: str, request: Request, user: SysUser = Depends(require_advisor), db: AsyncSession = Depends(get_db), ): auth, trace_id = extract_auth(request) return success(await drafts_service.get_draft(db, user, auth_header=auth, trace_id=trace_id, draft_id=draft_id)) @router.put("/drafts/{draft_id}/save", summary="编辑保存(代理 Agent + 本地镜像快照)") async def save_draft( draft_id: str, req: DraftSaveReq, request: Request, user: SysUser = Depends(require_advisor), db: AsyncSession = Depends(get_db), ): auth, trace_id = extract_auth(request) return success(await drafts_service.save_draft(db, user, auth_header=auth, trace_id=trace_id, draft_id=draft_id, req=req)) @router.post("/drafts/{draft_id}/discard", summary="废弃草稿(回写 Agent)") async def discard_draft( draft_id: str, request: Request, user: SysUser = Depends(require_advisor), db: AsyncSession = Depends(get_db), ): auth, trace_id = extract_auth(request) return success(await drafts_service.discard_draft(db, user, auth_header=auth, trace_id=trace_id, draft_id=draft_id)) @router.post("/drafts/{draft_id}/send", summary="发送终审 + 手动发送(工作台本地)") async def send_draft( draft_id: str, request: Request, user: SysUser = Depends(require_advisor), db: AsyncSession = Depends(get_db), ): auth, trace_id = extract_auth(request) return success(await drafts_service.send_draft(db, user, auth_header=auth, trace_id=trace_id, draft_id=draft_id)) @router.post("/rebalance/run", summary="手动触发调仓再平衡(异步受理)") async def run_rebalance( req: RebalanceRunReq, request: Request, user: SysUser = Depends(require_advisor), db: AsyncSession = Depends(get_db), ): auth, trace_id = extract_auth(request) return success(await drafts_service.run_rebalance(db, user, auth_header=auth, trace_id=trace_id, req=req)) @router.post("/talk-script", summary="生成沟通话术草稿(同步,超时降级)") async def talk_script( req: TalkScriptReq, request: Request, user: SysUser = Depends(require_advisor), db: AsyncSession = Depends(get_db), ): auth, trace_id = extract_auth(request) return success(await drafts_service.generate_talk_script(db, user, auth_header=auth, trace_id=trace_id, req=req))