pixelarraythirdparty 1.0.3__py3-none-any.whl → 1.0.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pixelarraythirdparty/__init__.py +1 -1
- pixelarraythirdparty/celery/celery.py +119 -0
- pixelarraythirdparty/client.py +25 -0
- pixelarraythirdparty/order/order.py +552 -1
- pixelarraythirdparty/product/product.py +183 -0
- pixelarraythirdparty/user/user.py +158 -0
- {pixelarraythirdparty-1.0.3.dist-info → pixelarraythirdparty-1.0.5.dist-info}/METADATA +1 -1
- pixelarraythirdparty-1.0.5.dist-info/RECORD +15 -0
- pixelarraythirdparty-1.0.3.dist-info/RECORD +0 -15
- {pixelarraythirdparty-1.0.3.dist-info → pixelarraythirdparty-1.0.5.dist-info}/WHEEL +0 -0
- {pixelarraythirdparty-1.0.3.dist-info → pixelarraythirdparty-1.0.5.dist-info}/licenses/LICENSE +0 -0
- {pixelarraythirdparty-1.0.3.dist-info → pixelarraythirdparty-1.0.5.dist-info}/top_level.txt +0 -0
pixelarraythirdparty/__init__.py
CHANGED
|
@@ -3,30 +3,149 @@ from pixelarraythirdparty.client import Client
|
|
|
3
3
|
|
|
4
4
|
class CeleryManager(Client):
|
|
5
5
|
def get_celery_status(self):
|
|
6
|
+
"""
|
|
7
|
+
获取Celery服务状态
|
|
8
|
+
|
|
9
|
+
功能说明:
|
|
10
|
+
获取Celery服务的运行状态,包括已注册的任务、工作节点状态等。
|
|
11
|
+
|
|
12
|
+
输入参数:
|
|
13
|
+
无
|
|
14
|
+
|
|
15
|
+
返回字段:
|
|
16
|
+
data (dict): Celery服务状态信息
|
|
17
|
+
- registered_tasks (dict): 已注册的任务列表,按工作节点分组
|
|
18
|
+
- worker_stats (dict): 工作节点统计信息
|
|
19
|
+
- scheduled_task_count (int): 定时任务数量
|
|
20
|
+
- timestamp (str): 状态获取时间
|
|
21
|
+
success (bool): 操作是否成功
|
|
22
|
+
|
|
23
|
+
异常情况:
|
|
24
|
+
- 获取Celery状态失败:返回错误信息"获取Celery状态失败"
|
|
25
|
+
"""
|
|
6
26
|
data, success = self._request("GET", "/api/celery/status")
|
|
7
27
|
if not success:
|
|
8
28
|
return {}, False
|
|
9
29
|
return data, True
|
|
10
30
|
|
|
11
31
|
def get_celery_tasks(self):
|
|
32
|
+
"""
|
|
33
|
+
获取已注册任务列表
|
|
34
|
+
|
|
35
|
+
功能说明:
|
|
36
|
+
获取所有已注册的Celery任务列表。
|
|
37
|
+
|
|
38
|
+
输入参数:
|
|
39
|
+
无
|
|
40
|
+
|
|
41
|
+
返回字段:
|
|
42
|
+
data (dict): 任务列表信息
|
|
43
|
+
- tasks (list): 已注册的任务名称列表
|
|
44
|
+
- count (int): 任务数量
|
|
45
|
+
- timestamp (str): 获取时间
|
|
46
|
+
success (bool): 操作是否成功
|
|
47
|
+
|
|
48
|
+
异常情况:
|
|
49
|
+
- 获取任务列表失败:返回错误信息"获取任务列表失败"
|
|
50
|
+
"""
|
|
12
51
|
data, success = self._request("GET", "/api/celery/tasks")
|
|
13
52
|
if not success:
|
|
14
53
|
return {}, False
|
|
15
54
|
return data, True
|
|
16
55
|
|
|
17
56
|
def get_celery_tasks_scheduled(self):
|
|
57
|
+
"""
|
|
58
|
+
获取定时任务列表
|
|
59
|
+
|
|
60
|
+
功能说明:
|
|
61
|
+
获取所有配置的定时任务列表,包括任务详情、执行时间、状态等。
|
|
62
|
+
|
|
63
|
+
输入参数:
|
|
64
|
+
无
|
|
65
|
+
|
|
66
|
+
返回字段:
|
|
67
|
+
data (dict): 定时任务列表信息
|
|
68
|
+
- tasks (list): 定时任务列表
|
|
69
|
+
- id (str): 任务ID
|
|
70
|
+
- name (str): 任务名称
|
|
71
|
+
- description (str): 任务描述
|
|
72
|
+
- schedule (str): 执行时间
|
|
73
|
+
- enabled (bool): 是否启用
|
|
74
|
+
- task_name (str): 任务函数名
|
|
75
|
+
- module_name (str): 模块名
|
|
76
|
+
- function_name (str): 函数名
|
|
77
|
+
- file_path (str): 文件路径
|
|
78
|
+
- parameters (list): 参数列表
|
|
79
|
+
- task_config (dict): 任务配置
|
|
80
|
+
- registration_info (dict): 注册信息
|
|
81
|
+
- count (int): 任务数量
|
|
82
|
+
- timestamp (str): 获取时间
|
|
83
|
+
success (bool): 操作是否成功
|
|
84
|
+
|
|
85
|
+
异常情况:
|
|
86
|
+
- 获取定时任务列表失败:返回错误信息"获取定时任务列表失败"
|
|
87
|
+
"""
|
|
18
88
|
data, success = self._request("GET", "/api/celery/tasks/scheduled")
|
|
19
89
|
if not success:
|
|
20
90
|
return {}, False
|
|
21
91
|
return data, True
|
|
22
92
|
|
|
23
93
|
def get_celery_tasks_detail(self, task_name: str):
|
|
94
|
+
"""
|
|
95
|
+
获取任务详情
|
|
96
|
+
|
|
97
|
+
功能说明:
|
|
98
|
+
根据任务名称获取指定任务的详细信息。
|
|
99
|
+
|
|
100
|
+
输入参数:
|
|
101
|
+
task_name (str): 任务名称,必填,需要URL编码
|
|
102
|
+
|
|
103
|
+
返回字段:
|
|
104
|
+
data (dict): 任务详细信息
|
|
105
|
+
- task_name (str): 任务名称
|
|
106
|
+
- module_name (str): 模块名
|
|
107
|
+
- function_name (str): 函数名
|
|
108
|
+
- file_path (str): 文件路径
|
|
109
|
+
- description (str): 任务描述
|
|
110
|
+
- parameters (list): 参数列表
|
|
111
|
+
- task_config (dict): 任务配置
|
|
112
|
+
- registration_info (dict): 注册信息
|
|
113
|
+
- timestamp (str): 获取时间
|
|
114
|
+
success (bool): 操作是否成功
|
|
115
|
+
|
|
116
|
+
异常情况:
|
|
117
|
+
- 任务不存在:返回错误信息"任务不存在"
|
|
118
|
+
- 获取任务详情失败:返回错误信息"获取任务详情失败"
|
|
119
|
+
"""
|
|
24
120
|
data, success = self._request("GET", f"/api/celery/tasks/{task_name}")
|
|
25
121
|
if not success:
|
|
26
122
|
return {}, False
|
|
27
123
|
return data, True
|
|
28
124
|
|
|
29
125
|
def trigger_celery_task(self, task_name: str, args: list, kwargs: dict):
|
|
126
|
+
"""
|
|
127
|
+
触发任务执行
|
|
128
|
+
|
|
129
|
+
功能说明:
|
|
130
|
+
手动触发指定任务的执行,支持传递参数。
|
|
131
|
+
|
|
132
|
+
输入参数:
|
|
133
|
+
task_name (str): 任务名称,必填,需要URL编码
|
|
134
|
+
args (list): 任务参数列表,可选
|
|
135
|
+
kwargs (dict): 任务关键字参数,可选
|
|
136
|
+
|
|
137
|
+
返回字段:
|
|
138
|
+
data (dict): 任务触发信息
|
|
139
|
+
- task_id (str): 任务ID
|
|
140
|
+
- task_name (str): 任务名称
|
|
141
|
+
- status (str): 任务状态,初始为"PENDING"
|
|
142
|
+
- message (str): 触发消息
|
|
143
|
+
success (bool): 操作是否成功
|
|
144
|
+
|
|
145
|
+
异常情况:
|
|
146
|
+
- 任务不存在:返回错误信息"任务不存在"
|
|
147
|
+
- 任务触发失败:返回错误信息"任务触发失败"
|
|
148
|
+
"""
|
|
30
149
|
data, success = self._request(
|
|
31
150
|
"POST",
|
|
32
151
|
f"/api/celery/tasks/{task_name}/trigger",
|
pixelarraythirdparty/client.py
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import requests
|
|
2
|
+
import aiohttp
|
|
2
3
|
from typing import Dict, Any, Optional, Tuple
|
|
4
|
+
import asyncio
|
|
3
5
|
|
|
4
6
|
|
|
5
7
|
class Client:
|
|
6
8
|
"""基础认证类,提供公共的 API key 认证和请求方法"""
|
|
9
|
+
|
|
7
10
|
def __init__(self, api_key: str):
|
|
8
11
|
self.base_url = "https://thirdparty.pixelarrayai.com"
|
|
9
12
|
self.api_key = api_key
|
|
@@ -20,3 +23,25 @@ class Client:
|
|
|
20
23
|
if resp.status_code == 200 and resp.json().get("success") is True:
|
|
21
24
|
return resp.json().get("data", {}), True
|
|
22
25
|
return {}, False
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class AsyncClient:
|
|
29
|
+
def __init__(self, api_key: str):
|
|
30
|
+
self.base_url = "https://thirdparty.pixelarrayai.com"
|
|
31
|
+
self.api_key = api_key
|
|
32
|
+
self.headers = {
|
|
33
|
+
"Content-Type": "application/json",
|
|
34
|
+
"X-API-Key": self.api_key,
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async def _request(self, method: str, url: str, **kwargs) -> Tuple[Dict[str, Any], bool]:
|
|
38
|
+
async with aiohttp.ClientSession() as session:
|
|
39
|
+
req_method = getattr(session, method.lower())
|
|
40
|
+
async with req_method(
|
|
41
|
+
f"{self.base_url}{url}", headers=self.headers, **kwargs
|
|
42
|
+
) as resp:
|
|
43
|
+
if resp.status == 200:
|
|
44
|
+
result = await resp.json()
|
|
45
|
+
if result.get("success") is True:
|
|
46
|
+
return result.get("data", {}), True
|
|
47
|
+
return {}, False
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from pixelarraythirdparty.client import Client
|
|
1
|
+
from pixelarraythirdparty.client import Client, AsyncClient
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
class OrderManager(Client):
|
|
@@ -9,6 +9,39 @@ class OrderManager(Client):
|
|
|
9
9
|
remark: str = None,
|
|
10
10
|
payment_channel: str = "WECHAT",
|
|
11
11
|
):
|
|
12
|
+
"""
|
|
13
|
+
创建订单
|
|
14
|
+
|
|
15
|
+
功能说明:
|
|
16
|
+
根据产品ID创建新的订单,系统会自动生成订单号,获取产品价格信息,并创建对应的支付订单。
|
|
17
|
+
|
|
18
|
+
输入参数:
|
|
19
|
+
product_id (str): 产品ID,必填,用于获取产品信息和价格
|
|
20
|
+
body (str, 可选): 商品描述,如果不提供则使用产品名称
|
|
21
|
+
remark (str, 可选): 订单备注信息
|
|
22
|
+
payment_channel (str, 可选): 支付渠道,默认为"WECHAT"(微信支付)
|
|
23
|
+
|
|
24
|
+
返回字段:
|
|
25
|
+
data (dict): 订单信息
|
|
26
|
+
- id (int): 订单ID
|
|
27
|
+
- out_trade_no (str): 商户订单号,格式为"ORD_时间戳_随机字符串"
|
|
28
|
+
- payment_status (str): 支付状态,初始为"PENDING"(待支付)
|
|
29
|
+
- payment_channel (str): 支付渠道
|
|
30
|
+
- product_id (str): 产品ID
|
|
31
|
+
- amount (str): 订单金额(元),格式为"99.00"
|
|
32
|
+
- total_fee (int): 订单金额(分),用于支付接口
|
|
33
|
+
- body (str): 商品描述
|
|
34
|
+
- remark (str): 订单备注
|
|
35
|
+
- created_at (str): 订单创建时间
|
|
36
|
+
- updated_at (str): 订单更新时间
|
|
37
|
+
success (bool): 操作是否成功
|
|
38
|
+
|
|
39
|
+
异常情况:
|
|
40
|
+
- 产品ID为空:返回错误信息"产品ID不能为空"
|
|
41
|
+
- 产品不存在:返回错误信息"产品不存在"
|
|
42
|
+
- 产品价格无效:返回错误信息"产品价格无效"
|
|
43
|
+
- 创建订单失败:返回错误信息"创建订单失败"
|
|
44
|
+
"""
|
|
12
45
|
data = {
|
|
13
46
|
"product_id": product_id,
|
|
14
47
|
"body": body,
|
|
@@ -27,6 +60,41 @@ class OrderManager(Client):
|
|
|
27
60
|
payment_status: str = None,
|
|
28
61
|
out_trade_no: str = None,
|
|
29
62
|
):
|
|
63
|
+
"""
|
|
64
|
+
获取订单列表
|
|
65
|
+
|
|
66
|
+
功能说明:
|
|
67
|
+
分页查询订单列表,支持按支付状态和订单号进行筛选。
|
|
68
|
+
|
|
69
|
+
输入参数:
|
|
70
|
+
page (int, 可选): 页码,默认为1,最小值为1
|
|
71
|
+
page_size (int, 可选): 每页数量,默认为10,范围为1-1000
|
|
72
|
+
payment_status (str, 可选): 支付状态筛选,可选值:
|
|
73
|
+
- "PENDING": 待支付
|
|
74
|
+
- "PAID": 已支付
|
|
75
|
+
- "REFUNDED": 已退款
|
|
76
|
+
- "CANCELLED": 已取消
|
|
77
|
+
out_trade_no (str, 可选): 订单号搜索,支持模糊匹配
|
|
78
|
+
|
|
79
|
+
返回字段:
|
|
80
|
+
data (dict): 订单列表信息
|
|
81
|
+
- orders (list): 订单列表
|
|
82
|
+
- id (int): 订单ID
|
|
83
|
+
- out_trade_no (str): 商户订单号
|
|
84
|
+
- payment_status (str): 支付状态
|
|
85
|
+
- payment_channel (str): 支付渠道
|
|
86
|
+
- amount (str): 订单金额(元)
|
|
87
|
+
- total_fee (int): 订单金额(分)
|
|
88
|
+
- created_at (str): 订单创建时间
|
|
89
|
+
- updated_at (str): 订单更新时间
|
|
90
|
+
- total (int): 总订单数量
|
|
91
|
+
- page (int): 当前页码
|
|
92
|
+
- page_size (int): 每页数量
|
|
93
|
+
success (bool): 操作是否成功
|
|
94
|
+
|
|
95
|
+
异常情况:
|
|
96
|
+
- 获取订单列表失败:返回错误信息"获取订单列表失败"
|
|
97
|
+
"""
|
|
30
98
|
params = {
|
|
31
99
|
"page": page,
|
|
32
100
|
"page_size": page_size,
|
|
@@ -39,6 +107,41 @@ class OrderManager(Client):
|
|
|
39
107
|
return data, True
|
|
40
108
|
|
|
41
109
|
def get_order_detail(self, out_trade_no: str):
|
|
110
|
+
"""
|
|
111
|
+
获取订单详情
|
|
112
|
+
|
|
113
|
+
功能说明:
|
|
114
|
+
根据订单号获取订单的详细信息,包括支付状态、交易信息等。
|
|
115
|
+
|
|
116
|
+
输入参数:
|
|
117
|
+
out_trade_no (str): 商户订单号,必填
|
|
118
|
+
|
|
119
|
+
返回字段:
|
|
120
|
+
data (dict): 订单详细信息
|
|
121
|
+
- id (int): 订单ID
|
|
122
|
+
- out_trade_no (str): 商户订单号
|
|
123
|
+
- payment_status (str): 支付状态
|
|
124
|
+
- product_id (str): 产品ID
|
|
125
|
+
- amount (str): 订单金额(元)
|
|
126
|
+
- total_fee (int): 订单金额(分)
|
|
127
|
+
- body (str): 商品描述
|
|
128
|
+
- transaction_id (str): 微信交易号(支付成功后才有)
|
|
129
|
+
- openid (str): 用户openid(支付成功后才有)
|
|
130
|
+
- trade_type (str): 交易类型(支付成功后才有)
|
|
131
|
+
- bank_type (str): 银行类型(支付成功后才有)
|
|
132
|
+
- fee_type (str): 货币类型,默认为"CNY"
|
|
133
|
+
- is_subscribe (str): 是否关注公众号(支付成功后才有)
|
|
134
|
+
- time_end (str): 支付完成时间(支付成功后才有)
|
|
135
|
+
- created_at (str): 订单创建时间
|
|
136
|
+
- updated_at (str): 订单更新时间
|
|
137
|
+
- paid_at (str): 支付时间(支付成功后才有)
|
|
138
|
+
- remark (str): 订单备注
|
|
139
|
+
success (bool): 操作是否成功
|
|
140
|
+
|
|
141
|
+
异常情况:
|
|
142
|
+
- 订单不存在:返回错误信息"订单不存在"
|
|
143
|
+
- 获取订单详情失败:返回错误信息"获取订单详情失败"
|
|
144
|
+
"""
|
|
42
145
|
data, success = self._request("GET", f"/api/orders/{out_trade_no}")
|
|
43
146
|
if not success:
|
|
44
147
|
return {}, False
|
|
@@ -49,6 +152,42 @@ class OrderManager(Client):
|
|
|
49
152
|
out_trade_no: str,
|
|
50
153
|
payment_status: str,
|
|
51
154
|
):
|
|
155
|
+
"""
|
|
156
|
+
更新订单状态
|
|
157
|
+
|
|
158
|
+
功能说明:
|
|
159
|
+
更新指定订单的支付状态,仅支持状态修改,其他字段不可修改。
|
|
160
|
+
|
|
161
|
+
输入参数:
|
|
162
|
+
out_trade_no (str): 商户订单号,必填
|
|
163
|
+
payment_status (str): 支付状态,必填,可选值:
|
|
164
|
+
- "PENDING": 待支付
|
|
165
|
+
- "PAID": 已支付
|
|
166
|
+
- "REFUNDED": 已退款
|
|
167
|
+
- "CANCELLED": 已取消
|
|
168
|
+
|
|
169
|
+
返回字段:
|
|
170
|
+
data (dict): 更新后的订单信息
|
|
171
|
+
- id (int): 订单ID
|
|
172
|
+
- out_trade_no (str): 商户订单号
|
|
173
|
+
- payment_status (str): 更新后的支付状态
|
|
174
|
+
- transaction_id (str): 微信交易号(如果已支付)
|
|
175
|
+
- openid (str): 用户openid(如果已支付)
|
|
176
|
+
- trade_type (str): 交易类型(如果已支付)
|
|
177
|
+
- bank_type (str): 银行类型(如果已支付)
|
|
178
|
+
- fee_type (str): 货币类型
|
|
179
|
+
- is_subscribe (str): 是否关注公众号(如果已支付)
|
|
180
|
+
- time_end (str): 支付完成时间(如果已支付)
|
|
181
|
+
- paid_at (str): 支付时间(如果已支付)
|
|
182
|
+
- updated_at (str): 订单更新时间
|
|
183
|
+
- remark (str): 订单备注
|
|
184
|
+
success (bool): 操作是否成功
|
|
185
|
+
|
|
186
|
+
异常情况:
|
|
187
|
+
- 支付状态为空:返回错误信息"支付状态不能为空"
|
|
188
|
+
- 订单不存在:返回错误信息"订单不存在"
|
|
189
|
+
- 更新订单状态失败:返回错误信息"更新订单状态失败"
|
|
190
|
+
"""
|
|
52
191
|
data = {
|
|
53
192
|
"payment_status": payment_status,
|
|
54
193
|
}
|
|
@@ -60,12 +199,51 @@ class OrderManager(Client):
|
|
|
60
199
|
return data, True
|
|
61
200
|
|
|
62
201
|
def delete_order(self, out_trade_no: str):
|
|
202
|
+
"""
|
|
203
|
+
删除订单
|
|
204
|
+
|
|
205
|
+
功能说明:
|
|
206
|
+
根据订单号删除指定的订单记录。
|
|
207
|
+
|
|
208
|
+
输入参数:
|
|
209
|
+
out_trade_no (str): 商户订单号,必填
|
|
210
|
+
|
|
211
|
+
返回字段:
|
|
212
|
+
data (None): 删除成功时返回None
|
|
213
|
+
success (bool): 操作是否成功
|
|
214
|
+
|
|
215
|
+
异常情况:
|
|
216
|
+
- 订单不存在:返回错误信息"订单不存在"
|
|
217
|
+
- 删除订单失败:返回错误信息"删除订单失败"
|
|
218
|
+
"""
|
|
63
219
|
data, success = self._request("DELETE", f"/api/orders/{out_trade_no}")
|
|
64
220
|
if not success:
|
|
65
221
|
return {}, False
|
|
66
222
|
return data, True
|
|
67
223
|
|
|
68
224
|
def get_order_stats(self):
|
|
225
|
+
"""
|
|
226
|
+
获取订单统计信息
|
|
227
|
+
|
|
228
|
+
功能说明:
|
|
229
|
+
获取订单的统计汇总信息,包括总订单数、各状态订单数量、总金额等。
|
|
230
|
+
|
|
231
|
+
输入参数:
|
|
232
|
+
无
|
|
233
|
+
|
|
234
|
+
返回字段:
|
|
235
|
+
data (dict): 订单统计信息
|
|
236
|
+
- total_orders (int): 总订单数量
|
|
237
|
+
- pending_orders (int): 待支付订单数量
|
|
238
|
+
- paid_orders (int): 已支付订单数量
|
|
239
|
+
- refunded_orders (int): 已退款订单数量
|
|
240
|
+
- total_amount (float): 总订单金额(元)
|
|
241
|
+
- total_fee (int): 总订单金额(分)
|
|
242
|
+
success (bool): 操作是否成功
|
|
243
|
+
|
|
244
|
+
异常情况:
|
|
245
|
+
- 获取订单统计信息失败:返回错误信息"获取订单统计信息失败"
|
|
246
|
+
"""
|
|
69
247
|
data, success = self._request("GET", "/api/orders/stats/summary")
|
|
70
248
|
if not success:
|
|
71
249
|
return {}, False
|
|
@@ -76,6 +254,30 @@ class OrderManager(Client):
|
|
|
76
254
|
out_trade_no: str,
|
|
77
255
|
payment_channel: str = "WECHAT",
|
|
78
256
|
):
|
|
257
|
+
"""
|
|
258
|
+
生成支付二维码
|
|
259
|
+
|
|
260
|
+
功能说明:
|
|
261
|
+
为指定订单生成支付二维码,支持微信支付和支付宝。二维码会自动上传到OSS并返回访问URL。
|
|
262
|
+
|
|
263
|
+
输入参数:
|
|
264
|
+
out_trade_no (str): 商户订单号,必填
|
|
265
|
+
payment_channel (str, 可选): 支付渠道,默认为"WECHAT",可选值:
|
|
266
|
+
- "WECHAT": 微信支付
|
|
267
|
+
- "ALIPAY": 支付宝(暂未实现)
|
|
268
|
+
|
|
269
|
+
返回字段:
|
|
270
|
+
data (dict): 二维码信息
|
|
271
|
+
- qr_code_url (str): 二维码图片URL,可直接用于显示
|
|
272
|
+
- out_trade_no (str): 商户订单号
|
|
273
|
+
success (bool): 操作是否成功
|
|
274
|
+
|
|
275
|
+
异常情况:
|
|
276
|
+
- 订单号为空:返回错误信息"订单号不能为空"
|
|
277
|
+
- 订单不存在:返回错误信息"订单不存在"
|
|
278
|
+
- 不支持的支付渠道:抛出ValueError异常
|
|
279
|
+
- 生成支付二维码失败:返回错误信息"生成支付二维码失败"
|
|
280
|
+
"""
|
|
79
281
|
if payment_channel == "WECHAT":
|
|
80
282
|
url = "/api/orders/wx_pay/generate_qr_code"
|
|
81
283
|
elif payment_channel == "ALIPAY":
|
|
@@ -94,6 +296,32 @@ class OrderManager(Client):
|
|
|
94
296
|
return data, True
|
|
95
297
|
|
|
96
298
|
def refund_order(self, out_trade_no: str, payment_channel: str = "WECHAT"):
|
|
299
|
+
"""
|
|
300
|
+
申请订单退款
|
|
301
|
+
|
|
302
|
+
功能说明:
|
|
303
|
+
为指定订单申请退款,支持微信支付和支付宝。退款申请提交后,系统会处理退款并更新订单状态。
|
|
304
|
+
|
|
305
|
+
输入参数:
|
|
306
|
+
out_trade_no (str): 商户订单号,必填
|
|
307
|
+
payment_channel (str, 可选): 支付渠道,默认为"WECHAT",可选值:
|
|
308
|
+
- "WECHAT": 微信支付
|
|
309
|
+
- "ALIPAY": 支付宝(暂未实现)
|
|
310
|
+
|
|
311
|
+
返回字段:
|
|
312
|
+
data (dict): 退款信息
|
|
313
|
+
- out_refund_no (str): 退款单号,格式为"REFUND_订单号_时间戳"
|
|
314
|
+
- out_trade_no (str): 商户订单号
|
|
315
|
+
- total_fee (int): 退款金额(分)
|
|
316
|
+
success (bool): 操作是否成功
|
|
317
|
+
|
|
318
|
+
异常情况:
|
|
319
|
+
- 订单号为空:返回错误信息"订单号不能为空"
|
|
320
|
+
- 订单不存在:返回错误信息"订单不存在"
|
|
321
|
+
- 订单状态不允许退款:返回错误信息"订单状态不允许退款"
|
|
322
|
+
- 不支持的支付渠道:抛出ValueError异常
|
|
323
|
+
- 退款申请失败:返回错误信息"退款申请失败"
|
|
324
|
+
"""
|
|
97
325
|
if payment_channel == "WECHAT":
|
|
98
326
|
url = "/api/orders/wx_pay/refund"
|
|
99
327
|
elif payment_channel == "ALIPAY":
|
|
@@ -108,3 +336,326 @@ class OrderManager(Client):
|
|
|
108
336
|
if not success:
|
|
109
337
|
return {}, False
|
|
110
338
|
return data, True
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
class OrderManagerAsync(AsyncClient):
|
|
342
|
+
async def create_order(
|
|
343
|
+
self,
|
|
344
|
+
product_id: str,
|
|
345
|
+
body: str = None,
|
|
346
|
+
remark: str = None,
|
|
347
|
+
payment_channel: str = "WECHAT",
|
|
348
|
+
):
|
|
349
|
+
"""
|
|
350
|
+
创建订单(异步版本)
|
|
351
|
+
|
|
352
|
+
功能说明:
|
|
353
|
+
根据产品ID创建新的订单,系统会自动生成订单号,获取产品价格信息,并创建对应的支付订单。
|
|
354
|
+
|
|
355
|
+
输入参数:
|
|
356
|
+
product_id (str): 产品ID,必填,用于获取产品信息和价格
|
|
357
|
+
body (str, 可选): 商品描述,如果不提供则使用产品名称
|
|
358
|
+
remark (str, 可选): 订单备注信息
|
|
359
|
+
payment_channel (str, 可选): 支付渠道,默认为"WECHAT"(微信支付)
|
|
360
|
+
|
|
361
|
+
返回字段:
|
|
362
|
+
data (dict): 订单信息
|
|
363
|
+
- id (int): 订单ID
|
|
364
|
+
- out_trade_no (str): 商户订单号,格式为"ORD_时间戳_随机字符串"
|
|
365
|
+
- payment_status (str): 支付状态,初始为"PENDING"(待支付)
|
|
366
|
+
- payment_channel (str): 支付渠道
|
|
367
|
+
- product_id (str): 产品ID
|
|
368
|
+
- amount (str): 订单金额(元),格式为"99.00"
|
|
369
|
+
- total_fee (int): 订单金额(分),用于支付接口
|
|
370
|
+
- body (str): 商品描述
|
|
371
|
+
- remark (str): 订单备注
|
|
372
|
+
- created_at (str): 订单创建时间
|
|
373
|
+
- updated_at (str): 订单更新时间
|
|
374
|
+
success (bool): 操作是否成功
|
|
375
|
+
|
|
376
|
+
异常情况:
|
|
377
|
+
- 产品ID为空:返回错误信息"产品ID不能为空"
|
|
378
|
+
- 产品不存在:返回错误信息"产品不存在"
|
|
379
|
+
- 产品价格无效:返回错误信息"产品价格无效"
|
|
380
|
+
- 创建订单失败:返回错误信息"创建订单失败"
|
|
381
|
+
"""
|
|
382
|
+
data = {
|
|
383
|
+
"product_id": product_id,
|
|
384
|
+
"body": body,
|
|
385
|
+
"remark": remark,
|
|
386
|
+
"payment_channel": payment_channel,
|
|
387
|
+
}
|
|
388
|
+
data, success = await self._request("POST", "/api/orders/create", json=data)
|
|
389
|
+
if not success:
|
|
390
|
+
return {}, False
|
|
391
|
+
return data, True
|
|
392
|
+
|
|
393
|
+
async def list_order(
|
|
394
|
+
self,
|
|
395
|
+
page: int = 1,
|
|
396
|
+
page_size: int = 10,
|
|
397
|
+
payment_status: str = None,
|
|
398
|
+
out_trade_no: str = None,
|
|
399
|
+
):
|
|
400
|
+
"""
|
|
401
|
+
获取订单列表(异步版本)
|
|
402
|
+
|
|
403
|
+
功能说明:
|
|
404
|
+
分页查询订单列表,支持按支付状态和订单号进行筛选。
|
|
405
|
+
|
|
406
|
+
输入参数:
|
|
407
|
+
page (int, 可选): 页码,默认为1,最小值为1
|
|
408
|
+
page_size (int, 可选): 每页数量,默认为10,范围为1-1000
|
|
409
|
+
payment_status (str, 可选): 支付状态筛选,可选值:
|
|
410
|
+
- "PENDING": 待支付
|
|
411
|
+
- "PAID": 已支付
|
|
412
|
+
- "REFUNDED": 已退款
|
|
413
|
+
- "CANCELLED": 已取消
|
|
414
|
+
out_trade_no (str, 可选): 订单号搜索,支持模糊匹配
|
|
415
|
+
|
|
416
|
+
返回字段:
|
|
417
|
+
data (dict): 订单列表信息
|
|
418
|
+
- orders (list): 订单列表
|
|
419
|
+
- id (int): 订单ID
|
|
420
|
+
- out_trade_no (str): 商户订单号
|
|
421
|
+
- payment_status (str): 支付状态
|
|
422
|
+
- payment_channel (str): 支付渠道
|
|
423
|
+
- amount (str): 订单金额(元)
|
|
424
|
+
- total_fee (int): 订单金额(分)
|
|
425
|
+
- created_at (str): 订单创建时间
|
|
426
|
+
- updated_at (str): 订单更新时间
|
|
427
|
+
- total (int): 总订单数量
|
|
428
|
+
- page (int): 当前页码
|
|
429
|
+
- page_size (int): 每页数量
|
|
430
|
+
success (bool): 操作是否成功
|
|
431
|
+
|
|
432
|
+
异常情况:
|
|
433
|
+
- 获取订单列表失败:返回错误信息"获取订单列表失败"
|
|
434
|
+
"""
|
|
435
|
+
params = {
|
|
436
|
+
"page": page,
|
|
437
|
+
"page_size": page_size,
|
|
438
|
+
"payment_status": payment_status,
|
|
439
|
+
"out_trade_no": out_trade_no,
|
|
440
|
+
}
|
|
441
|
+
data, success = await self._request("GET", "/api/orders/list", params=params)
|
|
442
|
+
if not success:
|
|
443
|
+
return {}, False
|
|
444
|
+
return data, True
|
|
445
|
+
|
|
446
|
+
async def get_order_detail(self, out_trade_no: str):
|
|
447
|
+
"""
|
|
448
|
+
获取订单详情(异步版本)
|
|
449
|
+
|
|
450
|
+
功能说明:
|
|
451
|
+
根据订单号获取订单的详细信息,包括支付状态、交易信息等。
|
|
452
|
+
|
|
453
|
+
输入参数:
|
|
454
|
+
out_trade_no (str): 商户订单号,必填
|
|
455
|
+
|
|
456
|
+
返回字段:
|
|
457
|
+
data (dict): 订单详细信息
|
|
458
|
+
- id (int): 订单ID
|
|
459
|
+
- out_trade_no (str): 商户订单号
|
|
460
|
+
- payment_status (str): 支付状态
|
|
461
|
+
- product_id (str): 产品ID
|
|
462
|
+
- amount (str): 订单金额(元)
|
|
463
|
+
- total_fee (int): 订单金额(分)
|
|
464
|
+
- body (str): 商品描述
|
|
465
|
+
- transaction_id (str): 微信交易号(支付成功后才有)
|
|
466
|
+
- openid (str): 用户openid(支付成功后才有)
|
|
467
|
+
- trade_type (str): 交易类型(支付成功后才有)
|
|
468
|
+
- bank_type (str): 银行类型(支付成功后才有)
|
|
469
|
+
- fee_type (str): 货币类型,默认为"CNY"
|
|
470
|
+
- is_subscribe (str): 是否关注公众号(支付成功后才有)
|
|
471
|
+
- time_end (str): 支付完成时间(支付成功后才有)
|
|
472
|
+
- created_at (str): 订单创建时间
|
|
473
|
+
- updated_at (str): 订单更新时间
|
|
474
|
+
- paid_at (str): 支付时间(支付成功后才有)
|
|
475
|
+
- remark (str): 订单备注
|
|
476
|
+
success (bool): 操作是否成功
|
|
477
|
+
|
|
478
|
+
异常情况:
|
|
479
|
+
- 订单不存在:返回错误信息"订单不存在"
|
|
480
|
+
- 获取订单详情失败:返回错误信息"获取订单详情失败"
|
|
481
|
+
"""
|
|
482
|
+
data, success = await self._request("GET", f"/api/orders/{out_trade_no}")
|
|
483
|
+
if not success:
|
|
484
|
+
return {}, False
|
|
485
|
+
return data, True
|
|
486
|
+
|
|
487
|
+
async def update_order_status(self, out_trade_no: str, payment_status: str):
|
|
488
|
+
"""
|
|
489
|
+
更新订单状态(异步版本)
|
|
490
|
+
|
|
491
|
+
功能说明:
|
|
492
|
+
更新指定订单的支付状态,仅支持状态修改,其他字段不可修改。
|
|
493
|
+
|
|
494
|
+
输入参数:
|
|
495
|
+
out_trade_no (str): 商户订单号,必填
|
|
496
|
+
payment_status (str): 支付状态,必填,可选值:
|
|
497
|
+
- "PENDING": 待支付
|
|
498
|
+
- "PAID": 已支付
|
|
499
|
+
- "REFUNDED": 已退款
|
|
500
|
+
- "CANCELLED": 已取消
|
|
501
|
+
|
|
502
|
+
返回字段:
|
|
503
|
+
data (dict): 更新后的订单信息
|
|
504
|
+
- id (int): 订单ID
|
|
505
|
+
- out_trade_no (str): 商户订单号
|
|
506
|
+
- payment_status (str): 更新后的支付状态
|
|
507
|
+
- transaction_id (str): 微信交易号(如果已支付)
|
|
508
|
+
- openid (str): 用户openid(如果已支付)
|
|
509
|
+
- trade_type (str): 交易类型(如果已支付)
|
|
510
|
+
- bank_type (str): 银行类型(如果已支付)
|
|
511
|
+
- fee_type (str): 货币类型
|
|
512
|
+
- is_subscribe (str): 是否关注公众号(如果已支付)
|
|
513
|
+
- time_end (str): 支付完成时间(如果已支付)
|
|
514
|
+
- paid_at (str): 支付时间(如果已支付)
|
|
515
|
+
- updated_at (str): 订单更新时间
|
|
516
|
+
- remark (str): 订单备注
|
|
517
|
+
success (bool): 操作是否成功
|
|
518
|
+
|
|
519
|
+
异常情况:
|
|
520
|
+
- 支付状态为空:返回错误信息"支付状态不能为空"
|
|
521
|
+
- 订单不存在:返回错误信息"订单不存在"
|
|
522
|
+
- 更新订单状态失败:返回错误信息"更新订单状态失败"
|
|
523
|
+
"""
|
|
524
|
+
data = {"payment_status": payment_status}
|
|
525
|
+
data, success = await self._request(
|
|
526
|
+
"PUT", f"/api/orders/{out_trade_no}/status", json=data
|
|
527
|
+
)
|
|
528
|
+
if not success:
|
|
529
|
+
return {}, False
|
|
530
|
+
return data, True
|
|
531
|
+
|
|
532
|
+
async def delete_order(self, out_trade_no: str):
|
|
533
|
+
"""
|
|
534
|
+
删除订单(异步版本)
|
|
535
|
+
|
|
536
|
+
功能说明:
|
|
537
|
+
根据订单号删除指定的订单记录。
|
|
538
|
+
|
|
539
|
+
输入参数:
|
|
540
|
+
out_trade_no (str): 商户订单号,必填
|
|
541
|
+
|
|
542
|
+
返回字段:
|
|
543
|
+
data (None): 删除成功时返回None
|
|
544
|
+
success (bool): 操作是否成功
|
|
545
|
+
|
|
546
|
+
异常情况:
|
|
547
|
+
- 订单不存在:返回错误信息"订单不存在"
|
|
548
|
+
- 删除订单失败:返回错误信息"删除订单失败"
|
|
549
|
+
"""
|
|
550
|
+
data, success = await self._request("DELETE", f"/api/orders/{out_trade_no}")
|
|
551
|
+
if not success:
|
|
552
|
+
return {}, False
|
|
553
|
+
return data, True
|
|
554
|
+
|
|
555
|
+
async def get_order_stats(self):
|
|
556
|
+
"""
|
|
557
|
+
获取订单统计信息(异步版本)
|
|
558
|
+
|
|
559
|
+
功能说明:
|
|
560
|
+
获取订单的统计汇总信息,包括总订单数、各状态订单数量、总金额等。
|
|
561
|
+
|
|
562
|
+
输入参数:
|
|
563
|
+
无
|
|
564
|
+
|
|
565
|
+
返回字段:
|
|
566
|
+
data (dict): 订单统计信息
|
|
567
|
+
- total_orders (int): 总订单数量
|
|
568
|
+
- pending_orders (int): 待支付订单数量
|
|
569
|
+
- paid_orders (int): 已支付订单数量
|
|
570
|
+
- refunded_orders (int): 已退款订单数量
|
|
571
|
+
- total_amount (float): 总订单金额(元)
|
|
572
|
+
- total_fee (int): 总订单金额(分)
|
|
573
|
+
success (bool): 操作是否成功
|
|
574
|
+
|
|
575
|
+
异常情况:
|
|
576
|
+
- 获取订单统计信息失败:返回错误信息"获取订单统计信息失败"
|
|
577
|
+
"""
|
|
578
|
+
data, success = await self._request("GET", "/api/orders/stats/summary")
|
|
579
|
+
if not success:
|
|
580
|
+
return {}, False
|
|
581
|
+
return data, True
|
|
582
|
+
|
|
583
|
+
async def generate_qr_code(
|
|
584
|
+
self, out_trade_no: str, payment_channel: str = "WECHAT"
|
|
585
|
+
):
|
|
586
|
+
"""
|
|
587
|
+
生成支付二维码(异步版本)
|
|
588
|
+
|
|
589
|
+
功能说明:
|
|
590
|
+
为指定订单生成支付二维码,支持微信支付和支付宝。二维码会自动上传到OSS并返回访问URL。
|
|
591
|
+
|
|
592
|
+
输入参数:
|
|
593
|
+
out_trade_no (str): 商户订单号,必填
|
|
594
|
+
payment_channel (str, 可选): 支付渠道,默认为"WECHAT",可选值:
|
|
595
|
+
- "WECHAT": 微信支付
|
|
596
|
+
- "ALIPAY": 支付宝(暂未实现)
|
|
597
|
+
|
|
598
|
+
返回字段:
|
|
599
|
+
data (dict): 二维码信息
|
|
600
|
+
- qr_code_url (str): 二维码图片URL,可直接用于显示
|
|
601
|
+
- out_trade_no (str): 商户订单号
|
|
602
|
+
success (bool): 操作是否成功
|
|
603
|
+
|
|
604
|
+
异常情况:
|
|
605
|
+
- 订单号为空:返回错误信息"订单号不能为空"
|
|
606
|
+
- 订单不存在:返回错误信息"订单不存在"
|
|
607
|
+
- 不支持的支付渠道:抛出ValueError异常
|
|
608
|
+
- 生成支付二维码失败:返回错误信息"生成支付二维码失败"
|
|
609
|
+
"""
|
|
610
|
+
if payment_channel == "WECHAT":
|
|
611
|
+
url = "/api/orders/wx_pay/generate_qr_code"
|
|
612
|
+
elif payment_channel == "ALIPAY":
|
|
613
|
+
url = "/api/orders/ali_pay/generate_qr_code"
|
|
614
|
+
else:
|
|
615
|
+
raise ValueError("Invalid payment channel")
|
|
616
|
+
data, success = await self._request(
|
|
617
|
+
"POST", url, json={"out_trade_no": out_trade_no}
|
|
618
|
+
)
|
|
619
|
+
if not success:
|
|
620
|
+
return {}, False
|
|
621
|
+
return data, True
|
|
622
|
+
|
|
623
|
+
async def refund_order(self, out_trade_no: str, payment_channel: str = "WECHAT"):
|
|
624
|
+
"""
|
|
625
|
+
申请订单退款(异步版本)
|
|
626
|
+
|
|
627
|
+
功能说明:
|
|
628
|
+
为指定订单申请退款,支持微信支付和支付宝。退款申请提交后,系统会处理退款并更新订单状态。
|
|
629
|
+
|
|
630
|
+
输入参数:
|
|
631
|
+
out_trade_no (str): 商户订单号,必填
|
|
632
|
+
payment_channel (str, 可选): 支付渠道,默认为"WECHAT",可选值:
|
|
633
|
+
- "WECHAT": 微信支付
|
|
634
|
+
- "ALIPAY": 支付宝(暂未实现)
|
|
635
|
+
|
|
636
|
+
返回字段:
|
|
637
|
+
data (dict): 退款信息
|
|
638
|
+
- out_refund_no (str): 退款单号,格式为"REFUND_订单号_时间戳"
|
|
639
|
+
- out_trade_no (str): 商户订单号
|
|
640
|
+
- total_fee (int): 退款金额(分)
|
|
641
|
+
success (bool): 操作是否成功
|
|
642
|
+
|
|
643
|
+
异常情况:
|
|
644
|
+
- 订单号为空:返回错误信息"订单号不能为空"
|
|
645
|
+
- 订单不存在:返回错误信息"订单不存在"
|
|
646
|
+
- 订单状态不允许退款:返回错误信息"订单状态不允许退款"
|
|
647
|
+
- 不支持的支付渠道:抛出ValueError异常
|
|
648
|
+
- 退款申请失败:返回错误信息"退款申请失败"
|
|
649
|
+
"""
|
|
650
|
+
if payment_channel == "WECHAT":
|
|
651
|
+
url = "/api/orders/wx_pay/refund"
|
|
652
|
+
elif payment_channel == "ALIPAY":
|
|
653
|
+
url = "/api/orders/ali_pay/refund"
|
|
654
|
+
else:
|
|
655
|
+
raise ValueError("Invalid payment channel")
|
|
656
|
+
data, success = await self._request(
|
|
657
|
+
"POST", url, json={"out_trade_no": out_trade_no}
|
|
658
|
+
)
|
|
659
|
+
if not success:
|
|
660
|
+
return {}, False
|
|
661
|
+
return data, True
|
|
@@ -14,6 +14,46 @@ class ProductManager(Client):
|
|
|
14
14
|
features: str,
|
|
15
15
|
sort_order: int,
|
|
16
16
|
):
|
|
17
|
+
"""
|
|
18
|
+
创建产品
|
|
19
|
+
|
|
20
|
+
功能说明:
|
|
21
|
+
创建新的产品,支持订阅产品和一次性产品,产品信息包括名称、描述、价格、分类等。
|
|
22
|
+
|
|
23
|
+
输入参数:
|
|
24
|
+
name (str): 产品名称,必填
|
|
25
|
+
description (str): 产品描述,必填
|
|
26
|
+
price (float): 产品价格(元),必填
|
|
27
|
+
category (str): 产品分类,必填
|
|
28
|
+
status (str): 产品状态,必填,可选值:
|
|
29
|
+
- "ACTIVE": 激活
|
|
30
|
+
- "INACTIVE": 停用
|
|
31
|
+
is_subscription (bool): 是否为订阅产品,必填
|
|
32
|
+
subscription_period (str): 订阅周期,必填,可选值:
|
|
33
|
+
- "MONTHLY": 月付
|
|
34
|
+
- "YEARLY": 年付
|
|
35
|
+
features (str): 产品特性,JSON格式字符串,必填
|
|
36
|
+
sort_order (int): 排序权重,必填
|
|
37
|
+
|
|
38
|
+
返回字段:
|
|
39
|
+
data (dict): 产品信息
|
|
40
|
+
- id (int): 产品ID
|
|
41
|
+
- name (str): 产品名称
|
|
42
|
+
- description (str): 产品描述
|
|
43
|
+
- price (float): 产品价格(元)
|
|
44
|
+
- category (str): 产品分类
|
|
45
|
+
- status (str): 产品状态
|
|
46
|
+
- is_subscription (bool): 是否为订阅产品
|
|
47
|
+
- subscription_period (str): 订阅周期
|
|
48
|
+
- features (str): 产品特性(JSON格式)
|
|
49
|
+
- sort_order (int): 排序权重
|
|
50
|
+
- created_at (str): 产品创建时间
|
|
51
|
+
- updated_at (str): 产品更新时间
|
|
52
|
+
success (bool): 操作是否成功
|
|
53
|
+
|
|
54
|
+
异常情况:
|
|
55
|
+
- 产品创建失败:返回错误信息"产品创建失败"
|
|
56
|
+
"""
|
|
17
57
|
data = {
|
|
18
58
|
"name": name,
|
|
19
59
|
"description": description,
|
|
@@ -38,6 +78,44 @@ class ProductManager(Client):
|
|
|
38
78
|
category: str = None,
|
|
39
79
|
name: str = None,
|
|
40
80
|
):
|
|
81
|
+
"""
|
|
82
|
+
获取产品列表
|
|
83
|
+
|
|
84
|
+
功能说明:
|
|
85
|
+
分页查询产品列表,支持按状态、分类和名称进行筛选。
|
|
86
|
+
|
|
87
|
+
输入参数:
|
|
88
|
+
page (int, 可选): 页码,默认为1,最小值为1
|
|
89
|
+
page_size (int, 可选): 每页数量,默认为10,范围为1-1000
|
|
90
|
+
status (str, 可选): 产品状态筛选,可选值:
|
|
91
|
+
- "ACTIVE": 激活
|
|
92
|
+
- "INACTIVE": 停用
|
|
93
|
+
category (str, 可选): 产品分类筛选
|
|
94
|
+
name (str, 可选): 产品名称搜索,支持模糊匹配
|
|
95
|
+
|
|
96
|
+
返回字段:
|
|
97
|
+
data (dict): 产品列表信息
|
|
98
|
+
- products (list): 产品列表
|
|
99
|
+
- id (int): 产品ID
|
|
100
|
+
- name (str): 产品名称
|
|
101
|
+
- description (str): 产品描述
|
|
102
|
+
- price (float): 产品价格(元)
|
|
103
|
+
- category (str): 产品分类
|
|
104
|
+
- status (str): 产品状态
|
|
105
|
+
- is_subscription (bool): 是否为订阅产品
|
|
106
|
+
- subscription_period (str): 订阅周期
|
|
107
|
+
- features (str): 产品特性(JSON格式)
|
|
108
|
+
- sort_order (int): 排序权重
|
|
109
|
+
- created_at (str): 产品创建时间
|
|
110
|
+
- updated_at (str): 产品更新时间
|
|
111
|
+
- total (int): 总产品数量
|
|
112
|
+
- page (int): 当前页码
|
|
113
|
+
- page_size (int): 每页数量
|
|
114
|
+
success (bool): 操作是否成功
|
|
115
|
+
|
|
116
|
+
异常情况:
|
|
117
|
+
- 获取产品列表失败:返回错误信息"获取产品列表失败"
|
|
118
|
+
"""
|
|
41
119
|
params = {
|
|
42
120
|
"page": page,
|
|
43
121
|
"page_size": page_size,
|
|
@@ -57,6 +135,35 @@ class ProductManager(Client):
|
|
|
57
135
|
return data, True
|
|
58
136
|
|
|
59
137
|
def get_product_detail(self, product_id: str):
|
|
138
|
+
"""
|
|
139
|
+
获取产品详情
|
|
140
|
+
|
|
141
|
+
功能说明:
|
|
142
|
+
根据产品ID获取产品的详细信息。
|
|
143
|
+
|
|
144
|
+
输入参数:
|
|
145
|
+
product_id (str): 产品ID,必填
|
|
146
|
+
|
|
147
|
+
返回字段:
|
|
148
|
+
data (dict): 产品详细信息
|
|
149
|
+
- id (int): 产品ID
|
|
150
|
+
- name (str): 产品名称
|
|
151
|
+
- description (str): 产品描述
|
|
152
|
+
- price (float): 产品价格(元)
|
|
153
|
+
- category (str): 产品分类
|
|
154
|
+
- status (str): 产品状态
|
|
155
|
+
- is_subscription (bool): 是否为订阅产品
|
|
156
|
+
- subscription_period (str): 订阅周期
|
|
157
|
+
- features (str): 产品特性(JSON格式)
|
|
158
|
+
- sort_order (int): 排序权重
|
|
159
|
+
- created_at (str): 产品创建时间
|
|
160
|
+
- updated_at (str): 产品更新时间
|
|
161
|
+
success (bool): 操作是否成功
|
|
162
|
+
|
|
163
|
+
异常情况:
|
|
164
|
+
- 产品不存在:返回错误信息"产品不存在"
|
|
165
|
+
- 获取产品详情失败:返回错误信息"获取产品详情失败"
|
|
166
|
+
"""
|
|
60
167
|
data, success = self._request("GET", f"/api/products/{product_id}")
|
|
61
168
|
if not success:
|
|
62
169
|
return {}, False
|
|
@@ -75,6 +182,48 @@ class ProductManager(Client):
|
|
|
75
182
|
features: str,
|
|
76
183
|
sort_order: int,
|
|
77
184
|
):
|
|
185
|
+
"""
|
|
186
|
+
更新产品信息
|
|
187
|
+
|
|
188
|
+
功能说明:
|
|
189
|
+
更新指定产品的信息,包括名称、描述、价格、状态等。
|
|
190
|
+
|
|
191
|
+
输入参数:
|
|
192
|
+
product_id (str): 产品ID,必填
|
|
193
|
+
name (str): 产品名称,必填
|
|
194
|
+
description (str): 产品描述,必填
|
|
195
|
+
price (float): 产品价格(元),必填
|
|
196
|
+
category (str): 产品分类,必填
|
|
197
|
+
status (str): 产品状态,必填,可选值:
|
|
198
|
+
- "ACTIVE": 激活
|
|
199
|
+
- "INACTIVE": 停用
|
|
200
|
+
is_subscription (bool): 是否为订阅产品,必填
|
|
201
|
+
subscription_period (str): 订阅周期,必填,可选值:
|
|
202
|
+
- "MONTHLY": 月付
|
|
203
|
+
- "YEARLY": 年付
|
|
204
|
+
features (str): 产品特性,JSON格式字符串,必填
|
|
205
|
+
sort_order (int): 排序权重,必填
|
|
206
|
+
|
|
207
|
+
返回字段:
|
|
208
|
+
data (dict): 更新后的产品信息
|
|
209
|
+
- id (int): 产品ID
|
|
210
|
+
- name (str): 产品名称
|
|
211
|
+
- description (str): 产品描述
|
|
212
|
+
- price (float): 产品价格(元)
|
|
213
|
+
- category (str): 产品分类
|
|
214
|
+
- status (str): 产品状态
|
|
215
|
+
- is_subscription (bool): 是否为订阅产品
|
|
216
|
+
- subscription_period (str): 订阅周期
|
|
217
|
+
- features (str): 产品特性(JSON格式)
|
|
218
|
+
- sort_order (int): 排序权重
|
|
219
|
+
- created_at (str): 产品创建时间
|
|
220
|
+
- updated_at (str): 产品更新时间
|
|
221
|
+
success (bool): 操作是否成功
|
|
222
|
+
|
|
223
|
+
异常情况:
|
|
224
|
+
- 产品不存在:返回错误信息"产品不存在"
|
|
225
|
+
- 产品更新失败:返回错误信息"产品更新失败"
|
|
226
|
+
"""
|
|
78
227
|
data = {
|
|
79
228
|
"name": name,
|
|
80
229
|
"description": description,
|
|
@@ -92,12 +241,46 @@ class ProductManager(Client):
|
|
|
92
241
|
return data, True
|
|
93
242
|
|
|
94
243
|
def delete_product(self, product_id: str):
|
|
244
|
+
"""
|
|
245
|
+
删除产品
|
|
246
|
+
|
|
247
|
+
功能说明:
|
|
248
|
+
根据产品ID删除指定的产品记录。
|
|
249
|
+
|
|
250
|
+
输入参数:
|
|
251
|
+
product_id (str): 产品ID,必填
|
|
252
|
+
|
|
253
|
+
返回字段:
|
|
254
|
+
data (None): 删除成功时返回None
|
|
255
|
+
success (bool): 操作是否成功
|
|
256
|
+
|
|
257
|
+
异常情况:
|
|
258
|
+
- 产品不存在:返回错误信息"产品不存在"
|
|
259
|
+
- 删除产品失败:返回错误信息"删除产品失败"
|
|
260
|
+
"""
|
|
95
261
|
data, success = self._request("DELETE", f"/api/products/{product_id}")
|
|
96
262
|
if not success:
|
|
97
263
|
return {}, False
|
|
98
264
|
return data, True
|
|
99
265
|
|
|
100
266
|
def get_product_categories(self):
|
|
267
|
+
"""
|
|
268
|
+
获取产品分类列表
|
|
269
|
+
|
|
270
|
+
功能说明:
|
|
271
|
+
获取所有可用的产品分类列表。
|
|
272
|
+
|
|
273
|
+
输入参数:
|
|
274
|
+
无
|
|
275
|
+
|
|
276
|
+
返回字段:
|
|
277
|
+
data (dict): 产品分类信息
|
|
278
|
+
- categories (list): 产品分类列表,如["subscription", "service", "addon"]
|
|
279
|
+
success (bool): 操作是否成功
|
|
280
|
+
|
|
281
|
+
异常情况:
|
|
282
|
+
- 获取产品分类失败:返回错误信息"获取产品分类失败"
|
|
283
|
+
"""
|
|
101
284
|
data, success = self._request("GET", "/api/products/categories/list")
|
|
102
285
|
if not success:
|
|
103
286
|
return {}, False
|
|
@@ -11,6 +11,39 @@ class UserManager(Client):
|
|
|
11
11
|
role: Optional[str] = None,
|
|
12
12
|
is_active: Optional[bool] = None,
|
|
13
13
|
):
|
|
14
|
+
"""
|
|
15
|
+
获取用户列表
|
|
16
|
+
|
|
17
|
+
功能说明:
|
|
18
|
+
分页查询用户列表,支持按角色和状态进行筛选。仅管理员可访问。
|
|
19
|
+
|
|
20
|
+
输入参数:
|
|
21
|
+
page (int, 可选): 页码,默认为1,最小值为1
|
|
22
|
+
page_size (int, 可选): 每页数量,默认为10,范围为1-1000
|
|
23
|
+
role (str, 可选): 用户角色筛选,可选值:
|
|
24
|
+
- "admin": 管理员
|
|
25
|
+
- "user": 普通用户
|
|
26
|
+
is_active (bool, 可选): 用户状态筛选,True为激活,False为禁用
|
|
27
|
+
|
|
28
|
+
返回字段:
|
|
29
|
+
data (dict): 用户列表信息
|
|
30
|
+
- users (list): 用户列表
|
|
31
|
+
- id (int): 用户ID
|
|
32
|
+
- username (str): 用户名
|
|
33
|
+
- email (str): 邮箱地址
|
|
34
|
+
- role (str): 用户角色
|
|
35
|
+
- is_active (bool): 是否激活
|
|
36
|
+
- created_at (str): 用户创建时间
|
|
37
|
+
- last_login_at (str): 最后登录时间
|
|
38
|
+
- total (int): 总用户数量
|
|
39
|
+
- page (int): 当前页码
|
|
40
|
+
- page_size (int): 每页数量
|
|
41
|
+
success (bool): 操作是否成功
|
|
42
|
+
|
|
43
|
+
异常情况:
|
|
44
|
+
- 权限不足:返回错误信息"权限不足"
|
|
45
|
+
- 获取用户列表失败:返回错误信息"获取用户列表失败"
|
|
46
|
+
"""
|
|
14
47
|
params = {"page": page, "page_size": page_size}
|
|
15
48
|
if role is not None:
|
|
16
49
|
params["role"] = role
|
|
@@ -22,6 +55,36 @@ class UserManager(Client):
|
|
|
22
55
|
return data, True
|
|
23
56
|
|
|
24
57
|
def create_user(self, username: str, password: str, email: str, role: str):
|
|
58
|
+
"""
|
|
59
|
+
创建用户
|
|
60
|
+
|
|
61
|
+
功能说明:
|
|
62
|
+
创建新的用户账户,仅管理员可访问。
|
|
63
|
+
|
|
64
|
+
输入参数:
|
|
65
|
+
username (str): 用户名,必填
|
|
66
|
+
password (str): 密码,必填
|
|
67
|
+
email (str): 邮箱地址,必填
|
|
68
|
+
role (str): 用户角色,必填,可选值:
|
|
69
|
+
- "admin": 管理员
|
|
70
|
+
- "user": 普通用户
|
|
71
|
+
|
|
72
|
+
返回字段:
|
|
73
|
+
data (dict): 用户信息
|
|
74
|
+
- id (int): 用户ID
|
|
75
|
+
- username (str): 用户名
|
|
76
|
+
- email (str): 邮箱地址
|
|
77
|
+
- role (str): 用户角色
|
|
78
|
+
- is_active (bool): 是否激活,默认为True
|
|
79
|
+
- created_at (str): 用户创建时间
|
|
80
|
+
success (bool): 操作是否成功
|
|
81
|
+
|
|
82
|
+
异常情况:
|
|
83
|
+
- 权限不足:返回错误信息"权限不足"
|
|
84
|
+
- 用户名已存在:返回错误信息"用户名已存在"
|
|
85
|
+
- 邮箱已存在:返回错误信息"邮箱已存在"
|
|
86
|
+
- 用户创建失败:返回错误信息"用户创建失败"
|
|
87
|
+
"""
|
|
25
88
|
data = {
|
|
26
89
|
"username": username,
|
|
27
90
|
"password": password,
|
|
@@ -36,6 +99,39 @@ class UserManager(Client):
|
|
|
36
99
|
def update_user(
|
|
37
100
|
self, user_id: int, username: str, email: str, role: str, is_active: bool
|
|
38
101
|
):
|
|
102
|
+
"""
|
|
103
|
+
更新用户信息
|
|
104
|
+
|
|
105
|
+
功能说明:
|
|
106
|
+
更新指定用户的信息,包括用户名、邮箱、角色和状态。仅管理员可访问。
|
|
107
|
+
|
|
108
|
+
输入参数:
|
|
109
|
+
user_id (int): 用户ID,必填
|
|
110
|
+
username (str): 用户名,必填
|
|
111
|
+
email (str): 邮箱地址,必填
|
|
112
|
+
role (str): 用户角色,必填,可选值:
|
|
113
|
+
- "admin": 管理员
|
|
114
|
+
- "user": 普通用户
|
|
115
|
+
is_active (bool): 是否激活,必填
|
|
116
|
+
|
|
117
|
+
返回字段:
|
|
118
|
+
data (dict): 更新后的用户信息
|
|
119
|
+
- id (int): 用户ID
|
|
120
|
+
- username (str): 用户名
|
|
121
|
+
- email (str): 邮箱地址
|
|
122
|
+
- role (str): 用户角色
|
|
123
|
+
- is_active (bool): 是否激活
|
|
124
|
+
- created_at (str): 用户创建时间
|
|
125
|
+
- updated_at (str): 用户信息更新时间
|
|
126
|
+
success (bool): 操作是否成功
|
|
127
|
+
|
|
128
|
+
异常情况:
|
|
129
|
+
- 权限不足:返回错误信息"权限不足"
|
|
130
|
+
- 用户不存在:返回错误信息"用户不存在"
|
|
131
|
+
- 用户名已存在:返回错误信息"用户名已存在"
|
|
132
|
+
- 邮箱已存在:返回错误信息"邮箱已存在"
|
|
133
|
+
- 用户信息更新失败:返回错误信息"用户信息更新失败"
|
|
134
|
+
"""
|
|
39
135
|
data = {
|
|
40
136
|
"username": username,
|
|
41
137
|
"email": email,
|
|
@@ -48,18 +144,80 @@ class UserManager(Client):
|
|
|
48
144
|
return data, True
|
|
49
145
|
|
|
50
146
|
def delete_user(self, user_id: int):
|
|
147
|
+
"""
|
|
148
|
+
删除用户
|
|
149
|
+
|
|
150
|
+
功能说明:
|
|
151
|
+
根据用户ID删除指定的用户记录。仅管理员可访问。
|
|
152
|
+
|
|
153
|
+
输入参数:
|
|
154
|
+
user_id (int): 用户ID,必填
|
|
155
|
+
|
|
156
|
+
返回字段:
|
|
157
|
+
data (None): 删除成功时返回None
|
|
158
|
+
success (bool): 操作是否成功
|
|
159
|
+
|
|
160
|
+
异常情况:
|
|
161
|
+
- 权限不足:返回错误信息"权限不足"
|
|
162
|
+
- 用户不存在:返回错误信息"用户不存在"
|
|
163
|
+
- 删除用户失败:返回错误信息"删除用户失败"
|
|
164
|
+
"""
|
|
51
165
|
data, success = self._request("DELETE", f"/api/users/{user_id}")
|
|
52
166
|
if not success:
|
|
53
167
|
return {}, False
|
|
54
168
|
return data, True
|
|
55
169
|
|
|
56
170
|
def get_user_detail(self, user_id: int):
|
|
171
|
+
"""
|
|
172
|
+
获取用户详情
|
|
173
|
+
|
|
174
|
+
功能说明:
|
|
175
|
+
根据用户ID获取用户的详细信息。仅管理员可访问。
|
|
176
|
+
|
|
177
|
+
输入参数:
|
|
178
|
+
user_id (int): 用户ID,必填
|
|
179
|
+
|
|
180
|
+
返回字段:
|
|
181
|
+
data (dict): 用户详细信息
|
|
182
|
+
- id (int): 用户ID
|
|
183
|
+
- username (str): 用户名
|
|
184
|
+
- email (str): 邮箱地址
|
|
185
|
+
- role (str): 用户角色
|
|
186
|
+
- is_active (bool): 是否激活
|
|
187
|
+
- created_at (str): 用户创建时间
|
|
188
|
+
- last_login_at (str): 最后登录时间
|
|
189
|
+
success (bool): 操作是否成功
|
|
190
|
+
|
|
191
|
+
异常情况:
|
|
192
|
+
- 权限不足:返回错误信息"权限不足"
|
|
193
|
+
- 用户不存在:返回错误信息"用户不存在"
|
|
194
|
+
- 获取用户详情失败:返回错误信息"获取用户详情失败"
|
|
195
|
+
"""
|
|
57
196
|
data, success = self._request("GET", f"/api/users/{user_id}")
|
|
58
197
|
if not success:
|
|
59
198
|
return {}, False
|
|
60
199
|
return data, True
|
|
61
200
|
|
|
62
201
|
def reset_user_password(self, user_id: int, new_password: str):
|
|
202
|
+
"""
|
|
203
|
+
重置用户密码
|
|
204
|
+
|
|
205
|
+
功能说明:
|
|
206
|
+
重置指定用户的密码。仅管理员可访问。
|
|
207
|
+
|
|
208
|
+
输入参数:
|
|
209
|
+
user_id (int): 用户ID,必填
|
|
210
|
+
new_password (str): 新密码,必填
|
|
211
|
+
|
|
212
|
+
返回字段:
|
|
213
|
+
data (None): 重置成功时返回None
|
|
214
|
+
success (bool): 操作是否成功
|
|
215
|
+
|
|
216
|
+
异常情况:
|
|
217
|
+
- 权限不足:返回错误信息"权限不足"
|
|
218
|
+
- 用户不存在:返回错误信息"用户不存在"
|
|
219
|
+
- 密码重置失败:返回错误信息"密码重置失败"
|
|
220
|
+
"""
|
|
63
221
|
data = {"new_password": new_password}
|
|
64
222
|
data, success = self._request(
|
|
65
223
|
"POST", f"/api/users/{user_id}/reset-password", json=data
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
pixelarraythirdparty/__init__.py,sha256=cLw3MHNC7dl2u-nOF78E6O_r2dUgmwl3x4wzSpulw1s,458
|
|
2
|
+
pixelarraythirdparty/client.py,sha256=r63EDeyPhf3Y1sORW24tDSIqo2c8E3pwbik7r0Xy5zo,1678
|
|
3
|
+
pixelarraythirdparty/celery/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
+
pixelarraythirdparty/celery/celery.py,sha256=paZFSnWKvwNEDyi-tr4z2dwWxlLMX58WmS_hDezyuaE,5690
|
|
5
|
+
pixelarraythirdparty/order/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
+
pixelarraythirdparty/order/order.py,sha256=kBhpinympJjsu-4UmUazXhJTCLkGlMHcjmpOXbnVmek,27144
|
|
7
|
+
pixelarraythirdparty/product/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
|
+
pixelarraythirdparty/product/product.py,sha256=_rcAtsZEWA3Ta1R9SBWnzQmjab-vf3bnSEySb4PPU-c,10586
|
|
9
|
+
pixelarraythirdparty/user/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
|
+
pixelarraythirdparty/user/user.py,sha256=UY-O7qO8AIWo3GRQaHqC3AMQc4w3bD9KgmPLoUo-l0I,8380
|
|
11
|
+
pixelarraythirdparty-1.0.5.dist-info/licenses/LICENSE,sha256=O-g1dUr0U50rSIvmWE9toiVkSgFpVt72_MHITbWvAqA,1067
|
|
12
|
+
pixelarraythirdparty-1.0.5.dist-info/METADATA,sha256=s86-xWcTp2UgdmJP2hLTpW4rZU91cjUU-8WLKjGq3SI,993
|
|
13
|
+
pixelarraythirdparty-1.0.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
14
|
+
pixelarraythirdparty-1.0.5.dist-info/top_level.txt,sha256=dzG2Ut8j7noUqj_0ZQjcIDAeHYCh_9WtlxjAxtoyufo,21
|
|
15
|
+
pixelarraythirdparty-1.0.5.dist-info/RECORD,,
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
pixelarraythirdparty/__init__.py,sha256=TYuj96ZwZ4VXhB9Xn4KoEWpoJVsChUjzoWSRZONmC-U,458
|
|
2
|
-
pixelarraythirdparty/client.py,sha256=dJlIrMlr1M4AGHvaLw191uaPnQbQ12_BGx8DTDTPkZQ,802
|
|
3
|
-
pixelarraythirdparty/celery/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
-
pixelarraythirdparty/celery/celery.py,sha256=Oaa7pBztL-FM0X5NSCjjfZP80AUsnnme5Z3RxXIJsZg,1178
|
|
5
|
-
pixelarraythirdparty/order/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
-
pixelarraythirdparty/order/order.py,sha256=kmJNAvfiXxhjOhRbD3JTl1saE8aetMZ0TFR9NjPsaIM,3208
|
|
7
|
-
pixelarraythirdparty/product/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
|
-
pixelarraythirdparty/product/product.py,sha256=eHU0VKal1QpJs6F4_VxLoBYeeqQ19elEogH2Qpw7IDo,3029
|
|
9
|
-
pixelarraythirdparty/user/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
|
-
pixelarraythirdparty/user/user.py,sha256=tbcFsrNEdWz4op7V_zJ5o8neBuI4ogl4dgHS-uSIAX0,2155
|
|
11
|
-
pixelarraythirdparty-1.0.3.dist-info/licenses/LICENSE,sha256=O-g1dUr0U50rSIvmWE9toiVkSgFpVt72_MHITbWvAqA,1067
|
|
12
|
-
pixelarraythirdparty-1.0.3.dist-info/METADATA,sha256=_BcKEA0W8joCfUZcvDqyKBkBXKGyWUwIDVI16boT7s4,993
|
|
13
|
-
pixelarraythirdparty-1.0.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
14
|
-
pixelarraythirdparty-1.0.3.dist-info/top_level.txt,sha256=dzG2Ut8j7noUqj_0ZQjcIDAeHYCh_9WtlxjAxtoyufo,21
|
|
15
|
-
pixelarraythirdparty-1.0.3.dist-info/RECORD,,
|
|
File without changes
|
{pixelarraythirdparty-1.0.3.dist-info → pixelarraythirdparty-1.0.5.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|