Initial commit: workspace files including MEMORY.md, skills, and core configs
This commit is contained in:
278
skills/irun-yidianhuo/scripts/api_client.py
Normal file
278
skills/irun-yidianhuo/scripts/api_client.py
Normal file
@@ -0,0 +1,278 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
铱云易订货 OpenAPI 2.0 Python Client
|
||||
用于查询客户、商品、订单、库存、收付款等业务数据
|
||||
"""
|
||||
|
||||
import os
|
||||
import json
|
||||
import time
|
||||
import requests
|
||||
from typing import Optional, Dict, Any, List
|
||||
|
||||
# 默认配置
|
||||
DEFAULT_BASE_URL = "https://openapi.77ircloud.com"
|
||||
DEFAULT_TIMEOUT = 30
|
||||
|
||||
|
||||
class IrunClient:
|
||||
"""铱云易订货 API 客户端"""
|
||||
|
||||
def __init__(self, client_id: str = None, client_secret: str = None,
|
||||
access_token: str = None, base_url: str = DEFAULT_BASE_URL):
|
||||
"""
|
||||
初始化客户端
|
||||
|
||||
Args:
|
||||
client_id: 开发者ID
|
||||
client_secret: 密钥
|
||||
access_token: 访问令牌(可直接传入,跳过授权步骤)
|
||||
base_url: API基础地址
|
||||
"""
|
||||
self.client_id = client_id or os.getenv("IRUN_CLIENT_ID")
|
||||
self.client_secret = client_secret or os.getenv("IRUN_CLIENT_SECRET")
|
||||
self.access_token = access_token or os.getenv("IRUN_ACCESS_TOKEN")
|
||||
self.base_url = base_url
|
||||
self._token_expires_at = 0
|
||||
|
||||
def _get_headers(self) -> Dict[str, str]:
|
||||
"""获取请求头"""
|
||||
return {
|
||||
"Content-Type": "application/json; charset=UTF-8",
|
||||
"access_token": self.access_token,
|
||||
"x-client-id": self.client_id
|
||||
}
|
||||
|
||||
def _request(self, method: str, endpoint: str, params: Dict = None,
|
||||
data: Dict = None) -> Dict[str, Any]:
|
||||
"""
|
||||
发送API请求
|
||||
|
||||
Args:
|
||||
method: 请求方法 (GET, POST, PUT, DELETE)
|
||||
endpoint: API端点
|
||||
params: URL参数
|
||||
data: 请求体数据
|
||||
|
||||
Returns:
|
||||
API响应数据
|
||||
"""
|
||||
url = f"{self.base_url}{endpoint}"
|
||||
headers = self._get_headers()
|
||||
|
||||
try:
|
||||
response = requests.request(
|
||||
method=method,
|
||||
url=url,
|
||||
headers=headers,
|
||||
params=params,
|
||||
json=data,
|
||||
timeout=DEFAULT_TIMEOUT
|
||||
)
|
||||
response.raise_for_status()
|
||||
return response.json()
|
||||
except requests.exceptions.RequestException as e:
|
||||
return {"code": 500, "message": str(e), "data": None}
|
||||
|
||||
def get_token(self) -> Dict[str, Any]:
|
||||
"""
|
||||
获取访问令牌
|
||||
|
||||
Returns:
|
||||
包含access_token的响应
|
||||
"""
|
||||
if not self.client_id or not self.client_secret:
|
||||
return {"code": 400, "message": "缺少 client_id 或 client_secret"}
|
||||
|
||||
url = f"{self.base_url}/oauth/token"
|
||||
data = {
|
||||
"grant_type": "client_credentials",
|
||||
"client_id": self.client_id,
|
||||
"client_secret": self.client_secret
|
||||
}
|
||||
|
||||
try:
|
||||
response = requests.post(url, json=data, timeout=DEFAULT_TIMEOUT)
|
||||
response.raise_for_status()
|
||||
result = response.json()
|
||||
|
||||
if result.get("code") == 200:
|
||||
self.access_token = result["data"]["access_token"]
|
||||
self._token_expires_at = time.time() + result["data"].get("expires_in", 7200)
|
||||
|
||||
return result
|
||||
except requests.exceptions.RequestException as e:
|
||||
return {"code": 500, "message": str(e), "data": None}
|
||||
|
||||
# ==================== 客户管理 ====================
|
||||
|
||||
def get_customer_list(self, page_num: int = 1, page_size: int = 10,
|
||||
name: str = None, category_id: str = None) -> Dict[str, Any]:
|
||||
"""获取客户列表"""
|
||||
params = {"pageNum": page_num, "pageSize": page_size}
|
||||
if name:
|
||||
params["name"] = name
|
||||
if category_id:
|
||||
params["categoryId"] = category_id
|
||||
return self._request("GET", "/openapi/customer/list", params=params)
|
||||
|
||||
def get_customer_detail(self, customer_id: str) -> Dict[str, Any]:
|
||||
"""获取客户详情"""
|
||||
return self._request("GET", f"/openapi/customer/{customer_id}")
|
||||
|
||||
def get_customer_categories(self) -> Dict[str, Any]:
|
||||
"""获取客户分类列表"""
|
||||
return self._request("GET", "/openapi/customer/category/list")
|
||||
|
||||
# ==================== 商品管理 ====================
|
||||
|
||||
def get_product_list(self, page_num: int = 1, page_size: int = 10,
|
||||
name: str = None, category_id: str = None) -> Dict[str, Any]:
|
||||
"""获取商品列表"""
|
||||
params = {"pageNum": page_num, "pageSize": page_size}
|
||||
if name:
|
||||
params["name"] = name
|
||||
if category_id:
|
||||
params["categoryId"] = category_id
|
||||
return self._request("GET", "/openapi/product/list", params=params)
|
||||
|
||||
def get_product_detail(self, product_id: str) -> Dict[str, Any]:
|
||||
"""获取商品详情"""
|
||||
return self._request("GET", f"/openapi/product/{product_id}")
|
||||
|
||||
def get_category_list(self) -> Dict[str, Any]:
|
||||
"""获取商品分类列表"""
|
||||
return self._request("GET", "/openapi/category/list")
|
||||
|
||||
# ==================== 订单管理 ====================
|
||||
|
||||
def get_order_list(self, page_num: int = 1, page_size: int = 10,
|
||||
order_no: str = None, customer_id: str = None,
|
||||
start_time: int = None, end_time: int = None,
|
||||
status: str = None) -> Dict[str, Any]:
|
||||
"""获取订单列表"""
|
||||
params = {"pageNum": page_num, "pageSize": page_size}
|
||||
if order_no:
|
||||
params["orderNo"] = order_no
|
||||
if customer_id:
|
||||
params["customerId"] = customer_id
|
||||
if start_time:
|
||||
params["startTime"] = start_time
|
||||
if end_time:
|
||||
params["endTime"] = end_time
|
||||
if status:
|
||||
params["status"] = status
|
||||
return self._request("GET", "/openapi/order/list", params=params)
|
||||
|
||||
def get_order_detail(self, order_id: str) -> Dict[str, Any]:
|
||||
"""获取订单详情"""
|
||||
return self._request("GET", f"/openapi/order/{order_id}")
|
||||
|
||||
def get_refund_list(self, page_num: int = 1, page_size: int = 10,
|
||||
order_no: str = None, customer_id: str = None,
|
||||
start_time: int = None, end_time: int = None) -> Dict[str, Any]:
|
||||
"""获取退单列表"""
|
||||
params = {"pageNum": page_num, "pageSize": page_size}
|
||||
if order_no:
|
||||
params["orderNo"] = order_no
|
||||
if customer_id:
|
||||
params["customerId"] = customer_id
|
||||
if start_time:
|
||||
params["startTime"] = start_time
|
||||
if end_time:
|
||||
params["endTime"] = end_time
|
||||
return self._request("GET", "/openapi/refund/list", params=params)
|
||||
|
||||
def get_refund_detail(self, refund_id: str) -> Dict[str, Any]:
|
||||
"""获取退单详情"""
|
||||
return self._request("GET", f"/openapi/refund/{refund_id}")
|
||||
|
||||
# ==================== 进销存 ====================
|
||||
|
||||
def get_inventory_list(self, warehouse_id: str = None,
|
||||
product_id: str = None) -> Dict[str, Any]:
|
||||
"""查询库存列表"""
|
||||
params = {}
|
||||
if warehouse_id:
|
||||
params["warehouseId"] = warehouse_id
|
||||
if product_id:
|
||||
params["productId"] = product_id
|
||||
return self._request("GET", "/openapi/inventory/list", params=params)
|
||||
|
||||
def get_warehouse_list(self) -> Dict[str, Any]:
|
||||
"""获取仓库列表"""
|
||||
return self._request("GET", "/openapi/warehouse/list")
|
||||
|
||||
def get_storage_list(self, storage_type: str = None,
|
||||
start_time: int = None, end_time: int = None) -> Dict[str, Any]:
|
||||
"""获取出入库记录"""
|
||||
params = {}
|
||||
if storage_type:
|
||||
params["type"] = storage_type
|
||||
if start_time:
|
||||
params["startTime"] = start_time
|
||||
if end_time:
|
||||
params["endTime"] = end_time
|
||||
return self._request("GET", "/openapi/storage/list", params=params)
|
||||
|
||||
# ==================== 资金管理 ====================
|
||||
|
||||
def get_payment_list(self, page_num: int = 1, page_size: int = 10,
|
||||
payment_type: str = None, start_time: int = None,
|
||||
end_time: int = None) -> Dict[str, Any]:
|
||||
"""获取收付款记录"""
|
||||
params = {"pageNum": page_num, "pageSize": page_size}
|
||||
if payment_type:
|
||||
params["type"] = payment_type
|
||||
if start_time:
|
||||
params["startTime"] = start_time
|
||||
if end_time:
|
||||
params["endTime"] = end_time
|
||||
return self._request("GET", "/openapi/payment/list", params=params)
|
||||
|
||||
# ==================== 基础数据 ====================
|
||||
|
||||
def get_employee_list(self) -> Dict[str, Any]:
|
||||
"""获取员工列表"""
|
||||
return self._request("GET", "/openapi/employee/list")
|
||||
|
||||
def get_area_list(self) -> Dict[str, Any]:
|
||||
"""获取省市数据"""
|
||||
return self._request("GET", "/openapi/area/province")
|
||||
|
||||
def get_logistics_company_list(self) -> Dict[str, Any]:
|
||||
"""获取物流公司列表"""
|
||||
return self._request("GET", "/openapi/logistics/company")
|
||||
|
||||
|
||||
# ==================== 便捷函数 ====================
|
||||
|
||||
def create_client(client_id: str = None, client_secret: str = None,
|
||||
access_token: str = None) -> IrunClient:
|
||||
"""创建API客户端"""
|
||||
return IrunClient(client_id, client_secret, access_token)
|
||||
|
||||
|
||||
def get_timestamp(days_ago: int = 0) -> int:
|
||||
"""获取时间戳"""
|
||||
import datetime
|
||||
return int((datetime.datetime.now() - datetime.timedelta(days=days_ago)).timestamp() * 1000)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 示例用法
|
||||
client = IrunClient()
|
||||
|
||||
# 获取Token
|
||||
# result = client.get_token()
|
||||
# print(result)
|
||||
|
||||
# 查询客户
|
||||
# result = client.get_customer_list(page_num=1, page_size=10)
|
||||
# print(result)
|
||||
|
||||
# 查询订单
|
||||
# result = client.get_order_list(start_time=get_timestamp(30))
|
||||
# print(result)
|
||||
|
||||
print("铱云易订货 API 客户端示例")
|
||||
Reference in New Issue
Block a user