TorqueWrench/电动扳手系统 API 接口文档.md

787 lines
16 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.

# 电动扳手系统 API 接口文档
## 基础信息
- **基础URL**: `http://localhost:5000`
- **API前缀**: `/api`
- **数据格式**: JSON
- **字符编码**: UTF-8
---
## 目录
1. [工单管理](#工单管理)
2. [扳手设备管理](#扳手设备管理)
3. [执行结果查询](#执行结果查询)
4. [系统健康检查](#系统健康检查)
---
## 工单管理
### 1. 查询工单列表
**接口地址**: `GET /api/work-orders`
**接口描述**: 查询可用工单列表
**请求参数** (Query Parameters):
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| trace_id | string | 否 | 追溯号 |
| process_id | string | 否 | 工序号 |
**请求示例**:
```
GET /api/work-orders
GET /api/work-orders?trace_id=TR20260119001&process_id=P001
```
**响应示例**:
```json
{
"success": true,
"message": "查询成功",
"data": [
{
"trace_id": "TR20260119001",
"process_id": "P001",
"process_name": "拧紧工序",
"product_name": "产品A",
"operator": "操作员1",
"bolt_count": 4,
"status": "pending"
}
]
}
```
**说明**:
- 如果不传参数,返回所有可用工单
- 如果同时传入 `trace_id``process_id`,返回符合条件的工单
---
### 2. 认领工单
**接口地址**: `POST /api/work-orders/claim`
**接口描述**: 认领一个工单,使其进入工作状态
**请求参数** (JSON Body):
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| trace_id | string | 是 | 追溯号 |
| process_id | string | 是 | 工序号 |
| operator | string | 否 | 操作员名称,默认为"未知操作员" |
**请求示例**:
```json
{
"trace_id": "TR20260119001",
"process_id": "P001",
"operator": "张三"
}
```
**响应示例**:
```json
{
"success": true,
"message": "认领成功",
"data": {
"trace_id": "TR20260119001",
"process_id": "P001",
"process_name": "拧紧工序",
"product_name": "产品A",
"bolts": [
{
"bolt_id": "B001",
"name": "螺栓1",
"target_torque": 50.0,
"mode": 1
}
]
}
}
```
**错误响应**:
- `400`: 追溯号和工序号不能为空
- `400`: 该工单已被认领
- `404`: 未找到符合条件的工单
- `500`: 认领失败
---
### 3. 提交工单数据
**接口地址**: `POST /api/work-orders/submit`
**接口描述**: 提交工单执行结果
**请求参数** (JSON Body):
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| trace_id | string | 是 | 追溯号 |
| process_id | string | 是 | 工序号 |
| bolts | array | 是 | 螺栓数据列表 |
| device_sn | string | 否 | 设备SN号 |
| device_name | string | 否 | 设备名称 |
**螺栓数据格式** (bolts数组中的每个对象):
```json
{
"bolt_id": "B001",
"name": "螺栓1",
"target_torque": 50.0,
"actual_torque": 50.2,
"success": true,
"timestamp": "2026-01-19 10:30:00"
}
```
**字段说明**:
- `target_torque` (float): **目标扭矩**,工单中设定的目标扭矩值,单位:牛米(Nm)
- `actual_torque` (float): **实际扭矩**,扳手实际拧紧时达到的扭矩值,单位:牛米(Nm)
- `success` (boolean): 拧紧是否成功,根据实际扭矩是否在目标扭矩的容差范围内判断
- `timestamp` (string): 拧紧完成的时间戳,格式:`YYYY-MM-DD HH:MM:SS`
**请求示例**:
```json
{
"trace_id": "TR20260119001",
"process_id": "P001",
"bolts": [
{
"bolt_id": "B001",
"name": "螺栓1",
"target_torque": 50.0,
"actual_torque": 50.2,
"success": true,
"timestamp": "2026-01-19 10:30:00"
}
],
"device_sn": "1234567890",
"device_name": "扳手设备1"
}
```
**响应示例**:
```json
{
"success": true,
"message": "数据提交成功",
"data": {
"trace_id": "TR20260119001",
"process_id": "P001",
"submitted_at": "2026-01-19 10:35:00"
}
}
```
**错误响应**:
- `400`: 追溯号和工序号不能为空
- `400`: 该工单未被认领,无法提交
- `500`: 提交失败
---
### 4. 释放工单
**接口地址**: `POST /api/work-orders/release`
**接口描述**: 释放已认领的工单(取消认领)
**请求参数** (JSON Body):
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| trace_id | string | 是 | 追溯号 |
| process_id | string | 是 | 工序号 |
**请求示例**:
```json
{
"trace_id": "TR20260119001",
"process_id": "P001"
}
```
**响应示例**:
```json
{
"success": true,
"message": "释放成功"
}
```
**错误响应**:
- `400`: 追溯号和工序号不能为空
- `400`: 该工单未被认领
---
### 5. 创建工单
**接口地址**: `POST /api/work-orders/create`
**接口描述**: 创建新的工单
**请求参数** (JSON Body):
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| trace_id | string | 是 | 追溯号 |
| process_id | string | 是 | 工序号 |
| process_name | string | 否 | 工序名称 |
| product_name | string | 否 | 产品名称 |
| operator | string | 否 | 操作员 |
| status | string | 否 | 状态,默认为"pending" |
| bolts | array | 是 | 螺栓数据列表 |
**螺栓数据格式** (bolts数组中的每个对象):
```json
{
"bolt_id": "B001",
"name": "螺栓1",
"target_torque": 50.0,
"mode": 1,
"torque_tolerance": 0.10,
"angle_min": 1,
"angle_max": 360
}
```
**字段说明**:
- `bolt_id` (string): 螺栓编号
- `name` (string): 螺栓名称
- `target_torque` (float): **目标扭矩**,需要达到的目标扭矩值,单位:牛米(Nm)
- `mode` (integer): 拧紧模式通常为1
- `torque_tolerance` (float): 扭矩容差允许的扭矩偏差范围相对值如0.10表示±10%
- `angle_min` (integer): 最小角度,单位:度(°)
- `angle_max` (integer): 最大角度,单位:度(°)
**请求示例**:
```json
{
"trace_id": "TR20260119001",
"process_id": "P001",
"process_name": "拧紧工序",
"product_name": "产品A",
"operator": "张三",
"bolts": [
{
"bolt_id": "B001",
"name": "螺栓1",
"target_torque": 50.0,
"mode": 1
}
]
}
```
**响应示例**:
```json
{
"success": true,
"message": "工单创建成功",
"data": {
"trace_id": "TR20260119001",
"process_id": "P001"
}
}
```
**错误响应**:
- `400`: 必填字段不能为空
- `500`: 工单创建失败
---
## 扳手设备管理
### 1. 获取设备列表
**接口地址**: `GET /api/wrench-devices`
**接口描述**: 获取所有扳手设备列表
**请求参数**: 无
**响应示例**:
```json
{
"success": true,
"message": "查询成功",
"data": [
{
"id": 1,
"device_name": "扳手设备1",
"device_sn": "1234567890",
"ip_address": "192.168.1.100",
"port": 7888,
"address_code": 1,
"status": "online",
"last_heartbeat": "2026-01-19 10:30:00"
}
]
}
```
---
### 2. 创建设备
**接口地址**: `POST /api/wrench-devices`
**接口描述**: 创建新的扳手设备
**请求参数** (JSON Body):
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| device_name | string | 是 | 设备名称 |
| device_sn | string | 否 | 设备SN号 |
| ip_address | string | 是 | IP地址 |
| port | integer | 否 | 端口默认为7888 |
| address_code | integer | 否 | 地址码默认为1 |
**请求示例**:
```json
{
"device_name": "扳手设备1",
"device_sn": "1234567890",
"ip_address": "192.168.1.100",
"port": 7888,
"address_code": 1
}
```
**响应示例**:
```json
{
"success": true,
"message": "设备创建成功"
}
```
**错误响应**:
- `400`: 必填字段不能为空
- `500`: 设备创建失败
---
### 3. 更新设备
**接口地址**: `PUT /api/wrench-devices/<device_id>`
**接口描述**: 更新扳手设备信息
**路径参数**:
- `device_id`: 设备ID (integer)
**请求参数** (JSON Body):
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| device_name | string | 否 | 设备名称 |
| device_sn | string | 否 | 设备SN号 |
| ip_address | string | 否 | IP地址 |
| port | integer | 否 | 端口 |
| address_code | integer | 否 | 地址码 |
**请求示例**:
```json
PUT /api/wrench-devices/1
{
"device_name": "扳手设备1-更新",
"ip_address": "192.168.1.101"
}
```
**响应示例**:
```json
{
"success": true,
"message": "设备更新成功"
}
```
**错误响应**:
- `500`: 设备更新失败
---
### 4. 删除设备
**接口地址**: `DELETE /api/wrench-devices/<device_id>`
**接口描述**: 删除扳手设备
**路径参数**:
- `device_id`: 设备ID (integer)
**请求示例**:
```
DELETE /api/wrench-devices/1
```
**响应示例**:
```json
{
"success": true,
"message": "设备删除成功"
}
```
**错误响应**:
- `500`: 设备删除失败
---
### 5. 更新设备状态
**接口地址**: `POST /api/wrench-devices/<device_id>/status`
**接口描述**: 更新设备状态(用于心跳检测)
**路径参数**:
- `device_id`: 设备ID (integer)
**请求参数** (JSON Body):
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| status | string | 否 | 状态,默认为"offline",可选值: "online", "offline" |
**请求示例**:
```json
POST /api/wrench-devices/1/status
{
"status": "online"
}
```
**响应示例**:
```json
{
"success": true,
"message": "状态更新成功"
}
```
**错误响应**:
- `500`: 状态更新失败
---
### 6. 检测设备在线状态
**接口地址**: `POST /api/wrench-devices/<device_id>/check-status`
**接口描述**: 主动检测设备是否在线(尝试连接设备)
**路径参数**:
- `device_id`: 设备ID (integer)
**请求参数**: 无
**请求示例**:
```
POST /api/wrench-devices/1/check-status
```
**响应示例**:
```json
{
"success": true,
"message": "设备在线",
"data": {
"status": "online"
}
}
```
**错误响应**:
- `404`: 设备不存在
- `500`: 检测失败
**说明**:
- 此接口会主动尝试连接设备,根据连接结果更新设备状态
- 如果设备在线,状态会被更新为"online"
- 如果设备离线或连接失败,状态会被更新为"offline"
---
### 7. 查询设备SN码
**接口地址**: `POST /api/wrench-devices/<device_id>/query-sn`
**接口描述**: 查询设备SN码通过设备协议查询
**路径参数**:
- `device_id`: 设备ID (integer)
**请求参数**: 无
**请求示例**:
```
POST /api/wrench-devices/1/query-sn
```
**响应示例**:
```json
{
"success": true,
"message": "查询成功",
"data": {
"device_sn": "1234567890",
"status": "online"
}
}
```
**错误响应**:
- `404`: 设备不存在
- `500`: 查询失败或无法连接到设备
**说明**:
- 此接口会主动连接设备并查询SN码
- 如果查询成功设备SN码会被更新到数据库
- 设备状态会被更新为"online"
---
## 执行结果查询
### 查询执行结果
**接口地址**: `GET /api/work-results`
**接口描述**: 查询工单执行结果
**请求参数** (Query Parameters):
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| trace_id | string | 否 | 追溯号 |
| process_id | string | 否 | 工序号 |
**请求示例**:
```
GET /api/work-results?trace_id=TR20260119001&process_id=P001
GET /api/work-results?trace_id=TR20260119001
GET /api/work-results?process_id=P001
GET /api/work-results
```
**响应示例** (单个结果):
```json
{
"success": true,
"message": "查询成功",
"data": {
"id": 1,
"trace_id": "TR20260119001",
"process_id": "P001",
"process_name": "拧紧工序",
"bolts": [
{
"bolt_id": "B001",
"name": "螺栓1",
"target_torque": 50.0,
"actual_torque": 50.2,
"success": true,
"timestamp": "2026-01-19 10:30:00"
}
],
"device_sn": "1234567890",
"device_name": "扳手设备1",
"submitted_at": "2026-01-19 10:35:00"
}
}
```
**响应示例** (结果列表):
```json
{
"success": true,
"message": "查询成功",
"data": [
{
"id": 1,
"trace_id": "TR20260119001",
"process_id": "P001",
"process_name": "拧紧工序",
"bolts": [...],
"device_sn": "1234567890",
"device_name": "扳手设备1",
"submitted_at": "2026-01-19 10:35:00"
}
],
"count": 1
}
```
**说明**:
- 如果同时提供 `trace_id``process_id`返回指定工单的单个结果如果不存在返回404
- 如果只提供 `trace_id`,返回该追溯号下的所有结果列表
- 如果只提供 `process_id`,返回该工序号下的所有结果列表
- 如果都不提供,返回所有执行结果列表
**结果数据中的扭矩字段说明**:
- `target_torque` (float): **目标扭矩**,工单中设定的目标扭矩值(单位:牛米/Nm
- `actual_torque` (float): **实际扭矩**,扳手实际拧紧时达到的扭矩值(单位:牛米/Nm
- 拧紧成功的判断标准:`actual_torque` 在 `target_torque ± (target_torque × torque_tolerance)` 范围内
**错误响应**:
- `404`: 未找到执行结果仅当同时提供trace_id和process_id时
- `500`: 查询失败
---
## 系统健康检查
### 健康检查
**接口地址**: `GET /api/health`
**接口描述**: 检查系统运行状态
**请求参数**: 无
**响应示例**:
```json
{
"success": true,
"message": "服务运行正常",
"timestamp": "2026-01-19 10:30:00"
}
```
---
## 通用响应格式
### 成功响应
```json
{
"success": true,
"message": "操作成功",
"data": { ... }
}
```
### 错误响应
```json
{
"success": false,
"message": "错误信息",
"data": null
}
```
## HTTP状态码
| 状态码 | 说明 |
|--------|------|
| 200 | 请求成功 |
| 400 | 请求参数错误 |
| 404 | 资源不存在 |
| 500 | 服务器内部错误 |
---
## 数据模型
### 工单对象 (WorkOrder)
```json
{
"trace_id": "TR20260119001",
"process_id": "P001",
"process_name": "拧紧工序",
"product_name": "产品A",
"operator": "操作员1",
"status": "pending",
"bolt_count": 4,
"bolts": [
{
"bolt_id": "B001",
"name": "螺栓1",
"target_torque": 50.0,
"mode": 1,
"torque_tolerance": 0.10,
"angle_min": 1,
"angle_max": 360
}
]
}
```
### 设备对象 (WrenchDevice)
```json
{
"id": 1,
"device_name": "扳手设备1",
"device_sn": "1234567890",
"ip_address": "192.168.1.100",
"port": 7888,
"address_code": 1,
"status": "online",
"last_heartbeat": "2026-01-19 10:30:00"
}
```
### 执行结果对象 (WorkResult)
```json
{
"id": 1,
"trace_id": "TR20260119001",
"process_id": "P001",
"process_name": "拧紧工序",
"bolts": [
{
"bolt_id": "B001",
"name": "螺栓1",
"target_torque": 50.0,
"actual_torque": 50.2,
"success": true,
"timestamp": "2026-01-19 10:30:00"
}
],
"device_sn": "1234567890",
"device_name": "扳手设备1",
"submitted_at": "2026-01-19 10:35:00"
}
```
**螺栓结果字段说明**:
- `target_torque` (float): **目标扭矩**,工单中设定的目标扭矩值,单位:牛米(Nm)
- `actual_torque` (float): **实际扭矩**,扳手实际拧紧时达到的扭矩值,单位:牛米(Nm)
- `success` (boolean): 拧紧是否成功,根据实际扭矩是否在目标扭矩的容差范围内判断
- `timestamp` (string): 拧紧完成的时间戳
---
## 注意事项
1. 所有时间格式为: `YYYY-MM-DD HH:MM:SS`
2. 所有接口都支持CORS跨域请求
3. 请求和响应数据均为JSON格式
4. 设备状态可选值: `online`, `offline`
5. 工单状态可选值: `pending`, `claimed`, `completed`
6. 扭矩单位: 牛米 (Nm)
7. 角度单位: 度 (°)
---
## 更新日志
- 2026-01-19: 初始版本,包含工单管理、设备管理和结果查询功能