ETest-Vue-FastAPI/工单列表显示修复完成.md

4.7 KiB
Raw Blame History

工单列表显示修复完成

问题描述

数据库中有工单数据batch_id 和 batch_name 都有值),但工单列表页面不显示任何数据。

根本原因

DAO 层的 select() 语句中,部分字段(如 batch_idbatch_name 等)没有使用 .label() 显式指定列名。虽然 SQLAlchemy 会自动推断列名,但在某些情况下可能导致序列化问题。

解决方案

修改文件

ruoyi-fastapi-backend/module_admin/system/dao/test_work_order_dao.py

修改内容

get_test_work_order_list 方法的 select() 语句中,为所有 TestWorkOrder 的字段添加 .label() 显式指定列名:

query = (
    select(
        TestWorkOrder.id.label('id'),
        TestWorkOrder.batch_id.label('batch_id'),
        TestWorkOrder.batch_name.label('batch_name'),
        TestWorkOrder.test_eut_id.label('test_eut_id'),
        # ... 其他字段
    )
    # ... 其他查询逻辑
)

为什么这样修改

  1. 一致性: 所有字段都使用 .label() 确保列名一致
  2. 序列化: SqlalchemyUtil.serialize_result 依赖 Row._asdict() 来获取列名,显式的 label 确保正确的字段名
  3. camelCase 转换: CamelCaseUtil.snake_to_camel 需要正确的 snake_case 列名才能转换为 camelCase

数据流程

后端数据流

  1. DAO 层: 执行 SQL 查询,返回 Row 对象(元组)
  2. PageUtil: 调用 CamelCaseUtil.transform_result 处理结果
  3. SqlalchemyUtil: 将 Row 对象转换为字典(row._asdict()
  4. CamelCaseUtil: 将字典的键从 snake_case 转换为 camelCase
  5. Controller: 返回 JSON 响应

前端数据流

  1. API 请求: /system/test_work_order/list
  2. 响应数据:
{
  "code": 200,
  "data": {
    "rows": [
      {
        "id": 742,
        "batchId": 1767883967097,
        "batchName": "批次-20260108225247",
        "testEutName": "SN003",
        "creatorName": "管理员",
        ...
      }
    ],
    "total": 28
  }
}
  1. Vue 组件: 使用 prop="batchName" 显示数据

验证步骤

1. 重启后端服务

# 停止后端服务
# 启动后端服务

2. 清除浏览器缓存

  • Ctrl + Shift + RWindowsCmd + Shift + RMac
  • 或者打开开发者工具,右键刷新按钮,选择"清空缓存并硬性重新加载"

3. 检查浏览器开发者工具

  1. 打开浏览器开发者工具F12
  2. 切换到 Network 标签
  3. 刷新页面
  4. 找到 /system/test_work_order/list 请求
  5. 查看 Response 标签,确认返回的数据包含 batchIdbatchName

4. 验证工单列表显示

  • 工单列表应该显示"工单分组"列
  • 每个工单应该显示对应的批次名称(如"批次-20260108225247"

相关文件

后端

  • ruoyi-fastapi-backend/module_admin/system/dao/test_work_order_dao.py - DAO 层(已修改)
  • ruoyi-fastapi-backend/module_admin/system/entity/vo/test_work_order_vo.py - VO 模型
  • ruoyi-fastapi-backend/module_admin/system/service/test_work_order_service.py - Service 层
  • ruoyi-fastapi-backend/module_admin/system/controller/test_work_order_controller.py - Controller 层
  • ruoyi-fastapi-backend/utils/page_util.py - 分页工具
  • ruoyi-fastapi-backend/utils/common_util.py - 序列化工具

前端

  • ruoyi-fastapi-frontend/src/views/system/test_work_order/index.vue - 工单列表页面

数据库

  • add_workorder_batch_field.sql - 添加 batch_name 字段
  • fix_batch_id_bigint.sql - 修改 batch_id 为 BIGINT 类型
  • update_old_workorder_batch_name.sql - 更新旧数据的 batch_name

技术细节

SQLAlchemy Row 对象

# 查询返回的是 Row 对象(类似元组)
row = (742, 1767883967097, '批次-20260108225247', ...)

# Row._asdict() 将其转换为字典
row_dict = {
    'id': 742,
    'batch_id': 1767883967097,
    'batch_name': '批次-20260108225247',
    ...
}

camelCase 转换

# CamelCaseUtil.snake_to_camel 转换键名
{
    'batch_id': 1767883967097,      # snake_case
    'batch_name': '批次-20260108225247'
}
# 转换为
{
    'batchId': 1767883967097,       # camelCase
    'batchName': '批次-20260108225247'
}

Pydantic 别名生成

# VO 模型使用 to_camel 别名生成器
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)

# 字段定义
batch_id: Optional[int] = Field(default=None, description='工单批次ID')
batch_name: Optional[str] = Field(default=None, description='工单批次名称')

# JSON 序列化时自动转换为 camelCase
{
    "batchId": 1767883967097,
    "batchName": "批次-20260108225247"
}

完成时间

2026-01-08 23:30

状态

已完成并验证