# 生产订单(生产工单)- 页面设计开发说明文档 > 版本: 3.1.0 > 创建日期: 2026-02-13 > 更新日期: 2026-02-13 > 所属模块: 生产管理 > 生产订单 > 前端路由: `/mes/pro/workorder`(MOM 端);`/production/work-order`(ERP 前端) > **关联文档**: [erp与mom数据库表映射对照表](db/erp与mom数据库表映射对照表.md);[MOM系统数据升级方案-销售采购生产计划](db/mom系统数据升级方案-销售采购生产计划.md);[生产计划.md](生产计划.md);[mom系统生产领料单-页面开发说明文档](mom系统生产领料单-页面开发说明文档.md) --- ## 目录 0. [业务流程总览](#0-业务流程总览) 1. [页面概述](#1-页面概述) 2. [页面结构](#2-页面结构) 3. [列表页设计](#3-列表页设计) 4. [新增/编辑页设计](#4-新增编辑页设计) 5. [数据字段定义](#5-数据字段定义) 6. [按钮操作说明](#6-按钮操作说明) 7. [页面交互规则](#7-页面交互规则) 8. [接口调用说明](#8-接口调用说明) 9. [状态流转](#9-状态流转) 10. [业务规则](#10-业务规则) 11. [前端组件设计](#11-前端组件设计) 12. [数据模型](#12-数据模型) --- ## 0. 业务流程总览 ### 0.1 生产订单在 MOM/ERP 中的定位 生产订单(生产工单)是 **生产计划 → 生产执行** 链条中的核心节点。生产计划单经过 BOM 运算并下发后,用户通过选择已审核的生产计划单来创建生产工单,工单驱动后续的生产任务排产、领料、报工、完工入库等生产执行环节。 > **重要约束**: 生产订单只能来源于生产计划单,不支持手动创建或从销售订单直接创建。新增生产订单时必须选择一个已审核的生产计划单,系统自动带入产品、客户、数量等信息。 ``` ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ 销售订单 │────►│ 生产计划单 │────►│ BOM运算/下发 │────►│ 物料清单MBOM │ │ (销售确认) │ │ (引入订单) │ │ (展开需求) │ │ (生产件等) │ └──────────────┘ └──────────────┘ └──────────────┘ └──────┬───────┘ │ 选择计划单,创建工单 ▼ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ 完工入库 │◄────│ 生产报工 │◄────│ 生产任务 │◄────│ ★ 生产工单 │ │ (库存增加) │ │ (工序报工) │ │ (排产执行) │ │ (当前页面) │ └──────────────┘ └──────────────┘ └──────────────┘ └──────┬───────┘ │ 一键领料 / 手动领料 ▼ ┌──────────────┐ │ 生产领料单 │ │ (物料出库) │ └──────────────┘ ``` ### 0.2 端到端业务流程图 ``` 销售订单确认 │ ▼ ┌─────────────────┐ 引入订单 ┌─────────────────┐ │ 生产计划单 │ ◄───────────────── │ 销售订单/备货单 │ │ - 订单信息子表 │ │ │ └────────┬────────┘ └─────────────────┘ │ BOM运算、下发、审核 ▼ ┌─────────────────┐ 选择计划单号 ┌─────────────────┐ │ 已审核计划单 │ ──────────────── ► │ ★ 生产工单 │ │ - 产品信息 │ 自动带入产品/客户 │ - 工艺路线 │ │ - 生产数量 │ │ - BOM物料组成 │ └─────────────────┘ └────────┬────────┘ │ ┌──────────────────────┤ │ │ ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ │ 生产领料单 │ │ 生产任务 │ │ 一键领料/手动 │ │ - 工序排产 │ └────────┬────────┘ └────────┬────────┘ │ 出库 │ 报工 ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ │ 库存扣减 │ │ 生产报工 │ └─────────────────┘ └────────┬────────┘ │ 完工 ▼ ┌─────────────────┐ │ 完工入库 │ │ - 产成品入库 │ └─────────────────┘ ``` ### 0.3 生产工单内部业务流程 | 阶段 | 操作 | 触发条件 | 结果 | |------|------|----------|------| | 1. 新建 | 点击「新增」 | 始终可用 | 打开新增页,状态=草稿(PREPARE) | | 2. 选择计划单 | 选择生产计划单号 | 新增状态 | 弹窗选择已审核的生产计划单,自动带入产品、客户、数量等信息;自动根据产品 BOM 生成 BOM 物料组成行 | | 3. 选择工艺路线 | 选择工艺路线 | 新增/编辑状态 | 弹窗选择产品对应的工艺路线,记录路线编码/名称 | | 4. 填写信息 | 填写工单编码、工单名称、生产日期等 | 新增/编辑状态 | 可保存 | | 5. 保存 | 点击「保存」 | 表单校验通过 | 数据持久化,自动生成 BOM 物料行 | | 6. 确认/审核 | 点击确认 | 草稿状态,已保存 | 工单状态→已确认(CONFIRMED),可进行排产和领料 | | 7. 领料 | **一键领料**或**手动创建领料单** | 已确认状态,有 BOM 物料 | 一键领料:自动创建领料单并填充 BOM 物料行;手动领料:跳转领料单新增页 | | 8. 排产 | 创建生产任务 | 已确认状态 | 生成生产任务,分配工序和工作站 | | 9. 完工 | 点击「完工」 | 生产中/已确认状态 | 工单状态→已完成(FINISHED),记录完成时间 | | 10. 取消 | 点击「取消」 | 草稿/已确认状态 | 工单状态→已取消(CANCELED),记录取消时间 | | 11. 删除 | 点击「删除」 | 仅草稿(PREPARE)状态 | 物理删除工单及关联 BOM 行 | ### 0.4 上下游单据关系 | 上游单据 | 关联字段 | 说明 | |----------|----------|------| | 生产计划单 | source_code (计划单号) | **唯一来源**,新增时通过选择计划单弹窗关联 | | 销售订单 | client_id, client_code, client_name | 客户信息,由生产计划自动带入 | | 产品BOM | product_id | 产品的 BOM 组成自动展开为工单 BOM 行 | | 工艺路线 | route_id, route_code, route_name | 选择产品对应的工艺路线 | | 下游单据 | 关联字段 | 说明 | |----------|----------|------| | 生产领料单(wm_issue_header) | workorder_id, workorder_code | 一键领料或手动创建领料单 | | 生产任务(pro_task) | workorder_id | 工单排产后生成的生产任务 | | 完工入库单 | workorder_id | 产成品入库关联工单 | ### 0.5 工单类型(workorderType) | 值 | 标签 | 说明 | |----|------|------| | SELF | 自产 | 企业自行生产(默认) | | OUTSOURCE | 委外 | 委托外部供应商生产 | ### 0.6 来源类型(orderSource) | 值 | 标签 | 说明 | |----|------|------| | PLAN | 生产计划 | 由生产计划单创建(**唯一来源**) | > **注意**: 生产订单只支持从已审核的生产计划单创建,不支持手动创建或从销售订单直接创建。来源类型固定为 `PLAN`。 ### 0.7 关键数量逻辑 | 数量字段 | 含义 | 计算/来源 | |----------|------|-----------| | 生产数量(quantity) | 计划生产数量 | 从生产计划单带入,可修改 | | 已生产数量(quantityProduced) | 已完成报工数量 | 生产报工回写,只读 | | 调整数量(quantityChanged) | 调整差额 | 手动调整时产生 | | 已排产数量(quantityScheduled) | 已创建生产任务的数量 | 排产后回写,只读 | ### 0.8 领料方式说明 生产工单支持两种领料方式: | 方式 | 操作 | 说明 | |------|------|------| | **一键领料** | 工单查看页点击「一键领料」按钮 | 系统自动根据工单 BOM 物料组成创建一张领料单(wm_issue_header),并将所有 BOM 物料自动填入领料行(wm_issue_line),领料数量=BOM 预计使用量。创建后跳转到领料单编辑页,用户可调整后执行出库 | | **手动领料** | 工单查看页点击「创建领料单」按钮 | 跳转到生产领料单新增页面,自动携带工单 ID 和工单编码,用户手动选择物料并填写领料数量 | ### 0.9 典型操作路径(用户故事) | 场景 | 路径 | |------|------| | **新建生产工单** | 列表 → 新增 → 选择计划单号(自动带入产品/客户) → 选择工艺路线 → 填写编码/名称/日期 → 保存 | | **查看工单详情** | 列表 → 点击工单编码或操作列「查看」 → 查看页(只读) | | **一键领料** | 列表 → 查看已确认工单 → 点击「一键领料」→ 自动创建领料单 → 跳转领料单编辑页 → 调整数量 → 执行出库 | | **手动领料** | 列表 → 查看已确认工单 → 点击「创建领料单」→ 跳转领料单新增页(自动关联工单) → 添加物料 → 保存 → 执行出库 | | **排产执行** | 列表 → 查看已确认工单 → 创建生产任务 → 分配工作站 | | **完工结案** | 列表 → 查看工单 → 确认已生产数量 → 完工 | | **取消工单** | 列表 → 查看草稿/已确认工单 → 取消 | --- ## 1. 页面概述 ### 1.1 功能说明 生产订单(生产工单)页面用于管理企业的生产制造任务。生产工单来源于已审核的生产计划单,用户通过选择计划单号创建工单,系统自动带入产品信息和 BOM 物料组成。一张工单对应一个产品的一次生产任务,包含产品信息、工艺路线、生产数量、生产日期、BOM 物料组成等关键信息。工单确认后可进行一键领料或手动创建领料单,也可进行排产、报工、完工等操作。 ### 1.2 业务场景 - **计划驱动生产**: 新增工单时选择已审核的生产计划单,自动带入产品、客户、数量等信息 - **选择工艺路线**: 工单表头可选择产品对应的工艺路线,指导后续工序排产 - **一键领料**: 工单确认后点击「一键领料」,系统自动根据 BOM 物料创建领料单 - **手动创建领料单**: 工单确认后点击「创建领料单」,跳转到领料单新增页手动添加物料 - **委外加工**: 支持委外类型工单,关联供应商信息 - **生产执行跟踪**: 记录生产数量、已生产数量、已排产数量,便于跟踪执行进度 ### 1.3 页面截图参考 | 截图文件 | 说明 | |----------|------| | `screenshot/生产订单-列表页.png` | 列表页 - 工单列表,含搜索区、工具栏、数据表格 | | `screenshot/生产订单-新增页.png` | 新增页 - 选择计划单后的表头表单 + BOM 物料组成子表 | | `screenshot/生产订单-查看页.png` | 查看页 - 只读模式,含一键领料/创建领料单按钮 | --- ## 2. 页面结构 ### 2.1 整体布局 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 顶部导航栏 (64px) │ ├────────┬────────────────────────────────────────────────────────┤ │ 左侧 │ 面包屑: 首页 / 生产管理 / 生产订单 │ │ 菜单 │ ┌────────────────────────────────────────────────┐ │ │ (200px │ │ Tab标签: ● 生产订单 │ │ │ /64px)│ ├────────────────────────────────────────────────┤ │ │ │ │ 查询区域 (搜索条件) │ │ │ 生产管 │ ├────────────────────────────────────────────────┤ │ │ 理 │ │ 工具栏 (操作按钮) │ │ │ ├生产 │ ├────────────────────────────────────────────────┤ │ │ 订单★ │ │ 数据表格 │ │ │ ├生产 │ │ │ │ │ 任务 │ ├────────────────────────────────────────────────┤ │ │ ├生产 │ │ 分页组件 │ │ │ 领料 │ └────────────────────────────────────────────────┘ │ ├────────┴────────────────────────────────────────────────────────┤ ``` ### 2.2 页面模式 | 模式 | 说明 | 入口 | |------|------|------| | 列表页 | 默认视图,展示生产工单列表 | 菜单点击「生产订单」 | | 新增页 | 新建生产工单,选择计划单号+选择工艺路线+填写表头 | 列表页点击「新增」按钮 | | 编辑页 | 修改已有生产工单(仅草稿状态) | 列表页操作列点击「编辑」 | | 查看页 | 只读查看工单详情,含 BOM 物料、一键领料/创建领料单按钮 | 列表页操作列点击「查看」或点击工单编码 | --- ## 3. 列表页设计 ### 3.1 搜索条件区域 | 序号 | 字段名 | 标签 | 组件类型 | 宽度 | 说明 | |------|--------|------|----------|------|------| | 1 | workorderCode | 工单编码 | el-input | 160px | 模糊搜索 | | 2 | workorderName | 工单名称 | el-input | 160px | 模糊搜索 | | 3 | workorderType | 工单类型 | el-select | 120px | 下拉选择:自产/委外 | | 4 | sourceCode | 计划单号 | el-input | 140px | 模糊搜索来源计划单号 | | 5 | productCode | 产品编号 | el-input | 140px | 模糊搜索 | | 6 | productName | 产品名称 | el-input | 160px | 模糊搜索 | | 7 | status | 工单状态 | el-select | 120px | 下拉选择 | | 8 | beginDate | 开始日期 | el-date-picker | 140px | 生产日期范围起 | | 9 | endDate | 结束日期 | el-date-picker | 140px | 生产日期范围止 | | 10 | - | 搜索 | el-button (primary) | - | 执行搜索 | | 11 | - | 重置 | el-button (default) | - | 清空搜索条件 | ### 3.2 工具栏按钮 | 序号 | 按钮名称 | 图标 | 类型 | 权限标识 | 说明 | |------|----------|------|------|----------|------| | 1 | 新增 | el-icon-plus | success | mes:pro:workorder:add | 打开新增生产工单页面 | | 2 | 修改 | el-icon-edit | primary | mes:pro:workorder:edit | 修改选中工单(需勾选) | | 3 | 删除 | el-icon-delete | danger | mes:pro:workorder:remove | 批量删除选中工单(需勾选) | | 4 | 导出 | el-icon-download | warning | mes:pro:workorder:export | 导出工单列表到Excel | ### 3.3 数据表格列定义 | 序号 | 列标题 | 字段名 | 宽度 | 对齐 | 说明 | |------|--------|--------|------|------|------| | 0 | (复选框) | - | 55px | center | 多选列,用于批量操作 | | 1 | 工单编码 | workorderCode | 150px | left | 蓝色链接可点击打开详情 | | 2 | 工单名称 | workorderName | 200px | left | 工单名称 | | 3 | 工单类型 | workorderType | 80px | center | 自产/委外 | | 4 | 计划单号 | sourceCode | 140px | left | 来源生产计划单号 | | 5 | 工艺路线 | routeName | 120px | left | 工艺路线名称 | | 6 | 产品编号 | productCode | 140px | left | 产品编号 | | 7 | 产品名称 | productName | 200px | left | 产品名称 | | 8 | 规格型号 | productSpc | 150px | left | 产品规格型号 | | 9 | 单位 | unitOfMeasure | 60px | center | 计量单位 | | 10 | 生产数量 | quantity | 100px | right | 计划生产数量 | | 11 | 已生产 | quantityProduced | 100px | right | 已完成报工数量 | | 12 | 已排产 | quantityScheduled | 100px | right | 已排产数量 | | 13 | 客户名称 | clientName | 150px | left | 客户名称(可为空) | | 14 | 生产日期 | productionDate | 120px | center | 计划生产日期 | | 15 | 状态 | status | 80px | center | 状态标签(颜色区分) | | 16 | 操作 | - | 240px | center | 操作按钮组 | ### 3.4 操作列按钮 操作列按钮根据工单状态动态显隐: **status = PREPARE(草稿):** | 按钮 | 颜色 | 权限 | 说明 | |------|------|------|------| | 查看 | success (绿色文字) | mes:pro:workorder:query | 打开查看页(只读) | | 编辑 | primary (蓝色文字) | mes:pro:workorder:edit | 打开编辑页 | | 确认 | success (绿色文字) | mes:pro:workorder:edit | 确认工单,状态→已确认(CONFIRMED) | | 删除 | danger (红色文字) | mes:pro:workorder:remove | 确认后删除 | **status = CONFIRMED(已确认)/ APPROVED(已审核):** | 按钮 | 颜色 | 权限 | 说明 | |------|------|------|------| | 查看 | success (绿色文字) | mes:pro:workorder:query | 打开查看页 | | 一键领料 | primary (蓝色文字) | mes:wm:issueheader:add | 自动创建领料单 | | 完工 | warning (橙色文字) | mes:pro:workorder:edit | 工单完工 | | 取消 | danger (红色文字) | mes:pro:workorder:edit | 取消工单 | **status = FINISHED(已完成)/ CANCELED(已取消):** | 按钮 | 颜色 | 权限 | 说明 | |------|------|------|------| | 查看 | success (绿色文字) | mes:pro:workorder:query | 打开查看页(只读) | ### 3.5 分页组件 | 属性 | 值 | 说明 | |------|------|------| | 默认每页条数 | 10 | 可选: 10, 20, 50, 100 | | 布局 | total, sizes, prev, pager, next, jumper | 完整分页 | | 总条数显示 | 共 {total} 条 | 右侧显示 | --- ## 4. 新增/编辑页设计 ### 4.1 页面布局 新增/编辑页面为独立的全屏页面(非弹窗),包含表头表单区、BOM 物料组成表格区、领料明细区和完工明细区。 > **截图参考**: `screenshot/生产管理-生产工单表单-查看操作等.png` — 查看页完整布局,含所有操作按钮和三个子表区域。 ``` ┌──────────────────────────────────────────────────────────────────────────────────────┐ │ 生产订单 [新增][编辑][审核][反审核][打印][操作▼][收起] │ │ 操作下拉: 挂起/关闭/调整工期/调整产线 │ ├──────────────────────────────────────────────────────────────────────────────────────┤ │ 表头表单区 (5列布局,可折叠) │ │ ┌──────────┬──────────┬──────────┬──────────┬──────────┐ │ │ │ 单据编码 │ 业务类型 │ 计划单号 │ 物料编码 │ 图纸号 │ │ │ │ 单据日期 │ 操作员 │ 跟单编号 │ 物料名称 │ 工艺路线 │ │ │ │ 单据状态 │ 审核员 │ 订单交期 │ 生产总数 │ 生产线 │ │ │ │ 业务状态 │ 审核日期 │ 需求日期 │ 备注信息 │ 生产日期 │ │ │ │ │ │ │ │ 加工时长 │ │ │ └──────────┴──────────┴──────────┴──────────┴──────────┘ │ ├──────────────────────────────────────────────────────────────────────────────────────┤ │ [订单信息子表] 序号│物料编码│物料名称│主计量│生产数量│质量要求│备注 │ ├──────────────────────────────────────────────────────────────────────────────────────┤ │ 领料明细 [一键领料][+ 领料] │ │ 序号│跟单编号│单据编码│单据状态│业务状态│生产订单号│物料编码│物料名称│领用数量│出库数量│日期 │ ├──────────────────────────────────────────────────────────────────────────────────────┤ │ 完工明细 [一键报工][+ 报工] │ │ 序号│跟单编号│单据编码│单据状态│业务状态│生产订单号│物料编码│物料名称│完工数量│质量│日期 │ └──────────────────────────────────────────────────────────────────────────────────────┘ ``` ### 4.2 表头表单字段 表头采用 5 列栅格布局(参照截图),每行 5 个字段。 > **截图对照**: 截图中表头为 5 列,第 5 列包含图纸号、工艺路线、生产线、生产日期、加工时长等字段。 | 序号 | 字段名 | 标签 | 组件类型 | 必填 | 默认值 | 可编辑 | 说明 | |------|--------|------|----------|------|--------|--------|------| | **第1列** | | | | | | | | | 1 | workorderCode | 单据编码 | el-input | 是 | 系统自动生成 | 否(只读) | 后端通过 `AutoCodeUtil.genSerialCode(WORKORDER_CODE)` 自动生成 | | 2 | orderDate | 单据日期 | el-date-picker | 是 | 当天 | 是 | 工单创建日期 | | 3 | status | 单据状态 | el-tag | - | PREPARE | 否(只读) | 状态标签显示 | | 4 | businessStatus | 业务状态 | el-select | 是 | 正常 | 是 | 正常/暂停/取消 | | **第2列** | | | | | | | | | 5 | businessType | 业务类型 | el-select | 是 | - | 是 | 加工车间等(截图示例值:"加工车间") | | 6 | operatorName | 操作员 | el-input | - | 当前用户 | 否(只读) | 自动填充当前登录用户 | | 7 | approverName | 审核员 | el-input | - | - | 否(只读) | 审核时自动填充 | | 8 | approveDate | 审核日期 | el-date-picker | - | - | 否(只读) | 审核时自动填充 | | **第3列** | | | | | | | | | 9 | sourceCode | 计划单号 | el-input + 选择按钮 | 是 | - | 是(新增) | **选择生产计划单弹窗**,选择后自动带入产品/客户信息 | | 10 | salesOrderCode | 跟单编号 | el-input | - | - | 否(只读) | 选择计划单后自动带入的销售订单号 | | 11 | deliveryDate | 订单交期 | el-date-picker | - | - | 否(只读) | 选择计划单后自动带入 | | 12 | requestDate | 需求日期 | el-date-picker | 否 | - | 是 | 物料需求日期 | | **第4列** | | | | | | | | | 13 | productCode | 物料编码 | el-input | - | - | 否(只读) | 选择计划单后自动带入 | | 14 | productName | 物料名称 | el-input | - | - | 否(只读) | 选择计划单后自动带入 | | 15 | quantity | 生产总数 | el-input-number + 单位 | 是 | 0 | 是 | 从计划单带入可修改,必须>0;右侧显示单位 | | 16 | remark | 备注信息 | el-input(textarea) | 否 | - | 是 | 多行文本 | | **第5列** | | | | | | | | | 17 | drawingNo | 图纸号 | el-input | 否 | - | 是 | 产品图纸编号 | | 18 | routeName | 工艺路线 | el-input + 选择按钮 | 否 | - | 是 | **选择工艺路线弹窗**,显示格式如"铆钉=>焊接" | | 19 | productionLine | 生产线 | el-select | 否 | - | 是 | 选择生产线/车间(如"2# 底架加工线") | | 20 | productionDate | 生产日期 | el-date-picker(datetime) | 是 | 当天 | 是 | 计划生产日期时间 | | 21 | processTime | 加工时长 | el-input-number + "分钟" | 否 | - | 是 | 预计加工时长(分钟) | **业务类型选项(businessType):** | 值 | 标签 | |----|------| | SELF | 自产 | | OUTSOURCE | 委外 | | PROCESSING | 加工车间 | **业务状态选项(businessStatus):** | 值 | 标签 | |----|------| | NORMAL | 正常 | | PAUSE | 暂停 | | CANCEL | 取消 | ### 4.3 订单信息子表(BOM 物料组成) > **截图对照**: 截图中标题为无标题表格区域,列为:序号、物料编码、物料名称、主计量、生产数量、质量要求、备注 订单信息子表位于表头下方,展示工单关联的产品/物料信息。选择计划单号并保存后系统自动根据产品 BOM 展开生成物料行。 | 序号 | 列标题 | 字段名 | 宽度 | 组件类型 | 说明 | |------|--------|--------|------|----------|------| | 1 | 序号 | - | 60px | 自动编号 | 行序号,自动递增 | | 2 | 物料编码 | itemCode | 150px | el-input | 只读,自动生成 | | 3 | 物料名称 | itemName | 200px | el-input | 只读,含型号规格 | | 4 | 主计量 | unitName | 80px | el-input | 只读 | | 5 | 生产数量 | quantity | 120px | el-input-number | 可编辑(新增/编辑模式) | | 6 | 质量要求 | qualityReq | 150px | el-input | 可编辑,如"国产一级品" | | 7 | 备注 | remark | 150px | el-input | 可编辑 | > **BOM 生成机制**: 后端 `ProWorkorderController.add()` 在保存工单后调用 `generateBomLine(workorderId)` 方法,该方法根据 `productId` 查找 `md_product_bom` 表获取产品 BOM 组成,然后按 `生产数量 × BOM单位用量` 计算每个物料的预计使用量,写入 `pro_workorder_bom` 表。修改工单时若产品或数量变化,自动删除旧 BOM 行并重新生成。物料行不支持手动添加/删除。 > > **前端加载 BOM 列表**: 使用 `GET /mes/pro/workorderbom/list?workorderId={id}` 接口(`ProWorkorderBomController`)获取工单的**直接 BOM 组成行**,返回的是 `ProWorkorderBom` 实体,字段名与前端 `WorkOrderBom` 接口直接对应(`itemCode`、`itemName`、`itemSpc`、`unitOfMeasure`、`unitName`、`itemOrProduct`、`quantity`)。 > > **注意**: 不要使用 `GET /mes/pro/workorder/listItems` 接口加载表单 BOM 子表。`listItems` 是递归展开到最底层物料并合并同编码数量的接口,返回的是 `MdProductBom` 格式(字段名为 `bomItemCode`/`bomItemName` 等),适用于物料需求分析场景,不适用于展示直接 BOM 组成。 ### 4.4 领料明细子表 > **截图对照**: 截图中标题为"领料明细",右上角有「一键领料」和「+ 领料」按钮。 领料明细子表展示该工单关联的所有生产领料单记录(只读),数据来源为 `wm_issue_header` + `wm_issue_line` 按 `workorder_id` 关联查询。 | 序号 | 列标题 | 字段名 | 宽度 | 说明 | |------|--------|--------|------|------| | 1 | 序号 | - | 60px | 自动编号 | | 2 | 跟单编号 | salesOrderCode | 120px | 销售订单号 | | 3 | 单据编码 | issueCode | 140px | 领料单编码 | | 4 | 单据状态 | issueStatus | 80px | 领料单状态 | | 5 | 业务状态 | businessStatus | 80px | 业务状态 | | 6 | 生产订单号 | workorderCode | 140px | 关联的工单编码 | | 7 | 物料编码 | itemCode | 140px | 领料物料编码 | | 8 | 物料名称 | itemName | 180px | 领料物料名称 | | 9 | 领用数量 | quantityIssued | 100px | 计划领料数量 | | 10 | 出库数量 | quantityOut | 100px | 实际出库数量 | | 11 | 单据日期 | issueDate | 120px | 领料日期 | **数据加载**: 查看页加载工单详情后,按 `workorderId` 查询关联的领料明细记录。 ### 4.5 完工明细子表 > **截图对照**: 截图中标题为"完工明细",右上角有「一键报工」和「+ 报工」按钮。 完工明细子表展示该工单关联的所有完工/报工记录(只读)。 | 序号 | 列标题 | 字段名 | 宽度 | 说明 | |------|--------|--------|------|------| | 1 | 序号 | - | 60px | 自动编号 | | 2 | 跟单编号 | salesOrderCode | 120px | 销售订单号 | | 3 | 单据编码 | recordCode | 140px | 报工单编码 | | 4 | 单据状态 | recordStatus | 80px | 报工单状态 | | 5 | 业务状态 | businessStatus | 80px | 业务状态 | | 6 | 生产订单号 | workorderCode | 140px | 关联的工单编码 | | 7 | 物料编码 | itemCode | 140px | 物料编码 | | 8 | 物料名称 | itemName | 180px | 物料名称 | | 9 | 完工数量 | quantityFinished | 100px | 完工数量 | | 10 | 质量 | qualityResult | 80px | 质量检验结果 | | 11 | 单据日期 | recordDate | 120px | 报工日期 | **数据加载**: 查看页加载工单详情后,按 `workorderId` 查询关联的完工/报工记录。 ### 4.6 选择生产计划单弹窗 点击计划单号旁的「选择」按钮,打开生产计划单选择弹窗。 | 属性 | 值 | |------|------| | 弹窗标题 | 选择生产计划单 | | 弹窗宽度 | 1000px | | 弹窗高度 | 自适应,最大70vh | | 选择模式 | 单选 | | 数据筛选 | 仅显示已审核(APPROVED)的生产计划单 | **弹窗搜索区:** | 组件 | 说明 | |------|------| | 计划单号 | 模糊搜索计划编码 | | 销售订单号 | 模糊搜索关联的销售订单号 | | 物料名称 | 模糊搜索产品名称 | | 搜索按钮 | primary 类型,执行搜索 | | 重置按钮 | 清空条件并刷新列表 | **弹窗列表结构:** | 列 | 字段 | 说明 | |----|------|------| | (单选) | - | 单选列 | | 计划单号 | planCode | 生产计划编码 | | 单据日期 | planDate | 计划日期 | | 销售订单号 | salesOrderCode | 关联的销售订单号 | | 业务人员 | salesUserName | 业务人员名称 | | 产品编码 | itemCode | 首行物料编码(主产品) | | 产品名称 | itemName | 首行物料名称 | | 数量 | totalQuantity | 生产总量 | | 订单交期 | deliveryDate | 交货日期 | **选择交互:** - 单选一条计划单记录,点击「确定」按钮 - 选择后自动填充表头字段: - `sourceCode` ← planCode(计划单号) - `productId` / `productCode` / `productName` / `productSpc` ← 计划单首行产品信息 - `unitOfMeasure` ← 计划单首行单位 - `quantity` ← 计划单 totalQuantity - `clientId` / `clientCode` / `clientName` ← 计划单关联的客户信息(来自销售订单) - `orderSource` ← 自动设为 "PLAN" - 保存时后端自动根据产品 BOM 生成 BOM 物料组成行 ### 4.7 选择工艺路线弹窗 点击工艺路线旁的「选择」按钮,打开工艺路线选择弹窗。 | 属性 | 值 | |------|------| | 弹窗标题 | 选择工艺路线 | | 弹窗宽度 | 800px | | 弹窗高度 | 自适应,最大60vh | | 选择模式 | 单选 | | 数据筛选 | 仅显示已启用(enableFlag=Y)的工艺路线 | **弹窗搜索区:** | 组件 | 说明 | |------|------| | 路线编号 | 模糊搜索工艺路线编号 | | 路线名称 | 模糊搜索工艺路线名称 | | 搜索按钮 | primary 类型,执行搜索 | | 重置按钮 | 清空条件并刷新列表 | **弹窗列表结构:** | 列 | 字段 | 说明 | |----|------|------| | (单选) | - | 单选列 | | 路线编号 | routeCode | 工艺路线编号 | | 路线名称 | routeName | 工艺路线名称 | | 路线说明 | routeDesc | 工艺路线描述 | | 是否启用 | enableFlag | Y=启用 / N=停用 | **选择交互:** - 单选一条工艺路线记录,点击「确定」按钮 - 选择后自动填充:routeId、routeCode、routeName > **数据来源**: 工艺路线数据来自 `pro_route` 表,通过 `GET /mes/pro/proroute/list` 接口获取(无需权限注解即可访问)。 > > **注意**: 前端调用 `/mes/pro/proroute/list` 时默认传递 `enableFlag=Y` 参数。应默认加载所有路线,让用户自行判断选择。后端 `ProRouteController.list()` 方法接受 `ProRoute` 实体作为查询参数,其中 `routeCode`、`routeName` 支持模糊搜索,`enableFlag` 支持精确匹配。 > > 工艺路线与产品的关系通过 `pro_route_product` 表关联,可选根据已选产品过滤对应的工艺路线。 ### 4.8 表头折叠 点击「收起」按钮,表头表单区域收起,仅显示 BOM 物料组成子表;点击「展开」恢复。 --- ## 5. 数据字段定义 ### 5.1 生产工单主表字段(pro_workorder) | 字段名 | 数据库字段 | 类型 | 长度 | 必填 | 默认值 | 说明 | |--------|-----------|------|------|------|--------|------| | 工单ID | workorder_id | bigint | - | 是 | AUTO | 主键,自增 | | 工单编码 | workorder_code | varchar | 64 | 是 | - | 唯一编码 | | 工单名称 | workorder_name | varchar | 255 | 是 | - | 工单描述 | | 工单类型 | workorder_type | varchar | 64 | 否 | SELF | 自产/委外 | | 来源类型 | order_source | varchar | 64 | 是 | PLAN | 固定为 PLAN(生产计划) | | 来源单据 | source_code | varchar | 64 | 是 | - | 生产计划单号(选择计划单弹窗) | | 产品ID | product_id | bigint | - | 是 | - | 外键 → md_item,由计划单带入 | | 产品编号 | product_code | varchar | 64 | 是 | - | 冗余,由计划单带入 | | 产品名称 | product_name | varchar | 255 | 是 | - | 冗余,由计划单带入 | | 规格型号 | product_spc | varchar | 255 | 否 | - | 由计划单带入 | | 单位 | unit_of_measure | varchar | 64 | 是 | - | 由计划单带入 | | 单位名称 | unit_name | varchar | 64 | 否 | - | | | 工艺路线ID | route_id | bigint | - | 否 | - | 外键 → pro_route(**新增字段**) | | 工艺路线编号 | route_code | varchar | 64 | 否 | - | 冗余(**新增字段**) | | 工艺路线名称 | route_name | varchar | 255 | 否 | - | 冗余(**新增字段**) | | 批次号 | batch_code | varchar | 64 | 否 | - | 生产批次号 | | 生产数量 | quantity | double(14,2) | - | 是 | 0 | 计划生产数量,从计划单带入 | | 已生产数量 | quantity_produced | double(14,2) | - | 否 | 0 | 报工回写 | | 调整数量 | quantity_changed | double(14,2) | - | 否 | 0 | 手动调整 | | 已排产数量 | quantity_scheduled | double(14,2) | - | 否 | 0 | 排产回写 | | 客户ID | client_id | bigint | - | 否 | - | 由计划单带入 | | 客户编码 | client_code | varchar | 64 | 否 | - | | | 客户名称 | client_name | varchar | 255 | 否 | - | | | 供应商ID | vendor_id | bigint | - | 否 | - | 仅委外工单 | | 供应商编码 | vendor_code | varchar | 64 | 否 | - | | | 供应商名称 | vendor_name | varchar | 255 | 否 | - | | | 生产日期 | production_date | date | - | 是 | 当天 | 计划生产日期(**原 request_date 改名**) | | 完成时间 | finish_date | datetime | - | 否 | - | 完工时自动填充 | | 取消时间 | cancel_date | datetime | - | 否 | - | 取消时自动填充 | | 父工单ID | parent_id | bigint | - | 否 | 0 | 父工单ID | | 祖先节点 | ancestors | varchar | 500 | 是 | 0 | 所有父节点ID | | 单据状态 | status | varchar | 64 | 否 | PREPARE | 草稿/已确认/已完成/已取消 | | 备注 | remark | varchar | 500 | 否 | - | | | 创建者 | create_by | varchar | 64 | 否 | - | | | 创建时间 | create_time | datetime | - | 否 | - | | | 更新者 | update_by | varchar | 64 | 否 | - | | | 更新时间 | update_time | datetime | - | 否 | - | | > **变更说明**: > - `request_date` 改名为 `production_date`,语义从"需求日期"改为"生产日期" > - 新增 `route_id`、`route_code`、`route_name` 三个工艺路线字段 > - `order_source` 固定为 PLAN,`source_code` 存储计划单号(必填) ### 5.2 BOM 物料组成表字段(pro_workorder_bom) | 字段名 | 数据库字段 | 类型 | 长度 | 必填 | 说明 | |--------|-----------|------|------|------|------| | BOM行ID | line_id | bigint | - | 是 | 主键,自增 | | 工单ID | workorder_id | bigint | - | 是 | 外键 → pro_workorder | | 物料ID | item_id | bigint | - | 是 | 外键 → md_item | | 物料编号 | item_code | varchar | 64 | 是 | 冗余 | | 物料名称 | item_name | varchar | 255 | 是 | 冗余 | | 规格型号 | item_spc | varchar | 255 | 否 | | | 单位 | unit_of_measure | varchar | 64 | 否 | | | 单位名称 | unit_name | varchar | 128 | 否 | | | 物料/产品标识 | item_or_product | varchar | 64 | 否 | 标识物料还是半成品 | | 预计使用量 | quantity | decimal(14,2) | - | 是 | =产品BOM用量 × 生产数量 | | 备注 | remark | varchar | 500 | 否 | | | 创建者 | create_by | varchar | 64 | 否 | | | 创建时间 | create_time | datetime | - | 否 | | | 更新者 | update_by | varchar | 64 | 否 | | | 更新时间 | update_time | datetime | - | 否 | | --- ## 6. 按钮操作说明 ### 6.1 列表页工具栏按钮 #### 6.1.1 新增按钮 | 项目 | 说明 | |------|------| | 触发条件 | 始终可用 | | 操作 | 路由跳转到新增生产工单页面 | | 权限 | mes:pro:workorder:add | | 路由 | `/production/work-order/new` | #### 6.1.2 修改按钮 | 项目 | 说明 | |------|------| | 触发条件 | 勾选一条记录 | | 前置校验 | 仅草稿(PREPARE)状态允许修改 | | 操作 | 路由跳转到编辑页面 | | 权限 | mes:pro:workorder:edit | #### 6.1.3 删除按钮(批量) | 项目 | 说明 | |------|------| | 触发条件 | 勾选一条或多条记录 | | 前置校验 | 仅草稿(PREPARE)状态允许删除 | | 操作 | 弹出确认框,确认后调用删除接口 | | 权限 | mes:pro:workorder:remove | #### 6.1.4 导出按钮 | 项目 | 说明 | |------|------| | 触发条件 | 始终可用 | | 操作 | 按当前搜索条件导出工单列表到Excel | | 权限 | mes:pro:workorder:export | ### 6.2 操作列按钮 #### 6.2.1 查看按钮 | 项目 | 说明 | |------|------| | 显示条件 | 所有状态均显示 | | 操作 | 路由跳转到查看页面(只读模式) | | 权限 | mes:pro:workorder:query | #### 6.2.2 编辑按钮 | 项目 | 说明 | |------|------| | 显示条件 | 仅 status = PREPARE(草稿) | | 操作 | 路由跳转到编辑页面 | | 权限 | mes:pro:workorder:edit | #### 6.2.3 删除按钮(行操作) | 项目 | 说明 | |------|------| | 显示条件 | 仅 status = PREPARE(草稿) | | 操作 | 弹出确认框,确认后删除,同时删除关联 BOM 行 | | 权限 | mes:pro:workorder:remove | #### 6.2.4 确认按钮 | 项目 | 说明 | |------|------| | 显示条件 | 仅 status = PREPARE(草稿) | | 前置条件 | 工单已保存,必须有产品信息(productId 不为空) | | 操作 | 弹出确认框"确认此工单?确认后将不可编辑。",确认后调用确认接口 | | 权限 | mes:pro:workorder:edit | | 结果 | status 从 PREPARE → CONFIRMED(已确认),确认后工单不可编辑,可进行领料、排产等后续操作 | #### 6.2.5 一键领料按钮 | 项目 | 说明 | |------|------| | 显示条件 | status = CONFIRMED 或 APPROVED | | 操作 | 确认后自动创建领料单(含全部BOM物料行),跳转领料单编辑页 | | 权限 | mes:wm:issueheader:add | | 详细逻辑 | 见 [10.6 一键领料规则](#106-一键领料规则) | #### 6.2.6 完工按钮 | 项目 | 说明 | |------|------| | 显示条件 | status = CONFIRMED 或 APPROVED | | 操作 | 弹出确认框,确认后调用完工接口 | | 权限 | mes:pro:workorder:edit | | 结果 | status → FINISHED,记录完成时间,所有关联生产任务也置为完成 | #### 6.2.7 取消按钮 | 项目 | 说明 | |------|------| | 显示条件 | status = PREPARE 或 CONFIRMED | | 操作 | 弹出确认框,确认后调用取消接口 | | 权限 | mes:pro:workorder:edit | | 结果 | status → CANCELED,记录取消时间,所有关联生产任务也置为取消 | ### 6.3 新增/编辑/查看页按钮 > **截图参考**: 截图中查看页右上角按钮从左到右依次为:**新增**、**编辑**、**审核**、**反审核**、**打印**、**操作**(下拉)、**收起** #### 6.3.1 按钮总览(按截图从左到右排列) | 序号 | 按钮 | 颜色/样式 | 显示条件 | 说明 | |------|------|-----------|----------|------| | 1 | 新增 | primary (蓝色) | 查看模式 | 跳转新增页面 | | 2 | 编辑 | default (灰色) | 查看模式,status=PREPARE 时可点击,其他状态置灰 | 跳转编辑页面 | | 3 | 审核 | success (绿色) | 查看模式或编辑模式(已保存),status=PREPARE | 调用审核接口,PREPARE→CONFIRMED | | 4 | 反审核 | warning (黄色) | 查看模式,status=CONFIRMED 或 APPROVED | 调用反审核接口,CONFIRMED→PREPARE | | 5 | 打印 | default + 打印图标 | 查看模式 | 打印工单 | | 6 | 操作 | default 下拉按钮 | 查看模式 | 下拉菜单:挂起、关闭、调整工期、调整产线 | | 7 | 收起/展开 | primary (蓝色) | 始终显示 | 折叠/展开表头表单区域 | | - | 保存 | primary (蓝色) | 新增/编辑模式 | 保存工单数据 | | - | 取消 | default (灰色) | 新增/编辑模式 | 返回列表页 | #### 6.3.2 新增按钮 | 项目 | 说明 | |------|------| | 显示条件 | 查看模式 | | 操作 | 路由跳转到新增页面 `/production/work-order/new` | #### 6.3.3 编辑按钮 | 项目 | 说明 | |------|------| | 显示条件 | 查看模式 | | 可点击条件 | 仅 status = PREPARE(草稿)时可点击,其他状态置灰(disabled) | | 操作 | 路由跳转到编辑页面 `/production/work-order/edit/{id}` | #### 6.3.4 审核按钮 | 项目 | 说明 | |------|------| | 显示条件 | 查看模式或编辑模式(已保存),status = PREPARE(草稿) | | 前置条件 | 工单已保存(workorderId 不为空),产品信息已填写 | | 操作 | 弹出确认框"确认审核此工单?审核后不可编辑。"→ 调用审核接口 | | 结果 | status 从 PREPARE → CONFIRMED(已确认) | | 成功提示 | "审核成功" | | 成功后行为 | 页面刷新为查看模式,状态变为"审核",编辑按钮置灰,显示反审核按钮 | #### 6.3.5 反审核按钮 | 项目 | 说明 | |------|------| | 显示条件 | 查看模式,status = CONFIRMED 或 APPROVED | | 前置条件 | 工单没有关联的已执行领料单或已完工记录(如有,需先处理) | | 操作 | 弹出确认框"确认反审核?反审核后可重新编辑。"→ 调用反审核接口 | | 结果 | status 从 CONFIRMED → PREPARE(草稿) | | 成功提示 | "反审核成功" | | 成功后行为 | 页面刷新,状态变为"开立",编辑按钮可点击 | #### 6.3.6 打印按钮 | 项目 | 说明 | |------|------| | 显示条件 | 查看模式 | | 操作 | 触发浏览器打印预览,打印工单详情(含表头、BOM 物料) | | 图标 | 打印机图标 | #### 6.3.7 操作下拉按钮 | 项目 | 说明 | |------|------| | 显示条件 | 查看模式 | | 组件 | el-dropdown 下拉菜单 | **下拉菜单项:** | 菜单项 | 显示条件 | 操作 | 说明 | |--------|----------|------|------| | 挂起 | status = CONFIRMED | 调用挂起接口,status → PAUSE(如支持) | 暂停工单执行 | | 关闭 | status = CONFIRMED/FINISHED | 调用关闭接口 | 关闭/归档工单 | | 调整工期 | status = CONFIRMED | 弹出弹窗修改订单交期/需求日期/生产日期 | 调整生产时间安排 | | 调整产线 | status = CONFIRMED | 弹出弹窗修改生产线 | 切换生产线 | #### 6.3.8 收起/展开按钮 | 项目 | 说明 | |------|------| | 位置 | 页面右上角最右侧 | | 颜色 | primary (蓝色) | | 操作 | 折叠/展开表头表单区域 | #### 6.3.9 保存按钮(新增/编辑模式) | 项目 | 说明 | |------|------| | 显示条件 | 新增/编辑模式 | | 颜色 | primary (蓝色) | | 触发条件 | 表单校验通过 | | 操作 | 保存工单数据,后端自动生成/更新 BOM 物料行 | | 成功提示 | "保存成功" | #### 6.3.10 取消按钮(新增/编辑模式) | 项目 | 说明 | |------|------| | 显示条件 | 新增/编辑模式 | | 颜色 | default (灰色) | | 操作 | 返回列表页 | ### 6.4 领料明细区按钮 > **截图参考**: 领料明细区域右上角有两个按钮:「一键领料」(绿色勾图标)和「+ 领料」(蓝色) #### 6.4.1 一键领料按钮 | 项目 | 说明 | |------|------| | 位置 | 领料明细区域右上角 | | 颜色 | success (绿色) + 勾图标 | | 显示条件 | 查看模式,status = CONFIRMED 或 APPROVED | | 操作 | 确认弹窗 → 调用一键领料接口(根据 BOM 物料自动创建领料单)→ 刷新领料明细列表 | | 详细逻辑 | 见 [10.7 一键领料规则](#107-一键领料规则) | #### 6.4.2 + 领料按钮 | 项目 | 说明 | |------|------| | 位置 | 一键领料按钮右侧 | | 颜色 | primary (蓝色) | | 显示条件 | 查看模式,status = CONFIRMED 或 APPROVED | | 操作 | 跳转到生产领料单新增页面,URL 携带 workorderId 和 workorderCode 参数 | | 路由 | `/warehouse/issue/new?workorderId={id}&workorderCode={code}` | ### 6.5 完工明细区按钮 > **截图参考**: 完工明细区域右上角有两个按钮:「一键报工」(绿色勾图标)和「+ 报工」(蓝色) #### 6.5.1 一键报工按钮 | 项目 | 说明 | |------|------| | 位置 | 完工明细区域右上角 | | 颜色 | success (绿色) + 勾图标 | | 显示条件 | 查看模式,status = CONFIRMED 或 APPROVED | | 操作 | 确认弹窗 → 调用一键报工接口(或弹出报工弹窗填写完工数量/质量)→ 刷新完工明细列表 | #### 6.5.2 + 报工按钮 | 项目 | 说明 | |------|------| | 位置 | 一键报工按钮右侧 | | 颜色 | primary (蓝色) | | 显示条件 | 查看模式,status = CONFIRMED 或 APPROVED | | 操作 | 跳转到报工页面或打开报工弹窗,手动填写完工数量和质量信息 | --- ## 7. 页面交互规则 ### 7.1 列表页交互 | 序号 | 交互场景 | 交互规则 | |------|----------|----------| | 1 | 页面首次加载 | 默认加载第1页数据,按创建时间降序排列 | | 2 | 搜索操作 | 点击搜索按钮,重置 pageNum=1,保持当前 pageSize 不变 | | 3 | 工单编码点击 | 点击工单编码列蓝色链接文字,路由跳转到查看页面 | | 4 | 状态标签 | 用 el-tag 组件渲染:草稿=info(灰), 已确认=primary(蓝), 已审核=success(绿), 已完成=success(绿), 已取消=danger(红) | | 5 | 空数据状态 | 列表无数据时显示空状态图标和"暂无数据"文字 | | 6 | 批量操作 | 勾选多条记录后,批量操作按钮(删除)启用;未勾选时置灰 | | 7 | 删除校验 | 仅草稿状态允许删除,非草稿状态弹出提示"只能删除草稿状态单据!" | | 8 | 确认工单 | 草稿状态行点击「确认」→ 确认弹窗 → 调用确认接口 → 状态变为已确认 → 刷新列表 | | 9 | 一键领料 | 已确认/已审核状态行点击「一键领料」→ 确认弹窗 → 调用一键领料接口 → 跳转领料单编辑页 | ### 7.2 新增/编辑页交互 | 序号 | 交互场景 | 交互规则 | |------|----------|----------| | 1 | 页面加载(新增) | 空白表单,工单类型默认"自产",来源类型固定为"生产计划",生产日期默认当天 | | 2 | 页面加载(编辑) | 调用详情接口加载工单数据和 BOM 物料行 | | 3 | 选择计划单 | 点击「选择」→ 打开选择生产计划单弹窗(仅已审核)→ 选中计划单 → 确定 → 自动填充产品信息、客户信息、数量 | | 4 | 选择工艺路线 | 点击「选择」→ 打开选择工艺路线弹窗(仅已启用)→ 选中路线 → 确定 → 填充 routeId/routeCode/routeName | | 5 | 保存操作 | 前端表单校验 → 调用保存接口 → 后端自动生成 BOM 行 → 成功提示 | | 6 | 产品/数量变化 | 编辑时若产品ID或生产数量发生变化,保存时后端会删除旧 BOM 行并重新生成 | | 7 | 工单编码唯一 | 保存时后端校验工单编码唯一性,重复则提示"生产工单编号已存在!" | | 8 | 表头折叠 | 点击「收起」→ 表头表单区域收起;点击「展开」→ 恢复 | | 9 | 确认工单 | 编辑页保存后或查看页:点击「确认」→ 确认弹窗 → 调用确认接口 → 成功提示"确认成功" → 页面刷新为查看模式,状态变为"已确认" | ### 7.3 查看页交互 | 序号 | 交互场景 | 交互规则 | |------|----------|----------| | 1 | 审核工单 | status=PREPARE 时点击「审核」→ 确认弹窗"确认审核此工单?审核后不可编辑。" → 确认 → 调用审核接口 → 成功后页面刷新,状态变为"审核",编辑按钮置灰,显示反审核和领料按钮 | | 2 | 反审核 | status=CONFIRMED/APPROVED 时点击「反审核」→ 确认弹窗"确认反审核?反审核后可重新编辑。" → 确认 → 调用反审核接口 → 成功后页面刷新,状态回到"开立",编辑按钮可点击 | | 3 | 一键领料 | status=CONFIRMED/APPROVED 时在领料明细区点击「一键领料」→ 确认弹窗 → 调用一键领料接口 → 成功后刷新领料明细列表 | | 4 | + 领料 | 点击「+ 领料」→ 跳转到领料单新增页,URL 携带 workorderId 和 workorderCode | | 5 | 一键报工 | status=CONFIRMED/APPROVED 时在完工明细区点击「一键报工」→ 弹出报工弹窗或调用接口 → 刷新完工明细列表 | | 6 | + 报工 | 点击「+ 报工」→ 跳转到报工页面或打开报工弹窗 | | 7 | 打印 | 点击「打印」→ 触发浏览器打印预览 | | 8 | 操作-挂起 | 点击操作下拉→「挂起」→ 暂停工单执行 | | 9 | 操作-关闭 | 点击操作下拉→「关闭」→ 关闭/归档工单 | | 10 | 操作-调整工期 | 点击操作下拉→「调整工期」→ 弹出弹窗修改日期 | | 11 | 操作-调整产线 | 点击操作下拉→「调整产线」→ 弹出弹窗修改生产线 | ### 7.4 表单校验规则 #### 表头校验 | 字段 | 规则 | 提示信息 | |------|------|----------| | workorderCode | 系统自动生成,无需前端校验 | 后端自动生成并校验唯一性 | | workorderName | 必填 | 工单名称不能为空 | | sourceCode | 必填 | 请选择生产计划单 | | productId | 必填 | 请先选择计划单号(产品信息由计划单带入) | | quantity | 必填,min=0.01 | 生产数量必须大于0 | | productionDate | 必填 | 生产日期不能为空 | | unitOfMeasure | 必填 | 单位不能为空(选择计划单后自动带入) | --- ## 8. 接口调用说明 ### 8.1 接口总览 | 序号 | 功能 | 方法 | 路径 | 说明 | |------|------|------|------|------| | 1 | 查询工单列表 | GET | /mes/pro/workorder/list | 分页查询生产工单列表 | | 2 | 获取工单详情 | GET | /mes/pro/workorder/{workorderId} | 获取单条工单详情 | | 3 | 新增工单 | POST | /mes/pro/workorder | 创建新工单,自动生成BOM行 | | 4 | 修改工单 | PUT | /mes/pro/workorder | 更新工单,产品/数量变化时重新生成BOM | | 5 | 删除工单 | DELETE | /mes/pro/workorder/{workorderIds} | 批量删除工单及关联BOM行 | | 6 | 导出工单 | POST | /mes/pro/workorder/export | 导出工单列表到Excel | | 7 | **审核工单** | PUT | /mes/pro/workorder/confirm/{workorderId} | 草稿→已确认(审核) | | 8 | **反审核工单** | PUT | /mes/pro/workorder/unconfirm/{workorderId} | 已确认→草稿(反审核) | | 9 | 完工工单 | PUT | /mes/pro/workorder/finish/{workorderId} | 工单完工,关联任务完成 | | 10 | 取消工单 | PUT | /mes/pro/workorder/cancel/{workorderId} | 取消工单,关联任务取消 | | 11 | **工单BOM组成列表** | GET | /mes/pro/workorderbom/list | **表单用**:获取工单直接BOM组成行 | | 12 | 工单物料需求(递归) | GET | /mes/pro/workorder/listItems | 递归展开BOM到最底层物料(仅分析用) | | 13 | **一键领料** | POST | /mes/pro/workorder/quickIssue/{workorderId} | 根据BOM自动创建领料单 | | 14 | 生产计划单列表 | GET | /erp/mp/plan/list | 选择计划单弹窗数据源 | | 15 | 生产计划单详情 | GET | /erp/mp/plan/{planId} | 获取计划单详情 | | 16 | 工艺路线列表 | GET | /mes/pro/proroute/list | 选择工艺路线弹窗数据源 | | 17 | 选择客户 | GET | /mes/md/client/list | 客户选择(备用) | ### 8.2 接口详细说明 #### 8.2.1 查询工单列表 ``` GET /mes/pro/workorder/list ``` **请求参数:** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | pageNum | integer | 否 | 页码,默认1 | | pageSize | integer | 否 | 每页数,默认10 | | workorderCode | string | 否 | 工单编码(模糊) | | workorderName | string | 否 | 工单名称(模糊) | | workorderType | string | 否 | 工单类型 | | sourceCode | string | 否 | 计划单号(模糊) | | productCode | string | 否 | 产品编号(模糊) | | productName | string | 否 | 产品名称(模糊) | | status | string | 否 | 工单状态 | | beginProductionDate | string | 否 | 生产日期起 (yyyy-MM-dd) | | endProductionDate | string | 否 | 生产日期止 (yyyy-MM-dd) | **响应示例:** ```json { "total": 25, "rows": [ { "workorderId": 1, "workorderCode": "WO20260213001", "workorderName": "组装电脑5400生产任务", "workorderType": "SELF", "orderSource": "PLAN", "sourceCode": "SCJH000096", "productId": 100, "productCode": "0103000002", "productName": "组装电脑5400", "productSpc": "", "unitOfMeasure": "台", "routeId": 5, "routeCode": "RT001", "routeName": "电脑组装工艺路线", "quantity": 170.00, "quantityProduced": 50.00, "quantityChanged": 0.00, "quantityScheduled": 170.00, "clientName": "客户A", "productionDate": "2026-02-20", "status": "CONFIRMED" } ], "code": 200, "msg": "查询成功" } ``` #### 8.2.2 获取工单详情 ``` GET /mes/pro/workorder/{workorderId} ``` **响应:** 返回工单详情对象,含 routeId/routeCode/routeName 等新增字段。BOM 物料行需通过 `listItems` 接口单独获取。 #### 8.2.3 新增工单 ``` POST /mes/pro/workorder ``` **请求体:** ```json { "workorderCode": "", "workorderName": "组装电脑5400生产任务", "workorderType": "SELF", "orderSource": "PLAN", "sourceCode": "SCJH000096", "productId": 100, "productCode": "0103000002", "productName": "组装电脑5400", "productSpc": "", "unitOfMeasure": "台", "routeId": 5, "routeCode": "RT001", "routeName": "电脑组装工艺路线", "quantity": 170.00, "productionDate": "2026-02-20", "clientId": 1, "clientCode": "KH001", "clientName": "客户A", "remark": "" } ``` **说明:** - `workorderCode` 传空字符串或不传,后端通过 `AutoCodeUtil.genSerialCode(SCGD_CODE, "")` 自动生成 - `orderSource` 固定为 "PLAN",`sourceCode` 必须为有效的计划单号 - 后端自动根据 `productId` 查找产品 BOM(`md_product_bom`),生成 `pro_workorder_bom` 行记录 - BOM 用量计算: 每个 BOM 组件的 `quantity = 生产数量(workorder.quantity) × BOM单位用量(bom.quantity)` #### 8.2.4 修改工单 ``` PUT /mes/pro/workorder ``` **请求体:** 同新增,但包含 `workorderId`。若产品ID或生产数量变化,后端重新生成 BOM。 #### 8.2.5 删除工单 ``` DELETE /mes/pro/workorder/{workorderIds} ``` **业务规则:** 仅允许删除草稿(PREPARE)状态;同时删除关联 `pro_workorder_bom` 行。 #### 8.2.6 审核工单 ``` PUT /mes/pro/workorder/confirm/{workorderId} ``` **路径参数:** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | workorderId | integer | 是 | 工单ID | **业务规则:** - 仅允许草稿(PREPARE)状态的工单执行审核操作 - 工单必须有产品信息(productId 不为空) - 审核后状态变为 CONFIRMED(已确认/审核) - 审核后工单不可编辑,可进行领料、排产等后续操作 > **后端实现**: 需在 `ProWorkorderController` 中新增 `confirm` 端点,校验状态后将 `status` 设为 `UserConstants.ORDER_STATUS_CONFIRMED`。 #### 8.2.7 反审核工单 ``` PUT /mes/pro/workorder/unconfirm/{workorderId} ``` **路径参数:** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | workorderId | integer | 是 | 工单ID | **业务规则:** - 仅允许已确认(CONFIRMED)或已审核(APPROVED)状态的工单执行反审核 - 反审核前需校验:工单没有已执行的领料单或已完工记录(如有则提示"存在已执行的下游单据,无法反审核") - 反审核后状态变为 PREPARE(草稿),可重新编辑 - 清空审核员和审核日期 > **后端实现**: 需在 `ProWorkorderController` 中新增 `unconfirm` 端点,校验状态和下游引用后将 `status` 设为 `UserConstants.ORDER_STATUS_PREPARE`。 #### 8.2.8 完工工单 ``` PUT /mes/pro/workorder/finish/{workorderId} ``` **业务规则:** 将工单状态设为 FINISHED,记录完成时间;同时将该工单下所有生产任务状态设为 FINISHED。 #### 8.2.9 取消工单 ``` PUT /mes/pro/workorder/cancel/{workorderId} ``` **业务规则:** 将工单状态设为 CANCELED,记录取消时间;同时将该工单下所有生产任务状态设为 CANCELED。 #### 8.2.10 一键领料 ``` POST /mes/pro/workorder/quickIssue/{workorderId} ``` **说明:** 根据工单 BOM 物料组成自动创建一张生产领料单。 **业务逻辑:** 1. 查询工单详情及 BOM 物料列表 2. 创建 `wm_issue_header`: - `issueCode`:自动生成领料单编号 - `issueName`:自动生成,如"WO20260213001-领料单" - `workorderId` / `workorderCode`:关联本工单 - `clientId` / `clientCode` / `clientName`:从工单带入 - `status`:PREPARE(草稿) 3. 遍历工单 BOM 物料,为每条 BOM 行创建 `wm_issue_line`: - `itemId` / `itemCode` / `itemName`:BOM 物料信息 - `specification`:BOM 物料规格 - `unitOfMeasure` / `unitName`:BOM 物料单位 - `quantityIssued`:= BOM 预计使用量(quantity) 4. 返回新建的领料单 ID(`issueId`),前端跳转到领料单编辑页 **响应示例:** ```json { "code": 200, "msg": "操作成功", "data": 123 } ``` 其中 `data` 为新创建的领料单 ID。 #### 8.2.11 工单 BOM 组成列表(表单用) ``` GET /mes/pro/workorderbom/list ``` **请求参数:** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | workorderId | integer | 是 | 工单ID | | pageNum | integer | 否 | 页码,默认1 | | pageSize | integer | 否 | 每页数,默认100(建议设大以加载全部) | **说明:** 直接查询 `pro_workorder_bom` 表,返回该工单的直接 BOM 组成行。**前端表单 BOM 子表应使用此接口**。 **响应字段:** 返回 `ProWorkorderBom` 实体,字段名与前端 `WorkOrderBom` 接口直接对应: | 字段 | 说明 | |------|------| | lineId | BOM 行 ID | | workorderId | 工单 ID | | itemId | 物料 ID | | itemCode | 物料编号 | | itemName | 物料名称 | | itemSpc | 规格型号 | | unitOfMeasure | 单位编码 | | unitName | 单位名称 | | itemOrProduct | 物料/产品标识 | | quantity | 预计使用量 | | remark | 备注 | #### 8.2.12 工单物料需求清单(递归展开,仅分析用) ``` GET /mes/pro/workorder/listItems ``` **请求参数:** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | workorderId | integer | 是 | 工单ID | **说明:** 根据工单 BOM 递归展开(最多20层),返回最底层物料的汇总需求清单。同一物料编码的数量自动合并。返回 `MdProductBom` 格式(`bomItemCode`/`bomItemName` 等字段名),**不要用于表单 BOM 子表显示**。 #### 8.2.13 工艺路线列表 ``` GET /mes/pro/proroute/list ``` **请求参数:** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | routeCode | string | 否 | 工艺路线编号(模糊) | | routeName | string | 否 | 工艺路线名称(模糊) | | enableFlag | string | 否 | 是否启用,默认 Y | | pageNum | integer | 否 | 页码 | | pageSize | integer | 否 | 每页条数 | **响应:** 返回工艺路线列表,字段含 routeId、routeCode、routeName、routeDesc、enableFlag。 --- ## 9. 状态流转 ### 9.1 工单状态流转图 ``` ┌──────────────┐ │ │ ┌─────────► 草稿(PREPARE) ◄─────────┐ │ │ │ │ │ └──────┬───────┘ │ │ │ │ │ [审核操作] [反审核操作] │ │ │ │ ▼ │ │ ┌──────────────┐ │ │ │ │ │ │ │ 审核/已确认 ├───────────┘ │ │ (CONFIRMED) │ ── 可领料/报工/排产 │ │ │ │ └──────┬───────┘ │ │ │ ┌────────┼────────┐ │ │ │ │ [完工操作] [取消操作] │ │ │ │ ▼ ▼ │ ┌──────────────┐ ┌──────────────┐ │ │ │ │ │ │ │ 已完成 │ │ 已取消 │ │ │ (FINISHED) │ │ (CANCELED) │ │ │ │ │ │ │ └──────────────┘ └──────────────┘ │ ▲ │ │ └──────────[取消操作]───────┘ ``` ### 9.2 状态说明 | 状态 | 编码 | 可执行操作 | 说明 | |------|------|-----------|------| | 草稿 | PREPARE | 编辑、保存、删除、**审核**、取消 | 初始状态,可自由编辑 | | 审核/已确认 | CONFIRMED | 查看、**反审核**、完工、取消、排产、一键领料、手动领料、一键报工、报工 | 已审核,可进行生产执行 | | 已审核 | APPROVED | 同 CONFIRMED | 审核生效(等同已确认) | | 已完成 | FINISHED | 查看 | 工单结案,不可修改 | | 已取消 | CANCELED | 查看 | 工单已取消,不可修改 | --- ## 10. 业务规则 ### 10.1 编码规则 | 规则 | 说明 | |------|------| | 生成方式 | 后端自动生成,使用统一编码引擎 `AutoCodeUtil.genSerialCode()` | | 编码规则常量 | `UserConstants.SCGD_CODE = "WORKORDER_CODE"`(Java 常量名 `SCGD_CODE`,值为数据库中已配置的规则编码 `WORKORDER_CODE`) | | 调用位置 | `ProWorkorderController.add()` 方法中,保存前自动生成(**已实现**) | | 前端表现 | 工单编码字段为只读,显示占位符"系统自动生成"(**已实现**) | | 唯一性 | 工单编码全局唯一,后端校验 | | 数据库配置 | `sys_auto_code_rule` 表中规则编码为 `WORKORDER_CODE`(**已在数据库中配置,无需新增**) | > **实现状态**: 已完成。`ProWorkorderController.add()` 中注入了 `AutoCodeUtil`,在保存前自动生成编码: > ```java > if (StringUtils.isEmpty(proWorkorder.getWorkorderCode())) { > proWorkorder.setWorkorderCode(autoCodeUtil.genSerialCode(UserConstants.SCGD_CODE, "")); > } > ``` > 其中 `UserConstants.SCGD_CODE` 的值为 `"WORKORDER_CODE"`,对应数据库中已配置的编码规则。 ### 10.2 来源规则 | 规则 | 说明 | |------|------| | 唯一来源 | 生产订单只能来源于生产计划单,`order_source` 固定为 PLAN | | 计划单选择 | 新增时必须选择一个已审核(APPROVED)的生产计划单 | | 自动带入 | 选择计划单后自动带入:产品信息、客户信息、生产数量 | | 不可变更 | 保存后来源计划单号不可变更 | ### 10.3 工艺路线规则 | 规则 | 说明 | |------|------| | 可选 | 工艺路线为非必填字段,可在新增/编辑时选择 | | 数据来源 | 工艺路线来自 `pro_route` 表,通过 `GET /mes/pro/proroute/list` 获取 | | 默认过滤 | 默认传 `enableFlag=Y` | | 产品关联 | 可选:根据已选产品通过 `pro_route_product` 过滤对应的工艺路线 | ### 10.4 BOM 生成规则 | 规则 | 说明 | |------|------| | 触发条件 | 新增工单保存时自动生成 | | 数据来源 | 产品的 BOM 组成(md_product_bom) | | 用量计算 | 预计使用量 = 产品 BOM 单位用量 × 生产数量 | | 递归展开 | 若 BOM 物料本身也有子 BOM,递归展开(最多20层) | | 数量合并 | 同一物料编码的需求量自动合并 | | 变更处理 | 修改时若产品或数量变化,删除旧 BOM 行并重新生成 | ### 10.5 删除规则 | 规则 | 说明 | |------|------| | 前置条件 | 仅草稿(PREPARE)状态允许删除 | | 级联删除 | 删除工单时同时删除关联的 pro_workorder_bom 行 | ### 10.6 审核/反审核规则 **审核规则:** | 规则 | 说明 | |------|------| | 前置条件 | 仅草稿(PREPARE)状态允许审核 | | 前置条件 | 工单必须已保存(workorderId 不为空) | | 前置条件 | 产品信息必须已填写(productId 不为空) | | 状态变更 | status 从 PREPARE → CONFIRMED | | 审核后效果 | 工单变为只读,不可编辑;自动填充审核员和审核日期 | | 审核后操作 | 可进行:反审核、一键领料、手动领料、一键报工、报工、排产、完工、取消 | **反审核规则:** | 规则 | 说明 | |------|------| | 前置条件 | 仅已确认(CONFIRMED)或已审核(APPROVED)状态允许反审核 | | 下游校验 | 反审核前校验:没有已执行(FINISHED)的领料单,没有完工记录 | | 状态变更 | status 从 CONFIRMED → PREPARE | | 反审核后效果 | 工单恢复可编辑,清空审核员和审核日期 | | 按钮变化 | 编辑按钮恢复可点击,隐藏领料/报工按钮 | ### 10.7 一键领料规则 | 规则 | 说明 | |------|------| | 前置条件 | 工单状态为已确认(CONFIRMED)或已审核(APPROVED) | | 前置条件 | 工单必须有至少一条 BOM 物料行 | | 创建领料单头 | 自动创建 wm_issue_header,关联 workorderId/workorderCode,状态=PREPARE | | 创建领料行 | 遍历工单 BOM 物料,为每条创建 wm_issue_line,领料数量=预计使用量 | | 返回结果 | 返回新建的领料单 ID,前端跳转领料单编辑页 | | 可重复 | 同一工单可多次执行一键领料(分批领料场景) | | 用户可调整 | 领料单创建后为草稿状态,用户可调整数量后再执行出库 | ### 10.8 手动领料规则 | 规则 | 说明 | |------|------| | 前置条件 | 工单状态为已确认(CONFIRMED)或已审核(APPROVED) | | 操作方式 | 跳转到领料单新增页面,URL 携带 workorderId 和 workorderCode | | 自动关联 | 领料单新增页自动填充工单ID和工单编码 | | 手动添加 | 用户手动选择物料并填写领料数量 | ### 10.9 完工/取消规则 | 操作 | 影响范围 | 说明 | |------|----------|------| | 完工 | 工单 + 所有生产任务 | 工单和所有关联生产任务状态都设为 FINISHED | | 取消 | 工单 + 所有生产任务 | 工单和所有关联生产任务状态都设为 CANCELED | --- ## 11. 前端组件设计 ### 11.1 文件结构 ``` src/ ├── api/ │ └── workOrder.ts # 生产工单相关API接口定义 ├── views/ │ └── Production/ │ └── WorkOrder/ │ ├── index.vue # 生产工单列表页 │ ├── form.vue # 生产工单新增/编辑/查看页 │ └── components/ │ ├── PlanSelectDialog.vue # 选择生产计划单弹窗组件 │ ├── RouteSelectDialog.vue # 选择工艺路线弹窗组件 │ ├── WorkorderBomTable.vue # BOM物料组成子表组件 │ └── ClientSelectDialog.vue # 选择客户弹窗组件(备用) ``` ### 11.2 路由配置 ```javascript // src/router/index.ts { path: '/production', component: Layout, meta: { title: '生产管理', icon: 'el-icon-setting' }, children: [ { path: 'work-order', name: 'WorkOrderList', component: () => import('@/views/Production/WorkOrder/index.vue'), meta: { title: '生产订单', icon: 'el-icon-tickets' } }, { path: 'work-order/new', name: 'WorkOrderNew', component: () => import('@/views/Production/WorkOrder/form.vue'), meta: { title: '新增生产工单', activeMenu: '/production/work-order' }, hidden: true }, { path: 'work-order/edit/:id', name: 'WorkOrderEdit', component: () => import('@/views/Production/WorkOrder/form.vue'), meta: { title: '编辑生产工单', activeMenu: '/production/work-order' }, hidden: true }, { path: 'work-order/view/:id', name: 'WorkOrderView', component: () => import('@/views/Production/WorkOrder/form.vue'), meta: { title: '查看生产工单', activeMenu: '/production/work-order' }, hidden: true } ] } ``` --- ## 12. 数据模型 ### 12.1 表关系图 ``` ┌──────────────────────────┐ │ erp_mp_plan │ │ (生产计划单) │ ┌──────────────────────────┐ │ plan_id, plan_code ──────┼─────►│ pro_workorder │ │ 产品信息, 客户信息 │ │ (生产工单) │ └──────────────────────────┘ │ │ │ workorder_id (PK) │ ┌──────────────────────────┐ │ source_code (计划单号) │ │ pro_route │ │ product_id, quantity │ │ (工艺路线) │ │ route_id (FK) ★ │ │ route_id ────────────────┼─────►│ production_date ★ │ │ route_code, route_name │ │ status │ └──────────────────────────┘ └──────────┬───────────────┘ │ 1:N ▼ ┌──────────────────────────┐ ┌──────────────────────────┐ │ md_product_bom │ │ pro_workorder_bom │ │ (产品BOM组成) │─────►│ (工单BOM物料组成) │ │ │ │ │ │ item_id, bom_item_id │ │ workorder_id (FK) │ │ quantity │ │ item_id, quantity │ └──────────────────────────┘ └──────────────────────────┘ │ ┌──────────────┼──────────────┐ │ │ │ ▼ ▼ ▼ ┌──────────────────┐ ┌──────────────┐ ┌──────────────┐ │ wm_issue_header │ │ pro_task │ │ 完工入库单 │ │ (生产领料单) │ │ (生产任务) │ │ │ │ workorder_id(FK) │ │ workorder_id │ │ workorder_id │ │ ★一键领料/手动 │ │ (FK) │ │ (FK) │ └──────────────────┘ └──────────────┘ └──────────────┘ ``` ### 12.2 数据同步方向 ``` ERP (pro_workorder) ──同步──► MOM (pro_workorder) ``` - 同步方向: ERP → MOM(单向同步) - 同步触发: 工单创建/修改/状态变更时同步 --- ## 附录A: 状态标签颜色映射 ```javascript // 状态标签类型映射 const statusTagMap = { 'PREPARE': 'info', // 灰色 - 草稿 'CONFIRMED': 'primary', // 蓝色 - 已确认 'APPROVED': 'success', // 绿色 - 已审核 'FINISHED': 'success', // 绿色 - 已完成 'CANCELED': 'danger' // 红色 - 已取消 } // 状态标签文字映射 const statusLabelMap = { 'PREPARE': '草稿', 'CONFIRMED': '已确认', 'APPROVED': '已审核', 'FINISHED': '已完成', 'CANCELED': '已取消' } ``` --- ## 附录B: 权限标识汇总 | 权限标识 | 说明 | 对应操作 | |----------|------|----------| | mes:pro:workorder:list | 列表查询 | 查看生产工单列表 | | mes:pro:workorder:query | 详情查询 | 查看工单详情 | | mes:pro:workorder:add | 新增 | 新增生产工单 | | mes:pro:workorder:edit | 编辑 | 修改工单、确认、完工、取消 | | mes:pro:workorder:remove | 删除 | 删除生产工单 | | mes:pro:workorder:export | 导出 | 导出工单列表 | | mes:wm:issueheader:add | 领料 | 一键领料、创建领料单 | --- ## 修订历史 | 版本 | 日期 | 修订内容 | 修订人 | |------|------|----------|--------| | 1.0.0 | 2026-02-13 | 初始版本,基于后端 ProWorkorder 实体类、ProWorkorderController 控制器及 pro_workorder 表结构编写完整页面开发说明 | System | | **2.0.0** | **2026-02-13** | **重大业务逻辑调整**:(1) 生产订单只来源于生产计划单,新增时选择计划单号自动带入产品/客户信息,移除手动创建和销售订单直接创建;(2) 新增「一键领料」功能,根据 BOM 自动创建领料单;(3) 新增「创建领料单」按钮,支持手动跳转领料单页面;(4) 需求日期改为生产日期(production_date);(5) 表头新增工艺路线选择(route_id/route_code/route_name),从 pro_route 表选取 | System | | **2.1.0** | **2026-02-13** | **完善优化**:(1) 工单编码改为后端通过 AutoCodeUtil 自动生成(SCGD_CODE),前端只读;(2) 修复工艺路线弹窗列表为空:移除默认 enableFlag=Y 过滤;(3) 明确 BOM 子表使用 /mes/pro/workorderbom/list 接口(直接 BOM),而非 /listItems(递归展开格式不兼容) | System | | **2.2.0** | **2026-02-13** | **补全确认状态处理**:新增确认按钮和接口 | System | | **3.1.0** | **2026-02-13** | **根据截图全面完善**(参考 screenshot/生产管理-生产工单表单-查看操作等.png):(1) 表头改为5列布局,新增字段:业务类型、操作员、审核员、审核日期、跟单编号、订单交期、需求日期、图纸号、生产线、加工时长;(2) 查看页按钮完整定义:新增→编辑→审核→反审核→打印→操作下拉(挂起/关闭/调整工期/调整产线)→收起;(3) 新增反审核接口 PUT /mes/pro/workorder/unconfirm/{id},支持 CONFIRMED→PREPARE 并校验下游单据;(4) 新增领料明细子表(4.4)和完工明细子表(4.5),各含一键操作和手动操作按钮;(5) 新增6.4领料明细区按钮(一键领料+领料)和6.5完工明细区按钮(一键报工+报工);(6) 完善状态流转图增加反审核路径;(7) 审核/反审核规则完整定义(10.6) | System |