WORKORDER_SCHEDULE_FIX_SUMMARY.md 5.4 KB

工单工序排产列表问题修复总结

问题描述

前端菜单"工单工序排产"点击后打开的页面 jiaohuo/ProductionSchedule.vue 调用了不存在的API /admin-api/jiaohuo/production/schedule/list,导致后端报错404。

根本原因

  1. 前端菜单关联的页面是 jiaohuo/ProductionSchedule.vue
  2. 该页面调用的是旧的 jiaohuo/production API
  3. 但实际后端实现的是 product/workorder-schedule API
  4. XML查询语句使用了SQL Server语法(如嵌套子查询的ROW_NUMBER),需要改为MySQL语法

修复内容

1. 修复XML查询语句 (WorkOrderScheduleMapper.xml)

文件: yudao-module-product/src/main/resources/mapper/product/WorkOrderScheduleMapper.xml

修改内容:

  • 将SQL Server的嵌套子查询语法改为MySQL的窗口函数语法
  • 使用 <![CDATA[<=]]><![CDATA[>]]> 来转义XML中的比较运算符
  • 简化ROW_NUMBER子查询,直接在LEFT JOIN中使用窗口函数

关键修改:

-- 修改前(SQL Server嵌套子查询)
LEFT JOIN (
    SELECT morder_no, create_time AS checktime
    FROM (
        SELECT morder_no, create_time,
               ROW_NUMBER() OVER (PARTITION BY morder_no ORDER BY create_time DESC) AS rn
        FROM b_examine_result
    ) ranked
    WHERE rn = 1
) exm ON exm.morder_no = a.WorkOrd

-- 修改后(MySQL窗口函数)
LEFT JOIN (
    SELECT morder_no, create_time AS checktime,
           ROW_NUMBER() OVER (PARTITION BY morder_no ORDER BY create_time DESC) AS rn
    FROM b_examine_result
) exm ON exm.morder_no = a.WorkOrd AND exm.rn = 1

2. 修复前端页面API调用 (ProductionSchedule.vue)

文件: yudao-ui/yudao-ui-admin-vue3/src/views/jiaohuo/ProductionSchedule.vue

修改内容:

  1. 修改API导入:

    // 修改前
    import { 
     getProductionScheduleList, 
     closeWorkOrders, 
     generateProductionSchedule, 
     syncMaterialRequirement,
     syncProcessRoute,
     setWorkOrderUrgent
    } from '@/api/jiaohuo/production'
       
    // 修改后
    import { 
     getWorkOrderSchedulePage,
     closeWorkOrders,
     productionSchedule,
     syncMaterialRequirement,
     syncRouting,
     setUrgent
    } from '@/api/product/workorderSchedule'
    
  2. 修改查询方法:

    • 使用 getWorkOrderSchedulePage 替代 getProductionScheduleList
    • 参数名改为小驼峰格式: workOrd, itemNum, status
    • 使用 pageNopageSize 参数
  3. 修改字段名:

    • 搜索表单字段: WorkOrdworkOrd, ItemNumitemNum, Statusstatus
    • 表格列字段: 所有大驼峰改为小驼峰(如 Prioritypriority)
    • 状态值: 'p'/'r'/'c''open'/'released'/'closed'
  4. 修改API调用:

    • generateProductionScheduleproductionSchedule(domain)
    • syncProcessRoute(workOrd)syncRouting(id)
    • setWorkOrderUrgent({workOrd, urgentLevel})setUrgent({id, urgent})
  5. 启用自动查询:

    // 修改前
    // handleSearch()  // 注释掉
       
    // 修改后
    handleSearch()  // 启用
    

3. 重新编译后端模块

mvn clean install -DskipTests -pl yudao-module-product -am

4. 重启后端服务

# 停止旧进程
Get-Process -Name java | Stop-Process -Force

# 启动新进程
cd yudao-server
mvn spring-boot:run -Dspring-boot.run.profiles=local

验证步骤

  1. 等待后端启动完成 (约1-2分钟)

    • 访问 http://localhost:48080/doc.html 确认后端已启动
  2. 登录系统

    • 访问前端页面
    • 使用管理员账号登录
  3. 测试工单工序排产页面

    • 点击菜单"工单工序排产"
    • 应该能看到数据列表(如果数据库中有数据)
    • 测试查询、分页等功能
  4. 检查浏览器控制台

    • 打开F12开发者工具
    • 查看Network标签,确认API请求成功
    • 查看Console标签,确认没有JavaScript错误

注意事项

  1. 数据库数据: 如果WorkOrdMaster表中没有数据或Status字段为空,列表将显示为空
  2. 权限配置: 确保用户拥有 product:workorder-schedule:query 权限
  3. Domain参数: 生产排程和同步物料需求功能需要传入正确的domain参数
  4. 状态映射: 后端返回的状态值是小写的 open/released/closed,前端需要正确映射显示文本

相关文件

后端文件

  • yudao-module-product/src/main/resources/mapper/product/WorkOrderScheduleMapper.xml
  • yudao-module-product/src/main/java/cn/iocoder/yudao/module/product/controller/admin/workorder/WorkOrderScheduleController.java
  • yudao-module-product/src/main/java/cn/iocoder/yudao/module/product/service/impl/WorkOrderScheduleServiceImpl.java
  • yudao-module-product/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/WorkOrderScheduleMapper.java

前端文件

  • yudao-ui/yudao-ui-admin-vue3/src/views/jiaohuo/ProductionSchedule.vue
  • yudao-ui/yudao-ui-admin-vue3/src/api/product/workorderSchedule.ts

后续优化建议

  1. 统一命名规范: 建议统一使用小驼峰命名,避免混用大小驼峰
  2. Domain参数获取: 从用户登录信息或系统配置中获取domain参数
  3. 错误处理: 增强错误提示,区分不同类型的错误(网络错误、权限错误、数据错误等)
  4. 数据验证: 添加前端表单验证,确保输入数据的有效性
  5. 页面整合: 考虑是否需要保留两个工单排产页面(product/WorkOrderSchedule.vuejiaohuo/ProductionSchedule.vue),建议统一使用一个