Appearance
工作中心相关属性
概念通俗理解
- 工作中心通俗的讲就是“在哪里”生产,作业/工序通俗的讲就是“做什么”和“做多久”,物料清单通俗的讲就是“用什么”做。工作中心是执行生产工序的具体位置,比如一个车间,一条生产 线或一台特定机床
- 工作中心的表单属性
(1)基本信息 代码:用来唯一标识工作中心,不允许重复理论;‘了,, 时间效率:100%,表示以标准速度工作,产能:1,表示这个中心同一时间只能处理1个生产订单 OEE 目标:90% 表示设备综合效率目标,用于绩效衡量 每小时成本:50.00 表示此中心每小时运行成本为50元,用于成本计算 (2)特定产能 用于定义“当某个具体产品在这个工作中心生产时,所特有的生产能力参数”,简单来说,它允许在同一个工作中心下的产品,设置不同的生产速度,准备时间和收尾时间,如果不填,系统将使用工作中心的默认通用设置。那什么情况下需要填写这个“特定产能”,在工作中心的生产效率因产品而异时,就需要填写 例如: 生产速率不同:
- 在“木工加工中心”生产“简易板凳”每小时能做10个,但生产“复杂雕花衣柜”每小时只能做1个。 换产准备时间不同:
- 从生产“床架”切换到生产“餐桌”,需要更换刀具、调整机器参数,可能需要30分钟。
- 但从生产“餐桌A”切换到非常相似的“餐桌B”,可能只需要5分钟。 清理时间不同:
- 生产完使用了深色油漆的产品后,清理喷枪和车间需要1小时,以免污染下个浅色产品。
- 而生产同色系产品,清理可能只需10分钟 ** 如果所有产品在这个工作中心的生产效率都一样,则完全不需要填写此表,使用工作中心的默认能力即可。**
这配置表示产品: [6901028001618] 成品床-在成品仓生产 | 单位: 件 | 产能: 1 / h | 设置时间: 15 | 清理用时: 10 产品:选择在这个工作中心上生产的具体产品。 产品计量单位:自动带出该产品的单位(如“件”、“个”)。 产能:这个是最关键的 字段属性,定义的是单位时间内能生产多少件,格式为:数量/时间单位 ,时间单位可以是分钟(min)、小时(h)、天(d) 比如0.5/h 表示在该工作中心,生产“成品床”的速率是每小时0.5件(即生产一张床需要2小时)。 通俗得讲就是工作中心并行处理的能力,如设置为2,表示同时有2个工作中心同时处理。 设置时间(分钟):表示的是生产此产品前,需要花多长时间做准备工作(如上料、换模具、调机) 例如demo 数据中的 15:00 表示的是每次开始生产一张“成品床”前,需要15分钟准备木工机械和程序。 清理用时(分钟):表示的是生产此产品后,需要花多长时间做清理工作(如清扫木屑、归位工具)。 例如demo 数据中的10:00 表示的是每生产完一张“成品床”后,需要10分钟清理工作区域。
这些数据有什么用 当为“成品床”创建生产订单,且其中一道工序(如“床体木工组装”)在“木工加工中心”进行时,可以根据这里设定的数据: (1)计算总生产时间: 生产1件,所需加工时间= 1件 除于产能1件/小时 = 1小时 (2)计算总工序耗时: 总耗时 = 设置时间 + 生产时间 + 清理时间 eg:生产1张床的总工序耗时 = 15 分钟 + 60 分钟 + 10分钟 = 145 分钟 (3)用于精确排程 在安排生产计划时,会精确地预留出这15分钟的准备时间和10分钟的清理时间,使计划更符合实际,避免排程过于理想化。 (4)用于成本计算 这些时间会计入该工作中心的工时成本
填写这些字段值的技巧与注意事项 (1)产能字段的两种理解方式 方式一(推荐):单件耗时-> 1 / 耗时。例如,做一张床要2小时,则填 0.5 / h。 方式二:批量速率。例如,一个批次(4张床)需要8小时,则填 4 / 8 h,系统会自动计算为 0.5 / h。 (2)与“作业”默认时长的关系 作业中一般默认120分钟,如果在“特定产能”中为某个产品定义了不同的产能(如0.5/h),系统在执行这个产品的生产订单时,会优先使用“特定产能”里的数据,因为它更精确。 (3)设置/清理时间很重要 频繁换产或工艺复杂的产品,设置/清理时间会显著影响整体设备效率(OEE)。准确填写有助于发现生产瓶颈。
从源码上分析预计时长的计算公式
首先,先看配置相关图
接下来通过源码来研究这个预计时长的计算方法 

