forked from erp-dev/erp
feat: refactor flower.utils to sub package, added some sync api in package, added plate_order sync result model but relation of plate_order was not query (do it next step)
This commit is contained in:
109
flower/utils/mingdaoyun/client.py
Normal file
109
flower/utils/mingdaoyun/client.py
Normal file
@@ -0,0 +1,109 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from enum import Enum
|
||||
from typing import Any, Dict, Optional
|
||||
|
||||
import aiohttp
|
||||
|
||||
# 明道云开放接口:基础配置
|
||||
MDY_BASE_URL = "https://api.mingdao.com"
|
||||
MDY_ENDPOINT_GET_FILTER_ROWS = "/v2/open/worksheet/getFilterRows"
|
||||
|
||||
# NOTE:
|
||||
# - 目前项目里 appKey/sign 仍是硬编码(与现有同步代码保持一致)
|
||||
# - 后续如果要做多环境/更安全配置,建议迁移到环境变量或 Django settings
|
||||
MDY_APP_KEY = "208e55fea5cea59f"
|
||||
MDY_SIGN = "MWU0YmViYjkwZmM1ZDIzYzRiN2U3ZGQ4MmE4ZGNkMjc0MWM1ZmQ2ZjkwMjljODE4YmNkZTBhMzA0OTU2YzE2NA=="
|
||||
|
||||
|
||||
class HTTPMethod(Enum):
|
||||
"""HTTP 请求方法枚举"""
|
||||
|
||||
GET = "GET"
|
||||
POST = "POST"
|
||||
|
||||
|
||||
class MingDaoYunClient:
|
||||
"""明道云 API 客户端(异步)"""
|
||||
|
||||
def __init__(self, app_key: str, sign: str, base_url: str = MDY_BASE_URL):
|
||||
self.app_key = app_key
|
||||
self.sign = sign
|
||||
self.base_url = base_url
|
||||
|
||||
async def request(
|
||||
self,
|
||||
method: HTTPMethod,
|
||||
endpoint: str,
|
||||
data: Optional[Dict[str, Any]] = None,
|
||||
params: Optional[Dict[str, Any]] = None,
|
||||
headers: Optional[Dict[str, str]] = None,
|
||||
) -> Any:
|
||||
"""通用异步请求函数"""
|
||||
|
||||
url = f"{self.base_url}{endpoint}"
|
||||
|
||||
default_headers: Dict[str, str] = {
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
if headers:
|
||||
default_headers.update(headers)
|
||||
|
||||
# 添加认证参数
|
||||
auth_params = {
|
||||
"appKey": self.app_key,
|
||||
"sign": self.sign,
|
||||
}
|
||||
|
||||
async with aiohttp.ClientSession(headers=default_headers) as session:
|
||||
if method == HTTPMethod.GET:
|
||||
async with session.get(url, params=params, json=auth_params) as response:
|
||||
response.raise_for_status()
|
||||
return await response.json()
|
||||
|
||||
if method == HTTPMethod.POST:
|
||||
payload: Dict[str, Any] = dict(data or {})
|
||||
payload.update(auth_params)
|
||||
async with session.post(url, json=payload) as response:
|
||||
response.raise_for_status()
|
||||
return await response.json()
|
||||
|
||||
raise ValueError(f"Unsupported HTTP method: {method}")
|
||||
|
||||
async def get(
|
||||
self,
|
||||
endpoint: str,
|
||||
params: Optional[Dict[str, Any]] = None,
|
||||
headers: Optional[Dict[str, str]] = None,
|
||||
) -> Any:
|
||||
"""发送 GET 请求"""
|
||||
|
||||
return await self.request(
|
||||
method=HTTPMethod.GET,
|
||||
endpoint=endpoint,
|
||||
params=params,
|
||||
headers=headers,
|
||||
)
|
||||
|
||||
async def post(
|
||||
self,
|
||||
endpoint: str,
|
||||
data: Optional[Dict[str, Any]] = None,
|
||||
params: Optional[Dict[str, Any]] = None,
|
||||
headers: Optional[Dict[str, str]] = None,
|
||||
) -> Any:
|
||||
"""发送 POST 请求"""
|
||||
|
||||
return await self.request(
|
||||
method=HTTPMethod.POST,
|
||||
endpoint=endpoint,
|
||||
data=data,
|
||||
params=params,
|
||||
headers=headers,
|
||||
)
|
||||
|
||||
|
||||
def get_default_mingdaoyun_client(base_url: str = MDY_BASE_URL) -> MingDaoYunClient:
|
||||
"""获取默认配置的明道云客户端(复用项目现有 appKey/sign)"""
|
||||
|
||||
return MingDaoYunClient(app_key=MDY_APP_KEY, sign=MDY_SIGN, base_url=base_url)
|
||||
Reference in New Issue
Block a user