smartrack-sdk 1.0.0__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.
Potentially problematic release.
This version of smartrack-sdk might be problematic. Click here for more details.
- examples/__init__.py +7 -0
- examples/basic_usage.py +360 -0
- examples/callback_server.py +435 -0
- examples/test_client.py +303 -0
- smartrack_sdk/__init__.py +129 -0
- smartrack_sdk/callback/__init__.py +19 -0
- smartrack_sdk/callback/fastapi_handler.py +151 -0
- smartrack_sdk/callback/flask_handler.py +137 -0
- smartrack_sdk/callback/handler.py +220 -0
- smartrack_sdk/callback/service.py +14 -0
- smartrack_sdk/client/__init__.py +13 -0
- smartrack_sdk/client/smart_rack_client.py +523 -0
- smartrack_sdk/exceptions/__init__.py +21 -0
- smartrack_sdk/exceptions/api.py +29 -0
- smartrack_sdk/exceptions/base.py +25 -0
- smartrack_sdk/exceptions/configuration.py +28 -0
- smartrack_sdk/exceptions/network.py +50 -0
- smartrack_sdk/exceptions/validation.py +28 -0
- smartrack_sdk/models/__init__.py +85 -0
- smartrack_sdk/models/callback.py +184 -0
- smartrack_sdk/models/enums.py +203 -0
- smartrack_sdk/models/requests.py +291 -0
- smartrack_sdk/models/responses.py +209 -0
- smartrack_sdk/tests/__init__.py +7 -0
- smartrack_sdk/tests/test_callback.py +295 -0
- smartrack_sdk/tests/test_client.py +264 -0
- smartrack_sdk-1.0.0.dist-info/METADATA +557 -0
- smartrack_sdk-1.0.0.dist-info/RECORD +31 -0
- smartrack_sdk-1.0.0.dist-info/WHEEL +5 -0
- smartrack_sdk-1.0.0.dist-info/entry_points.txt +2 -0
- smartrack_sdk-1.0.0.dist-info/top_level.txt +2 -0
examples/__init__.py
ADDED
examples/basic_usage.py
ADDED
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
SmartRack SDK 基本使用示例
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
from datetime import datetime
|
|
10
|
+
|
|
11
|
+
from smartrack_sdk import SmartRackClient
|
|
12
|
+
from smartrack_sdk.models.requests import (
|
|
13
|
+
StockInRequest, StockOutRequest, StockOutSheetRequest,
|
|
14
|
+
ClearErrorRequest, ResetCellRequest, RackTestRequest,
|
|
15
|
+
StockInFinishRequest, StockOutSheetFinishRequest, StockOutSheetCancelRequest
|
|
16
|
+
)
|
|
17
|
+
from smartrack_sdk.models.enums import LedColors, RackTestMode
|
|
18
|
+
from smartrack_sdk.exceptions import SmartRackException
|
|
19
|
+
|
|
20
|
+
# 配置日志
|
|
21
|
+
logging.basicConfig(
|
|
22
|
+
level=logging.INFO,
|
|
23
|
+
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
|
24
|
+
)
|
|
25
|
+
logger = logging.getLogger(__name__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class BasicUsageExample:
|
|
29
|
+
"""SmartRack SDK基本使用示例"""
|
|
30
|
+
|
|
31
|
+
def __init__(self, base_url: str):
|
|
32
|
+
"""
|
|
33
|
+
初始化示例
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
base_url: SmartRack API基础URL
|
|
37
|
+
"""
|
|
38
|
+
self.base_url = base_url
|
|
39
|
+
self.client = None
|
|
40
|
+
|
|
41
|
+
def run_all_examples(self):
|
|
42
|
+
"""运行所有示例"""
|
|
43
|
+
logger.info("开始运行SmartRack SDK示例...")
|
|
44
|
+
logger.info("=" * 50)
|
|
45
|
+
|
|
46
|
+
try:
|
|
47
|
+
# 创建客户端
|
|
48
|
+
self._create_client()
|
|
49
|
+
|
|
50
|
+
# 运行各种示例
|
|
51
|
+
self._stock_in_example()
|
|
52
|
+
self._stock_out_example()
|
|
53
|
+
self._stock_out_sheet_example()
|
|
54
|
+
self._stock_query_example()
|
|
55
|
+
self._rack_test_example()
|
|
56
|
+
self._clear_error_example()
|
|
57
|
+
self._reset_cell_example()
|
|
58
|
+
self._error_handling_example()
|
|
59
|
+
|
|
60
|
+
logger.info("=" * 50)
|
|
61
|
+
logger.info("所有示例运行完成!")
|
|
62
|
+
|
|
63
|
+
except Exception as e:
|
|
64
|
+
logger.error(f"示例运行出错: {e}", exc_info=True)
|
|
65
|
+
|
|
66
|
+
finally:
|
|
67
|
+
self._close_client()
|
|
68
|
+
|
|
69
|
+
def _create_client(self):
|
|
70
|
+
"""创建客户端"""
|
|
71
|
+
logger.info("创建SmartRack客户端...")
|
|
72
|
+
self.client = SmartRackClient(
|
|
73
|
+
base_url=self.base_url,
|
|
74
|
+
timeout=30
|
|
75
|
+
)
|
|
76
|
+
logger.info("客户端创建完成")
|
|
77
|
+
|
|
78
|
+
def _close_client(self):
|
|
79
|
+
"""关闭客户端"""
|
|
80
|
+
if self.client:
|
|
81
|
+
self.client.close()
|
|
82
|
+
logger.info("客户端已关闭")
|
|
83
|
+
|
|
84
|
+
def _stock_in_example(self):
|
|
85
|
+
"""入库操作示例"""
|
|
86
|
+
logger.info("=== 入库操作示例 ===")
|
|
87
|
+
|
|
88
|
+
try:
|
|
89
|
+
# 生成入库单号
|
|
90
|
+
sheet_id = f"SI-{datetime.now().strftime('%Y%m%d%H%M%S')}"
|
|
91
|
+
|
|
92
|
+
# 创建入库请求
|
|
93
|
+
request = StockInRequest("test", "MES")
|
|
94
|
+
request.set_sheet_id(sheet_id)
|
|
95
|
+
request.set_rack_id("A001")
|
|
96
|
+
request.set_grn("PRODUCT001")
|
|
97
|
+
request.set_led_color(LedColors.GREEN)
|
|
98
|
+
request.set_blink(True)
|
|
99
|
+
|
|
100
|
+
logger.info(f"发送入库请求 - 单号: {sheet_id}, 料架: A001, GRN: PRODUCT001")
|
|
101
|
+
response = self.client.stock_in_request(request)
|
|
102
|
+
|
|
103
|
+
logger.info(f"入库请求结果: Code={response.code}, Message={response.message}")
|
|
104
|
+
|
|
105
|
+
if response.is_success:
|
|
106
|
+
logger.info("入库请求成功")
|
|
107
|
+
|
|
108
|
+
# 模拟入库完成后清除亮灯
|
|
109
|
+
import time
|
|
110
|
+
logger.info("等待5秒模拟入库完成...")
|
|
111
|
+
time.sleep(5)
|
|
112
|
+
|
|
113
|
+
# 入库完成
|
|
114
|
+
finish_request = StockInFinishRequest("test", "MES")
|
|
115
|
+
finish_request.set_sheet_id(sheet_id)
|
|
116
|
+
|
|
117
|
+
logger.info("发送入库完成请求")
|
|
118
|
+
finish_response = self.client.stock_in_finish(finish_request)
|
|
119
|
+
logger.info(f"入库完成结果: Code={finish_response.code}, Message={finish_response.message}")
|
|
120
|
+
else:
|
|
121
|
+
logger.error(f"入库请求失败: {response.message}")
|
|
122
|
+
|
|
123
|
+
except SmartRackException as e:
|
|
124
|
+
logger.error(f"入库操作出错: {e}")
|
|
125
|
+
|
|
126
|
+
def _stock_out_example(self):
|
|
127
|
+
"""出库操作示例"""
|
|
128
|
+
logger.info("=== 出库操作示例 ===")
|
|
129
|
+
|
|
130
|
+
try:
|
|
131
|
+
# 生成出库单号
|
|
132
|
+
sheet_id = f"SO-{datetime.now().strftime('%Y%m%d%H%M%S')}"
|
|
133
|
+
|
|
134
|
+
# 创建出库请求
|
|
135
|
+
request = StockOutRequest("test", "MES")
|
|
136
|
+
request.set_sheet_id(sheet_id)
|
|
137
|
+
request.add_grn("PRODUCT001")
|
|
138
|
+
request.add_grn("PRODUCT002")
|
|
139
|
+
request.set_led_color(LedColors.RED)
|
|
140
|
+
request.set_blink(True)
|
|
141
|
+
|
|
142
|
+
logger.info(f"发送出库请求 - 单号: {sheet_id}, GRN列表: {request.grn_list}")
|
|
143
|
+
response = self.client.stock_out_request(request)
|
|
144
|
+
|
|
145
|
+
logger.info(f"出库请求结果: Code={response.code}, Message={response.message}")
|
|
146
|
+
|
|
147
|
+
if response.is_success and response.result_data:
|
|
148
|
+
logger.info("出库储位信息:")
|
|
149
|
+
for item in response.result_data:
|
|
150
|
+
logger.info(f" 储位: {item.cell}, GRN: {item.grn}")
|
|
151
|
+
else:
|
|
152
|
+
logger.error(f"出库请求失败: {response.message}")
|
|
153
|
+
|
|
154
|
+
except SmartRackException as e:
|
|
155
|
+
logger.error(f"出库操作出错: {e}")
|
|
156
|
+
|
|
157
|
+
def _stock_out_sheet_example(self):
|
|
158
|
+
"""单号出库操作示例"""
|
|
159
|
+
logger.info("=== 单号出库操作示例 ===")
|
|
160
|
+
|
|
161
|
+
try:
|
|
162
|
+
# 生成工单号
|
|
163
|
+
sheet_id = f"WO-{datetime.now().strftime('%Y%m%d%H%M%S')}"
|
|
164
|
+
|
|
165
|
+
# 创建单号出库请求
|
|
166
|
+
request = StockOutSheetRequest("test", "MES")
|
|
167
|
+
request.set_sheet_id(sheet_id)
|
|
168
|
+
request.add_grn("PRODUCT001")
|
|
169
|
+
request.add_grn("PRODUCT002")
|
|
170
|
+
request.add_grn("PRODUCT003")
|
|
171
|
+
|
|
172
|
+
logger.info(f"发送单号出库请求 - 工单号: {sheet_id}, GRN列表: {request.grn_list}")
|
|
173
|
+
response = self.client.stock_out_sheet_request(request)
|
|
174
|
+
|
|
175
|
+
logger.info(f"单号出库请求结果: Code={response.code}, Message={response.message}")
|
|
176
|
+
|
|
177
|
+
if response.is_success:
|
|
178
|
+
logger.info(f"亮灯颜色: {response.led_color}")
|
|
179
|
+
logger.info(f"颜色名称: {response.color_name}")
|
|
180
|
+
|
|
181
|
+
if response.result_data:
|
|
182
|
+
logger.info("出库储位信息:")
|
|
183
|
+
for item in response.result_data:
|
|
184
|
+
logger.info(f" 储位: {item.cell}, GRN: {item.grn}")
|
|
185
|
+
|
|
186
|
+
# 模拟操作完成后
|
|
187
|
+
import time
|
|
188
|
+
logger.info("等待10秒模拟操作完成...")
|
|
189
|
+
time.sleep(10)
|
|
190
|
+
|
|
191
|
+
# 完成单号出库
|
|
192
|
+
finish_request = StockOutSheetFinishRequest("test", "MES")
|
|
193
|
+
finish_request.set_sheet_id(sheet_id)
|
|
194
|
+
|
|
195
|
+
logger.info("发送单号出库完成请求")
|
|
196
|
+
finish_response = self.client.stock_out_sheet_finish(finish_request)
|
|
197
|
+
logger.info(f"单号出库完成结果: Code={finish_response.code}, Message={finish_response.message}")
|
|
198
|
+
else:
|
|
199
|
+
logger.error(f"单号出库请求失败: {response.message}")
|
|
200
|
+
|
|
201
|
+
except SmartRackException as e:
|
|
202
|
+
logger.error(f"单号出库操作出错: {e}")
|
|
203
|
+
|
|
204
|
+
def _stock_query_example(self):
|
|
205
|
+
"""库存查询示例"""
|
|
206
|
+
logger.info("=== 库存查询示例 ===")
|
|
207
|
+
|
|
208
|
+
try:
|
|
209
|
+
# 查询指定料架的库存
|
|
210
|
+
logger.info("查询料架A001的库存...")
|
|
211
|
+
response = self.client.get_stock_data(
|
|
212
|
+
rack_id="A001",
|
|
213
|
+
skip_count=0,
|
|
214
|
+
max_result_count=50
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
logger.info(f"库存查询结果: Code={response.code}, Total={response.total}")
|
|
218
|
+
|
|
219
|
+
if response.is_success and response.result_data:
|
|
220
|
+
logger.info("库存详情:")
|
|
221
|
+
for stock in response.result_data:
|
|
222
|
+
logger.info(f" 料架: {stock.rack_id}, 储位: {stock.cell_id}, GRN: {stock.grn}")
|
|
223
|
+
logger.info(f" 状态: {stock.status}, LED颜色: {stock.led_color}")
|
|
224
|
+
logger.info("")
|
|
225
|
+
else:
|
|
226
|
+
logger.error(f"库存查询失败: {response.message}")
|
|
227
|
+
|
|
228
|
+
except SmartRackException as e:
|
|
229
|
+
logger.error(f"库存查询出错: {e}")
|
|
230
|
+
|
|
231
|
+
def _rack_test_example(self):
|
|
232
|
+
"""料架测试示例"""
|
|
233
|
+
logger.info("=== 料架测试示例 ===")
|
|
234
|
+
|
|
235
|
+
try:
|
|
236
|
+
# RGB测试
|
|
237
|
+
test_request = RackTestRequest("test", "MES")
|
|
238
|
+
test_request.set_rack_id("A001")
|
|
239
|
+
test_request.set_test_mode(RackTestMode.RGB_TEST)
|
|
240
|
+
test_request.set_led_color(LedColors.WHITE)
|
|
241
|
+
test_request.set_blink(False)
|
|
242
|
+
|
|
243
|
+
logger.info("发送RGB测试请求 - 料架: A001")
|
|
244
|
+
response = self.client.rack_test(test_request)
|
|
245
|
+
logger.info(f"RGB测试结果: Code={response.code}, Message={response.message}")
|
|
246
|
+
|
|
247
|
+
if response.is_success:
|
|
248
|
+
# 等待测试完成
|
|
249
|
+
import time
|
|
250
|
+
logger.info("等待15秒测试完成...")
|
|
251
|
+
time.sleep(15)
|
|
252
|
+
|
|
253
|
+
# 全部灭灯
|
|
254
|
+
test_request.set_test_mode(RackTestMode.ALL_OFF)
|
|
255
|
+
logger.info("发送全部灭灯请求")
|
|
256
|
+
off_response = self.client.rack_test(test_request)
|
|
257
|
+
logger.info(f"灭灯结果: Code={off_response.code}, Message={off_response.message}")
|
|
258
|
+
else:
|
|
259
|
+
logger.error(f"料架测试失败: {response.message}")
|
|
260
|
+
|
|
261
|
+
except SmartRackException as e:
|
|
262
|
+
logger.error(f"料架测试出错: {e}")
|
|
263
|
+
|
|
264
|
+
def _clear_error_example(self):
|
|
265
|
+
"""清除错误示例"""
|
|
266
|
+
logger.info("=== 清除错误示例 ===")
|
|
267
|
+
|
|
268
|
+
try:
|
|
269
|
+
# 清除指定储位的错误
|
|
270
|
+
clear_request = ClearErrorRequest("test", "MES")
|
|
271
|
+
clear_request.set_cell_id("A0010001") # 可以指定储位ID或料架ID
|
|
272
|
+
|
|
273
|
+
logger.info("发送清除错误请求 - 储位: A0010001")
|
|
274
|
+
response = self.client.clear_error(clear_request)
|
|
275
|
+
|
|
276
|
+
logger.info(f"清除错误结果: Code={response.code}, Message={response.message}")
|
|
277
|
+
|
|
278
|
+
if response.is_success and response.result_data:
|
|
279
|
+
logger.info("清错结果:")
|
|
280
|
+
for item in response.result_data:
|
|
281
|
+
status_text = "空" if item.is_empty() else "非空"
|
|
282
|
+
logger.info(f" 储位: {item.cell}, GRN: {item.grn}, 状态: {status_text}")
|
|
283
|
+
else:
|
|
284
|
+
logger.error(f"清除错误失败: {response.message}")
|
|
285
|
+
|
|
286
|
+
except SmartRackException as e:
|
|
287
|
+
logger.error(f"清除错误出错: {e}")
|
|
288
|
+
|
|
289
|
+
def _reset_cell_example(self):
|
|
290
|
+
"""重置储位状态示例"""
|
|
291
|
+
logger.info("=== 重置储位状态示例 ===")
|
|
292
|
+
|
|
293
|
+
try:
|
|
294
|
+
# 重置多个储位状态
|
|
295
|
+
reset_request = ResetCellRequest("test", "MES")
|
|
296
|
+
reset_request.add_cell("A0010001")
|
|
297
|
+
reset_request.add_cell("A0010002")
|
|
298
|
+
reset_request.add_cell("A0010003")
|
|
299
|
+
|
|
300
|
+
logger.info(f"发送重置储位请求 - 储位列表: {reset_request.cell_list}")
|
|
301
|
+
response = self.client.reset_cell(reset_request)
|
|
302
|
+
|
|
303
|
+
logger.info(f"重置储位结果: Code={response.code}, Message={response.message}")
|
|
304
|
+
|
|
305
|
+
if not response.is_success:
|
|
306
|
+
logger.error(f"重置储位失败: {response.message}")
|
|
307
|
+
|
|
308
|
+
except SmartRackException as e:
|
|
309
|
+
logger.error(f"重置储位出错: {e}")
|
|
310
|
+
|
|
311
|
+
def _error_handling_example(self):
|
|
312
|
+
"""错误处理示例"""
|
|
313
|
+
logger.info("=== 错误处理示例 ===")
|
|
314
|
+
|
|
315
|
+
try:
|
|
316
|
+
# 模拟一个可能导致错误的请求
|
|
317
|
+
request = StockInRequest("test", "MES")
|
|
318
|
+
request.set_sheet_id("ERROR_TEST")
|
|
319
|
+
request.set_rack_id("INVALID_RACK")
|
|
320
|
+
request.set_grn("") # 空的GRN
|
|
321
|
+
|
|
322
|
+
logger.info("发送可能错误的入库请求...")
|
|
323
|
+
response = self.client.stock_in_request(request)
|
|
324
|
+
logger.info(f"意外成功: Code={response.code}, Message={response.message}")
|
|
325
|
+
|
|
326
|
+
except SmartRackException as e:
|
|
327
|
+
logger.info("捕获到SmartRack异常:")
|
|
328
|
+
logger.info(f" 异常类型: {type(e).__name__}")
|
|
329
|
+
logger.info(f" 错误消息: {e}")
|
|
330
|
+
|
|
331
|
+
# 根据异常类型进行不同处理
|
|
332
|
+
if hasattr(e, 'api_code'):
|
|
333
|
+
logger.info(f" API错误代码: {e.api_code}")
|
|
334
|
+
if hasattr(e, 'status_code'):
|
|
335
|
+
logger.info(f" HTTP状态码: {e.status_code}")
|
|
336
|
+
if hasattr(e, 'is_timeout') and e.is_timeout():
|
|
337
|
+
logger.info(" 这是一个超时异常")
|
|
338
|
+
if hasattr(e, 'is_connection_error') and e.is_connection_error():
|
|
339
|
+
logger.info(" 这是一个连接错误")
|
|
340
|
+
|
|
341
|
+
except Exception as e:
|
|
342
|
+
logger.error(f"其他异常: {type(e).__name__}: {e}")
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def main():
|
|
346
|
+
"""主函数"""
|
|
347
|
+
# 配置参数
|
|
348
|
+
base_url = "http://192.168.8.3:7800"
|
|
349
|
+
|
|
350
|
+
logger.info("SmartRack SDK基本使用示例")
|
|
351
|
+
logger.info(f"API地址: {base_url}")
|
|
352
|
+
logger.info("=" * 50)
|
|
353
|
+
|
|
354
|
+
# 创建并运行示例
|
|
355
|
+
example = BasicUsageExample(base_url)
|
|
356
|
+
example.run_all_examples()
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
if __name__ == "__main__":
|
|
360
|
+
main()
|