这个方法是用来计算工作订单的预计持续时间(分钟) 参数: 参数:
- alternative_workcenter: 替代工作中心(False表示使用当前工作中心)
- ratio: 比例系数,用于调整工作时间 这个比例系数指的是作业中的员工能力,也就是完成作业所需的员工人数。
方法解析: (1)首先先基本校验
self.ensure_one() # 确保只处理单个记录
if not self.workcenter_id: # 如果没有关联工作中心
return self.duration_expected # 直接返回当前预计时间这意思就是没有工作中心的时候,就是制造工单行上当前设置的预计时长是多少就是多少了。 (2)情况1: 没有定义操作(operation_id)
if not self.operation_id:
# 计算预计工作时间 = (当前预计时间 - 启动时间 - 停止时间) × 效率
duration_expected_working = (self.duration_expected -
self.workcenter_id.time_start -
self.workcenter_id.time_stop) * \
self.workcenter_id.time_efficiency / 100.0
if duration_expected_working < 0: # 防止负值
duration_expected_working = 0
# 最终预计时间 = 工作中心基础时间 + 调整后的工作时间
return (self.workcenter_id._get_expected_duration(self.product_id) +
duration_expected_working * ratio * 100.0 / self.workcenter_id.time_efficiency)** 这里涉及到工作中心的基础时间 ** 

