Initial commit: workspace files including MEMORY.md, skills, and core configs

This commit is contained in:
2026-04-03 19:13:29 +08:00
commit 73ed53d531
33 changed files with 2443 additions and 0 deletions

View 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 客户端示例")