from fastapi import APIRouter, Depends, Query from sqlalchemy.ext.asyncio import AsyncSession from pydantic import BaseModel from app.database import get_db from app.services.message_service import ( get_conversations, get_messages, send_and_save, save_messages, WECHAT_ERROR_MAP, ) from app.services.wechat_client import sync_msg, list_accounts from app.config import settings router = APIRouter(prefix="/api") class SendMsgRequest(BaseModel): external_userid: str content: str open_kfid: str = "" class SyncRequest(BaseModel): cursor: str = "" token: str = "" limit: int = 100 open_kfid: str = "" @router.get("/conversations") async def list_conversations( open_kfid: str = Query(""), db: AsyncSession = Depends(get_db), ): """获取会话列表""" conversations = await get_conversations(db, open_kfid) return {"conversations": conversations} @router.get("/messages") async def list_messages( external_userid: str = Query(...), open_kfid: str = Query(""), page: int = Query(1, ge=1), page_size: int = Query(50, ge=1, le=200), db: AsyncSession = Depends(get_db), ): """获取某客户的消息列表""" messages = await get_messages(db, external_userid, open_kfid, page, page_size) return {"messages": messages} @router.post("/send") async def send_message( req: SendMsgRequest, db: AsyncSession = Depends(get_db), ): """发送消息""" result = await send_and_save(db, req.external_userid, req.content, req.open_kfid) errcode = result.get("errcode", -1) return { **result, "errmsg_cn": WECHAT_ERROR_MAP.get(errcode, result.get("errmsg", "")), } @router.post("/sync") async def sync_messages( req: SyncRequest, db: AsyncSession = Depends(get_db), ): """手动拉取消息(轮询模式)""" kfid = req.open_kfid or settings.open_kfid result = await sync_msg(kfid, req.cursor, req.token, req.limit) msg_list = result.get("msg_list", []) saved = 0 if msg_list: saved = await save_messages(db, msg_list) errcode = result.get("errcode", -1) return { **result, "saved": saved, "total": len(msg_list), "errmsg_cn": WECHAT_ERROR_MAP.get(errcode, result.get("errmsg", "")), } @router.get("/accounts") async def get_accounts(): """获取客服账号列表(用于查看正确的 open_kfid)""" result = await list_accounts() return result