** 工作中心的基础时间的计算逻辑:当工作中心有特定产能的时候,使用的特定产能这边配置的设置时间+清理时间,当没有配置特定产能的时候,使用的是基础信息上配置的设置时间+清理时间。 ** (3)情况2:定义了操作
计算生产数量(转换为产品基本单位)
qty_production = self.production_id.product_uom_id._compute_quantity(
self.qty_production,
self.production_id.product_id.uom_id
)
获取工作中心容量
capacity = self.workcenter_id._get_capacity(self.product_id)
计算循环次数(向上取整)
cycle_number = float_round(
qty_production / capacity,
precision_digits=0,
rounding_method='UP'
)这里有涉及到工作中心获取工作中心容量的逻辑:
这里的capacity 就是产能,当在中心中有配置特定产品的产能时,优先使用特定产能里的产能,其次才退而选择信息页中的产能。 
如果有设置替代工作中心: 则用的是替代中心的预计时长
if alternative_workcenter:
# 计算单位循环的工作时间
duration_expected_working = (
self.duration_expected -
self.workcenter_id.time_start -
self.workcenter_id.time_stop
) * self.workcenter_id.time_efficiency / (100.0 * cycle_number)
if duration_expected_working < 0:
duration_expected_working = 0
# 计算替代工作中心容量
capacity = alternative_workcenter._get_capacity(self.product_id)
alternative_wc_cycle_nb = float_round(
qty_production / capacity,
precision_digits=0,
rounding_method='UP'
)
# 返回替代工作中心预计时间
return (
alternative_workcenter._get_expected_duration(self.product_id) +
alternative_wc_cycle_nb * duration_expected_working * 100.0 / alternative_workcenter.time_efficiency
)
(4)计算当前工作中心
获取标准周期时间
time_cycle = self.operation_id.time_cycle
预计时间 = 工作中心基础时间 + 循环次数×周期时间×效率调整
return (
self.workcenter_id._get_expected_duration(self.product_id) +
cycle_number * time_cycle * 100.0 / self.workcenter_id.time_efficiency
)这里的标准周期时间指的是操作中的默认时长
cycle_number = float_round(qty_production / capacity, precision_digits=0, rounding_method='UP') 循环次数指的是从数量除了产能,得到需要循环几次
(5)公式 预计时间的通用公式如下: 预计总时间 = 固定时间 + 生产时间 其中: 固定时间 = 工作中心基础时间(启动/停止等) 生产时间 = 循环时间 * 效率调整系数
(5.1)解析如下: 固定时间计算 workcenter_id._get_expected_duration(self.product_id) 这个方法通常包括:
- 工作中心的基本设置时间
- 特定产品的额外准备时间
- 标准化的固定操作时间 循环次数计算 生产数量转换为产品基本单位 qty_production = 单位转换(生产数量, 产品基本单位)
获取工作中心对该产品的容量 capacity = 工作中心.容量(产品)
计算循环次数(向上取整) //向上取整的意义:确保有足够的循环完成所有生产数量 循环次数 = CEIL(生产数量 / 容量) 效率调整 效率调整系数 效率调整系数 = 100.0 / 工作中心.时间效率
(6)计算流程图
开始计算预计时间 开始计算预计时间 ↓ 是否有工作中心? ├── 否 → 返回当前预计时间 ↓ └── 是 ↓ 是否有操作定义? ├── 否 → 使用简化计算 │ ↓ │ 工作时间 = (当前时间 - 启动 - 停止) × 效率 │ ↓ │ 总时间 = 基础时间 + 工作时间 × 效率调整 │ └── 是 → 使用标准计算 ↓ 计算生产数量(单位转换) ↓ 获取工作中心容量 ↓ 计算循环次数(向上取整) ↓ 是否计算替代工作中心? ├── 是 → 计算替代工作中心预计时间 │ ↓ │ 计算单位循环时间 │ ↓ │ 计算替代工作中心循环次数 │ ↓ │ 总时间 = 替代基础时间 + 循环次数×单位时间×效率调整 │ └── 否 → 计算当前工作中心预计时间 ↓ 获取周期时间 ↓ 总时间 = 基础时间 + 循环次数×周期时间×效率调整
三. 结合demo 数据演示计算
一般正常常用的的制造工单都会关联工作中心,都会配置特定产能,以及在物料清单中关联作业以及工作中心
1,制造订单 产品:成品床-在成品仓生产 计划数量:1件 生产数量:1.00件 
现在来计算这个260 以及 210 是怎么计算出来的 2,首先看一下工作中心的配置 
可以看到木工加工中心有配置特定产能,则优先使用产品相关的特定产能的值 木工加工中心:
- 产品:成品床-在成品仓生产 (产品ID: 6901028001618)
- 产能:0.50 件/小时
- 设置时间:10分钟
- 清理用时:10分钟
- 时间效率:100%!

