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.

@@ -0,0 +1,303 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ SmartRack SDK 测试客户端
6
+ 根据提供的测试参数进行API调用测试
7
+ """
8
+
9
+ import logging
10
+ from datetime import datetime
11
+ from smartrack_sdk import SmartRackClient
12
+ from smartrack_sdk.models.requests import (
13
+ StockInRequest, StockOutRequest, ClearErrorRequest,
14
+ ResetCellRequest, RackTestRequest, StockInFinishRequest
15
+ )
16
+ from smartrack_sdk.models.enums import LedColors, RackTestMode
17
+ from smartrack_sdk.exceptions import SmartRackException
18
+
19
+ # 配置日志
20
+ logging.basicConfig(
21
+ level=logging.INFO,
22
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
23
+ )
24
+ logger = logging.getLogger(__name__)
25
+
26
+
27
+ class SmartRackTestClient:
28
+ """SmartRack测试客户端"""
29
+
30
+ def __init__(self, base_url: str, user_id: str = "test", client_id: str = "MES"):
31
+ """
32
+ 初始化测试客户端
33
+
34
+ Args:
35
+ base_url: API基础URL
36
+ user_id: 用户ID
37
+ client_id: 客户端ID
38
+ """
39
+ self.base_url = base_url
40
+ self.user_id = user_id
41
+ self.client_id = client_id
42
+ self.client = None
43
+
44
+ def test_all_apis(self):
45
+ """测试所有API"""
46
+ logger.info("开始SmartRack API测试")
47
+ logger.info(f"API地址: {self.base_url}")
48
+ logger.info(f"用户ID: {self.user_id}")
49
+ logger.info(f"客户端ID: {self.client_id}")
50
+ logger.info("=" * 60)
51
+
52
+ try:
53
+ # 创建客户端
54
+ self._create_client()
55
+
56
+ # 测试各个API
57
+ self._test_stock_in_request()
58
+ self._test_rack_test()
59
+ self._test_clear_error()
60
+ self._test_reset_cell()
61
+
62
+ logger.info("=" * 60)
63
+ logger.info("所有API测试完成!")
64
+
65
+ except Exception as e:
66
+ logger.error(f"测试过程中出错: {e}", exc_info=True)
67
+
68
+ finally:
69
+ self._close_client()
70
+
71
+ def _create_client(self):
72
+ """创建客户端"""
73
+ logger.info("创建SmartRack客户端...")
74
+ self.client = SmartRackClient(
75
+ base_url=self.base_url,
76
+ timeout=30
77
+ )
78
+ logger.info("客户端创建完成")
79
+
80
+ def _close_client(self):
81
+ """关闭客户端"""
82
+ if self.client:
83
+ self.client.close()
84
+ logger.info("客户端已关闭")
85
+
86
+ def _generate_sheet_id(self, prefix: str = "SI") -> str:
87
+ """生成单号"""
88
+ return f"{prefix}-{datetime.now().strftime('%Y%m%d%H%M%S')}"
89
+
90
+ def _print_result(self, api_name: str, response, additional_info: str = ""):
91
+ """打印测试结果"""
92
+ logger.info(f"=== {api_name} 测试结果 ===")
93
+ logger.info(f"Code: {response.code}")
94
+ logger.info(f"Message: {response.message}")
95
+ if response.session_id:
96
+ logger.info(f"SessionId: {response.session_id}")
97
+ if additional_info:
98
+ logger.info(f"Additional Info: {additional_info}")
99
+ logger.info(f"Success: {response.is_success}")
100
+ logger.info("-" * 40)
101
+
102
+ def _test_stock_in_request(self):
103
+ """测试入库请求"""
104
+ logger.info("测试: 入库请求")
105
+
106
+ try:
107
+ # 生成入库单号
108
+ sheet_id = self._generate_sheet_id()
109
+
110
+ # 创建入库请求
111
+ request = StockInRequest(self.user_id, self.client_id)
112
+ request.set_sheet_id(sheet_id)
113
+ request.set_rack_id("A001")
114
+ request.set_grn("TEST-PRODUCT-001")
115
+ request.set_led_color(LedColors.GREEN)
116
+ request.set_blink(True)
117
+
118
+ logger.info(f"发送入库请求 - 单号: {sheet_id}")
119
+ logger.info(f"料架: A001, GRN: TEST-PRODUCT-001")
120
+
121
+ response = self.client.stock_in_request(request)
122
+ self._print_result("入库请求", response, f"单号: {sheet_id}")
123
+
124
+ if response.is_success:
125
+ logger.info("入库请求成功,等待3秒后测试入库完成...")
126
+ import time
127
+ time.sleep(3)
128
+
129
+ # 测试入库完成
130
+ self._test_stock_in_finish(sheet_id)
131
+ else:
132
+ logger.error("入库请求失败,跳过入库完成测试")
133
+
134
+ except SmartRackException as e:
135
+ logger.error(f"入库请求异常: {e}")
136
+
137
+ def _test_stock_in_finish(self, sheet_id: str):
138
+ """测试入库完成"""
139
+ logger.info("测试: 入库完成")
140
+
141
+ try:
142
+ # 创建入库完成请求
143
+ request = StockInFinishRequest(self.user_id, self.client_id)
144
+ request.set_sheet_id(sheet_id)
145
+
146
+ logger.info(f"发送入库完成请求 - 单号: {sheet_id}")
147
+
148
+ response = self.client.stock_in_finish(request)
149
+ self._print_result("入库完成", response, f"单号: {sheet_id}")
150
+
151
+ except SmartRackException as e:
152
+ logger.error(f"入库完成异常: {e}")
153
+
154
+ def _test_rack_test(self):
155
+ """测试料架测试"""
156
+ logger.info("测试: 料架测试")
157
+
158
+ try:
159
+ # RGB测试
160
+ request = RackTestRequest(self.user_id, self.client_id)
161
+ request.set_rack_id("A001")
162
+ request.set_test_mode(RackTestMode.RGB_TEST)
163
+ request.set_led_color(LedColors.WHITE)
164
+ request.set_blink(False)
165
+
166
+ logger.info("发送RGB测试请求 - 料架: A001")
167
+
168
+ response = self.client.rack_test(request)
169
+ self._print_result("RGB测试", response, "测试模式: RGB_TEST")
170
+
171
+ if response.is_success:
172
+ logger.info("RGB测试成功,等待3秒后测试全部灭灯...")
173
+ import time
174
+ time.sleep(3)
175
+
176
+ # 测试全部灭灯
177
+ self._test_rack_all_off()
178
+ else:
179
+ logger.error("RGB测试失败,跳过全部灭灯测试")
180
+
181
+ except SmartRackException as e:
182
+ logger.error(f"料架测试异常: {e}")
183
+
184
+ def _test_rack_all_off(self):
185
+ """测试全部灭灯"""
186
+ logger.info("测试: 全部灭灯")
187
+
188
+ try:
189
+ request = RackTestRequest(self.user_id, self.client_id)
190
+ request.set_rack_id("A001")
191
+ request.set_test_mode(RackTestMode.ALL_OFF)
192
+ request.set_led_color(LedColors.OFF)
193
+ request.set_blink(False)
194
+
195
+ logger.info("发送全部灭灯请求 - 料架: A001")
196
+
197
+ response = self.client.rack_test(request)
198
+ self._print_result("全部灭灯", response, "测试模式: ALL_OFF")
199
+
200
+ except SmartRackException as e:
201
+ logger.error(f"全部灭灯异常: {e}")
202
+
203
+ def _test_clear_error(self):
204
+ """测试清除错误"""
205
+ logger.info("测试: 清除错误")
206
+
207
+ try:
208
+ # 清除指定储位的错误
209
+ request = ClearErrorRequest(self.user_id, self.client_id)
210
+ request.set_cell_id("A0010001")
211
+
212
+ logger.info("发送清除错误请求 - 储位: A0010001")
213
+
214
+ response = self.client.clear_error(request)
215
+ self._print_result("清除错误", response)
216
+
217
+ if response.is_success and response.result_data:
218
+ logger.info("清错结果:")
219
+ for item in response.result_data:
220
+ status_text = "空" if item.is_empty() else "非空"
221
+ logger.info(f" 储位: {item.cell}, GRN: {item.grn}, 状态: {status_text}")
222
+ else:
223
+ logger.error("清除错误失败或无返回数据")
224
+
225
+ except SmartRackException as e:
226
+ logger.error(f"清除错误异常: {e}")
227
+
228
+ def _test_reset_cell(self):
229
+ """测试重置储位状态"""
230
+ logger.info("测试: 重置储位状态")
231
+
232
+ try:
233
+ # 重置多个储位状态
234
+ request = ResetCellRequest(self.user_id, self.client_id)
235
+ request.add_cell("A0010001")
236
+ request.add_cell("A0010002")
237
+ request.add_cell("A0010003")
238
+
239
+ logger.info(f"发送重置储位请求 - 储位列表: {request.cell_list}")
240
+
241
+ response = self.client.reset_cell(request)
242
+ self._print_result("重置储位状态", response, f"储位数量: {len(request.cell_list)}")
243
+
244
+ except SmartRackException as e:
245
+ logger.error(f"重置储位状态异常: {e}")
246
+
247
+ def test_single_api(self, api_name: str):
248
+ """测试单个API"""
249
+ logger.info(f"测试单个API: {api_name}")
250
+
251
+ try:
252
+ self._create_client()
253
+
254
+ if api_name == "stock_in":
255
+ self._test_stock_in_request()
256
+ elif api_name == "stock_in_finish":
257
+ sheet_id = self._generate_sheet_id()
258
+ self._test_stock_in_finish(sheet_id)
259
+ elif api_name == "rack_test":
260
+ self._test_rack_test()
261
+ elif api_name == "clear_error":
262
+ self._test_clear_error()
263
+ elif api_name == "reset_cell":
264
+ self._test_reset_cell()
265
+ else:
266
+ logger.error(f"未知的API名称: {api_name}")
267
+
268
+ except Exception as e:
269
+ logger.error(f"测试API {api_name} 时出错: {e}", exc_info=True)
270
+
271
+ finally:
272
+ self._close_client()
273
+
274
+
275
+ def main():
276
+ """主函数"""
277
+ # 测试参数
278
+ base_url = "http://192.168.8.3:7800"
279
+ user_id = "test"
280
+ client_id = "MES"
281
+
282
+ logger.info("SmartRack SDK 测试客户端")
283
+ logger.info(f"API地址: {base_url}")
284
+ logger.info(f"用户ID: {user_id}")
285
+ logger.info(f"客户端ID: {client_id}")
286
+ logger.info("=" * 60)
287
+
288
+ # 检查命令行参数
289
+ import sys
290
+ if len(sys.argv) > 1:
291
+ api_name = sys.argv[1]
292
+ logger.info(f"测试单个API: {api_name}")
293
+
294
+ client = SmartRackTestClient(base_url, user_id, client_id)
295
+ client.test_single_api(api_name)
296
+ else:
297
+ logger.info("测试所有API")
298
+ client = SmartRackTestClient(base_url, user_id, client_id)
299
+ client.test_all_apis()
300
+
301
+
302
+ if __name__ == "__main__":
303
+ main()
@@ -0,0 +1,129 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ SmartRack SDK for Python
6
+ 智能料架系统Python SDK
7
+
8
+ 主要功能:
9
+ - 完整的API接口支持
10
+ - WebAPI回调处理
11
+ - 强类型模型
12
+ - 异常处理
13
+ - 日志记录
14
+ """
15
+
16
+ __version__ = "1.0.0"
17
+ __author__ = "SmartRack SDK Team"
18
+ __email__ = "support@smartrack.com"
19
+
20
+ # 导入主要的类和函数
21
+ from .client import SmartRackClient
22
+ from .exceptions import (
23
+ SmartRackException,
24
+ SmartRackApiException,
25
+ SmartRackNetworkException,
26
+ SmartRackConfigurationException,
27
+ SmartRackValidationException,
28
+ )
29
+
30
+ # 导入模型类
31
+ from .models import (
32
+ LedColors,
33
+ CellStatus,
34
+ RackTestMode,
35
+ OperationResultCode,
36
+ TriggerState,
37
+ )
38
+
39
+ # 导入请求和响应类
40
+ from .models.requests import (
41
+ BaseRequest,
42
+ ClearErrorRequest,
43
+ RackTestRequest,
44
+ StockInRequest,
45
+ StockOutRequest,
46
+ StockOutSheetRequest,
47
+ StockOutSheetCancelRequest,
48
+ StockOutSheetFinishRequest,
49
+ StockInFinishRequest,
50
+ ResetCellRequest,
51
+ GetStockByGRNListRequest,
52
+ )
53
+
54
+ from .models.responses import (
55
+ BaseResponse,
56
+ ClearErrorResponse,
57
+ StockDataResponse,
58
+ StockDataDto,
59
+ StockOutResponse,
60
+ StockOutResponseDto,
61
+ StockOutSheetResponse,
62
+ )
63
+
64
+ from .models.callback import (
65
+ CellEventData,
66
+ CellEventHandleRequest,
67
+ CellEventHandleResponse,
68
+ )
69
+
70
+ # 导入回调处理类
71
+ from .callback import (
72
+ CellEventHandler,
73
+ CellEventCallbackService,
74
+ )
75
+
76
+ __all__ = [
77
+ # 版本信息
78
+ "__version__",
79
+ "__author__",
80
+ "__email__",
81
+
82
+ # 核心客户端
83
+ "SmartRackClient",
84
+
85
+ # 异常类
86
+ "SmartRackException",
87
+ "SmartRackApiException",
88
+ "SmartRackNetworkException",
89
+ "SmartRackConfigurationException",
90
+ "SmartRackValidationException",
91
+
92
+ # 枚举类
93
+ "LedColors",
94
+ "CellStatus",
95
+ "RackTestMode",
96
+ "OperationResultCode",
97
+ "TriggerState",
98
+
99
+ # 请求类
100
+ "BaseRequest",
101
+ "ClearErrorRequest",
102
+ "RackTestRequest",
103
+ "StockInRequest",
104
+ "StockOutRequest",
105
+ "StockOutSheetRequest",
106
+ "StockOutSheetCancelRequest",
107
+ "StockOutSheetFinishRequest",
108
+ "StockInFinishRequest",
109
+ "ResetCellRequest",
110
+ "GetStockByGRNListRequest",
111
+
112
+ # 响应类
113
+ "BaseResponse",
114
+ "ClearErrorResponse",
115
+ "StockDataResponse",
116
+ "StockDataDto",
117
+ "StockOutResponse",
118
+ "StockOutResponseDto",
119
+ "StockOutSheetResponse",
120
+
121
+ # 回调模型
122
+ "CellEventData",
123
+ "CellEventHandleRequest",
124
+ "CellEventHandleResponse",
125
+
126
+ # 回调处理
127
+ "CellEventHandler",
128
+ "CellEventCallbackService",
129
+ ]
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ 回调处理包
6
+ 包含WebAPI回调处理相关功能
7
+ """
8
+
9
+ from .handler import CellEventHandler
10
+ from .service import CellEventCallbackService
11
+ from .flask_handler import FlaskCellEventHandler
12
+ from .fastapi_handler import FastAPICellEventHandler
13
+
14
+ __all__ = [
15
+ "CellEventHandler",
16
+ "CellEventCallbackService",
17
+ "FlaskCellEventHandler",
18
+ "FastAPICellEventHandler",
19
+ ]
@@ -0,0 +1,151 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ FastAPI WebAPI回调处理器
6
+ 提供FastAPI框架的WebAPI回调处理功能
7
+ """
8
+
9
+ import logging
10
+ from typing import Dict, Any, TYPE_CHECKING
11
+
12
+ if TYPE_CHECKING:
13
+ from fastapi import FastAPI
14
+
15
+ try:
16
+ from fastapi import FastAPI, HTTPException
17
+ from pydantic import BaseModel
18
+ FASTAPI_AVAILABLE = True
19
+ except ImportError:
20
+ FASTAPI_AVAILABLE = False
21
+
22
+ from .handler import CellEventHandler, CellEventCallbackService
23
+ from ..models.callback import CellEventHandleRequest, CellEventHandleResponse
24
+
25
+ logger = logging.getLogger(__name__)
26
+
27
+
28
+ if FASTAPI_AVAILABLE:
29
+ class CellEventRequest(BaseModel):
30
+ """储位事件请求模型"""
31
+ UserId: str
32
+ ClientId: str
33
+ SessionId: str
34
+ Timestamp: str
35
+ Data: list
36
+
37
+ class CellEventResponse(BaseModel):
38
+ """储位事件响应模型"""
39
+ code: int
40
+ message: str
41
+ sessionId: str
42
+ timestamp: str
43
+
44
+ class HealthResponse(BaseModel):
45
+ """健康检查响应模型"""
46
+ status: str
47
+ message: str
48
+ timestamp: str
49
+
50
+
51
+ class FastAPICellEventHandler:
52
+ """FastAPI储位事件回调处理器"""
53
+
54
+ def __init__(self, app: 'FastAPI' = None, event_handler: CellEventHandler = None):
55
+ """
56
+ 初始化FastAPI回调处理器
57
+
58
+ Args:
59
+ app: FastAPI应用实例
60
+ event_handler: 事件处理器
61
+ """
62
+ if not FASTAPI_AVAILABLE:
63
+ raise ImportError("FastAPI not available. Install with: pip install fastapi uvicorn")
64
+
65
+ self.event_handler = event_handler or CellEventCallbackService()
66
+
67
+ if app:
68
+ self.init_app(app)
69
+
70
+ def init_app(self, app: 'FastAPI') -> None:
71
+ """
72
+ 初始化FastAPI应用
73
+
74
+ Args:
75
+ app: FastAPI应用实例
76
+ """
77
+ @app.post("/api/SmartRack/CellEventHandle", response_model=CellEventResponse)
78
+ async def handle_cell_event(request: CellEventRequest):
79
+ """处理储位事件回调请求"""
80
+ try:
81
+ # 转换为内部模型
82
+ request_dict = request.dict()
83
+ callback_request = CellEventHandleRequest.from_dict(request_dict)
84
+
85
+ logger.info(f"收到储位事件回调: {callback_request}")
86
+
87
+ # 处理事件
88
+ response = self.event_handler.handle(callback_request)
89
+
90
+ # 返回响应
91
+ return response.to_dict()
92
+
93
+ except Exception as e:
94
+ logger.error("处理储位事件回调时发生错误", exc_info=True)
95
+ raise HTTPException(
96
+ status_code=500,
97
+ detail={
98
+ 'code': 100101,
99
+ 'message': f'处理回调时发生错误: {str(e)}',
100
+ 'sessionId': '',
101
+ 'timestamp': self._get_timestamp()
102
+ }
103
+ )
104
+
105
+ @app.get("/api/SmartRack/health", response_model=HealthResponse)
106
+ async def health():
107
+ """健康检查接口"""
108
+ return {
109
+ 'status': 'ok',
110
+ 'message': 'SmartRack Callback Service is running',
111
+ 'timestamp': self._get_timestamp()
112
+ }
113
+
114
+ logger.info("FastAPI SmartRack回调路由注册完成")
115
+
116
+ def _get_timestamp(self) -> str:
117
+ """获取当前时间戳"""
118
+ from datetime import datetime
119
+ return datetime.now().isoformat()
120
+
121
+
122
+ def create_fastapi_app(event_handler: CellEventHandler = None) -> 'FastAPI':
123
+ """
124
+ 创建FastAPI应用
125
+
126
+ Args:
127
+ event_handler: 事件处理器
128
+
129
+ Returns:
130
+ FastAPI应用实例
131
+ """
132
+ if not FASTAPI_AVAILABLE:
133
+ raise ImportError("FastAPI not available. Install with: pip install fastapi uvicorn")
134
+
135
+ app = FastAPI(
136
+ title="SmartRack Callback API",
137
+ description="SmartRack智能料架系统WebAPI回调处理服务",
138
+ version="1.0.0",
139
+ docs_url="/docs",
140
+ redoc_url="/redoc"
141
+ )
142
+
143
+ # 初始化回调处理器
144
+ fastapi_handler = FastAPICellEventHandler(app, event_handler)
145
+
146
+ logger.info("FastAPI应用创建完成")
147
+ return app
148
+
149
+
150
+ # 兼容性别名
151
+ FlaskCellEventHandler = FastAPICellEventHandler # 如果FastAPI可用,优先使用FastAPI