ETest-Vue-FastAPI/工单查询JOIN修复说明.md

123 lines
3.9 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.

# 工单查询 JOIN 修复说明
## 问题描述
样品生成工单后,提示"生成成功",但工单列表中看不到新创建的工单。
## 根本原因
工单查询使用了大量的 `INNER JOIN` 连接用户表和其他关联表。当某些字段的值为 0 或不存在对应记录时(例如 `tester_id=0``INNER JOIN` 会过滤掉这些工单,导致查询结果为空。
## 解决方案
将所有 `INNER JOIN` 改为 `LEFT OUTER JOIN`(简写为 `outerjoin`),允许关联表的数据为空。
## 修改内容
### 文件
`ruoyi-fastapi-backend/module_admin/system/dao/test_work_order_dao.py`
### 修改的 JOIN
将以下 JOIN 从 `join` 改为 `outerjoin`
- Creator (创建人)
- Updater (更新人)
- Tester (测试人)
- Reviewer (一审人)
- SecondTester (二审人)
- ThirdTester (三审人)
- TesterNick (测试人昵称)
- ReviewerNick (一审人昵称)
- SecondTesterNick (二审人昵称)
- ThirdTesterNick (三审人昵称)
- Eut (产品)
- Category (测试类别)
- Item (测试单元)
- ItemTemplate (测试单元模板)
### 代码对比
**修改前**:
```python
.join(Creator, TestWorkOrder.creator == Creator.user_id)
.join(Updater, TestWorkOrder.update_by == Updater.user_id)
.join(Tester, TestWorkOrder.tester_id == Tester.user_id)
# ... 其他 join
```
**修改后**:
```python
.outerjoin(Creator, TestWorkOrder.creator == Creator.user_id)
.outerjoin(Updater, TestWorkOrder.update_by == Updater.user_id)
.outerjoin(Tester, TestWorkOrder.tester_id == Tester.user_id)
# ... 其他 outerjoin
```
## 为什么会出现这个问题
### 样品生成工单时的默认值
`warehouse_sample_service.py` 中,创建工单时使用了以下默认值:
```python
tester_id=test_job.tester_id if (test_job and test_job.tester_id) else 0,
reviewer_id=test_job.reviewer_id if (test_job and test_job.reviewer_id) else 0,
second_tester_id=test_job.second_tester_id if (test_job and test_job.second_tester_id) else 0,
third_tester_id=test_job.third_tester_id if (test_job and test_job.third_tester_id) else 0,
```
如果 `test_job` 不存在或者相关字段为空,这些 ID 会被设置为 0。
### INNER JOIN 的行为
当使用 `INNER JOIN` 时:
```sql
SELECT * FROM test_work_order
INNER JOIN sys_user ON test_work_order.tester_id = sys_user.user_id
```
如果 `tester_id = 0``sys_user` 表中没有 `user_id = 0` 的记录,这条工单就不会出现在查询结果中。
### LEFT OUTER JOIN 的行为
当使用 `LEFT OUTER JOIN` 时:
```sql
SELECT * FROM test_work_order
LEFT OUTER JOIN sys_user ON test_work_order.tester_id = sys_user.user_id
```
即使 `tester_id = 0``sys_user` 表中没有对应记录,工单仍然会出现在查询结果中,只是关联的用户字段为 NULL。
## 验证步骤
### 1. 重启后端服务
```bash
cd ruoyi-fastapi-backend
# 停止服务
# 启动服务
```
### 2. 测试样品生成工单
1. 进入样品管理页面
2. 选择样品,点击"生成工单"
3. 填写工单信息,提交
### 3. 检查工单列表
1. 进入工单列表页面
2. **验证**: 应该能看到刚才创建的工单
3. **验证**: 工单的用户信息可能为空如果对应的用户ID不存在
### 4. 使用 SQL 验证
运行 `check_recent_workorders.sql` 查看最近创建的工单:
```bash
mysql -u root -p your_database < check_recent_workorders.sql
```
## 相关问题
这个问题与之前修复的"订单查询问题"类似:
- **订单查询**: 使用 INNER JOIN 连接用户表,导致某些订单不显示
- **工单查询**: 使用 INNER JOIN 连接用户表和其他表,导致某些工单不显示
**解决方案都是**: 将 INNER JOIN 改为 LEFT OUTER JOIN
## 相关文件
- `ruoyi-fastapi-backend/module_admin/system/dao/test_work_order_dao.py` ✅ 已修复
- `check_recent_workorders.sql` - 检查工单的 SQL 脚本
- `订单查询问题修复说明.md` - 类似问题的修复说明
## 完成时间
2026-01-08