100 lines
3.6 KiB
Python
100 lines
3.6 KiB
Python
"""草稿/调仓/发送路由(业务在 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(20, 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))
|