## Phase 3 实施完成 ### P3-1: 前端轮询优化 (ljwx-phone) - ✅ 实现指数退避轮询器 (ExponentialBackoffPoller) - 初始间隔 2s,最大间隔 30s - 随机抖动 ±20% 避免惊群效应 - 自动重置机制 ### P3-2: SSE 实时推送 (ljwx-phone) - ✅ 实现 SSE 客户端服务 (SseClient) - 自动重连机制 (指数退避) - 心跳检测 (30s 超时) - 事件类型路由 ### P3-3: 批量审批确认机制 - ✅ 后端 confirmToken 机制 - Redis 存储,5分钟过期 - 防重放攻击 - 批量操作原子性保证 - ✅ 前端确认弹窗 (BatchApprovalConfirmModal.vue) - 显示待审批设备列表 - 二次确认交互 ### P3-4: 设备绑定 V2 API (HMAC-SHA256 签名验证) - ✅ DeviceBindEventController - SSE 事件推送 - ✅ DeviceSignatureService - HMAC-SHA256 签名验证 - ✅ DeviceKeyService - 设备密钥管理 - ✅ ChallengeVO, ConfirmTokenVO - V2 API 响应对象 - ✅ BindRequestStatus - 绑定请求状态枚举 ## E2E 测试基础设施 ### 测试脚本 - ✅ test_e2e_flow.py - 完整端到端测试 - 租户/部门/员工创建 - 设备注册与绑定 - 健康数据上传与查询 - 告警与消息生成 - ✅ test_device_binding_v2.py - 设备绑定 V2 API 测试 - Challenge 获取 - HMAC-SHA256 签名验证 - 绑定请求提交 - 审批流程测试 ### 测试配置 - ✅ api-map.yaml - 新增 device_binding_v2 API 映射 - 11 个 V2 API 端点完整定义 - 请求/响应 schema 规范 - ✅ recipes/device_binding_v2_test.yaml - V2 测试场景配置 ### 测试文档 - ✅ E2E_FLOW_TEST_GUIDE.md - E2E 测试指南 - ✅ DEVICE_BINDING_V2_TEST_GUIDE.md - V2 API 测试指南 - ✅ device-binding-phase3-implementation-report.md - Phase 3 实施报告 ## 修复问题 - 🐛 修复 UserContext API 调用错误 - getUserId() → getCurrentUserId() - getUserName() → getCurrentUserName() - 🐛 修复 TDeviceUser 实体方法调用 - setUpdatedAt() → setUpdateTime() - 🐛 修复 BizException 构造函数签名 - 🐛 修复测试脚本 API 端点 - /t_org/ → /sys_org_units/ - /t_user/ → /sys_user/ - 🐛 修复认证头格式 - satoken: <token> → Authorization: Bearer <token> ## 测试状态 - ✅ 编译通过,应用启动成功 (端口 9998) - ✅ E2E 测试步骤 1-4 通过 (租户/部门/员工/设备注册) - ⏳ 步骤 5-8 待完成 (需配置设备密钥) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
9.9 KiB
9.9 KiB
端到端流程测试指南 (E2E Flow Test Guide)
创建时间: 2026-02-07 用途: 完整测试从租户创建到健康数据告警的全流程
📋 测试流程
本测试覆盖以下完整流程:
1. 创建租户 (Create Tenant)
↓
2. 创建部门 (Create Department)
↓
3. 创建员工 (Create Employee)
↓
4. 注册设备 (Register Device)
↓
5. 绑定设备 (Bind Device - V2 API with Signature)
↓
6. 审批绑定 (Approve Binding)
↓
7. 上传健康数据 (Upload Health Data)
↓
8. 查询健康数据 (Query Health Data)
↓
9. [自动] 生成告警 (Generate Alerts - via scheduled tasks)
↓
10. [自动] 发送消息 (Send Messages - via alert rules)
🚀 快速开始
前置条件
- ljwx-boot 运行中: http://localhost:9998
- 获取 SaToken: 通过登录接口获取
- Python 3.8+: 安装 requests 库
步骤 1: 获取 SaToken
# 登录获取 token (密码已 SHA256 加密)
curl -X POST http://localhost:9998/auth/user_name \
-H "Content-Type: application/json" \
-d '{
"userName": "admin",
"password": "80a3d119ee1501354755dfc3c4638d74c67c801689efbed4f25f06cb4b1cd776"
}' \
-v 2>&1 | grep -i satoken
# 输出示例:
# < satoken: your_token_here
步骤 2: 运行端到端测试
cd ljwx-boot/scripts/test-data-factory
# 运行完整流程测试
python test_e2e_flow.py \
--base-url http://localhost:9998 \
--token <your_satoken>
预期输出
============================================================
🚀 Starting End-to-End Flow Test
============================================================
============================================================
📍 Step 1: 创建租户 (Create Tenant)
============================================================
ℹ️ Creating tenant: E2E_Test_Tenant_1707318000
✅ Tenant created: ID=123
============================================================
📍 Step 2: 创建部门 (Create Department)
============================================================
ℹ️ Creating organization: E2E Test Department
✅ Organization created: ID=456
============================================================
📍 Step 3: 创建员工 (Create Employee)
============================================================
ℹ️ Creating user: e2e_user_1707318000
✅ User created: ID=789
============================================================
📍 Step 4: 注册设备 (Register Device)
============================================================
ℹ️ Registering device: E2E_TEST_1707318000
✅ Device registered successfully
============================================================
📍 Step 5: 绑定设备 (Bind Device - V2 API)
============================================================
ℹ️ Binding device E2E_TEST_1707318000 to user 789
ℹ️ Challenge received: a1b2c3d4e5f6g7h8i9j0...
ℹ️ Signature calculated: 9f8e7d6c5b4a3f2e1d0c...
✅ Binding requested: approvalId=abc-123
============================================================
📍 Step 6: 审批绑定 (Approve Binding)
============================================================
ℹ️ Approving binding: abc-123
✅ Binding approved successfully
============================================================
📍 Step 7: 上传健康数据 (Upload Health Data)
============================================================
ℹ️ Uploading health data for user 789
✅ Health data uploaded: 3 records
============================================================
📍 Step 8: 查询健康数据 (Query Health Data)
============================================================
ℹ️ Querying health data for user 789
✅ Health data queried: 3 records found
============================================================
✅ End-to-End Flow Test COMPLETED SUCCESSFULLY
============================================================
📊 Test Context:
{
"tenant_id": 123,
"org_id": 456,
"user_id": 789,
"device_sn": "E2E_TEST_1707318000",
"device_secret": "e2e_test_secret_001",
"approval_id": "abc-123"
}
💡 Next Steps:
- Check alerts in database: SELECT * FROM t_alert WHERE user_id = 789
- Check messages: SELECT * FROM t_message WHERE user_id = 789
- View in BigScreen: http://localhost:5225
- View in Admin: http://localhost:3333
🔍 验证结果
1. 数据库验证
-- 查看创建的租户
SELECT * FROM t_customer_config WHERE customer_name LIKE 'E2E_Test_Tenant_%';
-- 查看创建的部门
SELECT * FROM t_org WHERE org_name = 'E2E Test Department';
-- 查看创建的用户
SELECT * FROM t_user WHERE user_name LIKE 'e2e_user_%';
-- 查看设备注册
SELECT * FROM t_device_info WHERE device_sn LIKE 'E2E_TEST_%';
-- 查看设备绑定
SELECT * FROM t_device_user WHERE device_sn LIKE 'E2E_TEST_%';
-- 查看健康数据
SELECT * FROM t_user_health_data
WHERE user_id = <your_user_id>
ORDER BY event_time DESC
LIMIT 10;
-- 查看告警 (需要等待定时任务执行)
SELECT * FROM t_alert
WHERE user_id = <your_user_id>
ORDER BY created_at DESC;
-- 查看消息
SELECT * FROM t_message
WHERE user_id = <your_user_id>
ORDER BY created_at DESC;
2. API 验证
# 查询用户健康数据
curl -X GET "http://localhost:9998/api/health/data/query?customerId=123&userId=789&pageNum=1&pageSize=10" \
-H "satoken: <your_token>"
# 查询用户告警
curl -X GET "http://localhost:9998/api/alert/list?userId=789&pageNum=1&pageSize=10" \
-H "satoken: <your_token>"
# 查询用户消息
curl -X GET "http://localhost:9998/api/message/list?userId=789&pageNum=1&pageSize=10" \
-H "satoken: <your_token>"
3. 前端验证
管理后台 (ljwx-admin):
- 访问: http://localhost:3333
- 登录: admin / kt123456
- 查看: 租户管理 → 组织管理 → 用户管理 → 设备管理
大屏监控 (ljwx-bigscreen):
- 访问: http://localhost:5225
- 查看: 实时健康数据 → 告警统计 → 设备状态
🔧 告警和消息生成
自动生成机制
告警和消息由后台定时任务自动生成,无需手动触发:
1. 告警规则引擎 (Alert Rule Engine)
触发条件:
- 健康数据超出阈值(心率、血氧、体温等)
- 设备离线超时
- 数据质量异常
执行频率: 每分钟检查一次
查看日志:
tail -f ljwx-boot/logs/ljwx-boot-admin_*.log | grep "AlertRuleEngine"
2. 消息推送服务 (Message Publisher)
触发条件:
- 告警生成后自动推送
- 设备绑定状态变更
- 系统通知
推送渠道:
- 企业微信
- 短信
- 邮件
- Webhook
查看日志:
tail -f ljwx-boot/logs/ljwx-boot-admin_*.log | grep "UnifiedMessagePublisher"
手动触发告警 (测试用)
如果需要立即生成告警进行测试:
# 上传异常健康数据 (心率过高)
curl -X POST http://localhost:9998/api/health/data/batch \
-H "Content-Type: application/json" \
-H "satoken: <your_token>" \
-d '[{
"customerId": 123,
"userId": 789,
"deviceSn": "E2E_TEST_1707318000",
"metricType": "heart_rate",
"metricValue": 180.0,
"unit": "bpm",
"eventTime": "2026-02-07 22:00:00",
"metadata": "{\"source\":\"manual_test\"}"
}]'
# 等待 1-2 分钟,告警规则引擎会自动检测并生成告警
📊 性能基准
| 步骤 | 预期耗时 | 说明 |
|---|---|---|
| 创建租户 | < 200ms | 数据库写入 |
| 创建部门 | < 150ms | 数据库写入 |
| 创建员工 | < 200ms | 密码加密 + 写入 |
| 注册设备 | < 150ms | 数据库写入 |
| 绑定设备 | < 300ms | 签名验证 + 写入 |
| 审批绑定 | < 200ms | CAS 更新 |
| 上传健康数据 | < 500ms | 批量写入 (3条) |
| 查询健康数据 | < 200ms | 索引查询 |
| 总耗时 | < 2秒 | 不含等待时间 |
🐛 故障排查
问题 1: "Failed to create tenant"
原因: 权限不足或租户名重复
解决:
- 确认使用 admin 账号登录
- 检查租户名是否已存在
- 查看后端日志:
tail -f ljwx-boot/logs/ljwx-boot-admin_*.log
问题 2: "Signature verification failed"
原因: 设备密钥不匹配或签名计算错误
解决:
- 确认设备密钥已在系统中配置
- 检查签名计算:
message = challenge + deviceSn - 使用 HMAC-SHA256 算法
问题 3: "Health data upload failed"
原因: 设备未绑定或数据格式错误
解决:
- 确认设备绑定已审批通过
- 检查 metricType 是否支持
- 检查数据格式是否正确
问题 4: "No alerts generated"
原因: 数据未触发告警规则或定时任务未执行
解决:
- 检查告警规则配置:
SELECT * FROM t_alert_rule WHERE status = '1' - 查看定时任务日志:
grep "AlertRuleEngine" ljwx-boot/logs/*.log - 手动上传异常数据触发告警
📚 相关文档
💡 扩展测试
测试多用户场景
# 运行 3 次创建 3 个用户
for i in {1..3}; do
python test_e2e_flow.py \
--base-url http://localhost:9998 \
--token <your_token>
sleep 2
done
测试批量数据上传
修改 test_e2e_flow.py 中的 upload_health_data 方法,增加数据量:
# 生成 100 条健康数据
for i in range(100):
event_time = (now - timedelta(minutes=i*5)).strftime("%Y-%m-%d %H:%M:%S")
health_data.append({
"customerId": customer_id,
"userId": user_id,
"deviceSn": device_sn,
"metricType": "heart_rate",
"metricValue": 70 + (i % 20),
"unit": "bpm",
"eventTime": event_time
})
测试告警规则
- 创建自定义告警规则
- 上传触发告警的数据
- 验证告警生成和消息推送
最后更新: 2026-02-07