Files
my-mom-system/prd/mom系统生产订单-页面开发说明文档.md

1573 lines
78 KiB
Markdown
Raw Permalink Normal View History

2026-03-06 02:02:59 +08:00
# 生产订单(生产工单)- 页面设计开发说明文档
> 版本: 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 |