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
|
@@ -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
|
+
)
|