Files
wecom-ai-assistant/backend/app/routers/tickets.py
2026-02-05 16:36:32 +08:00

68 lines
2.1 KiB
Python

"""工单转人工:创建工单入库、手动回复调企业微信 API。"""
import logging
from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.database import get_db
from app.deps import get_current_user_id
from app.logging_config import get_trace_id
from app.models import ChatSession, Ticket
from app.services.wecom_api import send_text_to_external
logger = logging.getLogger(__name__)
router = APIRouter()
class CreateTicketBody(BaseModel):
session_id: int
reason: str = ""
class SendReplyBody(BaseModel):
session_id: int
content: str
@router.post("")
async def create_ticket(
body: CreateTicketBody,
db: AsyncSession = Depends(get_db),
_user: str = Depends(get_current_user_id),
):
"""创建转人工工单并更新会话状态。"""
r = await db.execute(select(ChatSession).where(ChatSession.id == body.session_id))
session = r.scalar_one_or_none()
if not session:
raise HTTPException(status_code=404, detail="会话不存在")
ticket = Ticket(session_id=body.session_id, reason=body.reason or None)
db.add(ticket)
session.status = "transferred"
await db.flush()
return {
"code": 0,
"message": "ok",
"data": {"ticket_id": str(ticket.id)},
"trace_id": get_trace_id(),
}
@router.post("/reply")
async def send_reply(
body: SendReplyBody,
db: AsyncSession = Depends(get_db),
_user: str = Depends(get_current_user_id),
):
"""手动回复:通过企业微信 API 发给客户。"""
r = await db.execute(select(ChatSession).where(ChatSession.id == body.session_id))
session = r.scalar_one_or_none()
if not session:
raise HTTPException(status_code=404, detail="会话不存在")
try:
await send_text_to_external(session.external_user_id, body.content)
except Exception as e:
logger.exception("wecom send reply failed")
raise HTTPException(status_code=502, detail=str(e))
return {"code": 0, "message": "ok", "data": None, "trace_id": get_trace_id()}