231 lines
8.0 KiB
Markdown
231 lines
8.0 KiB
Markdown
# 电动扳手系统架构重构方案
|
||
|
||
## 📊 当前架构问题分析
|
||
|
||
### 现状
|
||
1. **设备管理**:前端本地存储(device_manager.py)
|
||
2. **在线检测**:前端调用后端API,后端执行连接检测
|
||
3. **拧紧过程**:前端执行(wrench_gui.py)
|
||
4. **数据存储**:后端负责
|
||
|
||
### 问题
|
||
- 前端调用后端检测在线状态,增加网络延迟
|
||
- 后端需要导入WrenchController,职责不清晰
|
||
- 设备配置分散在前端,不便于集中管理
|
||
|
||
---
|
||
|
||
## 🎯 重构目标架构
|
||
|
||
### 职责划分
|
||
|
||
#### 🖥️ **客户端(Frontend)职责**
|
||
1. ✅ **在线状态检测**:直接连接扳手检测,无需经过后端
|
||
2. ✅ **拧紧过程控制**:设定扭矩、启动扳手、等待结果
|
||
3. ✅ **实时数据采集**:接收扳手返回的实时数据
|
||
4. ✅ **UI交互**:显示工单、螺栓列表、进度
|
||
|
||
#### 🌐 **服务端(Backend)职责**
|
||
1. ✅ **设备管理**:设备列表、配置的增删改查
|
||
2. ✅ **工单管理**:工单的创建、认领、查询
|
||
3. ✅ **结果存储**:保存拧紧结果到数据库
|
||
4. ✅ **数据查询**:提供历史数据查询接口
|
||
5. ❌ **不再负责**:设备在线检测、扳手连接
|
||
|
||
---
|
||
|
||
## 🔧 具体重构步骤
|
||
|
||
### 步骤1:修改客户端在线检测逻辑
|
||
|
||
**修改文件**:`frontend/wrench_gui.py`
|
||
|
||
**当前代码**(第1196-1253行):
|
||
```python
|
||
def start_device_status_check(self):
|
||
"""启动设备状态检测(后台线程)"""
|
||
def check_status():
|
||
while True:
|
||
# 调用后端API检测设备状态
|
||
check_url = f"{self.api_base_url}/wrench-devices/{device_id}/check-status"
|
||
check_response = requests.post(check_url, timeout=3)
|
||
```
|
||
|
||
**重构后**:
|
||
```python
|
||
def start_device_status_check(self):
|
||
"""启动设备状态检测(后台线程)- 客户端直接检测"""
|
||
def check_status():
|
||
while True:
|
||
# 从后端获取设备列表
|
||
devices = self.fetch_devices_from_backend()
|
||
|
||
# 客户端直接检测每个设备的在线状态
|
||
for device in devices:
|
||
status = self.check_device_online(device)
|
||
device['status'] = status
|
||
# 可选:将状态上报给后端(仅用于记录)
|
||
self.report_device_status(device['id'], status)
|
||
|
||
self.wrench_devices = devices
|
||
self.root.after(0, self.update_device_combo)
|
||
time.sleep(10)
|
||
|
||
threading.Thread(target=check_status, daemon=True).start()
|
||
|
||
def check_device_online(self, device):
|
||
"""客户端直接检测设备在线状态"""
|
||
try:
|
||
config = {
|
||
"ip_address": device.get('ip_address'),
|
||
"port": device.get('port', 7888),
|
||
"address_code": device.get('address_code', 1)
|
||
}
|
||
wrench = WrenchController(device_config=config)
|
||
is_online = wrench.connect()
|
||
if is_online:
|
||
wrench.disconnect()
|
||
return 'online'
|
||
return 'offline'
|
||
except:
|
||
return 'offline'
|
||
```
|
||
|
||
### 步骤2:简化后端设备API
|
||
|
||
**修改文件**:`backend/app.py`
|
||
|
||
**删除或简化**:
|
||
```python
|
||
# 删除check-status接口(第376-427行)
|
||
# 或改为可选的状态上报接口
|
||
@app.route('/api/wrench-devices/<int:device_id>/status', methods=['POST'])
|
||
def report_device_status(device_id):
|
||
"""客户端上报设备状态(可选,仅用于记录)"""
|
||
data = request.get_json()
|
||
status = data.get('status', 'offline')
|
||
db.update_wrench_device_status(device_id, status)
|
||
return jsonify({"success": True})
|
||
```
|
||
|
||
**保留的接口**:
|
||
- `GET /api/wrench-devices` - 获取设备列表
|
||
- `POST /api/wrench-devices` - 创建设备
|
||
- `PUT /api/wrench-devices/<id>` - 更新设备
|
||
- `DELETE /api/wrench-devices/<id>` - 删除设备
|
||
|
||
### 步骤3:移除后端对WrenchController的依赖
|
||
|
||
**修改文件**:`backend/app.py`
|
||
|
||
**删除导入**:
|
||
```python
|
||
# 删除这行
|
||
from wrench_controller import WrenchController
|
||
```
|
||
|
||
**删除相关代码**:
|
||
- 第376-427行:`check_device_status` 函数
|
||
- 第429-460行:`query_device_sn` 函数(如果有)
|
||
|
||
### 步骤4:优化延时配置
|
||
|
||
**修改文件**:`config.json`
|
||
|
||
**添加延时配置**:
|
||
```json
|
||
{
|
||
"api": {
|
||
"base_url": "http://localhost:5000/api"
|
||
},
|
||
"delays": {
|
||
"wrench_init": 1.5,
|
||
"param_set": 2.0,
|
||
"retry": 1.0,
|
||
"bolt_complete": 0.5,
|
||
"status_check_interval": 10
|
||
}
|
||
}
|
||
```
|
||
|
||
**修改文件**:`wrench_controller.py`(第448行)
|
||
|
||
```python
|
||
def set_torque_parameters(self, ...):
|
||
# 发送命令
|
||
self._send_command(bytes(data))
|
||
|
||
# 从配置读取延时
|
||
delay = self.config.get('delays', {}).get('param_set', 2.0)
|
||
time.sleep(delay)
|
||
```
|
||
|
||
**修改文件**:`frontend/wrench_gui.py`(第932行)
|
||
|
||
```python
|
||
def work_thread(self):
|
||
# 启用远程控制
|
||
self.wrench.enable_remote_control(True)
|
||
|
||
# 从配置读取延时
|
||
init_delay = self.load_delay_config('wrench_init', 1.5)
|
||
time.sleep(init_delay)
|
||
```
|
||
|
||
---
|
||
|
||
## 📋 重构后的架构图
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 客户端 (Frontend) │
|
||
├─────────────────────────────────────────────────────────────┤
|
||
│ 1. 从后端获取设备列表 │
|
||
│ 2. 直接连接扳手检测在线状态 ✅ │
|
||
│ 3. 设定扭矩参数 ✅ │
|
||
│ 4. 启动扳手、等待结果 ✅ │
|
||
│ 5. 采集实时数据 ✅ │
|
||
│ 6. 提交结果到后端 │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
↕ HTTP API
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 服务端 (Backend) │
|
||
├─────────────────────────────────────────────────────────────┤
|
||
│ 1. 设备管理 (CRUD) ✅ │
|
||
│ 2. 工单管理 (CRUD) ✅ │
|
||
│ 3. 结果存储 ✅ │
|
||
│ 4. 数据查询 ✅ │
|
||
│ 5. 不再负责:设备连接、在线检测 ❌ │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## ✅ 重构优势
|
||
|
||
1. **职责清晰**:客户端负责硬件交互,服务端负责数据管理
|
||
2. **性能提升**:在线检测无需经过后端,减少网络延迟
|
||
3. **解耦合**:后端不再依赖WrenchController,便于部署
|
||
4. **灵活配置**:延时参数可配置,适应不同扳手型号
|
||
5. **易于扩展**:客户端可以直接添加更多硬件交互功能
|
||
|
||
---
|
||
|
||
## 🚀 实施建议
|
||
|
||
### 优先级
|
||
1. **高优先级**:修改客户端在线检测(步骤1)
|
||
2. **高优先级**:优化延时配置(步骤4)
|
||
3. **中优先级**:简化后端API(步骤2)
|
||
4. **低优先级**:清理后端依赖(步骤3)
|
||
|
||
### 风险控制
|
||
- 保留后端check-status接口作为备用
|
||
- 分阶段实施,每步测试后再进行下一步
|
||
- 保留旧代码注释,便于回滚
|
||
|
||
### 测试要点
|
||
- 多台客户端同时检测设备状态
|
||
- 不同型号扳手的延时适配
|
||
- 网络断开时的容错处理
|