WORKORDER_DETAIL.md 15 KB

工单物料明细 & 工单工序明细模块 - 开发文档

📋 模块概述

本文档描述工单排产模块中的两个明细管理功能:

  • 工单物料明细 - 管理工单的物料需求明细
  • 工单工序明细 - 管理工单的工序流程明细

🎯 已实现功能

1. 工单物料明细 (/workorder-material)

页面功能

  • ✅ 物料明细列表展示(支持搜索、筛选、分页)
  • ✅ 添加物料明细
  • ✅ 编辑物料明细
  • ✅ 删除物料明细(软删除,修改状态为0)
  • ✅ 查看物料明细
  • ✅ 支持从工单排产页面跳转并自动筛选工单

列表字段

字段 说明 格式
WorkOrd 工单编号 文本
Line 行号 文本
ItemNum 物料编码 文本
Descr 物料名称 文本
OpDescr 工序 文本
Location 库位 文本
LotSerial 生产批号 文本
QtyRequired 需求数量 千分位数字
IsActive 状态 标签(激活/已删除)

查询条件

  • 工单编号 - 模糊查询
  • 物料编号 - 模糊查询
  • 库位 - 模糊查询

特殊功能

  • 删除后的行背景色变为浅红色(#ffe6e6)
  • 支持固定左侧列(物料编号)
  • 已删除的物料显示红色标签

业务逻辑

新增物料明细时

  1. 验证物料是否存在于基础数据(ItemMaster)
  2. 验证工单中是否已存在相同物料和工序
  3. 根据工单状态决定是否同时操作领料单(NbrDetail)
    • 初始状态(P):仅保存工单物料明细
    • 其他状态:同时新增领料单数据

编辑物料明细时

  1. 根据工单状态决定是否同时修改领料单
    • 初始状态(P):仅修改工单物料明细
    • 其他状态:同时修改领料单数据

2. 工单工序明细 (/workorder-process)

页面功能

  • ✅ 工序明细列表展示(支持搜索、筛选、分页)
  • ✅ 添加工序明细
  • ✅ 编辑工序明细
  • ✅ 删除工序明细
  • ✅ 查看工序明细
  • ✅ 支持从工单排产页面跳转并自动筛选工单

列表字段

字段 说明 格式
WorkOrd 生产指令 文本
LotSerial 生产批次 文本
eff 下达日期 YYYY-MM-DD
ItemNum 物料编号 文本
ItenName 物料名称 文本
OP 工序 文本
OpName 工序名称 文本
MilestoneOp 关键工序 文本
QtyComplete 完成数量 千分位数字
QtyOrded 订单数量 千分位数字
ProcessOut 工序委外 文本
MachineName 设备名称 文本
StandardStaffCount 标准人数 文本
Site 班组 文本
Rate 产能(小时) 文本
CreateTime 工单创建时间 YYYY-MM-DD
UpdateTime 工单更新时间 YYYY-MM-DD

查询条件

  • 生产指令 - 模糊查询
  • 生产批次 - 模糊查询
  • 物料编号 - 模糊查询
  • 班组 - 模糊查询
  • 工单创建时间 - 大于等于查询
  • 工单更新时间 - 大于等于查询

表单字段

  • 基本信息

    • 工单编号(下拉选择)
    • 物料编号(日期选择)
    • 工序
    • 工序名称
  • 生产配置

    • 工作中心(下拉选择)
    • 生产线(下拉选择)
    • 准备时间(小时)
    • 需求数量
  • 工序属性

    • 关键工序(是/否)
    • 工序委外(是/否)
    • 供应商(委外时)
    • 委外提前期(委外时)
  • 设备与人员

    • 设备类型编码
    • 模具类型编码
    • 标准人数
    • 人员技能编码
  • 产能与工序类型

    • 单位标准产能(小时)
    • 工序类型(机械/人工)
  • 活动时间

    • 活动一准备时间(秒)
    • 活动二机器时间(秒)
    • 活动三人工时间(秒)
    • 作业编码

业务逻辑

保存工序明细时

  1. 验证工单中是否已存在相同工序编号
  2. 验证后序是否已有完成数量(如果有则不允许保存)
  3. 保存到 WorkOrdRouting 表

📂 文件结构

src/
├── api/
│   └── production.js                    # 更新:新增明细相关API ✨
├── views/
│   ├── components/
│   │   ├── WorkOrderMaterialForm.vue    # 新增:物料明细表单 ✨
│   │   └── WorkOrderProcessForm.vue     # 新增:工序明细表单 ✨
│   ├── WorkOrderMaterial.vue            # 新增:物料明细列表 ✨
│   └── WorkOrderProcess.vue             # 新增:工序明细列表 ✨
├── layouts/
│   └── MainLayout.vue                   # 更新:添加菜单项 ✨
└── router/
    └── index.js                         # 更新:添加路由 ✨

🔌 API 接口清单

工单物料明细相关

1. 获取物料明细列表

GET /api/production/material/list
参数: {
  WorkOrd: string,      // 工单编号(模糊)
  ItemNum: string,      // 物料编号(模糊)
  Location: string,     // 库位(模糊)
  page: number,
  pageSize: number
}

2. 添加物料明细

POST /api/production/material
参数: {
  WorkOrd: string,
  ItemNum: string,
  Op: string,
  QtyRequired: number,
  Location: string,
  LotSerial: string
}

3. 更新物料明细

PUT /api/production/material/{id}
参数: 同添加

4. 删除物料明细

DELETE /api/production/material/{id}
说明: 软删除,将IsActive设为0

5. 检查物料是否存在

GET /api/production/material/check-exists
参数: { ItemNum: string }
返回: { exists: boolean }

6. 检查工单物料是否已存在

GET /api/production/material/check-workorder-exists
参数: { WorkOrd: string, ItemNum: string, Op: string }
返回: { exists: boolean }

工单工序明细相关

1. 获取工序明细列表

GET /api/production/process/list
参数: {
  WorkOrd: string,      // 生产指令(模糊)
  LotSerial: string,    // 生产批次(模糊)
  ItemNum: string,      // 物料编号(模糊)
  Site: string,         // 班组(模糊)
  CreateTime: string,   // 工单创建时间(>=)
  UpdateTime: string,   // 工单更新时间(>=)
  page: number,
  pageSize: number
}

2. 添加工序明细

POST /api/production/process
参数: {
  WorkOrd: string,
  ItemNum: string,
  OP: string,
  Descr: string,
  WorkCtr: string,
  ProdLine: string,
  StdSetupTime: number,
  QtyOrded: number,
  MilestoneOp: boolean,
  ProcessOut: number,
  ProcessOutSupp: string,
  ProcessOutDay: number,
  Machine: string,
  ToolCode: string,
  RunCrew: number,
  Engineer: string,
  MachBdnRate: number,
  WorkCode: string,
  Setup: number,
  MachinesperOp: number,
  Labor: number,
  ChargeCode: string
}

3. 更新工序明细

PUT /api/production/process/{id}
参数: 同添加

4. 删除工序明细

DELETE /api/production/process/{id}

5. 检查工序是否已存在

GET /api/production/process/check-exists
参数: { WorkOrd: string, OP: string, RecID: string }
返回: { exists: boolean }

6. 检查后序是否有完成数量

GET /api/production/process/check-complete-qty
参数: { WorkOrd: string, OP: string }
返回: { hasCompleteQty: boolean }

下拉框数据相关

1. 获取工单列表

GET /api/production/workorder/list
返回: [{ workord: string }]

2. 获取工作中心列表

GET /api/production/workcenter/list
返回: [{ WorkCtr: string, Descr: string }]

3. 获取生产线列表

GET /api/production/line/list
返回: [{ Line: string, Describe: string }]

4. 获取供应商列表

GET /api/production/supplier/list
返回: [{ Supp: string, SuppName: string }]

📋 数据库表结构

WorkOrdDetail - 工单物料明细表

主要字段:
- RecID          -- 主键
- Domain         -- 组织
- WorkOrd        -- 工单编号
- Line           -- 行号
- ItemNum        -- 物料编码
- Op             -- 工序
- QtyRequired    -- 需求数量
- Location       -- 库位
- LotSerial      -- 生产批号
- IsActive       -- 状态 (1-激活, 0-已删除)
- FrozenBOMQty   -- 冻结BOM数量
- WorkOrdMasterRecID -- 工单主表关联ID

WorkOrdRouting - 工单工序明细表

主要字段:
- RecID              -- 主键
- WorkOrd            -- 工单编号
- ItemNum            -- 物料编号
- OP                 -- 工序
- Descr              -- 工序名称
- WorkCtr            -- 工作中心
- ProdLine           -- 生产线
- StdSetupTime       -- 准备时间
- QtyOrded           -- 需求数量
- QtyComplete        -- 完成数量
- MilestoneOp        -- 关键工序
- ProcessOut         -- 工序委外
- ProcessOutSupp     -- 供应商
- ProcessOutDay      -- 委外提前期
- Machine            -- 设备类型编码
- ToolCode           -- 模具类型编码
- RunCrew            -- 标准人数
- Engineer           -- 人员技能编码
- MachBdnRate        -- 单位标准产能
- WorkCode           -- 工序类型
- Setup              -- 活动一准备时间
- MachinesperOp      -- 活动二机器时间
- Labor              -- 活动三人工时间
- ChargeCode         -- 作业编码
- Status             -- 状态
- IsActive           -- 是否激活

NbrDetail - 领料单表

主要字段:
- RecID          -- 主键
- WorkOrd        -- 工单编号
- ItemNum        -- 物料编码
- QtyRec         -- 领料数量
- Type           -- 类型 (SM-生产领料)
- Domain         -- 组织
- IsActive       -- 是否激活

🎨 UI特性

工单物料明细

  • 🎯 软删除 - 删除后行背景色变为浅红色
  • 📊 数字格式化 - 需求数量自动千分位
  • 🔍 固定列 - 物料编号列固定在左侧
  • 📋 状态标签 - 激活/已删除两种状态

工单工序明细

  • 📅 日期格式 - 统一 YYYY-MM-DD 格式
  • 📊 数字格式化 - 完成数量、订单数量自动千分位
  • 🔍 固定列 - 工单编号列固定在左侧
  • 📑 动态表单 - 委外选项根据工序委外状态动态显示

🎯 菜单结构

物料交货计划管理系统
├── 订单管理
│   ├── 订单评审
│   ├── 订单交付
│   ├── 出货计划
│   └── 订单发货
├── 工单管理
│   └── 工单池下达
├── 工单排产
│   ├── 工单工序排产
│   ├── 工单物料明细 ✨ (新增)
│   └── 工单工序明细 ✨ (新增)
└── 采购管理
    └── 物料交货计划

🚀 启动测试

1. 启动项目

npm run dev

2. 访问页面

浏览器打开 http://localhost:5173,点击左侧菜单:

  • 工单排产工单物料明细
  • 工单排产工单工序明细

3. 测试功能

即使没有后端,你也可以测试:

  • ✅ 页面布局和UI展示
  • ✅ 搜索表单
  • ✅ 打开添加/编辑/查看表单
  • ✅ 表单验证
  • ✅ 分页功能

📝 后端实现要点

1. 物料明细保存逻辑

def save_work_order_material(data):
    # 新增时
    if not data.get('RecID'):
        # 1. 检查物料是否存在
        if not check_material_exists(data['ItemNum']):
            raise Exception("物料不存在")
        
        # 2. 检查工单中是否已有此物料
        if check_workorder_material_exists(data['WorkOrd'], data['ItemNum'], data['Op']):
            raise Exception("工单中已存在该物料")
        
        # 3. 保存工单物料明细
        save_workord_detail(data)
        
        # 4. 根据工单状态决定是否新增领料单
        work_order = get_work_order(data['WorkOrd'])
        if work_order['Status'] != 'P':
            save_nbr_detail(data)
    
    # 编辑时
    else:
        # 1. 保存工单物料明细
        update_workord_detail(data)
        
        # 2. 根据工单状态决定是否修改领料单
        work_order = get_work_order(data['WorkOrd'])
        if work_order['Status'] != 'P':
            update_nbr_detail(data)

2. 工序明细保存逻辑

def save_work_order_process(data):
    # 1. 检查工单中是否已有相同工序编号
    if check_process_exists(data['WorkOrd'], data['OP'], data.get('RecID')):
        raise Exception("该工单中已存在相同工序编号")
    
    # 2. 检查后序是否已有完成数量
    if check_process_has_complete_qty(data['WorkOrd'], data['OP']):
        raise Exception("该工单后序已有完成数量,无法保存")
    
    # 3. 保存工序明细
    if not data.get('RecID'):
        save_workord_routing(data)
    else:
        update_workord_routing(data)

⚠️ 注意事项

1. 物料明细删除

  • 删除操作是软删除,只修改 IsActive 字段为 0
  • 删除后的记录仍然显示在列表中,但标记为"已删除"
  • 背景色变为浅红色以示区分

2. 工序明细验证

  • 添加工序时必须验证工序编号不重复
  • 如果后序已有完成数量,不允许修改前序
  • 委外工序必须填写供应商和委外提前期

3. 下拉框数据

  • 工单编号只显示状态为初始、下达、投产、暂停的工单
  • 工单类型只包括常规、返工、测试、TCN类型

4. 跨页面跳转

  • 从工单排产页面跳转时,URL带上 workOrd 参数
  • 明细页面根据参数自动填充搜索条件
  • 例如:/workorder-material?workOrd=WO2025001

🎨 样式定制

删除行背景色

// 在 WorkOrderMaterial.vue 中
const getRowStyle = ({ row }) => {
  if (row.IsActive === 0) {
    return {
      'background-color': '#ffe6e6'  // 可自定义颜色
    }
  }
  return {}
}

🔍 常见问题

Q1: 如何从工单排产页面跳转到明细页面?

A: 在 ProductionSchedule.vue 的更多菜单中,使用以下代码:

// 跳转到工单物料明细
router.push({
  path: '/workorder-material',
  query: { workOrd: row.WorkOrd }
})

// 跳转到工单工序明细
router.push({
  path: '/workorder-process',
  query: { workOrd: row.WorkOrd }
})

Q2: 如何处理物料明细的领料单联动?

A: 在后端实现时,根据工单状态判断:

  • 初始状态(P):只操作 WorkOrdDetail 表
  • 其他状态:同时操作 WorkOrdDetail 和 NbrDetail 表

Q3: 工序明细表单中的物料编号为什么是日期选择?

A: 这可能是需求文档中的错误。实际应该是下拉选择或文本输入。可以修改 WorkOrderProcessForm.vue 中的组件类型。

📞 技术支持

如遇问题:

  1. 查看浏览器控制台错误信息
  2. 检查网络请求是否正常
  3. 确认后端API是否已实现
  4. 验证数据库表结构是否正确

创建日期: 2025-11-03
版本: v1.0.0
状态: 核心功能已完成,等待后端API对接