TorqueWrench/架构重构方案.md

231 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 电动扳手系统架构重构方案
## 📊 当前架构问题分析
### 现状
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接口作为备用
- 分阶段实施,每步测试后再进行下一步
- 保留旧代码注释,便于回滚
### 测试要点
- 多台客户端同时检测设备状态
- 不同型号扳手的延时适配
- 网络断开时的容错处理