Files
my-mom-system/prd/mom系统生产订单-页面开发说明文档.md
panchengyong c28ada5050 commit content
2026-03-06 02:02:59 +08:00

1573 lines
78 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 生产订单(生产工单)- 页面设计开发说明文档
> 版本: 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 |