喷涂与烘干中心也配置了特定产能的产能产能数据如下: 喷涂与烘干中心: - 产品:成品床-在成品仓生产 (产品ID: 6901028001618)
- 产能:0.67 件/小时
- 设置时间:10分钟
- 清理用时:20分钟
- 时间效率:100%!
3,操作作业数据
床体木工组装操作:
- 默认时长:120分钟
- 员工能力:1.00
表面上漆与烘干操作: - 默认时长:90分钟
- 员工能力:1.00 ** 公式:预计总时间 = 工作中心基础时间 + 循环次数 × 时间周期 × (100 / 时间效率)** 其中:
- 工作中心基础时间 = 设置时间 + 清理用时
- 循环次数 = CEIL(生产数量 / 工作中心产能)
- 时间周期 = 操作默认时长
- 时间效率 = 工作中心时间效率百分比
演示计算过程 (1)第一个工单:床体木工组装(预计260分钟) 收集参数:
- 工作中心:木工加工中心
- 产品:成品床-在成品仓生产
- 生产数量:1件
- 工作中心产能:0.50件/小时
- 设置时间:10分钟
- 清理用时:10分钟
- 操作默认时长:120分钟
- 时间效率:100%!
计算步骤: (1.1)计算工作中心基础时间 基础时间 = 设置时间 + 清理用时 = 10 + 10 = 20分钟 (1.2)计算循环次数 循环次数 = CEIL(生产数量 / 工作中心产能) = CEIL(1 / 0.5) = CEIL(2) = 2次 因为产能是0.5件/小时,生产1件需要2个循环。 (1.3)计算总时间 总时间 = 基础时间 + 循环次数 × 时间周期 × (100 / 时间效率) = 20 + 2 × 120 × (100/100) = 20 + 2 × 120 × 1 = 20 + 240 = 260分钟
(2) 第二个工单:表面上漆与烘干(预计210分钟) 收集参数:
- 工作中心:喷涂与烘干中心
- 产品:成品床-在成品仓生产
- 生产数量:1件
- 工作中心产能:0.67件/小时
- 设置时间:10分钟
- 清理用时:20分钟
- 操作默认时长:90分钟
- 时间效率:100%! 计算步骤: (2.1)计算工作中心基础时间 基础时间 = 设置时间 + 清理用时 = 10 + 20 = 30分钟 (2.2)计算循环次数 循环次数 = CEIL(生产数量 / 工作中心产能) = CEIL(1 / 0.67) = CEIL(1.4925) = 2次 因为产能是0.67件/小时,生产1件需要1.5个循环,向上取整为2次。 (2.3)计算总时间 总时间 = 基础时间 + 循环次数 × 时间周期 × (100 / 时间效率) = 30 + 2 × 90 × (100/100) = 30 + 2 × 90 × 1 = 30 + 180 = 210分钟
3)相关的源码验证如下: capacity = self.workcenter_id._get_capacity(self.product_id) 从图片数据得知: 木工加工中心:capacity = 0.5 喷涂与烘干中心:capacity = 0.67
qty_production = self.production_id.product_uom_id._compute_quantity( self.qty_production, self.production_id.product_id.uom_id ) 生产数量 = 1件 cycle_number = float_round(qty_production / capacity, precision_digits=0, rounding_method='UP') 木工加工中心:1 / 0.5 = 2.0 → 向上取整 = 2 喷涂与烘干中心:1 / 0.67 = 1.4925 → 向上取整 = 2 计算基础时间: time_start = 10分钟(设置时间) time_stop = 10分钟/20分钟(清理用时) 基础时间 = time_start + time_stop 获取操作周期时间: 床体木工组装:time_cycle = 120分钟 表面上漆与烘干:time_cycle = 90分钟
床体木工组装工单:260分钟 20分钟(基础时间:10分钟设置 + 10分钟清理)
- 240分钟(生产时间:2个循环 × 120分钟/循环 × 100%!效(MISSING)率) = 260分钟
表面上漆与烘干工单:210分钟 30分钟(基础时间:10分钟设置 + 20分钟清理)
- 180分钟(生产时间:2个循环 × 90分钟/循环 × 100%!效(MISSING)率) = 210分钟
为什么产能小于1会导致循环次数为2? 木工加工中心产能:0.50件/小时,表示每小时只能完成0.5件 喷涂与烘干中心产能:0.67件/小时,表示每小时只能完成0.67件 生产1件产品:由于两个工单的产能都小于1,所以生产1件产品都需要超过1个循环
向上取整规则的影响 根据代码中的 float_round函数和 rounding_method='UP': 床体木工组装:1 ÷ 0.5 = 2.0 → 取整后为2 表面上漆与烘干:1 ÷ 0.67 ≈ 1.4925 → 向上取整为2
时间效率的作用 两个工作中心的时间效率都是100%,所以效率因子为1,没有额外的时间调整。
四、业务含义解读 (1)为什么这样设计? 保守估算:向上取整确保生产时间充足 考虑产能限制:产能小于1表示无法并行处理,需要多次循环 包含准备时间:设置和清理时间独立于生产时间 效率因素:可调整实际生产与理论时间的差异 (2)产能配置建议 如果希望减少预计时长: 提高产能:从0.5/0.67提高到≥1.0 优化操作:减少操作默认时长 减少准备时间:优化设置和清理流程
