新增 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: 类型定义
179 lines
6.2 KiB
Python
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}
|