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,291 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ 请求模型类
6
+ 包含所有API请求的数据模型
7
+ """
8
+
9
+ from abc import ABC
10
+ from datetime import datetime
11
+ from typing import Dict, Any, List, Optional
12
+ from dataclasses import dataclass, field
13
+
14
+ from .enums import LedColors, RackTestMode
15
+
16
+
17
+ @dataclass
18
+ class BaseRequest(ABC):
19
+ """API请求基类"""
20
+
21
+ user_id: str = ""
22
+ client_id: str = ""
23
+ session_id: str = field(default_factory=lambda: str(int(datetime.now().timestamp())))
24
+ timestamp: str = field(default_factory=lambda: datetime.now().isoformat())
25
+ extra_data: Dict[str, Any] = field(default_factory=dict)
26
+
27
+ def to_dict(self) -> Dict[str, Any]:
28
+ """转换为字典"""
29
+ return {
30
+ "userId": self.user_id,
31
+ "clientId": self.client_id,
32
+ "sessionId": self.session_id,
33
+ "timestamp": self.timestamp,
34
+ "extraData": self.extra_data,
35
+ }
36
+
37
+ def add_extra_data(self, key: str, value: Any) -> None:
38
+ """添加附加数据"""
39
+ self.extra_data[key] = value
40
+
41
+ def __post_init__(self):
42
+ """初始化后处理"""
43
+ if not self.session_id:
44
+ self.session_id = str(int(datetime.now().timestamp()))
45
+ if not self.timestamp:
46
+ self.timestamp = datetime.now().isoformat()
47
+
48
+
49
+ @dataclass
50
+ class ClearErrorRequest(BaseRequest):
51
+ """清错错误请求"""
52
+
53
+ rack_id: Optional[str] = None # 料架编号 (优先级低于储位号)
54
+ cell_id: Optional[str] = None # 储位编号 (如果CellId不为空,则忽略RackId)
55
+
56
+ def to_dict(self) -> Dict[str, Any]:
57
+ """转换为字典"""
58
+ base_dict = super().to_dict()
59
+ if self.rack_id:
60
+ base_dict["rackId"] = self.rack_id
61
+ if self.cell_id:
62
+ base_dict["cellId"] = self.cell_id
63
+ return base_dict
64
+
65
+ def set_cell_id(self, cell_id: str) -> None:
66
+ """设置储位编号"""
67
+ self.cell_id = cell_id
68
+
69
+ def set_rack_id(self, rack_id: str) -> None:
70
+ """设置料架编号"""
71
+ self.rack_id = rack_id
72
+
73
+
74
+ @dataclass
75
+ class RackTestRequest(BaseRequest):
76
+ """料架测试请求"""
77
+
78
+ rack_id: str = "" # 料架编号
79
+ test_mode: RackTestMode = RackTestMode.ALL_OFF # 测试模式
80
+ led_color: LedColors = LedColors.OFF # 亮灯颜色
81
+ is_blink: bool = False # 是否闪烁
82
+
83
+ def to_dict(self) -> Dict[str, Any]:
84
+ """转换为字典"""
85
+ base_dict = super().to_dict()
86
+ base_dict.update({
87
+ "rackId": self.rack_id,
88
+ "testMode": self.test_mode.value,
89
+ "ledColor": self.led_color.value,
90
+ "isBlink": self.is_blink,
91
+ })
92
+ return base_dict
93
+
94
+ def set_rack_id(self, rack_id: str) -> None:
95
+ """设置料架编号"""
96
+ self.rack_id = rack_id
97
+
98
+ def set_test_mode(self, test_mode: RackTestMode) -> None:
99
+ """设置测试模式"""
100
+ self.test_mode = test_mode
101
+
102
+ def set_led_color(self, led_color: LedColors) -> None:
103
+ """设置亮灯颜色"""
104
+ self.led_color = led_color
105
+
106
+ def set_blink(self, is_blink: bool) -> None:
107
+ """设置是否闪烁"""
108
+ self.is_blink = is_blink
109
+
110
+
111
+ @dataclass
112
+ class StockInRequest(BaseRequest):
113
+ """入库请求"""
114
+
115
+ sheet_id: str = "" # 入库单号
116
+ rack_id: str = "" # 料架编号
117
+ grn: str = "" # 朔源码
118
+ led_color: LedColors = LedColors.GREEN # 亮灯颜色
119
+ is_blink: bool = True # 是否闪烁
120
+
121
+ def to_dict(self) -> Dict[str, Any]:
122
+ """转换为字典"""
123
+ base_dict = super().to_dict()
124
+ base_dict.update({
125
+ "sheetId": self.sheet_id,
126
+ "rackId": self.rack_id,
127
+ "grn": self.grn,
128
+ "ledColor": self.led_color.value,
129
+ "isBlink": self.is_blink,
130
+ })
131
+ return base_dict
132
+
133
+ def set_sheet_id(self, sheet_id: str) -> None:
134
+ """设置入库单号"""
135
+ self.sheet_id = sheet_id
136
+
137
+ def set_rack_id(self, rack_id: str) -> None:
138
+ """设置料架编号"""
139
+ self.rack_id = rack_id
140
+
141
+ def set_grn(self, grn: str) -> None:
142
+ """设置溯源码"""
143
+ self.grn = grn
144
+
145
+ def set_led_color(self, led_color: LedColors) -> None:
146
+ """设置亮灯颜色"""
147
+ self.led_color = led_color
148
+
149
+ def set_blink(self, is_blink: bool) -> None:
150
+ """设置是否闪烁"""
151
+ self.is_blink = is_blink
152
+
153
+
154
+ @dataclass
155
+ class StockOutRequest(BaseRequest):
156
+ """出库请求"""
157
+
158
+ led_color: LedColors = LedColors.RED # 亮灯颜色
159
+ is_blink: bool = True # 是否闪烁
160
+ grn_list: List[str] = field(default_factory=list) # 出库朔源码列表
161
+ sheet_id: Optional[str] = None # 请求单号
162
+
163
+ def add_grn(self, grn: str) -> None:
164
+ """添加朔源码"""
165
+ if grn not in self.grn_list:
166
+ self.grn_list.append(grn)
167
+
168
+ def to_dict(self) -> Dict[str, Any]:
169
+ """转换为字典"""
170
+ base_dict = super().to_dict()
171
+ base_dict.update({
172
+ "ledColor": self.led_color.value,
173
+ "isBlink": self.is_blink,
174
+ "grnList": self.grn_list,
175
+ })
176
+ if self.sheet_id:
177
+ base_dict["sheetId"] = self.sheet_id
178
+ return base_dict
179
+
180
+
181
+ @dataclass
182
+ class StockOutSheetRequest(BaseRequest):
183
+ """单号出库请求"""
184
+
185
+ sheet_id: str = "" # 工单号/领料单号
186
+ grn_list: List[str] = field(default_factory=list) # 出库朔源码列表
187
+
188
+ def add_grn(self, grn: str) -> None:
189
+ """添加朔源码"""
190
+ if grn not in self.grn_list:
191
+ self.grn_list.append(grn)
192
+
193
+ def to_dict(self) -> Dict[str, Any]:
194
+ """转换为字典"""
195
+ base_dict = super().to_dict()
196
+ base_dict.update({
197
+ "sheetId": self.sheet_id,
198
+ "grnList": self.grn_list,
199
+ })
200
+ return base_dict
201
+
202
+ def set_sheet_id(self, sheet_id: str) -> None:
203
+ """设置工单号/领料单号"""
204
+ self.sheet_id = sheet_id
205
+
206
+
207
+ @dataclass
208
+ class StockOutSheetCancelRequest(BaseRequest):
209
+ """单号出库取消请求"""
210
+
211
+ sheet_id: str = "" # 工单号/领料单号
212
+
213
+ def to_dict(self) -> Dict[str, Any]:
214
+ """转换为字典"""
215
+ base_dict = super().to_dict()
216
+ base_dict["sheetId"] = self.sheet_id
217
+ return base_dict
218
+
219
+ def set_sheet_id(self, sheet_id: str) -> None:
220
+ """设置工单号/领料单号"""
221
+ self.sheet_id = sheet_id
222
+
223
+
224
+ @dataclass
225
+ class StockOutSheetFinishRequest(BaseRequest):
226
+ """单号出库完成请求"""
227
+
228
+ sheet_id: str = "" # 工单号/领料单号
229
+
230
+ def to_dict(self) -> Dict[str, Any]:
231
+ """转换为字典"""
232
+ base_dict = super().to_dict()
233
+ base_dict["sheetId"] = self.sheet_id
234
+ return base_dict
235
+
236
+ def set_sheet_id(self, sheet_id: str) -> None:
237
+ """设置工单号/领料单号"""
238
+ self.sheet_id = sheet_id
239
+
240
+
241
+ @dataclass
242
+ class StockInFinishRequest(BaseRequest):
243
+ """入库完成请求"""
244
+
245
+ sheet_id: str = "" # 入库单号
246
+
247
+ def to_dict(self) -> Dict[str, Any]:
248
+ """转换为字典"""
249
+ base_dict = super().to_dict()
250
+ base_dict["sheetId"] = self.sheet_id
251
+ return base_dict
252
+
253
+ def set_sheet_id(self, sheet_id: str) -> None:
254
+ """设置入库单号"""
255
+ self.sheet_id = sheet_id
256
+
257
+
258
+ @dataclass
259
+ class ResetCellRequest(BaseRequest):
260
+ """重置储位状态请求"""
261
+
262
+ cell_list: List[str] = field(default_factory=list) # 储位列表
263
+
264
+ def add_cell(self, cell_id: str) -> None:
265
+ """添加储位"""
266
+ if cell_id not in self.cell_list:
267
+ self.cell_list.append(cell_id)
268
+
269
+ def to_dict(self) -> Dict[str, Any]:
270
+ """转换为字典"""
271
+ base_dict = super().to_dict()
272
+ base_dict["cellList"] = self.cell_list
273
+ return base_dict
274
+
275
+
276
+ @dataclass
277
+ class GetStockByGRNListRequest(BaseRequest):
278
+ """通过GRN列表查询库存请求"""
279
+
280
+ grn_list: List[str] = field(default_factory=list) # GRN列表
281
+
282
+ def add_grn(self, grn: str) -> None:
283
+ """添加GRN"""
284
+ if grn not in self.grn_list:
285
+ self.grn_list.append(grn)
286
+
287
+ def to_dict(self) -> Dict[str, Any]:
288
+ """转换为字典"""
289
+ base_dict = super().to_dict()
290
+ base_dict["grnList"] = self.grn_list
291
+ return base_dict
@@ -0,0 +1,209 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ 响应模型类
6
+ 包含所有API响应的数据模型
7
+ """
8
+
9
+ from dataclasses import dataclass, field
10
+ from typing import List, Optional, Any, Dict
11
+ from datetime import datetime
12
+
13
+ from .enums import LedColors, CellStatus
14
+
15
+
16
+ @dataclass
17
+ class BaseResponse:
18
+ """API响应基类"""
19
+
20
+ code: int = 0 # 返回代码
21
+ message: str = "" # 返回消息
22
+ session_id: str = "" # 会话Id
23
+ timestamp: str = field(default_factory=lambda: datetime.now().isoformat()) # 时间戳
24
+
25
+ @property
26
+ def is_success(self) -> bool:
27
+ """判断是否成功"""
28
+ return self.code == 0
29
+
30
+ @classmethod
31
+ def from_dict(cls, data: Dict[str, Any]) -> 'BaseResponse':
32
+ """从字典创建实例"""
33
+ return cls(
34
+ code=data.get("code", 0),
35
+ message=data.get("message", ""),
36
+ session_id=data.get("sessionId", ""),
37
+ timestamp=data.get("timestamp", datetime.now().isoformat()),
38
+ )
39
+
40
+
41
+ @dataclass
42
+ class StockDataDto:
43
+ """库存数据Dto"""
44
+
45
+ rack_id: Optional[str] = None # 料架号
46
+ grn: Optional[str] = None # GRN
47
+ cell_id: Optional[str] = None # 储位号
48
+ stock_in_sheet: Optional[str] = None # 入库单号
49
+ stock_out_sheet: Optional[str] = None # 出库单号
50
+ led_color: Optional[LedColors] = None # LED颜色
51
+ is_blink: Optional[bool] = None # 是否闪烁
52
+ status: Optional[CellStatus] = None # 状态
53
+
54
+ @classmethod
55
+ def from_dict(cls, data: Dict[str, Any]) -> 'StockDataDto':
56
+ """从字典创建实例"""
57
+ led_color = data.get("ledColor")
58
+ status = data.get("status")
59
+
60
+ return cls(
61
+ rack_id=data.get("rackId"),
62
+ grn=data.get("grn"),
63
+ cell_id=data.get("cellId"),
64
+ stock_in_sheet=data.get("stockInSheet"),
65
+ stock_out_sheet=data.get("stockOutSheet"),
66
+ led_color=LedColors(led_color) if led_color is not None else None,
67
+ is_blink=data.get("isBlink"),
68
+ status=CellStatus(status) if status is not None else None,
69
+ )
70
+
71
+
72
+ @dataclass
73
+ class StockDataResponse(BaseResponse):
74
+ """库存数据响应"""
75
+
76
+ result_data: List[StockDataDto] = field(default_factory=list) # 返回数据
77
+ total: int = 0 # 总数
78
+
79
+ @classmethod
80
+ def from_dict(cls, data: Dict[str, Any]) -> 'StockDataResponse':
81
+ """从字典创建实例"""
82
+ result_data = []
83
+ for item in data.get("resultData", []):
84
+ result_data.append(StockDataDto.from_dict(item))
85
+
86
+ return cls(
87
+ code=data.get("code", 0),
88
+ message=data.get("message", ""),
89
+ session_id=data.get("sessionId", ""),
90
+ timestamp=data.get("timestamp", datetime.now().isoformat()),
91
+ result_data=result_data,
92
+ total=data.get("total", 0),
93
+ )
94
+
95
+
96
+ @dataclass
97
+ class StockOutResponseDto:
98
+ """出库响应数据"""
99
+
100
+ cell: Optional[str] = None # 储位
101
+ grn: Optional[str] = None # 朔源码
102
+
103
+ @classmethod
104
+ def from_dict(cls, data: Dict[str, Any]) -> 'StockOutResponseDto':
105
+ """从字典创建实例"""
106
+ return cls(
107
+ cell=data.get("cell"),
108
+ grn=data.get("grn"),
109
+ )
110
+
111
+
112
+ @dataclass
113
+ class StockOutResponse(BaseResponse):
114
+ """出库响应"""
115
+
116
+ result_data: List[StockOutResponseDto] = field(default_factory=list) # 返回数据
117
+
118
+ @classmethod
119
+ def from_dict(cls, data: Dict[str, Any]) -> 'StockOutResponse':
120
+ """从字典创建实例"""
121
+ result_data = []
122
+ for item in data.get("resultData", []):
123
+ result_data.append(StockOutResponseDto.from_dict(item))
124
+
125
+ return cls(
126
+ code=data.get("code", 0),
127
+ message=data.get("message", ""),
128
+ session_id=data.get("sessionId", ""),
129
+ timestamp=data.get("timestamp", datetime.now().isoformat()),
130
+ result_data=result_data,
131
+ )
132
+
133
+
134
+ @dataclass
135
+ class StockOutSheetResponse(BaseResponse):
136
+ """单号出库响应"""
137
+
138
+ result_data: List[StockOutResponseDto] = field(default_factory=list) # 返回数据
139
+ led_color: Optional[LedColors] = None # 亮灯颜色
140
+ color_name: Optional[str] = None # 颜色名称
141
+
142
+ @classmethod
143
+ def from_dict(cls, data: Dict[str, Any]) -> 'StockOutSheetResponse':
144
+ """从字典创建实例"""
145
+ result_data = []
146
+ for item in data.get("resultData", []):
147
+ result_data.append(StockOutResponseDto.from_dict(item))
148
+
149
+ led_color = data.get("ledColor")
150
+
151
+ return cls(
152
+ code=data.get("code", 0),
153
+ message=data.get("message", ""),
154
+ session_id=data.get("sessionId", ""),
155
+ timestamp=data.get("timestamp", datetime.now().isoformat()),
156
+ result_data=result_data,
157
+ led_color=LedColors(led_color) if led_color is not None else None,
158
+ color_name=data.get("colorName"),
159
+ )
160
+
161
+
162
+ @dataclass
163
+ class ClearErrorResponseDto:
164
+ """清错响应数据"""
165
+
166
+ grn: Optional[str] = None # 朔源码
167
+ cell: Optional[str] = None # 储位
168
+ state: int = 0 # 储位状态 0-空,1-非空
169
+
170
+ @property
171
+ def is_empty(self) -> bool:
172
+ """是否为空"""
173
+ return self.state == 0
174
+
175
+ @property
176
+ def is_not_empty(self) -> bool:
177
+ """是否非空"""
178
+ return self.state == 1
179
+
180
+ @classmethod
181
+ def from_dict(cls, data: Dict[str, Any]) -> 'ClearErrorResponseDto':
182
+ """从字典创建实例"""
183
+ return cls(
184
+ grn=data.get("grn"),
185
+ cell=data.get("cell"),
186
+ state=data.get("state", 0),
187
+ )
188
+
189
+
190
+ @dataclass
191
+ class ClearErrorResponse(BaseResponse):
192
+ """清错错误响应"""
193
+
194
+ result_data: List[ClearErrorResponseDto] = field(default_factory=list) # 返回数据
195
+
196
+ @classmethod
197
+ def from_dict(cls, data: Dict[str, Any]) -> 'ClearErrorResponse':
198
+ """从字典创建实例"""
199
+ result_data = []
200
+ for item in data.get("resultData", []):
201
+ result_data.append(ClearErrorResponseDto.from_dict(item))
202
+
203
+ return cls(
204
+ code=data.get("code", 0),
205
+ message=data.get("message", ""),
206
+ session_id=data.get("sessionId", ""),
207
+ timestamp=data.get("timestamp", datetime.now().isoformat()),
208
+ result_data=result_data,
209
+ )
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ 测试包
6
+ 包含所有测试模块
7
+ """