ForcePilot/backend/package/yuxi/channel/extensions/lazada/tools.py
Kris d523babb91 feat(channel): 添加 Lazada 渠道扩展
新增 Lazada 渠道扩展,支持在 Yuxi 平台中集成 Lazada 电商客服渠道。

包含以下功能模块:
- client: Lazada API 客户端封装
- config: 渠道配置管理
- gateway: SSE/WebSocket 网关接入
- webhook: Webhook 事件处理
- outbound: 外发消息管理
- pairing: 用户配对与绑定
- security: 安全校验
- signature: 请求签名验证
- dedupe: 消息去重
- monitor: 渠道状态监控
- status: 会话状态管理
- session: 会话管理
- tools: Agent 工具集成
- tools_config: 工具配置
- types: 类型定义
2026-05-21 11:13:39 +08:00

179 lines
6.2 KiB
Python

from __future__ import annotations
import logging
from typing import Any
from .client import LazadaAPIClient, LazadaAPIError
logger = logging.getLogger(__name__)
class LazadaTools:
def __init__(self, client: LazadaAPIClient):
self._client = client
async def query_order(self, order_id: str) -> dict[str, Any]:
try:
resp = await self._client.call(
"/order/get",
params={"order_id": order_id},
)
data = resp.get("data", {})
return {
"success": True,
"order_id": order_id,
"status": data.get("statuses", [""])[-1] if data.get("statuses") else "unknown",
"items": data.get("order_items", []),
"total": data.get("price", ""),
"currency": data.get("currency", ""),
"raw": data,
}
except LazadaAPIError as e:
return {"success": False, "error": str(e), "error_code": e.code}
async def query_product(self, item_id: str) -> dict[str, Any]:
try:
resp = await self._client.call(
"/product/item/get",
params={"item_id": item_id},
)
data = resp.get("data", {})
return {
"success": True,
"item_id": item_id,
"title": data.get("attributes", {}).get("name", ""),
"price": data.get("skus", [{}])[0].get("price", "") if data.get("skus") else "",
"stock": data.get("skus", [{}])[0].get("quantity", 0) if data.get("skus") else 0,
"raw": data,
}
except LazadaAPIError as e:
return {"success": False, "error": str(e), "error_code": e.code}
async def query_logistics(self, order_id: str) -> dict[str, Any]:
try:
resp = await self._client.call(
"/logistic/order/trace",
params={"order_id": order_id},
)
data = resp.get("data", {})
trace_list = data.get("trace_list", [])
return {
"success": True,
"order_id": order_id,
"tracking_number": data.get("tracking_number", ""),
"status": data.get("status", "unknown"),
"details": [
{
"time": t.get("time", ""),
"status": t.get("status", ""),
"location": t.get("location", ""),
"description": t.get("description", ""),
}
for t in trace_list
],
"raw": data,
}
except LazadaAPIError as e:
return {"success": False, "error": str(e), "error_code": e.code}
async def get_session_list(self) -> list[dict[str, Any]]:
try:
resp = await self._client.call(
"/im/session/list",
params={"page_size": "20"},
)
return resp.get("data", {}).get("sessions", [])
except LazadaAPIError:
return []
async def get_messages(
self,
session_id: str,
last_message_id: str | None = None,
start_time: str | None = None,
page_size: int = 20,
) -> list[dict[str, Any]]:
try:
params = {
"session_id": session_id,
"page_size": str(page_size),
}
if last_message_id:
params["last_message_id"] = last_message_id
if start_time:
params["start_time"] = start_time
resp = await self._client.call(
"/im/message/list",
params=params,
)
return resp.get("data", {}).get("messages", [])
except LazadaAPIError:
return []
async def query_orders(
self,
status: str | None = None,
update_after: str | None = None,
limit: int = 20,
) -> list[dict[str, Any]]:
try:
params: dict[str, str] = {"limit": str(limit)}
if status:
params["status"] = status
if update_after:
params["update_after"] = update_after
resp = await self._client.call("/orders/get", params=params)
orders = resp.get("data", {}).get("orders", [])
return [
{
"order_id": o.get("order_id", ""),
"status": o.get("statuses", [""])[-1] if o.get("statuses") else "unknown",
"price": o.get("price", ""),
"currency": o.get("currency", ""),
"item_count": o.get("items_count", 0),
"created_at": o.get("created_at", ""),
"raw": o,
}
for o in orders
]
except LazadaAPIError:
return []
async def query_order_items(self, order_id: str) -> list[dict[str, Any]]:
try:
resp = await self._client.call(
"/order/items/get",
params={"order_id": order_id},
)
items = resp.get("data", [])
return [
{
"order_item_id": it.get("order_item_id", ""),
"item_id": it.get("item_id", ""),
"name": it.get("name", ""),
"sku": it.get("sku", ""),
"price": it.get("item_price", ""),
"quantity": it.get("quantity", 0),
"raw": it,
}
for it in items
]
except LazadaAPIError:
return []
async def query_seller(self) -> dict[str, Any]:
try:
resp = await self._client.call("/seller/get")
data = resp.get("data", {})
return {
"success": True,
"seller_id": data.get("seller_id", ""),
"name": data.get("name", ""),
"status": data.get("status", ""),
"email": data.get("email", ""),
"raw": data,
}
except LazadaAPIError as e:
return {"success": False, "error": str(e), "error_code": e.code}