3.9 KiB
3.9 KiB
工单查询 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 (测试单元模板)
代码对比
修改前:
.join(Creator, TestWorkOrder.creator == Creator.user_id)
.join(Updater, TestWorkOrder.update_by == Updater.user_id)
.join(Tester, TestWorkOrder.tester_id == Tester.user_id)
# ... 其他 join
修改后:
.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 中,创建工单时使用了以下默认值:
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 时:
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 时:
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. 重启后端服务
cd ruoyi-fastapi-backend
# 停止服务
# 启动服务
2. 测试样品生成工单
- 进入样品管理页面
- 选择样品,点击"生成工单"
- 填写工单信息,提交
3. 检查工单列表
- 进入工单列表页面
- 验证: 应该能看到刚才创建的工单
- 验证: 工单的用户信息可能为空(如果对应的用户ID不存在)
4. 使用 SQL 验证
运行 check_recent_workorders.sql 查看最近创建的工单:
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