68 lines
2.1 KiB
Python
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()}
|